From 3acfc9b46a66b9a42643f46d3afa902faacee9d7 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Fri, 23 Jan 2026 16:44:06 +0100 Subject: [PATCH 01/65] Add React renderer implementation --- renderers/react/README.md | 34 ++ renderers/react/package.json | 82 +++ .../src/components/content/AudioPlayer.tsx | 32 ++ .../react/src/components/content/Divider.tsx | 21 + .../react/src/components/content/Icon.tsx | 51 ++ .../react/src/components/content/Image.tsx | 51 ++ .../react/src/components/content/Text.tsx | 157 ++++++ .../react/src/components/content/Video.tsx | 69 +++ .../react/src/components/content/index.ts | 6 + .../src/components/interactive/Button.tsx | 35 ++ .../src/components/interactive/CheckBox.tsx | 74 +++ .../components/interactive/DateTimeInput.tsx | 72 +++ .../components/interactive/MultipleChoice.tsx | 123 +++++ .../src/components/interactive/Slider.tsx | 86 +++ .../src/components/interactive/TextField.tsx | 97 ++++ .../react/src/components/interactive/index.ts | 6 + .../react/src/components/layout/Card.tsx | 48 ++ .../react/src/components/layout/Column.tsx | 70 +++ .../react/src/components/layout/List.tsx | 69 +++ .../react/src/components/layout/Modal.tsx | 97 ++++ renderers/react/src/components/layout/Row.tsx | 70 +++ .../react/src/components/layout/Tabs.tsx | 66 +++ .../react/src/components/layout/index.ts | 6 + renderers/react/src/core/A2UIProvider.tsx | 210 ++++++++ renderers/react/src/core/A2UIRenderer.tsx | 100 ++++ renderers/react/src/core/A2UIViewer.tsx | 217 ++++++++ renderers/react/src/core/ComponentNode.tsx | 93 ++++ renderers/react/src/core/store.ts | 56 ++ renderers/react/src/hooks/useA2UI.ts | 63 +++ renderers/react/src/hooks/useA2UIComponent.ts | 223 ++++++++ renderers/react/src/index.ts | 79 +++ renderers/react/src/lib/utils.ts | 44 ++ .../react/src/registry/ComponentRegistry.ts | 125 +++++ .../react/src/registry/defaultCatalog.ts | 70 +++ renderers/react/src/styles/index.d.ts | 23 + renderers/react/src/styles/index.ts | 332 ++++++++++++ renderers/react/src/theme/ThemeContext.tsx | 52 ++ renderers/react/src/theme/litTheme.ts | 444 ++++++++++++++++ renderers/react/src/theme/utils.ts | 46 ++ renderers/react/src/types.ts | 63 +++ .../react/tests/components/Icon.test.tsx | 197 +++++++ .../react/tests/components/Text.test.tsx | 499 ++++++++++++++++++ renderers/react/tests/helpers.tsx | 92 ++++ renderers/react/tests/setup.ts | 8 + renderers/react/tsconfig.json | 26 + renderers/react/tsup.config.ts | 29 + renderers/react/vitest.config.ts | 21 + 47 files changed, 4534 insertions(+) create mode 100644 renderers/react/README.md create mode 100644 renderers/react/package.json create mode 100644 renderers/react/src/components/content/AudioPlayer.tsx create mode 100644 renderers/react/src/components/content/Divider.tsx create mode 100644 renderers/react/src/components/content/Icon.tsx create mode 100644 renderers/react/src/components/content/Image.tsx create mode 100644 renderers/react/src/components/content/Text.tsx create mode 100644 renderers/react/src/components/content/Video.tsx create mode 100644 renderers/react/src/components/content/index.ts create mode 100644 renderers/react/src/components/interactive/Button.tsx create mode 100644 renderers/react/src/components/interactive/CheckBox.tsx create mode 100644 renderers/react/src/components/interactive/DateTimeInput.tsx create mode 100644 renderers/react/src/components/interactive/MultipleChoice.tsx create mode 100644 renderers/react/src/components/interactive/Slider.tsx create mode 100644 renderers/react/src/components/interactive/TextField.tsx create mode 100644 renderers/react/src/components/interactive/index.ts create mode 100644 renderers/react/src/components/layout/Card.tsx create mode 100644 renderers/react/src/components/layout/Column.tsx create mode 100644 renderers/react/src/components/layout/List.tsx create mode 100644 renderers/react/src/components/layout/Modal.tsx create mode 100644 renderers/react/src/components/layout/Row.tsx create mode 100644 renderers/react/src/components/layout/Tabs.tsx create mode 100644 renderers/react/src/components/layout/index.ts create mode 100644 renderers/react/src/core/A2UIProvider.tsx create mode 100644 renderers/react/src/core/A2UIRenderer.tsx create mode 100644 renderers/react/src/core/A2UIViewer.tsx create mode 100644 renderers/react/src/core/ComponentNode.tsx create mode 100644 renderers/react/src/core/store.ts create mode 100644 renderers/react/src/hooks/useA2UI.ts create mode 100644 renderers/react/src/hooks/useA2UIComponent.ts create mode 100644 renderers/react/src/index.ts create mode 100644 renderers/react/src/lib/utils.ts create mode 100644 renderers/react/src/registry/ComponentRegistry.ts create mode 100644 renderers/react/src/registry/defaultCatalog.ts create mode 100644 renderers/react/src/styles/index.d.ts create mode 100644 renderers/react/src/styles/index.ts create mode 100644 renderers/react/src/theme/ThemeContext.tsx create mode 100644 renderers/react/src/theme/litTheme.ts create mode 100644 renderers/react/src/theme/utils.ts create mode 100644 renderers/react/src/types.ts create mode 100644 renderers/react/tests/components/Icon.test.tsx create mode 100644 renderers/react/tests/components/Text.test.tsx create mode 100644 renderers/react/tests/helpers.tsx create mode 100644 renderers/react/tests/setup.ts create mode 100644 renderers/react/tsconfig.json create mode 100644 renderers/react/tsup.config.ts create mode 100644 renderers/react/vitest.config.ts diff --git a/renderers/react/README.md b/renderers/react/README.md new file mode 100644 index 000000000..961ac089a --- /dev/null +++ b/renderers/react/README.md @@ -0,0 +1,34 @@ +# @a2ui/react + +React implementation of A2UI (Agent-to-User Interface). + +> **Note:** This renderer is currently a work in progress. + +## Installation + +```bash +npm install @a2ui/react +``` + +## Usage + +```tsx +import { A2UIProvider, A2UIRenderer } from '@a2ui/react'; +import '@a2ui/react/styles/structural.css'; + +function App() { + return ( + + + + ); +} +``` + +## Development + +```bash +npm run build # Build the package +npm run dev # Watch mode +npm test # Run tests +``` diff --git a/renderers/react/package.json b/renderers/react/package.json new file mode 100644 index 000000000..a992b8f25 --- /dev/null +++ b/renderers/react/package.json @@ -0,0 +1,82 @@ +{ + "name": "@a2ui/react", + "version": "0.8.0", + "description": "React renderer for A2UI (Agent-to-User Interface)", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./styles": { + "import": { + "types": "./dist/styles/index.d.ts", + "default": "./dist/styles/index.js" + }, + "require": { + "types": "./dist/styles/index.d.cts", + "default": "./dist/styles/index.cjs" + } + }, + "./styles/structural.css": "./dist/structural.css" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup && cp src/styles/index.d.ts dist/styles/index.d.ts && cp src/styles/index.d.ts dist/styles/index.d.cts", + "dev": "tsup --watch", + "test": "vitest run", + "test:watch": "vitest", + "typecheck": "tsc --noEmit", + "lint": "eslint src --ext .ts,.tsx", + "clean": "rm -rf dist" + }, + "dependencies": { + "@a2ui/lit": "workspace:*", + "clsx": "^2.1.0", + "markdown-it": "^14.0.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.6.0", + "@testing-library/react": "^16.0.0", + "@types/markdown-it": "^14.1.0", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "clsx": "^2.1.0", + "jsdom": "^25.0.0", + "markdown-it": "^14.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "tsup": "^8.0.0", + "typescript": "^5.8.0", + "vitest": "^3.0.0" + }, + "keywords": [ + "a2ui", + "react", + "ai", + "agent", + "ui", + "renderer" + ], + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/google/A2UI.git", + "directory": "renderers/react" + } +} diff --git a/renderers/react/src/components/content/AudioPlayer.tsx b/renderers/react/src/components/content/AudioPlayer.tsx new file mode 100644 index 000000000..9fb48bb56 --- /dev/null +++ b/renderers/react/src/components/content/AudioPlayer.tsx @@ -0,0 +1,32 @@ +import { memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject } from '../../lib/utils'; + +/** + * AudioPlayer component - renders an audio player with optional description. + */ +export const AudioPlayer = memo(function AudioPlayer({ node, surfaceId }: A2UIComponentProps) { + const { theme, resolveString } = useA2UIComponent(node, surfaceId); + const props = node.properties; + + const url = resolveString(props.url); + const description = resolveString(props.description ?? null); + + if (!url) { + return null; + } + + return ( +
+ {description &&

{description}

} +
+ ); +}); + +export default AudioPlayer; diff --git a/renderers/react/src/components/content/Divider.tsx b/renderers/react/src/components/content/Divider.tsx new file mode 100644 index 000000000..962b94c86 --- /dev/null +++ b/renderers/react/src/components/content/Divider.tsx @@ -0,0 +1,21 @@ +import { memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject } from '../../lib/utils'; + +/** + * Divider component - renders a visual separator line. + */ +export const Divider = memo(function Divider({ node, surfaceId }: A2UIComponentProps) { + const { theme } = useA2UIComponent(node, surfaceId); + + return ( +
+ ); +}); + +export default Divider; diff --git a/renderers/react/src/components/content/Icon.tsx b/renderers/react/src/components/content/Icon.tsx new file mode 100644 index 000000000..62253c9a8 --- /dev/null +++ b/renderers/react/src/components/content/Icon.tsx @@ -0,0 +1,51 @@ +import { memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject } from '../../lib/utils'; + +/** + * Convert camelCase to snake_case for Material Symbols font. + * e.g., "shoppingCart" -> "shopping_cart" + * This matches the Lit renderer's approach. + */ +function toSnakeCase(str: string): string { + return str.replace(/([A-Z])/g, '_$1').toLowerCase(); +} + +/** + * Icon component - renders an icon using Material Symbols Outlined font. + * + * This matches the Lit renderer's approach using the g-icon class with + * Material Symbols Outlined font. + * + * @example Add Material Symbols font to your HTML: + * ```html + * + * ``` + */ +export const Icon = memo(function Icon({ node, surfaceId }: A2UIComponentProps) { + const { theme, resolveString } = useA2UIComponent(node, surfaceId); + const props = node.properties; + + const iconName = resolveString(props.name); + + if (!iconName) { + return null; + } + + // Convert camelCase to snake_case for Material Symbols + const snakeCaseName = toSnakeCase(iconName); + + // Match Lit renderer exactly: section with theme classes, span with g-icon + return ( +
+ {snakeCaseName} +
+ ); +}); + +export default Icon; diff --git a/renderers/react/src/components/content/Image.tsx b/renderers/react/src/components/content/Image.tsx new file mode 100644 index 000000000..0a4c7772f --- /dev/null +++ b/renderers/react/src/components/content/Image.tsx @@ -0,0 +1,51 @@ +import { memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject, mergeClassMaps } from '../../lib/utils'; + +type UsageHint = 'icon' | 'avatar' | 'smallFeature' | 'mediumFeature' | 'largeFeature' | 'header'; +type FitMode = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down'; + +/** + * Image component - renders an image from a URL with optional sizing and fit modes. + * + * Supports usageHint values: icon, avatar, smallFeature, mediumFeature, largeFeature, header + * Supports fit values: contain, cover, fill, none, scale-down (maps to object-fit via CSS variable) + */ +export const Image = memo(function Image({ node, surfaceId }: A2UIComponentProps) { + const { theme, resolveString } = useA2UIComponent(node, surfaceId); + const props = node.properties; + + const url = resolveString(props.url); + const usageHint = props.usageHint as UsageHint | undefined; + const fit = (props.fit as FitMode) ?? 'fill'; + + // Get merged classes for section (matches Lit's Styles.merge) + const classes = mergeClassMaps( + theme.components.Image.all, + usageHint ? theme.components.Image[usageHint] : {} + ); + + // Build style object with object-fit as CSS variable (matches Lit) + const style: React.CSSProperties = { + ...stylesToObject(theme.additionalStyles?.Image), + '--object-fit': fit, + } as React.CSSProperties; + + if (!url) { + return null; + } + + // Match Lit structure:
+ return ( +
+ +
+ ); +}); + +export default Image; diff --git a/renderers/react/src/components/content/Text.tsx b/renderers/react/src/components/content/Text.tsx new file mode 100644 index 000000000..4a05f2ac4 --- /dev/null +++ b/renderers/react/src/components/content/Text.tsx @@ -0,0 +1,157 @@ +import { useMemo, memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject, mergeClassMaps } from '../../lib/utils'; +import MarkdownIt from 'markdown-it'; + +type UsageHint = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'caption' | 'body'; + +interface HintedStyles { + h1: Record; + h2: Record; + h3: Record; + h4: Record; + h5: Record; + body: Record; + caption: Record; +} + +function isHintedStyles(styles: unknown): styles is HintedStyles { + if (typeof styles !== 'object' || !styles || Array.isArray(styles)) return false; + const expected = ['h1', 'h2', 'h3', 'h4', 'h5', 'caption', 'body']; + return expected.some((v) => v in styles); +} + +/** + * Markdown-it instance for rendering markdown text. + * Uses synchronous import to ensure availability at first render (matches Lit renderer). + */ +const markdownRenderer = new MarkdownIt({ + html: false, // Security: disable raw HTML + breaks: true, // Convert \n to
+ linkify: true, // Auto-convert URLs to links + typographer: true, // Smart quotes, dashes, etc. +}); + +/** + * Apply theme classes to markdown HTML elements. + * Replaces default element tags with themed versions. + */ +function applyMarkdownTheme(html: string, markdownTheme: Types.Theme['markdown']): string { + if (!markdownTheme) return html; + + // Map of element -> classes + const replacements: Array<[RegExp, string]> = []; + + for (const [element, classes] of Object.entries(markdownTheme)) { + if (!classes || (Array.isArray(classes) && classes.length === 0)) continue; + + const classString = Array.isArray(classes) ? classes.join(' ') : classMapToString(classes); + if (!classString) continue; + + // Create regex to match opening tags (handles self-closing and regular) + const tagRegex = new RegExp(`<${element}(?=\\s|>|/>)`, 'gi'); + replacements.push([tagRegex, `<${element} class="${classString}"`]); + } + + let result = html; + for (const [regex, replacement] of replacements) { + result = result.replace(regex, replacement); + } + + return result; +} + +/** + * Text component - renders text content with markdown support. + * + * Text is parsed as markdown and rendered as HTML (matches Lit renderer behavior). + * Supports usageHint values: h1, h2, h3, h4, h5, caption, body + * + * Markdown features supported: + * - **Bold** and *italic* text + * - Lists (ordered and unordered) + * - `inline code` and code blocks + * - [Links](url) (auto-linkified URLs too) + * - Blockquotes + * - Horizontal rules + * + * Note: Raw HTML is disabled for security. + */ +export const Text = memo(function Text({ node, surfaceId }: A2UIComponentProps) { + const { theme, resolveString } = useA2UIComponent(node, surfaceId); + const props = node.properties; + + const textValue = resolveString(props.text); + const usageHint = props.usageHint as UsageHint | undefined; + + // Get merged classes (matches Lit's Styles.merge) + const classes = mergeClassMaps( + theme.components.Text.all, + usageHint ? theme.components.Text[usageHint] : {} + ); + + // Get additional styles based on usage hint + const additionalStyles = useMemo(() => { + const textStyles = theme.additionalStyles?.Text; + if (!textStyles) return undefined; + + if (isHintedStyles(textStyles)) { + const hint = usageHint ?? 'body'; + return stylesToObject(textStyles[hint]); + } + return stylesToObject(textStyles as Record); + }, [theme.additionalStyles?.Text, usageHint]); + + // Render markdown content (matches Lit behavior - always uses markdown) + const renderedContent = useMemo(() => { + if (textValue === null || textValue === undefined) { + return null; + } + + // Add markdown prefix based on usageHint (matches Lit behavior) + let markdownText = textValue; + switch (usageHint) { + case 'h1': + markdownText = `# ${markdownText}`; + break; + case 'h2': + markdownText = `## ${markdownText}`; + break; + case 'h3': + markdownText = `### ${markdownText}`; + break; + case 'h4': + markdownText = `#### ${markdownText}`; + break; + case 'h5': + markdownText = `##### ${markdownText}`; + break; + case 'caption': + markdownText = `*${markdownText}*`; + break; + default: + break; // Body - no prefix + } + + const rawHtml = markdownRenderer.render(markdownText); + const themedHtml = applyMarkdownTheme(rawHtml, theme.markdown); + return { __html: themedHtml }; + }, [textValue, theme.markdown, usageHint]); + + if (!renderedContent) { + return null; + } + + // Always use
wrapper with markdown rendering (matches Lit structure) + return ( +
+ ); +}); + +export default Text; diff --git a/renderers/react/src/components/content/Video.tsx b/renderers/react/src/components/content/Video.tsx new file mode 100644 index 000000000..4f927df4e --- /dev/null +++ b/renderers/react/src/components/content/Video.tsx @@ -0,0 +1,69 @@ +import { memo } from 'react'; +import type { Types } from '@a2ui/lit/0.8'; +import type { A2UIComponentProps } from '../../types'; +import { useA2UIComponent } from '../../hooks/useA2UIComponent'; +import { classMapToString, stylesToObject } from '../../lib/utils'; + +/** + * Check if a URL is a YouTube URL and extract the video ID. + */ +function getYouTubeVideoId(url: string): string | null { + const patterns = [ + /(?:youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([^&\s?]+)/, + ]; + for (const pattern of patterns) { + const match = url.match(pattern); + if (match && match.length > 1) { + // Non-null assertion is safe here since we checked match.length > 1 + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return match[1]!; + } + } + return null; +} + +/** + * Video component - renders a video player. + * + * Supports regular video URLs and YouTube URLs (renders as embedded iframe). + */ +export const Video = memo(function Video({ node, surfaceId }: A2UIComponentProps) { + const { theme, resolveString } = useA2UIComponent(node, surfaceId); + const props = node.properties; + + const url = resolveString(props.url); + + if (!url) { + return null; + } + + const youtubeId = getYouTubeVideoId(url); + + if (youtubeId) { + return ( +
+ ' }, + }); + + const { container } = render( + + + + ); + + await waitFor(() => { + const iframe = container.querySelector('iframe'); + expect(iframe).not.toBeInTheDocument(); + }); + }); + }); +}); diff --git a/renderers/react/tests/helpers.tsx b/renderers/react/tests/helpers.tsx new file mode 100644 index 000000000..4ad25044e --- /dev/null +++ b/renderers/react/tests/helpers.tsx @@ -0,0 +1,92 @@ +import React, { useEffect, type ReactNode } from 'react'; +import { A2UIProvider, A2UIRenderer, useA2UI } from '../src'; +import type { Types } from '@a2ui/lit/0.8'; + +/** + * Helper component that processes messages and renders a surface. + */ +export function TestRenderer({ + messages, + surfaceId = '@default', +}: { + messages: Types.ServerToClientMessage[]; + surfaceId?: string; +}) { + const { processMessages } = useA2UI(); + + useEffect(() => { + processMessages(messages); + }, [messages, processMessages]); + + return ; +} + +/** + * Full test wrapper with A2UIProvider. + */ +export function TestWrapper({ + children, + onAction, + theme, +}: { + children: ReactNode; + onAction?: (action: Types.A2UIClientEventMessage) => void; + theme?: Types.Theme; +}) { + return ( + + {children} + + ); +} + +/** + * Create a surface update message with components. + */ +export function createSurfaceUpdate( + components: Array<{ id: string; component: Record }>, + surfaceId = '@default' +): Types.ServerToClientMessage { + return { + surfaceUpdate: { + surfaceId, + components: components.map((c) => ({ + id: c.id, + component: c.component, + })), + }, + } as Types.ServerToClientMessage; +} + +/** + * Create a begin rendering message. + */ +export function createBeginRendering( + rootId: string, + surfaceId = '@default' +): Types.ServerToClientMessage { + return { + beginRendering: { + root: rootId, + surfaceId, + }, + } as Types.ServerToClientMessage; +} + +/** + * Create messages for a simple component render. + */ +export function createSimpleMessages( + id: string, + componentType: string, + props: Record, + surfaceId = '@default' +): Types.ServerToClientMessage[] { + return [ + createSurfaceUpdate( + [{ id, component: { [componentType]: props } }], + surfaceId + ), + createBeginRendering(id, surfaceId), + ]; +} diff --git a/renderers/react/tests/setup.ts b/renderers/react/tests/setup.ts new file mode 100644 index 000000000..b22682cde --- /dev/null +++ b/renderers/react/tests/setup.ts @@ -0,0 +1,8 @@ +import '@testing-library/jest-dom/vitest'; +import { beforeAll } from 'vitest'; +import { initializeDefaultCatalog } from '../src'; + +// Initialize the default catalog before all tests +beforeAll(() => { + initializeDefaultCatalog(); +}); diff --git a/renderers/react/tsconfig.json b/renderers/react/tsconfig.json new file mode 100644 index 000000000..96b40b35f --- /dev/null +++ b/renderers/react/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noUncheckedIndexedAccess": true, + "noEmit": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/renderers/react/tsup.config.ts b/renderers/react/tsup.config.ts new file mode 100644 index 000000000..8d675f821 --- /dev/null +++ b/renderers/react/tsup.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig([ + // Main entry with DTS + { + entry: ['src/index.ts'], + format: ['esm', 'cjs'], + dts: true, + splitting: true, + sourcemap: true, + clean: true, + treeshake: true, + external: ['react', 'react-dom', 'markdown-it'], + esbuildOptions(options) { + options.jsx = 'automatic'; + }, + }, + // Styles entry without DTS (avoids symlink resolution issues) + { + entry: { 'styles/index': 'src/styles/index.ts' }, + format: ['esm', 'cjs'], + dts: false, + splitting: false, + sourcemap: true, + clean: false, + treeshake: true, + external: ['@a2ui/lit'], + }, +]); diff --git a/renderers/react/vitest.config.ts b/renderers/react/vitest.config.ts new file mode 100644 index 000000000..3fa5ea5f0 --- /dev/null +++ b/renderers/react/vitest.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./tests/setup.ts'], + include: ['tests/**/*.test.{ts,tsx}'], + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + include: ['src/**/*.{ts,tsx}'], + exclude: ['src/**/*.d.ts', 'src/index.ts'], + }, + }, + resolve: { + alias: { + '@': './src', + }, + }, +}); From 96607af6247adab5619525ff39615099c0c91143 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Fri, 30 Jan 2026 16:45:06 +0100 Subject: [PATCH 02/65] Improve React renderer with visual parity and tests - Refactor components to mirror Lit Shadow DOM structure for visual parity - Add CSS fixes for specificity and selector transformations - Add unit tests for all components (220 tests) - Add visual parity test infrastructure with Playwright - Update documentation with build and test instructions --- renderers/react/README.md | 602 ++- renderers/react/package-lock.json | 3309 +++++++++++++++++ renderers/react/package.json | 2 +- .../src/components/content/AudioPlayer.tsx | 19 +- .../react/src/components/content/Divider.tsx | 20 +- .../react/src/components/content/Icon.tsx | 20 +- .../react/src/components/content/Image.tsx | 20 +- .../react/src/components/content/Text.tsx | 38 +- .../react/src/components/content/Video.tsx | 42 +- .../src/components/interactive/Button.tsx | 21 +- .../src/components/interactive/CheckBox.tsx | 56 +- .../components/interactive/DateTimeInput.tsx | 56 +- .../components/interactive/MultipleChoice.tsx | 14 +- .../src/components/interactive/Slider.tsx | 70 +- .../src/components/interactive/TextField.tsx | 74 +- .../react/src/components/layout/Card.tsx | 51 +- .../react/src/components/layout/Column.tsx | 70 +- .../react/src/components/layout/List.tsx | 70 +- .../react/src/components/layout/Modal.tsx | 10 +- renderers/react/src/components/layout/Row.tsx | 72 +- .../react/src/components/layout/Tabs.tsx | 8 +- renderers/react/src/core/ComponentNode.tsx | 24 +- .../react/src/registry/defaultCatalog.ts | 14 +- renderers/react/src/styles/index.d.ts | 18 +- renderers/react/src/styles/index.ts | 553 +-- .../react/tests/components/Button.test.tsx | 258 ++ .../react/tests/components/Card.test.tsx | 137 + .../react/tests/components/CheckBox.test.tsx | 250 ++ .../react/tests/components/Column.test.tsx | 249 ++ .../tests/components/DateTimeInput.test.tsx | 327 ++ .../react/tests/components/Divider.test.tsx | 140 + .../react/tests/components/Image.test.tsx | 293 ++ .../react/tests/components/List.test.tsx | 280 ++ .../tests/components/MultipleChoice.test.tsx | 396 ++ renderers/react/tests/components/Row.test.tsx | 327 ++ .../react/tests/components/Slider.test.tsx | 308 ++ .../react/tests/components/Text.test.tsx | 23 +- .../react/tests/components/TextField.test.tsx | 232 ++ renderers/react/visual-parity/.gitignore | 4 + renderers/react/visual-parity/PARITY.md | 324 ++ renderers/react/visual-parity/README.md | 284 ++ .../fixtures/components/button.ts | 77 + .../visual-parity/fixtures/components/card.ts | 143 + .../fixtures/components/checkbox.ts | 68 + .../fixtures/components/column.ts | 88 + .../fixtures/components/dateTimeInput.ts | 59 + .../fixtures/components/divider.ts | 34 + .../visual-parity/fixtures/components/icon.ts | 39 + .../fixtures/components/image.ts | 124 + .../fixtures/components/index.ts | 36 + .../visual-parity/fixtures/components/list.ts | 94 + .../fixtures/components/multipleChoice.ts | 100 + .../visual-parity/fixtures/components/row.ts | 104 + .../fixtures/components/slider.ts | 31 + .../visual-parity/fixtures/components/tabs.ts | 97 + .../visual-parity/fixtures/components/text.ts | 112 + .../fixtures/components/textField.ts | 37 + .../react/visual-parity/fixtures/index.ts | 76 + .../visual-parity/fixtures/nested/index.ts | 6 + .../visual-parity/fixtures/nested/layouts.ts | 199 + .../visual-parity/fixtures/themes/index.ts | 43 + .../fixtures/themes/minimalTheme.ts | 198 + .../fixtures/themes/visualParityTheme.ts | 257 ++ .../react/visual-parity/fixtures/types.ts | 17 + renderers/react/visual-parity/lit/index.html | 158 + renderers/react/visual-parity/lit/src/main.ts | 214 ++ .../react/visual-parity/lit/vite.config.ts | 17 + .../react/visual-parity/package-lock.json | 2388 ++++++++++++ renderers/react/visual-parity/package.json | 38 + .../react/visual-parity/playwright.config.ts | 59 + .../react/visual-parity/react/index.html | 158 + .../visual-parity/react/src/FixturePage.tsx | 168 + .../react/visual-parity/react/src/main.tsx | 34 + .../react/visual-parity/react/vite.config.ts | 14 + .../visual-parity/tests/visual-parity.spec.ts | 452 +++ renderers/react/visual-parity/tsconfig.json | 16 + .../react/visual-parity/types/pixelmatch.d.ts | 22 + 77 files changed, 14279 insertions(+), 583 deletions(-) create mode 100644 renderers/react/package-lock.json create mode 100644 renderers/react/tests/components/Button.test.tsx create mode 100644 renderers/react/tests/components/Card.test.tsx create mode 100644 renderers/react/tests/components/CheckBox.test.tsx create mode 100644 renderers/react/tests/components/Column.test.tsx create mode 100644 renderers/react/tests/components/DateTimeInput.test.tsx create mode 100644 renderers/react/tests/components/Divider.test.tsx create mode 100644 renderers/react/tests/components/Image.test.tsx create mode 100644 renderers/react/tests/components/List.test.tsx create mode 100644 renderers/react/tests/components/MultipleChoice.test.tsx create mode 100644 renderers/react/tests/components/Row.test.tsx create mode 100644 renderers/react/tests/components/Slider.test.tsx create mode 100644 renderers/react/tests/components/TextField.test.tsx create mode 100644 renderers/react/visual-parity/.gitignore create mode 100644 renderers/react/visual-parity/PARITY.md create mode 100644 renderers/react/visual-parity/README.md create mode 100644 renderers/react/visual-parity/fixtures/components/button.ts create mode 100644 renderers/react/visual-parity/fixtures/components/card.ts create mode 100644 renderers/react/visual-parity/fixtures/components/checkbox.ts create mode 100644 renderers/react/visual-parity/fixtures/components/column.ts create mode 100644 renderers/react/visual-parity/fixtures/components/dateTimeInput.ts create mode 100644 renderers/react/visual-parity/fixtures/components/divider.ts create mode 100644 renderers/react/visual-parity/fixtures/components/icon.ts create mode 100644 renderers/react/visual-parity/fixtures/components/image.ts create mode 100644 renderers/react/visual-parity/fixtures/components/index.ts create mode 100644 renderers/react/visual-parity/fixtures/components/list.ts create mode 100644 renderers/react/visual-parity/fixtures/components/multipleChoice.ts create mode 100644 renderers/react/visual-parity/fixtures/components/row.ts create mode 100644 renderers/react/visual-parity/fixtures/components/slider.ts create mode 100644 renderers/react/visual-parity/fixtures/components/tabs.ts create mode 100644 renderers/react/visual-parity/fixtures/components/text.ts create mode 100644 renderers/react/visual-parity/fixtures/components/textField.ts create mode 100644 renderers/react/visual-parity/fixtures/index.ts create mode 100644 renderers/react/visual-parity/fixtures/nested/index.ts create mode 100644 renderers/react/visual-parity/fixtures/nested/layouts.ts create mode 100644 renderers/react/visual-parity/fixtures/themes/index.ts create mode 100644 renderers/react/visual-parity/fixtures/themes/minimalTheme.ts create mode 100644 renderers/react/visual-parity/fixtures/themes/visualParityTheme.ts create mode 100644 renderers/react/visual-parity/fixtures/types.ts create mode 100644 renderers/react/visual-parity/lit/index.html create mode 100644 renderers/react/visual-parity/lit/src/main.ts create mode 100644 renderers/react/visual-parity/lit/vite.config.ts create mode 100644 renderers/react/visual-parity/package-lock.json create mode 100644 renderers/react/visual-parity/package.json create mode 100644 renderers/react/visual-parity/playwright.config.ts create mode 100644 renderers/react/visual-parity/react/index.html create mode 100644 renderers/react/visual-parity/react/src/FixturePage.tsx create mode 100644 renderers/react/visual-parity/react/src/main.tsx create mode 100644 renderers/react/visual-parity/react/vite.config.ts create mode 100644 renderers/react/visual-parity/tests/visual-parity.spec.ts create mode 100644 renderers/react/visual-parity/tsconfig.json create mode 100644 renderers/react/visual-parity/types/pixelmatch.d.ts diff --git a/renderers/react/README.md b/renderers/react/README.md index 961ac089a..1f98fe091 100644 --- a/renderers/react/README.md +++ b/renderers/react/README.md @@ -1,8 +1,21 @@ # @a2ui/react -React implementation of A2UI (Agent-to-User Interface). +React renderer for A2UI (Agent-to-User Interface) - enables AI agents to generate rich, interactive user interfaces through declarative JSON. -> **Note:** This renderer is currently a work in progress. +## Table of Contents + +- [Installation](#installation) +- [Quick Start](#quick-start) +- [Architecture](#architecture) +- [Components](#components) +- [Hooks](#hooks) +- [Theme System](#theme-system) +- [Component Registry](#component-registry) +- [Styles](#styles) +- [Development](#development) +- [Visual Parity Testing](#visual-parity-testing) +- [API Reference](#api-reference) +- [Contributing](#contributing) ## Installation @@ -10,25 +23,600 @@ React implementation of A2UI (Agent-to-User Interface). npm install @a2ui/react ``` -## Usage +**Peer Dependencies:** +- React 18.x or 19.x +- React DOM 18.x or 19.x + +## Quick Start ```tsx -import { A2UIProvider, A2UIRenderer } from '@a2ui/react'; -import '@a2ui/react/styles/structural.css'; +import { A2UIProvider, A2UIRenderer, injectStyles } from '@a2ui/react'; +import { useA2UI } from '@a2ui/react'; + +// Inject A2UI styles once at app startup +injectStyles(); function App() { + const { processMessages } = useA2UI(); + + // Process A2UI messages from your AI agent + const handleAgentResponse = (messages) => { + processMessages(messages); + }; + return ( - + ); } + +// Handle user interactions +function handleAction(message) { + console.log('User action:', message); + // Send to your AI agent backend +} +``` + +### Standalone Viewer + +For simpler use cases, use the all-in-one `A2UIViewer`: + +```tsx +import { A2UIViewer, injectStyles } from '@a2ui/react'; + +injectStyles(); + +function App() { + const messages = [...]; // A2UI messages from agent + + return ( + console.log('Action:', msg)} + /> + ); +} +``` + +## Architecture + +### Two-Context Pattern + +The React renderer uses a two-context architecture for optimal performance: + +``` +┌─────────────────────────────────────────────────────────┐ +│ A2UIProvider │ +├─────────────────────────────────────────────────────────┤ +│ ┌─────────────────────┐ ┌─────────────────────────┐ │ +│ │ A2UIActionsContext │ │ A2UIStateContext │ │ +│ │ (stable reference) │ │ (triggers re-renders) │ │ +│ │ │ │ │ │ +│ │ • processMessages │ │ • version │ │ +│ │ • setData │ │ │ │ +│ │ • dispatch │ │ │ │ +│ │ • getData │ │ │ │ +│ │ • getSurface │ │ │ │ +│ └─────────────────────┘ └─────────────────────────┘ │ +│ │ +│ ┌────────────────────────────────────────────────────┐ │ +│ │ ThemeProvider │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────────────────┐ │ │ +│ │ │ A2UIRenderer│───▶│ ComponentNode │ │ │ +│ │ │ (surfaceId) │ │ (recursive rendering) │ │ │ +│ │ └─────────────┘ └─────────────────────────┘ │ │ +│ └────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +**Why two contexts?** + +- **A2UIActionsContext**: Contains stable action callbacks that never change reference. Components using `useA2UIActions()` won't re-render when data changes. +- **A2UIStateContext**: Contains a version counter that increments on state changes. Only components that need to react to data changes subscribe to this. + +This separation prevents unnecessary re-renders and provides fine-grained control over component updates. + +### Data Flow + +``` +Agent Server React App + │ │ + │ ServerToClientMessage[] │ + ├─────────────────────────────▶│ processMessages() + │ │ + │ ▼ + │ ┌────────────────┐ + │ │ MessageProcessor│ + │ │ (surfaces) │ + │ └───────┬────────┘ + │ │ + │ ▼ + │ ┌────────────────┐ + │ │ A2UIRenderer │ + │ │ (per surface) │ + │ └───────┬────────┘ + │ │ + │ ▼ + │ ┌────────────────┐ + │ │ ComponentNode │ + │ │ (recursive) │ + │ └───────┬────────┘ + │ │ + │ A2UIClientEventMessage │ User interaction + │◀────────────────────────────┤ dispatch() + │ │ +``` + +## Components + +All components are wrapped with `React.memo()` for performance optimization. + +### Content Components + +| Component | Description | +|-----------|-------------| +| `Text` | Renders text with markdown support | +| `Image` | Displays images with various usage hints | +| `Icon` | Renders Lucide icons | +| `Divider` | Horizontal or vertical divider | +| `Video` | Video player | +| `AudioPlayer` | Audio player | + +### Layout Components + +| Component | Description | +|-----------|-------------| +| `Column` | Vertical flex container | +| `Row` | Horizontal flex container | +| `Card` | Card container with styling | +| `List` | List container (vertical/horizontal) | +| `Tabs` | Tabbed interface | +| `Modal` | Modal dialog | + +### Interactive Components + +| Component | Description | +|-----------|-------------| +| `Button` | Clickable button with action dispatch | +| `TextField` | Text input (single/multiline) | +| `CheckBox` | Checkbox input | +| `Slider` | Range slider | +| `DateTimeInput` | Date/time picker | +| `MultipleChoice` | Radio/checkbox group | + +### Component Structure + +Each component mirrors the Lit renderer's Shadow DOM structure for visual parity: + +```tsx +// React component structure +
{/* :host equivalent */} +
{/* internal element */} + {children} {/* ::slotted(*) equivalent */} +
+
+``` + +## Hooks + +### useA2UI() + +High-level hook for external application use: + +```tsx +import { useA2UI } from '@a2ui/react'; + +function MyComponent() { + const { processMessages, clearSurfaces } = useA2UI(); + + const loadUI = async () => { + const response = await fetch('/api/agent'); + const messages = await response.json(); + processMessages(messages); + }; + + return ; +} +``` + +### useA2UIActions() + +Access stable actions without triggering re-renders: + +```tsx +import { useA2UIActions } from '@a2ui/react'; + +function ActionButton() { + const { dispatch } = useA2UIActions(); + + const handleClick = () => { + dispatch({ + event: { action: { name: 'submit' } }, + sourceComponent: 'button-1', + surfaceId: 'main', + }); + }; + + return ; +} +``` + +### useA2UIState() + +Subscribe to state changes (triggers re-renders): + +```tsx +import { useA2UIState } from '@a2ui/react'; + +function VersionDisplay() { + const { version } = useA2UIState(); + return State version: {version}; +} +``` + +### useA2UIContext() + +Combined access to actions and state: + +```tsx +import { useA2UIContext } from '@a2ui/react'; + +function MyComponent() { + const { processMessages, dispatch, version } = useA2UIContext(); + // ... +} +``` + +### useA2UIComponent() + +Internal hook for component implementations: + +```tsx +import { useA2UIComponent } from '@a2ui/react'; + +function CustomComponent({ node, surfaceId }) { + const { + theme, + resolveString, + resolveNumber, + resolveBoolean, + setValue, + getValue, + dispatch, + } = useA2UIComponent(node, surfaceId); + + const text = resolveString(node.properties.text); + // ... +} +``` + +## Theme System + +### Using the Default Theme + +```tsx +import { A2UIProvider, litTheme } from '@a2ui/react'; + + + {/* components */} + +``` + +### Creating a Custom Theme + +```tsx +import { litTheme } from '@a2ui/react'; + +const customTheme = { + ...litTheme, + components: { + ...litTheme.components, + Button: { + ...litTheme.components.Button, + all: { + 'my-button-class': true, + 'rounded-lg': true, + }, + }, + }, +}; + + + {/* components */} + +``` + +### Theme Structure + +```typescript +interface Theme { + components: { + [ComponentName]: { + all: ClassMap; // Always applied + [variant]: ClassMap; // Variant-specific (e.g., primary, secondary) + }; + }; + elements: { + [elementName]: ClassMap; // HTML element styling + }; + markdown: { + [tagName]: string[]; // Markdown element classes + }; + additionalStyles?: { + [ComponentName]: Record; // Inline styles + }; +} +``` + +## Component Registry + +### Default Catalog + +The default catalog registers all standard A2UI components: + +```tsx +import { initializeDefaultCatalog } from '@a2ui/react'; + +// Call once at app startup +initializeDefaultCatalog(); +``` + +### Custom Components + +Register custom components to extend or override the default catalog: + +```tsx +import { ComponentRegistry } from '@a2ui/react'; + +// Get the singleton registry +const registry = ComponentRegistry.getInstance(); + +// Register a custom component +registry.register('CustomButton', { + component: MyCustomButton, +}); + +// Override an existing component +registry.register('Button', { + component: MyEnhancedButton, +}); +``` + +### Lazy Loading + +Components can be lazy-loaded for code splitting: + +```tsx +registry.register('HeavyChart', { + component: () => import('./components/HeavyChart'), + lazy: true, +}); +``` + +> **Note:** Small, commonly-used components (like Tabs, Modal) should be statically imported to avoid Vite cache issues during development. + +## Styles + +### Injecting Styles + +Inject A2UI structural and component styles once at app startup: + +```tsx +import { injectStyles } from '@a2ui/react/styles'; + +// In your app entry point +injectStyles(); +``` + +### Style Architecture + +The styles module provides: + +- **structuralStyles**: Utility classes from Lit renderer (layout-*, typography-*, color-*) +- **componentSpecificStyles**: CSS that replicates Lit's Shadow DOM scoped styles + +```typescript +import { structuralStyles, componentSpecificStyles } from '@a2ui/react/styles'; +``` + +### CSS Variables + +CSS color variables must be defined by the host application: + +```css +:root { + --n-0: #ffffff; + --n-100: #f5f5f5; + /* ... other palette variables */ + --p-500: #3b82f6; + /* ... */ +} +``` + +### Removing Styles + +For cleanup (e.g., in tests): + +```tsx +import { removeStyles } from '@a2ui/react/styles'; + +removeStyles(); ``` ## Development +### Setup + +```bash +cd renderers/react +npm install +``` + +### Build + ```bash npm run build # Build the package npm run dev # Watch mode -npm test # Run tests ``` + +### Type Check + +```bash +npm run typecheck +``` + +### Lint + +```bash +npm run lint +``` + +## Testing + +### Unit Tests + +Uses [Vitest](https://vitest.dev/) + [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/). + +```bash +npm test # Run once +npm run test:watch # Watch mode +``` + +**Structure:** +``` +tests/ +├── setup.ts # Initializes component catalog +├── helpers.tsx # TestWrapper, TestRenderer, message creators +└── components/ # Component tests (*.test.tsx) +``` + +**Example:** +```tsx +import { render, screen, fireEvent } from '@testing-library/react'; +import { TestWrapper, TestRenderer, createSimpleMessages } from '../helpers'; + +it('should dispatch action on click', () => { + const onAction = vi.fn(); + const messages = createSimpleMessages('btn-1', 'Button', { + child: 'text-1', + action: { name: 'submit' }, + }); + + render( + + + + ); + + fireEvent.click(screen.getByRole('button')); + expect(onAction).toHaveBeenCalled(); +}); +``` + +## Visual Parity Testing + +The React renderer maintains visual parity with the Lit renderer (reference implementation). A comprehensive test suite compares pixel-perfect screenshots between both renderers. + +### Running Visual Parity Tests + +```bash +cd visual-parity +npm install +npm test +``` + +### Quick Commands + +```bash +# Run all tests +npm test + +# Run specific component tests +npm test -- --grep "button" + +# Run with UI mode +npm run test:ui + +# Start dev servers for manual inspection +npm run dev +# React: http://localhost:5001 +# Lit: http://localhost:5002 +``` + +### Documentation + +- **[visual-parity/README.md](./visual-parity/README.md)** - Test suite usage and fixture creation +- **[visual-parity/PARITY.md](./visual-parity/PARITY.md)** - CSS transformation approach and implementation status + +### Key Concepts + +1. **Structural Mirroring**: React components mirror Lit's Shadow DOM structure +2. **CSS Selector Transformation**: `:host` → `.a2ui-surface .a2ui-{component}` +3. **Specificity Matching**: Uses `:where()` to match Lit's low specificity + +## API Reference + +### Core Exports + +```typescript +// Provider and Renderer +export { A2UIProvider, A2UIRenderer, A2UIViewer, ComponentNode }; + +// Hooks +export { useA2UI, useA2UIActions, useA2UIState, useA2UIContext, useA2UIComponent }; + +// Registry +export { ComponentRegistry, registerDefaultCatalog, initializeDefaultCatalog }; + +// Theme +export { ThemeProvider, useTheme, litTheme, defaultTheme }; + +// Styles (from '@a2ui/react/styles') +export { injectStyles, removeStyles, structuralStyles, componentSpecificStyles }; + +// Utilities +export { cn, classMapToString, stylesToObject }; + +// All component exports +export { Text, Image, Icon, Divider, Video, AudioPlayer }; +export { Row, Column, Card, List, Tabs, Modal }; +export { Button, TextField, CheckBox, Slider, DateTimeInput, MultipleChoice }; +``` + +### Types + +```typescript +import type { + Types, + Theme, + Surface, + SurfaceID, + AnyComponentNode, + ServerToClientMessage, + A2UIClientEventMessage, + A2UIComponentProps, + A2UIProviderProps, + A2UIRendererProps, + UseA2UIResult, + UseA2UIComponentResult, +} from '@a2ui/react'; +``` + +## Contributing + +### Code Style + +- All components use `React.memo()` for performance +- Use the two-context pattern for state management +- Follow the existing component structure for visual parity + +### Adding a New Component + +1. Create component in `src/components/{category}/{ComponentName}.tsx` +2. Follow wrapper div + section structure (see [Component Structure](#component-structure)) +3. Register in `src/registry/defaultCatalog.ts` +4. Export from `src/index.ts` +5. Add unit tests in `tests/components/{ComponentName}.test.tsx` +6. Add visual parity fixtures in `visual-parity/fixtures/components/` diff --git a/renderers/react/package-lock.json b/renderers/react/package-lock.json new file mode 100644 index 000000000..096872a44 --- /dev/null +++ b/renderers/react/package-lock.json @@ -0,0 +1,3309 @@ +{ + "name": "@a2ui/react", + "version": "0.8.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@a2ui/react", + "version": "0.8.0", + "license": "Apache-2.0", + "dependencies": { + "@a2ui/lit": "file:../lit", + "clsx": "^2.1.0", + "markdown-it": "^14.0.0" + }, + "devDependencies": { + "@testing-library/jest-dom": "^6.6.0", + "@testing-library/react": "^16.0.0", + "@types/markdown-it": "^14.1.0", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "clsx": "^2.1.0", + "jsdom": "^25.0.0", + "markdown-it": "^14.0.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "tsup": "^8.0.0", + "typescript": "^5.8.0", + "vitest": "^3.0.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "../lit": { + "name": "@a2ui/lit", + "version": "0.8.1", + "license": "Apache-2.0", + "dependencies": { + "@a2ui/web_core": "file:../web_core", + "@lit-labs/signals": "^0.1.3", + "@lit/context": "^1.1.4", + "lit": "^3.3.1", + "markdown-it": "^14.1.0", + "signal-utils": "^0.21.1" + }, + "devDependencies": { + "@types/markdown-it": "^14.1.2", + "@types/node": "^24.10.1", + "google-artifactregistry-auth": "^3.5.0", + "typescript": "^5.8.3", + "wireit": "^0.15.0-pre.2" + } + }, + "node_modules/@a2ui/lit": { + "resolved": "../lit", + "link": true + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "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" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "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" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "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" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "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" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "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": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/renderers/react/package.json b/renderers/react/package.json index a992b8f25..14959db72 100644 --- a/renderers/react/package.json +++ b/renderers/react/package.json @@ -42,7 +42,7 @@ "clean": "rm -rf dist" }, "dependencies": { - "@a2ui/lit": "workspace:*", + "@a2ui/lit": "file:../lit", "clsx": "^2.1.0", "markdown-it": "^14.0.0" }, diff --git a/renderers/react/src/components/content/AudioPlayer.tsx b/renderers/react/src/components/content/AudioPlayer.tsx index 9fb48bb56..49478dbef 100644 --- a/renderers/react/src/components/content/AudioPlayer.tsx +++ b/renderers/react/src/components/content/AudioPlayer.tsx @@ -18,13 +18,20 @@ export const AudioPlayer = memo(function AudioPlayer({ node, surfaceId }: A2UICo return null; } + // Apply --weight CSS variable on root div (:host equivalent) for flex layouts + const hostStyle: React.CSSProperties = node.weight !== undefined + ? { '--weight': node.weight } as React.CSSProperties + : {}; + return ( -
- {description &&

{description}

} -
+
+
+ {snakeCaseName} +
+
); }); diff --git a/renderers/react/src/components/content/Image.tsx b/renderers/react/src/components/content/Image.tsx index 0a4c7772f..00baf76e9 100644 --- a/renderers/react/src/components/content/Image.tsx +++ b/renderers/react/src/components/content/Image.tsx @@ -37,14 +37,20 @@ export const Image = memo(function Image({ node, surfaceId }: A2UIComponentProps return null; } - // Match Lit structure:
+ // Apply --weight CSS variable on root div (:host equivalent) for flex layouts + const hostStyle: React.CSSProperties = node.weight !== undefined + ? { '--weight': node.weight } as React.CSSProperties + : {}; + return ( -
- -
+
+
+ +
+
); }); diff --git a/renderers/react/src/components/content/Text.tsx b/renderers/react/src/components/content/Text.tsx index 4a05f2ac4..15a2227a5 100644 --- a/renderers/react/src/components/content/Text.tsx +++ b/renderers/react/src/components/content/Text.tsx @@ -26,13 +26,14 @@ function isHintedStyles(styles: unknown): styles is HintedStyles { /** * Markdown-it instance for rendering markdown text. * Uses synchronous import to ensure availability at first render (matches Lit renderer). + * + * Configuration matches Lit's markdown directive (uses MarkdownIt defaults): + * - html: false (default) - Security: disable raw HTML + * - linkify: false (default) - Don't auto-convert URLs/emails to links + * - breaks: false (default) - Don't convert \n to
+ * - typographer: false (default) - Don't use smart quotes/dashes */ -const markdownRenderer = new MarkdownIt({ - html: false, // Security: disable raw HTML - breaks: true, // Convert \n to
- linkify: true, // Auto-convert URLs to links - typographer: true, // Smart quotes, dashes, etc. -}); +const markdownRenderer = new MarkdownIt(); /** * Apply theme classes to markdown HTML elements. @@ -66,6 +67,13 @@ function applyMarkdownTheme(html: string, markdownTheme: Types.Theme['markdown'] /** * Text component - renders text content with markdown support. * + * Structure mirrors Lit's Text component: + *
← :host equivalent + *
← theme classes + *

...

← rendered markdown content + *
+ *
+ * * Text is parsed as markdown and rendered as HTML (matches Lit renderer behavior). * Supports usageHint values: h1, h2, h3, h4, h5, caption, body * @@ -144,13 +152,19 @@ export const Text = memo(function Text({ node, surfaceId }: A2UIComponentProps wrapper with markdown rendering (matches Lit structure) + // Apply --weight CSS variable on root div (:host equivalent) for flex layouts + const hostStyle: React.CSSProperties = node.weight !== undefined + ? { '--weight': node.weight } as React.CSSProperties + : {}; + return ( -
+
+
+
); }); diff --git a/renderers/react/src/components/content/Video.tsx b/renderers/react/src/components/content/Video.tsx index 4f927df4e..40c1ecc50 100644 --- a/renderers/react/src/components/content/Video.tsx +++ b/renderers/react/src/components/content/Video.tsx @@ -39,30 +39,30 @@ export const Video = memo(function Video({ node, surfaceId }: A2UIComponentProps const youtubeId = getYouTubeVideoId(url); - if (youtubeId) { - return ( -
+
- +
+ `; + } + + #calculateSandbox(): string { + // 1. If HTML is provided, it's treated as Trusted (but isolated) + if (this.html) { + if (this.interactionMode === 'interactive') { + return "allow-scripts allow-forms allow-popups allow-modals"; + } + return "allow-scripts"; // ReadOnly but scripts allowed for rendering + } + + // 2. Parse Domain from URL + try { + const urlObj = new URL(this.url, window.location.href); // Handle relative URLs too + const hostname = urlObj.hostname; + + const isTrusted = WebFrame.TRUSTED_DOMAINS.some(d => hostname === d || hostname.endsWith(`.${d}`)); + + if (!isTrusted) { + // Untrusted: Strict Lockdown + return ""; + } + + // Trusted + // Always allow same-origin for trusted domains to avoid issues with local assets or CORS checks + if (this.interactionMode === 'interactive') { + return "allow-scripts allow-forms allow-popups allow-modals allow-same-origin"; + } else { + return "allow-scripts allow-same-origin"; + } + + } catch (e) { + // Invalid URL -> Lockdown + return ""; + } + } + + // --- Event Bridge --- + + firstUpdated() { + window.addEventListener("message", this.#onMessage); + } + + disconnectedCallback() { + window.removeEventListener("message", this.#onMessage); + super.disconnectedCallback(); + } + + #onMessage = (event: MessageEvent) => { + // In production, verify event.origin matches this.src origin (if not opaque). + const data = event.data; + + // Spec Protocol: { type: 'a2ui_action', action: '...', data: ... } + if (data && data.type === 'a2ui_action') { + const { action, data: actionData } = data; // 'data' property in message payload + + // 1. Validate Action + if (this.allowedEvents.includes(action)) { + // 2. Dispatch + this.#dispatchAgentAction(action, actionData); + } else { + console.warn(`[WebFrame] Action '${action}' blocked. Not in allowedEvents:`, this.allowedEvents); + } + } + // Legacy support for 'emit' temporarily if we want to be safe, but spec implies replacement. + // I will remove legacy to be strict. + }; + + #dispatchAgentAction(actionName: string, params: any) { + const context: v0_8.Types.Action["context"] = []; + if (params && typeof params === 'object') { + for (const [key, value] of Object.entries(params)) { + if (typeof value === "string") { + context.push({ key, value: { literalString: value } }); + } else if (typeof value === "number") { + context.push({ key, value: { literalNumber: value } }); + } else if (typeof value === "boolean") { + context.push({ key, value: { literalBoolean: value } }); + } + } + } + + const action: v0_8.Types.Action = { + name: actionName, + context, + }; + + const eventPayload: v0_8.Events.StateEventDetailMap["a2ui.action"] = { + eventType: "a2ui.action", + action, + sourceComponentId: this.id, + dataContextPath: this.dataContextPath, + sourceComponent: this.component as v0_8.Types.AnyComponentNode, + }; + + this.dispatchEvent(new v0_8.Events.StateEvent(eventPayload)); + } + + // --- Zoom Controls (External) --- + // Keeps working by sending 'zoom' to iframe. + // We assume the iframe content knows how to handle 'zoom' message if it supports it. + #zoom(factor: number) { + if (this.iframe && this.iframe.contentWindow) { + this.iframe.contentWindow.postMessage({ type: 'zoom', payload: { factor } }, '*'); + } + } +} diff --git a/samples/client/lit/component_gallery/ui/debug-panel.ts b/samples/client/lit/component_gallery/ui/debug-panel.ts new file mode 100644 index 000000000..6bc74814a --- /dev/null +++ b/samples/client/lit/component_gallery/ui/debug-panel.ts @@ -0,0 +1,226 @@ + +import { LitElement, html, css, nothing } from "lit"; +import { customElement, property, state } from "lit/decorators.js"; + +type LogEntry = { + type: 'incoming' | 'outgoing' | 'info'; + timestamp: string; + summary: string; + detail: any; + id: number; +}; + +@customElement("debug-panel") +export class DebugPanel extends LitElement { + @property({ type: Boolean }) accessor isOpen = true; + @state() accessor logs: LogEntry[] = []; + @state() accessor selectedLogId: number | null = null; + + private nextId = 0; + + @state() accessor panelHeight = 400; + @state() accessor isResizing = false; + + private startY = 0; + private startHeight = 0; + + static styles = css` + :host { + display: flex; + flex-direction: column; + background: #1e1e1e; + color: #d4d4d4; + font-family: monospace; + border-top: 1px solid #333; + overflow: hidden; + position: relative; + } + + .resize-handle { + height: 4px; + background: #333; + cursor: ns-resize; + width: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 10; + } + + .resize-handle:hover, :host(.resizing) .resize-handle { + background: #007acc; + } + + :host([isopen="false"]) { + height: 32px !important; + } + + .header { + display: flex; + align-items: center; + padding: 4px 8px; + background: #252526; + border-bottom: 1px solid #333; + user-select: none; + margin-top: 4px; /* Space for handle */ + } + + .title { + flex: 1; + font-weight: bold; + font-size: 12px; + } + + .controls { + display: flex; + gap: 8px; + } + + button { + background: #333; + border: 1px solid #444; + color: #ccc; + cursor: pointer; + font-size: 11px; + padding: 2px 8px; + border-radius: 4px; + } + + button:hover { + background: #444; + } + + .content { + display: flex; + flex: 1; + overflow: hidden; + } + + .log-list { + flex: 1; + overflow-y: auto; + border-right: 1px solid #333; + padding: 4px 0; + } + + .log-item { + padding: 4px 8px; + cursor: pointer; + font-size: 11px; + display: flex; + gap: 8px; + border-bottom: 1px solid #2a2a2a; + } + + .log-item:hover { + background: #2a2a2d; + } + + .log-item.selected { + background: #37373d; + } + + .log-type { + font-weight: bold; + width: 60px; + flex-shrink: 0; + } + + .type-incoming { color: #4ec9b0; } + .type-outgoing { color: #ce9178; } + .type-info { color: #569cd6; } + + .log-time { + color: #888; + flex-shrink: 0; + } + + .log-summary { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .detail-view { + flex: 1.5; + overflow-y: auto; + padding: 8px; + white-space: pre-wrap; + font-size: 11px; + background: #1e1e1e; + } + `; + + addLog(type: 'incoming' | 'outgoing' | 'info', summary: string, detail: any) { + this.logs = [...this.logs, { + type, + timestamp: new Date().toLocaleTimeString(), + summary, + detail, + id: this.nextId++ + }]; + } + + private startResize(e: MouseEvent) { + this.isResizing = true; + this.startY = e.clientY; + this.startHeight = this.getBoundingClientRect().height; + + window.addEventListener('mousemove', this.doResize); + window.addEventListener('mouseup', this.stopResize); + this.classList.add('resizing'); + } + + private doResize = (e: MouseEvent) => { + if (!this.isResizing) return; + const delta = this.startY - e.clientY; + const newHeight = this.startHeight + delta; + this.panelHeight = Math.max(100, Math.min(window.innerHeight - 50, newHeight)); + } + + private stopResize = () => { + this.isResizing = false; + window.removeEventListener('mousemove', this.doResize); + window.removeEventListener('mouseup', this.stopResize); + this.classList.remove('resizing'); + } + + render() { + const selectedLog = this.logs.find(l => l.id === this.selectedLogId); + + return html` +
+
+ Debug Panel (${this.logs.length} events) +
+ + +
+
+ ${this.isOpen ? html` + +
+
+ ${this.logs.slice().reverse().map(log => html` +
this.selectedLogId = log.id}> + ${log.timestamp} + ${log.type.toUpperCase()} + ${log.summary} +
+ `)} +
+
+ ${selectedLog + ? JSON.stringify(selectedLog.detail, null, 2) + : 'Select an event to view details.'} +
+
+ ` : nothing} + `; + } +} diff --git a/samples/client/lit/component_gallery/ui/snackbar.ts b/samples/client/lit/component_gallery/ui/snackbar.ts new file mode 100644 index 000000000..91f2f036d --- /dev/null +++ b/samples/client/lit/component_gallery/ui/snackbar.ts @@ -0,0 +1,299 @@ +/* + Copyright 2025 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +import { LitElement, html, css, nothing, unsafeCSS } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { SnackbarMessage, SnackbarUUID, SnackType } from "../types/types"; +import { repeat } from "lit/directives/repeat.js"; +import { SnackbarActionEvent } from "../events/events"; +import { classMap } from "lit/directives/class-map.js"; +import { v0_8 } from "@a2ui/lit"; + +const DEFAULT_TIMEOUT = 8000; + +@customElement("ui-snackbar") +export class Snackbar extends LitElement { + @property({ reflect: true, type: Boolean }) + accessor active = false; + + @property({ reflect: true, type: Boolean }) + accessor error = false; + + @property() + accessor timeout = DEFAULT_TIMEOUT; + + #messages: SnackbarMessage[] = []; + #timeout = 0; + + static styles = [ + unsafeCSS(v0_8.Styles.structuralStyles), + css` + :host { + --text-color: var(--n-0); + --bb-body-medium: 16px; + --bb-body-line-height-medium: 24px; + + display: flex; + align-items: center; + position: fixed; + bottom: var(--bb-grid-size-7); + left: 50%; + translate: -50% 0; + opacity: 0; + pointer-events: none; + border-radius: var(--bb-grid-size-2); + background: var(--n-90); + padding: var(--bb-grid-size-3) var(--bb-grid-size-6); + width: 60svw; + max-width: 720px; + z-index: 1800; + scrollbar-width: none; + overflow-x: scroll; + font: 400 var(--bb-body-medium) / var(--bb-body-line-height-medium) + var(--bb-font-family); + } + + :host([active]) { + transition: opacity 0.3s cubic-bezier(0, 0, 0.3, 1) 0.2s; + opacity: 1; + pointer-events: auto; + } + + :host([error]) { + background: var(--e-90); + --text-color: var(--e-40); + } + + .g-icon { + flex: 0 0 auto; + color: var(--text-color); + margin-right: var(--bb-grid-size-4); + + &.rotate { + animation: 1s linear 0s infinite normal forwards running rotate; + } + } + + #messages { + color: var(--text-color); + flex: 1 1 auto; + margin-right: var(--bb-grid-size-11); + + a, + a:visited { + color: var(--bb-ui-600); + text-decoration: none; + + &:hover { + color: var(--bb-ui-500); + text-decoration: underline; + } + } + } + + #actions { + flex: 0 1 auto; + width: fit-content; + margin-right: var(--bb-grid-size-3); + + & button { + font: 500 var(--bb-body-medium) / var(--bb-body-line-height-medium) + var(--bb-font-family); + padding: 0; + background: transparent; + border: none; + margin: 0 var(--bb-grid-size-4); + color: var(--text-color); + opacity: 0.7; + transition: opacity 0.2s cubic-bezier(0, 0, 0.3, 1); + + &:not([disabled]) { + cursor: pointer; + + &:hover, + &:focus { + opacity: 1; + } + } + } + } + + #close { + display: flex; + align-items: center; + padding: 0; + color: var(--text-color); + background: transparent; + border: none; + margin: 0 0 0 var(--bb-grid-size-2); + opacity: 0.7; + transition: opacity 0.2s cubic-bezier(0, 0, 0.3, 1); + + .g-icon { + margin-right: 0; + } + + &:not([disabled]) { + cursor: pointer; + + &:hover, + &:focus { + opacity: 1; + } + } + } + + @keyframes rotate { + from { + rotate: 0deg; + } + + to { + rotate: 360deg; + } + } + `, + ]; + + show(message: SnackbarMessage, replaceAll = false) { + const existingMessage = this.#messages.findIndex( + (msg) => msg.id === message.id + ); + if (existingMessage === -1) { + if (replaceAll) { + this.#messages.length = 0; + } + + this.#messages.push(message); + } else { + this.#messages[existingMessage] = message; + } + + window.clearTimeout(this.#timeout); + if (!this.#messages.every((msg) => msg.persistent)) { + this.#timeout = window.setTimeout(() => { + this.hide(); + }, this.timeout); + } + + this.error = this.#messages.some((msg) => msg.type === SnackType.ERROR); + this.active = true; + this.requestUpdate(); + + return message.id; + } + + hide(id?: SnackbarUUID) { + if (id) { + const idx = this.#messages.findIndex((msg) => msg.id === id); + if (idx !== -1) { + this.#messages.splice(idx, 1); + } + } else { + this.#messages.length = 0; + } + + this.active = this.#messages.length !== 0; + this.updateComplete.then((avoidedUpdate) => { + if (!avoidedUpdate) { + return; + } + + this.requestUpdate(); + }); + } + + render() { + let rotate = false; + let icon = ""; + for (let i = this.#messages.length - 1; i >= 0; i--) { + if ( + !this.#messages[i].type || + this.#messages[i].type === SnackType.NONE + ) { + continue; + } + + icon = this.#messages[i].type; + if (this.#messages[i].type === SnackType.PENDING) { + icon = "progress_activity"; + rotate = true; + } + break; + } + + return html` ${icon + ? html`${icon}` + : nothing} +
+ ${repeat( + this.#messages, + (message) => message.id, + (message) => { + return html`
${message.message}
`; + } + )} +
+
+ ${repeat( + this.#messages, + (message) => message.id, + (message) => { + if (!message.actions) { + return nothing; + } + + return html`${repeat( + message.actions, + (action) => action.value, + (action) => { + return html``; + } + )}`; + } + )} +
+ `; + } +} diff --git a/samples/client/lit/component_gallery/ui/ui.ts b/samples/client/lit/component_gallery/ui/ui.ts new file mode 100644 index 000000000..7726f29d7 --- /dev/null +++ b/samples/client/lit/component_gallery/ui/ui.ts @@ -0,0 +1,17 @@ +/* + Copyright 2025 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +export { Snackbar } from "./snackbar"; diff --git a/samples/client/lit/component_gallery/vite.config.ts b/samples/client/lit/component_gallery/vite.config.ts new file mode 100644 index 000000000..16c0e4785 --- /dev/null +++ b/samples/client/lit/component_gallery/vite.config.ts @@ -0,0 +1,46 @@ + +/* + Copyright 2025 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import { config } from "dotenv"; +import { UserConfig } from "vite"; +import * as Middleware from "./middleware"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default async () => { + config(); + + const entry: Record = { + component_gallery: resolve(__dirname, "index.html"), + }; + + return { + plugins: [Middleware.A2AMiddleware.plugin()], + build: { + rollupOptions: { + input: entry, + }, + target: "esnext", + }, + define: {}, + resolve: { + dedupe: ["lit"], + }, + } satisfies UserConfig; +}; From 7d9b7b814751280c80f44703a388ac1e86a1e214 Mon Sep 17 00:00:00 2001 From: dmandar <11888634+dmandar@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:02:13 -0800 Subject: [PATCH 35/65] 1. Update A2UI spec to 0.8.2 and add support for filtering and types in multiselect (#604) * fix contact sample * Fix dropdown and make it multi-choice * Add a new component_gallery sample agent and client that allows debugging on-the-wire a2UI JSON and actions * Update samples/client/lit/component_gallery/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * fix modal * Create new 0.8.2 version of the spec to support filtering and types for dropdown * address review fixes * Update readme * fix review comments --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- renderers/lit/src/0.8/ui/checkbox.ts | 5 - renderers/lit/src/0.8/ui/icon.ts | 4 +- renderers/lit/src/0.8/ui/multiple-choice.ts | 245 +- renderers/lit/src/0.8/ui/root.ts | 2 + renderers/web_core/package.json | 2 +- .../schemas/standard_catalog_definition.json | 21 +- .../web_core/src/v0_8/types/components.ts | 2 + samples/agent/adk/component_gallery/README.md | 59 + .../agent/adk/component_gallery/__main__.py | 9 +- samples/agent/adk/component_gallery/agent.py | 2 +- .../adk/component_gallery/assets/a2ui.png | Bin 0 -> 867303 bytes .../adk/component_gallery/assets/audio.mp3 | Bin 0 -> 744576 bytes .../adk/component_gallery/gallery_examples.py | 48 +- samples/agent/adk/uv.lock | 2563 +++++++++-------- .../client/lit/component_gallery/README.md | 69 +- .../client/lit/component_gallery/client.ts | 4 +- .../component_gallery/component-gallery.ts | 6 +- samples/client/lit/shell/README.md | 16 +- samples/client/lit/shell/package.json | 4 +- specification/v0_8/README.md | 6 +- .../json/standard_catalog_definition.json | 21 +- specification/v0_9/json/standard_catalog.json | 12 + 22 files changed, 1729 insertions(+), 1371 deletions(-) create mode 100644 samples/agent/adk/component_gallery/README.md create mode 100644 samples/agent/adk/component_gallery/assets/a2ui.png create mode 100644 samples/agent/adk/component_gallery/assets/audio.mp3 diff --git a/renderers/lit/src/0.8/ui/checkbox.ts b/renderers/lit/src/0.8/ui/checkbox.ts index d5663aadc..8d684daef 100644 --- a/renderers/lit/src/0.8/ui/checkbox.ts +++ b/renderers/lit/src/0.8/ui/checkbox.ts @@ -71,8 +71,6 @@ export class Checkbox extends Root { return; } - - this.processor.setData( this.component, this.value.path, @@ -121,7 +119,6 @@ export class Checkbox extends Root { return this.#renderField(this.value.literal); } else if (this.value && "path" in this.value && this.value.path) { if (!this.processor || !this.component) { - return html`(no model)`; } @@ -131,8 +128,6 @@ export class Checkbox extends Root { this.surfaceId ?? A2uiMessageProcessor.DEFAULT_SURFACE_ID ); - - if (textValue === null) { return html`Invalid label`; } diff --git a/renderers/lit/src/0.8/ui/icon.ts b/renderers/lit/src/0.8/ui/icon.ts index 1e6138350..30f6c46e4 100644 --- a/renderers/lit/src/0.8/ui/icon.ts +++ b/renderers/lit/src/0.8/ui/icon.ts @@ -39,11 +39,11 @@ export class Icon extends Root { display: block; flex: var(--weight); min-height: 0; - overflow: auto; + } .g-icon { - font-family: 'Material Icons'; + font-family: 'Material Symbols Outlined'; font-weight: normal; font-style: normal; font-size: 24px; diff --git a/renderers/lit/src/0.8/ui/multiple-choice.ts b/renderers/lit/src/0.8/ui/multiple-choice.ts index 29f636aa2..3358055a6 100644 --- a/renderers/lit/src/0.8/ui/multiple-choice.ts +++ b/renderers/lit/src/0.8/ui/multiple-choice.ts @@ -14,6 +14,7 @@ limitations under the License. */ + import { html, css, PropertyValues, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { Root } from "./root.js"; @@ -35,9 +36,18 @@ export class MultipleChoice extends Root { @property() accessor selections: Primitives.StringValue | string[] = []; + @property() + accessor variant: "checkbox" | "chips" = "checkbox"; + + @property({ type: Boolean }) + accessor filterable = false; + @state() accessor isOpen = false; + @state() + accessor filterText = ""; + static styles = [ structuralStyles, css` @@ -95,25 +105,57 @@ export class MultipleChoice extends Root { transform: rotate(180deg); } - /* Dropdown List */ - .options-list { + /* Dropdown Wrapper */ + .dropdown-wrapper { background: var(--md-sys-color-surface); border: 1px solid var(--md-sys-color-outline-variant); - border-radius: 8px; /* Consistent rounding */ - box-shadow: none; /* Remove shadow for inline feel, or keep subtle */ - overflow-y: auto; + border-radius: 8px; + box-shadow: var(--md-sys-elevation-level2); padding: 0; display: none; flex-direction: column; - margin-top: 4px; /* Small gap */ - max-height: 0; /* Animate height? */ - transition: max-height 0.2s ease-out; + margin-top: 4px; + max-height: 300px; + transition: opacity 0.2s ease-out; + overflow: hidden; /* contain children */ } - .options-list.open { + .dropdown-wrapper.open { display: flex; - max-height: 300px; /* Limit height but allow scrolling */ - border: 1px solid var(--md-sys-color-outline-variant); /* efficient border */ + border: 1px solid var(--md-sys-color-outline-variant); + } + + /* Scrollable Area for Options */ + .options-scroll-container { + overflow-y: auto; + flex: 1; /* take remaining height */ + display: flex; + flex-direction: column; + } + + /* Filter Input */ + .filter-container { + padding: 8px; + border-bottom: 1px solid var(--md-sys-color-outline-variant); + background: var(--md-sys-color-surface); + z-index: 1; /* ensure top of stack */ + flex-shrink: 0; /* don't shrink */ + } + + .filter-input { + width: 100%; + padding: 8px 12px; + border: 1px solid var(--md-sys-color-outline); + border-radius: 4px; + font-family: inherit; + font-size: 0.9rem; + background: var(--md-sys-color-surface-container-low); + color: var(--md-sys-color-on-surface); + } + + .filter-input:focus { + outline: none; + border-color: var(--md-sys-color-primary); } /* Option Item (Checkbox style) */ @@ -164,6 +206,54 @@ export class MultipleChoice extends Root { transform: scale(1); } + /* Chips Layout */ + .chips-container { + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 4px 0; + } + + .chip { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 16px; + border: 1px solid var(--md-sys-color-outline); + border-radius: 16px; + cursor: pointer; + user-select: none; + background: var(--md-sys-color-surface); + color: var(--md-sys-color-on-surface); + transition: all 0.2s ease; + font-size: 0.9rem; + } + + .chip:hover { + background: var(--md-sys-color-surface-container-high); + } + + .chip.selected { + background: var(--md-sys-color-secondary-container); + color: var(--md-sys-color-on-secondary-container); + border-color: var(--md-sys-color-secondary-container); + } + + .chip.selected:hover { + background: var(--md-sys-color-secondary-container-high, #e8def8); + } + + .chip-icon { + display: none; + width: 18px; + height: 18px; + } + + .chip.selected .chip-icon { + display: block; + fill: currentColor; + } + @keyframes fadeIn { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } @@ -191,13 +281,14 @@ export class MultipleChoice extends Root { } getCurrentSelections(): string[] { - if (!this.processor || !this.component) { - return Array.isArray(this.selections) ? this.selections : []; - } if (Array.isArray(this.selections)) { return this.selections; } + if (!this.processor || !this.component) { + return []; + } + const selectionValue = this.processor.getData( this.component, this.selections.path!, @@ -217,8 +308,82 @@ export class MultipleChoice extends Root { this.requestUpdate(); } + #renderCheckIcon() { + return html` + + + + `; + } + + #renderFilter() { + return html` +
+ { + const target = e.target as HTMLInputElement; + this.filterText = target.value; + }} + @click=${(e: Event) => e.stopPropagation()} + /> +
+ `; + } + render() { const currentSelections = this.getCurrentSelections(); + + // Filter options + const filteredOptions = this.options.filter(option => { + if (!this.filterText) return true; + const label = extractStringValue( + option.label, + this.component, + this.processor, + this.surfaceId + ); + return label.toLowerCase().includes(this.filterText.toLowerCase()); + }); + + // Chips Layout + if (this.variant === "chips") { + return html` +
+ ${this.description ? html`
${this.description}
` : nothing} + ${this.filterable ? this.#renderFilter() : nothing} +
+ ${filteredOptions.map((option) => { + const label = extractStringValue( + option.label, + this.component, + this.processor, + this.surfaceId + ); + const isSelected = currentSelections.includes(option.value); + return html` +
{ + e.stopPropagation(); + this.toggleSelection(option.value); + }} + > + ${isSelected ? this.#renderCheckIcon() : nothing} + ${label} +
+ `; + })} +
+ ${filteredOptions.length === 0 ? html`
No options found
` : nothing} +
+ `; + } + + // Default Checkbox Dropdown Layout const count = currentSelections.length; const headerText = count > 0 ? `${count} Selected` : (this.description ?? "Select items"); @@ -236,31 +401,35 @@ export class MultipleChoice extends Root { -
- ${this.options.map((option) => { - const label = extractStringValue( - option.label, - this.component, - this.processor, - this.surfaceId - ); - const isSelected = currentSelections.includes(option.value); - - return html` -
{ - e.stopPropagation(); - this.toggleSelection(option.value); - }} - > -
- +
`; diff --git a/renderers/lit/src/0.8/ui/root.ts b/renderers/lit/src/0.8/ui/root.ts index b63a25794..fcd33df1e 100644 --- a/renderers/lit/src/0.8/ui/root.ts +++ b/renderers/lit/src/0.8/ui/root.ts @@ -385,6 +385,8 @@ export class Root extends SignalWatcher(LitElement) { .options=${node.properties.options} .maxAllowedSelections=${node.properties.maxAllowedSelections} .selections=${node.properties.selections} + .variant=${(node as any).properties.variant} + .filterable=${node.properties.filterable} .enableCustomElements=${this.enableCustomElements} >`; } diff --git a/renderers/web_core/package.json b/renderers/web_core/package.json index 5e5e14da4..c911bf297 100644 --- a/renderers/web_core/package.json +++ b/renderers/web_core/package.json @@ -1,6 +1,6 @@ { "name": "@a2ui/web_core", - "version": "0.8.0", + "version": "0.8.2", "description": "A2UI Core Library", "main": "./dist/src/v0_8/index.js", "types": "./dist/src/v0_8/index.d.ts", diff --git a/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json b/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json index be2ee7867..5a662cf1d 100644 --- a/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json +++ b/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json @@ -586,6 +586,10 @@ "MultipleChoice": { "type": "object", "additionalProperties": false, + "required": [ + "selections", + "options" + ], "properties": { "selections": { "type": "object", @@ -634,9 +638,20 @@ "maxAllowedSelections": { "type": "integer", "description": "The maximum number of options that the user is allowed to select." - } - }, - "required": ["selections", "options"] + }, + "variant": { + "type": "string", + "description": "The display style of the component.", + "enum": [ + "checkbox", + "chips" + ] + }, + "filterable": { + "type": "boolean", + "description": "If true, displays a search input to filter the options." + }, + } }, "Slider": { "type": "object", diff --git a/renderers/web_core/src/v0_8/types/components.ts b/renderers/web_core/src/v0_8/types/components.ts index 0e1765f5f..d0703d672 100644 --- a/renderers/web_core/src/v0_8/types/components.ts +++ b/renderers/web_core/src/v0_8/types/components.ts @@ -196,6 +196,8 @@ export interface MultipleChoice { value: string; }[]; maxAllowedSelections?: number; + type?: "checkbox" | "chips"; + filterable?: boolean; } export interface Slider { diff --git a/samples/agent/adk/component_gallery/README.md b/samples/agent/adk/component_gallery/README.md new file mode 100644 index 000000000..71255079c --- /dev/null +++ b/samples/agent/adk/component_gallery/README.md @@ -0,0 +1,59 @@ +# A2UI Component Gallery Agent + +This sample agent demonstrates the capabilities of the A2UI framework using the Python Agent Development Kit (ADK). It serves as a "Kitchen Sink" example, rendering every available component in the A2UI standard catalog to showcase their visual appearance and interactive behavior. + +## Features + +- **Comprehensive Component Showcase**: Renders TextField, CheckBox, Slider, DateTimeInput, MultipleChoice (Checkbox, Chips, Filterable), Image, Button, Tabs, Icon, Divider, Card, Video, Modal, List, and AudioPlayer. +- **Server-Driven UI**: Demonstrates how to define and structure UI surfaces entirely from the backend using the ADK. +- **Interactive Logic**: Includes examples of handling user actions (e.g., button clicks, form submissions) content updates. + +## Getting Started + +To fully run the sample, you need to start **both** the Agent (frontend logic) and the Client (web renderer). + +### Prerequisites + +- Python 3.10+ & `uv` (for Agent) +- Node.js 18+ & `npm` (for Client) + +### 1. Run the Agent (Backend) + +The agent serves the UI definitions and handles user interactions. + +1. Navigate to the agent directory: + ```bash + cd samples/agent/adk/component_gallery + ``` + +2. Install dependencies and start the server: + ```bash + uv run . + ``` + The agent will run on `http://localhost:10005`. + +### 2. Run the Client (Frontend) + +The client connects to the agent and renders the UI. + +1. Open a **new terminal** and navigate to the client directory: + ```bash + cd samples/client/lit/component_gallery + ``` + +2. Install dependencies: + ```bash + npm install + ``` + +3. Start the development server: + ```bash + npm run dev + ``` + Open your browser to the URL shown (usually `http://localhost:5173`). + +## Attribution + +This project uses media assets from the following sources: + +* **Video**: "Big Buck Bunny" (c) Copyright 2008, Blender Foundation / www.bigbuckbunny.org. Licensed under the Creative Commons Attribution 3.0 License. diff --git a/samples/agent/adk/component_gallery/__main__.py b/samples/agent/adk/component_gallery/__main__.py index 2cbfee1e3..331c3deb2 100644 --- a/samples/agent/adk/component_gallery/__main__.py +++ b/samples/agent/adk/component_gallery/__main__.py @@ -1,4 +1,3 @@ - """Main entry point for the Component Gallery agent.""" import logging import os @@ -12,6 +11,7 @@ from a2a.types import AgentCapabilities, AgentCard, AgentSkill from a2ui.extension.a2ui_extension import get_a2ui_agent_extension from starlette.middleware.cors import CORSMiddleware +from starlette.staticfiles import StaticFiles from dotenv import load_dotenv from agent_executor import ComponentGalleryExecutor @@ -80,7 +80,12 @@ def main(host, port): allow_headers=["*"], ) - # Check if images dir exists before mounting? Skipping for now. + # Mount assets directory + assets_dir = os.path.join(os.path.dirname(__file__), "assets") + if os.path.exists(assets_dir): + app.mount("/assets", StaticFiles(directory=assets_dir), name="assets") + else: + logger.warning(f"Assets directory not found at {assets_dir}") print(f"Starting Component Gallery Agent on port {port}...") uvicorn.run(app, host=host, port=port) diff --git a/samples/agent/adk/component_gallery/agent.py b/samples/agent/adk/component_gallery/agent.py index 809c46e71..d772df76a 100644 --- a/samples/agent/adk/component_gallery/agent.py +++ b/samples/agent/adk/component_gallery/agent.py @@ -4,6 +4,7 @@ import json from collections.abc import AsyncIterable from typing import Any + import asyncio import datetime @@ -38,7 +39,6 @@ async def stream(self, query: str, session_id: str) -> AsyncIterable[dict[str, A if query.startswith("ACTION:"): action_name = query # Create a response update for the second surface - # Create a response update for the second surface # Simulate network/processing delay await asyncio.sleep(0.5) diff --git a/samples/agent/adk/component_gallery/assets/a2ui.png b/samples/agent/adk/component_gallery/assets/a2ui.png new file mode 100644 index 0000000000000000000000000000000000000000..57a645ec661e83f20752ac971742b1228af2f5b8 GIT binary patch literal 867303 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

HAx>nDAA5%nJ>tkX%GjB)cW= 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 z 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

AVunJp|W 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¬- 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

ir*e&jX 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

+j#+lilbx_9@7cSkaC4c| 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

)3-b&Gu+l z1Z^L*GMd}XDlm7mmz!#_#;P!%^p)HUxgiJ4OE06+gZnDa+KAe*1o03_GQEBd#zT}l zvp_i-Vfa}H$v(B}@f2saBXVrH+>qo*t7fl;kd=6_@$@j93?hs?>Q;`%1+VpBbRM)O zadn2IR!Ok~g0fL|6V}?WheqMilp)itQx^|cCc>H$Sr2FazPymYTDCFQl@#ZmQ331( z$We`e3qD#L5TMTHu$Kda1vc!7l)GxNPERYZ>u8hIbPxH_?q(|LA+*wlG;w*%m{e-M zvkI@r1rPR^#wP<3QG?_VChnJzzLt|Vo9eqXNqV%q2|CVD{bggwc~@hSJ_n!{$d`$h zz`U4`#BXukN>~2aL!St7hBlXG{28L&=l4*!&{mE_0Q7nWXuR~Kyd@Zmy&A7TOS^6#FQ?mc>9)EAz}32`NOKsto$b^z20qT-(8%jH z$!;*ob0^+@gV5nGH6@GoX=Nr^-D(;}eGA;6G^;_V*jAcMbgA4U?CAc7+wj~t|Sz6lOOlZ4ZB+AwkP@3SWc=PVBPiCAFazx zASXXHR7)H9WheV~h4iZm))8ZYdF1KnoSnzG<296Fn0@>G3R3}hV}GHe*dC5QQ_z*W zHzYHeUS1dBb>&ind>yl)u>bW>&`}i>*ljPOL&ZQ3WJrK*tq#EV6>u-&W_A|VAE5-` zrnaHDN2=PxV)Kp$?bq`nzcx<-CF6bXqMkJ$6Iq}p1{yf71EGMzeYpvBV(?rXih zvu3pPWI;r!!~R{u>viIrRXmC!3B)}VpqPMfE6D~(=wkpF`)+4A4%jG1b@4_tzzM*H zS~Tb?`AIZo%~H*C-oyfu>3Z%!u)b{!h%^jAgvN?pZ(q&N zKv3mir0c+6Cii8!3{*m#r2~FQ{wQTsml+Q{grbNvMSXdYFAL`uoM_u04V8~w7bPA7 zUj<+x@UUxb%sCilW|J%;Z5CNiAo-vvO~KCGgGarM8*BhswdVr&k4@PEP>4O{1lY9S z()26{PT)KkE?|w|CICt;$J`gBOlvx$c{Vi4f!PhKpZo)yLi5s(|1TFHQK^0i%yJ;U z=4_EDE;mac?jr(7@+8>rhX6+?NqF4_xy&uT57~izyYdFS-ATf;9QF`wI9x$dW#s{e zLPBvseLLj2Zoso@4&(OFw$#CM!seL+sfWII4KV7GQb0S1eUf7BQ+;v;4nebk2H^Zm z*j}#P6|fm-aG!%~l1Xr}Iq;EDu!;q26{p7;FY&RppKl+mCupLDSEQK=U=FQ;Z>GGP zMd7f|G>@$I39zs0BtOfVnfW+wA(t5P!)H7=a<#ld)IGgbPDj1)=k9XO$nx71+I}}I zZOyqlA3?HV9fGkh+vu(evRa)yd(?VkMj?WtD_NBIsQZ{5I{;doU&C z3~Fq(OtSU%>!FE$%FIvd06hisqB*4Ek|#mJ4l}q9#;Z>$hp%u%q5D2zhK4!Qv?4=; zysk^?w$Zt8BAyx@b30X_9&>uBjt_Wow*~dma|83rTeV#mmaCD+g++NLZj=w-^+)fc zaqnNCJ=;SjJ`N*Mj!rQgr;j~9A{x7Ujh@mIW&%{{QRL!-Idl5N0(J7uw+fMx9*4o9 zaE|dy5UA)90E?&j-OEh0wkV;v&;UH?ZNl~ldaW3>c3%kGAq^}Hx>#$gqh31O8rS`YK_>?%udl$4o;8(`QT6>$p-Rut_SIJHsJaOb_ucRt31ps)&ShK z#l46RJ5W9T;||E*(WreBDb*;oRX;NM^igG?o2>F-86TkipGm;WvxnLAG>SUnFtF-e zJG+KJl2j#wgANIR(LZ6`k$xCj(PFHgrXaae%;hK+WYvmM_9CSi1-*NOdV5Py$hmgx zTCx7m=q;|so2XxeJgtACN7jG#simOToXNUd5GO0%Aaw(PoBKGL-U^2fL2;2w@DMeh zVGpIv0{AK3y+z2Ay0y5vn~EqlfHxU;&O zg(W1Hr=f79uoS_rhAQ1AXC`5z?R1v3U?{DbeeYCfs^YTm3yC-FFE7fItm(T_OgZxu zf34+xq>0ySn*26mzo^|$^Afo3v*u~AKK02i72BxPB7?`w%>2-Gi_4-eutb14`s(pV zN0vv6tMlPCGECV(RT@1nS_E0P8=0LEA#&n&#Ph`b^x7}uli#`)`_Iq!;_0g{hFy$L zI|YqtN`n6Gui4p7luKjUyRrdVis|b4Z>xL1Hd^}b^n4UFnBqnK3`Yhbrb3FrJ5L!H z%$$_F^w!ihdlPuOUBrS_!xi`ZJ&ag&5TU<RKDrY$I*}`_9nV{`G0ApMYXR8}l=I!jE z%S$@}E_hWb;(MS5B!=u24gh5bgiCHliCcBoGA2|2(xR;a1+c~}*GQYtueaC4KXrAE zZj$}jgv5hL_h<0R6?Z7JJoqSJ`lv5s&*Su$VW|6Nm|MIW3}T3a0@0)vWVWIajt z6DkMwvFKvu&ZeKXfy; zNw^XGs3!LeYm(LhK2Z0VgDnNdRsEm7plza5rt z_rcA05@E6qHCmy5Zy(|+%z6tMLWX;P07o+fXqy51}Q7+-!y353ol+?l- z{uS;09TI*^CR(k}o6%MX1ZHL8iI(*K69!n==UY|>21X`k?xjCn7hu1A)jAxZ&>N*cpg48%n)+>dMrz&- z32irBgks^gF^7u`ch_gvTxp=mL-{B5<;`V7V{r^-(6X9$ySOM~#o@a`dP+iG#n73o z?2thYg+>J}o41X;FbQcRsz{x?1t&%JJF}V(-llhA>^1s4VFL_xqOm%ST&0>CPn>UE zJAbYB^X#34k&l5vhsy^pAT}$XLvF8I@Vy9|i<;tuV3z5SHC%@8(?dDB@+`Ij^hS!y z5(VfYQcdXm0omOQ$SYO`fP=1(2c}r|4BX!GPk-=h@HCRQjENGxpWfz<+c z9$XN1A%_9qnpmcgX0O$f}D_t`^9VRr{kckJ$g+W{J;pM`GKaKFbLWZlbf z`9=vaPlWd1lM2@zNF|UvTO|%kq;PA+5%iEgfS0sjKa&cJZ(DN%cFvG<;$K*Rf1yQ` zM@I(%2W7bl3t>`MLpP~NrU#V~{0I$@yV*Ntk-Q0x`ATtz`3zR=yS5Ks_j&1Q)wzOq zFouT2dN)*wVbTKum4*}oT8T#vvH}WSkIpwvJjhxj(|IP2q$t!EunZQMeFrP!wd!&I zn!|a)I1W66z^9g3EwUz&X_&dyrv0^N-guRKO8($s;S18g9lnRj98l?3i0X)BiOr^r z=v16b8W%xt+}Nel2MENNdS&60@G|A`nkiXT=r(~=T$j6{MqN1Szp)R=Q!Q^**^J&W zI;iB)+VFrmuif_wR#k{sP*s06Fox&#i5BhW6Eh_s7dCc1C3~oJwZz$9iA55rc(<@i zChD4gU6x<0VlAGuJU+kBUvgG^(r#44W9b=JgzzkdJ_;9DB`)rhd>D^bu(>X zI(j4nlz=6eIWmlA`w%zOoP{EdS?I@rQKqHp! z!;*?i*~^)ZEkSF+DFE~yiH6r$Cs1qwksigXSTYz=HwQ02fbKM6sF zqm{*vA|MMGE)m5T0^RRuW!G*{4~jK@XG#IoQN-J@58ZZ^wJ`)XF2fN~(?Z=kPe4jw z4N>TVn4pmqEn`xI?Ukb9F@JURtoJaQ)fyYFAW?zyeT2R~fJ9;L6mt%45w>fg=}p?A z(D<@89WH{cdhJ%hHI?el2~F4Jm;A=wztiq_=^9DlVTUS~4QgVZh2!0`Y*PimY-`x+ z+|{9ow@$^0#6p#>XjywJTiCGi-Hl3~8{8=_D`YT5e@XSaqf(j0bySi#N_^KYJOR~z z?ItSwF3m43$UZQ8V&T=dp3fx<_KP3S&qpFFqPIG~c=FcMtCrV6)cia=CF>Y4YVuFK zxIWJ-89Z+;O|L7{6pnPiVYJYsN?on`+9_smqLl7)G-|LgX?SX@OLmx`e(J5ZLUeDw z6QGvg=FVDJ=4H)VeFo{w$!iUVzj~kZ#E{1xm-5qQ-Rm6FOphO$|BSQ{if6)0#$6`A zFe}9S->S!lIBzZ4wu>i@#M^ZBTzlC0Fsy>wpe@|`-~9i3?H{ZD&+fXi4OgG+ton6y zrr~mN|MS)7|2}W~X@~!5uR*1@iTLo&!*4y`8h-mEdjI76r>mGQPv6F6 z$gw=)Aj;$DuN(TK4+hk$KGb$;@Po#iCpBZ9wi2RFj})Ya*lOba@+-nRH6w9(&s~)W z<0m^mM(3!ZsFsZP8dL7#HEfm_^?_{h<*7c0=yiMCqhTZD5!E`N$W&(ytxI_OBq2Lz z);-~jkHAq%ENJkt6QIg>wykqY4{s{|^vQ1#0OY!oqQ#!b$jCoq?A&2PUx}sc5aR@+ z;|xJIFo6-&oLY}g&r`3H$>sw@#EA0UDKv%L+O!`g8D29s8k#s$M_5NyY!FQ!rHwOU z1C8s>Xu#Sg+qASHbGHM1k`m86O-e8g`3D@9aU(odfuj>vUxzg%02uGCI!x(#QYj*N zn0HbJyaTy1T?q8P@;;=k_<*Y&vqr50NAmsDrC#w|2hvDBN2v-Nirc@!G}OX&WpqMJ zw()m%mjBTWNF^^fZ#nbMV`7H%@T_x!y%iD#dpK)TWwv~Zgd<3mhfUt;hZJcP(8uR6 zciIvwJ~YlPJVoOu;BefSiL_}L1mElB;9Bqu3YOX8f@H72ZIhT86jzu}+4-lq2+G5l z;j6BURfoftO_(iJmBC1?^}qffHuy6Ti9z<402t~(#O#o+P_0wPYrW}^C(xZd0kRSM zOW^<1g0&Zm>nhbc*za_rV1Fg#J@UqfAlHQ1rT~!vBMN#LEvd1C;n8D>{F>G3YODgn zPBqW`hcFhR3p@GNrUW_|`lPLi&MHeF(*0UuXyrrWk19n-GuG6M;u|mmAb~ed{UMEU z_uKon7RwU<&`%Q&-#OY;k-x|_%~>jXz7ZN`JX_JcAAVRLU@IB@~U#|;LRkiZ~rhmXcNP29o1Fp z7CxSPJ7qH(awi&&ZzM)qR!mx4ERWhtK9!72VPrd*$_V|c72!_&(6~Ii|ES}Wdp}Qp z8AvxDnIYnMuQyd-`He(f1HRgE5V^Lj5##q*IaM87`>qxxQg7BDAXYTY%q)I6YsoJ8 zda`8p>UlkqA zper9Kx>5WijG`!(X_t@(cc=2a{851-2k03(S*=Y0UV6c@$tK-)UL}S=h1MWV8V1Xt+2pG%j@U>8nfJ$Nmfpj_uQUbU1o`cpk z>g^!h=dg1FWDZz=mFYC3RY;k;YC9}2 zD4^@#4E-S0|EVvK-g`r3>W7qr9I0N#QLhK)<{?VYb4aewL`Om%g|lWOiFqIx*8i*U zEKvFZjHyY}V2-7YSmNoh`ioCTnVO+& z<^|V0bI<7M>%J2P`ND@OX!D~?q`*z~6HbC6zSQT*Dw;wTifdX$^FgQUJB=?K}%9o6iz5)Vr+iN;RX*lmRy zm$%vOyhYFJu>_uY)*kt#q{wrFTcP{b4W~63O?7_kGP$)}DJD#Qc-L!w(PLJXc%?EM z{2o7g+qWv%c|e;`!5Pls4A?NkIG~zrIK|xjPm$%wyHHz5%}l>6n+58YYhrhl8AG~K$s01qQO!?lamD13C*@ym9Uc9nk0 zU#z;sL~l10=_7L5r~Y>M1wjw~Zn_%7e3rl?*-CTP>}(7WJ;MI7xg)674~0MaFEs}V z_UKROtKy;DH;+AN+pTYwzWLt1u9P2k^w^ARc%qjTniyRe;6-c*yE%&Ae6yzC{PZXT z{bb)cab}n|bF_`Y6e6ptUh5U>28~7fSAUj%-=NgPT_vx4#)UWmY{p#K_ zsD;K~By8t_M-hO+m?~9}Pa{>9SH;q$U_2ci>?6CNX$cY(UjjMa!=>(Xtnz%~8XBfG zxJCsTEg(G-WZ+if&+y?IfpYG2htpvj`HxggsUtf}0a=u2sS@B<){_0j7Ce~6Ag*O> zN#Oyjmi&^rJ9x@|s7gq%KA3}=19~-OixU#Nsot^+Y-b`?0E?WpFJ!H%TS0b?=CJ)l zY`lFH&zuT$Z5sfG;4P&)A$211xsGl;=>HQquaQm zAooNu-<>HEo#EF|GwIH}OW#cw#e{pMP*dLS@rAi*1iJj;qK1aI|6NplQv$)^%7MaF z$fm4;*TI7_{RMhb@#1u(>Exs(?fl~3_CNga!$?Cu)02sDA8a1cI@CvPmEk!#X1xZc zx8uF6-PP{}n4roaOe!cC$2)1Tu`NU#6MH^tCjTCvTm0_)yzI_RzsAA? za{WI-mbXTz(-8DnTfx2K&l`4kO7(w$TNqK+_EMeGG=TR?2_CE(h@NWj7F_(UUFC$Y z1H+b%q^ucFI|3l{3G$%ZN%F!26XAaPRg~)2ALw@W?J*TT_&0mpZWAl~j;lt+@+4mS z^!L9sH5tu`TiS_sHu;IXx9?uBw;LM>dpJ6tU|V?1kH;$?`KL6dLW}lA?U|_cY`S2) zd1vuUXUUsh%iHtck|P(X+nFDH8^lm13TxkmOl?~;a2hSpM(9)3q_-EoBWbNkbc{02 zcqI&+IIKw&8TT=59mElJJc*-&_8oNh`e1GbOig)fmYXWo8pxxJwKZ!Uz#kDEjj583 z$!wy)f8ADkL8|t)hvw17ipyTf6b+G=ZtX3djoZ>P(AC%+Wy0FCv-W4MG5#0WGl3|5 zB^tk)2L8$+(g3x$8b(Yh-&h9_6U?iiuA7elufbNVy(7>|oTciGtxNfY4F_kT;;{FE z=Fpdp83D8>enKe+eZ9T;e{^d7EjqKW+nN+6-q~xsZ^_^|lAu9UZ%2z@DF|~QDEC1V z48Z33^&qF{e&(>`a6`$H>EP->$ps>HL>v&kDT`j^LtHT4bu%VNN|zo$;U0#WO8k;b zB9H;DYr>Tpbtik%bq)$gFdrg;r`Bh86^{YFRp+`QAT<|f!^`d`w@J6*LY#qlTAT@w zE|B5!_?c4h1r4_0fz5RpNTL7(N}&mP-}$)@#S5h#J89NnHX6I;b}E?v^Vr$J1V?bS zkyzpWU$Kb z_*C4%C3RNSXo7C%OgA(MRS8y`-Q3^#p6Mhe(DEwo(A(SF7%x-kt2_X_74pc@wp6DC zF849HO{na|z1t&MU+p$^p=O}Gef?28DsQ+((I6%aP7OwW^(py!y!TCKqUGxJYrb3S z%Tu;F%yS8coWmc(AZp96CnTnS9*5d@;ysX_yC_VdTa)&6p6AHxYhK9B#^((xkHUn6 zrk5W&Q15C_x%+t)=|AW-?*|f3%x5pYO1C8TSmcq9l7#Hb{TZ!cIxn%;+aeJe&#duj z7;`-OJiBF#p@~B7`AH}jpW~G z%_P|O?_%NvRmGP|!TE&YCKK{xx;=nTq`^1?#i0^wf)y6Wmd9fUZGcvh)C9*i`Gr3R z+BgR^30R}X3|K3RATm#gs)3ZotXX3K%LHU=G1oy{Qevv?k~%SoZrFz~+hv zfrsb1iVv(YMv>UL`vJZwcMnbniomL9b-}9_z?N#PW^YnI+z1#;pg;|`(}A*I?YqQb z0}l2+SmDLrh)>b(L1+OiDd-6%HUeb^C?Y5JlN48kfiB=81tBmlFtskJ5}?lNDPW%p zM7*c60DEQ(U($`Yr_{uP)M70(nrfHaQ#!+#t1%!j8hER2F#P4DQk@*d9U#bMJw6z|kKLV1VyO6F=4eWaYd_TMk%-z2N}K=wUoL>imwE4WJZ1JT zY&)to%&j`~I@q~-NHfLc`lQXBHbEwy0+uP5%XM=#>kygRK_?Woy$nybWovba$Q#>Rc z{T(&+$G%*&+lZ(e7kvXg`g)1Fn!wHS-<*isPOK>YdeZXZbBU$oZ;-`H+o%8gXiwJb zum*IJTYW6e)vMgQ0YUzd$gj_Dw@A~!UM`swPYC}%n%+FD$+K(w{r2wOTU5r15Fp4C zPzJ>i2m}z6r$$g@a%crBL&Fe2!;~O272)kCBtQVsFeHTG0V>oN%OHwGQfLzh1QHNY z0ijSNxe-OEi3(xLUcATg{paCPFn4-i*R`&-&hvLpEasZ<7;TEh|3of%PQF-*b~EA) zvu^>si#B=C<*4~SBcN6MIPU-^2sno|r?WmT*68b&v&|{F5Rza`j}-;_-18=$_;`JG zYkBtbky-VWZp1}L3gz&^fJ}alAD>%wUs5vU=051d+Y|M`@vbQTId$L3K(vXhp%jl#+_F`8?#V z4bx^(9*`opNzw?t)JvNmvjr8iW-n9x%|w%Q&?=N0KeuH;6c;&+^d);?<~k;9yp zS8-#B*m%5!t(hq?Wf=?ru2mqYnq7mx|XIO)fU?%_~hWIRpG{E9tadssU4~VIG zcla!X6bCw!ff0!Mb%1*u1DuC4pjpAf(jwmbpTZXIp>PG2M}ggrW+L=~;pX>HI!Z^N zL>~w?g-fyWEQje^FLnYEET^j#@bJ{hV!pGUV+$w(9K@C*a4r3s=Ws`=Z-hJsvhvD< zY3C9q-z?G%2LMLKbIu(mcxj6>9JddGqf((G0FE0OdqCidJgQAcbi6L}}Zt*LX zPzw;3Pfoxt7K)IqTZ>YD8*0=0Lb zF7a?>T44C2HVVyo>d`)0r+Zc7P&Px{Dlci15Rs4$wr;|5g^yU5`DE!2ihS9YWB#<L<4x$j8`==z2`6dZ*8`JKOMYrWA0kSMpO4XyXW2SL*;II``YeJeAC!f zA(El*a+@&0?bM~zi+p!~&Si-#o+APTvs>DpDLa$23(P+GgnlgL(krx6u-OG})2(`u zXsMvjq<<+j-3`4fP;akerPP1muf;?T&o=MPzZ<2j)tOa=gQgQq&zr)QjK1+KMdQu6 zYbzU@3tkJqugbUW{lvSjv6o%Q_Is$EJu)gfJZ~2a{07ST z$Vn-&S%{)OKA*{v7E7lX`;4=tva=If{V5aU-P=!&nGZ}sS6NwxTfxaE^?}oN1Qr}4 z6ckEVII&#G5g6PE#ysWsaM?PT0s+8d69?e`Hu#ZlENc&a}dJerT20Q_A2GnaK zXPc3$oc%PHe4vXIfDGS3_6ueNxh#EYt4C}WTSB);9sth|Eo@8;P7kDRQO!!6u;3)D zB+sGmq(`D`iQy*7`1V7=bi#;m8h#UKgzliN;Y5!l!lgwpv`E@qcB@N%E#B83wDq0E z*1OrU^2}E((aThXTnBJ_sa>#Ra7>#juj+1|HEm!x+jrt2wS7X8Es6J#r~c69_RC#v zd47tW9$3xdIrVRy$Ko#6YqNZZQUd$)SXKNZaK%ZL4qwI)h%vn3vA$2AeooqI%KCdF zYpv()-)_1RBFfRf+Q=*=UU>n%D|YPXlez*8zeSxFvDVf7&%GLIXt-O=L#t!Ijmd^5 zJSi&Y{f*EJx!LAIflJ${EGYpatgk->chgNjEoKkAK)*kB%J{g$dy{ zM~b}fcq#uYQc%YB?=9p@_SC#7?I}ow)fAJt5W-3OsR<m1Nzp~NPqa4dz^ji1pR+fjaeXLolT%GB0PSfs;d_ z@^x`jVW2QnMg*eG6K7aT@ZVO;fZhY2z!Rnv*NFUU=mSb$Rr30y%P93DzA2q}0wAus z1(65x6~M$RX5-{=AXg_C()KrSn#2Zl+XR9ku^CzZH#Gjl`ox(S*lM1W4Ul%Ay}KOL zjz#m5(d{jnTjPVpBhK>EhSpsE-l$*OGCH8h1s|A!9O9Em+FYJ*vk)dPS~Qoz;wJh~ zaT5-FWY86Wo#$`?ec%d1kPt8w3%EBXeQf$5SY{wfCY|M3fJw3?z@FjR>yzWyi(qS@ zTL*gsMtVgTqh@GwkuM2 zF8ooaK$}(3k0S3-!hc-jmyG{OA(QZL_sll-X;@vK`jyE6e z+*`4yT}TS#S9C?nqNDn2@l&MHG3JT2FG(Bhtk1LSZ$(}t5w1VZsPS zxnDHOY>}Xd&%r+X!2`G-B+ib_b_=mDQJ*-%ssLVruU4fUk7JNf-{xn zf*&>g4~Vj#%S`x#!zhnMK`RB!`@Jwg@dfy9b=rZS4AeVj`?P^8mXz!@Ogf8X01Sk)Ma^#FmBrX*s`EJA6l zSvTI2j@*11W89Ao3_8~4PGAym)J>9iE#yU|k!1n>m4U}|+!p_){{72|FE)UKo!v5? z{UXzRmaJ@!C9Ta^WQ{A<22zI8Iy+x$Pm!nv-YJtLkE7&a#d8w!M;gk=A=%BpX#SsD zsvFzetJ}MJ7FRuQe#&lhw{+0S$racEBm7D90jHWnguNvBVLjqRt}iSh&{I=T%6RA~ z>mwIm`J2)S*|-`b=fPij!`Y3Z z?l

NwWm*wX-Rwb7w7G4P-xF7m%#IU5c^C#y9yAkitC9uH?U!}AIXxRPSeXlvMK zjAXYDLs{=j2B-C?fK(y|UD&_$Sgq%m347pdu7hG)yHxfPq~j1-et|+F2TuAdQ`zpx zXUUu{MKgvpqhAO&Y6|tQx7KagrmS>O z=ILKV`@V>p7TF=4Mo-WqOA_8iQ`*^iR@Ii;j%Wqh)_xC7+dQrM`%39cCoX31P_nqP z^Ix>ja#99;1~wWPNm4=hkfL30C_4 zcy_T#tZp#zq6BxuC0qsNHc>=u|M1|DBm1(112)?norokS zlZWh>Dd-~Asl@yQBieosx6u8FzHX75FIhMk_+a>HYb8B|K3;Kvj5iUo_i#&td6hfW<%%_)7Gl%ix0kt}8jmHB&Ebw)$qg|>1$bW{PS9?Z{RoI!+XW8;U<7078l^=m9S6|Vg#$?9 zuNZMf84n@=$H@b-?KUgg83s;q3|{_o}Q+_NW?m>icvvMT27& zP$LR+?qG=3GC#0zF{TSKD+DN_0SQDJ0K^|I32Io2s|<)5;`jt1$Bt{8+=UJ^0(o#4f467^DakQ+`|E)(1+k8F zD~!2Q&Jd*j9c>GnoVQzYWOE&#SI&?ID4&ItG}#x7z2tI>aCLzmNCT~CKDjJP^~TTZ zgD7HaE5(UujA`EoJ+r>3wz$lB4gvp zrbM$ntN!O!((4O!PJ+|$ShQ{x&RV%)vH5dYgSkE0 z8hxn%0+vum3f;5k2TZC1S3amRk=V?>;BMu(xx-BQi4?m=Uo5Xx{|LdSFtYvOgpV)T z+SRNA4p}4e`Nj{eP7qE9idhrgVDCvWy+ZU$inE6$S$ERCu}SgA&oC6LMEi_!D9dT$ zpAqUg>9z)VW+HKF9Yd6;?6jZk~M_Q-p)HK?> zh)T(IyxfcpN7LZ9pcg_1Q>6FQYs#-QpKG>gnzdb;L3QeL%G=a2PA;PkMi*k7{BZ#l zAFN_{@-PlL^!R0AsCPU6Y;(m?IspZo5sP(C|1KpwL=)(Rot#W*5l;V(GAWr0Bt zZkQP4o~IdtK@OWD0Xq_VCpnvu0b+voRs-^vmo1v_W0~&Uai>AYuXW{rEaFSJNCIfA zGA>Yzz`6{W>Brv9$mIjbML3g7Wq%c8`jD#wp7O&Q07ypAm3qT?_9ls4-kLX1ghJ@jOVaOS6XpGPv_{AL@c18z`+AmfJ^$2 zz%H_047O{2#Ze`05Ymb0TF`Q1TqFldiEaYwVB{|0GpPLapr}Xr#5W@tR|q7SM9UBR z6jt^63n>ScILKmyZ}P-NZGOcQmr7_a9^@YNX~Q4WDo>6ae5utogtm4+=DC#<@p-gI zRrAw|U&OrBt~$`8=D}_Az`;{)H1?QmP&Pa^`e=+u-G7>BguMGSsNFapEh{SS(igqa zzZYeF@ImOXds|!J(ZK>ADXH4Ca{1VUxQ^t9?n4Gw2)%TteI1inKOK&1`#ZN;7>r$l|pk z(qm%D?a`#Wi+I>33?We}@s8;p;)#7;AMe$yKCanJ|6TKDNS9fJZeS;)v#U@ZCV}qQ z7o?arEvB4Aj*OEpquhVv54}u2Ca&mmE690(@rc5^pKAmx0k;%{Ak_4{LY&l=tiT`gg6n^(&sy|J!pfaoN&e zD2?5-lSTSu63!OF;CF7ESU|4IwDaggb@YS-d!p_+s?J8;30C4-Ao@4!ptMWdMCcC% z<+BhtF>oV7ees*hF2!R6I^rN30OTVHnkR$Bt_o}Xijy2%`#@K}!T~u%^4DoUTrw3x z3MQK;Js7OA4~{b6btx&(8fRXh!# zJk37vP|6EqR6OKzmNsD$z)z`1Z^V%p(e+w*c`t}ErJj{2B4p&1F@4F2PDB>8&yS^vEW(bR`bAycI<2w@^0~wRnD_`NBh**-`vseV~vG9yi+Xt zrqSw^e_Hafc*3y-TiSPNyBFnu(8(OpU`pj-(wk`Ala1#1#+}Mjo_Jxxme~|YP_~ka z!b+Olv197mmF;D(&yCP!9vxdn-}p1o8#cawpT258*k-4&#ZCm6gg{`WVNCB5h7tq;7-%d^?OU0rv;#J~5)|H?C%WVG%zwEye* zN#`HrzV$fy+0sZok$skk+U9LVIb(&MB=fn?io(jDxpN5qPGhQQC1XOFau7k;gZ`tlzBvi9D-(U9NI6xrDDbNBCDyG0OO#R>QLG0wrq8)Uh~0qb4)Yunz5PG)Bkzt<>~&EWam@V)o2JC zO7=u!f=Hf6G44MKZ8o}l)<4dEezMwhV(a%=b`-Yo=u@z0N{LZ3>~zL-g50_#hi=vW zJcMIRimdlMST1qo8PoQ`Wp`RTMvFg8V{`KP)l-y!7kw6~T?I=jGaF2Iwd z*Y5E6ejNrR76ZrUNj8+=p6T{KfcVKt-TwlYC6f#B35MhyU57;K0VI#Ga5L38{Anz3 zmW6^?=pGeB2axMH;42^lTpa?*)ZbWhXCt7Y3&N;fDqQ9Bpv~#5r+grNefUA>@3aqj zY)w%+#fE}l=>~#HC$d0$A0)wyuW%%DgP|3oQ*>DaC6mWZb99RM%} zGiWnYr3j=O96gx_-G+pCA3(gj<1VyAe9^0r8Dk>|q0NI1J3x;}^eDi)Dr3kO;GB*d zU`5i{KraFwpf(7*^hY_-*zD+E+XNH#ce$&In_Re_!+o4T<>O01Ila)9h;~|a#S`8p z!h;g&!6OKA*~#^uBYITo>`g`g2jgwCk*rPQs+P=vk@AIwkw-)9w!Ox@>ev7*;||@?bszHl z!Wc3jCRj#ANzl$Mg_x6WX4Hg}g@p$BVUHGnh%&zG`o@&csS$liBo5Y$^KX2%)K0WsA-hwo{l|}z@Fu0OMPaF3pV;AIOLES4G zv+D19wytD}(t9?ppx+I&HNKTBzD1`!kU&QuMY3D;r|v^`a8XOv=h)5K8g8tq^o4MGy z1tQC*3%6^+#w&^D4kz6c2U%K$M=GbyPmlWar%jU0`$Ia0{+cdHNDD|QaTq7 z=E1SqUHcxdq4d1V+LW)Xx%R9c4@%6x)?q*>q#t!4FMsXB8CPzAGY0XFmuBx)LBz3p zr$2;bnHZ7kCk8x-q(ri!4}=p`S3THmw4tNw1*ItqA<_+w;*+v5m!rb{VDw^!VEf_T z*_F)ad7YUtRf3!sV6df3HKst}9a+wd3(r=7R11_@e?5}g7Q}`7FM}iza!=3Cs z#1QOEa}y8jM2Zo^<&SZolr$#7h$gU&9kx zmx&VRoQ-Rd9n7XTPGo!oanb=0_Xoj1=YRn?0hb7@HkUu72Qq5-C}2DgLA)kOYc~;f zw-$JMVDf{qfHV+B=0qk{_J(x6k9>mkNM8$dva04(PjwJ%9H09hb zOj0(z9s@%tR_)x69K9H85RVG=hr(n=peWu8y9`1q7|iiJNOL8|5S?Aw(|}cEdr}_w zBFn9#(RaBRt}p8Dk5`+~*@E|Jo)ZH%v=YXkqz4fg|YLBMuSD#vDJUPPET%R7HIG5V8IK z#Kv~g1-HXfhg_Lqk{7n)E~nFy>1}W{)uvou97G0RfEt|dA}J0*=9KcDXzDtGeiYfh29RG^Hq58&JL!H6k4)( z;-Cpv-dl#_-#F~T4mKZ0+DA^PMuXQb_N>9YsAt37ODPL(zU@#xcd~lVWxKnPciQGp z*^KM&ViN)jd=YGD7saqEL^Az&GN+RfcBxu7Fmt7=X3a+PK50ER>%(})=GIDlx$4tk ziq`zQ%f|gOThof^R66zB>gK4f%09QCN}0{gam}ZXvmf??M1u(m|Gxk#`HDH%7ka*s|Zc25gi# zi6Ze=6oitY5Hg%wfKL&)z*ME!D`dxEci5kk zD4P8Zz&fkMSfEUmmz*JG0>!9PT&>W{rjNitR~yRn$jf7%r-0#$DQJae_Fk2x9?YPe zh;Z^J!dG@M6y%XRWlwR}Eljzel_BwfwbTrMG@WP(0**<+{-f9Ip>y6jU4?v~D~8{) z15~pn4(K^0N##hsY!BX;L>i{tUj4zDy<->C!qVo{ z7sjd+%AdKIxirsRi2v5qjFm=rqYRsjAKHyCq_U?2jO%2{I9h&~kP$%YY!J~8n8jd| z9?26;U8Zn^GS5dWWn@UnF#FBZ6CXdWY+jsIXK9jZG8V=IJk5`$7dFLF_YokmPPcI3 z>$_!5u||cpA(cxNG;mk3!m7h>%5HCcs`(7&yNlh*#}=!p;l5B>rn`KIObM{nwkqFE z6F zQgOaw7jt`VufUBu9?AA&&Pmz=y8KTbIN9fI0GK8>x16_~9*X;+)yI!37Pgmy)GE!( zC!2R_G>rG{L#o&j3i1rK@Qbc0`P|)eW4le#3=TI=hD;9h2|_|bY1}TM)BICuz$9|! z$Mx6j70q)0_O@p8$abGbZFXXNc{StH%iGRr_wak!|U)q|7da>ye0p4{K`Yx_`@HqX3VLDPStyk38N90@6~|!5ow0V1RsOW|D*3!8xCbY@hCJ044NS5DRp`h#n>NpeGEl z3QuPK2dD8ey*sIdZYXow9-_U}0&im=Q+w~AoxRtesj`Eedboae}Jxe}s;ZGYiI;OgFO_Yx*@q(KEL; z45O}QP2J;J#2qoyCA+;IU=0z8QI}_q9ROL?Le40J^=1S@#egFnAe>qT+aBx%aCA?3 z!iUN)j1&pJgMaV0TKYf_^SsnJXH;Jm!w?uSqIt%k9)V)lErjdXTNV}G3!lxEAze7d z^Jc-x?7h zQBoo{zm_83Wm2es_5XNU7Co?G3bixCs4xe24HET82P|JxNQNX@IsZyq9AS^@*+HoQ zpH8=`x!5_KK)IOO#tLtfNyCh*DAL@p=y0$ZIkDbXR4=@|y~)|0i1;M2*xI`;4uTE3 zNq1bKZuhHpB=LR;05+Oai+Ft9qh*m@luD=igKwVx8h?=++Es}^ZsE0FsCnj^`DJ9|?fY5fyZV-&sGboc z1&n|psa>pXwS!AROxUobu_klYW_F_^Yr{h`@g!?uWn)S0K}f6qHdWt7NbP-o5y7Ur zqg~@CQ`p1OkAp|NzI^tY16rUrTr{tn^?jj$gm57BO@$TV%DdM47(AbcPT(*ugz|*m zactbmFOHs)P~F$Xtw;L3Nrw}jqJ#zw-f;!fl)HrVs)^~x6P489$_d-MwC8UY^RAg5 zmsxD{lh#Hw8(zz|H}jI#KCxq~9m!(Yie`ZkZ^${HJ~5Hp z$M+9xmo=YJkk;Y@fj&+Vmc@j{>NA&^H+j&qXl_>+WWp92+OpBwW zPQ*z8WLlpL!BX_LJ0sjD`QRnOIpayHNF=`VVP|Oe5mI7)SV;o49b}#fPQ88n6W1k8 zNn7ZwC5N>oURG#?CI#I{>?DhEjQPm>=ZB{Ya^_ln2W5v`S+d=2qYZ+%N25z;8`wbE zbfyp-t}2t80r)cga^hfUsL0tB&*l}T40poaa{Uv2oSt@bV|;75XYJb0;o2&8wBE%F*B~p=%~Gvi2_PADb7! zzpoDlD}3vP?67hxO!mq0ePymyXICYwnKD(Z#rs8x=OX&OTaJAR zT2VFKt2^rc^&9!?Z__?LZfx0Dtl9GGR?EC3)P#IKija1n;@(&Na?T`x8oc!MTY}Q3 zC>~Cn+_D1tD97&WdQNH~vRF}iE9^xr>)P<2NbY&xj(E0Ikxlxxf+zX&&}jyS8y(=L z{MOW?-@PTeV<<=?y}drBnG90z)hH~!l&S_BdsgpXTWSqsoF)362{1SHxEh#fdFktM zlt*ISMBm$ry?w$}mYzlm>lj=j3zFv8G`mnd z@wN78<%6PIlHI}i$jKj&T=?JSi+2N$f|P)MiqJD+wdi)ASdV?35!9n zA8l>wL@VP}fG`Vd2o?=oKU=(`i1J-1<*?wf01DOB&;hXi zoIe0HBnyVbC?zy^AsHnb!lYs6!9sKsjTRbqc&m3r^L#)`gy=s^s4fG#OB>4JjM3tB zAr+6*iokhffl_{tGE>Z+=B$F*Xd&Ct0hqn0lRyQwiEt(@e~tJR3~KM#>C+h*fvCL~ zr5jFT1I6A4;PDIJoD4TpzV?*sIYW^GyA#I(n(RU}w3dVd1Ei2Ynfptd0I#WS;>_3i4%u?_xyi_b2+{(t;=DED9IPC5Q&8sJ}$XH&hlCnLU>w(pyw zgCC{61OHduL7hE!&i(hf@6S$gCvSLZZm(`lU;8cgx5wkl+CPR>cPD3V2Or-WjQF_O z-gDJ!l_gL&SJ`+3zNU-0CADP76fSa$>Kjb>Jo7X(V!>9La4Ml!*t|r{vD(z8y)+{D@X*#^N*Pt+L{`5yfU;CIrA@V&FHAF z$y#i1LU1q^10uL2TLR{y#dL2y=LrKCO9kGUdtk6D*iXn;KX8$-z}^}T|0rw@iNcd^ z;R;gs4zoJass?Tfj7Sx|57xFT(VikCZ2Z}xA#>#~1-51;)O3C2&#gF-0PhQ(v^)%; zF?6`TiQxHD?wF5JjLm3bIFL=n`bIur+&G1TI0<0s=RqDDTm?o~ebkb|sGXJ)!{M9E zgCsK|kl}W|!8^4$Vj?6XLru-_ry3Wn3WWkTj-4#*#6>eI+6|3}R<4e&qGb9gc%w_F zDb_GShMTdr+OF4!ekSB%iW8f6p*<4MZ^i^Zr4stYiihv-(hZ(IU`=~A4XMUQUbWx+ zn4|i=X7!V*r>;h=s?J>AB~VunvsK960-7|WBdU$<;-517i0=^+P2K0=-r(sx6@xTC z3n}73KG~J0oC*K@-6VwbAQT#^SXL9O`ug#v*yCA>btSXeK{KGbz5U1SEKRzn=AQ`V z=Aj!R?rnEJ}^5HNu=`g3c2qGiB1e`dKkayTkZN}L?WdCUE{{) z_R991o{e!$ZI-fUtEa#D1KN_n3PvrI6slOW7aWeF%vJ$kII9@uSQ9;&(n17MUg32xD3 zp}#T!_++vi$zRII0kFOa;Kz&O2!}yZ$ztq?6|K1#3p2PAcNh|e`h9@u2qdz`30T9g zASKOHD*7`9Sfe(2Dp;&^c+cT({$wviJ53C@f`zyawua1yo=~V7s}4igxeGJvEWeVY zhywoL4Jg4`FwEID1fVV!-1FB4u7FKS_E)aoFxhME^X%b+E7>N{$lkf^*C{x+1C%=u zwy%*{2*$=h4AW2$AsU)Z;B@>U7fe+uIzaySK|I-s9abn4&X!{1p{5zCX4e z3JLNFTplzHQ0y-7MmQrjgQAQdVDe?A{8@HGK`iVO4m6Plb}6rhQa$aR2!rrMqKs&3 zdZ{r09^t1)1+IGPMSD}=`h&9yR%w@^Ss_0UVibYKPqI$mXFY3(U@Ue=0YXcD(SX3n zusn!&?Q`*nm*kf57bi-~AiyQezDxM&)Ofo~8o#=p(uw8!H!t`po^}&PJelqh8RfsH zbgv1ktCu`4N1gWQuwkSe6j7Lc-hLtS-(pCeSbrMZxK>*d_OMXj$l8EpYz9yF#nET*^@UB4f7ccODbe_vrth{(TrTHd*vXH`0%d@h?M0jUQiMF;S_DFpmrS=Uo( zN}U_CmFoJyok*F<$G`c3+@=y=?(XjXvXJ?4BXj;q=46kiX6wIKGFSIT-26-#2-w~A zHrrsKQ}QL6F)4ULqtH3g=4OL0W0sNE=ogA+a%3X)_(I=A-=U+dA&Na=W=W!cBT-By zX>Mx=G$_0g!)Rv_VKKhpzWlf zavp}{kuNC-fQ&t}Fu46KXdBQcU`uA;9LQ&Yiwm!vo-=z|Y9oZY54aE*?a5l7M9?e0 z+!=RBJ=oeLTT|kRJG^-JnS5_vv=#S`@libeNK08T2|#S&IXJy2K(>Z*)E5&@#Vkk8 z>=D68SJh@v7K}e=5l=aA(rLwBPjwVVuE76`jDxX!wpeggnCRQG2g z2E`DLS0Aiv`-&vfv&#_sBG^ZO z=9s>Z7ar8|6HyU_?S2d?(5%=}mb8YF9) z?)7mya2OiQ%(5H|WVpltmP6G0m>vxZz zcZ6?83_GlP@V+j2anNUEB$Z$7z^53pqs`Mlbn+(S*p(?JF{H`3)PRW))L=0^_6(;B zU>ExuVti(XiY204E0Zvw*%Zc*PJ2{;`9+ypohsJVjqQ-2+XKYz1>7<|zd%|S^ zSZDJhD^gk=ee@g8faC5#{onB1yH!XmD8bZvn@g*juVpOk=Yn}DOZhD4!92#p)&}Vu zoW3V(hQP-o;&X{b*ST|Wq=mk)Uvh#C$xZgxGbh^F7%{biZx%N2SA2F#McH*}`%(1Z zH_K!Z$DNvH8_WE-nE`kk#jfpn%{zyU$5{)zy0_=r7Zzg8kp@3qU{qG{+Drh}y%&GF z%YXUZ4+K|7`}e=H0)mG-r%Oy(%DUWzNU&_*5c4X{V}oWgR@RI)n|fQnYra^lH)buY zLS0*`A~!F*P;^o*-j~k}v=&mu)4hY}1-V+?zrA3g>Ch|&ZKscy&d0GY$I}EZSo;Dn zcS{%Gk_aZ$9iBwovbDvas}3w2Qq^x zUHg2(<>YX5=(13o{#X!42Q!+qAL0?TM2Dn+93u{Vv;05STqsT9-E9IYAPOqaY;}S9 z+zH4K#X$xsaoOpLb3x7kkP{o>w5bO~iy>l-)Iy|~5;%--WWp5%h!b$h1NrjR6IKj} z^XtOZu%#K1w&^e>jkotYpBR}47w+=}hm*(|dI;sq-k$9%imGghsFIohmSM>BRwhHl ze4^MAZl~-V$f4h{r;9)c4M(wSlr0~Q7>F(O`YnT!Z=OxhZS{V1`2>yuNeKFz5Q#uS)Pn1YO*Qk7@PlQ$yMx~#Rx6rcEQ(YxN zOkpsD^+wt1soHQbZPElwWrl1fz0oOZX7ENK-NE1VBx)}h3Q$gsp+nM&YjhMnMO@0H zKdwaX-h!|uLmm&lM~gC+ai7ly^l2Bn~3h`+efir`=OL#l9I(P|t>i8V`MU zCRlqU-rbt};GbS>xeYs^0Bk_Wb28tgOO6Pix!De}3cM5Hl>qG*h%xVW(XZ7DY|)4{ z;HS%PQGj_qEUuo|7klYgP=`cTO_^^MlX-K>VN`5=?zFRv)vjGwr>rx);)L}K`{JKC zcs(o)+x2$6;#XEJD?mm_lgiGekw+V_s$arhK?t(Az#MPfaf_aUXo(IIc{%38j%@ld z<`J%!Dt7ySM{JjB23ET__G%6PFNga7qXoFbOO{)fjQL~B6VhalEAjc{I+oan((bey zZ)Cj7g*It@IqGtvxUZGZ<=f{MLSic4HznKP3i%SJ{Xw=1tvy9iaJ1KDDjRxkj+OWd zcWi`uX0_*i%hrOXY<5jA>+gka>Bw941-G$Mn%hUu*HV8@f}A`oCP&d|f{8vdJxP2a zN^T83y7a}9ZzE~fO`bOFLsEB3CPP!Ii(G^H%Wo<)YdlSP)+et`Fvj1qpsxo$?Hqg> zeF+`9n0%`LCxW|2T5_$e?!x+OuQg@*W}(Ga%l2B61z40!^#3l@^1qoV2rs zl3cC~_$Qjep9o6Wcs&734V~USs^4G=pM=6Pkl)28cMLAYOtnP#F&R3jOfGJag)!ZE z)q)fxdEYOjnLSo|^tJ%y)m(3yaR=A~Aa3P<5^YJDkRt(2S+K~R0zw$90J@7_RKT(@ z2R!w2kwmu>PWfsAG;IU85)a}5p_b~>0rGPnfJs1u$b0nkBp z*uKIT{6OB2@Q#Jod@o$lM$BLiX*dOG(EQ1qNr%n#q|(v8jDLxexjTh1L;r4+@-Pvh zK~LI5NoN5oxE57W^GbWS88od00QXKOb_2^^SS-zUbe4Yy1XHN94R@aS94ARDY5*{) zJYQik=w151CLb^=+OWED}4Y=P5+v#-FCj4)Mg<32H;mH>`pta7_;Kf!NAcC zbvBHcGwXz$Cra2dJf%!R_JE8NqM{NU%hZAJ03*X48<@>@iaR zvwiN!g!mgKzMo@Ui)Zm+w9Io1txP#82@BS4s{`V1%);~1Ch6NZdjNP!d`BHl365%? znBblzlYhk#LMwMqrM4Aut94oCgh6pLJ!RmE2Pa`5Wohy6JeJo+Y?jPnt8exbB3qs4 z+mHO6FQ=5`95EYrO1J7rO~Dyki=gvjTm8_-p5Wa4h*H@W0`PGk#t_a`#{Ge`Nl-1vjCk2|~ZE@EvZbFF9XFN>|8=Y9Q< zA8pX4^WSs!^SUJcK2eD$ovztO*CR0RcoNAI&~~&m5WfXwnE?X5B}e&=)lCfCYKZ<4 z*WuvR*srS`KDZLy@d9l!c)Eh;3z4rduYm3b;PUqQz$61MKzl{{x>!AYbSDm0%+JtX z0Nsq-o5|m;ZXm%+Du680C@p~I(qj!HA!L*hnFt*dJqaAII_hz_?Px)$*Ko1=gk zNfcrQLR}p=)((bp`d=$$lkRMxyD#?Vb%hN zpQr!B0ANtGo|ir`QNlG5q9~e3T01CiKukfe#RYUiu$K^b8cko3cCMzlm7@T$rw{lG z3u>ox;PXM~GsJR(1o?=b)k-%13goOLd&*V$M@2D66j2M3%wRwa-8V>_rn|xChB*l- zF*2^(4hW1s6OcLvc}SO>TBsnk2-;zc!*~j%JST;84M><#{`W)r5p?KPDRIId+E;|g zAxkzKoKxRYK;>fk6rTDIpKzT~&VUSfkT^?l#hnb{d%WdV*P#^F1#g7kyp2?4DCEeS z{C#1ap?x$+E~-AdbiuCV!#OH`*s_4o-1atEP?~c$>Lk@ww^@K15;X{+m9xJdmNt(e zC8CbiXNP6ap$|Kp-O!x5RWm-T`TttpKiN>Js#3(aEdD~>&173LYtfjX>1Tbl$X{vN|}hMmxbmh zkWJaWzotgw^_bS#dFMLrQ!bv~%XDoX{bn)$Oo6!r-(1f<&@DxAte-!#`OacXmAMtP zdAf+GHGW76Wg0egEDtNp8MS;}(pbwsbeTp_zL*xfpwsAYpScYc$WpYq%;sFYbN?uI zN~``yR^h3XFjEDAo*P!=S`ih>bv(Qf&6|#Nqqbg~>6X-}X+3XRw#&0-TDC?b{+YMf zI(49kt9!b`JqZGc75`~tUnCTz>XH+O+$)`6KTgdpB%ErGu~xOpnuo-u^%E{MIW@uF zlvk^ix%RJYzwO_C6`?trwUV`Q`k1;QqZ2~r+@czir;!42@os)t``gfNaK7Ep2xr%V zvxYRP`K-4Ivu;WKyJ$X6V@`JHX4xGkeK+ZVvJ}I}Al2(zJHWj1ga;2|BC^#d>N!c= zboJ7Y>E2NTUCC<7z)|Tqa%k2uds@7o?rL#VLD1us12~}8plk{yv{X8YfM3lim;V(# zP>$HGh>LL!bl2>mgLkH~Wv5AZ^TJMX9JF%;+C(kL#(MkXfTz?iDu6?G=agf5Ay7p} zeSmZV5+Bl|t!Hg43KgIZ5@y&Dl)qOr@?GQ`F#(BYiuf5t%n37PBFPY`#}KL#W?P7=&tQSDY zXE~tW9OwXSk#FSCO_Up^%Ht5Up`LU`>N5_lAn~@0Y2=X94?Z3Pxdu;yiP&w%%9uKc zgq`3``A9_mU_ zid%H(T;FiG&6!Y#hCmo1%o0&GlYF-oUc?<&4|v;0}1jpaVaUF zC~3;pB7l4V*yK5w6(|oN%x2K%068&A#MNIfuHr*7h{BY4^FPz#KA{V>>k%mp)^L|| zD2*RYcpZurITp(In9W5a1M=F5oO{?oAFFmi|4-Aqhb5h_Yvb2Gy;*5$nrCy7W>$(Q3R-UcO{8X?#%ir>5*AZILOsvgTm*`Y*e#_|*~S<|M`br!q-zVw=1yB@NQU6RqZ545e%TD?3U@ zx{W=$Qm#o>BvD@mb327Uo7JEa3A`q5fCG=LzkAAIX!v&oXSGkD`Gw(>s;d+3t0t(CC{&lL22dffL|P;bc0lNGy))Uak=^oe7rABX?^l(1dg z^098|%RlJG6B3UTC#<#4V(R>+vuD)Cw>pG5iSf8&360^kO7}cS6UjZ zRQf7>t2$+G<-3C3=Wl~9d1!m2=+}ws=q%|}$&Y5ItnFNf&fKREPfZ2C%6MMz>G!MK z3a2ec!Qhfa{mtJ!*oL*v*VYrSt~dTYe*&!&n#Xj@HsH?HL|R|@us}z(gK*{ zFvO)MWX4%<|E`cwVecDe`?)uMeUH5s%tEPAf_;lIfhSjL8#BZ^(hL-RQK?iG52I-# z$~bbzlrQe=aD;XsH^3KtwB^9rWNCE(*cP{~wTTINEa#z~YcaK|s>R;-C579Ztai97Hgg}DJ%ChP|r_$IRzH{o@H1__;7K%!T^RR z{YA>lIjz^sZS1pbJ%a#MVpI;$)(S$c9hNBKBFf@$?90DA)q$Ny?m%@wN3l1~H zB|&gdC>*v82w(;?J{u^qG6g(YW6AIny8%*_g~O9JktogpV=&pHZ^a+O(RCY*otoR2 zq>kQNNp?U+(;s)n-}5i`R`iU@vN2w#A+8?dsUJi|dr{RX99aP_p#l};0x=Mau}sEp zdrh)2=*>e(P$6%j2!VU({IHjDf_JpnPz_X9$N{V6pm4%bCK#A5j7n2X=3)aIIRzP( zzzHH&xM1ZWJ6&ch9D|GH8TH6fPXL0jp1X7sXbJWJL!m}3rp9~wOa@fm0$DsLXKxE( zW}b7K8ilw2bf@yCLY$x{fyk3#sS1i^)%hajofp<}GM&iB28zKmUt(aPaqs^H&($ zG~V)|`yDio#9Q!zL%bk+Kg$>AK~F!E$-rAdJruQh4N5Zn;`59YM*K<|YDo1&bc%cd z0o9zxY^z(8`-yKR87s8dCMu%>X>deP!Pbe+YceZ)c59A6Zl?$+HYHDpkY#VXsT+9< zzNg|($mZW;&Pt1m{e*L77E@(yv88jQ_G`6^`*99KP(vXx^Oe(Q=j~79I?mP;&+RY^ z#je+rzGpKDJW}mcguQ+3EVZ*5f$)oBkrod#jNu2(fdD3leNzEm~G={bKkHf+!O7ggoLgX6~62 zZynh5bAs&I)+X^X6xde|88(i^j#$z`#IhF%v>E|UF*O`P9#K;7%0B&?$CGwRS@L3C z-llFzpR#@3@Ofx!9QN$4;9ff@u8_WA%^PRfg(9aw5?eBtR6aC>AOFz3JvRQneH;=G zUtWLk;6WPI;>1GifI#iXZFM!}K>!~K5ksh4C%Eoqwvz+Th{I{TMQ!~e1eJ8!ACiS* zFEq0P-n9Y1epgv=9kX;qmI0SC2a3&DhO_&Ump|noYx5syBoE^W#vstnnGmQp5Rpp& z>#bV&Dkx|=@B~q@KqKel*=z362>RGtNr8Lp6Cw9@>-Ri~)XP$jXFwtodXWL@n> zf6ZmEALv941?wh+1^ca7QftGU02`hH)4#pPK<%zEjM# zyAB|ocG^tw2po#DAoI1U2rwbcxeC-=+hl^W$;P!c2c_#twB%nGmR4%M02gRyM=(x- zPr!4x1=_QW_^ioMnlB3vViJaAm zV1N1LtZiY|c36=n$k1Q-*1D+5^nG5FQlv-D96S4D+5PHD6F#^$_C)N7&}93LDu}wp z4NCrrUwm_ocs{I)i0)4p&nrJXw3Eig^(UhjHTS2G=b8!MppSW*>(Pa4hV87P#jLIC zhW{?y(B{3Qatd-aJ}o|LZB0KbMtYq%C_qW1w%gzcT(y-z4&kqRbl1Ra zpurP%Fh$k*x`CdW%W(LLc}ZhF2}h^efM_59(&0`WtK~2hy(?T}&R`UEv?}WV&<<1s} zjHKbzx+K>YV|@cg{UV@Pzz!bskbSh(5+%kuP?|WH-Y9&BFQjvlC7`C510vm@-%_2j&= ztAG_335-b0-4fvcyG?F0l<>Y%-IvU#8h`Tg^sVa@$lEGNQ^5enRL-F}ml;ZQS$bE8 z3CF~qFUupbx=57g0n|5r#gfolz23J?2hADIdGcxqxM$oq(+}Dnv#$u@E}FIF@TS_P z4(#j5?xna+n?*%b+IlthtW~>IjOO%|`p<^#Ya_E+_~X0SzRaggkMeXMEEGPUt~EO} zX(T{4(93w9+$(Rmue8CDZgJIzO?jxxv%497$=>Y|dq}r!D$eJ%TGmzGx<<@PyhLwE z*uE8{xo&tnu6_+&qF`UgvV*__D(KG(Mjp15cH!aPCU$FpuRU?)aczJIH;qZj%%UEQ z8V(r_VY8aY*qisrX#>ZurlKk6KpnhUeoOL0joX zQ~18f*O9E1rrdK3KgXq}wPD8-QJG;)qr1&T<;1AaU;z$idLVrG&wr`IH>O*Y`RO*i zbf=wUwLc$r@fMMZD}ua*5<#9G8P%7Wg8PsD%l4l|y8ItM&1v{qRg*nor`Q#k^GsD6 z@yrwg|EEa1vh;q*ART|}wDl>!fL<8YN2JV#Ri*cf-<>T1^mxaYiX=`UWI`Ypk}NE^ z7?0G!wQEGT7ln8&^@=mvfyrA?X?at*eB1Ar9;$gZ>lV;SG$ioBew2lI{ z<~a0P1c*TPZstSNY1_nD|6I-WVxpF^#2M~dG>lXSk;9&ZF>f^h2QyMLb}=9vq%n-T zgsFFtMdM*U>%_D~KDXSdT1VioKM^5PJ&AR;WAGSZIT=;5BT!#17M3$4kI*t{z=6HG z8|JQdU~hyk2ird@q>iU1#wx4x+o^R-y;~)~DEnC$*+_xZz40<=J}QF&lSr`F7Nb}_ zsZ}Ms&3|B8JO*zUJc*?yiBq7JyyP=fI_2VwOR&|#b_-NX7t@S}&H!ew`;dMx$yJ>^ zb{v{tP`N;FnJf#>B*8H@LoTymxNOI;3ewzZBN5*m!?KjfWO2dKhWp0AI*i&wX7FOE z3iK#G(b5THi5t>i@HB#Xypo&K>zeB|G^N4q>tfi=#K|%$)1Qj2n2(^hgP#0~C_X;u zUDba0e3!odujh>NFK6U_`{ZB#_OC9kfBR=tM1+IQ|B7nz&-wpe83?(r5=fP(%Cdhy zY<|G0?ca_c+A|oF`Y`at>X$!1_WT)t^=AJg;^WolTt1KVe1J!y;0E7nvTJez;uJZR z*~GknD^1GPyUIH%OES0~8_!YaR2fHUSRCHjir8KN>bgB-s+%YWYqhBQzB&c8T#((2~SN_1m8+lDq~`jz}GK{?kg)X3GbiK{k$rE^V84D=MIU%UDO0 zZZvZ=tshk!DLN3z?+ia#39Hif-YK4g{zN0XBK7XuwkljivV!UBDV=!pYg_8tq1#fg z%XrALxpTbt-VeqgX-m*H)wAGD?XD$Vy_d`fZ=+H&gdeZKR9i_)#z;Im#jyDi7286&)T&3tx^iI!Yj!=+q8}aQB%q*|&mR2u+ zuS{)bIm?u08ltzZxF^O=%4a|fb1!V}L9nO(FL-R4_@f+f5;GPm8e#-d!l^?EUcmD{ z1cE(A1}p*tuco-0vV$RKuodK$q4EadC=U*YURWIfAn5iu!0&UgdHePvz68zZqmboE z4RM`vCUCdTN1bM*yAH9TzJxJns(1vvX2?vZP(<%2^ zmz243AgS%q0$%4~_vj;&!O4DHze^X~HEBoDIgnW)u7TiP-QPWg!sJxlk;3g39VouK z{kDv&tj?vngR2plb<}S6a_t0~)sfn3*(D8;N8Rs;S0?QbnGfzW_im^wk;@0nJ?VA9 zZpPN^$LK5Bs2eg699P9fO^@!m5;rBv8OTY*uH4_WC{m|@CHA`K7p&ol=l5G%7d>D5 zy%s%|=A4)=gbr7LI5-cARlnR3#DjL!U zKsKnZV_>6eIzgNPkMv7TS|G#%?ct+%l2GhVQ(B+NK2>E6{|u7Zypsq77-A@R&lS|? zLy{=Bv%p6UK6tEUE(oegr6vqW28DCO_{Ikh2}g2}RR=u|VQ@;=0Va?Q{}ARptP8-4 z|4hp~1k?^e*d|w_Aw}L;--XH&s$}Qaq4GdH*)hOV)BULRg`45y_Ze{F1DK>SA23VB zEa4%w&sOUTO($4M?ke^&)`QCi)I3v?5DavyAF+DO>x_9LVcf8F;PhZhB? z)5IKCThMw#6B{jLLY8a6FOOrv4N}w3*7_u6;*uhT;4mTtRarEF=>;`gV872bpWs%> zu(pynJa zB2a14&<=4%yLpVpByc$aoClJ)ZTGVPRrTKRCivu+dF5jV=5jTeyX+~cHdg!xadFO6 z-0U!GwQVm)E+0mljs(c3X1wfYh-7)5BnRIV*(>0M`Nw>pD6pxNObghhIc8xg&yzZ>ms@Wva<4oTK|mo}Z1!tM8xtTZJ61Bimmr zz+%IsEDG&n?t3_moGq2-cKN2!l3!wO!Qh)$-%7jQCNm@3!O_zjck1nlVfF3DfBYa* zIZix0PCKh8j-}jxl7o$NfBmh0CVDWuYBnIwzvBs-U@dt1)o+Olwc#cGaXG3rP#o-^5wzs+;kj_V*O(U9U7%ozHc^-|DOS zy8USma{D&9qd1kj*JJs)Ob!YWZ~GB6i$s6-OG8H2syAmup}43(j|>-Te|xUcEM{$P z80MGWw`}bynppZWV)*atWBO-;9)DrB1A%5ie0t}E_vP~QYqWji^sPa|A4A)XhV6Vq z183~7(|NbOPM@qI$nJPtVG5r1-lEVrd?j+!n2{<(PS)CLDVIp=IBju&%mq0L`MJ#$ zmdliua>mA+Al#wQ#$bcT+6r=?lii|$xIT*S-75mTS$B(90FE**sxPIrQ*}M1a66{0 zd(+|U7I>!}WYOsGBqYHqppc2$=`>xVbw9?~*b@M&R~hrtjO-m-~kLL3AcOl~1{!lG%guxl@{5JVcr zwV5_rUyt-LbbfHq_N{~$7-L&Pn&sY=Q|pxd+8+t)9erLqAqNm@FBArtK;{GZ?^q(4 z;*Z6Ev!Z3hVfZZ<+)Q~AGlWRl&jN(C1mz?Lu{3|@&?i7D#e8*1uYXAfp~a9heL;WS2FR7)?CXjA(sG;`1~fh9{YC)Bi;_pAA{n`EavjHp7=h z?4YP)S#!wIicuaIdhwGA#SzU>3y`M;n}p?z6FDB*$B$JR5+FQu7$>N^aAE^_k|Va> zw<~(H1-5h9%d+xSZ-{eSa5q-mLaTqcr9}TZGmLAjOfS#y!O?w8>&hQArU@<+xT@q1 zxymHw;C&m(J%43iM=kV(K(&_xW$B0~PtU7N7#0mvLO(&hoQa1wItiQx*=X_``+VXxQ_Vh=taMyAJq@BE)LxN=$7Mng!*q*aYgSH;if4e`@q zge0mTbq^uQjvZbL!NIi>h(>EL`_59KF_OqBe!!{JOU|b{(1Vr1P-b1GW35t3`$vEH z>-RT<{se-c<%_Op#?!!S(R~>=SSSz$7P7tiiAZ0?@_qCOC7!6ze7G{$^8JrDAH@H_ z0ICi#yzSmB9$&_94~=i6jBV9$=4zwQIpoNRDV5~?k&Z`PJ>?tg`J1Ap&yTk7hDS?( z$n`Zz9j<}~XF|@qzlH}-H)14wBl~ib65=szxf~oVj&2B{J%iQr5OAl9X2GKjYOkqR z-|mv)1kyNd7<7HQdRT!0Xd+s-;06yYN9zL~6J}bU7Ma3W|Bv2+h7w)_oD=V-R0(ju zm5wdGOcW?^(UQu2{BAoDfaswN5L1A}{;X;L&gO+WBoM{QLeHI z{+i4$VU%OCAdCTW+&_9iDhMkT?3!EviP?Ds$I`_Lxl2nitS@4q@Ical@s8JAaj@Ig zCr;s&_PI73)a}y4h(j_>~xx;gt1O9yg)jSv7BmS z?|5Ks;F4-E2=O2Y=Q8`x*k~nRb0MT#oC2G%ZAwsE)^}opzI82T#4;oLP^NUOl`Z*P zpdApKnZQ}sF=p}s8Qq7ZQ=U|to}x&5#C$!qX2VFAdH&$v4u;4l-6+O2BQ}R*dZv?6>yt65@zflh!B9syV z;#;n?B{;_!^Gt~DQ*UWRNRGPbvnVP?BP6s5(b!&uz9AjfW~1|`b6Wcz{9q$Ex{FiM zn=0V*Q}5;!!yL3u<4BKiMqCEsLb!N>PZ>Ms221(oTS??RO>h+aHjGifi6%oXP5WPR zh+sKfF>dw7^P?zH({ZCyIoL%v98P#6`^tjvfe~e{vY5!_l|*JXt{yo2)=vK7^g%mX zUGTnS{-K38J;6ENZyU=;ZNt6rB*E&iExG-@&Y*7ju#&K8eJ?B9#WW|8pNGj$iGwzx zNuKxS6!6RweLsiSV!FbPDa0zx8#^Mnar#uwx)GI_uo^Xm&f&veuTK@v>(oA^DULt& zR-Bx9wlAkToc18T@Xr)Ob{NR2bFXxuVTY-+tllu-zKm0)Idho-R zMDsjZ5vRDL)4oy|o@ITK7A=qeX>X7&>D~JIz`bJMZx@au{=1;-87ss)z(A4|6X4Z@&Il^chLB$-z zVLbp0oUgtPKnx#+%{S4!)%Li-jjuXPXIKN=Zd$>vOay=wY6NDfKUHiEKcgKgrzJvZ zZo|NW`b8#y8ikJo?!|EP^{KEgPauI~*w+UEagWx0O%?NdjdaB*t&fvBZTmeOR;KNK z^l5HqvFsM%e=1#4$U!^Z1!~}N7JJ2225s0xK|(Jq0Gc6tC9-HNfFt&e(BHw?C3u39A3T}}&;RUAt+nk;naC2tNaJ)CP*I1*r6+0Gj zkWnTqNF$q{0>c|zQl>Cum+r4@7@yi<2jhG*&UhL$*O1Zl(M11kg)5#wYDW6KNYrLl zj_9#0lG89EXsSqG`L&TZ@=iD`R%LLCBH(hw5zP9zjTwr2SdId0d8jjlX5a=DQwSO|8Y-{`W*aBUnZOVxdCQ@n!iuNf%~A9XO9 zQ@*MeT=rM?kUI$S*|}9%k+@#89R1~e(1+vkpKHQr%L07vD}z(q z;axvc)k-CUPT{*u7r$$hqG!*I-d{*o_ADUJshn&gN5Re^a#mrBN%P^uFIR}U3(@f( zwCwROZ>z}laOAtqlk?$r2+Jb}Bq>Z)%bi@Q>SmkCJo74OKlXoOr!3-s)AsAk%ioMkB z<}ATTHGDr*oFCT|x-XL0>F0%7uli1Av7ijfB#2GywDZiJs@VqC7H9e*``86O(F}Yv z*+2DOySk9i4VMo*@`9Aoff;b<0w?Qcm;f%Ju}24+0N zZ|G&M#D#v58YrEw#)A(O#*`NhYqw=no9(-G=ZzT_6fw{ay88TfE*_GPu###RZpoyb z#y6%=8DOmc7e*r=z$G=Q*-ltp^zV?{{!;z|?)w6i5cF4gou!Ua${sCi71)X}h^zN< z?I_s3k+?~L{7%&*#SP}M9azNr1Z)d4X5qDY|ro~V(|Z;s!6xOivdOX8B|^#|M4p1Ol|jgQZ!d1ZK5x*L6S=0E@O z@{hKcKXd+W{r938{GPvm{CjEn%i~|A9!PuGu;-g_w}U@tWIS;>dA0lfk6%t!`cF5d z|MNlJKOVK0hS9N3CLl#9gNyB{nf-yOSoJm8z$G6*hUi#f+(FjGQH(WfIJMpDnWz}C zdq*2$v)?qX8n3ize=jG+h*1|=K&4&9-d%jDi)ni=(Sbr; zA0*9sPf)GHQ*gq`)m+&6A}1zsqmYgXWrwR*6It4pn5*=gAhpTl9f@h*+a970rs+Zp z-#_}|JpSp?RsV$hKdF9_PN1LrdD2LS~Cq>rn3?-J=5gVHHnem8mq`HXmTRIS4*C*#`N=t^bX^-&E{& zaTpPO)kW-z|D|Hy8fohVFcT>GVlQS)+|GH{mchcZO}h5Bjh0AghO7g^OB2R1D>PyO z$b5h%Z5?+E%MN~N?3GVCMP^_L+Kh?n7yxBLyqLxM2u7-G9#DQ05}>YiC1_K~!ZDdM zLr8P5H@*{m3uuJyVKv{TF`9|0)M6S+3Z&JYz(&@0>f>I@KiY^kU&_uK>n8(XC4vxW zjX=3lUxmm5evIt3cHokP%Qqr;0TZHb^~#^~feRtpS8Y)zJA$Ltjr3r$grgPUf3fMg zrA6=JJUZd20WP3G$`u&-x{x5G3+4HQ`gfI z76?dE=cqk^#GCPlWw01OMizgx(PmWOEaoV4Usu}RiopW71h!dta!m;YmXr&4Q!2KW z2&;V`%j7B04j%!t^PLKe7KRL)v4j*+N20N<$OtmE85Z{Xo5l?5keBkv;R}`7ddN+g zFZk{WdPe2rLT)!&hL9rL+D>RJpqCG;EQkjyFV!-q+%UMAx#S8AgnDqZq; zZZa23G@d^6HS32t4TWj6R}m9qce1oB(JRXB=E`@p^UaB*m7gdvc!E>thN%7`!JlObwA;8c)7=QU>|DATl>FqCGbKma^-^^Z&@P{z9YomcWu z{)`o)E}vrxqbSQEPP~iIJb1elmPXT>6LsM8&`jA+Y6d6sV*NqFm;zYtd_o{reK`aI zz_gikeDrSY?utqcZ1%y)CLLrY@=x19`6I#0QCqN#YexwKd>fW-rtWm2r-Ka9TOwjk zw(Xpa)+e6;UBC#d08_UV!(A$dIt7qsV0p%V(pYk{HpWK8n$l)k@`I%>pcgL4be6eP zCXSIa4^btX7euajaxs*_7;ekA&^-6WfRhBIpk#%xo>F&PgQ`sDNS0q*P3`rRkrV!JC4DD?BijhTD-Naruxa7s>&mPk7H9 zN3!RS2voi-JM`tsE4jp|xR*^{gI=bjH$A;IDAUMH++`mRnN`VSQDQ6@e(`@w@47Ze zxs{{s@xu3}I+$~MEi3ZeWQ2hLOYPUCv>}4x&CjydqgJeV<$xbBLt0Bf;Ub68dkOQZ zBzt@Ke)Rq{>Qjsbzr^Obm~io#@=YvkUHIfHzFMeS0V96!d#0T~W}34MTIKRca!301 z<40Sz9H|4kIP_M|G#D#O_M{6YtmAKjftk7j=dMc-_vZZQfz%TY+e6xOJh2W zoN>eZ!x?xx>_6~Uy({6zcT&%))zF~42it>7qlMBUyT`QQ>OP0QjOMf!aO*9VCK^L+CqeUF@e_6h~U$(;U!_}Uw~O*G)a62 zJ5Zo7qukOrFlK}>c4AuW_EW^?n-TeAGuVyW;qOrYw{&(YbDw~{lV_GtcAju)p1UkA zWuubnGhAW6sRRUNH|6I8&5;+XNbkDMc$3}OjYG26G;Bi)B@*~hN-dlPbL6s+sUbPH z?6nuMHoIglPHY|+&mpc(B4}&5oo!yx>H7f+a)oP%VG#ng78?ovL-=R`WWcjju(vQX zAE3cPlkJ8BM0g$yGTNc)J&$NcEP({Ep;;h1i%6DMA;xlkfc&+PTHh(K)w@l@-8ACs zk-vP3Qj4DufV9Tn$0L1xKmR)5r?0-zUa&wYfX4DMS|7NfI_5+N?gJz;^-2hSEZCFZ z-z*WKeeD|s3jyu|_d&+lOq~DV#eIv+FdOg6x_ptN|}mTW>sE zD9d)mf|;)f3tT>dk}NIrn2y|SeeA5}er+y7v$z7IMkV-c*L9J`AL z@5i~Zy52nLOV3jxT-lYw`DDNT)pOL_GSLBh6t&s=_S?qBo8(Nen3#q&`}JcRTFi+{ zrK-3ZJQm;Gz5Tn>_W8o)>xPQ4&)O8CqV;>nkY?el#{N`hBve$g-#$KWR+KpHW#wAu zu0@34l|LZ00%VjeZTk9tkJqUbySm3>H@V#S#=MVRSJ-4oNyF^gjk=QA8i`l;*ybzI z`0pIU!1y0oTl4!|UymAHT^3cuSD{bj(q?Pg>zr@Qe^uaRFUe_g-23{k%3AA;XK}=D zw11zwlRl9%g;T_m=atAWcZgVOKe$s0;;!CPNby&%Jeb7?72XK<)VCNG6FwX_%q8e9 z8{P~RZ2h9B?2-_pQolLPABj8R?+C4IkPe&hrO$KoP3ZVrz7w3mHznJ;qEAcu%j56! ze_Y_45ZrNbZ~&s?rw4A&ZdH|`j&Psc4(`4sg$^k6~h?NHndOlO%g;~Ni_)1=b)J+vBY-{b6oww0ux>Z6{bemwY-~zX^ z2jx^OCyKzX9FAq2dt>LO3uN~|=8tz>2^c;FitmCP4OVsC=@tyE(*ZcLFCbx_s&;K$ zT7c$$V+O~V=kf#Cy=Ma5aLCboZ2s+DUQ)fuVfqlLqA_(!Gn#Kh#LG$8cP_S|_rIaZ zVITJQnRph7o8fL^FUQTgfdiX$NIQ?;r|?&%raprZ#{24?g$@ps69Gd6ax@KUGXC|j zE!~1vw>RUPbt@WnD&S@XucRYJFuG7(sXC1flgZT`#wU$Erp(Q|o=6&0Yep6OECdoF z-NMAYTzULJg{!r64>s-gLP)=BuPQ@%Yx!H}%8YMp|YQDjd=J2zIuW z`u0@w*{@TIu2OQGBv%>i zHh7eEjYv;Q<&1KDysz*Ea;KERHc{lvj$5am`{aU`Z?eM0RMEuYmh=n4y;sGzdcvK1 z2h2nGW2JM-j@sOF{@&eD(?MUX4a^w68$V}log2pOV@1%FfcMG~0 zTgWdUT>Iez9`++d31F?%;k1QZFZiJ0aQoM0Y#;mt-1>#*Pc;?La=!mi(W2)$eR}1v zw25Tt=S+(hyNL#6(dUmvBE#ni!wb%j|9rwb5w+l*wU4OIu6ifDrAypLk*3Ava>FQ= zWEuvXl1njJ(5#`T_26q}&a!Fbo5S&N%?FpFP=Bs3oR5}on*qSMj1YlbgGB;U6E7rk z-kY!vLCi7aOrcv@!{1K*KP>=(-&qQjyASZy)gv)nd8GC>tjRVDM{T{;na!-xy#$bZ z0_|_gZiS#?)ntQ8O-j8R#*(p8#gVd!#)j))-+B5VPAkB)i01=5?BFL~Ljlz@TdAFNYI zlx7;9j)|Ulh^Y%;nj_be&`DxLH%<)%1+5OGadtF37)^{|lI9AgBi4m(2q`2DBzwRj zGK(=SyLCKN7L1BJZf3B)P<!)fhm}Qp? zk}3R%J`-zlEQq8kdA_)4Ni`aw4I$S;dUJR<)5FVs$;h>8e!$wyi1}(NoGVcCc~}X0j)_HT(-m>Waf?pYxgnR_$Il@9r8^nHWwX0oC*-wWOn0K7ZGRK*#!G zC(SO~*>xmxT44^!17%dD9T_Ygk<7z%4u(EYx-e;lTr1}~o0rwpbaLBU(?$z*>?Ok& z!_Ntu7KU=Cf)Bc`y+=$&WMxbcPLA)MT~-ur;WvLVe98iE3Hj1;<4P)LCHC!s z6z>BHKZzV2H@2zW8}w&4CAvJC&3aI^a; zZ?=Xk$K5#LZoG@L{KwyAM&Nd*rdwBawqlm{+aJP%fi)V&LrOib0btCUtg_Z%f)JsA zyNG>n4Tc2gD3mm&fJ}#I4_K#2)b*rhhAcoQDS_1T5dlBRhye6BY!;-t?+kA$`T3V7 z`nSkY*?bKTHg^>PmUNyA76@$M4{CP`2r$mYqZL!$(Z%u+Gf=;!lnXA|%z-r;Tm+;* zsD>B7DR^FlSe%ayoS6sV1%2pn|C3Q$5dbUk1e@>N^MTTip&SD1o1KS!g9_4t&I_Lf z37<9coH#VWRlrA0^vcT^9KQEF#oHlTSC*)I2&)>R5GIN@0(q_apE2+wuKKF6>{eAq zU4Tymh+4$Eur66FGhkF`cu9e!y}>gjdtG<6MVYVv;m7q9%9`z???*$<{>8lN)Wo5N zzgULH{N+C!|D&9FIyCfQ5#gGf`GL}Z-E*w|(4Nx&{qO%PcrvlZLcFe=rCeR(z1|+v zd%SM?(v;Hc*mYcXURZFCwDvW3Bry{QyTv2Rf04b2cxex<#MB{Oywcke8%Ckw&+|Ir ztsIJm&3p#Pg$}#hkzQI(RpYI-9hAheXD-&s&I$DxEP;BA@RAQV!U&^o1p4+QK#8NM zVCxE_DJB7ob7Y}H2s5B#uyCl%*vIpEjBk2TSbv+Hgr10(#9|JNxAPEJC~ux^IK`W5O%Lzh!&~h=6Cl>S*=f#$?KH%>|2!PL5Z7CXhR~w6Hs5A z&J8e;@51WO_wm9uPTY4 zK35`@tK^YP;#^Y?kFNxj=uM)%>)i_Z#DSDJ$foRC{?@G_I5zW8W#US11os51@(HLU zvNBn#zYL9U^%riN8f=5M-?a?&9dAV|(D~qNkZ*f2zP!TMs)O+I5*J(9lX`HLHWZ1X zQtKNqgjqAW++o4DRaF_8X;pHK$jrOlZb8@m_K#O~i zpL>H|FMa;F%`94v-X;Y`Bf0LT0Q}Gc=fC$46+s65sdHfNe*|~v=vpxHUFF%6UAo_% z-lOzbxTy&1bPJc`J z^q^??q`3fKPda)rb%}g631W6&E7%Nox*562uwbFGv}KI%m>PKj40-=|yv0t2FxiP` zsLjFxDl~xV%rjiiy@2+*$~boi0Px>=MpIc0raO{65HCQZ4t8os@nn+N8eXd9hc?`! zb+=<=ox%c1wV`FEtnfGM?WeA!NU7$5qI$KndJz)U-GN24$=n-IDsWC0B- z+yt@AcW0DtR7-+Qqet;hnB5T>NcH%@)U(v#tb(Lky|TL7H<}?nX^w-p)R{;aK=Dez ztK(P(JgiB*K+o>^p8*y22W_;$`aZ^!RUW1SzK7^B zMNk%5+ih+Sf5aA21L;Cq!9hDZDtlDm=No!xM!MchpqQI4@x7Ft!)!m{=+(PN*HUCBJ7b9$GYc}{ijwko5a?S>#iS3FxFh+BR| zb!Aa%_=&tyTw<^f%LS$FIhT2Et!)`XA|y%;f9X?K%a(J|^N)qv>kEA`D<6O?q@DM6 zs_a+Yd%s^Xs%RVN73}4m?%i2*xh9tktBN0uOpCXkX!1tW2O70GB*5}B7nMAwm5o*%bIu2`=;U;9As zmS5>r?0`ZVzUTJF_#cW*k>Qi)mtV&9tA(5VrJjlik!ZF_6zs)$MayUS>uzooEDnu- zTq%4tvefIeEza8dE$h>}rEOx-JKgxo_~wW4H~1jKf6Z4oJ6hJd9QTOoBGMeDtIg>g zTAeQ&qpL?HSOM5#Tny~r4Hc}%@|8dL?sS@9ZV4{5?PgtW@4O8^AxFnsvSBC=sHz>i3uZXt^gc|&E%Y7{g1}_3rsm@GQhWG&(3;DG^ro6A9Axw!<6Ds zEd?t8f%%L=5|QagM3BsfRwe6qCBZBITHEnB~KU2dbwUO2?fRo(YNN236;ua1^q zw4q@o!h-MWO9Ts+^c_4nnp9XsYSw-Q^KUZT6QDPr>ci}D22H>Ld$1l&I3fdb6X^P* zPN&Jur%1AsUU+-$4baWxWP@1)TYH-^(}}>M7s1Cv_km`i2ykF7druSBwYmB;&ET0+ z#dDX10%&Hc|If9MwS(K{5&_VDXIm==|3=h%5cl%3<{LY8G)4 zv%${E&X^6S43=gzcJ574?})i=kAOrq%wGCp){hzf!(lK*wmU2DVhm5cDYn%;3|Y2| zOy;gN&Je>rWpWnPCE|&Hys3%E?119?hfm6STdBKWA6BR;6YHF<6?42hsg*<{{zz0F z3U($~%ZGV_OO#5u9^{aMW2?y3IH2+Jd+$$lE@<9<>*r;Bgc+U;R?#lK-%EBSx1Sk( zm3(ljvX?maft~e5U-UWp%lgOdVSlPO41U^NlsA$_z7T%`fm`VKPx2Rg^C;G>Pz!D} zj$}{W%g*tepzTxm+CFjh*+1gfKMNUB?yiKaS~NENy3u|BDyu*|CC%Ue!DJQ<}JZ>*eRiV|IC+&Ya=fYHu$OrwxKB z+Cww8Tvb1sCbQltYr5M7Jz{yP>}tD>q%sjUYcOC}b`KyVujoh`I6GDFu%;Gs9eur^ zQDGIhRJNkByyu0%&3V~inxAGgQ6}d=`O2c<=MQbj;HA;dA;XiN4H#9}Xg|1SFhR-> z^?@~do{HSjeDqeEqGcEN5MU;)0me}-gx=2vGJWd6qDsnB5n{ z%+@Q-z<|wE3)_-l1i71T!NP15V~j}zpi4QC+-?hDqVBfPj9&sdJ^Js+jOT7Vwi?w~ zf{Lbd5<9#A0k}Yg!*1KCJ_SBkH=(FQ92LwN{KQmOM&rUcx;4xaK30qPs^vy*dgFao{tSI{J`ln^nz@fRYWcfnH&cO>k7kYROq&)XK`p^zH&4|NI z3hT~M+@j2-)4Kbr=$7Nmy^C>!E0xk@rSAcI`90~qh1VR%Jozf?z5LPUKNGeuZ+|hU zi*!X>kBVO4$KLb$*X$5Wdpi9#Hy@3C{rkI(0%?BHZ$}C~c8;%H4*HW^_)$?bpS8&z zU)>e7>1bHV+G^R}4El7Kz}9rp%B!4@FIHb^aujK9bi@x(Q!Q&@l@_8=>pJykphYp> zt?MzP)Qo^bo=kqOzlI;1%dkLP?Z{#$Re)wMgifd-=!mP%jBSE^aU)$1h@~O042gVc z%utG7$jrHOkv!YScn64sds3GV1usfXT;T!i#ZY!sdqI-;qe@ za}&kWK$#SPeehiLme4cv44Mw6r4F*}>@b83CDXcC|8L+k%fhfA@Hov~dm9E`$c^Kp zHYOk9W_oJ6%~(()VW8U~WZklm@EsxfUg$5=#2cQnU62L~CLZa<(2X-0u}wKBtRxgf z?69-a&h0j9kOdUKYAgYxo|&rx8FB0{RM=S-LXI3P_k&}pYYm>9*=R)?n^O6j9xpc` zjJYxOKLFMY)>KUW9w@GJP~}*t#iptZ@BBJA1#(7LPB7T*nc=mH(fnHxEl{{o2QW?{%y&hXh5l9Lg7ox%&rQe0a%SnyFW>=(WUNJ3@ zmGU^CrYSFGaO>aC_3qnH4P2iLf#qC-Ufl=guD_jJUpXxb9$eQLcp=RE^wOj&n1#D` z*_cJ%2K?^iZFq_B_K8Uh@*Ok_Z(Qxu_f-hcPxjF@ zk~LS~?{*A-@YwsPwL{<%lqWb+gW^>A+s-G*8IEyHVmvuh{&#Y;$7hg`_c~=}zswShUViNUOw-p_A}yZ!S}}`Gd+-0-W#&!& z6nE&?v$ftIJ$E;+Uf2-xDrxeuzRW|M{{ZdOcF?~Q?jG3tM2@0ezTQc2ps zt<$GlU#0zgJbO2|qQ)lB*$oY2>vkdUSQd}$et_*^hhe&I6&f-E(dC2HLoC0N?Q#zh55& zWR&}lfg`;HjB|Sc2-2e!|K0Gq9P`HMJQ#KSCVhkX^~Ip;G2^JU512R_3hH*4Ecu50 z*flW}U^Y9vCME{E!&9F#8RP+&-1;>S01^egh@bA@3IY8~71*Jiz}d@SymHBj?hOT} ze_p01pU0sFb7(a)7m!shfe|Ie)V`SbIsad0IuKcbpr4=5)6Em9Cd(pxS7u#st>}C z6R@ggzKMyp_ugt*C%Cj`jnwvz*CI1;8cAT(E^{gv1U*;txo~H%o%337rY(HbxxM+% zqfPEfNfwojW|bcumi;4=WCw^=d$#Y%w9EvU{?tC(J9iL|wzbpdy28Kuahva_g?5Yg1Oq#ek6l3Q)$9K}2Yto^`xD#Uiy!pA+*#}vX1sKL zy>p8F_I@i^u^)`D)-S%x``96VIPp_+VD?An&p=S1`?723=h41?_j^t5(sfU|?CaL; z#T~wjafq$CzKuh1Oak*eI!gIVAJ`{dDIq*L!*jF_=wIy#Mt|NFcddRBQ;OaH^kCQX zkcK1gFFoQ)-&LKd>R~>0_a9FhnzOIY-bfqmoH6yEy8SlwTZ{kKuYWV{ty}jNR+NF7 z$hu`ohny;3QJ!hq9&K;j<-WfD!kH9%P*p8yd9-aH_r@nhu;+-k^kx_^;Ou_(@%*Db zePsuhwSHfl_IUPN#SA*_=c*~m(6qL*e0*`A%k`3^7`vX^nH>g=rT@&x&^M6XE>wW= zcjMOn6WqQ?n2u!CTZC){hFky z9`mWueSY@(WTc@Q*PscdaBT#5$a3Q7JRN}-u78U<-5fy#uw9*M{R-x{S)E>tB!!bd3j1*l`;d9vHVtNZ zm$sP^VMNv_;Y z>Gsnn=0IfFTrKqS>mbt(=D{e>XHT8Cr%k`=oGm=?>qFYemZRg+9bdl1?eX2yk+Ik@ z>|*}zk8j9X_NX_tO$Twy9`~%1=GVsXi{E7BM?1cJuDr4v1}edteFzO7hpj~?MB^UC z&s*FawQ>EbgX*;LN3Aa_rbg37fw7=vIT+sJTjA~AUM*#ptYoS^AN8jH_*#14$hYsM z%co<{-keePZJ7SF=;rK)q3^dB3{CvAWz(0#x5gJupB~>F7M5pqo)WYs$P1mjoyuFM z!7YC3a_8^7oGj7R4Bme5Ko%_wG9(F`tq(iELWoUn%w-`d~w z7(DF=Q#Un*ZUT4Z$Qltu1;IiMkrLDabYZ5!rMFI`3Vd$Iu@m5jA%#}@!*L$kAV-jH zG6RiIg%H?deQI8DQ@BJguS1V9VJkxtZCLTiWf(0yRw&z~wKtUS#8@WVyJB-U`;SZ6 z3blR90Q;ka;fEMjD}`Xh<)7gE)}Evv#l{1W5T^lF+UuYs1E5Q7BzP zW1&O2tV-%@lB_~VOb8l@NGdDr8px^^_TqTO8AV+Ytr`$8tNd;YE6hY?EFZT$D!f8JzJRH9t5 zefhZz@&`!Fbr`lP-Ff}~gT#Q`AbM%hN^IkyTzVGsbc1*+*AjF465X!~=OMhGf!0y) z=gHq%F-ukZxGAJylqw;PinTKYw(dzuv>vh1ex`=Rmjf&;=2D@w?VGdOCing@`l= zXF<~N>{=Ew55;U)rK?einj&msz-~nh;6x--LIZ&jVC0xMHs;ByAf{)d_qr0jS6;W_ zSc>h9pU(o*Cemi2fwG$V?5@T|6C0hY$uBwgvLN4n?{0{=#)LFNTdh9dM)nhO;v=8R zyIoxhi!PA0WjdT=n}UYq45%ebx{F*R7j4<}4g(h zEI%lsqJcJ?k$GVsib;4_X4I{%yD{-2^la;|`~U2imDIle{rTj(y9d(leZDyha{btW zpTAd3h1;5jIY;9v!#&%n$d=p;S52<|8<}^som^&;KxK!3J)~Ch_A@hV1uh@~sYIa? zS>tXSfr^&fuftj<5ADRLLXm5$Ynvh_z4ChabQ25O4JN%$*t`lqybd;T(`gnGvSmIP zm^KpeJf2IYPolxTQyQ%*P^ahigC>x|Ef}ckX%dCv18Af1eL3yp4t5PSopk*p8&a;! zheQZqfg#fMEHb@9i*=XCwyQ;UCdtmKw=9@m$^rqT89d~s+O4Dn5G2_8Y}ux>P@+k) zOO-pv1QsqdhCN(J@=$Tnj$hxEwnmlW;}5~0YG0Fy8;~l{gnf88h}9NL98S{E z0&mDfQs`3+7dBw?8A%FlSBUJ;>AxDG?JR1oUn5r7 zyhaV-6)ETz6J_dBl4*RngAl4i3mjGJ8Ax`EL@L`9&a&p{>qP6}{Q*)G*4rpTr-I6DI7a+|Wz%jbVqu=a)^FQ^iaf2uNewv+~$lm-6JfcTY z(0HD*?;49^r(H;L(Sjc^_Y#dL1T*o})$KB;$^a^_xXY^QHihoMEVcJiNoCr`0bJC+ zh70e1ietC<3sQgOUiAM}cQ)`Sr5UWPrV&xES)*3i zYId(K6Z^*G9|xNc4gCp-hWHVJzM>BDzCtv!+qqUY*rNDGE`AW`|OO$g9Jei*`|VjLIjzx%zNL z1tQ`eR6^+Ljz0!Ze9NrA@w;gAj^nS!RvdrzV8w}#chkmyZ<>0tAa(ZmiXX2(PoJM1 z2XozTZ}`)%{P}s`)6}vueyzbhD5F0^7RaZ>QINxX)I7UMG~={PR1JAaR11j;5m!es zNfrenJH>$sl75&qiegFz&|}woG27ko!ee2h#NpRPGzCD4m_!>vC6U)>Rr;&IPoE@& zju-<;$9vEaHBY$iN4mhPGo=>)~xC?2N8FSt45C zrYbh$=woXnT!fK>1g}H33^e9}H^X>gCO-QudaMFcbu#sudC6LY8I~ zf!Wf8JgingbvnJ7@EC*4rt9TkztLN62hdGOjAYRkLO`G~!iHf(U{h@xG(Oecm3X6~K^%pE)qIE|q_BeIYuREq+;iZaErltR5<uZyQQm#)^%(Zj< zmKEfxhno?SB3racLIa<#9S0|{tw?*7zvAZSk+Zi(EB&Vu-cJ1SHg?M%NW2?y5G7Am zEv#uSI%uh_ihxY-s2j>Ur4xqYTT|@MsiUiojhcO??JLA9DMTe?x@YOIm225Bq~uoT z_S-m0p)0Jazz_6jA55^7oJ}g@RM*B+?HPs763g_9k@Db=kdFrC#j`G@2_@(DglAQy zROTT#sIbLmSKg`p*4M`l9{G@*_G#5rRpdciK_XZ2eBlQm+ z@I7Kfv-7<&l<^N7kfv{0TOIc{T=puw(C8YQfOFJd9Z>qf`-g)v!gm)<&h%cJ8gHFA zFr7C0ZRqItSNrRN`l2tBqq9gl{6%xxxdmeb`0l;Z5ni^-E; z4y5&6yEU;s_49+nQ!f_H)qDOOI-ZkX){d}t6K1`qgcT{TgluW2!r@E@0fb9#fJP#~ zM)Of(eB1!&L)r`FTn&UE0(1!(!|1E*SfdWi&YJa%775t= zCOXX#1}8g^ssI$zO$~jr5nM!ocyD()v*1|R^O}7a8><@QZ-jJ#oEx~5d0uwGjzxA0xj%AXCcuSv z&5KcJ31U>QlTU8M$*VG>m8n*m@oXbf=OSe4U6fw#5?>Y!(8vHz4v+!J$&6ANnGN=@ zLUi1r`u~7?0PQAusqvOWWs1&4vU91e#3Y%aAD76m1@qkirwuljK*V8si&_MwFidpP zKmgZohS0H%iSyWcEtF_cv|eygazsZ2e1K@ zGt#Td3wwy2k;AlU5QlPW@qj{a3)W$DrO#00dBIB+Mmh+4?B@s}pxr1_K3UK2o)_!z(plj66W^?6+~p@&@p`W?p*pS8w&~A@N?;+TT^HH2B-7C zS`QsM_U)e6BJ7c?jlrG@^Kc2?!jv1I)r?2FHEb1`Y6Ha(FOp+1hh{mXz+mPROclGZ zD~QDrvi0urWDkBEahait!^{v7V5Xa6BZ^Z>(`cp7OtKpq8w>?LLX&kLe(tI`G24>* zZF=&=x0eTw9h|x4;~5wr%w=<&cK_{G<%8@VF9~-ow0e1iuVs&XG=6KoHZ(oH{N{L4 z2U=rX9pe^e?WWV8^9U0?wm}+&OLr$bY>cet+1Y8Fe0otfj*0?_iWMbOpCitqhuM?VIhihJw=y~egBq!aWHlA(ah=DiMP|& z(%x@rI`8t~Z_kS!?c1`kd!ev5WE7HoiFvsS8K~kC;t+3H<;qcm$M zMYpZC5XXK9xp%j3OX`=?{$Cc&T-!0Gnf-U|hMzyIA5gdIqJqh*HRchane01d?dg4W zC&sjWH>P!)m#2+@tv-WJdehSSec90O(M2~W*MI)m=YOJe=;Ulg)CIqF)Sxhi+`fad zpdpxc&;BvLh|^BZstzG=ckO-GW7R^7+aEyhn|sjdWGZ00Bn>nl2GBAE-Y@($%NPYI z-A|8Eaq0CDdbkUc;CYcIk1&=n3;t*f0~r}1ITA)UTD1V_X4&vjs&1231h#LYLH>!l z?a;am8N!&;vohY=p!GFKi3&_|H_O5Q3^apivyodSQ|NQKH8}1Di&hC3x6POW0^iF) zb!sGCP>RlUEDrt%=y#F+BgsH2L<5b>e>KN09TtM`$Q0CvK-h#ltGsRHDU@Q zMu#t;yz1t$(Q?a%8Xg%*B3RJEkt74E0tI%Vw4jH~L4klJkx|Y;wRuOvUf=;Y3>EED zrZCW@5Lnkfz=Y#OopP|iZ6@$GjWkmRQ;;OC%P{oG1!z>(kczvEX@@pwo2^S_?h?pS zuw&Wqg^YoM0WVb0XuNen*zUq6XJtBscR_cv#i1XGQ9_#<$&z%o-bulMstS0QtQhcy zRWUl07gOEne)*8w##M`MecAK#f&c3VX)`;57@|03M_@yeXqx| zWu>&ZyH?(j-LbJJzX$sNdN=g@-+yL{w``hO9=Mlc!sSyL$!>DK9x~|MpTNBVkB=Vx zR#-9qq%ZZs``b&N9cAnV!h_d0*C3Q_+=H%%WKJ_nzq7Ceh%PLM4x?5g3=+c#XFAO6@Oe|5^b#%F>#}~f%90QtYa64 z>UI+sCndk$?Eg!?WBPdO%N5h3X|L}tn)z?K82jvKbdhTq+{L4YU4ExtynNG*uV18# zHl|L79+)*ao&^kL)vVrbkfxoq~{>DjYs-(T!V?rlEr61uw` z&g>`WW|6YExmnc%=VW&cb(A1fbZ<@*Kki%)-9$%7M=RVNh9kD3Oyk!K(2NQnfr~rS z;WWyIG%948N4qj2$j{EILkD&;|7yL|;fzl&{644|^X;48I3Mco$@c}1R zx&s2N6otMJhw5^Dy{d-8xSGIi`s!M%QojrtAf@@t3>i*-Asp-O5ZYD^BjD%MxTO-n zyyNBwJ6o^mJxLhe1HuLJn&gOB=I+3p&0TZk`1fhocYjQs7#!lPfBV#Ohp75)zv_m|1#)Xx`(?hbso zH2E;>A*Tby2Vx?7hPlME#jYAl|rBJrfvaUGJPF|UJBu< z?B}^bZahY59v#`6w>p<&gJhAtQ8tl-h*#o=w^3DWf{;UonKfoll~4qUiw{658^kaYd}A>$QkqA{HPC=K!~~q6 z5hsx28YJr#L_Rejc)z57-W3y5c$CL5CL()#$ngweoShWXb3w4f@aasaJbNPE!2sd^ zz}YH^;`vuHIB1N|dwMvyIrNsl6hf##)oXqm4|CCz6!=^tHa~1{=+mZ&j7^hq_s&iU zuWY{HX`WORhH9f5?$g69OhfPgPmH-oM~)z8DPrW_0pFuPw`8rFxpk#)JEqX2H@fY9 zZjregN7IN^>~-WzdLRUhsHR9|L5krs7dE{4a=Z2IGjRIQmmlGt@5d;eRSX6?%Ulw+ ztBaYH(?w;+GaBACN@5Cal(`Uv5qBuBD2CCXg6V$Q9CA2;gJQt0doAwnCj@DG`a5X6 z-iUxl?+VDye^@h+)IIZiBZQfGtXN%E!Mbd7P4~M?s>iO22Og@T*qx~#PuJi2I12_X zr+%x948h6|6&aT4-eKiW3Uip!b?{@`-gWQ0cb&a8v}MD1XW51y%N=L|uAWt_Wya?Q z&!v=e$ifhYH6a1-NJ9E4v2vVALK{dxgzUzkN+Ly}t%fomX34bbT#;|ac_t4n*bGPfYd4i!&A%M|_nkgU;WijJmK-}_av>-Vv?`p%U9UtN4^x@OZ5NvKK8<)-;UQdj(r>nTj6_TWYv!GhqE(9tw(0& z?KnA&YaL&k_HpZh)JJirJuItF&)j`TFO&!pSG~jr zqk@Aem9~N!(oGkgS-f3oBZ5>S0Xinyap{VB-3x0qy8+;@p3wC^15&a6T+japon%3BqP7U(5}L zREKLs$4?dg)g0Z`U)bO4u5#eo@_>&z=(JTnbihFGKGT;i7QeyZw2WYZ;Cdw zMCxx!nw(Ti*f_yifIC3=s{;fAVU&P9`2wrrB1tb?;pdJjpxcqREsSULBC$SmA176D zvb!Kq2tY|$OBkV5A=s<|8$i|PTf|#Onk1ivd`R;^JlQ8~CL!&B_-{( zv|zr@G`^TFou7QR$4Z)Ms7?XbX4f*HJ8z#tavNqM`wBB`8%ii{L`O+fBM{Q!C<#1d zJh}j7s1psesYUFMPLL_AiQoBMbzs@DqJq^z#yg-Gwq z+)UFQAp5M_B0q+}cb)yqBi}Qh+RdIFYa8-toprM?MdRv*fU2K<5S6v|FO#WUX1 zdu4?th315$XD?s=)4rzS;Mb36LiN z{VMSx6w~v;U+Pddh~|R(Bj2`$alVJ1R}+yN9kBJTRU_a?7;BOgRT|?Vy z-fZD~xgl44wBUAG_}h}L&ev|dJvrM|xn+8p^TkCfc9y=nN=H*I%)E_Ud`RN?uqr(y z$dRPEjl~7f_Vc>C9Ad&0Sf;dx#w)bVWo10Lqz}x2d$>=R0Rw{3mtww_fcw z-(~KsPVy_-Df;Vb5WR>0VYOxA#zSAaDlZOBb|hS@IC>|1#nFM06(Vv?eg3&^nFeR?cvc;(^&nhI1$ zWwtn_fPg0zl7m5()JasKK+syL3gv>TErm|f3Y&pU+*}l;pGFHpfz%EJxM{FmLigF( zkdRWq6`IcuU=7KnIO=|hjo?ZiJ<_Y{6T-MjIAHUj3hCwEtCR`q^ZE_$buL1vQU8yr zkx4f}15`2^AhkN+jE4~p1_dY=wSbLjLjc=>2huVEri0wfrN`%YHA6mxWSHJ((||BK z0p9IzstqQMN}^1XH+#?m>5~r7mQ9l-9Bem=k-VAJmYmF`Yh*y~vw%Vko!E+C`xSr5W;hHg4(?>O3!E4#)BmR z{sfi=g5Opi(vHRpmj(rRCM$X`2)>>h*__t)_q|QpYs(ddachEDT1ga4W0DsHENO7? zoPRo<;JaGz@1L>*H(!5i^Y^&*rRB-?v{Pgoc0Pw3u#dr7Vo-4@B?JpCuYi+bLQpPK zdoDlpwZs38R0G3$yO;4wKTTcP|C&lvyOFz3Xl_9I{tO6e{*a zvF2|KvO*gYJL30yYB0+C|8ZU;6n9J5NK`pFZgEym1j^!#P2d}Yc_k~GyuOBOnkiE_ zG)9ycwu{;dJm}?xnGheI7mBF#Xuth&Yw8chnAz4OPkR(rn(LS-~yO?Ud zs(f_fwo8kzND#bND(h_a9Yi_Hq6)3)$`e6MNKw@jmEB&a$`!$P8uDn4+AKHI`9%dveQ1(QE9QjQrigS-7o8iF%Mhb z{91lGY~#$W%{OM}lCb>V#);gE8>e2m)wg~-IW+Zr$Iv`Lr5 zWntNZuITv>th%kTmaZ0o1hLe_0!Afdlg*QB(iv}Q0Z0yWZl|Cd7J}5oi)4F%DytG< zJfCUsCbe_nFv=EGeQl~sQZn~ zU{I|DFT5_RBMiHff&<(nGC_-@Ywf!SPr(}a+NYW^{zLw@X3P`@X8t(Ize70V>GqXS@0!2Fog<2+6AD@>j zpWBO826qsO2*b@hP%ANoEg zFxRNWBpPrH;9{O#=d=O1Q5VdY_Osjm>+0xkxDG4((zlzhoR}b*3|b& zXU5$g)1M~N?z&dSd#3k9vEQ=_BaZKmh<$uv-Lgf${<~#Hy?Oa;(_QTXyjvww6PJZ> zI*5f-u#jMT1>2Zsuk}%beIfcwj402*b~t1{F`lzj^6$yOcF8nr6Q3$=G&B;nqbHM=hSF!)cacFaclf4G?T$$7)~ z{>lh9(k^RhPe0fjFcRLz)^JWmJo1XGf$83l;~0Uv&4+$I)6Ddx{Q{?4ytTVIr8^+; zE4z@F{*r&LAS8>n3#;(;J!c=bWy^*y_ubA8ruIKwaiZgQs&V6msV^hTkIwEw-I`T? z{`G72$NBmb@8@;4&IpHQzsKJE{$^iT8HHD9j?y7eRPzN6%R)8>>c#f)c{TIJF(OqQ z4-4%+4~bwdfRnbQ(STrHWGM$WxDRTfIy0h5!)#%-0c>04CD)06OVs@UFUkg^fgCR7 zpph_On%AK^JYbxOtWpzre>_9)Bu`Gy1G*TR^+4v{R%bn@$`uPaCORq~X=HArHKL2p zQ$Cz$O0DL=G|?8+zZOaW)&_v|yv&xAAc-o3=F)aCNP})dC_+c%pBh?k_p|Pk3j5Wtbmu+H|MLPQRm53n)PHdreZ*{J3#a$L zA;HhF=WI!FlsLLVWJbsiO>j_vbLcTjh{jKsz;P;(guD6$L+=d-l)C_2Fv>;>YOscC z5r`7*c#QH>1WM91A6I2V0{3hi+Q5cug`7qa+cjXchY#?F2Kr4oz#_&fh? zAmijDQ{#L#u=%jaHT&X`91t21@r9n&EDyRguP1}$N^|4PFM+jZVw1n#-s1barS<*C zu|=wy{ID=)Xj|Q44j|^N0148hdu2MwyaD0e;dmNJeYIdn@ZslB^7o0((%1uw9S8D6 zNd%osD0}rX2R8;fBs{@^r2o?ke%pQIV|rNHo4%!k<7EQh?x6L{f>skso`&cR5e|;F zFq?1Hz$Y-@ll8=NUOZ;0d4UQzL~0tHdU8a@GNGh{3W`jMkd`8=7LFHBl0!{j?Z&GD z+Qc528&T!Jk6RqzVp|U7b=8n^?UV8_BFK8>N zKe&s!m|tzHEA@io;;4^D7=F5^`bU>N?ahh7mVWz0bL?CdifWO-tEulA z*Qp2tG+tB(?W0pbZvXB)sL+a0m=_jkQ`td&gcrjl*eYBuITpqiw$mTl2X1B2(H>-d zHM+`LX+uEo>WW5b{(4f0*=zsuM@0GZu&Gy@E55t5P6%43maG`RUwKv(6KSF(A$dO}NxVu(QS>B$t4w98h5fDln zMRSQ1pi(;`1S~3PW=QrVqeX_92$Mw31Ib&)BEN8Zaw^&mh;0e+ku5S}gD5mXa*o(z zbpY^4dW%R+(Fp1x1SvQ;fDR)#`a}tz4jH$_KOH#L-wXDFsau2SDr8Xh&(k4bpbmqL zD$m9@m~!+^wn|&DXU{;Nm;mw0fNjHFCk2`n634dzAL))B0|pfW$a)Jw(5Myx-BokE z5SmNvqQen-ch&m&@sU!}g=3#q6v}Mm5g^yH>63Gy!q}{mXe3Q%W$tLf+5X-Z8-uq_ zdaW2@(I@RVs6bsInXQFXBBsM(!mzraT>$_s&&~@E)>kkeMo4VB^LqNp0726NxOS6k zJ)R@om_RpUx0pa5n)?r3U;6-Yn0orh4gN6&{IO7B8ElrLCsDcd6 zsUm>*G59|$I64<7qoBQxWufUuHxPLq@35kph(K0g@W;73Dgsu~8k`(KR1kaANf>@Q zvr19r_vpR#lTANYb-YbwoZS=VNw@feTGdg6)D(HdhoSOF0)%?8iCBUx;fdoJA4i~ZIKsgd_kH0OwrFVZKP0mw&k(o7TH)%WUo4 z2ZS}}?aS>m2fPM)9MTCqh8+_+7tywwuM9U&z@^CZV{#vwKU|5kC9F9YB9WY_ZvT%XQT!y{B{Q8S6g{XFR}~l(L>{sS%4EmUGe)}0HvE42d2)RA$KBMi z3jYry6+bQo!`s58d3+bSC<>$!9^u}o4ce7hl_f{Pp z$?nTyoHpOJ)EtBJ)~~Me4ywW;bIng9uPwjvI``g+Z?6_CpZM$St$X1sjy<$qk=nEC z^U1C;-;QA=K6Ob!x5wLW6P)LLwUsdakA9%CL=}F50WOv|Y$JZ$6bTg2lnfX$^7W z--w#WYJyx_1>v}9g#o%_81Q;m?tLIB9Qg%D%y``HomC#gO+KmT66qvG@U zlRsncW8iK>UXEm&83i)&X8yzd-#hQAQuo+tXS2!$k4e&J|0#Q>mG&QWxRNoD3VmR{B}B zB)vN}5deON0l7mKn78Gir%9NEm9R- zZ>ntl)_G&nWwvlbT4$6iDuM_ssw3FIkyo(70L34bhqs?hVJJsIZ^UR{b@jlS? z?*DVFuQ!q4#*5~KUw-JSvxw#oL;ms-ZimAN%k zJvI67PeVN$_XWnhPi2$E~{gU9qJ#xpT>ZTgK~axBvM$Y1IQ)|LG?~ zKS15=e#PwVYf~>PW*UZ4e-HhtY@InTU1xvyQgcU^g9Y-v@9tVx7j!OJ|A0ZQ@>nNQ zDWiG%+wps>=4-b~WVl`731nmdE!+WqjyTVh*sql|F@Xr2EvhcaD3T?T>6`#0gTys8 zVgPf@J5mcRXJp6>?nV&f^ChZac)#R_?}SRU&=@1fB~mME@?|NcauX$P>b8mbtkt`&SfBKJ!UnJXS|lV))2duw1%+vwm~0W4xUN$tJTlDzJ6Et8812-DqNF zbPcfdRFHSivYnM=uP4Jnt&B<`(O0Ze{WBLlDuEDP%uE2WkA`fS6R##j zk|Slugb;(wCCr}yLRv(IOq4G(jximIiK-?of@lipgb6SU0WN-twZT=jqyac)Il@d| zF&-Bsir){gg#}#n?~&QRj?SQOO${CWQj!**{GMZ}kkf+bO8L1QWi|wfRZizck0oKa zCze5H4;5L)HF~V!y+1swZ(A`_wBYlJz8FiV+MTCZCb&kWz(*mh?jU&PXV%OQ;TQMUcEO-QMMNvlW=1TAUA@JPs95f!j9&ZNGo<5Q zVp%-OyojoI!XTA5eplB2p82QsL(``Jxc2JsF5cNGVqV;bT0BS7rr7-O^1JTx}Euy`|cx`lesQ&Aac;DhcJaj5hJc*209wd9buWr1Ah}m z3~V@YbjLherM4g2gUEw~DU3Y(bY`g|k9CR0vwp82d!=X&+UHY>?bG#6J;%QMdn@+B z^^vwMt^eve2gg^Xj<5KAvGv!w`Ws)%oNH)-Y6u38YJM{-qPXtZmznOvGv9vC-2FUt zy>-gC<;3{DwAbZ_XP%X}>~gC1fTHWj8YpNPmHc>{r2q9 z_Ox;DRVTmiS#@Kq?Cp-!fw8-<|7o2Ct(L8=?*U{nn|-r2?cKGZnT?+}9_jSTlc5Iw z0KGqlmSz?1j6>wDl<-gkd5Bn|rH)z}#Rak%7(+m52ze z%z9;)pP8HZip*B%D^{JtgQq%{M39WBWEodQM=pcx(_)hBs2~dcYDDV(US%GrGJzcB zq}o!gAd2=8vhTSJHyCRLwr3X_?aU-l{MwWWAO^21^Ph_$((PSbAQVMLrIuqxj4Up)-243Vc9HYbl?`Wh@ z;zHV3D>{uv5}0nhz8qRPy1{h9oA+Wr1-_O^KABA zmsv_g+^f|N%-#1Dpt?Rvdq9@3+0{!+GF-W2Rj8gxX4qPD4p9LN$XE%;1k8tk^CVkU z_)y}~5G+;YJ2V19XcNP3uPe-aR#;?85Ei*-RW$}_&rs2WXtp`aGv_A+1AfL zKV2Ifdt85OG<|aDE$C5m&hJk4q7cI%3)`B&MR^Va#G8Mgyhx9&NPB2jzv=VD+8q<^ zb~}ldt1G-2Nl&_w?kA=>-RVKlT5SS$|?;=yyfy_xh8+-yT>WvhY-DNm+SP+Y{EGyGbY{(`##-G|*D5~P{^80(E%h6+^%qC!#V30S4 z(McN_$YP1FOTg&xXM*aUnGva5J(p`FTqFw_Iai}eG;tH3RdGRucOh-RkQVnGKj&GI ztc(JV=@Vss1kjUpS@t9#ctaHsx3@|R?tDr)8dPixWB|nu%!9jpgUd~lf#sUf0vLAr zJPSfHGqfrZ*h{(FT!aPfZlsMsNk{ep!MxRYUK7Sr4I=s@%D*Rv59 zj^^?(f;?UTCHKCBSOW=CqVSInf~h6USi(b0vTOMsiRU}@?K@R|DN-98k ze9SO&|K^MGnXv+8W016N&}5we7EgXZ~tM*BkaDh^fakCKLu5yaup&XJ8?bDNkYwzCN za`WSLy9*Q7ccea+uG%>I^uWzmgZnyUOoc3?5|IwlJ z$uon~4^H||-)^}z-Miw~75}NLhtq!D`rJCbYx3-hbL)}V1^MZ_snYX7y&?F9Xi6yb zdUe(FqsB8AD_Ta{A}c0;z1=ZUvSX(4`0Tq2$19FMcvSD-`PZVP5rTB)_+zH zP8@nWbGClAb!KAi?21Llb}ZE=W-1SLWZ5%xrU}^lRuRSDb~+KOY!=@ZVIzv1s(l2^ zwLI&BOrIch`Z3TD39Js#FeewZWrP7jI4aC6DAH5ua$JfwZsDo0T~KPxe_r~6-{Xn?{g!Kg67^xy%I`v8Lkv6^iEIWt(is) zl3hF;^a4QxF+@gruHy1RI>jUhBU_r0tx?EWi<-@bI>fN65_EU51;HPIZPQihGbTj? z>Nv`?wgJll8Pqhn<_R&68EZPRoAkmKc6CO>dTN;sGFU0%QsNvjlY_q|+>vW-heveY z0xe!Bqr^RrXlc@lTJwwayU?bjTqe8?ct{P=fkx&>$v|5)y)nZp%psPcx_V4zJYdjd*XN`n)24?N6z&!uZu;TJf1jTmOkXv- z=+`si(t0?M`8+sehNenVfY#`ni4& z%=W8Nn=CVpV^LXD{vOO8Hk%1AH=KC$=u_(Zwf{d&XCKe>{{R2m@AtV#6Q2lm>d>OHIDF59VIwIzEaN|GbGAB9%*K#{1_Qw5u z#?7&B)XnVIocis|`@h6qJ(s%{12 zd#vW&xH@cQb$|QUtia2kwl20V5AR>}RJRK0iJCt*U0FqVeJc%TyspfcMy*Rt*UoDC zMy|XL^h)nW;szslheM819DQC|zC3*3@adRqx)_U1teV{GJubYv5l15Oa+{1Mk87QQ zbo0Qm(lgH<$sp=}^Pk^0(o@gh!APO|W7khT&(Gxq-28`4edpBQzq$MbqpzutU{1^K zE>q(0{kabTzv$VcYof80aVclEzrFwHhpeOL- z@lTVssXu)>ccSIF*==yi5JLw&Ge2$w){MGPQ~&o}Pi`lH0r;B(Gn?VWAHaRaVh2E#09tnXDQLLY%@0L7PVu!D_FMPi7*3oMjuxW>5OK%+UF=C=GoO-n#`sYz6UnZGINzE(6 znaa;u;RHJQ#^%`alRd|xe>(Ep-+y*K5R@`_PC8X|B=&Ap`Sq@x znumvf7wy|zlH+uJGc-Xq-QM-6_j>Jh?c9IX+<2C<*Qe>^Uf%%on0tb|$Wt}Wzf#DD zf7X6+j(x=Zz&_41ss-CjYv@Iy{^|aIdaVtPti5ZvGP1Iuk!TC{N|Rq4_oE#-a<=xA zjkh2B`HSCU;)YeCt(D)$qSxur^vgh`&4V(zcpA0ehbL))Z?0QC#v4n^Jh{`N7`X{YO|H|F!RG)6w65tv|f) zk>O9Z`(7N0vwUG))Opfa`-R!jv8e6NMK9cTUwc||=Yq$X?rALe={p@0?+OINLAnvA z9vENqd-i2LgN`&*CT=UdYJ16}NUNl5=cbcqqW@sZUe@|VLF(NS==G_yv_gHC5cY*< zf2Fss{m0(Lw$DX@8Q=dg;6d-sUM#KDC^FtIEqZdV=VSK9H`Q9J?3^p#vDf46l%k8SL445OJsT1b&rs?*!`sMbYXkaDbrnG4nNI( zG~a$E_odw)!DjDYYksB7+*MtzUP&fN6^Q1n7MP$K(X=+*5eBanJ4g zR~QId`+ptAc!qtNjQGce<9|oTWKeFw9AEsePYqiBdBF~j^7515)owt(zpG_z=hZu7 zFEMxs+>ftn?*A3n@M(oSGV*1qVJc!%cfP$~s^Hx=y1v%!+}z{8p8Ueh4SsGGX8FgR zEj80;3jTfY*p?=7c5F-H`}}!|fPjq9^To z^afgDN}CbL#hO~-$xB+r@&K-0uaw(@9Z->p;|9tMK$Y!g!FJ}yAD({gJiq$#@pV30 z{RM#TM5gpIpa>05R9c!z-7vCTyjw8A}6#FM+#}h=YQN;ONc!@;? zb*K6PT0(^FyrR~vpsKqw#7XYOOF$k;_3PaJVPVA zE5-uft+-Xwr5hDp;q7iqR*oqwmCEP4qUS|;I| z*RblbC}0+rMYySHgIJs{fP^+BC54&T1&*Yz)4e`q!y8@xTjo3VaB*X7MJUIl#296G z;LI>7n$;JT&`(NmW0g!jAO-B1lSrnM$y%?Id?)@xBLz&4aifb{{4vg90fTY{hKMnD zlQ<=xc;-CNA0{+lv&~8+T_@;I0%~o7OYtZK)nEi!|1gQXhu;5}6W(d!Kws|#eN5n3 zO#t8bRzw8V-EBy9zc8Da&xso>lm)53epS2~Xq}~3uG}|W7uYZV_V&l`rc35tb2gcC zer?M;D%HG!j5AYdSJqnA*9O*}R%#IKbCqkwnV&LO>ooT=S2gQSfp3ZXaNVRDj0GW} zY7|qNX8Sew@b+Ynl>M;@j#E_v?~@{JU+VaEf&wrMddTU~){<+m;)-9!=-7tx#=Q23 z(?aCyoy(a@I865ZZ}bA2(^`U1j}^4+;7|afM-X;NLIvm|G>%Zsy@u6e2;{G5JJn|Q z1&U7XB^NTQHGcO)Fe!?7!Q2-1Ea`1gKW6d}oN2PSV`JMA+4F^mqC*AW?5;v9A2Gs# zsK8u`ft#E``3!N#HddFJQQvET6p<^WY;3L$qptt~kW4uc1ld@oPVn+1VO^xP z30I2ND|J;p2I|>7Rcj*82Co?1CTb<;VAIsV{{p}TE8P^P~c7Az`H6`yh zvuAnGUIAS8Nb(qU!E_V^VkE@f%8aFT0MhKNb!h1HS-MCh=arf3!44>R3Kq5`nvpuui~<%Q zL(F$PgdtXB!G@>8GEOVLB)U{m9;CR1#y4=1yIvVPoqKG7!|4FZMy@^e%4X%Gsrs_! zTlj^H@9h4CfLo)9QF~5Tgw8k)IuJ_vNIRinz3{Ah&R_XKViR#fLgaggrZ2kJXMQ2f z&8*+5^SN7YA`O@?8QK2vAxG+#+$afZTre4Nul(}WYW-~GGBMLA@NjT>6Ec)Ya><@` z90KI#=1ocY&n;h;WBP-VOH2-9mj`Bf6L@_W{T*f>Ys%o$0=!|t6O;(!M8sjMq zK-zdiR8%!NQd|}XQxsNt@j&i0%!(CKrjjMa^1OOMkJMLcVIhesTb#zEeWEm2INNm^ z)Yb+h9G$P1>Au*7ibf`9ZDmj2l|Ld@>-WOHHmvsyETg>E7FTa(s@qor+ZW?+%=VTU@_qLU zpKdepcL=QiGlDu|qu5?!)6l>3LadM!#sHpnMH6l6NC>P&E#fgH+NDo)81dpw&ydMO zt>RD?jmQj`e<)|h+Ok+45@N?5oCJ6a4x)`U%@(5cCdLqKClkl1?>k2B7I7D|IwMhq zK(ys}Bg>Sd$;ALIvCYGp+LMRn@jaWsd&EZ!79i-jgPs;NG5Z#FW1}DgHU=sz^BAW_ zSutVSO9#QFIOQ@*cH^CF~0@v?+BK69k%`Mp_vmHCD~+a$s&P?)?^wcBb45| zm1uu%3rX3GA~H_I;CMk5I!P1Er2(gbBMHjU4Fcc@iz*IPVw{y^@d`_c7M(r^bYJ{I zSrr4n51&Rajwa6+@vadRD_TTYL$6n?0BXioHH-0Bd|9-OsHTZu8~B9ryCNBW5e&Oj zEg~b_N!x+wIbM+M8zvzl&Ft}dXua-js>Iffjlzt#KwneSki5{TXS&m)@;sB&AA?>{ zlDgMExh&CRT(BHEwy%Nm!rRZv9T9lH!@JM*L@YA6o1z?58ugP?ZV4i$M<+f!om*_{ zZeI=m+L(zj$2*y9N8oHW3m*(}gLB~s9bL?yy=nS+zH+&5d`;jreZvZWVAyR_#bLnl&oZCD`w@fW>VS^-$+*`+NfbJVN3kRbh|NmnVWnk1dPppN(JAq% zy(MtM5R#PSL)A3_2rDYB{A4}Ry;mBU8f68Dj2VAvC^gwv=_Z`rEcJQe5hwU?_0yfH z`eLiq?@zAuG^DE+mT#Wdl+8Y6W(_JwC*7#y^n88~F*>#DMER)eSa}`q>z~1%>bs_2 z&ArxV)}EJYuGghq`5*jDUTv|Pn*<3f#HH_hQ%Req>-7!X>7jGaEJ?@%FYa1gNte1 zp}R%>FTIIILM#tcbkB<2kF}HN0;#*cgWRl(mr6a(It`@CzbuUb8lt zpEulP`1e;{%X`9?dhC}!j(9ELyuQ|3l`gFJr>zd#XToHOdSum0v-)=V?fRe>P+ow) zG<+|-G_9$cEfiAe>f5@ZXXbkY4ptyrjwi5q?1wL!EnH2~O0Cl9)^-^Dd1O)cW?03J zD$Djj85QGI+gPn|)A6NSHWM8QD7YyVmi`gDOQPY}H^Zw~Sil+ZeRorfqC0_!lbvPG zd(!E%5v#@dNm(-37CMl;qd3|fZra`sWG{G5BbAx$+`pJ;dse!*Rm>*mP!d=kc@)oI ztd-QAU3X~a+K97`_98IMhAc*(hhoR5^#H3?3s%RPO8|n29Z-5pn!tU51M2Wlbi&&+ zU}1@@^y9EGG?5&}?$TyFjuFYPw|(VQj_LEgRc&Hgg2)3lbieWUFT`Fj9K>q5{6db-v_{mYTL*B;kv;>GpQC zM!~7#k;ltj`ZpHd8u~R!KmVG;J{&kncs5BlfaN<1p1{g_U+!HR6Meq#kPY7S{7&`% z0bJ1o<13bZy((OJ;K^FST3 z)TR@Bqz1$jqplTMf}qCWhNh|XPk}$)XjJX$uR?n_E7#;k_QQwA=Epjzp(!EUmWd*s z5q~0?;7*T!D$9@mSQXoPrvBl=m0-={+tf9FyIo^YX$vK~zOT{Haqoc9td={jIwkDG za#P@1Py5_WQ_axV{F{t(!`_G%q_ar(xVBU(kEatzUCLw}J|)KXrfesN(J6ZAauV6s zXrevHyv@NyhLHG2qUZN@lkYN8t@EBym7|uV$#(#=KRwrcq}qhuGx$);WZ&x?JWK0F zUU8Y|08$xyx;sjlpi~+M{1!fKZx^`u){mXBa8rJLw6Z$BxOkO@(Ta?sA4aU$CiXw`tg9Z9Tt+VwqEgep= z@dcjjOG>8_LzpUxpRZ?;qWJPWyiF-T@$lG0Rd7NrxYiJo`Spm8GHq)E>zB$T>O)}W zShSaBQ~GpVI2b?)}b zO>SX$IFYJN9>r1=BUNh(a8WuCb+)wb)du!u`u`=4J1RN=$)m&Z_8j*(yRr89x+1|c ztw)>83UTV}k_Q~%GPH28!jrgh)B1A>It&MeB`k=Ze|$IndBKPhz-v#mm$b+th^U>< zI@u?ej#d?BGYnu4uw)UqE!wA@Hqu1=fXGpg@fz@+X=G8Woj*6w%zxhTd>P`Z6b!SK zT(L|2f5@H|_<;k+Tn^S=IUzC(-teS%16Z71f5tEsBMGG{6NtLjb=l}>Un_1 zQf=mV?}n%s+%eJf2p4NFYPFJtLdv>bnXnrp>1egHS5m_iM3M3|gbN-P0OMsCC}Cs1 zqFP!YKiDUEtxQPvrS3NH;S#do`Vc}xif4a;L@`=00%&0edlgm@4pnLPRQ z#lzf47V~CD*5Jc9+T+dLJ53D2{ya`^Th)2H)~NY2&2w>=drqGuATS3LJ(W9Mzco}l zTA2Ws9my=@@#!yJ4h0)C51je_=i689tNibcncXK|MkTPMy|0=)P%YF!jE>0-I%`z7 zAxu~?{_ShGrYNm_J^JGE&Y3$Yq4SUZ&lROC@T?9+*;fs@Q5?g&FZog2tE9%j`;eE&O8#UYnqC?i=^nkJ|)ayENStNw?Dkwm$zoVO>0}>*H`(%Sv8VRCy$Ttrhd_`@s`-Q zM`U{|sOjHvUXyW|@9S3oCt6cbmp1N9$WCSYQmGC3TQBfh^t&X^G+XZk{6wBv(u2JO z`m~Y)2Q6OIjJ=zrHGNtOS1Nbj61`n*+YuBv?|4&KhAz!EM{@%LhSX!OwPxkz_R zsS)4V7e(&a@j|!yj_}zHljIWzqwAC4`5o#_c2N2Cv861Wd$y%(bh2%|>TCb>(886m z=*;(xZK_B1%e~h!dV<$K>n(jGv?*-7zA!46#zL>ryJ8yTgs@2EezZ~b!ysC<6Lr4G8$}ftqj8L3pkzxM;b)L2 zW-S!}NfR3xhB7mSJTm5#tu|RsG|N6};@RKz0S(YDFbhXZb$Kdv4 z#n;xBrN+r z^r_8}T%jMA04H5S5f985l3Z$zJSrcp==_PB%_-n>ordKXLeyB2i;^lBy?~5&bRW_U zUwyi;E^M!|U%m6E8KKahRGQf9KRt1EPXygK%{dKK8XKvcmx*)o`TA$U7x}iYm;`E8 z8(t5r5pQAYWb!>mwNVN6quckr4su1!Ja77~Z-}s76$q5DfuWZ2yM9sB$)_@l5i&n? z)5Nh$U=^J{CX%kio5B{njl^xcRlGz>Qj#j1wX1JUi6qB_M=MMS>X)tiMqDh(_0p0u z6B0Li!VNcAIAXxh#oZju>atF4z8%GPJ9uZ5+*iyO*pw0zFeXJxku`wpkhfyhSM4T>WL#6y}3g-&d-C zt6X_Hd!q8xmvhu2Nk7`HQESI0M0|3izTK@Pd}wy)d=X3NT0xn|=+T9)CragW?~YG2 zcj1E*C<)Z&+l8aNdw#^oQ%0YfC85brTY}2m-$&ezBX6q(w)}!EmZTRwEffDjbKNj%i^K?v88^b@|w6g$Gb?;E`CY96+7NBHz@FWmPx5Kp3>ZvOML+@f(+a1 zbprZ;AU)cOE{j%IMJf}TThD8O4?M_~i5DU)Z#fVc5cvT(ScT?CM~(03Ixc~@QyPL) zVS5{;jjFa=0uS4=MW#Qjb3cMe-~L@+ghT;JSv{tjPve zv-BsDaghml`{W(`L~mC55vTJ~R7ByTHbCu1wn5NNcY4;kONnC!jVd=8srt3lXCO?# zv(odi_JDSKgk9(Z?Q5d>YTS75eObX1QF^|66!IBXUjJhaAejv!4v@w9%1*fjf$a3`K>(oNB&ZDy95U`7+6?ZZBo4x%9FD4j zqBbLsbF*6;W3pj};jAxw5+8 z?6<2k73<3I$>8-{Qy06k=taC1frZ`WG99TQF+zqZqXS-klh+y|<4gET+J3K$|G9A@ zdC2y9=pjgho%_y)4q2yih}3|H5xH|-g`A|MHYY!)@{9R%{sRdZJL1T+@nhR92)ozD z#e8i2Z|tFFK)U17P&Z)hywH#==u4t^Cdx?|V*=trQ|t-4vvUbfFF03zPB9cZk$ZG)ooqBM;^bq2-q}O!X-weJ)1?=Likv@Hiss2nmkd<5|9ps>Jq`aKh@lHpip+Pmn57i(Jh(bG~A-PfU|He@}B5w#j9Bf1VKs9I`@R$s^JzsMm9 zDmhF+W-=m9aZ7HcORNnz3@chui=pZivn#3y&Ra+IwqeEl?)CTKa-aDwE?<5-&hmWZ zDI`l1kb%hmM<7FU5ge?gXvzHUbz$vg zr9zXW8#Ip>t%q}sxHu-8%L_on8R2>!2$a9o1=okKJl0!Z&inv3 zP~xSBvd&54$G*dgnEQs?N5oRn;knZzQ6q~P6MAcgftizD@BG3idXor7R`r8|X(TbC z@qyF1er0YKiB#SpCwXLr;u}JTlb%mM0w81~-Nd~-uHGg1Tz#l*T6YINx_XK`dw>kp zBiq;5^GrF787gKE*6NN#)g*?pj_~WI&yC&Rd`svH5NzSgpOOVmERm(T-bf_AVsd#s zZMAnmqtm{AFZ1oAzI(-f$vcS6KBz3V4GH4}(pf2B#to_5R)-yYbJHsyX4}5~;Wcxp z{rjPtb$SwQz8rSpQh5soz6i4r6xV5ROO_#?Gd3~JqS}&~p(P6rzY+o)kT?uagX!CaU`8|8j zrSXOIw?HsmSdMN7g6XHq^{3}G#o?dR))(8MNi1A*x%~%!W0`(nh4H5wv!qM8Chk*a zf%zl>aj?Qdcc9j?!NV1U8%QZX?oYb^GO1V1N=h!t6>#sycB6vJ9Tc1TI-a-g;17V7 zWQAkc(RP}5lSD`QNY@u7Z0~VINw&~%yAoqWqyZ|508z3C%Zwpup^AsN2s*+CzLfeS zflgciP7+DBh?B&1So=`P*{kbtKQH-%+QX*MacM$#sy4$0?ticiv-|&B3IakEMiK}1 z1L(B=f@?iic@N}SOH6F#cA)Fvm}u~jikqNs6{LZlL>xCH9;R*}dZB=%z4YIZkdFf_ zsu48lPM>Cvovd5$kAJAHT-w^Wvpz^!>pMoGkUu&yAQl;9qV*;q5?{^4fu|L1X)J_e zWCswch*=JjfE0K{V2IOssL@9Avs;}Z=h!U*!A|kVZ(EnRRKMNua(e1*mQd%-L)(KG zzp$AoKaB=QyBP4{DSbUJ;) z{7{`CGs(HFyo=umxYyn)0M@qe<3bbz#m+9#HCw){oq{k4ooqgmu;9# z&}p%FEjMYDKIihS`v=zJ*XJ`k7c)mb^t^)OIh60+*@`sk^q?WgrL6szzkRDrURPw! z!N;edj5MBb6Kp-rYhsw|2}e7{F=wcx;uun6F`kTY&JEzpwRK!u5@jUu%Rx+iVi3!p z&#G}$Pd<%w17OnwPOU?E6emd{De;%Rzs*JuIZs=5Nv=-Nw04y7nZ4}UDh0J^GwwWX zs3PNY%4$EzT;a>3?H`|Ht{_rCo=lkjh3h9fJa)gC8(r2Cf3$H1i^B;=kvDiPCH5Jg zqu&0w>h;Mce5Kg)$7JaRO0!tLpUmpJkaVz{WJH%uE67g!?0qbG!r9w>?5@N_3IY<4 zpGn2psX=Ag4;Tj?#u*%(wtqA`8D{(WHOER@?P8&>~p|2UGlfY_fgal_oz zCABteLPo~al~3<8{>F^HnY90Og5@ETGDH?*5a^>yOWYBwdUN^{7H?{^IuYH2RCO3` zR(Gj3J2-J}WIJ5v`D7UuapX}#Lsn}vS@DRG11eGaaqbh5G6Bl5Lr~vr!KRVbN6AnI zQJK-K{bj8`(*|3SB99bCTp@zoRn_XC7y{S5VHMc~1EY{b|GyVtCn}5Ku#*Ugx!pdT zCo6VlHnY-I%0WyvZmb2Aa_0a`6$fELGw@0cJocR>kX zM<3oD1lHrlJUAGb-fFA?aa`Q72kyCbcH>Je#8zRC!$=XYr$a8i4XXGQniPgoRd`5H zJrWerGhQ4DrCXVJMYQ@aVi+w4E-->K?Ty@`rdR_F7QtZvTD_Oec_2Ouy%w|+vGl8~ zCYd}mDN;EEF>f+XSsSUOiUW2lJ3SPSWK8de0RXr)RGr~^NUXFA0r85o;RSA{;}lb@ z)kGC`!2*}YkXaMRVYdDbAn=7Ls0pI`TQ}j*__Q7)_JhLgtik~V+1!cMS%vOzhN3oQ zns%7mqOSyqodKDc8$Z8gDpw&g#BF-*&ENvfI+2R%xXOuR3PSt;T5O+LI-4nnv|1w{ z3eF^r>`6HmmLmV78l5U-Q>$yERS&vY3}`y?Orc_>uk9A&1&5|F!OWxVoC*Rq~?~;y-!50rUoB~ zXxYi@>lkf5-WWs=E{zL$>T>6F#BLv@gpH33u?`(L^YkIB?{?RX9X=03lhgEfO#Nrl zh$^O)>kbqTPH*oN!;W%G$fkD$JEo#HkugU~5q4DpeMUhac%-mr^{!mT1tlT#ljb}7 z?fShd3oY$6byL4sby*P9+i*JMo+t{!0Wq=@QykQro9Q3wRP&> zk`ZeKyY z{qpDArMB?(rA%dT=2GR-QuyjWG*ezb;?|X3>!>R;mo=iHdmYES*>xXUMa3S%+}b*H zXkdQ@Df%nTW&a1aR5@v%#c4rb?_P%E5VfYt0wvt$aNa^2RNW-_sKpSd7h#^ zMYdIq`Ex;jSazBx{fx*9fVWsJeXxNj-}d0BqE6$Z5~?H zGA;JTVS^?^fev~#s(=EynFyhPD_3RZMxqTB%&>2mFa!HhafSEy3UcB$a{0g*wsP?vK_^ip1C~PP5NIX+{2( zY0Znb%YNU_wpXc-2!%8CgosCTyBoALqu~j2N@<;g?--aH^m`*i%ZEB~sZl4!YE%jZw9eWqCFGXFYg5QMx00 z4xu_WI(+t95vncI8mScH6o-?;o!Gp_n7PSk)85gkgO-G9mu7r!+;w^=*9}fU%h-fu zs4sWML=Z*zZt28QOZ%tb%=t{!0Q4HE*Y;n&(y?dXs&|l9h4zF^hWH^dFXorY`LUl5gkeU`UF~!+->z z`3+E|g6c#dK7HP_Q#k5mAZ0feBBTLFi+|%WrzqwhWnGxb6!{)J8*k>H?;3n+?xFHu zLVmPy&5XxIFRWW0~Gte8)WNO|FsbRj2&j5w*kc-F1H&NZ+}Ry@@sxzM)YG8Pn6Pj^T@d5Xq8;$AN3A_?WnJHaPO-fS~pux-c^#_2-_Y-a=vV8+0mQ7$++7TO-rb4*4w z2-JL8>kaTafjJ!LfEX!h0h;J_L+Ggr0;Pt9tuz4rs?tv4&Y1=ec7;k*V8D?ny^+0V z!M1lOA7NEOBlQ_bu<;OPK`+Nv_1HER=-Q%I2!&7JS-ca=@1xgOZEqmdW^>P=#t9Pi z3e1$hMLdU5%h(M?l-wMi&$9vYY&qO z5V=iPtJ`Us_YDsg?gc;dS3257pU&yU5C+Q~%9Y84kzG<((tui#-1ftHU6%R&Rp8p* z?g_)Gi>ZW2s*#a7fsP~54!?LV%VBX6^$k81HDmgug~GVv?095RY?xmQZLnPMUNw2J zxt_;=-c-(s>hy`ALx*Yi8#v*;>9}agd#)eCWGv;@OOjtL(9?&UkBI%pPO?fqB~M;| zyNb}fwAajqf4{k~>SlG}q@_+FT9J$v8se)Sast3P;$AniV(%M1Rbpt3a#E`FwCC#Q z*|v45*9V*MrRuh?=BBQ?%BRSqObTKIx2xK+seol|)KTbL+a)fLGugj+mm-AChaqRr zNh}dw=cnvxtVpts-s|XmHeXZfbn%05f8gBmQ_uF9mw&W;N^ObQ@wXst7D?=VQ2W;# zIsfsmvi?n5b<{knfINS2TUAJ5!M~7s_WzDgkA3}V{`X7kZ|BzL=pW06etz}1^9)_c z4rnQ$9~cARbf-`p>O|!1L7+^0YXkTbGCP2N#KY}P(|;F?oFoc zD(U&m_wJf5!s^R`_1ot&7x|t`SFdIK_>vvAfB(|Dp69nE(@f>H^>^8xYg2(43yW1! z2%`8keJBD!(U{nFq?yU6hQJpW-rV|gSRYHti6nw>{0GA(jiUptk;0w;$Ma0yld4u( zYusUNX=#*YgI(T(7$YJW)7EP42!K+F+(_~XXb6kYS7tD{rVjhgOSBmy;Aq7lvfD_A z+EJF7MY70K^F{HBKhWVZwtDKeR`a}Df>x^q$ff&4@@ek~k^W-rW;*vkGP$46O;bh^AJ138IUlMHWK{14+Y6Z6WUo#hl{uYk1>Rkwmsfe}*Fd3(%{etk~SZmNqI99yhs?NtT4{uGC2G(8Th~_GMs- zKhbo)T}XDKLri}P?b=OuE zX;;Pv*5u)fJ>8jM6(lmQ+y;*`j@M-!aSuCK<$8d&9VH!dWTJ~@oi9X@b45ts!j|g& z=6JK7kS!+Y4rE>5qmxEN{xft$gl`H@*2K;yoXdNjC@xScDGAAG$Ao9;7O^KLjw=pB zqe;cZZ(n;inF0!gf3&!)c!1dk9{)rk1~sMth}yAB`?GUHwaM zZOm&Wpz_N1?zYA3_L+tC4)~%eZeP&z)Px3FS!AO@`|1}A{$$)xFts^w*!CPirH$jL z{jQIj?h9ulWAusJKQ>DyZEv(VA4-*0sfM=^+s0cPXm{5}M>NIU%Z%3ov}X}>dOvyG0mSY?Q*%ivFsSW~RFt;kNL9Ur>8eaV zy4-KSI_ZK$+=!d{*BCA0w5xJfauym{7LckobogG0J1e~go%v4`!_J~qhrHLGCC`J7 z?KnXYC~uIT?^KWZ2)FiZqe9OMb3z2A;J7e_C6iI;%VOBz7$e(^CX;bn*h&u6(%(Ry zKgQE8}By;w*{gB{$}#H z(V5}@%|+7x1X&;f`n?%8=L2X=Y9HvSJ6Y(oEPK+VmH|89%6kc zZ67_B*TUnoDKU-IPG??dbsuA0KGePxoT2erUP%8wqZqU!ZK(Tt>t!jJo}tCefg$@fJq`+rbEEh*Q zVY6Cd2A!3Yj`e-`RPyyts;>H;7~12}=6XM+$Nr^ZLgsK_#!ADF;V0`wfo)5nH;lW~ zH>RlcG`BqC$N+KZ(NPRKGN-UZSzjw_d;f;6mTDABkvKz1>iuG@8k5?Yap#rJ-2 z^bI4WXpL0dBp(X7J4(eI62BSU38hC5bGvALy6~RyCY-C7c>6Le5(@UGum$NIE))zD1FJ>+-t|{ABdOZGT@dPlCW zJFDNC$aYMtp1Moo`sGjE5vJaq>vbjV-l9GOd7~F4;kZOT&5^Vsw-ocymfFHTB-@xs zg-($-g~C4V2!>0F@NCLPs~70X`XITQfpzIC|A3ar=i&~E$XFXyC4kzHVq*JaqI#Gq zd^To%^}ybBy0s$npfv*ar; z3lJcOfs);AWVGE9w*=wp4&^M!OXTs~+N{lVgfc-(eQG0&52YOh$DP26Jj_j-CaQwE$MXW{tn_t^5W9CB%kysQEy$KAGGL$x zrONWqCMGC5s}iB~1HrVJKa$vX3i?2F929=Kmf9fUV;7E4k*aU12OHUOA3La#5fldF z4+!#MD!B8Wj#hmL3&nBJ7uOoH564O$EwDFK6=3N*lmn6Cvy2E!9S4Tsw6Pu;&JQlK z)8DbU1z6ZL>pV0R2pkn~MFme--sTN(#3|8{mW)GOd&M6*Ql+JHq)P-$T3DpLE}%f{ zFO7r(l6=qWsLn2|QyQ*n=5!NJ=&6xxGHrd>{+Y1)u3?SPKd|aOLTyn{Klo!R>?MY0 zNr>#SP-w5Fc9>m1N@9$cD?fbrF{jr)Q=Pfm{?T+T&{H#E`rgCUgaS7PW4DR&{iRel z67*zPb7r4A8=z3xpXhGl`o0t8*C4A8UupPC*Lcp{Abt1em*GPZ9J+9p!f$MC#+Wc4 z$ZE(5U9L0(4nA}@-nrL5p?lEQ_NYCV)Dat8ktnguZeTB-GV{@$1=&|VAp%I zv_VOtuSYSTOs_cn82y^*Q;o}-pnPHO4>u6qz&a61P1h&R|Bz;W&;0S1-j!mX>gH_* zm_1nMnV`^df!@}z2wl9BF zsyXM=M;Ocho^7tMKk@?Ov3G3nOIG7f)HL-#@(9+^9?yuez^4X{yU=lN6%TY=l^8TD zG4yC5f9H2wG-{KHc8f*w4wOiSGx0^$7G?KE?RR%S+C7vXhiGxJs6!SP`0DN>^M{J{ z!uBtH?$FEl+G7JkwpH7=p~@f1z>N1(=dZl0z7{@6no zGt3FD=UI%G>2WeD%KAdWj= zdIHoG1(cYr7kZJDFi^)@4^xYD$mR`D;8i=b(zAGqfqzK?xD5!Da5Lz-dYc<-xDL!9 z@XCGeEJrnkc|#)CUOH!P>qsv(eN@O#?{Nxbpb+W>45B^@)x3$rJ00AhJ=^^dcF#~4^;*OBE+`H>eahhFi#b{ zr6UnOmE_`hg?AU%+8#d*b@y#36^uGTzZv8OT5ytCZBZAX;c;mv9Ku6rOgOa=qI5Lv z1PO+s4r`MmnF8!}d|IjNLrN*9tR=3Pc7hqF#+J0i8>IHkT}pjAxBPsQ=C8Nk4`nW$ zzr22R;nJlGBwao(pB*|@LoP*dY+gs!$I#R4`foMo`v+#bRIdHc(zIr1{jFy3+gfJl zJu7G^G$U+1^bq5%KQ=eH&y`9&Fm+&L+AT7Swl8-k+H_44{;*PG|6_jO^74CPDDHz% zOVeF;DEw5)W?AA0?3e^h2@fRs9rc32ZI}}C_&hv?pOuu@wTE<=^Qv;p2+r9jhW64)Il1Lf4Nf=nE8tOK5N~05!c_Bg zAk8%kWXFxtLW=B$f0Yo=V#VS{FE9krK2kMCZ|HFSY*lOo4cCLE(=(1P0W5iWn6Tcu zkiLj$y|ipN^NNtMI$_n%NPe=_B>K?wFEs%PC1tm6F}r*$8#t+u^%+f*p}wF@kul{? zC|AdxRNwjBV@RcUkYKb+?w_BBp$`pqaa{xMqzEwn52ttX@w#@C;%!?%54Tu)|H{TR zQzbZ`K1DRmnEl(^)!}Z><*UJA8LNt=#^{lmfh#{c2GYMTO)o9c->!_C{`lkVl1ckY zcKcN2>af?>zV;=}(s*6_tdog>orImJn~!Do3$|L_oa)(8F_-9^T3%r+#8=4fSky`G zBQKOE^FB=)_jFCVJd-3b4TZi$h-*AF!o@~f z!VtnYc;I<4yYT)}kb2A-9GXZZhRRa4tYA^6vlc0Wh&yRenWZDHRzV+W(a;)PTS(vn2}JU|r6EP_lTaq?V>1dzL@Z`sfVMOk z4g+W!4ci)#BPmg3!7Pe>8G<1tD<1`&sb@J{mp}$c)!N$EfjuIV zbv@T6Q%VWLHQq=*pT}ljaBWU?9hvU9);_JyT=Dw$TjorA%9Z7Tr8%P)-j`D+=jfL! ztjwvR3(~~NG2_wZOWxU1*X-a156$}dl^-MP_6_S_G?UqHS4vrm)=SBuF0mnpYcTYb zT4~goxy_~1-k7dk22%f0#LQm0+N18r)%JJLa&YDpB?+>GgdW5N4$ zJn(4+!);DQ5$Kco&&8qjp`yJb>PC4Dc1&VSA~Ny2`0>{{bpgqtLw{kSZJ)mA$&zz~ zJ)#Qd{8kw$Ks5MGVtqgm6M?*?)iD}^KfsAIuzOt|`j}lr9Q9oMu&AkdyToaqS!vhA z)nmL(B1f>ZVs|(at?@=jq*3!vse@e@+z7@FkK^?*CrC6|V;{WiP}XOsF1)|H=f!Wg zu6ZsSzFqIBTs-0RP3?JcdGpO+rOSSXTOjGK_ANnDm8?}u2$CloF9i|5j1ytY5EG9N zbv_TFTXft?bP#R!gStXX?yR9cOq;g+7N?-3#Khw06mda`&{*j1P@WtqHg?_9dg+p? zr`vR?i{SNr;*ja3Z(qKA?6^;>6jsa(d9A-RUH`mNkug7%F;BQMGqUzu_*(XrweYnQ zl~>mHkNiZB-x9zNP1$y-3VPz|g7f)wTY~F;VT*2R`3{P8F0t?GOxN*4MWn8-o)1?Y zh`D_VaR9=va~pBoSph09C{Jj;2yqKkmHK=_AY{EIQT(EXqbqVtuEf3@hBP%??&~c&XECkhjLdg@KPK;lS& z0_ClpDDY5Ppg=i;Ei4@Yj|^7a>A_smS3|QHJom7Nlf3~9?vu62;|K$xq56zd*Rco) z!p~37>MR*CxL!T-Jv)>(+F6F8zp@h1XrUx@EagSo6)<1jt_LwW@5?3+jB_K2NOt<@ zstbAj+yA5KO{1DT+qK~z@B1!6!=NIB`H2jIGGrovq_ArQMLNP13+Us zjRpw|D13j~?z|cV1numdSu8(qr@tPvKfGW(H`+eVPk3YiPb{zk=;spL>*${aK7a92)qcr&b297W@4{`t zr>2Lqu zmi=GTzS85#*~y2T7CyTj`|*?B{$G#Uk6vG*{MXNv_PO=h5~=AS=IPf5_hzE$0erej z6GrZd2<=1L)f%d1i7;BWzK`fVgL{3jVA^jYy~oy0B{ALaVw0R_!#qr%x!u(5i89kz z7v>ia$jG4K>h)G5D_oU$yz*mY9`cazLa~tB?@itnEfJG7<(AWkq-xs{h}VQNs|9_ zQpILJ*SS4Mgb$Kr@?N1)|L4q>{&}(P@z&eNn=8eCwr#DgeA+d%skb>Dn9w6jyor39 zwKsq2Y>ZDhr$u+$=2$H9d2QggVqVJ~8`5fR<{!sQXpxVeeExdM)V9p~+WE1$xVmVq z&wezh0uH$7fg7nTN))YaA`}>`*!7Z_>P)gKzp&fA(GJSi;0a)`{b|ccY_Q!0va=@k zEqbNgU3y=(kZY&5b3r6{e|{6yt3o8%d)YndB35QQ`fRu`dAz`0AKinqV3TUai(d6S z_I|z$N-&SAkrZA5saJ7X4DxwVg5(%5^1S0>)LdpP5B_JV|cVDabk%NV+qGIAemM_6*rs@iZc zNpjY>I#(n&9P5*-Vqq7KsfuEhT5DivPNqYfaiqR&d>S5Z8kS3r%~Ew4v@N=94=I|i zAb%wq=)fgqcv;Bo8NsKdF)%2kVsI=cZgMav!^v9DXnXxH*s@Xm&uNI}mry!u_1JH> zvzuTzP&$g-Ne!dF)x$R-u_8%RIH*j}bf>Uq_1@pBf0i9-KT=QXQJd!znEi_g<@BTV zBT4eL_uI4U&fC#{`EHG`+YIUCL9c&Z|9H;VXJ#GqeV={I`sa-!uFKfqBz1_ePiam(ECo}Udfqs1n~$M|XN>4v8T)U!JjGuHRDNa7}nfaz_fYJV}KL0$gia;EOw*H|1 z+Q}F30qqZ#7ygVG+R`Qcy&ke1viafp_VP#H;?-YU^1kr;!RO+uxTh?_Z{&$6MVWNO zr=&wH;jf>a#V@2bqy6ab^DmO)XGX**`ZbH<@1m%fIY(1Z(8er^{~a6hN#*=u?(x>o zjhio$zIp$)_tOjT==k`I=ia1jpXDUPcICJ-U`f28-{AyzcJb%Z$SD(Bcp{qetjeRV zN<;3SRd-wEbwf7E>GUvsSv*T z&Mj<}ZiaEG-t`-PR$+`Qz$_RSEB$HdU0^P-xj(a(hjYf58g4Y&B;?Xj`iAK5Tc3%dunb(!ZvZ4k1muX@LabkW)VW!FIvB4yfMIEBg))KQI?PLWq z=p<)d6W)xDM8T_5IMS(BeBB1jW(p5iC?M0}8%^m%##7`e{feTntqEseAC5-Nb3(Cp zv^a)o-u{IaB8}DXtX^g!jIK~7zRZ4;%#cYU1{QU1pZRSRJsc*-2oTFE>S;C`b zvWS4xU{TxbcqDOsT$g+QW&Qq{5;QiG$wJX@Z^}1++xVyPVey+?#ec8NTNFJuzI%Mz zc`I)4iOQjEZZZB<-@P0SrGP)71jt;v>J@p#C%20p?4S9T2-@;|+uW|wWE)>ihZ{$> z=yy0QxS!>fSl3iFkTxIJv$td zCunYb>1qxv#$*O?wYsIC=ej*1o6p*cz)0lZ)6UyXzRRDU+H4dp+#LM-MqbhHw+j*< z1>MT5E`xQWzO?BkwWf6R2bn6zKfHmc{n|&R{rYX|RA=j+OLo?|6uZ4X{*uZzdP232 zezK%;jrqW7V(I1Ab~W__6IGn>e)O8qH)%+}K9gkBt*?AsPueaS+Wd7}_n_#{=S9XX zo5Y0ImWfj%>+58||2YZs0kp5)x{v(2`19J|3cJ=HUB*iCI&0SJ@8oIU{%%RSW&P0O zx74+(mTp}MUkPkZpq;Bv1mdPe*LV|ENmmSuTUgoFgy*I~VQ9wJJt#2_FCJ%j!O9Hi z31xGH=G&SBbQ97Is^*YFZff`x76&Sj0X!K59Fg;071!x{a%5*3#xJFOl&aHI!p}do zVXc%Dp#PMWXQz4TNJefw}KPjM44Ca5RNm9#hK%6%oa_o zojR%k4bsGlc%YtwN@z$>6f&EkbmAK?lDCUZX-trV7l>^IJlfFv6WdB3)4Z-2Vhwm` z3EFT7yfh)N?#NE0-!z3TSXQX41Tzv(e;Rf|*(&mF^t8bq4irr)=Z1#1rBZO{ z)i=@W;1z^WQ>$SKOHCtR_90AMQsBFxXCCZP+|C(!*G+KNrjKW(HRxj)9@Z!>+D0$2 z(|glqEsa+UXIO(@A+d%I{OS0&3i7a}kCr)pNI`{NN68(6KWrLkH9w$q49S<~RiUCZ z=_ircdWl#9{zD_JX{GRSBpYrZ*)hm2FnChi`Lt6tT(nu7S@DBUyBanm2S)u86XhS@ ztQhpXV(q;ZqyL8oTelt*{ju=j*&+GIV~%C~g!m*`(Wi({&$9mL-Bzhrwmgg9ZOFGY z#ZL!w1LY2vYSs=rI8t8yKZZkLUb4CI-N?=Fg}zVsG~rL#=sOZ}yG%)Anp`ogGz?&*>5;iz>W+l! z0ZPUrrkixmJz6CXlpe8_i5(CcE9G?jx!{S|)ByF;M2@&wCPS(s0HIW53fK>eGB<|w z_rPf?X=^it4dMC`l*!LOtqZ-LFO`3ra~l0eZp}m_ffto(B9tW4%EFj5Rw*UEGy^uH z=)w#oOR1gpk@s__4m?-9uIHV#u~}$oIanug8T)zfz$kiqO)j4n_$C&;F83{ZwxqWB z?%mr%MSqV(%Y#Dxc&pnr_|5zO_mJ_@q3-Cs?(Nt75|(g)>PU9h5^9hJ= zfkU2+H0P*OZXPu>PV@+SbROrQ*P8|&2uHbV&2n3s=&>I+d0f(jw}{Y$!C3|s6fAaL z0bM53O8+F+G%tloZ{T_WT6}EAu4!ZMHZ0k}YL3iPm@Zo!1~-gpOG;U01I&Sy9@b_A zE0jdP0=mmgli0bFC{zqfZijSyMp3Awmf)fdwGaHVk_~3``;~vb)RWX zxUKd%rp!%9QXSFh${S&=U}gPg@rj{72bPCERwWi4zparCK2s;XP&Y2DY?gq&=Z~#( zAq5YMqhHHkES2Yffk{1de0K5|oqI`Id~N|Ir}c>PmsB6#8v0BTM(R$h=rFUf_nG*! zs4spaNptVfq|L_Dpbv^b-;>WR7hDUD?5-KeF_Yb!8?kHMbI8X5ft}YTX&?8#>JX*g zWi+{5FhHrGj+}R=F{@TP=M$gW5uB8X^OX#ex5RDbZVt}<~M;F>Me8OP)ltNO7$~7o+V)|^n z&vDmpe{n^w;rf|e{DOz?^RG{z5DYk!Rdd9Yqr;Rshbv+ z`DHoz0T>P5*+VeQmpE*E!E`@rSF%6RL^H8F{MAXOSJ_#o9*42ALVTovms@~;itE|a z+y`!oJ6<t3e6md>=$#25~nN!4q8jLV7SM0iC4V8fl6HYhQ z_pvK zxyBC8C>C7}JJV;x-)syf?xKx4gbF%OucSSBHlvlr)lgo?LmpT98y8Dl4R-+pM ziIX2Nu8}HkPw8H!jF*q(vvayk67n5Szny>a&C-aw&^XNHWZ3xR%l6FpA^CHD$hC(v zT!J$~)%EQu*LP@QE0Q%~F8)=LSq0hJtm$=GN4W`Ybl+tknIte5#_eiOATd22YTBM~ zpS%Ku%+bT2<#X+ILTww)^=Y|7#v^sW*j$dS;L+!~)Y|W7fBE7xyOb~UWdDmbTVk~k znw|zK<;0Rq;>>6mi;>r%QCt(3YjWbQH}*N*{u4HdNnf35<2A3 zD`XM{@hQw=1nZF!)U#d^&wlZwgipM$%9)8np2pQnw7K-0l;k|e*Hcr>&c%u*l?K~h zWkpfE`1(FRKkaSqZS&4Nu>&takQ@};-;r?oX}QY-p9ceRqWIIec5$F0r{J3G-_OSP z5W1L&4qptX#PE^>cu{W?)8?D5d*)AF3&7>AR=e<$yO;rqDPHw{h{ITjYov&3R)b+* zz|v1bZmekwZ*Y$vSH{&0r1&^sXml~o*)RXav0zfPF>Sm+GT?mxO>a0Ry1BE)RxlUF zS^XL&0z$ECJoFm_#;>m&yNYYH--qr86%MXIcE0X$36L*VXkHCQg^}$6i&Cu*$xw^9 zB1^6`CdXK}2tud<2(m0L>KSctU!l|#9z?SKA>JWwvUbx%8-(a8|2!dBW;pLdKO$P6 z6^gbUkM4KrdO`<=qZ#Lrr?ONmj{GQI{W|xLf#N?xt|)XtW^UlkL~@m>D>M@Xn_OXZ zln7rlPw2ZY--dQ=!-qC%BQa6qvnXq76zk^!TmB6*3gN zCLDe6B4}e=3&i+FNlLXXm~e&Cu@du(t{?#~KYle~MBdai;@zt+~&MlXLls1KctncX2JxLsl#FX*qLML;cdL zrhXLR%C(*btFS~pzOI)anutONPu6$lq?**=cHxwK{!+LXtq7dqs7r*DuUOSaw=8>_ zsf4%I0wfCATiuqA;DcDQwX4}$dY3`@q=SGy3Anu~pqb_6jH0VkpJNYN5cZkb#O(g` z$G!szBj3POMX68l^)}c9OvX$vOS`2aM|ar>=|bn=l631Mf}EOB!|+7 zu6EpOTx{CRIKj{RbXAk))qh%($n`d0WqNTYO(R3B-InkQR?w!ZU@`b0>F#`pHY!ASt-Pcd1+h60@{0T zegBfkioc!aN{SwVQwVyWVEB?`%9d&58A%dliRusbjn$ep@ZQ?=`8aKtgG0d3Cy^&*|Jg$!1;q;=*5p|(z!K6kg z&m7!i7@8laZL!9AVgNY{mRw4C${+`{v%aUeaeAUF zi9a$TcQah|Sa=<>wY?p_^BzO$RXnboGZN-hSAV@w96qScOyq7pjDbaRD)}O_x+4t{ zLYWIbV9(wBX;hy&URg}hZh)c1EpZ!Pzhl^Xgtiq1<`#DP?lh+`Df<+vtZXZ%!*4dF zZT+{j&<2eV_2RSWiKzFAE6G_QH?!4SgTxrCkb7B7>pckC(o7;!h;Ikl1#+U2eCs$EW4L7T&1x&G3o_fSb}>Xj+~&`Fg68v{ZiA z^4Mj{ai5)Yq^fW9-}CV@i@oLhu*u##S-YO#7h2=6Rge*J<~=n}h5}(H3e-5cfFy@T0yGmet!YX9~x? zk9Z%tvbwvbj9Y1O4#koAw(3}BCo_T&59i|I1g%=gJc-f`-RQ(LDs-@t@MKcsK2#{? zY!ZKqZ0F5du2$TMks?&h#UJO6Vb3CkCl$6}Hl6A?aCK_+D*l{#&-Lrwa#p^nIDX8c z?!(KYJ&c_9(<$$hMEN;OsnSm!LGQno(n!&HR2D11E@*7J%yGZujR$J^{hWE2R7)Ql zO~3FqmG=f(+8Upr6fRYl-rA{&V5NX-QFX60&BQ>|`b+mRFIR*IBd*Rqt+QObugg&F zT6%+`vKX)RMpnw3bm~n|jm5I(#~03E=}a~ZJiQ@U=Jc8wgcoO;&f%S(T(W^XIXPGps%6Y_V9vi|rB-3DP)r!jpn#Z>suBcUf?o`*7Tr>x!;`oUL7#B`dB2~U5)$wK2 zJBv1mVV83WS)ro2vx#;}xrSETi=R(5bW6CFVF|;Z=Y$Ve6rHLFkKs)fokIWh&T!VM z=-UY;Kb6^<+&x*!`0$^O3svIPY+@IG7QO4J&1CIf z@?rJCnf@!bU-h$3RX`F}A=9o`$C!ug6qWng8IxqnFd^FC>rM{1qGz#Hti3hV7F3C6 zPh2$DlNo#Y*OB2?T+dxByR<~(c&H-WNw4OxXOTq_h|C3#QX1xO^BpOixpA<(M5goO zt`hA1Zb;8|DIW@bcnKEgT@SQ3>7ViwYP9tSnr7jM6RUWhx5cGl0c;aGQPm-M)31v~ z;tp4&nn!5b_(ZmP;or1@uj~|JU94i{7tA$rQZB{6Q2}{2G5>`fvC%q*z)nZ$#v3C! z_&5FPbWw_ceY7Gaf+_5B$xFB+?GuQvk9uEn@ww20yx#hK*Zaix_`Ll4VxHMtQAav< zOselDQ8L<<)RZDvlB?qdbOifI49Ja0gu|jSo5so~m z6ymeQ-Ukt790$LM^EHrxzbh|i#}N$_?Esz*qcuH6MbTe!v5?~RlwubEMhkM?G!;|T zE7nd^IeY0)4dG=#g-2Js!`UjZ`Xzlg5Fa!Wd#=SrIYQ0!ILh=5xUMMvDpKM2=BT6|7-kaklx1=# zGVTkng(mscB_hsmfBBEuD%zFv0W)<+ugqMjKwh4jP!sC&9c55i5ubD14t#Z>`#G-> z!V$4+;HbH7LM_m(*7ImWNAkKz_VKRSjGaWc+P^DR^8qItsD-KfVQ&NFMDpaj?v@r& z+g_T>ITRb?;96i^?)(0KwE*V=iUJ(JUrc!G0M){C2BBWNgWN7kTXdWGU~?zX-2I&T zXx}_I*jj%-+3moSni+H*(m9Iw0=m9C%MB3}TE?aH$`R!Z}7@BfHA zMF>$-Sq=LD&C(3%<3pYm>{0+$u%a1l-p-So88ZxOOZdGVX*)feu@VE6B3H3lgDWO$ zftf%XD{>?C-7(lZgy_8}oqL9*&72hZ8h6n-#)2RCupugj?myE=^aX|Ng=I8W)Z2uu zk2XYTGa)ieBuUU18p+xL9Q;~&2|I$hm1dGh$f{{WsBWbA3NBV*Vjv$WKz!+{QZb5C zF91yg{p0=g82#!5=98S&*TDS&-!I1Z@7v`c|504-y%ayAT6owljqq5&%y{I*z+ND@5ug_ zWkejwBEre%(%m(5b$+&WvxOZ&mh`5vgUpZV>4KEA;_K!3{OrtF)y14J8_DRzs6L{C z3P%Z0VG1o?E6Q-9=<^{XRn3V4(dV6?{yQfwZ!GYHNGWb(r#0BwCkJ8eM-=kfj%?tR zzw8feK2y<;ZTA&6#?ReZB%0dW9UMww<_=7#DWiz@g6khp}9aMdUh^gTy7hw2LNni9_wV0aH zD=pqmPEm)kr)#t?1B%kleSBH(?1(J2tciLfQciCt*QkApo@D=Q$q+c$8?w*NN*yWD z3nmi3=**sGx4@5|^W3`c2VUxDq~F#Yy<8z{XYpna?w0WJLsssHui+BitFgKl>?19? zotjwlV`Q2^qV=Sq>0EqLb(^vI`Wf4KDs))&y_@^MbnD>I97fgF5reeZ>FMLjGs~?6 z3u9{E^62J1&_K0?+v~g?xDav>E?F=N5dRTWh*xZ0pB)z( z_kr+|JrUVpZAQl!n*oYIyJoM5>?D1By!~M#x6&65Cx>mXju^C^h%jhUKv{v+4~cp= zFDm3wSa-H5!y^fe0RMn2r2A2W_h_KKhZWq1jeH zOD;ciJi)#WaLI&uEvvpkU6Y zcyU($(f>M|Hjl{!d6r!XS8m2W#e`3x%<*(yRoh&3M$V&n3o}wQdpF7PG$SPdJjUPb z+B3HB8nF$WH<8er)#mkFM^ZG+MTk~RC|cW78jejwy#K(QdpQ5=_Y>z2PfXupr!kkO z_^Fax6JU9!JeZ~Yb9(yiq_M+&cg7ddyH84j%AERV>vRFMa zUa&yP)p{FfPWc2qG0Pr$@pS0Q-G*-PwQ4{s7FDx|^2fbss)<-NeamRcG$CcN53@w0 z6Vn}OS~VQ>2pSW*ef*8Wt|+}HMjDg&KVEFUY#8?>0goaK4c3X|BTp<9?_k?43Xp@I zoMj|(R!4uKR#1-@*_Mw+ref=bRDi-eC)J%p$FQMvP_)X*6$}9o5iH>10L)-Yfbw;M zESnBnz`l}O)Dkf-2Fk}paHPhVnHsF&`U8L3)-PeUiflp_UDR8VD*5!h_*1mF7jU4s z&D9|Vt}m$U#U(+xh>3*iX3O0SN$-JIfb}15qyQTC${|bC8-ce7JBmE6C}cMjD5QXK zo?M3WLWDbq-WQ;4(kZcS>{AU~1Tzz2y5Ak%AY~%yvKNM}TG(_)pk<>kL!%`b z)l;<7mdP#_#-aPaT>LM`xa5Sf*Jcxj5`kgh`Kldfm}Lyoa)cKl*)WOjFCYd>^TBlTx{Oi65yQEreUaebbO#41xI zZ7`f$Xp+u$pLb$jBHPd0rjONkWbKL#xKF3BSYo=kxO+XB>6rOCq=el!_JkTQp6<46eKMOfv9xOd>qx>#Eo{c5A2ru9oryGe z#EaE%Vg6^$OXvKyoPzWDmzW|#JMX(EIfb-&-slIWW1Y3;(Z9`{Sr-(M&*ONcTl_3R zkcBj>9g{aJw_-l;*t>s3OnH9#(r$IVGu#Q_f`VpWZNavO6*VD_wydz^6SNP|%yB@> zZ2NL92R6no_Z&Gf$Vyb`L9Nafsv39!Rj2#b6#g0auL}63D*(6b}3D91&Ug^AN<4i6M3T0RZsRq9N(| z^l@dOY9lO;xSw8RgPx;r6@vz%SRJPw3J1syJs*6tF!QgWt+j2d3yH}M=K4BJpa){1 z{L@;{yZYfgQ@_;NiVMNOXqK!!v;#2w>e_Jh;1c?Htb!22F+weBDAPnMHXq`XxL7(H zDyChs6NrM(!3v)O>dz+A1Em)cwVBIju?nK07MKXN(75!3nlfIBUonFdzarwrkcV4g z2ATyS@2l8hLwptW-qGjK^sUR|E8z{OH>vm#vhc*RhN@9_a%IG5aWrk~E?xnj-jSqH ze8>&dyTVey^O5-Vk}Yt%{L2nB$IMtyYCcaOd0)%<>1B0B0=tiO*Mh(1e7UdPf~5S= z+L9m+91P5jIyx4~6j%dau=dAxc5VWKI@?!0 z@=z?bY>J<$pnW&{{j@YEp_fIn;MZJvE#d&F`GJ{uhb=<wiHK-bKE(G z+xY+&mUTEI4rAtDK(b)4WxQKvjyE(19paI0MsZpG(cob>jZOA*K00|NZ;#WeJKXf<*-EIpMQ}iqsR%Yn*jA zP7CpVbDGVn<=E9=*7Tp{$lfTdU5&$7-q7l0VUBQGD&T&XCJZqD zu1lX2EO#6b38}T2$ER|i{4$1g%Ud+EnruxK&dy*7yQ20!dq_1>tGvip^?{e#uWKQB z((~$tI?AP8493hZ%5SR`RVoJ(tJ~AAX3gHdS<>-cUZnj12;e7M`6IhV5r?|?ED`|f zq#bMgilz=+vDIiKAX~ZFoF&_?oLd=f$j_8;T1+WV=bD;(ASMZv$V%h6P~Ep zwB+(bm-PwIsf1vRohfyV!(kk-EfnGbnOo3A;YIt=0k)|+Rtg}WC)W(6j;p~@)K>-P z3`FxG>V?f-=yQAxxd#ok(YA_bJ`1mlKaFks)D)^5w3i^&7s>+qaw7x!Xv^Hq7*X++ z@s;s~&E#c$%`C8C65z%ljG@NRx4aE?8&D1)bc|P)^-I}=Av=9mx!EK!npD%4=H*Ls zMS#7i+)!-7Jzxc@ico{HGQ?i*hM^T5fZuSD!M4{w22~I&)FhP{zhnZl*T})GfQy^K z&6lRG$FuIT)fgF*TON+4m*SHYo0Ycijl?qe6F!N9FjAV7-|C2w5u3FGK(2i0wC}e+ zt*atD1s?tu=NQkJPWe}BDusgUkA77+@CI=U2T*54;dFQ>`)_7im!s=_0@I6bkG2rz zuSK5q3c31>`GQ+6?R(l{sg89HM>CZgUdF7)B5Q2ov&oU$qwNcLrB)!G0H!%PWq4Q~ z@6gDNB>LL#GoOg|X=OUqjV60k_!SttT>$ z31uOMaa(ii8fF2TDPqF`)za<8y6T{tXGeP`2=Ax{vYfNoW``;lr-6 zam+q&E4(tpVNAB~?h=r$2-kkXk)m}2;v-5C&%*FWl-`;soJJq=2nblF=l4#godA-D6tMA#Cz^n|LSwD4fk8 zc+^IW@j3dFoJ`U3a437YARqqwZUl~`x|XAP?Q~5yf9LvI zSxxNWpcB9cI8y%5I0W|Gb2C7nvEY`Sz$J@bceJ?yTbVPg3*VR{k@N?v;_qZRcFC z5}p=_@i(Yi&;30flzRD3U{+Uu+L}B1r2D>2sT;)v+MC_Q`aO@FQGYg5bu_^I!r?qZh54SDSO5y%bjK`X zx4S8yVV(IlxUXwJdR(K<)un&Bp1PL5moQdW?;Tl9VE!hr7+A-KDQBOC_K1tWe*G^p zI*W4iG&yKXYt>o>g_N56eZDwuOT(AV~wGR7^8wSgC|vP{($Br{zsAkQ`&q(T@cR6>hDu1gw5 zbsvb@4Krgo{;HT4&KzF=yUnc)4m1;$#_DKVh0cb?DYK5L?L921#YI1Y{k>;x=<4VCd>AM75?Z5U2^ ziRtR!Wcqwd`u*$o$zJuaLm~;8sKg-~WyUK-2dvTbli102s@0{x{xkcmjUkt?n7vd& z{i#oT;pvD6KYsn&qftLvyt%NAKasYrQXPHtSwryYVTz$+EuBm7%|tuGD*{n_7aQ^Q zId|0vg1FWsYnF7#9ioMs@F0iXS9{SqUzScQQ}tK-1$y0R7yC_oCRFwYUGsSK>ysv& zcM7wB)%UjDuRil+bE+`V-L!^B*d>%`lyR3YRI}4qUtyxK`)C-kx1aejXp1l5=Q{kv3+tT8C*6xn*p)Q8z@FH2S{!g>^*^g?X zg-rwvl1`$}foB!#ICfdUkJ+|&sKf1kd8O-0>-V#QBl!fi`Uw}?4pW14j34qt=!_jV z-3GV*`#-#8iuyIlD#N*Y8idwb0nKSD3})7L5*P4k_uU~U z=Un#~K$cvh*-3sjlP2XF7*r&mOr$`>95Py=10|lU;X?nzq-bx_L1fxev2$!{ zn;~v9r8P`3jXoG7xu$ReSur&X;9-BKvQ50h#R5g3iPWb# zaob!u836xAn3%`5E#pfza*^+Oc*DIXaWMO{pcfsmCy=dBu*X(_PT))f(2HY_lb$ z!Y_~NXyfhccxh$!-D-#ivykK9EUgg_DC1bua>PGAI;fV%mb@9~2{-XFf92>y;eNjT zK#x-M=YRGspBgv}e0bp0+FdQ! zCuie$eF-w=BZ0!lT-rClVhYwi{QIn31`ADoOLXy-q2saDVs?FR_g&;ZLBHy=9w4B| zN{=xW4lDm|9Jmq~RM#6-g0pr^c0yPCiDU093T9&8+vPJIzrXJiFU0nwkJZ^9S)h}& z^b-lHkVjfcsHBem5!n8qwcJ6o=@B_HNkvfl@LY}?>$bZE@1h`ZPzK{nmX$RfnATbl z6=2IWA?1p#RkRZ`9b6&3>AH)aN?9<(AJO4wiy2jsTdNr`LX34IRPQW)KJ}qa7_235l)aw z;jj;*Ho8=&J8X$F8nKlY9Mzx)kyjWYYeeK}AvJ<3WM`;iWhP|<_`Sp}+-*1nSk?lr z5tFw_QQ)7TZHfgo2#2pruj<8zMDV4Wt+C?GM(nXfI~TF<>fis95O{b9QrHcGkzzS+ z2&=c|;-aB+>}T7u(|bE-{M6*bBLw;^hA6}lE95TzqKU)$0Um?>2!@xgY=U}+{b5|6{R zOuib3p{Lkm(h_4R5QWeZ>N~IlCyv<}I_@GD(USn{0G{28sdwhG2c%UX2%zZi6^aWl zSbdKjxp7CQ15U9#H}v(ki`i++@29Mf1dT=&+Wv?5KaK=!4fu^WpZhXyU~v7t!*y-+%00zg?W3c+@61<%lB~Jm&?hmQ^fP66A>*5q>R_UPkc%0 zVge9&6<`w7?eX^ANW8Dm?Iu6S8Ap-y9-OH#qbu%&&Y2sRsO?A1=L23c%?Q5{x^hxm zTN4bkuN~MNz9wBU^636`+(ORilJ@U|Vr#BaWF_vBp`03ag(CZI1|wp0q(vCF%{Yw^zKP^lPq%UZ%%4EItY4&g-Q z$h*Dnrb!M3JRh|>{mQvRV<`cBiHEb)b`oLTk>`)pc<0PohnjUadqZi);NQXr&+qlu z^}fLpNxtVQrmHd}-#0%vhkkQ=t%Wd_tz!`<@)6cFalb;CM|LiF{rgeDqs8?%4rG!t zVZ88{Zc9n#qHmu`-Xm8(ZEB)>q@J+-4*(d`mZ%Hjf{ayepoGhb$KntMEB?GnOJEMe zsFoV$#9kP8ser{c!1ntECzkba8Mc-Ytgxihu&cix#Ow?iv~9)&>>e02+w7-kC9~t( z$3#Q*;oJ#|Z;5eyY!f}6<^+hEN;C{qVhph&XH+uoPY+fULN~SL?hv8_kM`jwa_{;R zziA0K_tpV<1a@tWAPte=w$12UKF9;^=HZ=xeg!FFyo1)6Z2z&hcsnGaOUFZ945eu1 z*4Kc4g7v#-TV547TG9AeA%~!4D4_3zJA=_on9|U&#&lxJ*5zh>wHOZyo3bXOubFZC z5E4z_a=$O#tZW=Tc#|zDMAQeEgSN><69se=24n^hGX$fATV_#2UxJpP*!<;-9`+Gn z5K7oPSO}{hz;j}N@Z0>72v*BsFbSe)_rm8!xj5nL6BK`e+o6eUx8Jq;4W_h!5?^(Ki*@)~EvCl9fIa1ufJ!`; z;;hSj?A>lAh`;+2o12irA3ZD1U+BF zD??d_`O^VAPw06wLy7HotrvRx%Hr(~2Bx;QsL`LQSq^y{w=4@Dg-^antXner*pOU% zS;(5eOlo3Qb@Mt^QOQ3;lEz#Z2Hrk;&OAryvvzehr(`|ViB4nflS)nKRkukq|_Ay(xs_%h@BQOUZ{1QjteoOn>h{$wT>&$Fpd$& z@;NSs z*g9;+Pf0o6ordZtMHpIV4h{?mqiIEldDEZ%^}kvGB#Fbms3p*y)E0D? z5RFSDw#=Ahr;jDvG}e^h?38>>v=IyERf4BEN%x{|Y{VZhzJeNtvj)E-@eKiS=Q z0&c87K}I+9ShWQq9T?X{V$B%HX7&TFU_e0C-VBA%z!>2YOJ{)Dw&j~vd^5JBaW`W; z8q^;O=JsD3+iev(-X=c8ZA_aAJ(;$^@YS-SQe22(t6h)t1UxsM!!I1>;*0l6gg4yJ zq5oZV0l&bU8sc%yFDoVL=LjpDR)zxIc(3idba-S?2|9U z2Wu^@p>M|sn@+>V^~GliG{EtKpUvbP2dRhzs1qEJfQT1Kzdee`oM=~Fafy;pTid41mFWu zxc;VofKbN1fpa!s%~WHX1#s%2Y{1(wBwZjESKTC78%HXKK#@gQISxSqY%p`Y_}~ss z_t%ElT#9#I{YUXvw>4XDR<@fn9$B(6dj;FAW>wDaV${V>y<*msZD}wufS0FBF$k(^ z%_d=1??SoUqa|p0#_{cVQIf6==!db&MlO|W$u~xG_M$e;a?J@kvT(rRk^Iu{?=jh~ z3@A^T!+-uNM~6T z0^!hbh$yF=NI}`~)^HF3PdEijfJs6kNH`@*n;AB&E<->d5E38>!PgBGsjpTEIK(KU z(?mi-o=}mF2E&#?lBad5+iB9hrEJmzzj9*9M2>p~1;hR6-M2b+} z-UpaS+I@XX(p>FX-tzp=HAuVzR2}V6_Cq89!P8?ifotC;y{7*$0APg2gj5VSK1Jg( z;6Y#=8Eg*$bs=$sI-I?Cf(Qqo9>k5RYM}qso&*S!B(+nb<0<`kj5B^Vezq0kc>qug z1%3UXR*1X{w?K89zk8Gt{Q?QmhWR-60o)jft-yh~PbCZsL`jZlj7Lp;em=BS~vbKSFWTOM7%$l;58%{NG!^(E7 zB%rDATjYyn?+Lxco!>LFT&t~&e%P)DjzZ^r4_tUt#B66WZ)Lk!`3So(zaNI#a09t# zG+`lOh5Btmc=-j|$1XCRRRhuhWH_9jHLOKrF$&4_K=j<{ESGwWL5X&g^{x+@ZE{r= z=N?psGFz7xOxenv6#y`SQC{mYTzmP@k_ z(+PKXeu!Uec4+GKNN9xTLS>)eOT+ab0>&QNbK=lQ8qIz;j^d*A$GZb6XdSK)d7kq7 z7rr-0hZ5_5`jcfSNG~gRcFX(ue=QL6^p3zqWd3gAjf}|N%MZ!-7YB~WlBYt{8%4T7F2&|^XG=aG3)T}Qi>zbZ&ez@zx(nB-hXDI%J5gn-^YXE z7ily%HlvT27d63EFGv?Z!VdRJX1J{26FH=V(QL(I|0Vl4Hryw+AKM^Ktm|UkfLo;e zp{n1j=V_TkU8r2Vf^s?vFic86QKnEiViC*otwhrL+V$(N7#$S-f0-U4F+dq*<|XvM ziAcl*m`AkJ>m!ogdu6kcc9BTKe0XuaB01Gg zG$t=(EVelQyo526Xn7p2dYohJrAUVQ;qW*3qx-_$AV4pp!qHySFkyqW-7b}$_% zWB@x)l?oI4CCK!kFj&|g+@ShF<=JcV+SAd@K{;7^@cy&ABses-G1-!BTKo~_I_S$p zo&*5*Z9&h<0Kc?_0uPM9!tnynNi1@Wcb3;>Yz>k?4N`vLeF^>jBIp-)_istte(pV+ z>KFT?o%{^g6s-u>ytD|N3DZetWw^`G>VS`;<9~(-ac-K&4Q3U{WvM2TDH;a zOiuME-w{;V;jVm~Py|C3t9CIzac2m>k?gYhGutSR_;9uP8j>G1(Tc>@9m6rRVvrBr zYWU(fsuWU~av0sy zN`aS3$q5t#B2+3o58y3TD60^QqhU~S8GL9MNY6R09#U*B=QoEP4wnC}S()EVsV)69 zi&b#(EtjyzTnhcPKP}dmU2%BCgqn#SBfiT8Bx{&zxt5< zq3U68N^tqZS6#j(p=@S|s=&#sB%cUWY?<<(l5cI*2iUuMn5Kno>lwj_5hYz(8!=fXoAd8HcjVMw1)#YpvVZ`~+E*?Pue=<`dq zcuddr?I&E;8&=7~f^_5cNwttStj(#VgE;=~dW!lI^7Y+2u(<6JbXg-UpFf}6Qge@b zzSBCSl}N-qb}jPb)7vA$3~soP_e>hbV$a^o>RVK86sKn$RpQRjb zJ2TsQ(j5RiXtcSvf+;Mbw+Zs{fYX6LQ3C(^!CC?eASt^8!rYqv?G|3G-KIL;=>dXl z7i1Y*g9$1H?6(kts=zp(ydi@1)u=zk13&@#cGDtR-cEZ|NS3R#c$Bmho#qJj)EdX>(*BN)0+A2_-!8M;`XPzB(E&VCwM1xHY^69pWe?;l+k>IB0Sbcq@qc3VOT7dA z^Klzi%l2UYnz$8tCsQ?s2zRR^DivT^KgdstHCwS8zRWh#l3n^}Z){RDoxI1}9YDyo zPGHSN>|%1Yn5a_VJ+*D&M^O&2-KESdG3JVdTgfM7cU!#!o)p6~y?ZnKV;GzQ-ATW1GpiK%b@@>`rZr_{Q3R=?f;#n(MUk@nB) z7t3(u|9SCq{`j?>7W@?Xn}h$p_nPIpIHqA?*QvF{`tAc~i+3G2;x92TG&7QE2WhF* z;C%6E|7xb|1~GM!LB~*pUyQ+>k)Og02{E2Yn)CKduMHV#hT-l=fi2iiuVjj8-fT94 zQK*ENw;!ZBm6AFQ{pE@KShAqpF+9yZQ;VS|qy|lr4@$f>)x@rR7x0 zDz?fQ-uWpow`EP-JgJjZgd~sP-6f&oFqs0MN-0P|#AW#pL;ySHPV?t^j9PHrH>`X) zYCSoS**CHNbd0}zZykEir5HP&$7gb(pl26y`wGRxepU1LEJNR7hc6DtDO**c1{mXl zh+gsdO07-zEy;ZhZRW|bIF*yr9LD!^4u=tn;1rBT*vCLyab9?&ZU0Iu3_4Gkv&7Ps zVKS|?-a+q$V4-9;*r2NF9m9|I8uCbtENiInh!;l<_`oeez5(Q}v?@@(+f4pwGqVAVj*afIS`{!8TOdE&HGO!% zXN;7$eJF>E3dVq~Ysq$8ofSwvX(F7B?mo z1Tw-SKlfes!Tsa;qn(psE;^qEPN`|z_81Yp=B&R5LKa~W8D!_uXfaVP^3+aj|A%z( zl&uIekR4BPkleq{0-+7YoP@wAVd&s{#%-C0?Ay$jt{(i(2S_7m1n5~JA;iZV)ZWEY z;wWZ}Hvj>Vw;UNK^%LQjLDStB1FfV|3dqtNH;MgtEq>?fG%-7_Uq$S%emFv8=rJH1 zrFaWeip2tANl!W2uvnDx-&fH$Pn!3CH-nDGQZ~wN$E$WMukQ^r`UdRG zvNoIF^#y0k${S=$Hq<*X`f4xx?%9vAE?IeaqIWc}|eqOr3W zT-d9m;6CkIf-6!54z@QV#^aXEKBO8AKii6PQFMm4!fXIR_0}On(~z^iq4xV@b6rD@ z_}+-W|7TJKZ?<{=WV)KsW*b5>&bqK1+4rA~4p@*&&hA-FR~_<|C6h4GGc6S9A{h;v zf99L*$SwTyc^>|U&!|fl%ncq!7?FcXu2%PQ#g@NSPz@x*r(xVr^oI%c7fISp<=q-C zp`LfqHrZpX4_}1mOivPPj$yg#%%@6r7VmZtlDP;z(xk9B%O^W&cw#Y4U@BlZ$lV%_9n=y~tDV=S3^3_cotH;!+#ARxqCm_FUMQuh9|a_1;eu4&iA^TjDa ze&IbKI;%0>(kX-%{Ye4bsQ+;a>%M`9mZ@IKav#L7zx4M5fO(LXZ7ruiggOU=jeLs* zEUPb&WDo$5$cgnPq!7f=Dx?D*>z?r__<})4cG>9q6p~F<+Dx*5*=CyZ82p(Hg_=oA zvaxAM+srv?`V(elXsJ*QyH~Yn^RlqfLjs(>uOy`(`8vKcmr`p=4zsK|X2dG9lVfmv zd?J0qoLOB>JMP z8>@3#y7hhUyy$APb$DcYOml&Q;H#{S>r9v^A9>;7Y`J{LuikWJYrxpDMJMIbb5J2f`!7+kYdd zYG~x8Jg+@W_Rin`wll~kiwgT{BN##z^a2h#co!a*^r)Qfybn%@-I}Pp(>%M`dL#g0=E_Om@>I^)+4R5 zvX3cShZHk4XSqoo3(l|3`h|BaTw3eXKfP3do=P%LgWiU3W_7AE$2X@fEeK;$BdG3M zl-A8Q-)>BjO#4n`>Wwggcg6pF@TKOwX3s%p*DIF55>Mx_aVe#1X+<6HM3ImE7mN%n z;oHgPa32FnQHa&VYYol+$dX906xMb@$eleML_X4>TKt~RWQQ*K z6%dj>-pf9JpQSiDJC<Gv>h1REyp_;{HdGu4R+W4@)f{a5A z5SeAbNS0`JQz33kX&g5|UhqBQY;nUteqSsl?Dn(}!RomS2MzBZ%O7nvTjmOzLp1(PdcQ#R|aTBRN>+nOV3L zszYE4y<@q-+Gnm$3io+X{nF0`ipOqAj+-2!%AXii(c5)&jswRZm3bDl%U#%?ylx?bd~;}A5SLv$2|n*xSf zvh1pA=6Ol##ecf2?PeiKcZOVDXp_-i2vk51xm~FgL-# zg?0U!34lplfL_B$oFM{S07}z~z<`{|PqW8?IVBmH!dHplwR#C~&Ua9|!Cj`VhFKCo z5Kr3Hfq{TquwLY>e-9f4-(eld_kx+sV(b;At|^b?An!4B6htM`;6kiW=5reWd#G6t zs!^zL9jogQEFQva=!7=p)Nn;ye+S%cmllYv=UvD2dk5_EgLS95V$qu=wz}z(%HAie zyRp`nEa<9JIRD$40hK{4#So{q*YsY!C~?`Q&Gq+YC}8hC2uR~})XZpRIu zbDhV!gc)1iX~{p31;U7A21+t;_$#Cgb=?gMv9qSZn^I18n+iKSl=dXoy(ZqhSBU;P zoQ!YF6y40lFD#ulQjz|YId00(tj_Gy5jS}+x`-6vT_M7bI>KIcPD$#!eOIQN7YJIN zgmlX>_xc|TKejBScit`#e=&V)Yl=U#Mbp0i`*K3IZ_uQ3YMrpQf9CRap{|2_xE#639HZlcl*vicFyut zurIK#jpHau4z(Zx4fkAb6g0Fko}0v~oYnM+Z7Kr`Ir6XxY3T_G9z&y`ucHS|7KnTndt=~lkeJ>ckcwJ(y3uMkv z!2j)N`g?$P2-rtbFd#gMNrgUg82XmqDUdK82m)OO#;YVVF7nkKVu+3Wl4k(OJn6H*T;Y%VzUEuvig*lf@7ZY!+mtz?=x`mQ z@u)BpsB$@OXx998+{p`ZhUi78p@ug2xK$ZVTPoMwKt?I04)Sc|7Y|o8l-m}7kd<7l ztOq|wXGkiR`|g*akk8>CVqf{XgXA9Wr6j7})~x-ldYK@%@!U^&aTxg`C%rE(Wh6}P zy;|lb&k;dZWU>2)sI|nMbL=p_5AJAsRtJ$*eVtXJ%E$H)cyRt%ORvD14Zx}R>SPzF z(cwgQtnTV}??5phiUOa9COWtJSkK^ z@}ijc(e*!i$%!Ll%o}U6bD%lW<;u0mdK93KC=A-X`^wDFaz7OWs8To)k3 z?L&>Yqg3(Vai^>QuNHvls?FMOB*rbm^aw&f@&vorf-wgNshyJ~5oAiTJ*%J!9R|tO zIe1H8KtD*^`5<+L+jdNx*(WSYsgewo@0vrx0@e9U%7DVSmjdNRIX}-T@{CE8ju4{= zIzs)Y5%BsW(c)8|prmXG>^Shvz)dRvxF_S$?}PT`V#oHAnAAjFaz(`I{z5vkQy3nB zH8scET6*P!|4(?Raqm~#pZ2^vH2c4Cl7IPV`Aum~-^#Van=^eV&G-46d-2*bVWDAR zIOFzH9m9FiRQTW)^3@vQMrMdLxuZj+Di@x+c-L$3?PuQXz-2N}|Sd#_Aps_Ry6%|G@_?#;Ftr|-qQ`K&rACj%!oPm((&Ugg+$UPDQPVwG9I zbI>lmZi4Zp?wO=R2#wKQAO1ri+Ty%0S1r;xSBCl&%<&r*_T*S*$n#S?APVfxc#LMC zT+RcI#Mq4cWpi??B}ogBA6p+FHG$v#e0Gg6tBJgAv2c|hb`iDLsd>^dQStL?9$MHX zURx&=QS+K=a)xjA*-XXk90q9ISe1JZ&v4X#$OY)$L7w- zZB4>kwP(fa_eUc)@6TA*hYKWQas9cRnwR42nUymL$7uYo&N@|q`(u*U9CzTwt-?Yl zY4udp!uoEiNfEiq)syS~9li)Wc>a8?fS zJe~eNW|q}P?iTt$8vwhP4OM0Yqd~`^Q#at6?WsFgsTX5MAR^>Ey)8to*e<2<>rCH> zTg?b4?^iQZR9dsemaEi?iI0l_oU6hgB$3hNq#QQ1*?J35kk=C%Jp`n_3!`fHM``ly z3te3L-PRx+({$1`bDBg&L(i?2VLeB7>w%~9Nsyf2_?y1TxS!$(5c}*Y{pn8o&Nl?r zVr#ez0*b@HG>#87c!v0}XVVeqx5itJ6*kgn=0OFX1HvsA6Ve`MgM$Xyv-&7;wGvi5(V{7+($ z6$9&cR0;Ye^a0B~OKeYVTri4FQ%E(Te`J^$75jH!b~j)X&-*G;-SOAR@>H<-O0NNo z>hN4uwJuqt8{w|nBw;yhlG)$6&N2eL zQaM#%k1HZInhSZA-J7rr;IN3wg?X3dAY~pX=YhxNWKUg0aGu6f&V*kj>hKI|J=Bd{ zWvavji7Z~`u%lQvUjHPaueMH@)W}EJy1~2+c;C%0ZBBNH8W=8Lb;k50|#lnV( zZ*-S4p%K?61Ifj_gO*BfSl|K^w2()FAcrD7600Smg))_WJ+DDX9p3o^5!8p0>zpW9 z+}%QpB`-^);}qLWRcXWJ;!Ly@+7X_Dhe)hEqLD6x!{1sMfYL{Sz7m#K?rxRyay|E- z9BcdrAbhaEKCody>#N^Bzgkx0`qUT$ouMpU1J`Tz4fxx6ZRLT_o2fs@*c(XbU+CDVBRVoxCd2_X(5j{%l8dfzMk^x zgZu|)`|RBIC#=oS95Z$IxG8jFrwKcRb3L6;D{t#EUNN?Ip`GB`01g-rt>A0E9*8ORcF(FZT{rQmz9ca#_7+L+ z81PU-`yBO9Nn;_@Ar%r2a+JV}^*}<_PWAgk(1ebX=QFb~s?-irqpybu4eDrE_K^1p zyGEfM15pMSYMw?S0AocM4&OO{HhD3-4`a_70 zXD2*@iwFRoLc3o8O4AP|&dzBt;95>X5zaGXJh&BLo*(iC^P>#@uBVWq*Qyjc;$I-K z7_*(&erGyh7{~<20jQb^^5B4oqcrLk&_;|0{E=vK)$Rs$177MlUFKENFq^B4c44_G zx`jOOwTDE4WcQzBpCdT}r0uo{9VU!SFC(RPSii7sv!010{(bg))$KEW*39eE{zqI) z0a8AAm0feoJgGF8obg&BBm+Di38^qeFmV<9o-`1HSMV4>#XnUo#!%$*Ktz8xJ!Y=2 z(GQ0WWIRO=4bNV_fz-Qc{6aRleW^p!1%zvi5RvBNnvEkq*5s+X1B$d^#GEemR z;f^t;zWP8Z#gHUZ# z01<_UeAGOi0rM#}%dEZXELDKrT>AXs4 zz`#-r%wwO!Zho-y6=aM+kKm>d=8?Vw;pjM6m3r~o>l}ir981?(hw~q*3!>;?7~eH) z!I95_qy_1Q3TV~xC`fxi=`hwCrVdR|wUAczkv@U;C`eq5K7fSLwmOh|De%yQS$7%G z_*gA=+{!A%y6}*uNO27>&c|!h)tS3`A@t8cx^?EdLz(YC+6^W8s1nYK(Rt_ziGhgg zzrmXTgvMLk(u-X)m$Al(1wQTpHZQUtKMFaVFhR*(L3Sr-EmGCux05rZRk2Sj0or9k zoA97a`CB~!=m!gr z!?^$G6VSrxjpo`uoPAK>+tg^$@f80Y6UfE>T(wv&kHuh%?8MVXhXU5 zH7?(L5I%)=DN`oIRqO?xdN|Fz&j7YB(E?!wsw^K31?RokRFNJhu#Xm(BK0r*+#jcG zem1Ie_W!(U`$(iKR{C2lc@6ZIGwj&8i@s}5xuGM=90DTh0RCmD`h1iI`7~UZ!-BF@klxDuT1KYHcUV!LSq!2n7W4=vR30_6g-l$$~#Y0YRU1jfV)J zMJMSvUGjS8{oi(Y{7YrW`g8~w-9d+uGy=Ju`Z56U*Xjr1E&&B^wG6n|-I{dctJ;KK zXM7dPVakKWFyG-p{UHGL%6$Q}_B8prUJv!~PW;BM1_SmXn4SbUvYdE4J&IC`S)g5k z6c#NhRo)HvQ2qOYGPs4RXiJu|N;oDu=aa*C-Lu|cj{*nKb+7!R4Uj$3?R!pcU)RS8 z9G~h(Yji}qUkdfvd{Qr*5HhU}h+%AuR)f#}XQP8Xun(wZ4rL(v#rE`Cj7Z|EQR%8f z&sQh)o-RsX_V-<}`30ck_+D#lXa%+}w$#JTdYsm{cCR;u!i*2V`7NA^jp)tH%P@*X zvBF*n(eHgzkM1hzV}6gWzIWuLYU^W+`hF&j{{vPAGKdr{*8MS3Zk(CqT1V<`Sz;CS z)JA#vn>hM~<(-=#}1^?X)mwSN-zjWt4me#N!N>X2r;z|>V0 zVIyM$Z~o}NETlemdAV)k8~#jpg8kdCVPHz8@yX}%jOO&Ek*gHZI+^+m*4uT~_k)*b ztfR+%>9iLuJV6})6Xs6$jvM|v`xrk$XDxbB*6sYggMSax{CBeM5@Z!RN0;vCrS{K* z@Vyd-*dHXHLMKSue1*PY{FwH^eRMHHoH=)ppbfFIQ^NGUXp<7saKK4{M>eqLaG3N8 zsbjktIXA;TaisO{!y2eh&wm-Cvs zv~4e?x`FvV38}C2)K)T0S|a_SD4wDnD8w);Jv2v}9%4`Gm^taiPt*Uf*9Ru^gjo0W zpkTqM2Afn}lIyE!d^WTsFAPSbfAWtVg#ePf(1s|jq*v2K&Xb3r%H9S8B=AV(%u43N zG;MN+u832~%(B)$l3(0 zC!VhwUTC#&+Lkz7c!dUucfDX-*WeYpdO>2++b=M6pP(~%M9<)E{k5lQ zM_@O)<1>nxwzDG5cm&sI<41UC2VOKyd-v2U3sM4F{01x-$(U(#-F%{(b=Mo$XM0V% zC~6j~;5;qj^^p}Q11qyASI*9fteh_KVE&N-?-K9tPASEj>2v0SP9tlpOEMg$zxah* zAh&#d0=*P*19K#Q^~vX5qvFG(h6E9Dq;yK>l$M}p`iP2wLeZ*UZn3t8* zJ1@4@FBHI@!QpvxH|Sg(d$Ks)f)^ZbnDQ=AuH~h8*Pl4}j7R6M`Rfq}|Ff$B{4iV( zYXY9fA+s|^7$+1p;x97Au=VaDUBJQ5NX~#r9b-mpcx}yGNhCz#k8vOd> z!pQc~LT5U^p`jCb-OFx{=%x8cCXYs`8wZ}xvsMV#`0COWrsv=t5Gt+uLq2~yJE}v2 zzjGSy{!D@j;s}IRwyyXuIbcw;Y@fr@Z3(a>VTlu=)eOr!M1pT0Xg5f!uBIDfwAH=L z6zKW#f~|?Po$EyCYP^s(GT(!efllx35K3HSjwzvYRl30=K#SOsMo_gsms-Hl-2=J2 zRg$q*?+F_k5W-BEl|7fXH+XI4q~In&%jM6d4yV#9nQhQ9c7)PX;P|e@XB>&NG5FAR6)gsry(Y6n%jt!}fx0n9@_Y5N(Ba^mF zuFO6%4DnjpTsJ2H(ZWCAwMZBGVGkouS(yHB7KmgI5dX?OQi@$-*Hn`3v|@Y2t)QL# z#6fnXL3a{zCy0-5d`n&1UO`wm^fdNB-e|6JA54zVPhnTaBb;xGXyoqVlz~yM_->7f zjlhLm?q%>7uXDZR7?2yh6X8`sBvETu$0~I7Aimev`7Cp|kZZGN59Y4J-Fgt63&qg&PN_~4P@FiW!Fx7KerpQV53JRNXCk?{w;{~-!E z8kB|Z?g1oNux5(SInaauBn18axrF@Lohw{FXQ-527Tu91(p(-+8*7dcF$vAT4gSsyyLfbvIF*cio!(5tPtrbI423xl~8j3zTPt%j8R!_G)zG6MSZ2R(V4KJeeYRPG`n5ckT$nf-%S@j~L)i&DN8oN! zS>tXVAlWhSoRLT39zqiPNzpNPJj0gsfqfmdQHE1cGlKl?0R7>vyDl$}SxA&^{9m?A_tUTz4)d1tOm0Z~)iUR=x_l7qJN#NU1va@64!T8~3^ znS=!*+HZUzkfao*Myd3!(#;&KYcD0@#MJSfpTF7pSHEm)y@_{l1I*JvRpyc1wGWHQ zV0VIxXFvK5Qrq?cpxd25KqJfTpEIxX)t2;;DvZZD1gPt5oE)>i=HA-TTC40 z;7Om@Sfta7EfFGR-3Fen7`+I?!@`(R-V}CL4m-t-?be*SfH9O!(1pJ4!_&IrJ~H&g zXPjw#^IM{iMQVpF;Pu^=Jgm7khd(+hv5t@N96x~`G>48gN(*WI;W!;^;jvqCO8-g# zE+4BNW2u^D&5nV>mJ{OES`$N@UM(EOp&DtdOeHXzW1dAY56)=}BPVqj(uQpP#1uW< zk6@?j*Brk|I4|lY-tp`8Fwd|za~vAUbkw5&3CsP@YCU?T^dD zE<7G5T_i_nh&~6LGS#mH0J-r&%)2m!o)RA_F zsJ%O|4_`&&d%NMb1m`fwtrL@wMC7JCw~T6x*>mLI)CElDa@lhr88T@gt9&ZkvBXI}c|5&y2uNG}n%v44z zZf`8)Ty9GsgPCSF#}LIs+vh;vK`u*gH&9UBVqsUE=>iz%aN?T?Zyw*D||Lk4|uV#F;?v4=?)Da_E&fxCP(;W@Y=U(?ykT2x$JO zQs50)I-ElkZL(IM`D{H9$Mx&PPZf$J6KhYTl2$J^fwaVyh3V&ES6(A%w*|Y*EHOfv z&vVd~h05ptB$2KcNrY(}s$BO{yzz-YrC%7K(QN(^O{<|$c`N3TXLFvzv; zno7gx1%p>-y$l0|5NnykQCA;}!jaB~EFVk~v*!l#*@f!Gfwws#VT2pIOi-{c_OZ5< z5=oyjUyoers&`?#sSa%?ru1 z5kw36f_#L1LNa6&d!4s+88%xQmN-drzKUTi(sTr=x_%{C^P*GmI)rnqK~RpR00cR% zBq@F+NJQ_(Ph8dvsA~FV1W^llmF}g)q<+aM5lK+^P$YSw`lE^(5S}4#$dxzsF?#@~{8D79fXmH-Y9_jZvr?Jt5pESc`$^ia$KMYwrQQ zsgBZ#)JKNb@yQA=3zDo&pn;HRcc2)~X_vxq7$k8+pV@8I3Prg{oS66s%M74+yO-FA zl*LYOy8oCYZpF#cv?v_ruzFVKUC=4r0f%!TrM61~{Ut}Cdr1NFz924b3J*AE$^V~L zn%zkpkc?cZv&O;dG;}5R$}}}em;mFrumgB=SdMpC;EFarkv;NHH-1CBE!fNv z8;ZcUnf_BhWRz#@JNyT~(Wn&wH87Jh1hUbxRiJMQhC2v4zJbHfp^EU11yN7(Eqp)z z4jynp573cx%|KN!oeg(Ynh16tb@%9WFy@%In5%iJ5s1<*Ef@NZrbEsat8b8uFWl48=ZAC0HxCbJ;pumpU z$~^hY9)Zg8H9GM8``-w!sxsy;EW0>toimW0{vG)^JKY6eQu4H{%V?Bpg5CHHbm+Oi zIA{z58UfWT1%fHe)JHk(G@v|hKefHmUV*88s78$#jr@FQ#K07 zoED+9P7pt);!xR0dCH_<86SOONS7qK@g~A|Exr51cLlmH0#6+H&OZ_&vpL3$E5u;t z?DfdU;$jXuT-dppAXtk-#+@_=|2GLmI9AkVZ|jm)n6y*}d8AWeGWh-kU?;GY{qC$N9w37LrHMqzCA9;rkW4_gjvoz|T6otDct><18 ziAbW&zXDoKq;ys_5tFQin2xmKmu(EYd=jOS0SJ@d5gG0-TR>WWj`-PKvh)*q((u?fw`-S*FyN4xQOrLBT$t_c^1m_!Y5aVEl*fpJ_bapFPor- zpeweI4!}JPv;n+EenVetEe6LzhrQK>+;EmGpk92%=t}5ZBlhbYg+7}X#~IiC!daL! zG|<&Wlk2F%|?W7*EO2hjFtw*U@J)!u@FZUoNJY>mFhjZ68ey3*&=MY={lol7@48j$9db zg5qb;ccJwlH>n2=v{n@#GD?|ZfVoT^KvIZ&40naUir8apweY$ydrp)$)CI0&()1(0 zn(DfG@$r?sH|ML2s>0uSoVo;4+7 zJaPbPYFO4`M_=!p`IiI#!ixJJAIEPw)Bne3)4%zDe|{I@`LO>?Sz?}v3u3snli_X5KdEo(sDnP1Y}+fjP1dg z0nb3X7<<=@9L0RU0`=qwQNaQU+e49#YIG=IGPAbb$b>#I?45F4bWHt8dX zHC`=?@=#aj!35r0(6GWYgUvett+FO6TuO@_U(a-wMGmx~w2b|5wUo6#FV^oKs+XoEw! z#>9ad3kpbY0Thtl?!E2@I^NP$0oJw87?bTQNppmV8OE495|^RrXTq}3anikX4F*uT zKc(+hDi6kV$Z@P60&1Ts{o^NPBFPNQ(1slbj%G42sE^bI4WO17Nyb;504@k_7FjAK z*}`csr{cmo)=rV>u;TZGoTxU{HJB%BF-&DC+jH^fQ@kAZj1e7%p-n_lO|MF1OXnUK z0$E}Z;Su5(E`;MyqJnD+5W$UYGF{0)Wl-v3E={jq!MM9UXN%IU(7B$z%xzP#yE2HI z7Y{cbw~XX$UR2**55XhrvLFa2JiR-}>#H@{_i??C$y2#9mFTU*v^84d#~ht7ao|{T z*j^{~3Mpt>?vAf6|r$x+fB_!X)~F_D_=#=~bsOEjzr zQh#;IcV5MjJf0W?kG||OsxC6UxFNYtpJ$Cj5_uGFT*sMNW{P}Ny%3<|9H3lk`i-DY z(7i%B?#A1Hihi^6+rfQ%t}X{0KA%5&>#k6wH&4^|oOqTg78@qkcCPjfo}AMC-W1<2 zh`=7l9{P@OnjfR}os@`+8hn}b!{S{F%kOI*7Lh%*GCOD_@e@49J1#%08yg-jFxNN8 zdGzkEKwAI&GoY%)5gcx;Cs;fmg3hG_IO*^l42N=Vg9Ct!=xF3NnCD%fiCh<(nI_^L zIE23f6LRPCEBFm(8q-VQ9ZT_igHf52F+f@Zy1+;vAf;X((Yvd=Op}+V(0PN`Sg}x2 z5Ua)^%S?-G*Vc%fCFy@~RRLAbozRy-cpy|q+0L{(+tlhx&o|Ct6|o(BJlj^Oz5D84 z{`?cuLC0EppSJ&_YUlhB!9`X&Q9G9FZq#29Z`YdGy530WN<_OxcJ519xRq1y*QBay z(}(O7UGGz60rbEy9)g%1B~Y8eg$)l0@d826CR;4S=4yn#!rf=zkc?HIhK=wU$&M;#+BH3>vc%g|aSQ^*Pcjpw^>>^GgbPrwUZw(*vsTxki>KV#2KI*TD&eb% zvn)~29<)$sjUDxcq#$M`J3x4Kg+ZQL_e1Kr6S8$e#xG>Y?`sfh$Q2C(RJT(5JQ)$S zLaJ08&k@2E}N%qMgqdSXrYNi5H&vyYXqLhP4{_Of-bFJi!7D zBxk8300MzJm)-WEc6z`r%@)3Zvh%&j_)onvpXHE>q>M?s{Om5PGL$T1@r?l{2)kHP_FSE4Bsw3id znu(ouea54~!e_7NoJ|LZRaJhs07tt`H?4=^<>m8qzG1R`zyJ{Lkm4}j?wte}7HUh_ zof~JJ$~D!|p*q|q-vPb~B?pU3_&BmpVS}zCveE#3a%mw}c8)CsPryluug(fzVfPDG z_YN_D+#7kmO}>H$L_%Adg2PcwG)VWYDCfm^Ek*?toi$Mlp+QSUyoeOGD$f4xIuwto zL39yN$^;K*0_%FW>nhv1!h+W1z8(fB2hvJN*}m3PIXu|}1J&HBRTWkW3arw1Vj#jn zD*6z&aAh9;$Ds>K?=TlcVhSZ=+YMg7{B6h6POHX}OEmKYg>5?*pgS>7(>(44RRR&C zvpQOSqXe=Lq5%`cnKaiY4z&=%%f?Aa-3nBwL&%kyq@4>ByD|$`AsMHKVq(me2`wj) z=dOvw0`w)>K{IcY<=fU%ws~+7K&p+x_PP^(ZzjacfD^ja zTy*%xxfGR#=quqs-yzx<)>+uALWc^eBH#*j#oc&1&r2w3eUZ*er%hcX2DP9cW322w z_BgF^oqtn^*(~CczQss%3*7kG0bYqFXk}gBl#+JU%X#r|^+HDH^ZAyd$P=sSA!vl4 zcCZ!Z^f67HLLljIx}p@zIEi-=1C*e6y12t8x+0l(y;zrBK^2aVK?@zD&=`txZAE0q z9C3;BhA0{eKj1TA1Uxk%M5b~rQqRp?3iaBsC9Yq>AXj@)Nc>vmet`-d*yp4vIM?TC zchy;c5Xk5SbFk?) z%+Momb?P1(7_1UKTsQqz1a3wsazg9aZ&ci>EY0dr!CcZFB798iBtTOk&+#-<>?&j@ zoPcpwOm<~hj6M(Uc97^&9D(S`T^wCs3D5}UR6#|?O&S@_Wdl)~titz0e5x1pN^i2< zAX^9o#*R)0W}ma0dnL4jAcnY?EquHVDge)i0&}cF7)NRMa)*MuvSPQ|j8FoCK8SR- zzDRh4#E%LhUbk=G*_lnoP?#aZ6C@ajq5F zWhaND8USYSBD;(btIr8RWvN2RKSSwvW4xe^aLu(h_6~%E;9E|izH3nzi_(qe^0Z$Y{`qV zwbz5nft{KMHhr_Nz`13izKa`r-xe4d_n1OyX7f3_TyK6ZH#7NB(hen`%I$84RmfQ) zJ)7+2TGtD#y{9Brt^o+si>ZMl{C;Bgcy@Shu_j62hkxU3sqgdy>?wqS=8~&KSJL&d zkca)&JcrsbcP7}i`iJKjEq3E&u25g8?y$iXnroDEKD+V4rRO+7rmrz?WGUyBS3jcq z@xHop$exKtw`CtIHbAptg?8dUQ8r^o7U^NSOvz<|tDM#@Fq5 zmkfM`am?e*IysA-r2jM)2k|}9Mo@+cxKzW=4YdHBiJ^l^pn$J`-kEWY!E-#oLEj%4 z3e-zSc!wZ}4BumwQWeu5)$RPx$E%N4AHJ+Y_q_fRu?pPMNN=t}o=S7{pEBJUsp!ps zm7AtAc%oEhFGuG$>BE6VZRHF1Fk7yhX_UY4Z_tsV@qj_{?49AAG4WNjA$RLtjNBH$y74SGD_|Yd)0_t_v7B?#}<^C$x3!Sl;=*w$E<(jvN#? z3F9Zs@hJE68zpBcvT2tsZh~e_H7dlaf&7|RM?{{Y&|cefzkVzBiYD8n=0CsYH!r;S z`|;*A%pcQ5TayGV>YgDs*Er}_VKfS5xO)1NZxY?~=6(Vm33Ui2i}fwRzRJVa+5=T6 zOhEsy0un=7bA%&_yf~CdA#2QSd2sEMm9oBc5k(gDtVfjq_DS*ubMwrv-frf-sv%X+ zyHBG<%fC9K>MamaE%Zg=Y%hITXx%%~{rl}2GS?Ln71%J}lL==RRryX|q2!FM ziG~N^M|(LRelW2<^=3;?q`3&)gXK?g_o%Jmt%#vj;)xr*+RZiAv8G&H;poh&X2;hz z15sS#71UsZ{%mx1>w>R5hRc&npO4qoZem(8TY8nCn+HCOfBt%LWGyya2PxY;+!eTI z^jNeng^2-J#s##hFep{c6-yx?t|;P8*6fMqicWq z4{xtN-Mad>8YBYOpd~M+ALH;VSXl3_H_w~~P)KYwEBH8qXeq7|XnO zDo#F_Mc#OUGX}6GI@^2_runMA^PgFOX|BsJLH1%aYo?L8`3aigxN|DX$yH3FZp(*~ zaNi*ncq)&-+HMq|jiC+VI={-fz*Xla307Nn8It-#|1d-{fknkYfHsZY=>5 zLkrOL@SGsSO}K~7Ov!b-Rb~YiuJr>8+RVyfS0T*~zAG@SPgHXM{r;}czS)wY|Mu;_ zZ~|@od$vQ~`r?t?=-BRD&`cYKcapioia^`J4v}aZr-M6kJ1aels6$ zZ0rW`)X)a#SG7`^eIJS`-IQ-_ zaiSys2};7`PilSj_f)ZeO(#ea(1sYsAPpJp#{MLha}+ycM!{d z4#}U~tE2|Z+ex~4#cx3yaR*XMkaz>}G5~&7S-fC`&i72Pppi8Q(!HsFUM|i85OSF# ziUk2%W=61jZ(9+E9M3!t7NeCo1hn9t^=r^_{qC>#dsjYOU48^J#-H|<#fE`+yQfsV z*xa!%8xL#9m7oRGOaGCI@E-|P-EgMJb8N(c9vwmo!j&6|rUlE@$PNF3o72TMh9ueAwIrvTaDwD-UHfU50lbpUewpZb6 z9i46U5#sH-%|l7eYf>ETK@2z1V6kWri-BzbxbURMGcm$QMQ3xvva#iUJ3GluxsJ>LN2<{q*`du+FvF>z6~I`5vu37C zYOeq0SXP+ifa2#&=uZiL^Ro(o(8n7N^Rv6FgzG`KoGX${Cr|IOIa}Tne6h;Kj~CEyDyKWr)KxtRN#9H_?s<52i#6?hBbAOcvh%i9QYF(PdZ zc2i@r477N4I(d*81iXzyH0)6DA6(MHMe3+KZq$-NCT22$W0;Z@lhfSR0lkKjR^4<6^zj=S@oIlwOM zHvjJ~P44K=;rSDkO9^!p=NcwB-(M|sVa9V0`|7Z{MR4p|(3n~b#PZd@y#G4}tek32 zl0Hi)1BhQFY8$Am*e-Io+NLuu_zk-&3^3zLjNY%;^wUKo0_q{5bh7rU4XJRjfDCaY z!)w7U(@Pt@QyYepp1vOvVh|x*!QyySF5re(v51>f1WKEGk-03sdBtDmJsqi@U(ACN zKzF2sK3=G^A7aH6oymhu$UAL-v$R_l9>C5abeZauCOtitjhYwOQ!fm(mW02V_to+3 zg7ex1%lR(suq)wbvzDBMIXAMdCqPOKR&sQ+RRZj}Vh}CeXgO)C11BWLQ~NtR^zjY% zM~m7s6RsqYzi>+fo<(NlGDwnDLaZdq@oIT5BxdJ1G4y0d(#$S2jm;WY=r_BPoo7bi zX#lr=9r7_?kRS<3y1>k+nJli&UK^G8+wsk$sdjOU?!~M?^S#B$ja~%Qgu0RW+l??9 zXWVh=5j-q0?bG{U=!Xni$d?)~2p}VddWWi^9)87<;#<%jDRK7N^_!T1A!*XgrJXs~ zSO4$T)&EV!&23ipC+xIs)UM4JxmfsRwCnOEPUr$lYGW`VcaTCq7WYEf+LR8};s@4@ zbK*E0f|p@>padm%swbS5VQf!j;^Mrc$nS{%D(!f|90VhLS%;{#@iC&7Lj7={8%#qd zg4aD)6P?)u0je}Cq*e~6i`=qzS!Vp)gkeYitmDIan}gz|&`-8%ZS1#tuTZR~^~slE zP3Rzcq+!VnTjKDw!e%ti-EW4m)xIMKPHtuf=l0OWJwz9HGjr|_p3!yflu8c0q}VyC z@G3h!tq;=}q1*Saz_F7_PZozH8L=DE>a#E0ZS0#+1tc#a?Q{8Ki^G+aa@61c0zL29 zE~86z_KA!2^99&Uh9ZP{TpVhSqz%s%d7c~_sy#COcD{>t;A}IkHY}Mn`CzNWHTY=r zprkIerznwqYcvs%(ahEDPd;NK|pRej$1G=q8&aD50NjQe3pleWJA1S zm(r^n*W@{8PMeMj@uktFr&6>1Z71sw^B0OrhxCEMDjU7@PNI^t<2EPIdf7s%lbUh%aNt7F zF#*^4as*`8yP8IgiWaOsijQWKu>mXBy_|=prn9Alu6tpRnwo8uI6Aqwuv$*$J3S32 zw-}nTV`f=fsBYe}P{j20fB>lRETx}KawSn37Ykogtq5FJSsRjKUX>Udh0#wJwOMCv zbBkb$Uw{dJC0?KkRwC}SxKd)a3O8FNL>97+@J+7W&t?XP-2dZW{+kP+&d=pY#M2|* zC!C$><_W_4b?pqJ zHRHuR3us1}N}bH_k%CipqDOHMmTCvY8{L-nEoDFrv)qf?P;o!P*~&<|fuDa9)+MfH zxFU)T7ggQK(@e4B*s;)MU!c8Qw!9y|J-+Hw0}Jg~m?EqB?cj0$0yro4+E2W}Ctu4| zYO-_t_y5Ym6}g(o{2sy}?LZaW`YUzrIU5+pXxKzWqbwH&1N(mV*lYZ*zJk6t{hCd=Z*5=QAn#Oa(vs zdPNddbA2xd0e8XH0f&+8O~8G3pEFbnGz1&+I@_t6zSfoJq@~?$F!R9&p$paH^$@BU z*D%F7EiJbLDP+sd^lYicF``)c07m(2o*jY*2O%|wo!dCV{zGBlEU>x|Hu?5JyY;H- zfUPn~KZH35fHS{@En2EsqXk3-S4(iuw}s%WUv)^P2)A5N|O$Dvdj&*K}p7a);)=P0d$#PCR{ovTL_6Km_eDq@E{nLwDf0b?P8LqQhI9IQ^ zCkr-fQmX20cV1vq2bs$lh{)U7T6;si7|Rx{@nK5rYGRJ}1$uCAibI8ToelT;8KRb? zMvYmz*?naEwSw^ib9uSu1q&jraLKtxGJ?-UXBICIMtz{ZYw2e^!CURKFj$!t)au{l z0AI$#$_mussW`zoNM|ljE-N(pb-JG%#s4b~&0WwBHE`mdq#N_pw<|fS3d1ugR`BuS zLZHkDe1N#PO=G|8_F7`cd|*)f3lAkp!#AA!J2l4nx~eKo=j?ts|B3r)!9t_+#|pbM03dhuOX7^C}_sBofR_pkyzP6J_M! z9Ba3dBlJ%hQU~!T5T_MWo$%2YI>1aFY9gazr!3s(Vj(RLO}gb#rV#e|i-0H=8F8ps zqV1aK;DQR+At>8FcUL@EXYiD&Lj#SB5T-fcfqTNV6Lw9w=tfAQy@r|huZG73)U*p>l5h>xp+&LI7xzZUDp&|ikxx7 zGuw$t2GJ66jK-0^02>j$nQ;rn_HtHIuQP~sY?7oPaZfFl#*Nwk@Lbg`NxaJF~i)GXI%phK;; zfkJPMrNij5nU~q@O@o{oA?PS3^FD`RvP762*`bDwbRz@z9$1r@?4h_pbaStj%W|3H zNYf0PszDpDe?3p)$p_ZaGfNl33JBMowfzM)7{pa;^R4zq1{JntMW^h2l!&!iovpH> ziJzSZwjY#LeVKhQC4|A_1eays%_kx6?jdS7DET5Mx*k?9z35*4bP=9;&;!OB4-l3o zz`@CrM4lJdBEEjHrR8Slh<9;q^oFdhPO#kzZ?3ZFja`Rr!AfxBdpcUw3B@<>)2+UvL2+nc zLLX?o4eNoeaSt>&(>cdvrI0Ri*1616({khkak`mL>PN8OBkj?t-~RqmFrm*HyB5<(j-oz z42`iAPoUrAmvk%%lC=%$0;aV(L6@}_%ofQ}kEgkJP8KZAa*td9%w-)~vSdiB`DCaS zo`>2%D{DitNxgj5Iaee6HOnUcmvIRb+;ZMxgaF=w+lkuyH%Y89Gi@2A@zr^ zgP$@}FFxAryDW%%{Qvb2J5`xdkB{aH_!?p}BNqgro4s`_u&CV)^%lS{)y0k& zSbR}v2w<=_S8tG-6}bOxa{_JGU0dC+j~VE1Pp$s@oj_Hx0Rl73Vc={0+oBt<0{)`4 zX@w*!!V<`Z3MF~;9i;Wvb}JIH_5M~L0^~9V>4-Qndy6E5MlK>g1umyoJKTW31N~N$ z51yiJ0I55GrmbxK=*yY+ga7XbA1VKF&;LC5%P)V#unb?X{tro3Q}m-;+^1iw11N}uY)e_}m%2CKsF~yj z3QgXG^~_(X(b-CPNf}~4=Rh;ryD)9>wA&%Af5?!N(jHL0KgPHFN&9}(JQ4}Ogww0- zW^VLi!^gA!$eEo}@k|lS?hB3X9Iz=YBtHqpfY{1ga}-KnxeH@yU?lg%f7aQMkmf2m zvQ0U|1FaPU77?w63A1hkE<#QMM*C` z5j%EE5GEPg9kr3nO*8W39E769*Cv}7{ofR9yfQ|=f1`H04mLEt=A!IXw5oe0ami>Y z3Mr+T;gujPVymIUY`futP8&~0+X_RK>hAdjU8gw*A078+RoIhyGX}H$r@1AFLiMtv!U1@T`z{Jfh8pT^6H`gRm@}bYin}!J zo^-KZ;$#^cCAfP-G>XIZ%t2st1ho z>};t)-)&xg6R#6w)!^80CGHFOILvXx3C`r8<-#8yn{S+Li>H}`%kP*n6L)qGO9vJj zjX8?(`A)AWcV15Ql@6Vk5l6F!ny64&+~maY^w*s^%)ph)->)wJ`zbkg;O#!Vs6hO; zX`(`>t=3Olxa10SBlm0`3t@tl5Fb0aqHHNR5uY}?BN8X*3>fKe&{$F}T;r`a^+`cB zpkW(LVM4!yJcc-}m2SRl_vD#k>4;mg(xJQc8PZ_uF82t}Wq7*158d?*{A9#Lp!S() zqTk-ssXxOrJuR`vQ6a+cXG>)=(snHy5q8b62kC-G=D2vSU(v!3v>CG^0Xg%-`%m7V zD}$3y_odjiT@0T1G#t7yn{G8^3PT9JwR$6ks7dK?amgSdt$gSnflZbmlx_yXp{Nmv zos)~k5mg$c%gnv4?#yxL33VKJOBupKv3PpDAU*q~iFy?PN#)H%y)8CuR(zcb7KgmX zuAiQxSR0s6ei!tP+fTgL@yo0uhi~q0<@>++M(np5L&T_iB=S1kWQ&DpxYp|IWCq22 ze~jbNc2*~67t&*s%hx!<0+YbRot8gb>oPA6F04;+##93V^%dH~Aq93!}w7>1~myH&{`Dq;u44z{-V3R&hIN-1pn(du>ut!v`TRh@pC zfS2}pgS51#iIGfOHg@O(ZEhKJ4cck#@MCXey9*vr=x~v6$-if$+wQ@f&tJuX5xI_& zSEYsvU7C^p;Scx(=b6{k;tV97X?U?h`rQ+nzB-I+bMbGeUy%%k4~ljj79N;ez%-3w zdw`m8;*E#yoC_`%nf&zFd{qsZLboM*p3!y7zqzyWA6tjP%c1|ebn~7EQbMk2hi8Om z4yP=A^Vwo#_(4vd7K0<5qQrq-&!cepjmv+=hmq~9Ay-5q|4}#2 zYO(Q>z(j7G>q>MuM`cf%uy@#|(b=8Ivq$&goC=ncoY~?gW1@1P%!B41 z+EUDO&LpgJw`S*AQ4fEq)Q2R@<83xiJwL^{`VuBei2kWgmjSgJJ%_4A6WeM2>YH0! zYs+ofIHoQRh2v^LM|)IPi3tL)N5vnn#5_52oas9twI`vOg^v3I%t#jFM}d{ny)%9~ z9}S!6J?h(`9|o#!XDR?Fab~}fS{2Z518BPiNiQD<&xK+NX*YcT@Qfy1>CmefO0yI# z6(!J&85xNTi#53Xp*e~L7lom%;!qrD7=u+h+soTe9Z(r?|7Yns7u~+rn*(4kB;-4P ziFX_yt{JX|L=$a2N6TYu9_3}bIw%c>k*u#XlO~_CgYYr1%uN{zP0}7H!#AP>sclGe z&snhc!|@jOd#1wIdK(0jds$K%GTLUJwF%=;LiA=!GJubxi1*99FbP{D9HchiqR_dV z#>Bq^cVhjY zQq}`GXGi6v`NUgnT=BXi9Qfx9E()8-&=0I}!UW0jLpOHmhVVe9kudeP+-7yaw}%sl z+(T&+_iS@=J}gTaVsqSvvD0k2hp-re>T?(o0H#kj&`# zvHhse;!q$5CS45&y*YVVI;?56+4x{b%_DL<*P%$x&dc)TxPcQnjU3$U7y?n6C6U$^ zy6_6x0(VG)16OTRL_fYDC1O?lfUJQ$aU<{|0aum2V@0 z#Ez2GNnFIUR=u4RTX&!d#c%1I>Ii$-+veGl&EYf&>cVZhOq95}O%pBd&VZNZLc9Yd z#X62YF~3YuhC<|3`%1dKW4Do(!&T9$ z_vZ{PtN5GgwwnH~V41Fy$?&q*>edZYeMGG8#EU&klWT&7Zn~AcLCdrcrjoeUpfyLb zUT_&#Wu7T1)wAjr!I*wiE8`ln@w`^$^t#@SQ}f3KBx;u zpfw|Ho+2iN!a+vH!(x~I2v*OVB|vG$q)qZ0R|H+L=DxY*Y$fvq!Dj4xrl6N&=AOL2UfRri)S-VbsoTiq*_}&Et-rl{>hGsk|7`=$VR9sH zF+Tm4+q6=9d(>?KN{AF0&EaKkQzInxelW{PcoB3VX2&F)FToy75%h?!+IXInC*8)~RQKZ=PFohnn>vjg8jC4ac` z;UKQf<)6^yeH~#XL43QXWD|LE)NA=|VE{-DkdY`mZ3k4O~Wu9n+G|7#kdXQIz zzxbs6$qAL}9&bMf6=sgx<8I{Hr5)&L@8(N%L%Xw|BDlOtjX9~l!pt>N#DCq?>xnYNJWS{YS~xc zOf+SfckCMFnYh;2e%tvf?E$rcAlE9LW(GINKKQ#o#52IVDN+Bv{Dz% zFgGWRJ?-I|a^MvY{_P5%-kPQ5bi2{#4$wG3kO4)nFCtVAMZ#*b*BRH00?)*U*z()I z{8vvPd#N%C^+|z)c$9>lNCo_-vCm)evuBt}O%zT=hf7wQc#cN*^6&1eF#)tf(k}^> zV*{HIEk{l-Qr$pEq-e|X7pNiy^yA3QPgHRbez?x99w^I}PA|76j|2YS+ToI=YTtaZ zI?{??EHRqmZsCu^R-;H>Bce~ekxX?x`Tjb7jPQJ#B7b!ZJPq(we!LgDk}e8xn^@{< zbXf<)x*?=moqAs6!1KgX<>CW37CL20M7Q1nVz9d=8i0-e(HP(rZ1&0dS40kdwsvTD zMMtL4jq1trm#xdkxawX`drjyyxCSI|=2<6lwEz6TvLMRB*p;{c2IsfJ*XXtrY?a&l zvW6VD9gSRkD)yH;umj?rI^k7f9%nP@(Eo+gc`3El`TpJVmRSImf`PlzR{ zbGhXbc5`ukdfPaLmr$iB1x&FtRdNb%w4W3k3CD=gNpyR2E;O5aX>=>lmdzJIHNnCE zj6F-|4uGT_ZPqriHTH8GyrZZZX|sEqfD?8*nlyyvENhk2Xl0;O+*I=~wFyNvd)+ z3j+bvFub?~MD%!(9z!X)+xOQqBSzU1u^;%;im1OfT5OjZg2h~2%aF$cjSw*z>$_tM zjz(e>q;E=t!qi@lEXB|d+wbM5FcUq%#fx6`9S2ou_`|{7U3E3T?)SA4N&LUrlGqFSH^_2`@t(MZX)=c22}LQ@1f?;kv_9&CF5=}|zT7#?- z2EbRgv>@M#DhA0pKRQUV+BC7l_f$1#78d5JYD5JNdk7sCS(73Q--?q}398Q|Nas!SL!5wd>^b&P))NYu$3S?w>j2K}8G2mretT>09883Y&O#*GmQcSnkCu z{Tx8UIZx{@%t>I$@Brxolg}`IL#dN&n;cO^5L2koZR&Y)>}BQ}rYUVUNGt$lSyHSh0|Cpa%K91+Jk{5V z3YbApyU5Blf!BK+4i^Ey-lVO}O<);4$IdUgBj~SN0l})==yg}6^Bmx9&&iGL^_UMj zz--#<>)fF$2BgA@eK%Qb zn)Gpd^qUd4BNL#mC8ZjfLD-(i>-qXj@Ssrb09bZ#wVdb-md6=@Cp3Tq`WLWEz?R@y zk|hvlBuzpD2Zx=!$W3@q+wR02fmt)KA4p{|BBW(^REL2!NkiBrFv5~iUO-i|66qfAlkdC7 z2*(pnm^iz0lxw09ffy1Ou(Dr5JP&HTd8S{Y_@w;+7&f7sEqstWa^jOy7H*=gaDYvk zH2wBKG6fn4aKl>@pa4+Gd7pb!~v2J-XRRRG6!0Hej zBIX;RP*C;74%fgOnyLv>=>W3#QGDv8?Q&Deg{PepuBO+r)+(=XYtWkb|mPANsjAXBDh4Y{`t_V)1g0+W~Pf->nWGHg+A0NKk-IFVw6ls0WjZ+4LIhi zJN5Z_x-s&AlE@7c)1pH?AU@w>(B30M11Ky$zU&Y-;5)Ai?hW_D!r< zLw48!2qM0JGjYi%dE);lt~41lf~`Kv_beItMI0vaSbzbe)MK5rLj&R3#~kgOJ=*Ne zcB&;ESkI6A28ym{9fhpg>u@rdL5jpcV;c}aX5qFxR>X-e88J)S?9sRjWF~H=PVcNFhE*90cT{pr)9DHy&pq+42D27pg3*i# z4a`mqFpoG{ins#$X0NCJ&%aycgs-&#k{&vLZErFOFzj91p`NiKXKL=s8*vLHq9E?s zT4a2lA#%|KM&{U(oBBaBPHaxDZ#>;h7nI1@+6TU(p61}?W~eLY@NAQTw6mExHr4Hg ztvkyVmXzr>)8*v#LM4?BI1MFZ9|;rzv=3=D2%K;=euNF1D@ke)z;Yu_z=P#|w$RzW z#R;;VBQq_D3y{X)zwGMR0TA>!;BP)Qxs0QiWRbVKdZodQ(|0YW)YUK;+kz)wM;Z{- zcCVf;H7uQWaIdpm(Ivpwd!%OoPY++o$y`Hl)(5S zb6bSKmryFh$)t)zVDxzk`WK*kO_$G$d;b2XJ1Y+Kq*ULWr`XBb;+1@Cbj-DHxI|dj zjJo5-x{ruy3^GYl7J@B|3Egs7hP$UWkjRW7L$}c9SM-3sQ>*F=6rn|MVE3wl^6XvW zJc3V5nSJ=Grh056+Bh2qXg_RwN$6~I6F}(rRE|w($+ndPs^poeaJPL#i;>iuGkaNo zL}FrnJl_~e3p&=URRY*{PZ{>w7V=aYPXTJiu;(w|q^o?bXqV8M5>`8OLz8>e_{V|p zAdD;nxk_*v?ZEo?(NM!}8*Tyv*Rdm>R_WON5P(nl!mB5bBq(1|-p2L00J1r}(ZLtP zdAz>mZFr5Z6G^u?=Rqk+AhWu;cYx2p{YuP~VL4PM6k$V0IMgZ9X^ZtDlWOKV7UdMp z1^kE&`G38ClJi|-skx9x8euPwK6E_CdyN}QUg=n9vW19Jy!b7sB9B8cL ze2hEia2QmDj>(cZ8dxaK$o}dZ0u&_3=}9CqhjE5-Hz)F8;lj9tF@rBVTZDGL@B5 zK-P$4Uoa9@Er>?MQS$55__4G!a7It`WC;x$hI4+HSpCmGtqv^t<+?Lo=)FtvFJBs! z916Xv6jg1DlYoH$fm#t7$UHE(;PxFyH>4e|6d0N>snR6c1f?KESaY-sBd-lTjs)-K zAc;QCod$Y=EZ29uIUt7D!7&YsfE{Yx%YexMq|J=*a3MK%kWj{qk7S)a@m7bcbO=e7 z+DxFU^k2^)xM`(`Zb&APq=WTlf)YK&yrsSTvLKB)?XK4-PrOJsV|8Z~I4Pg(r67T8 zPHNbzNja}=(8PE>+_Inr5N)2iMsyCl@NR4dA=>@uu4OAHf+$yHjkWs51SS^bHxP)Vfl*{aO4AjbO(n_HcOj)T+?n(O zhf6?VwSYF1go?HicpYpzl1WhQ?+E;!cNejo%+x*DHJvq%fVFi|;bw64BvM1i8ev^6 z{N=e|sx5yer;H^h!FaoZm9K*0*sdwNQpW*or`?pBM>XT)P`Qw)36D17@3 zL6C#Hu)`=)rFpdnuxXVzeOTNYrPZ@-E2kHkVNBM6dOlZXA#eJ*tLsQG^`S2gQUlM! z*2qVXak$7@<9Ecb>o(N!gqdf|`Xfd3KJ4+|aWxlN+xq76j<$h5qi88HJ}-&%k?NCW z&NY#J+Bd&EBZYH%oW)_sO<5Hw1|lQu&r#_7kI^x0(sR#6LHn83sec~uJ6sva)W!izZFY( z%rF~OT8Kih$n(eV^vcOh?XbW2&ZaC8vj)eqVy2-tsMk5F~_{yxX#Gekavt7X^qpbDj?uVlf zbA9`CfsOyQr^Hq4$r+k%x00~$$$sVba3DtuZojg3L8Z7H`_%F%Q4~5qbPh!fSL?gz zeIIQ>e7kNxCoI8xn4sg##8(I11OhTP21_Mr@`v!Qv-{cx7Hqr4hDo9zJsZtM2Z3Y} z`&_}PUxKX;0xl>mSD8VpDsVwcUx>eO_u?F`vB~x=N2z6lJ3;Tq-l3`06zGs6HD_8T2pO;Xg;_J#qN{bt567 zZr307<(WE)bBARwVQIPxqluL;HD;k}oU>r7_&4|RVGR&IRYz;A)zF;E5Nk>GdS2|p zgI$oKTeb%1^}1QqgOQt;QNvAi0m-BRbjzl&S_HA+Qn=5&}=w5;{2TTaVDgb z3zi_4M2mUj5RZu_rE_j(5#e@;%~F&yHl6eH~S$3Bb~Fc)sl=Of90+V8Fu76gs$cLEs{q1jMc2 zJu0TpZ^>}ewSZUwrQF_+yG+?TSLMD7@7f78HvzgBI8gVbub}@iR*BcEXMVTawZ%$c z>s-;}W8Zbs{IXY-@wZm|ZtEd*jiy$2f-DmY* zo}mfx^kRhSTQjOzT^ek_>5`n|IurAICSLk>>*{}O{ZuUtj%bJUvxNS)U$!!rb8jXD zJgwlTqmAK2{sar1KO2|NanIw{&tXb29Kru__#Bca!TH8u`(q$EBvFS;Ovv_e#)y@z zZO7i2pZ#C;4g;ve4u4IZ+>S!@t`iyTt(UNwcQ z4QEz($PLfkQOPz?R}1M=A7h?0adm!APM%31wuUBJBv2FL*lvrD_1WnTK4yQ z8Y2^2tWPq#w=4BS6D^cMx=64@nJdre5U`7Jva>09Sh3DyHeXWYeimo5vr55b*2m2r zE)&d55&T`xvOuAjV@Hc!!}VQ=z^$CKk-7NSKjFBcU5|EmT&9=BjtK=H{s~ZXWkm|( z*fIevD%R2bIriX8((x#<-By1%{cqH3>aO6$Nt}jsZRT*}XCc)W50aMNg0v{P_$Dz_ z8YW70{<+r=1Cci91@H>22oVlxxGp(*tlKQz?rT=!Qu29>6D^zwn|a+l`H6+TkXbaMp4vxf$7(dLW5S_0oQScowz1)v@;cE6qvj0A?mxo&2R5$kQH z_&PHM$oD|tu8q9yuj0|~EbpG2z|JQnP}oCg?a-_W^I;HT3k-r)%jr@c8U?@BNh3J3q2kS*;!NV4E8l+Lt|(P3KnlvM0qUzki$MqFNWSCLVd1$ zx*8(j%2nLLTl%COx7a+|k*F*3R`Fx46tW3dNh&vPIe8S)@mTeHw?annn&CN=VUE2* zuP)w&gHK#F0$&?Hj2+$2!R7Bcu6f7s+`m~^c2|M5ZM&^f88Zpj8&UQiRtpayRU8XX zZVHTd6UW=_9$7(m`_LTI=c%6#0_Xxa+8epMM`fJibl+tkFQ6UmR=hUiP`Z(2$1TZw zATOZXXR+?&Rq=H%tEXX6RZfP4XpJe~c^uY_;6_%f4kophe17Fdi|W8~5!RlG1-Zy7?mK+5i{gs|9Fv>uZ;F&;E`0hO}jnnDS3qruC9$(s#T+R}S zTzFLT^71N;P()!=F$lJ+G;T>slC;C@uAeMMAbI-`0lynz=u-=LP2eSBlIPyRBYBSN z7`axRWG7OFXPax#6wmLml}88Qgpd@wj(-7Z1;_9GKFo&QUJ)M4?bOnyB;9N?-`|P{ z#6}+rkv5p2LteF7@%5c9=cO9~u(DfHZImy4&0ZCI9+y zWa3xrzRoRQ?DYU&?9-Qr(D1hK^}Urg!lD0Ec-g-g3*CD`}KN`}g+l@&C1hWSJm z7CQ*Lqa~L~^X`EyG#i%XMXBQ~WD2H0jOXz<99jnbXX5Gmcqc1{*E4wSe;34)Ho zGui{FC>7gv8&^*!2_CVid~KJ&8X-(cz2zPH1Wyj`xdcGPli5ckR%vrQ8tB zh+nf|QO_?kwp`&p)^56~-vAp;us3Sqb>L=a>s$6Ki*Tg?E^}9{8zZTX9#% z#$6El8D+Tiy7!89fA<~&%y$cQU1R=cI0R=VUPt2}_CR^$9`PdbVAuozfjS6p_3H%b zwq&RP*WRn2rI;Bx)idEMUg)Id&A09N1&qr|GFRAdB2K|c8*w-1YVF_()!ptH8tdpa zxfbbve3f}!)!k?m0v$Z{2Jbw+iRN!5evfR!aAmIKZ50@sYmX0_yjbBD>E?-ZwZ{<+ zaLP`@4BTzNj-Era&=S?>kGMtPzxOOY^+^arqqtX^~=JHYVcf`|qdUN(6< zF&`|xVK|wjbsGs|d%r}NP$^iCf<++bW=3Am$wJ`~GZq{{Y`ws(#T6OlH9JQ;p5D2NcO+PrW(;M;?-wVx})J#R(wc0pg+e@^SLFY)?2266s7* zb~j<#v7SL0PKe&Ok?1aGt-vAERG85Z^HJo{D{0F+xOcLqNqFQ;e9wex{hEOO&z%P?x1pWG?JlzIzYinB;PiAs*D2MWNtl zn`5f3F~L2+=pAErRC|eg4^7qhK{hD?=Ny`nsNROK>!=Gy5YVFCSM&t+I&*r2)(MN9mOVfQIOKMNHQ{{O)V`YxW%5O#%1)Q z4PF_v?eWSEW4nzPeoD3;w^oT48nvF6G{{U$(Y>4ur#Y={iFe4DgWo*XmokYF1|*yE zKr{YQ(6q#i%^RrEO_HqaLUqMr%k6J#%2U933l`g-1tS*|>f*8EiR*cfAt7OB1krcT z?NU87z%tu30qCg1wSB%3%yyYU|7`qKz=~vAzVdray%}tLOFAc_xTbe?*dxA$!Z_aNR%MaQ)PvFG?}H=*Gw%PX2X;&ngQZ#ff~q#?Cd^ zk6FEWRx<_<2i>U12e>g2E5_hvha9^Qu;V)}LwsZvlQy>J+M*xsQ6+WbV+fm#Z#Ls`}$^piVQKD27_LLBixN?olATm84+8o~Mhov|Nw?ct_s?xpZ4%W&XaiP# zuCdQ`HfN~v!84)iMtBVEE;*IY2zUGOL z`BVr4M5paOUHtby-&y$^lg?Y*DOha0xqorHa`HX%l-YG|;HiJeVCN1m?3}S5N3mo`z7th9jCBSm}|s^N}9w6BOLR{nidd<4dmRz9+H9sx}O4QjLMnl`C=waVG#Q6(?J8Pko z7+QUcU|zpL`)=*v%&@3jH1nT80d-2{b6}4~aw73>6e~tcT>zOX>fB8tN277@R!X%p z^}DZ)`m9;FJWV8}ma}w2l`A~cyo^SQ{S(jMzX2aUR#-~%I!NwzQs)eI+rHDorSPZldDxfTL{VWThhD_i9tuZ zuWr)SGse;OgfCCFB|dkiiL;2sS`27@IbgSsyM^P^9#Ng3=nq#owHUgiC+`mL$Z1MMh~? z`zxqx%*bM!2qfgmDy7qfg7RZbo^H=?#!E8)>7>KT|NV5&@9a4{vt5scIRQz93*q4z$w%fplkSBrqc~3&P0#^1}MdDmt2p+neD@_Or zDC)%&Q`-rz4%2W(O4=AqPlF0FQ2^KiIBe07 zm5*F?a~09H@&XO1;D)Y=LpRg|{w#fbvnP7?7bt1Rb#Eu>oE!g+s_s5^3of&Ty~diV z!WrJkweVWR6jQ^H1_sb~_JXF6T>)>GnRcI5{H`0meMo|-#Ua636Almk*$BG!9>WwR_1F>pG#F-#Ih z4ke(7Uf`JoJG3Ch%$rA}r4J6>l-`ticJ~Ca8rnT)mU*UHf8SRd5EzQ1y8qr20VNq} zeJ&V(=rIE75gN`Q2ta&>B7EM%FSW)Ba~QKM|5BY{GkYEr6Jekd(h0~3wE+YmPw5u; zfm70{c;zDvanLkYbA9}mTPKl#7twNhgZsc zl!uSPHJwHBcX7ln-h4^_ZBd}+TGbTWeczpZK>xB@tH-RUKu#2t$|6u};04<&Hb7~_ zKAXrvyDKFOupUqwOy@x z_DfUa2n39}xAl{@@|8=#N~A{8sm3-)S>aHkcd+O<8_C*UFEjIHQ=lr_~0a7L+UPE!oy{G$VbD!d(bE$OT^&Y;Y*#XOE2xU1*(}uuNdyT`48Op zprDA-P?gn>sCCw3Rb7OQWf6wSK5a4b&-0Yg&;aCfqfMz~@`-4G;? z(qCAbp-4samMIS-+8Rw^XdoG@N(HBoc9AAhTOcy>)`K@8%0Vd~01J$~&sSB0hPO_i zSQ%V(271@p8M_=Cr*5p|Fw4ITS92xw#Qm}vU%w2XL_4ge&tA0x8Hk@vOy$ZwjN~0! zM%9{#NTXY{EMaU!&ABio0k4>>#jO7p&+sx{RTchgLWy;Js!oGX=U{W9m@0)tXh|Jq z?_v(e9xwQ|07u{ua>Utq33AsynCI!i2Yl9ve}FhDHlcKx*WyCF*aOntI2dpQeBl{|>_z`ch z=g9!Ol-e-dGBR|S@bTm`z7sol&6)E?9v|So6s+4-B z*woE4$+HrCGc25yOnSjPc_cK+1Md#Qy$qf8I8$eD9Nr@@DcGY7UEX*^FuVM3L9C+6 zG3gGcsXf>mN8V|}L?9X|j-oCeItKP|EPg_mSPdJGF7xsatjQjx*(YqEBRBkf8MmAg zZm8AR^t-7y>+v}w#4;(ui*mm6%k0S8^PAO>~ z*5w_%*l@v{aA{N&X>HpFYm$x}!IgkCtxr8hC7gKI{vW1fbNk`zM?Q{w#*h2P}z_L0rOe#_^|vKc+S~8McSL-trlHMm}Vy zz;_kN4rY>xsVJu{LdA?0(1nKNZ4$ z9HcnGoU=hSZolfGsv?WC=6p(XgAR z{ru8i+#>lG6jaV|<$<+dgx?6En9mIFc5SxX0*W+_SUKQ*OPa=kKMgYuX6Oy;Xmqrq zq`(y|#b>?7U-zGi3?6U74#+^=!iOvyh*aevx9~^QoG>CJXvpaxK1-d|GFJDsCj5c0 z>?V73xY_fLI*RDs--!at%)T;J209GpL9RHb$r+Gx^4&-Qi)PQq_3-yxzQ zKd@{Nu7%9vklAR{bo!U#2x~^4YQx%nh8KSuKFoFc zm+_1uRP1Jp=al<{A9G-edn^j!nk%+G?8R_aj0cP!iYhs$h&0M$2Jx!bdvS{FKhcg3 zqc@U1ABV|_6Ckka8k%rnXO9{tc_}F5JwQ zHgGFhgTk>ChrZn7X2DMLEIRyVFMMPNG#Knj7!YH7c1vfh#>g?%fX>Fttn_JY&?GTt zhioqc8Va0kha5XzKsm(7^y065-vmogg2;=bEb@nJ6g<7SfAVoi`YNn-hC}#chorOv z2;De23h@k%QOa{lc)gK>c7};l4heM)87=riB*loILWDZ~mya@Zw>BQ#61zT__h;g= zAE+B%{j+lG=@(o7uIOp^W>u!5j2e_M5Cx!NoSM%(5Qcf-0IFF6lt37OGq@^GHJFM_ z-<0k!l_1UQZp@fZzY$Lnk8UQ@9Z!CVf@9&ITld$FpxSCj^QH|5{&6oiMOJdXAM6)s z9Cn63mSdM(ZZL^8*w*9DKZPCslKDzg6!3aSn9e(ORPLzqumPo}WdBfp!-$}p*CaeE zMHyeiklyt9SkPGAViO1NnAjG*ZNj-09TXT0O;u_524=RWc8OD5v}Sp;)Z> zP^*`qG0#DUj6AnK2q#8N=EKdtB;sW#NKvpsm1=$Z9DLkJE<$G}isL)qKhT4qa79ndve5o^_X`C$?37Ktk5Z$$l8)Sz=0vd872-sQLkK^klCWe!>glbd)Lgew1LRWILU~b0u5us5V{tP zLWDifLditmozI|-kJUo-JR5Bbyd@PI8e~^^uuMDzt=yNXWt?KnivE6=u1wcR-!H-m zJ#6~X9H9n`yx8qRypmDjZQ8(YSv*P~^oLPI$%(PsDA> z(#>KI&du_I0eigPST$p-oJDcpcCEiWz}Aul=Zqpm2EfJ<`3llVM2dfBb(Sk`vN6^v z3ZE-qEBW>6nnJhwpS@+cf+ZDchm;(fM9!IS1x*HJ9+r7h?#U2V-~3o2M0>@+-Izq* zK8{4ZybLa~6wn4KM;5j+qU#y5m4p{wp8J=n|MBoQ*?SLf{dxGig)7hf^Z)p}?mnv+ zA*5qGN&$c6G$U4&hMfiyR-?}FEL$1e`E1JV3P>qtx6*^{vVt~9LhS4ytJT19<)zGh zDlyhwqCqCj9NqSv;ic(BEgDl_3)KZksb4Z+g(Mxa2FreDee~5WCbGb$p5C zuXMZlEhv8HrzKSt0`M!hE;-5gSt!yIdODTiEXy*CMV>55G{lpz2J`(BYz(O2a0Etn z`zO#d@n&61z}=}MsAJ*3u7Ln5FLr(@t}9p4pRY@8@F*Cc?0=;{Hs{-E$va#dY3hF7|a=z3v4Olqb@*|G;pefe}Q&EK3|3@}0g=K)t5YvrVlX(Zn+~ZhA;E zp>UlTYtWi_mZ)&(Lw#%G4R{kazhF`#B6O>9pm~OVC%4JqZ-;5kHWc)L*U&bc;eZx9 zZxEh!3p+{bi6gY-RPzH+Zv#uOiwe0UI04U9mRd*gIbkv)A&X{IFb={%7ARMB03!eZ z`owDMtLhAH***KO$23i%ni$B{Un%=WC>!&z0d>2 z4_ROwkm~U@U7PYu@w(S2Pp$!skLNI0)qz*lAW7Q6IW%NLMkW50nX!rnY!c z8NLuLzzaI>Lc?06^6>RKXmXp#EUW}^c7y~jmR15jCZz2+PwwEMu6JP?E~XTVo1n#( zBk~xo_8jeHxYL0)9eX5woG3+Hw?MJ8Z38 zZiN^BT=PQgpeajuyJL=pqd)xhlXrVJIYJ8ntNr9IXFJAom1D&aX2i~Kj`!51DP8xX zULZf8;uRekvJHZG3x3mRM`W`VA#KjoFAw)x1Etneb@g z7|(~=ulJ8)AoU^~$?^J+CSmW(4=Q?DXQEE(zu$!`@g3_4FbD8eMun05i0MIXp0;Qi zA4n|G=7`sHq5*@`Munriydh6GitndwHwWJsn5Vcd=HqbC8hE8D`I`ru&*e)AI`bQ! zPOVjT4nq+Xd)Yyi^)N6wL@Q?!^qoA~RjBViUc(@X{wIN&&P0m}LvPfK-0g&MQP$a{67!l5Q(Jm0F2eas+ca^! zaO>n?hC|wGbVSq;xNjQ)%DTFD3I@a(Zoa>geqZzv%Us>?HfqSQTvKDMb4A_tfD4a< zCLo{&T1skW^x_6A+EKc(w;+DT1dRz1RE11z@bDe%66YOdyb?2v1VG1`3zg$g&9lOP zF+1C#a=_~%)%)5=iAP7o9uC6tZ6S|d;mFU=!SI1`TtYpNNp8jYh8^KNq;UQTsaC8+K z`w1{EvdB?}7#0HT#yMb1NB)DtjulThWA;*=V3blE%nTLM+(P8B_YN*0QAB)0YQ)0t6<=C z(MMraC5ELe$fP`giZ!<_#2cXI!4{3ojWxxM)Vm~sre)bjC9pIgJ}I)NrT{8eVUaAJ z`gElZC$9cI7`KsHDN1uj+bqRatP}5o^4S|LJw6xH8KQFzuQ}!mx`0lQJewz6d6yg$HS&z%_n9O?YO9usP+8;_<;bo zI3NWq7->U@41gPG&(JWeU_o~c9e&QT5Q=fk8Wh!lPO%HI0Z)y* zqqgmJC8h%R=fIouK32sx0BHZ*d8Y&iTLVTLaPeW1*h`memB<6}nA!0nhb>SplN$7m zlBZ9;t_ffD@DtFHCE*N=>j_-4hdvUf2oNE0Lx8l1;33Jz_!Gu&! zy;hImEGBIRFx=h%%=Y#Rr3$-~yFU!aT^X<;>pjI7c;LM+S4&NhYhln1xb6T3;L>{7 zmhJ2l8dX$}^A3hcY*3o*uN*eLa!DE)XLT#JNcWS@lv`;l_KEf;2C`I8>yM^1sD-*0 zDW(D9wbSVsG-AJ1UVz;9TF5wahAm@Y3rlz_oNI^cQMIE0$)7EGc3g#e5;uyQMPnx5yt^df~q74u>Vx#FC0BzB4G`2!p}jctwBwjWp_RRoj7Y1liE9Z$ysrT z!d!?NGWwM5c(a)|zOjyKObho0lHXTrGld|Jh>C~=*1sD5j~0LoycH>^&O;Orf0g zUnmn)I*c-PEXmIlVxh((HafTArrbufb@a40s=altt$siYVE6C$d4gHs-(SqFz|TR#qD6e7Ti!KH=Om}fORUw9`Q z*Bv++_Kd=yb&?fU9LcDdNj>CG!p9BIgOuv1vaK@dtLz-PoSnaD#Rf7j)mdbf=?-!% zPruxSXx;hg;)jth2gRZ8Nff9D@KM`Cf7QT(f$ADt>hqP*H=UI62XWcX zDNLQk6Dv;1fcf{?KlDnufWSVGnY97nY#xl&S* zp05S4Sf%#uY4<+G()f6h6;t#$%C5`F2a7O)pbr4r^vu*?QQBnuv|3g1-?{**9S5%&P=O4s3|4a>OLD24iJ;5tOn&@#dd{XAvWJI?*L` z10p@s{Ku~xr-gD3Ox%!g9w!>g*V;ZwDbFM7m2C^YxC^>u*XBC58ON_ZHGj|f#+>g% zu>=o0g7V_ExO>4+LD`3k9VZIC!DKlZkt3?WEmruxIi4Co_^q5Xsv*A+3_f;2CxS;6 zF6v`~27F@l{#PUi7?f8!BWYwF>YdWr~^rG2!UGh)6L1Q*UdagW77tnw~n1Z7? zA~U$58{*LJFx1URr#^xAF*@=Nx7*r-IJ$H?=6Mk_Qw_+ksQ$5 z4gfLW$1MgF87`)e;aJ8DlOPvsFjgPmHu4|@BL{7VDm<`&D!EP+&T;S@?BuI{;*Q=X zS4$ghx)QuZy6rfVPWf|jssb4v&JiQKY$FFB-ZVED>?FT%>C0~PTkh4R6#ytiKK+2< z_0`C@CRfc23T}M0D1g_L35IR29OpPDF9CKWk^0o}3r1_FOKlUTl574bVdj+>pG+T;$3_Jg<@E9KwUTf>Z zuAXAGFq2j?%U0a+C1C-^$%A#V+JTA`N@0sdu-&Eer>X-{5})0e!)jyA!;mfPz> zS9x3S!W##lShBNV(83&+c`W3eW4#eSD>6{q%N7nI2#~skGzpuxxe@XsNXK9xfLx0& z#lQR<&k?yc#s*~-_{UbOCA2Yyr*P}c-Qb335buxl8ZV8?L2WB{E#($QiwBM)d~rLD zbaP>cG6QsSlrKCC)&fzL3|!gTKr)Q@cRqh7=PR}A=vH&`%ij|T`l26x$`T@RXlK|D-Xh%8yP*U-_(RDJ$YVDDZ~>d?RdWkoHd;xGiNsml@r1eu7T9}h=`B=TGxzrP zaGwF_z?*&Wvt^lhFrOz+(IVfR%3dhoABpc<#nPM?7iSIRvB>Y0&eY+V3%##aF~Q;TTf z78!WQ1?qPtfL>WbNHq_gHaHW9Y?V4ka8b3$%Vbnu=k?7KTmQT8*-5~y^G^Gg1oDIBHM7241w|zOn+sq5#8fAvhftgu5e)^}c z%+oiVW$%jOmu3UZ4)pY8x5j*GSlazUIX4}jFudD%4m zoc+;N*4#1CK2o90xoxY(F9DK9Qbb)Z2pq$%dX?78Vbju6DoNJta4$*ZM+YmcFl{oa zp{@4_&^_{JsZu&n0Dq9HSvK3cB41S;jSQl;2hU;B8B_ogh;9l2gV#XGje%%LnkS6? z({Enk#Y*Buc(_-s!G_%~ggzwCGzn9WWh}x&jf0unoGEJ^CqG1##|kJYRK8|* z>5>N+wuk_~LZLNxw96Tttk7EH1||xD3Wn?&m`^BO72~+)X;t1kYN^`h1;V3b$|g?) zE&4nMRuS;#T)U8iPk?A+!` z8orFqsQ~^;koR0HrN99wKp%WCt>2wKmps*uI2K*{^+ty7I1}|MJ~l!Lh(Z(o2hnCb z>~pLg(zZcM4|HKz~_c)RpQ3&#S3_A_ri1Jb4wJb-@OEXE0NbTHnpups`^Wul543V z5uGvMp0?M+w$Z*Z`^vIn+2-!knIARF&L#l5CCrf8wPPy=3x(-oWZTd z>Z$?}KxdvT8=C}h7Yxk??mjte3&+z7Q9P)l;96WeKr?5&wyP0K-yp~s)DRj%Oh+mnUY5)znRS2}@g?@u2c~2LrENSYm-37p>cc?d>f#ojMAwT@yU`&f-SNeHy5(@Z^FSj34ZVSbpRI zmS!|9=L806G@(Z8xfq$1#3RF$v7!W=&V?ysIc6d7NG>$j8>UZsn$-&I2p(XDU_J%N z=z;?IC2?~ujx%r-dqRxIn`o@;9%RfM4GJb8a;6Uv&9da8;k?0s1QC%GvgTa)Tl;ww zE)|8IhFlPByug8}r`dKlF9{>#$FLuv z2#U4YLD6H#_hRSLU5xm-V=>}aB+c=2$jn5HRW!0p;CQ#Rn{ARTIRR%P3kuM2oYcIY zF%aPcZxMMq2au*siT0&eQ)lB+V@cyAoa8^l2GBsDf2Zko_+MCBsXTqOU6C-2@$z8< zs}hAa{z1Fa3YU_qgFQNz&WH@G8tQI*1DXD4Pw`A3?o7HKSBTBc2;NB4HgXF=Cz}|< z?S-Ef*A#r1jL1I-Cd8yv-G3^zy$WVKvPmC&9l@3)~8*{_^-!jx9%PR{Qt?F z=d{e>1LL@50Fr}1e6_XlZIm+xJ)HksN5os=EEpNcffC(NNC~E`Sk{AZ=?L;q zrlKMGmK|rZ0}Ayn`=nKlcm^EXtvgn;(X5@n8ov9Vhw7&T9<_N0U@d(P!+bDR4TAAhSF3k|{2Cb~97tGH?YGbFbD|PwC**1!<4U z0@JIBA(iT-JIBuplK9_PE!YnCyK$MTiKEhbgK4bwfc)t8YX}qwD`Jv0!_`(#bB2l| z4jv(;fxXZ%l>ncl@EE6IUqO5VEbDlbTS5ZN&%dsr6EAQzsNILZ1w%L%@2nH5s5OlT zRS*op^x!=4#G}h~On)Yz~%>F~8?ROoXvDZq; zQ`f!*PX*P0Qx!JD;g@3r;`wMUfKVZ1I3V+qMP=b>b>O82qs-1(!TSeDpYJ^QPt9>u&)z5WaZ+8&B!n^qNUjR+ksouVmM zBE}JmPlTffe)ufyr}eF8qjngp$pE~uxNI$J-_{)6=qy#$7d^T#cYU|x|2XP2B=dkjuCSuzmRsDn88d>@xjVd=<``u z-BNBo>fqNH_9fS@tWl~DGey?$>T@#sXTrlB)!izjXwunxQX=Ifbq?)V_&sDhaErpH z!ng2@ok*Eox~0rmtU21vLR5gF4R5oB#9!j7xbc}dc z?f$^^{uWT^JwD8^(KETGUpVs`V3n!K2y@^OF+e^7*R99M?d(9M(D4a{0f%N`jK3$8 zrAqQQ_n#m$;pV?(5Xka;S)=&!^XHzsyU9Vyi+?Ep;wwj7yMiLUzlhl`W+bO6gMvNO zxeB#*p&6)jcz!7!9Zi*kR~7EWt81VKGjO1GGjc?Gl#A&t zqC*IwNFH|Ub2UES8Y(V1H5w4umt1pE2l)a#x_( zH8sSZ3?b$raQ2rL|3#jJ$NlIduOe?ybmm<>Ybb~pmxn&iEt6YZr|D z7C3n6%L`rhs;5~TP|%#hZ_&UsF%$@*GorZ@F5tw)Z2@_d-wY4rwc;=+ax$zA4^}9~ zJ*s%HFW<&c1t*T5^(y3sbuPS4Ev~ggr+=DkR7+hyhi{xsq|RPK$^|N_z}23CQ(*1k z78Z5Rg-WGu0AHu)SEA)(BX+^}GgAppOjpUurG^eMV=)_vJ%)Lf@*-PQFyzdFI}$o! zO>#;)?19>x8*s@*J|+_ZdAaqON)2mx;6@dl*_t1gc5o(e`JzSPND-2|dJn)#T47U& z2G`JtwNKvd?Wr!k^iwR^5cIc@bFE57=G;z6!FEOs8p7f+Wde1*QTF;zjIfra_&82*&4448sKqsp9b`Ksn#Q>cPA(d% z0YuX#hmb`r>#v-OCj^Kyf*WH&>N(F5=PJ{DIYwo}LDS@U*RT%`{Vd1RqBf*Uo9N_L z%h+<`!6TrN9DwCCG9!Wf{>6$5fd5(}8hQd)dYs0nno+E?*Sje&h;b?Y&d%Hpc>`sk91 zsqqXoa3-v^i-UW87q1=}FTKHUaqWtn!$7J?_Mo|gzP%9O*Ao!@F}zr1zx|5^Q!i2Gg95C3YpT$Jbkd}_L< zVFsg!1JW27{3Xs=Z2NM-L~cCYKpJVw7gCWBKsf?MFn)wvjYwFI23<1%j4v{I8wT~I z01$kyboL;Sb^-}udEyEyz(W`kdD#?RCgaLsedJbqf6EPdQm237>JeBH0jb|fWDb&K zB~nK85gLbEj6JIpkVk=L$H1cgAOAF4L!<#d>%JVX?6vkMwAM_hR;62(!pg8@Jm;9k~ zo9lPVM!LoV^A$kGorGWl__-wl>Fa@l+CbrM#LC=XgC{HzojzDPL)Fyv;Ohh| zBbb8I5CA|?-dN%6f$+W^=^N;Hd}#NiGpIfR(kT}Ro3#6k0NZ2k$}5`cC!3%uvFycX zTdEz-ymqypjR()b&X09WRM*J#68@kK8<_!HwJf^QK~s$la=I}&3P^6I@GMOS=Nm?3 zD?lFm_2);@Jih0;OVANP=>vF2elEyuERK}s7=i|iIA2Eu}-V;-H9?B5e$% z&g;x@G48i&RSYtLZ?K`1N=-MQ)3Um`p(L>JiI`dH9I-+T*-%VZLqn+F_JX)zsFtZ^ zg1ma?$sN$|OC|5wi}HHfr9X(ZJ7kR@?KedU%Z~0x>HG}uI&=Z`R4$gz?>SXPAedB+ zPxpL+jP}_zrnPgp8m5~0ep@*>5;tUm=LR)+3 zOrlM$YiPn|A>%j*BqEsIdks&1g$(UvU{;Y~pk2wnZL^f2EVubJuX3^cjUPArA~0DLF>H%F!TR?k^T^AjGB1@gJpeUyUJ-j3S^A%$Jh z7_%X4M46c3^v}@`=A+K}68#!S&T%ifH)E5AwjIJ(h8;bOAa#b;eSn#x*Mlm131Gs_ zY;t1TNTVcukEUr+Qev&8U&jH=FfoI}L^FT85X}NSXsC*;wK%pBuDh9eO`yu#=rj_l z$R458P@HjGhG3;_0(J$Zs2`b01y2|LTO=y5nf?XUb(i^}$M#xlPV*^>Pfy*nO#&L9i+b3Dm49i_94|8@YvxEg4%nkt}iL#d+ zjs57V4NsX|sYdwXbTr)U5PXwEf8;M*bTXpZoY=qo^Y`v*;V5P&ATd0GbB?z3d{H(`K~w@#AKgWNv5A)rJ;xCZ2$G+?PrxbtHVq_=75wc z)O(jCRCTn@w+g^t^<1S3=BnH=Ngm{_hR$N z6A%jOGIkT#JRstEz_teiPIK(FBJkpi;4N;eR?W~8gX<9Y zgRHCPccG{(I7iajw8%aJy;~G=im>DXpb_-&!YI7n5EY~Y0${W7qzLsuE@|MeziJZ% z&|ms9F{r-_aL{I>TAWEj(yu{=fXD%IQqs5*0$3D#`NYvdxEfF-!)Z+oVR=y{7(B0p zwChx^565rX=@`YF`2-@s8^WciP96Y79;;uYE~B#|tJ9QQ|MkUIb(%qbgjn8%=z}MJ zX&PTP505#ySnI>73P%bSCnws)ic35fAgT1k(z4On>0ekX{`u?B(PO@fcPCp1KRQu z_0Dh~!g2XV?3cQxI5s|@U=GY4@I7_(H0*@Wh8f!EjO=riN)Ow`(HsB3Ppafwk`K|L zCyB_foTUcx8^Z6LzKNd&F5silit--+I5OLrAvRcv2(*@-ZpfQ`4k?J5!}hV7Jih{z zXI8=u8=FXtn8$E0#w@meVp}VL?->mevLtvojNj^JCAkpKE(*l;NDpQT_h?c}@S$!h zKef7fnMn2|clG&4#LeMz#r9R`nGz~>lA2vzIQ8om?zIkowpXdymx8n2x}+C#i6~(U zzhG{z=Kfk3e0fsbClCJHYK5g2<}!)Y zTV54nAI6ulw1u`V6^~g20o$pl(Z=M++{P1}+Y;U;&8uW!?6@u?qVAwuj}cj47&Z;6yGR>7`*jG%(X~6W@Es}0=CkHh^Pu{HHdxhVDi@jCDYIz|5#uWQ1{D| ztcLJqoJ5xP{@5vY14Jj&fj617S#0eB-?f>}IO5BIk#m~slApm+&7xaqLTEOeI;A_c z-e!0PnlbA1o;R#ry4qi5YVU!>5z%4LH3^V-I$2i&&{^ICgYZe$IleKAVx;o+9Zo{$#1Oym^fmt(I*eOkTst zJ}(Fe)`M%gr8e+n4noLjLjRB+D)9h=`3xDiPB=UR{RA@Q- zu7Bh@_}|~hbw{mE2aervB96fdd^j?cC&!jI%WAII4f|VM?p!EyY6^_Z6xaDKv1ttU z)>}YWg%hCPLxhyIn&~W{y4mCjJ%X_GI7QbLG19?R77`Q=0=HWA0RIKs`Z(%y9%K;! zq|IQJ*mQ+oBtsFk=|9hrMh#X=wO+a)K(?d}UY(snFGA#{c{{^z2qq%$Sg~eq*0*Ev zOC!3{kVJr2=NRn_w3oqOZ>Dh^h;Yf3Fe-%b;23X+8|m6%-=L z-J8hjM2moUy$l!vX|`>lM-)7e+Ks%`*^MlRh+P#QY`FRygtMrhdf?=SVuvR*em9;xkP~eOnBw180 zl$|LJ^z*1Mm3-grOblbPw-&lJw&_O|?(i-lfmMp|uV+HcWPHtuShC#vSgh|aSB?z3 z$w4qLILBkcLthBO_g}R?rmAD6ww?LCexq}7t!omJje>K$F30k94ZvXf;z7WqXx3tP zldYdNe`g~I=vs3q6C_8nToo8tVO=a z*)dFd*@hw8WUJ=@UimBliK8A$M+6gC6Gurqjzs?QD+0?!8fN7@GDEXy%akVhB~8je zGRL;e`v|rEqp!@B=s~B+i6N7`Wvr)DCE=)nOqpTlZjoUfC-5`Hxqgd+Gn`A>K_Q3v+k= z$FIiM|GN9N;eCDb>^mZ7aoXNryePC_5SDePL^iHG%-AN%cgGD|dL|{IYAZSI&(QdI zyKb;xLF?{uU$n`&j$cHDulD01X_&K?-6>I{_+y`?`97k)9kR9*C@+)71hU1raV4@` zAcZIxvP_eT3={nvee(}=v(0^}Ij1kkCusJ^+%d9J*te#!&Bq-o$PdG=6bB2s1z0V@ zTAG#`ywShv@ddtZ?fh-yJ_EGs(`3e3VF>ehsoIN-tw2^EeeKFP?YaWF;kvD(xwoMn zM>Y>`aC3ebHZRnSCO2cJZ-V|S>qCl$Yn}sP4TlhZdI91orB4=xfB!&) z7g!hfLxuT)DQJ}2AyMJ%p>xJ~<7?2f!Xd+Mk$PnH26?uUJB**g!A`X2+q@T5gRQpG zXaB}CJU1@TmMiZd8LV@%DO=klis8O}RK9P)&_O&wK=jKPRd{8l?@^bqY!3_##Ax%hHKU`{KL*DNBP^rv|E@R5F zNuS}Ux4C3Rj6pP6qc6^@PVf0Gfe;*bRAhAF38e zkBXF6tLj|=#Y8UxcVB}M8d=Kl`q^qhdFJY_Y~R)IOYUD9$`40v>*)axz2Vx6@(p=B zUWI_Yr;c7BN@uCQVYZZu)VRb-glXVW6% zyb~^_pwA<_0%&Hs$d$YeQHpW6*2xL*IN*ZEbBjHVtrp$mgkf3*V`rGgkFVCbJheoc zEM5y215($}WA#HNCrd+->A|KRY=hc@e7fz5j!Z^@j>d5S*|m1_rbvQ8k`%2|MM>3RsD$f)P0pn)RfUmQy;!Qs%XoXHb_pP*$fYJ54=`q#j#Qj0^fqJIUl<*qx-BW? zkLMd6EQn_7h7f_5nIFdYGkdgF)43pyIj?y)%8mV@Oz!a8x zYLj06{!59W&gJ4-rU+|%3BP4A=A{(?`OM@|D5?Ji!x||R;_<@YDUQC1DVuVi_=BGk z>K zyAOi7eD~&ucg*ZLbkGq&CV2|$nIYS%d! zQE!<0;BOoi$HCr%d8P-Q<<_^u7|shZV%rm~3!DmjUKbVQ3iG>}?=uw8_CT@}Ed_T+ zMkJLyKpGiDf++24^JLh7mGCiQy9`SW> zfJn{brA6&smIhmlD6l&s=$nQwxdk~?5?77v^&4d~aMj$#Wx&&R-iZ>P2(izPx4yK7 zIrhUBzwy>7ry%9ZUX6RL5s;4Ms9n0Iah3eTPsNKh;<8{G5wFsZ6E zSd?gUP}D@(*UI3x=JKTPU!3-j$1jK+c&y+RLW+9K352Yk>{$Gb)3kB8hHt8PQQL{% z-(8`++T&S!Nl3mp{b9mU3p_QUSQF4hvU-f&)VPrO1ymKj%+ZiSn4^3f<)2{CCF$jx z$`F#5g(fR3IETmcx$sg6qf-aXVCybXUq=slL6I%WcY;xTJ$|UtA1myNz*NE3?+PD| z(f(wvRX+O|Z{)LUz!8?`@u^%*s*iyr;Qsm6CN8#?cU_I#K5VY&Sy|*h9eHA&pVq^x zq)DB{iN+MXKxH9qHWi;j4m5_e;v=^YfAoJ&!O%wpe3B3fX)tyUtN#1Z9;|)&2VTp? zXrZMsDx(kOT(ag4EzYZj`$4CV+&`8UcAFtNA!gt)V6W$vR4q z7XuHxO#qX)Sy*>?n%nmGJDO~twOX5;(b`nhkJ3ei@#ecEoIWUGYVAd~T@kZwvzEvU zzlM)7+E!`>Fe@O!n8#4WX!aNpUWwopIk0R6RIY29^$?+-|M<6iN8jTYP5EDH|84!g z)Q0k&$>l~)7~wmaLPy;pW75l?V^Wr5;Y$zq1VxyT1SUWNORUAxGf$ctJ%unI1q!k$ zk78U!umXY`WoqGtpifo5ug@9%iKV#1X*!m-GL61J+2DfXUvAK^K>o`&^sXE=_$REd zYjPOgTofkD1F_-DP(ne^Z^gkR*_2VIA8Y+C`-CWPm*NNFsq(hx->grfvIN9cr(8X#O9qzB*GyLh z6Zii1cwqH)ZcNL@m-;`;KSQdw);o;qw;|2GdMxi+ahkRaqq){W+Oo9q#L9p3JF;2h zt4sQA$_r8qCUDrKp=C@u%F2T^?ufMz^(n^RQ09S5gzUT!yIbTao2t52yyVIj$*pBB z(xv$uuS;heH9QA(+H_*AV6SH9;5>Y4Tiia#XK^_TGabqM>=ub3#3cMB0svY88?eGE zYuG$D4}>TT!Z^?A@{-I5OEo_Hx;pteKgMrsF^rR3Y;)N85y9C{9Ln%eC6+jwa3m1e zK?bp6y14bz_qRo?gYrdYjIfX0H;kF!V3q1c9;D0>h&iEFX({1b*nMSc%=+4Pg#E9J z1beaA3W&JFl_;T67P&VQ5z#B3Np?xFs<|o2=JG!krG>vNFkQ{et?dJMLA{nbi(np+9T5R2AUsZAp=C z9dH7L%=EqwhF@CVe2ix}jiB5`*V*B$JxWh*80S?u3CJ#(WSXO9VQDhp;FM59fs0LK z?%cCqUp@XJDuMr>rgx8L@_+xpe~(|(l*-1ODsnr`BouO}e8z5O4sEmHJ)x$;N>ZUC z-$vT*QBBJ+nK?9b=)F%CIpp2D(MgU|QYf9}5JEZrUcSG__YeNs;l5vcUDx$|KCkEX zy2G@usOPM=joNweWS+Bn{ymQ?hs>@Rx25klt5J_m1T_JSoO%4WWx+b7I~?`krG?Qo zO+HJkp5tEwkPV&GovYhtH4>sHo?dF;ZwSs9vmv&Vm3+JnU$}9if^3T_Sf?DWU~q* z@LUVO8;CDp&PKPM0{m_D^04lI|F*rhKcgXqb_|@v3{C|5BJ7q@v&8#I!H1A z&wR17=6~@94Iglf`@f(Oz3c}LX?zwAAga&aPmh6C=l}9k=988SPA5{0a#!ZUK+hM5 zS~Am}DZ9UDgEKON4W?Eed1`d*;irNZOu+D9IC$thm@;$+sHSEAWVsQT z^WOocG;CKM>ua=3FgT^xy#L5#$X-DFKtaq1UYX#cgYg$|F3Q6k&xc31S?e7R2M16* zzO>?=fAH*}pVP0f<%QS6;Jmk=GC$cpc)1z8B?gRpK6q(j2<$O~Ifo2@kI)0q1cL5C z1K_<*JK>NSEXdJ42;3np8Qy!NKLG`3Ws zPTdWjQwg3f$m&)99Q_m=Mo_RJcjY`B6JS)xj0?JxlkQ}%9`37)5%j+M5?!R1ktLSt zUQIUsaN^B!_+riayx`-&SoGrWmZ!nMl+$Y5ngvEG!FfDq!Q%*@=|vlyef9#ts2ASg zc+%F)$rTHTZJLdLPK-8n`(NAD^cEjGW$Au!{PGUx;-r4+_?JVyy|?o8TrTRKbZR*p zRMu_V=GW%lEGTMyKY(30vamx*VQe3WTzbL@{ipqQn&x=B!=w*xEf@4;CIc6bm|0$ zfjl^d`Evh@Al>GgKJX%f;^Mh|3RSeqe8ZQML;rk_CI$WP85~oQ206fyk-8rO27|#? zri^(~A!;z@fKJov1sW54Y)qLqGo{fI;X$_a(E|fK~l*8M-O1>?bSbH8>p`n20T-H?nnxs;;vm)i-{@ruAu)Wp9{|MPoL z*Vk^sFa6kro95^L_pUCpd;50A2@RETwVL=f|B9I#04wHbilMz{~pbYw?!r; zXeCr)N5o;2(N+Y3NWPBjX2oHXLez%KHI>nX#z3z~bh&6CjKUY8*jZg76k(JD`LP4* zw^pO4ePrdnu(B#X*3(j~9qSD%r5P0Dl9)S-ha?QTsUWav@rqO-_J=hsyo&utr4WV* zK4$p-+zG;-V00joBAUKwA?5}nXUJA=C<*0wN?@+ z0LHNbi@6Y|uAC(ZDp6K}S6+$|kdxVv6-zUZ7lf5rLO71Lg&VqlbzC6HV!ccPQ^P0g#N5v(vw^H>ZA zL-)d=nR-fg$2XBt_LFs^N~f29(W1Yb6dx27cly;!LnwR=ey@qUhlZ_*@{;0+U!LNi zI#J+3XNJ+Q6Oa4ez5Z3c;H}81o;*t>WcuIH8mDsTpj;I#yuLJklwxwq)-h7`N zk`;OD==8GcjH)#!I<d>Q%x@wo=K$?A6Fxj`>6sSHkwIvwnDT| zYM4yf#R@d3CZUnq5<7?3z)?=0$~_bAjX4A>lOm41kdSo<#Ki34h^kbkkHM1Xx|4l1 z%apeyzEneLHp~=2@dS&Zsydnq{0^-QG?Ij%%?XRHxYcEu3NO9}bG3dR1XB{|>#2N^ zU9khqId{LqLn*~`C5&T;Qp%Me3^dY9ge#EMux>U?;*%neGQjl|D4mAqK+z{v9)Z5LJl2I$y8L0t+nF83`)73B1Fy)39;b$ zt}!F<4|Zczrq$)^;9Dl*K8-*~uJ&cCTsQZrD1WTK{_AI*u(-^FX&+8-3v(^p%5`~W ztx|G1A<9Zz#!V@0B|X*6b=J)|nCiY^`!!FeS9#+NA1iAflBDU9kRCZnAi7qYr0_45ud7S-adCJQbhVJ~bP5GBN&|(;@YUE2qMVFLXO!-6AsN-LVE+ zuIX&wZcv}SZ-40iGqd^D^Fy1$e*XM@btQHQ~v@13%&w&$N^X&nc;XdI-+XMM3zXU7KT@28)haM*xj>oA#mMra}mgKqho zjLyiu*TTIo5yRz`jLV8!)4$IYZr{R$cM_w?m+7~Z_#q}bPZS?#EQ|VP;^zI1B!T-G z^&->c%pffg4k2hGkkMu3TxN<8@79qaLRFdtM2)gaSK|??qRPaFpDOHAm2(*k4pgnM z`rn$u)-kL?5kf3DWHG2Iq%xRdUT9jSDCI&9R%$RsQH8Q1P-;x7{g5F0Vi057;D&1u zyt|SM5u!OvMHLq9Q&S8gXFVYr!>sSc5~8ILvQ@iKjvKl!8pE@6lya_g_BDpTRpN^T z2~+yC)X3;&ivNyJ@_kE`w_Gt^pC(O(0vPCax+49%iJb4kImblT2#bfAIF>&M+m$c~ zP^)y&7uI6xwFzjDQb}q@Y|3C1Mp>#2E>>l_5IJ*KG*Hf+#j()T=KqW$#dxI`st;_` zLYPz*%mMEbrqp2=v6WmGH}7qnRN?CGomc``OL!Z3O{^!n9Ld&=Umsh-4cX%#uBqH! zB`ocV#IG+TMcq=Cav2mQUSg>xmoU&&tO`uwXV%)Pdt!-nVhCS)*8{!J3$2tpfMQ$@ zGf);o9>Hi9nw{nKag{2JMue$BSVAR)4?q)r371oBzfpfacKvBFI2X8F7h5}iLie;| zn~j)Ip3YDnGf~<_pqN;yI;{-0x3&2fb>-5tzrQK@<^$(`mL@G5CN;kuZ?IVH#%E&7 zLbkc_*c3&&2&oNFi0xG1ZET%=>xRi(xL*#&7X@`V!sSDer-InY&v`U{G&G?_BX%z;Iw1E z!L_Sdo-Lxsx3WwQ4Ihd}F0rk*Z0K~_(zfyH6YpyVdz5FtFZ?qxR9G``p*w3}L0n__ z@cW0)Sr^CnF~7UA24A`FIeXG;=tO*J`hDGM$?8fGN?i5QLm6UJ(xXj)E7&*|i&;Xa z2zNx}Z~6V*@Q+2<^4zZ6Cq~8|5X&Uvx{)zQ#Tb*p^-2|x#H^s|G$hhE`w6*}di8VA z5%c`Liw|69yqjjmtNk%~eX0QUF!b|8y4iL>aA&q-=uzBe;)UyLt@N@F)z+RFns1t_ zU;H(j`22Id&aeL=Scyx;+2rKh%BxX_NKiU1)fY-Wm@U2MQDh~P6j>OzZJ7SPYq_;) zX?l6VnUuyJd5KPcFZBb~9 z*C7pRv63b3>8ti+oH}{z@cR?LO3XJdOvWsl$23f*Zf;YG<11Cx$C~Q%ySR8vF1XSW zHq{Ha-Yk6+*r^+}qwEL5K;7hSl11@gu$e0n6)PU2Q{+$v!>DK!bA6ew`|$F$)F3T+ z6ez1VQxJxaZxQGKM6`0d#FBunHeo`Nqp>tBQHu~B zm||CoJoRiEz2fYi5@6-#t;EM`5-9b(a#J+Fi%$Gu^6(`5j%FSUYNFOeD8XOf9Nz8y z?>4m}AO3Y3mRb(&CE1J)k^dJZW0hW`90{@sgnBX8H{V3!SO!bed+m!I)U0H9wGzCz zD&;;mNClRfib*4g(1W2ci=S2}P~rXSq$B{ZZyN>3rQD;A!iyrebfe^{loXl{GhrH$uZ8Zx zP!%_WgdXl>SV#<}V)S3*#UQ4__Dmf4fEVUo_oe?6Vg01tKMb)pT6yLT=_LHNcyl`$ub-ExVC`H>yzRrru z#4@PzNDVDhBVt+rcFo;~lXWq3sWCHio_oI>4O>pR*07N4-o86&*)$@e-QxECpT(a0 zwhw=};XS_h+{n<=3CEC7zbQxi(=EFV;{3|hg|=Kr7sa1HP9GK)4ycdiZ`r;4E@!?y z-z9YKuWz08tJ_w8z4ATZy6N*Hm$1n{))(8xmnRI*oWAfa|4P`*w;|rty{~DvI_g?KA9E12x<6knGV|K)4q!q*EUH)CwhwKv?_?8VY; z;ijRSA*1-BR`<;qbv?&S;%cUwKFjuWz>cU^<>v_=|HZoHuj>jXVv-hh06<^@ET=`- zV-;T_LzOA3j;q8~qG0mqP*oR^p#gS9=-wI4!P#Al%7ly0n;#e5yX|6NTh7B*ilvh4 zWV{}Si$Liqwh*ugnz~=DmOndfd%Jc-GwILI^~;}LFWofXcbjy@w}V~AR0T!#s2um? zW9Jjs$&7+!Uef#K7dl(Ew@rI(;oBa%4hFbVGzcnsk51@5);+x8%A;cvUj@ov-d*~5 z_uX*oi+_G!O zgK-?1i38wvfq)CiBq8r2d3Ug}m3~9aQCfYkx|}VZeux(b!0!SudD=$tFa_WSssivL z-1?{$#%k=xRIK5Jj3T%p56UwfQ?z8)lvvRzRHrlyWW& zgO|pGF9;9>glpE(T*i>bGk@7fn+zU;o#8w_oVOA>uvKOv~Ndi30M95Sz zWd)jd(%Dp4Q7Y%blsxEmAvc7g*aF}-4<128es12h=>2@a3vaNEapGKXhbZ#MFq5*& z`PqNGA_3v0>8D;Nmv2$*RGv4jzHL=v(h0@OB`sn|i`UmIc35x03aqciFf80Q(N$m# zI-?jlV*Jn8`1G#C-%oZw{joG(u;=uxHCH{o zUY=DtMa8j#Qv8_T?Sff1z^6jamSF6HWR)t2{9!ZnKl>ggw!d!FXqs(Ge37&WGQil! zD{XBX`Yh7%&0E(`RQK9zm4%=a7|r;2Lg)25%SbN`rrS}?a+U}HkG$2Ug?M?Cn1=SCohuLf5#03oZR6ae`Grpp0x$f!dF|}dADxDu@AzY`vkhym zZNK>aQTWE~+Z*S<{af@=bA0!i*Ug_#?*<7=8;dUY(&L@IB{`x?uynIbZ()&*!)p^9 zHn-&5JHIC4%7+r2f~keYQ+FFDIp?p`o>{0eFpRqMT~=ez@L}W9x7iCb>8`UgAJ-V{ zNjx?*GICqLOWM56B41eA7X(+b7{gUvDmN5W$}Lvk?fg&qwHM^i&x6A<9*#}NOkHkw zop?X$*(M;SoJ4g)DvT)NFG`WSrVP2iqm-I^9Z5d)^lwR9U4pjt!wX*q&R&>1mGnMq z>4kM|ZG+aDM?|Ez#Ew%}iCP7tLF%`qaPTawQY`2D4tqr5ILs8g?bZhK-whXpP19Rk zho0qmjz9d99bVF10lz$3&Gxn`MQn9f-%HDWBnu!AIYfOVz$NEXMO#?XKx5X}AAW-C zc)?Oj)AY9w^+Q{e?+fFlH{6S)grkg3<>$|xPr}YUYhUg!m?no#j1@dQ{4m(~koq$l zAu&axp6g(j;TQxf|3>ATp5Ebp%~L7!KY#kngj0J`_m6?P3on{}kA_XGNm|l-oFnGK zq-5y0C8xzK&a@b0fci^b;WzrUWcZ=Ss`9nN_cJKq9!&x)T8ZT1=I!o%AQYf}0US`38BsWA3fVH1vl0TY^;mho# z@l+zcS>Cm^I6FnRkHQC$7#Hk?123!xFQS0mrUH}QDS3U(H${FxMbaji0vZkjdb)PF z*bl6+lpDdj!yp3jrx0r!98L_KpD~PdQLy|J>I4ptlI+92A&QqFCllelx47#WQTFHfEu2-`xF}-$$(9EptPE{$!n- zpD5Wicy=WJiHb@ue1g>4qJ;L^~WgA%cyWE<8Q?TH;oRMZbAu5}lN%R@l9u4CC&rMJ zWlwDM90jr>$n;hmv5BGz5pi#jN8S2q`g{b(I&*U3Y5T%IcNX%;=cr-7e+4fM&F-~) za#B=T-B%_*>a}HuP02wPrO>n(eUqT__@4@ReXGyiq)E-tKbD5mZ#=_(wkLiZJTv>j zrA60=jdw-^3adpZmqrdvPX7BO?7|z@rDp|GeG`nBg|>n-v(^I{_mVf?afb-0sbI*z z>p(|FvQb763a@Q(Lps#UzLR=?gW-em9}max{^2Anyck?K+%)^9-EmVyHH24~f#ANX zMX1Kg%2(8|^vqgI2|P+uAzZ9oA;2M#yo_EgLcfFogU#97Q+k{SN9{k_fdrYhX7t{a zq5$B=%GO#uG`f-P7bNV&x~N+HFw&_H40K|rFWq8Zq72*qaX z(#QCqJ_{R5`i>8ExKZ;m>U7E4-uBGW~vbSxstk~>#>*CSpQ#fry2O_0Y%PWNUnPM;l!D2PbS?39zYAsr-1 zIE*-2!?zF#1MDm2Wsx>kVE*v8fBu%#9YsdkR>`ewj$|!TD>21kh7%EygDem;97K77 zP!#=$qkl2?e7PCzj+BL!l`$9~mIFX~i!+p~xjiRtUZ<}-ObF3t4uxyQ{$)#V#%~8g zkCf$))?vU}0Btm4sd9v|*&D>7A}6CGN;3la?MT3`f{$^;ZHiDdlcP{&|Xts7))@ zm4P;A`A2Y^u}T=0_yQG|y`hEM_V*@c*YjJ63+)Skg)KebH~;=a!~%c(-DF$+_$IT; zY)P9}d1c#kuE?`n$|aRorik1+$WZt<6M|*9r0d+L=a*b(FW=cMs~>HSS+opW9$e0G z@w~DjehoJsf!!!~RuYU&G?S&N6roG+BF9VcMfdWB(Wj z8cud3yA)iQlF z3$d}~y-F!`Rj$wHmaVRoN{fozHyZAKuah*^H2G_~eXgx$aBA2)=D|sdM>^WrMM&88 z9JiC9(CG0{()0ao_)ezDB3qAEzsDVZ?XJt!KVENa_|;{2yS73q!up+G4np<~4>8h13H zoS|+jttxAWxW7nIl=Es<1WWPNo2iae#h&I;Sea8B30=LJB1X7OponuBax}kpom7jb z2`kNT>tmB-Wy^yg?2JnAU^%D?o)n~$^Xmx!NC2%-ArrOnB${!4_;fsh$I$QrN*LmZ zRvwn~)&U{Ea%XG}lTpE`tAJ*P>EYIGmTIOFZ>0845ZnV^0=3bJXdeK?;ah?6A3tc--d!&Dq*q(Cz)hLsvNk0j{A;KhjW2&zxq zXHjZWwf}5y__aOXy$j}T+Y`t52KpQ8Cx6D(Y`79Q`0%@YeDGIi{@bfIE!SV^x=ek0 z`t&-H7F{hTvxRS-7jrS^>%BaD`2oZi6tC)HhP?(KBV(shi)lx=q$`=3$;tUo3@-lj z@tW)VXHN`&^%`${yXDFJI22F|YOLm3+{LwTGV&2zlkg!KMn;hK`W#m0)&S!hw#BCdJc@g|{962i^Ndd! zMCrXYm}%X&d)%sKAvtMr)5GcK>o#mKpqRTwv%1M0k^5_T-3W zICb9ijRR&;z+(2R| za-c|W4!KC%0(L_W5z%rl5IKlQ7bj+GQfD#BMnx%VI9ySx4PwPK7JLz7&9n09|MLQ< zz?;{x?^c>jDyG6l6%rUN$LaNWfh@*@{Ip_2(aI-fzPIphlyV3N!3r_g)dQWNHhi1q z&+ouQV3-`x0XLQyx>2%J0IMQW2q9W|fD42I8JYnu5AUZX(_x-htMn(hGv%ae6}Upm zQ--3mRN}lSD%}@*LfsLd*uZE4AK;=2MB)n?CL@xNgA{=8(%6l^MO3ZVY{Jt(ZI-tjIwm{)JYM z1mZy3!8PZ0AdF*VN(9JC=%M3QUg&b3qz5G@*|erU+TdAp?ZU9X>(JN4v6%Beb0QX} zVj9P%Yhv`L9C&TUc{}*ex0N}0v+mx^(C+yVl;#mk#vIXWvyfIA^z-(4!(clPJZ z?4n`QVtd2y$#EC9sX(3lF{qMeSBx*7A%j-#cGR#>zSl8MA79#W9nYe&HRDQk5ftzV z;9xFXR>&=@bnZGU*|~S>d&J`Jf~BdwXBWGxTqjNH*IXEXIX*w|wx)6ZLv+H1@ksN^ zw1Zs1K@)Dz@st2}h4kR*9p9;5y6A%jUO-qrFH;jc3-mRUPvcnB3_y~46dKWtY@=>U zpn>C0rT^=T!#A!ym^<+9+;WIv|I)*l#2k0dwt)(eY;w|anF!W(@fZJh1_sr(!1uu?B|;OPTUbz8i^Ejr?X2Wably~ z%A~`Ga!(R>5Gm2B>!ZK@S~#_@K5-GrI^OW!FljOAWQ2iNydNOLf*>L~uTKF<8igA` z`G7;TXhde5xKy`|kC(dDo|?}L`~9rx%iRm#T_ zT-m*-^YB~xz^{!f>6en%ih|jucgB1%g)AOBeJiAxs}e2}xdX<~}OT z#;kB`&GQ8Goi4UpzmZ=fQCR!U-PYQ<*tDHcoY{8T|3+7375 z!&r&u;akuQ$61?7Pxj~lcwuMUU&J1KNo*<5G%4p{R4F2Y_WDs~wFTz4m)Yj2%|r>5 z5qU?8aEtAA3Gtr$nlB&Rq`Ei|7}jFOc}85OC%ozQlGXC%GlFl-km-CkC& zCCj1#`mf!o#KTB!7IgJ;HC_R2KdNVhL`DPTbM>+ak?bT;__RE9>CULi;k`(04WweF zW=jWz1%+qz1i0VQWKmU0NXL-tG*d#fTQny%hz=NvhEhzh2dN5ridvkZW zX(X149u@X^XCtB(bvY_0;8Xy{cJ!sQv-9Npv40AdT5s%~4QiYoUY9t(sptBFleybsRQ={urPoUawYZ9@a~ge+XVX( zhi=?n9Ld_f{Ks%AXP@hjS8Ez3U(JU$oqZ8JK5+WX)8jh!wrMFX8uq5{t8>zb#Q09X zDA1x?bx*tGF@+Xgf;KHC5#cx*mXIcLxVHm>x3RY3GH^7rE_Q0?hv$!eewx0rXZiBJ zx|zs^*pG46gTE7&#*^mjL(fgWZ6TaaT@8AwGZ-y`1z3Ew*wP!K&dgW0JPpo%GfMh; zbh*U*?#1T`VRhfnTQ`L#To&jWXBH6mm-BjS@$N?pk_Kn)Cv<+Ea zxM6VdOYWwGf$7<$&v(zwCg;WL;VL_`d7{e3>#ulGof#i~etYU4XgFmVHotFA;%`aK zQbFLw-z~lmb`+b;NOu?)T2$Jp@C0JiP8LIrfjxruh|7HSsAtWdX`QA|FCTs#Px`p) z!jGO9m)M1#f_Kr@I&wF6KkGkT9k zv;5B!`hzumzG@M+th0b|tAWPCEar;fccv0XGtUvL%<1)xqCDY{q1Oe=8@-#wTE6Km ziod1)g{I&FRk4i6rDH|hMrivw09^pPH#8=wR{CzXWZgws#cq@MZstqYk*$V~!xY22 z+?~LY)*(U^GAZS}jB6N5nZ=f4p0F6|TCjJDGSmtx1I?7=K9H28x)J~lq}-iyH7ibr zqrbwGkZ%EedKDO^LJT3*x!hC3KAX##&1Yq6rG8q10QU|LdWd!eTT|G#>7djug&V~% z=VY1$*rQ>sSV(5UqDDXx%@S=HkTsR6FxS@#5s?6{0_|5O*vSG?`PJsoo-z-xAnT*l zFCe(f_S_x4Wx`g-vfq2c@$otTEN=?TZlWOGnm>@tih(>ic1Thq7xyStX@TpNuI_Q9?sOYWf+4`P@wO2F%927v4W;-}6~;CBAC2 z&)xptS7VkQ?P~b_yyn7*uf}WY^NSuEl}UA3{w5&3TG3L1h(zCVZBure`?cM_{|;N| zvz}MTBQA{BkDvcjlCa-NcL&>KhNG=1SA!}`OD)!SvxY0y$^(l#gM=BA@9yn8zrb5% zJ$U9(%!S3*{Z7t1TK;Cc2|DVUfbo+4g6kjWH)^jijT38|Y8$0WrKv_^?;d{Ec{ula zp~P?zNqBg^`~Q!7PgB$?m+DrHZv1L->4%`Bx?Q<=9=9=r7#w9kt@vt~F#Y{W!`bv`h31AsF&%_YUlpv&hpUI@n3tEACE8i51t!!sY=U7QldmO zMJZsp0Dzkn#?@%>X(a=& z49VBBsUF!N*#xP^S;G~n5E}#rhM5qho4S8_D6mh@SkhSLq2Uv;B8PheRV|X&DB}7C zr__2=42>o8INmz&RgV67A~{bb9bb4D5Q)mhRAmTf&XF(*+&)@7p|r8rQaq!7XDA$~ zZ!3gh8(1g18BS(O7YIois&XgDD0@^H;QtdGpbMEP&{!FXqN6Ac02vf6<7R>d3I)sh z20(Y3A~fHh2;_$q*HpynQowjr<0`m(^5egOUZxb=Y1;#dkE#eoD8MPTV$q=}N@oBA z3#EKjWfWh<8cFK0v3LpW&b|v^)w>coZ*>W9lERT!Wc;F{+?tqq%cMVd7Ju(sOnV() z@T+NQX}w|MZ$U_D$enmrWKq6{cNE#i@*YPbwE+5YSJcQiVmTM0^^t8lqmJmOCbwiY z{i-&p+$yEl&%iYm)DhRl9$`g!BwPh;2N4_EGTFGPd54(8 z6$Q8xF~&Dl zb1^vk{$SJZ*GX?~yuLm2e0E@V(tF&ob_d04L|&X>tjI>&R+b)dW~Xn~^{no`rO7C# zaMoIp&(3%joLuBthSp7pljhzwjm_+~+o9p650c+{xMIl1Vl~@3lG|qqlP@cIpjozG zJ3`7*Kc4jKVbhNrZg0VWRgf&GWD@wRWon(uxJJpwBy!GUTJC|5ey$vK_~9 zW~c!22fhF>z@joEzt$GKnM{|(#Daa@Pdn66rUp{WgpB3SVcty9jwKu$9&kfMc9MFN zYHeT^#IGK1KqRoB_b9IsaRCV7k%R!V8ssDs_xdr`Ab9-CSTo(I7;k8Q1>sN8Q z5B>Gu4fl&XAH8Z#Tyh1WJUKkwXbee@&5TBybwbaygKS>3}=M)$QT|LiBJ0SeYe`voTWZ zP0Dc~2!j+(aHItbEriAb5FkSGdVwk_S0hJrXeL*C@afLlfXL9%GA{|-cm)E?i4Z+R z1nXZ0Gl=L2V7kl`aZe$R=3;GtXf-X;lQUC9m5gK$D~^*XNlqYTcgyDuCSNbl>GYo& zzPI#Vo*%P&xo#w;K0_ZFPV-C6EfqwTkuB%-({tFRkaoJzNLuV{u2$Ac>VzbR`u6qd zf7ZMfIu+v@TOdn%;krD!{OpwV1^-R;<$oFK`BHsny7x-kA+To z#ZxI^XB8Uf+RTc-RJ0nUU#aT<8tyuC{o2J}RO`gA?F*d+3zkX0Dwn%~xw-jfVY)yB z1;|i{qa>)r2t}X@H0)y(0h8?Qz#8$t1 z+M53LH=?Mc#em~Rs^0S_I`8@O%=}$#V$Z$7#nQor{N>KdMS*P<$&CVy>1x4jG{K6- z_D=}{4r$c-LeBTC#mc{o=p|RzQ|VTin&XWh$Cv)qx%eTxV0JEH;Men-hYms<)AaU~GtZVGca?hAKx%F~F=<*}qz!8#HC7Y@u z=W0g1-1_bBg6{B*p;P7imM`u)_i}dWo2l!C&sOoLGlc>A(WXSI!fc0^v@l=D6rxX) zq^qT7y#7_QXNDs7e*gR@b@|Kea*k`_#J-RRC+{-A_M!qiTpLaeOa0nR5Y!cMeODT+ z!#jXVrn#mB#1U0s1HFq5ZMgXvMv=(Tit$`JIyu=qMZ$OrZ3Q0M- z$@`ai)~DNa%Q8)vDM8hMpa7wpqG`cP=21COfZvEfOwTRvLnsL1sST$h4K* zyeGds@k_*onW?0nmm4oCV_fI&?;1S!_IOe-M)qBu{B#=|pP!*SA9)9TWLSi=D026; zeJLbFr16{`Dl?*_V{b;|$6mCxFMkR*FmV0VGx*2#!pEG!n!$Y^Z(CM7o3D2(6=_>^ z>wy#x#0`wyfcLTC3Q~tu)0A+_Uf)*@or3Dds-U9`&!JTNrK#uNP}5qK5zkVvj`4E^Xhy*I#btwf>93ir)J0Fu?7BwCI4h)&hxJeE+`iF?f%vi z9P{VyQuE#OAMY0KGj2M2Op8A5y9SlOs}W!J$-HC@`!)v$fl*YgYywfzw49OHT7() zodniG(>0^8u~}V?Tz(&kjjaZhA!{u_C;>ZBtnb3?cLFIOF znf6-l4BU_i#ln`~5AXutGvI%0SPYbgXwYOREVC=NTe`sV2i`k$0#F}>DRWf3c<=ux zB6|wiHX=D&`>TIL<50G(P5zKFc5I{M+GUVsK-{V>nPO6=k9^ zj1X$G#L$of5Ex8~-8M|@ujDe0;l=n$CQ$DrzVARwg1ZxRM9tdNR*c0InSKBx7Lv@q zzMh%ljH4++hDEX0>*)Dp3K_%5gM_J$+Caac@f}ehASM0;zQ_Tc;3b#oOMLsSvN!0f z^w8f~IXo&()`|lS7J%(Rhn2qhMMq|UTYeUO6G%?r9pGI+X!Io)p^)EHHkc#wGX?Mp zx~e*T8>tofl~nt?dHb)=m%nHm4X$~&b8Na`sj_KQwr`<&`A7Qvh0zDE_m2+PP#@Hc|wgt88#^$nW-8IaU6vOL?>Zd2Q7mMj|9^!zR*o=zqAb(f%082 zr?_%)c{*$HN6fkg_i{NbY|OCoi>+e&&;$Q__l2Z%6M8VJq7ihoBX(I_gwGA z+lym66Q?YjKJ+g}hmRamS92ycmu~NL)Gd*L))e2Fq{0|(5E;dJzBBc!#>W15%sp%|x+jBp>XYDFSil!nbe2O+&?*XWMZ0kmk+vFBUkG;H}4;>c`w(Z=21n$FCP*LPlNoSfEK{CTtH z(^_V^Hth96RN9%%-nzbWaciVEtCjp*oyR&YX-t`TzsF$yoq1zJQn%~eaLk{NIuE}; z?>SGBx1mam_KF}aFiU189ooLWESZKi+WtBN^xXAUN+(CO0hoEs2KGfWJtRQXwis#v z+Fzct#2<)pnZTuYk5gwXNtSXo;UPMxen6(8C_(@f?c+K}dQtS=lHQNqiTQGP-JwtI=@*u-ouf3DZ9E7WXCbmgI%945az5 zJx(j(z^vXtQ~V`E#GuozR$>%;ok@o`dq>ehP6TE((DHBqGkrXoNp%VW%oDH-k-kug z15S%4WVdLyqv#`EptEJ;Khx?I^5DNyf+w!SgGqBSZ^M$hvI^!eWrZg8H`bH!sX-|Y z)fuE0+uYdFORad;4I1Ca`CD-}KHY(Z0X>!K0IPf5+g&z>z4`NIU;l}ZOW$8KE$+KG zdbDYLcyTuSUUkL}zQ!5`Je-C|H08XFrMhXfya1wq3g8E5tPvwQNc|-2wj=J<;_UAC z)=Qt7esu4<*do8OWR*1YDthq3g#Ea|7AI$C+G#&3vtOr>u4?RHwG*d?kL?IJa)?gz zGRYP|1k;-vWRX;N3UFRzh<6A`P-T!Xmql{(7N62D;hh#ir={HITT3dPytlE7bB#1_ zl+TVV{C;x##Nwk5UtVVInOZQM8-Bf{TF*8PH;3_@NRs<8mMzh%!Yt#!w}#QejTfI< z?^!IUPaLHV{%P}V-!oq~l3ERrS0mcFsI)Xg(xJbz&q7jmqxaxlZ7ax>9ZxR${ITGI za(dJ3xv`SvCozeicQv?N8#xJIeiXSm#kq)NOGyzrYipG_$ha=dH5NmARN-4}tk=79 zvs;>e@sqmSFaCeqdO2cOxIk?Y7qo)|6)>3N2E*!_gnS(u*~V6dQLfJd%Ah{Y9K@TK zqMspd;Sz(B*9RcO|I+X#*lb z0C0UEn6V85ZVI4z&|ob?k^{gDI-z4uz;OnUAG~M_AsD06W43|QntOfW|GWUs0Yuwl zQWGG=haVO>Fwl&=T8RUJ-fW7{8H%$6m=fm^JrtzE7%xM?4NZ_=4`^CDqX~jcU>08S z3-o|QqJ&~83b9fT&CqGa3r(bc^nTERXK2}5sKMKYwytyylms_E7~yj#|8GkqHZ*#u z0=N>QK~ogKeeSH*lYgswjY&~z(LG;Y)z|Dk(auO3y}Ng`bKk|boi&EP(m^}y$7sU- zeu2V~M0cK0)YGrY9y1pzzuM_u^xao57-YwyN$ zTo+a?FVrma624k7^*XhCGDTOh1R?`g%Ao&`r#BCWdVl}Nzn?2v3K@*8gt04GBE>0Z zn8A#t!OYMoijbR zix1l7E*x4HpKgv>-8p)3Hqz?-m9E6L*OxG+sj+pIrNRN8H-%)Fb0pHpSZs76*NuW0 z8T2r7SwLraA(Scxp@q~4ccY*1WvL>;DuOpmEz+qCHMN_#%}G5z5L$TGcDIWu^F%)_ z%x-7WWMbKxC@lE$=K~?j0g{sO;B}KKP@LsxMG@L9@Vn_M>4C-?{e2a0?<9QvpOBU9 zZDXD7*H(JAo{!&nTlaL&Kp{UGzblqjTx1p=9bs5BaZjhymlz}do0X9MOlSrbMo%JA za@g52@kX<3_Hg33UQ^4c=N*rT(1Jik)kp+5p$g$Z0JZ|gOE!?z1XCcD?a21N2=~VK zvy~xhhp$Wx?KC|?z)-WwA!}bfQN&AIeoI52|Yi}`|D;)5^ zr6!otTfQHD|Kr2QZI?eUd{3N;+mJiI_Mz&Siy)JIS5%)(2~Q2ggdq+({`v9InZ)_@ zw#m*711m{?`ul`=%h*TJWF1OmCCR{eP@^1~ldW1glyhXt=ka^tnM)s7+mbd+o9+Jl zqBpM1diLIb*wl44Lmf>bsYD4Z>Zu+CIm@w|AY<__QIGP89Mk7Lhxsu@);J3}yOR|N zJhm&%AKG4Il)J877M56xVhH+ZM^(~MVx~up0gvqiPv-@}7-k0`GNLL2OE?bs6q4u& z2@xlCpSy$m6(yi^KzsHp)IURZa6gYtmo?_8VF`+HXAqDPK|x9}JU{8w4~I6Ny|016 zB{zVr0Dc-05HW9J2cNA>ca(>@TgfJpbppZi5?!i{%I;GYTm1RaKdJJrkuv?;Z59@x z2|p?a1*Rr}HvsRz5Rj4eG-v_$VQ=za90qtn8OCuG3>5&zZo*n`Mpn}S+5!eJ8HFIF zyZJTXD$MDQkh;NSA1Y*<<$}nMwA+Q^FOR1?dPGD%^O90*AYMTFf+|-d>MY8y_NW#>Cu$@e zU{w({`l)=BfY)S?%z0(vGiWj`Pf-PM1KJB0ye^#jQsqFfw3v`>K?y`ch%GpvC<1s1 zemUmYAnnTf0Nc&K(xja9iNlf?ZKoIiJ-qt!!uiYd4ULlz9o#S;U#%aXMLbq6>OUgu z=4(mi`U3>!PQuRd2Al)qbm_Qd1&KGlz&o|^n^<3mg0Lf-4;M~heH<0Jv2m!}U; zo*#WxpGQWL(jBdo{U~wfXqVD0lyN0r#7lKC=vB>JvgJ+uatoRL24O>bx|b&F^?ogv zZ8V!Y|IDx1cIb;FaU%xMY29zZPSl3H12zrO*K-5Kw0m@4KRE@Gcag9`4L>-9?Ze=8 z>Law3J4O0YG}V5xUp-66JI+YHj$t{GUFYI-9-w5yzuB&TEb?Oq3<`Hn+rO3GtbqMjsAe7=WUn%4Z3sm zje#&j-U23NpdG_gs0f5N-*a;V&-*5Vh#Azy?vU|Du&!eWn#kEhQj&_dNG{o5!B8{D zsu3~JxD#YZ$aMhG8}{`_1X6> zco+)ESeu)gBwrb|c0SYK&vk$25Lp4Lynz?GgrKRVv&k_JLfKmTpd$rr5EOdSa0_i9 z*if&o7W~ujzw`>VoBX{N$s02B zhY1@7{dzlY`uau(zC%7_n>hwr>POzYCB(gax$padnP2M{M|;=roL2bjJBydxiJlOj z#buC_9ep3~w)C5-uUPNdc15yn^+#9YyR9t~jkgj8L9(M7Z`iJa`HL;G$kocbS1i!c zz|w8CEfx3&&g7%^77lM2&doKT9Y=XsS~QieIwpL2T5~ILW<7D{SKHKU=U+9!Ngsn^ zXC88}o|b|=TXoc9I3lUY0#&Ioh?$_v3smJI<@tM+aJL5{&eA_VygaXvH2cwcI$7`H zvzqh4v&%Pve@$#}%$R=hps~o-vzppZtFfp}z77+XIW8g-kPZypZF7OI`M2yqF9n4P zA);SjF`As>viQCcKQ&ZA7fHB=ZLW0Dqrf|cV2lidijh0okLe%+^B1tUbY&^ zzIr@_;%{6}vv_vU7=$pG)& zYMyvx`hKdQ@%)lp*+%ub=2`D1MWWg!td7{r*R{LzN#AvZ=$&5E!iV;ajl&xmH3`>l zNETzxx2)+jv9Q%7OC4WaL_-Xa=|Vpdr`zKz&o0#W6wQ9;!(K2u3%{?PU;0b3a;Eji zXDi2te|}=`GavhhZAQO}YyaI>bS#BJbos7d4v-gcbx3oN;G+2ZWI)kGFy&b6u>i6P zzM?;LjRb6tb%JDx6AQpuNJj~J?6^IDU6(O7v-HDZoy~!Y{52Dau-c^6}9}K*>d`FV19GvgoDp;0!6z(P!M~Gv2TMAIpfDkj*PzurW zCd(Ta0T4s_fC}1t%m?d1eFuP9!NC1=)_tx#Qv4sxyDG8t(u`d199nk`5A>E%!V}+N zp(trU5{KF&jEZ{4?=}RXo#G$}nysY*W1u18YrJo}m|**W_H1JEwiG)?$i(c4Fwd1v zM<6$G)u4Cyvq`{Y8;bSK;>%w*_LIQh!=Yh2KIIDd_IY2uy^z|5GkEC*=s*OO_(HH&;bf=r{1}oQkbBO-&V{wBS#- z6$x1Q&>nN`SlyGMEG=^TWbos!Z0;oKZgq~fxvDGaq*qaWnNW>%LR@Hbt-9+@%iFTV zl_-bcg#M)E+NAFtbxBVXeYBnY3^kHP=-n=9is>k2Rm`}hRQgi}*|WcRP(S`IvfQBjr68iFR(R{mgw3^si5)kB*N(OQ zEK2$|b;Lc(uHB+s9%WR;2{o-O8pfwyH&O;E$WT5zDpWPSPhUXa0_I4N;29O?-jDh2 zowVwH=$qA*4;8JK*6r(lTV?G$Z0M!f?}gOPSkIQV@47Wv*?um`D7A>cKyJ4X3fz(- zs*}B5A6nwc9s2S2jnR#&GRd6t;>31`qX<=5H1?D)){RKT*onSebUv2w!N7Sj&-vrT z6(|S2(sEE-55ikY_;pdy5t5;6fujx9!;GS!U}>&IYD#1x!W1aloiz`i5i*2$}%>fzu~>7y?Bukm^~^UdH_z211b@8vpSh_MWX1 zxvAn(yzA}>uaEl56Z?#L*d1KE97e@rbRV>!tRADFd z_y0zS_Cc#41~EYw4m-xMWi}y_#@1(MMXP#025Nd&=0`WSwf-y^|MV;YG{PutQD|VL zR)nsRyy1?~pHGsvt(G`1-@S8atxz-gO8c+ggpqS88vU;hk>U-Vn%1-a(Q|kjtkd+- z@P*jxo1I!kvbLAE0v*5e zuDB~+mEx=G72hCWxMwwN1ac(Pr#kiAKJ;p;AM8 z3=<;07Jvdqpt=%G{=_}iPS?dtqg}Ut4$MM~i9^z$=AESe{{95jQ=TZx2Ki+EfXB@< zVBGMQg|M`!I|dC~D55H5sW6SYH&aDh+&q{$^N=-NF-Upl#0U zqvVUi!510|LX;6#gdEy(LO&`EBrt&8;iT_Z1T%R!1Embecgia?-3?}Tf{eM#$R3}L zDmn)=aHt6D$gzK<#e(jb#};u-)#0JNS1t^s7a-pQb$C6ovZXr$9R zWBa1|RN+KbGcMNvKhhW*F*qcnRO=ZE9v@4lBWV2WWgzde6apEA$~3ha_VgaJm_5qF z_;)7oO8USkuf%6djZADakUY_cMGqn@YP~^qRKv>Vfp^KEa$nRPa(^z7gcpQbyBO{8<4jkc3I*^cdMiATTz!1!!0K(7=Y5H{-V*{PDN*;)wHy-b7I3 zNeuPC5hsbUO8TYLbj;p$hxW*>F)i2A(d2AjFVzbnMT5BAvj4os>C_k6xOl5W^2WYA zZY(pW5Kc$(CUb9`h~2QoZPz9x^e#Tf;E566F8^fT*PC{3Cgm2X*JJC#J#)&YZBlT{60ziKewhEk#TZZO&am z^wNj2%iV)rS-&N%Z%zDs7c}$h@1OKoKq{thI@2RoAjs8LY158WSwvQc0Oq=@6dus`tqN@xcsK>8wgGVg_F;2M{9*e2u5BG zz0uA)b^g?VmMm(a>c!s?9??Fm|L^1>FKuS~h#%y=ASfF8)`+`KS7YH2<(%Lia0zB9Ri~`-E%b5@c@UA@qNC z@$0djl1J6e(Q7f1Pj}lU;_4(zw#Y5y)cLyo3Tg9CC4A~w0cMczIOyjsEzi;sMsmP5aHtL0Wbh5eLrFX zyid_U;|LbKrY(5LD-pc- z4-vrB8ipW$3*R4Ix)mI*4IrxnBtl#yg5*p{ia;sDr-rBk!M=KYggMlMA#uxJuh1|t zflDy9+*p}om$C)Oe8f0hZR*lJ^?DCpa+M!+pm>rRRi5ueq}nxXfvLvNf=fnYDVb{J z#yQ{>lA40Y!~`T7;(T~I95SgIIxt9i@Y>B9;=-MA)C2^?6PhRK95r?{r%x52Nbps} zRP}VAk;y(b9<>zC7sj-9@_OR=_l^sv53L<+osmoG4w~6uOXePbe}C~;Rn$>KGi`(r zZTvNRAm7Uptw_W}ekBZi)+(;!M1O=Z14et}dc2{B8Qo`kbnx1hC56S7b?>tE$+p>d z^S$xkGaI$sc|Fg52Y@WpA1)C-XgbG8c>=;TLSe9QM7pTj*v0=MC(NWdkGVT9RAfyj z)%9MPO})`NdoSnU-Om0jX10$#uCV`zVPylJkgst8&%;_;Sa4`UaBm6hIHA67yJOuf zO|;EYMQDn)lcV`2bT*;V$OGYJ19XG2jbk?%_*8Ey(K?1Kq8%5!Dk>*?f3v$*J#ucG zxp;7lx$U=4%T|(B$y!j`WJ6=y=i`dDipf`%@h;xl^#Xm>FSFj)4lVuNHs4)+G`=_f z;Ns&m!524V4LWXfEoe3tce#$#YMZ!NX3@b?vrI<*DVm4tF3ts7*oUXv4u0uB6Y$&O zXRD>pz3W>Y#_c+NJY`>~AcQ3Qe+<34Qp;2GDMtAg{6M=Dwk1DRj1tmK1S~DvnsPy{ z5uK6cH|*FtUj>kWX@aC|t#JEmfc<`jye#R;2pqJdcNV(J?N#&t@^^`op?%kTVHbQ+ z;Tyjf^j;?jr_Ss>w*H}FXQHI3W$u;3T1D^LUWfM=2MeOOOg4EiTU(Vxv6aVrc~4&Z zo+GFC<3jJ+v1{?70B1?~`PMbd11LPi8{R6ULBNE-%vgh&Z($+J(yGlUjL+5CHaec* z{3HLn1Kp_&hD zcbtVnj3x~1yr!D;P+!$5mKpuwF)j((4VoIpE9QtwzSO9j?U&A$sYFSgbevkq_$+7a zH&Y;0L#7yy1P!#FD>?FW_v)C32F#!9UHYQi3AbrR{)A9}+ThN=mn%AARG zfg)(Ega+mm1g0{p*$;2;L%V_rBErMmg_60Ij^}#_us4|zkp5~6&43>Uv8V#?w5Cjh z!ZQFNnFcV&Y^jy0g}iPmBGmT=V3o=`at5^|OKHcDn}YI^+FKar`P`IyDR#Lu1(vjX z;cCGdY&I4=L03(`&t+f{Hwsb%#Sf&SNSHP%L2(6a2#2h2*UmL4GLyV8+a0pX-IlQE zzSh&Y^Tz|p;y)EWPLPR&R|NgOL5@!i%GibGZ&HELs)UR!o72ep;(Rs_uM1kZzs=At zr04yN>N~JgU?%=QuY;F2l`Ur`eXgua94uI!aTpgLP)f(B);#1fp3_-^bd-4|x<<)j zQ)X&l{&B%o9j?XX0Uf7nt>ZRH^J+rh0+1mfWV+s^@b2g^nyO}1A(?~!GzQ%N&P>l-tLt6?9X zA#uVSo7*TZ%80C{y{UiQ``SARyKT0+_ww4vwfKz=hu!7`H$a=7rSzAKjHS3j~adP%RpGx|lzrJkW=;@L?yq3`AK5~EKVZg1V z!R802iAshA2ReELMa6hS-2v5f+L=JC4Az{9ji5#@>`eG6NE?;>UDp}|r~jnY%F2J6 ze^uP=Dyllug2V4e_sX-6m&5^w;DvAdX_-Z1=XE|h*EuO<*?#-m z47HC+Wnhg5Wf2*+dy94)yi&Hf{^8{vz0n_A%Qldb#Y(G(e@0`mE+ULysk{r!i@>zW zSu%O3OcTz3S-hAd1PrlM9waX?#M4ndqAJkb_2v44C0(P^pc1sa9)yzp5%&9x!T5v5 z@dCXSk-kI_t(&3yi0LW0n86m9z#DPYn>cf5`ZdAi0`Y-Fo3j)hIUw~=<)CZJWaDMA zRmt#(SJ{E9&qr*s#|%{&bp)RrNa`?giSWEhWtLZw)Z0x?4(tblgNg%45ePpZK2z*K zWS9&tS}?=|jOYtTY_=Z&@<^dPJo5KP>==1)&lhC7^2s8BYeQo!?Ui!y!^* zT$aTm0lo(n$J!GEoF3}EF9NJO&Rz(bZwhEQNuqFr${zLE9{N5m3<7aTF&|h_06kkR z(Uy>UHk<xx-^XX(B*d;uxm6+yF6_w_0DEmk@E#)~<6XpGti>UtxR_*52 zpLuLoUTLD0{OF&U>$eAwG_4*QJv_7eV02_LA?|hB_bn{86q*BR)H?JMWCJr&4Ud%~ zeuPowUx2Iz066>s%r)~Hy(Tsh?u&AlsRTQ-RG_Ug9}w<=`d|k{_vKU7i=lUvpj%wn;`eZp)P|pGll4 zacEv!3ECs1>!Tkl(peEzSx;{3?-d$lduD_uTp& z<^AxUI(}dBbD^jY;t0q}60-k@ZcajG?xe^FadJ|a_te8E0})9*NhGPhNmDUKa&s`T zg(qI!wD0TO<0bTWq;mUJUfxa)RPt>oj8Wkf=C9v8v@!YdR>I0ZbsLaQ+?ceqx$*Mz z`+uP6(;i03#o3GwEkFr4T@FVdM89!fPm`pd3D~(Z$a^!m&5km z+0?pdt5ln~0rWyf*p#}flVS}@;1&CC(dk=%%-73Z`PfmnQfeis+CK7p8l;G+6AZSo z(jy-8_)!0G8Z^ePwSronk-TMnp#_h{(5Stao9#ibT{DOQchZP>_+rBI34A+*SrungWC;7=0Jz zCol*(Dp3LQ%%ED`1K1vSlgCt7ka~+D5LS$ma+UiUm?T%IZR_gw3M|GO)leh_Z1!*x z$kQPFL|+K-W6jD2P>ntv78Cas zLpv0uB7{use#j3}D?#-@8)HiMYlNU=eO~f$X*Ve16bF8;KfG~rmw+qQt>^nAKpZd; zjIM=V#u`z=;O8S)Ff5sYln9hseYud*iXM5DyR?xa1_d?r$ZB>xH3SK5OiGspb3h*q zBPbsdOfF_)@i2`5#))^`A&OHaBJ7pW|5aFl4I4}sAe|C`LmDQVdvNpMCW7({gwGkn zij=XeEfb)#AcIIjt1_xDP?17vj|0*M)w2~3DUU$hvM28CkJyY>D=D@JKUruYD}akd z)X0PnD~?`+RRz$DI7aM{0U7{8=@ej*28%b0Az}w<3>q_H;$EPUSxg`9v7$mGhH9T2 z8gTc1%;ePy!?NY4lAgWJKdDwTcUA^ox79iv`s0LyPy;J(e#(dlb_esK`e%2@B(!M- zBK>*=!>^l`#uIV`0%g^rlc`t9Zr^^#aiiPfqBNa<&KcfHu-o{#E9sMD`I%Z7JF zHx(V3SYU^)LLo$Zf(9Lu?}YLckp(_16%ub5uTU~Ys4uOFUmxiGd?^`p{*mmwbhGVZ z*h*v4nr%zv$V>Ck41;>Jy(dweZgbFyciXynQh?i~nk#|G5nEHryT|BxXq|d2cF%Nd z)}NoQ%Ej(E^vB7@w+Du&x-U&$bXKyDy7K+{c86;tL$7CNZ&Ac5o9ru-y$suFT)QtP zO;1MjA1p0?Vx)nsBK<|i>QHecrG9Zl_wu*2%!pqi{D&8lohPO%dB$=A;FZS=( z$u)>|3stsN_`gTUslaCf1PhN53@F{iGRvJ;F}q4&V(r@_1YYdRJ}n&ecaXJJ+5d z>qhQRmr2q>7FV2JAJcNe*%`H4BTGH(4Y(OcR#j_;dRyGBoWFwI@zt-FbWNsr1}=WguT zsoT%aMHhlu_jq^V-apHW@oA~u0uPP_#PJZ~(*5U4W#$jUOY>3R47^PCTr9wLl?HZP z9~qG37qEL2KmuUu@=VC$kxG$7LZxp3#2Erz3As+LghnK|mDHiTCLuA_2As>etL!--Dms5)2Uu^Z249S7|p27&H~#NO2OZ5-rhJMw<9FcfSk ze3Lh!WGFwE0FkaoKx^&9e9MA!4x|MKDXIXKvN8;=CHypXN`5s0Dle2lCb*C2tkn_} zOg)eVyC30I#oEtUrFo3FM~*r1fz*^jw}NR%JA#cIr3?}=S)+anfY#n%4dR0xizLMr zrG*CMA5nFo_seo2(k;#lLpY5k0j(hud6q@l44|V)Ym;9|Ajrxp_<^9V5I{x?Tr3`8 zD$7EVH-Q9-!=NY$Pxd*IVZmyAlCW;xJalO#=vd$L%gK13_|av2t_CXK%_j_ zIV4DJ%1?z`zd5EZSTg&lzq-~hfuK}SAgE`Cx_+KDjH=u-~Y@s zy)}0@@!zED?za|Jt=|27+&G%IeP(-@RzyuE8`Ab=1>F%lxRZ~G%w#Q!8_kQA!L~i4 zQ9%w1!Ml;n@s29yx_O8qqEbohOoYQx?X^!y%f9d9M>N~!-nK4iCgDSODBUf{#aL2o z-}%C>B`%0d*l?FvDkZOu;XNv%IK%i$UkAdS*O+>XqgNKH4{i+QwXQst+n5`SYo7bE zy3o~?73~wXpriR29;{J2h7UBC2-LGHlS=GC|T3Yh{l4R3rf>Ju!hAvV@ zQ2aBF=(^?{@Fjjxsi9i9aMWrI^0|Ug5=(rRG$k^<)ilBHvRWQUT01EDSF*b4fKF`F z)(ityV9YD6$-A2Fxh!<(^y1EhuLhF2(}_LtA!JfoQa&Bt=B)yBi^S(#B>j)oJ*Pp+Ps{S_41 z`dn7Oe)I&JpWkmCmPM-)qJ}*xDo$1FS7KdcM+`-1lBl+1X0@Yj@xr0`$?E1`1M$JD zH4ZO6hIwPLU=PgKHpgMT^2Fzq+kN&nkT9U`>CP_Cg8ZcTFM_mNmxpR#VMNH^UoGu34AZBDSxB}Z&bXBF@>4;Pxfmb=p@xAFJ>-HnhZq!sG-4GgK2T}Uvt=R?7I?vu7G04*RMi7E zzghus6m)1iAU}!WkA!|g00#WCG$%RLtGUl1I zsEO8LmjdLT0KkfY3RWtQ&q2ZUm_ZBU4@*!SePuuc4wwiDBaQ^@=Y9~(Nz)qX>}g(n z2MTSDRVf)3Td4E>k^NxEM47=rK{_p}0w-;qfkq``#sVyix-czKkgnd+O)Bv5Wgsw> zv>P0eP*2?yPQA++z~rmise_7}f&&IgL(Z7|$Y>J@>J;cjV6GE{@*W1ccmiz;Mrm}d z6cYlKg#|{4v_peu>U4n{puwv6F}8=x_v3!)=yXt|xNg_=|3mz*d(zzbRiwTnuVWtiuvRuS!UK1v2Uoo{?Bdb@_Hb~*lZt>nZ(am-w;ZE6Uz=KdnYh#GP^-bS z=3npY8{cpAm7Gub@a08`z&7>dP*G|`g|R{2 zsXp^6Z?0FRe~OHKP=x_TnCIwG!xvB;ZLdtq-MKt5yR~&A(|I;tve*_?6K|VgqlM@u zJH}w-s79NT^Vcn}9hzf@ETu`h4YxV}TQYj(bz|$LW41z%Z`_w?Il;oI1>3N0!wUPm znlafPa+XDfq57%iMHaCaSKidzIk@q^;~^`>qZ?y&P4%PO!>Y*!km&E~PZ9sEW>bKW zQ#!$D!O`rL9gRr#B$aZn8eE@8&QP3cEJvQ^U-0MmSF4HtRwwox{_U4JU>&WmB@^CV zU0st}wO$J+Qlk5gUo$78GbrkLvIY^jOl<_xp87O;zNlvB3UnTc7e^!uX>H#!7vKM3 z;NEG*aj8DV@ODDrPLkX0zFCjIAAG)TxgcrI^VYkAUkd7)za|Ha<`|}XBy;@4905>L z9Byg^LX1`+a*fR>P3}-Y{Ph;cW`i~stt5BqTIXV#Mtt%WG5$}LNk-vrw;uyjj%nCu zE*rx^f%+1wYb2D~nxVZ{J&go1610+o$8(8r93#XD01Nu1z;puXXCNCws-rjSeR4;1B3=x+EUFL9*ov+0a=8^r$v7mR}v8x zK$Ki{tedt!%K}I>uZ+4m#(C3A6CauIP-vprp%BTo*}iXBq>IhIPN=ybM8Mi9!-;(p z0uD>=8^V_{#UoNaG(}jRE5RpQDlO?2_eczLl z?^tIfRMrt60E;NP6k*5nj${F>vF&!u& zj92?kDF^Y)Wj>z)W%MR}s=FTnpPszfA0t->0sfzq~e_w~?0g)A_*V zIc>>IiTlP<&}-e#*K-E&HF;VBNJlP6^-=P^J%BIe=`-1~G$W8bUN2|7Li>ji7jh{1 z;vK@AT&geSDJFyS+w2G9BnbqKeD8d|G2ga98om5)-O(!_=m}~1WZ!hyAfr(UM}VIU zqCt?HdW=d%@5~km%TV6<;E!+6{(Bb{Y z@13^})TVlvqO0wAI^BPlgz9Kd8uE>*@TphX7U7H$#u+&J#-14m?3tX5?TR&gAHNFU zcClksulZZU`L@aSl9`nsO9vgCuk_YaPgmdl@~-J(^rK|pR&sV-i~lf|yz|nW!r`R3 z12^=VPxYLLi+=ic=Kb8*^YfR-*S8rvg(>>F60sQJpraPqKfO}`6Et6T*x;^NElJK$ z=Y}WcktJ2&7DKD z|9if5$-ZrVwe3s$fvHX(tRGUbNx6nPpM4| z;Epb`YXtOF=k5QwOEb059>#rq^F0Wvr?#IT9(~w>Sa`$@7k|y^ zFMSjC;=P$o1m=YoX@+U%QQOa{xY0jO#GPad zn1bW69(2y+E@oj>;MDls*Gf4lv|LmjdoBL+E~}Lf4UKR9`e*N;iALoFyS<9TNx7aM zY8IvisR=&9*nmANPpWVIf|`>!?-}yrv{k}L|6hjoxU(o(P6Z8*OSJ<`wIF3hS!&q? z3y1W~E!8Z6DTr0eMWfr)A#EFvsnYe18tVO-v`mBsc#)8D782J^9-@=J;$@s|Q?#80p8gbEC0Vx4@@pJ&!g7@`YxH zOm{^1sy0NFO3{~Hz)wmkN+^vg>az!p&0_QnV%!KdV2U%U1Z%4p9fqI)mBnO3aF<1d z0!4HHkOEjAp+0*I7Dl4T2IVm-0|F8u&L|&P2QCyw2ye?g0YXdwO1s&L@SR4=klsPW zY?hL>oMNp^%3m-*A#J=HGuiF5V)#BIawLvR>^KIk5ZaQaMjsX``o@q6aZGRN-%vb% z>~2uU2<+sGEc|GBK8i1l`Vn|rfJoe7UCjF2c;fr{3e&Zwx{$@G?=wz1@xI^kpYE=w zBIGJ^t{;i@s$pSwrGWt zi%hnqHs{N1z1*JQpWQFZemF=vPp|#Q-TByzLhbsu zCvsCokK}b@!(-1I?a@`b7To&bX^m#Wr{VC`Acut2%-0F4E1vHYBr$c(bImt`ms7Vn zUwr){NKZ9gU=X%n$7$8aehRbOw%g~%p5TS0u)_~lzPcZTc4@ZTJ!!~w+o7?}+J6gP zk1jmhKI7-OXq%eh;S146uQ-Lg{hWRudkE&jTb`mCb-(g>BK8qaJf41%G|MzSmiVJ; zbbV2hR@X8&-r0|R)6Znv`HOw*+Rx&QCa;~pG+FMx2FdxkX98~hSZjPg|G4pe{v@&C z5i##op%bYyIEWIa+-|L#PD0pVY-)7|49uCr!dsW7i_csO`LULsG~Fm!uX|8mmr>4% zQfV(dp=j@IkFi$u@Ag7CIYqt@!$D9%8x))P*%kAPP|dQf<`MeG?K7*u zyWT$Ryh=UacBOrLZ`<_JtCK{`>8IRDN0o+vh7xy5?m=d;aNvX~x9Z@d9kFkye4I(u znZqITAN;q)Pj$vf#7YXpV*pwcs7I~!Lh~7>%W$t7&SBYf;$3w4E&IV?R|C15W9u^WWwk~^P=dJA_vO-yiu<#J&FqsqK0iD^^k%VYRSGoBipi@^eyc9(pR= zx?1szP~JqTiqx)x7$N(4r3D>Y`5Lw{JubQB?)=j{ZX}`YbV%EmAWf@Fiz_ijY0)f7 zhrmp?Q!7J9v7Xxm)Ycu4D~ zKYWnexex(()&}F-;W3nI^WxR-mY@c-tlxs){p=<$)=^9D(7b3<&q&PIUT730vrUq# zQLlCsHVp^U&rz-mdm*Hh=GSPo+bmr>T(+3v^LROO{i*ZNaz8cz5sAP^#&x8zj?Fh3@ zYbRrFGC{2!^c1yjuF2LkN217D$8v9w_^a&pe>&`PG?Lk*sP*But!sPRCZBdCz59IQ z&ZYG?GbL%S?F+dlh<&Ox%qPF8*z4x90wZ-0_E1Dc954TTAMnMu#UHv-_xeujze(%E zZ9i8&&p2txaaD86HSV5_Kz)73(qf((met*{(=qAw!NiZ6ZDapNJ*pYK{Inq8eZG>a zcKCMJH>zhzvS_D{zh5$_ra9M#YD(oTY8g?}8ELIcQC7#2+S`_f+h)a{qp@E;{GWn+ zMVBvq0|?Ms>UP`0dRI21R2`^(UmfXNox|e2q)S5{SL#$D8X3_DFMSRhmM+wi2o55j zzTxy1)PhdFdK8xqZy1qKqfrkk*IJ-@-3TdSf$=$nIDRnrol5>g0|=~SLoo^vd4m8p za1x0|4DeJPr1_PmGW7xC;Hk|9yzRgV%YcxngT{vKnyRLok?0_I=^l3@p~%}jvqg%Z z@LPtUHK_+tZ7>O=o1Su=5lch)Y_Z6)hbAi>r4Ijt#VH!&=#uDg0|y*_Ookx|vxEN< z1{|nKY*s#--$D>Y${6z&d93}FjO}zsKANdUQSCx$SSr+_V9}U49W1hH!0JT2Q%?ub z7jFsK9jI8=l9j(m0ir-ST9ET9*cYqH5?h$T8YvlMJV|6B!0wi<3d6#>8V_n8j={^L zogacd@GJqt@R5)O$v~DkGw_;Ngq}x1sAVctFktR{qzRv5Sdb6_OF}w=w>$jBLxoqN z=uFs5R?d%RPXr?BVe63aoCWORgk|+x@l!_dDY9gczL7>6gA@#D_gK~a@>m@fY!)F$ zA~yMNZeV2;-pw7#xW6!MU$&9cyR@7%cepwJb;ZVuy#dX!-y%;F{T#n>3lR zjPib^DgJ+20NQ|ur)fQ}M<*;SZ_~ARaW|Zl_a*-5dG$H&jx7M9jGo$i%5-gS;}fsW z)~1pae4Q-A{w}qRczoM#&$|oNWow@{mrR8xZAjM79F|nK{c$nj*&{d4aXUAmJQbl% z@{RWu)x$I6IH2r@D^f>`&OR0Tqf*o%^OmMlG5zpYFi62hXCL$)`gT>$d17ENGYQz> zmgQ;tinMN98qdsF;e?hgO5=b&;^dzTlbwGx^<18Oth;l+W*UUzl^jlZ8Fy>>q2AHU zkKQ_8@oWqN*pFQ4zr98aR^bI=Z>zGnUbb4~)9d0qN#8ZeNLz30$9UMwIp%qu6FQWV zFPkYy;o4f#!RG3czJ=wbXvY(f#P58b+Wq;VK5cqoC~am|d^cnSX9?F6jJ8_e)B|Mpq^L2CJ6({A((fRe$dk!=w zG6XtGtXzBrKib+Mv?gp+?1 z;&!Lnp>+L1mR-tzzc0~W)=GC?{uvhByit`j+u%Gm=Q$en#~=D8oG=e+zqR#~j8e4c zSc*OedJqvI#!rS6-|_p14?=G@&k$sF&1G!*@K)etgLMJI0m_8~39pk}yK-ZnT`qW6 zh{w^W_pj+wg)Nm1o97+mYhk1B#3pr!UmZF#1z=K`k_D4gkV{CX5K{;a>h)^z4Vo~a zz2SSQTvTB{((QK+zwTG6XI10(q7li`Q9?${GwNKrF5kdW6FW zBBqc#e88czd8X}}gxj6F%j~!brDo^k@=gj=vLwPOHw7wzS zB+O?Fl5baNU6y(~s=#fE#BC@x&}h)i2Y4wUp4sA;o;{o{Oo96YS>y(l@>mRss7Rv9 zHw5IVCVSZuE2Fru(&)G#3_)_jz9T9&`o>4yHuAEeAaR3A*xjhwQZO6&8bfHfE^f+B zqtd9{w?-Afzfdu%%A6@U$wPm=ed6Kw$&tjB(}_J@iE~{CUv6z(nKVv&eP?*C&&-!{ zS0l%VVvhI6`sol^8vd|2M%0KH36gb2jblZ&nl)5;c8%x zerO&+C8(kY%^`m8Iwbjeo$|C$z*cNO>uXCh6)M_~$JEch(OacM^j~^US(0dBa#QQ_ zW8>bIpRxz-WT}}$+6EfhsU4@D?6+1le0NFZ+PkE*YtC27GF>&T61%oqZ8V&}^0BvN zeqsAR+HSjLD+Lz@_$GN7p%L}k1Nyl%?Mjz3rj>(UZ>Q#l(susxcb-k(x%y<(_QEUw z(MvD3-x$S4DyN=B0JT9o$u`SN?a$`%YxOIo(eC(A;i<-9{)LNk<*RE$)y|)qG|Lv6 zBnyo#@#_zhUuZkNkQu~1-eI4w?I!>0N8fV%^!%B&AHDCAdN=pBTX|jer~^d)L@(Q?$9jtLRjG6QPaQV%iOBg{?gKsCo3hM7g(hE`L-q(Ka{zn_cJs zXq(Y%tK3rMD~n*MMTA@!C6oM@Nad|pjomm3gZ~cd zt^DlW$Tihl(dFJg6p6Yah42ArVAWG;;faewT*H(24`(tw!4yq{!=feq9vt^E18mickSG{ z4KOCnmi1>rfBwGP@2Q)zXH_(B;&uwxaWY!9Mk|x#rKD41CsQg^?iu~p^>AYM^Vg$u zK}ichkbQgGb5@ywed^{2DP*7OEIqOt51@N6T242oZj)Ats5$0|{V+ z0?kTVX(%E~)_!vQChXMaj^BZ|iATG_vJHefc2db6yMu3t#C^JY_zHh70>(zVV(CM*nzV;!6n-N`kI1hvEslw1%k3s!sJFm!BL| zz}_T_d~*71{Y<>gU{^;A+lT658CnOEA6l0ggv~(>4lA(OS^3$WKn(I&*mneo2|#7R zstx(tQi$%}Hwl5|HVE`cHvVJm1f*-mP7M9c;sdq>un$31z|a@)usAb%ekz>y6d@Ur zLe!N~cqmvlPP)y3u10V7xr%eJpP5(6k;f5hL2IO>@41Jkd~BsvwL5~N-nou zJa?52(>xyEOWjm<`RmQzq)$F^Hv#f-`Y{vIJXz@(zEZvmHVbI?6Vl&OBWD*{J=b^Q^B;1TMl{)vF67xEm{r z);+@{*hZWQ<$k%Y*sWDw8~v4SiN@h;`10j%T}xl4>0R#DJS53GG|%t7@TIvfX(pz( zbtM(DdT9Cr{e5AEy3?&;AKiDhysprko}1WJ7r*d%X1OzDJqXmoPfu)9C@m*8 ztX7%q`lqT^8fBg!J((>==%%GOC`E8_9ymE@X@mwW5p^gJuHLk;lo zTG}#}cSCbB3-6iGx(#?#l!gHVTO+8NnqT>mytvYBy7TAHGrh|#&g-K`FD(jQoC+JJ zxh4yqF-SqU|4Y=n$1~md@!$93dnpuU&Q_8+ujEWAe1|#H*rr+`Qw}S2bvadvUr5`K z^O-QrOmexh6yfSJN;#WoIb2aG$0WyL_uKdPxF7d_*Y&u{wPEki`|x@_UlKQ-TZ9T< zglxa|Sqs}gvQ#|f{d{6#uT=`drtVuEo`Ozua#e>H&1jP zS7TRlQQ=5ykwMQsfc8BYSpQ#Z^XlL}7#xLPcAo z93U{70L6J0bkN0a;&lFA3@n{>IQXjKaIzL;+Vx7u09>5G*0yuhrs%DZYuxgw!c&-7 z^JQphKZV*L8uFyy-gC3Pwlsj> zJ5F`nn8u}&G71Hm7ziVW3wN30eGY;8sVSh8Hq zRaxzS)w;d5e&or8=81hUqq`RlGSqEzL;Kz5WNVR>!4n3E;P1cphIM!HL)gq_N)}#vXAxi)_3Kk40E!A9 zMXuCr_Ni<=ymd3M;KOjYubf7SOsz~PKM2xUu7OmsF4NAaOrvhVjhw0E0a0MR@@+Ug z36X^T9(r>wZ||zr=cOWnc=D;upjEH6Ki@6=ZPvV%S0A(Xa8XO`+|=%5sIzAK!nT?3PG$m}E*B*q(==mMS*UT*4sO zKn~%^W#G?0J-_tlv5|-xm961j*S&8IF5F$N_iFf=)#YD03Nh@piqdp8uRGj3Vtalm zYFQy_^tUO?&+Aj;EB~}Po95#((7DEjHguX3ZMeJoA#zkv*_@e2JshGaPgAAGyFa?Q z86!}6K47GG>WgsW>3BE?-yRRiiRuVBV-5H6R9hnPFN4R7LUW3Vxm49d=+q3%;`}Mh ztiIkrwg%hNz!o2pHSAb%WoT^iboAG3i*;`L*zGS~(MTo!}Wro*y_i}u98N{Ef- zx=lk08-)Ir{rp=?=zSyy(js@s5f0LxK~-c-J3!H(-}J$bcq6oSg?Yf2lDz?xMa2c|+LU1&q z*bi+9yMk$LQqYFrcy4Ms<+aqN%6JwmRA6PSQ6h%SI9@3RF+)`Lae2t9#OS|+qJdgL zTb{k|X>EXWDYKCxCY&WedPUgLGPsF_k%+hw^>BC>&+HCX`PEX@+&Qoul5yvNn+zf% z8B{8XlZp$g0ykE?YY`s^wA0&>HyrG^0WqAMxymxc<(@Wnj$t2`ebIJOMw952nA_vUhjqtD4n@&ug zzSFMI{A0j!V-3Do@MM0^%XyC3u`0@bjn-FR|JL+9^!)ev$1R}ZIb<1KF;%qnsAYRB z`d3$luqoon1=H?>!-qVLE*qYApCgnIjWbCi_@g9ZSBjl3S?kT;rYyXFl1s$+-7&rG zP2nspc{69>W$1^e3O+{CYJ?;^iC}Rx8>FqPVH?_mzlXvwjSoWn6ykT+jORTP1^>wS z*1S>&GN~-}^KZ{IipVarB4>yHD`8xAM2hV2pJ3HrHl8!a%h^$-(Qap2!sH$txizF0&Fu7uRaEv0WvFlG)B?qKp*t7z{oH|2z%5vwXQ_yJ+jL zWXnxIZ%BczXjx87A4;Bk_%<<|?SKj?{(2mdIIrC$TNMPy{S@9oJjtA^FD-DhnVTCG z&I?ACx*IK)Hat^JgPejYNX9FIrpSecf1@`AMZcbf z>~Huvl^pr~ZAkkIMKONAVmhgeqNU5pi7P>^;P707_yWm?guI}zho0UspkBu#*b1WgDFaY0;Xg8FTYplr-difPbf z;U(b%T?@q5K{)q=R8JNHKb~uPnkXAp<1Tx{l?c3zN!V1Y zVsS&eIAAP$t zLe;UjC<>LRvy*vM!eQgV3qTB}i?J1BSV3}CVoXw7Wy7(+k;7y>(YDNCkYOyb!)kN^ z9u`U$oKIZL`8cUTzHy#3j{%L{*T)iR$S;#tTTd;2s;R8HjD7X7+W6~?x0NZW6mLG~ z8pI_t>NM~PDgB1Ls~YK^u882UKc?niu8v06uX+y)Hi|YMwroxpt)CSBXo=`)jcy%! z6gB8`YO&zoK-;gjnok||!j)coT5f9fETUNreA3oVws@bFo z1y*;)-s!cV{It}}`_hVy!5ycqypJrGPui7)t;8OzGfrbydivUBxC9y3=B4LQ95e?Q zNa?Rp(kriPW;$pvxV5Nk=UaX0zq`Nj_XUvlY?zEUY!-l`@K~guL}Nk7(2GwGRGNpH zA{M`u3OkCT)M(q!8 z{lTzU98eM1NBz`_?u+m_zQVcgZ8~LaZQv0U>H&ercHeAw!EY(kP>ELT1ev>)h5Uw_ zQ_7aVnnjh1Ud~1fM=C7V|49#@Ea-M(X2qpqzH46|*GYQOGCkI~@PBtgk)NW*qh^W8 z7Tb?g9q7G5&+K|JRUb_)Wr;M0h}|eAS+V-TSV)m`_WX};em+aN zdYjLN8UqS!jO77uLsUB%j5V%P=k^+uV`Uo;1u=7**nP@L?Tj2IR!N!VU*qs#IG4S` zFqUR#uqKCmR+6Jv&TJ0bs4P#U*F^{0sCV!b=GrL@wfyjkl$VbvO)BH z;EWv<0TmBqq?Ev?Y6Q+l2L>@VxVYzdBSzK?&X^cHQ_RPn6+>kxXn9s8Hb>&Z^d+hS8sgT}3U{#vbfU1NO~CLk4pnur@1WMX=f=(N;8@!E|uQ z6+@y}Gdo5yQ;s$Rwv`O|%iV@ze5Y^Q+`=inwL#%VOW63y=-%w26F(Q4w-RSpyB8cP z*zEZuWEaEl51VwV(aLtZ%x7fwp!%i1tR5Zndfs~a<-*+j&1IeFUjkve)**qj6+|Dc zekxkKe8#PNJtEn1a_!QBwj78?thqV1U2z5+`Aj?iYP)a$71b<__syDL?N0hMy6W{K z^}+n&+ojWMvw$>za%!6z5^*rK@Wc^R3Gi%yxe1T0=TB7Ai;YvW;z=&9%ElQNpGot` zy-m4_=yFeua+kJ8=aw#=PHy`0u<`Ean&?jZ?e^2pg|8mmo%-(Qv(;_n9W{5k(QD+z z$)Bka-oJWdBW`Z~tiQAPu4uLJdi3b5@xyR`lo7wFyPrns^{8NrSLYe`!wIAkBdSBD z0^or5!2!kGipqOkBY5*5s=r4#Vzu~o#(sNpNG0OVsk!hzPl|i4gM_=rjjq75&e=8; zLaxMECR3tTo9OR#^IhuxriE(n=(%0OpG!sIU+!xao;1JS?Wjm*$LjO0>hD_mJZzyb zzgShYmJzvd`|o;{$PW;9A24fu1kLJ2U7}MGkVbaNvxO=Bd<}BIV69o3TaJMt!QIi~ zSMS!b(de<#vS;* zW*dbovDs`CIY*ZcsMb2q*JpedXQBn!cYl3KzWwRv%%ko1Mqd|c5Bni)v{SXz|Fo3f zBO_j?cr7bbQQ2QJml5jVr=GzcoTZ5#YIuDgzNNor^wzrcwjP3EWMbsFmR}w^+%Bg& zV>gW@Z&XHR4==198@u)D`ewh@*5C7(?3R`1@N*7;x%cqpcqKK(^c2HY^|D$gHbw3? zkjZP5q`GnY+MwqdZhdmlYN5V)O|*H1Yo=Uyz%y9MMp{%^9pwQ-seymsaGxjOmUP@* zM~=!ao?+!1b0v5BmXCWWa`|9jyr2NdGKDblzz2nmS1pIMIbAi`9ZH)#1}}LNP${ zt3w`4lf99ib(Vl=?Ska!6jUu6TBeK!e}Ds$^7#@T0lTNeW1sZVm+(6Gw9gxCNxpgFm|#4a_-rlHtJ}_amF7gQ5`Ou;(5ol~3aSP0(>gU~O?+ z3WNg^cbNo=zdDKms|B6tP`-~z#DWC<2Gf+r29c;v5(BLHp0BPBqRZ@pj+9#dXx=aQ zF5Jw1xt0|nm^`BO=*}lO`=#My1Gr#L8BpM>n;7IicHk9OIN8vVJglb`*gjRvjs@`>Wo}iV7a8_(OB$^x=RjH z6?8>*i2$iI@3Qsz!Pxx0z00qCHXiEm9QP}ed~*fUmQa&-?tdjbbE(2sQl7U zDut=8?MuBV|J1x9L1F$!$!ZJ4@K`MfH%BVGqE_fYW^_r*DWSubp*+(~utkfUZ|%`z7uy!NkzEE)zktApp3DBbU0{glLTvxV&}9 zA&3)g0&xT6EQkc#b;c*UqefWhv)K2*@@x5#Gj~_d_Z)w5+nRZNaQd*KGR4F0L7qS5 zjG;|nN@XD#PF5-USBy?yxc$vrVLS|a!07JlQHv24i<{})3*ks+&?QCehYF8&MHZ=( zrQ>V5vc$E3M_iK6Mp?w{*w>Dho4kZG-uiasCq;7&OO?}{m}fiBcKvxo*O~|ib=NX* zfnWNoF?1}}YUNL@(~nkrT7J~rS*Be-9x*RAz^0`hcF9wXk<{ZaY(50@!0x4z>r7tB&CZ^$)Ex4uNgTBL* z%jMgq#%G|yyc`3;ZN)H#j-npG{9e5&#bX3Sy*4DNBSdwSVPv9%*8Sc&aG?i4#hFw8 z+%K>i+cWKtsfN^y5>ErtMDaCwAo%BtgS#sXgv=ORJ=+xu0)0&waB&Y1Ih`Eg(_V?! zzyv`9g02J|D~4G{Kw9y6-VGEFlFg(er%+m4}RLPl1Bjx<;;DnB{| zT~Me8eh18aL?~hKNagM&+=iWEvGIs)2;8wSykkYb6=C{}lYaPXaC_}mdZ zqawtFtho37(`8DmoOZ>P*I|pz2~i-?yBG0t)qd+k$n`~)L(yZWUQCZ%3~*W@nfDcY z@cD7)9OZ~XoPj^lm&5mTU!Kw$TP?0vZu&YNy&bV-CEQ-^`hE5Mv5nj!f!5gKn96FG z!o#hWWUHQ2H;i!;c^GBxB?5h)IaW+kTxa4iJufNM*K8)%>i0gM$bSpoB}cVRwfuF+1O1X!yl z(H(CcP&Q~wsv^l2?z4`Km(H}cA)3oVT2v;%aMmY!^t@ivJH4n0{IM~?KA)|2xt^A_ zzYOAy>)6u$4he5q^ekVfC$REexrB^YH?5r>Nx;4k=uX}Fw<-JO#@m6Y)g|FScsIi_!IPWi5eFO2oxjkFYs&r3S-bXlaeN1Q#*YhHa)aJq2pz%&thkaEp7;HRvXq} zp%b=zt7yA_;nu|ZyY7W->n9 zpUDP9{0GH?1lRGr}muZC8rEGavc<-E_@Z$7tX^SeiD z2i~LAQ0i!UNoa+5C6R>ezzw)0LiRhvF?udC;kjRpLe_QLVtGlRnXAVmpj&zAURvqO zWgD}u#O#JRYZ)fe+G~jLcp{u_44?CQv1v(wK4+5RV8B9pKzwEzET_%2W3p_KL{I|a zYjspv`MY!{Bf$`#1&-JW3txL<8XbfuzF=gT;~} zL{8GdDz(Q+D?autr1)Nw1B@M7JI3)r9Qh(7I=jnZ5cSz9&I`ix)zE>^55xT>A0??e zU2F{drkkZWU{#R~5V|xYOfX#pJ9@NRw#2knjBTnT4R`pR+)c%jKxJ+hoZI5e0ZFA^ zr%i*&1zL@+|K2?fJsEtJ=Z^XaGwq2Lr&KBU3Jfu5YAj7Ui znF4Q_sR%4N*AY+0qZB+sj%NZ2Xe`e5t;?=gM<mb+ElV#>N3N6y%(bVI zF6kd-K8uG;=nox_)3<6P^+qPoSV6h*zF8&w_3hm;pIh&**&anY;TrTNA9hHp#JRrbOU%`^U@cR*S?I;rjRr|59S1PFaj^plB@HE1r>* z!OE?q^`$76e@N(eKqb+b{W>2UOWgt;>jq_0_f@ya=Cfma&lz|%ZKU}KKMLm7AJuMCk1Lg^ear;5YtsSiGJDxWcRFLRrD4DviDvxZSMtkNtM-!+tyl#sa zo2(pqw45Kk8F|b~P_|@$(nP!#pK#Gr`V}EqBi0R%DAby7Ueb-4lo9eyJ{>NnD!eF zo!?Al%Bp^#bxD+Bc!xF0<$P@`u$KUk3Coq|jtH~8PQ6*s&bL*=u0$S#FoS6Uwd3j0 zt<_1>X7Di5MBsDoA?4$$*osfYr#+#?83hU*MaEsjbZ76ggDu0E!9{B~_`hMi+F@-| z1Dzd!gbB2qGJ=MCJ{7&=`NmwOqptO*klEBghf#(xusPiZF={0oM_dLt%B0*Y;OVZJ zv%|{F;9_>|tg>_Ae+cL)MmM3&M;9B&QsuCSPO$0$c!uoaS9&T8Q^IOb95)v@e0FlO zzhM*B#whNtTy!0GZr8E}2(8Z&fwObN3o%|{?tnw)$3s2}t^%Tg<1%uKuX*HW#7ptu zALR2J&f$hc!d!78x)YIAW)24lflZj+6jHfycSaoB*mEbH6w(gC#+G0%BTbTq{IPxg z>?;@{PcE=pOCWf=Y^d+(oqmRw>jnp@;S+Y&ARsgbp-@{ig7 z(8>$`v#UdTx4pq`b=5ll^n7kAGob9lM#1X#ms?{~1(u@&xD^Iqev^6S`u%pXGSzn1C2F5uyXhgaUD1QWH9)q4^O#iSa zyzzPHFLSHy^o6A}(LV$3d@UE<-1ZsM|C-^}=;`8^+t)5;B*U5JCc4)(ijCI??g#ZI_IFB}8~iZg=Z#;`du_>=X73=m`=6u07XB z4WRmUlz>XZ_RZ*gTU@D0opqN^==iT=NAc74sExjbyQL~OCpCoM2a0~$M{hPZFHe}w z9lIdamn9KoB1?-UXS_$1#bvOGwpyg{!G5V!3zN29&j)Q8{k?Xi?}SWSS6%Fi{D3~k zB{IV;xbAW^W969DCN*MfxM%H?%9?wRr65eW;-_+Bay>w*Lq9dH_kG~p$s_|FgIJ{# z80%ik>S{!`OSP<2r6Q78Cs~t*bp65`*TeD}gKkxmXPUpLG%aLru1!XFEu9|y)v3^OEqck;uJfEY zQ7N^3*dCv8?_5>s3$?H`zo6L$nbuBPUQDQ%zZ%;DrpIiHAMYQW+WILe{HO(duc;>u ze>NU=Vk?^~?ye@f%OKqG3AU?Rhn|OaSP9nm-+nir^k}0K&IB6;H|`l2P@YkZJ=htl zB9*ark0DChDTdrj$Cg&_J#*~V>}Yah)Mml{=*?2g$mOMn#}1xQlsg$578kESn`3;L zAYqPZ@0CwIPK=9xUNH>a$PN<}i{ohmo~9%dIQ_sNhX5al0Muo}a|tTP;Xqw$xQ>Y! z$zn#1u|5)api_9v-2hCJlXxK_;khg1s?*n=0ZtSls=;tz%VR;|3^tgFtYSKjYXRh9 za*8ATI+%g+U0Eb-KTJlDn+?~gN*I88ofwcFZ%(Y3K0IFnJX4&gqz*dX94~8wgM-_# z5)E&S5?CbdILLRk;fzu}Ajufwh8H$xs_!+}*ifiJ#44a=l$U78i#zE$?b!6sfEIN0 z33aFp-UjeLmeJ)@;F1-q{*Ouigc<@oaStR(Iv+Ne5aJ9{#A`DBC?u~?nw~Wr$796k z0ITf$^aVhk#hSAm3fNS%q!So$)iFA-q80_r#Lk;F2Z2=#WSzMpR%Llja;m081hMkG zG^MYYUTlpnw{`-Ov9oo87!nqxF-oFs`j8rTV}C8sy~F0rPGx^#e(xPQ(@Rcbu&O=&srgghb=i_qx@z)NhZOV0f$RKB%H%bb9mO z{oB;lt?HJkOu_i<{vze(A3QTJj$d)N0+PDfCrAn6YBWMn};`^7flh-l~kjv z{*_#2PLV;nSD`C?-4k*wvXqjW=EKIe9v=BCdQ4?YFuqt3y%D5vOj(r=xN?wE0s5@` zl88)SgN?rlmiX8sWB1dzb_|JF|dz)$)fo0z$EQP$?XN2xo(>+dKlfY~hEnXuoS zTNV19xc#Om`qPZ}?ZwNDT%0SM6zd$6mD2L$!+Kq6#oTLUi1>g+U-!3Cc&J8#rmf&J zcjoxno9(YHXYZf!PLUwA!=Z*WeRw#6{{8dX@E1{)m3PsrXS|~Rm26%cRJhQ1yR{FY z)@L5b>?@3wALM=OzGl@~YxbHJs+bh7s-2sr|G*1`sqy^Ck21+OKldeUFL8R--n@<) z?Q(2Sy_B;9A8UUo9gAtKcd`)`uVk|06~o#7EA&1!cMo0CQ@ml~iP_iQMDCN51H6M* z9(X+nBAF05=C{_*Z}$nJKBOlLO?rGHJB)m`8@3k5C@6|tYmTZ(2!l3ys{fqHoORz$ zp2@so9o`6A{+qiAZx$BcK8wBQRYJGE9I*V=G5-5jdzeDRNk`WNt|pI+;^`{qXw+Jr zSp0WpeyJyVzUbysx!J9ao+r1r`I3!@%2=j$k}+633f0RDMFE?ShLdm1dsIK=#qVDj zLoEXFp@-MkmXn29JziTcOZVEdrSmY~ik z#}#;U$c*P+p#Jl&g0O%D6ksO6-y{YM8DPp(doZ1VF-Va6jRU5GV7U1d?wt;oBNQYM z3DtCv2~#PMx|+aO=Q~-?xbz+$f-uvDa?>3WF)VyJm5~sh@M1VF>$weX3f9(Pjbt#+ zgLR8`T-zfbY#27vS*Sn_5NGCUGw5Vo8MQI97}~e|+nnNVk+6#A*|1i@0K=V#v%Ttp zq#K}#byF~hL2LsUTe$>`bXBECoV+UQEEW=3({LHUM}bqH>}4joFRdhm z!c_H7K&q|09ypadw$v=-pWfPK}OX(}tCFE1#t~9AW6jK8xWo(sHUp8*Ya7CBK}b*IRNGESFR^ zU%ifYj=-Ofv6I&I5J@FeJ2`?X)Quz2iQ?0!$G`DxNy>emP6V6tL0#{~uv4-Lp63Zh zI+}kCrFq_$AAB#RWUrnVG#s=l_FH+9FO-DQj^gULP*PWxdG@`F9-(Q)8FYx3xIbTx zD31i7Y3ai9*y{FQ3f@ZFvwBY=zkGGI|KQk*Ov-h7Kqd0n%)-O|Os2FQ;;(?bv^Uh^ z%hd4O@A4N`-LQd&ob8x%80k9<7sy(J#hi5ZG) zeQBkYVw7j!;O!A@VX8}&B?TU2{~hRJ>rvttF)YBXUaaVKEcF9I?l~CQQ|399rzfk z&5e*)GV;U|u{;WSD6wg_g=~2C0-F;j0^^kJ`FgIdjx{2mF|PsAU2ZOU`2QyRAVtEM zrtSf#=|jNNs0}(o19qkktYcBE5Eyu9u7x|f2^d5b4FJTDx&`<_4b!kE#?bE@wf(8X z5qHNr$pCJc3dgPTeGDpOynrSWJoyu26d6%WCH4C??1%?fGjQaI7|QW3@2%Uy|;B^ZgYltxx=#J z)xa%+1Ogxx5ejL=(-%O}>=@`cqRTP@)7Nvb%i2~`plD&QqG4tMWf4l72w@4m#ij^I zW|3V~merXUq{xh)3!WGw6DjFuiC}#w$+RUJ*bY)I(pg55)20XxoivCxjm?52+A^_f zI=7NsJYT7?NWnt<8psX-$FUb$GFXY5>;mN@N4%1UfnY`$K!fS-6rv+QJ~PZ&G@QTV z3curX_4T`rtDDtDA?vQ=3o_%>nmbz>OJ9#Xgn&&Wxdg{}EXOv`omh1?lX2P8j)Rx* zv)bw{ty#L8ED^oZk-YXxMffm3r04nn`PNZeTKc_N;5`)}{A#tr-QVE@Nh zt*#(5O${{mLEJ-!-5ge3f1ooH#X=?#i5`XOv*xG%2%6H0{+6`TJe_eIdfVd?W>7et;@sCCxT48O zdsRSBO@TdTp)-d#YpzHnrYeQ!$YUM5(hOxFtNL!3OKqhXzt_>a02W%e|G4_=&1oT5 zZ>VQ#vD$^1i6-~NhTyXUj~V=H;R|BO%Q@|7O` zoT3AYcFrzHe+31cicqTghq*cPKz$7ZTUSY&vQ}J`F{|EU@%EWxK0h<7iWXCoqlb^A zr>ZI0JRNe;ZPlNh#T!N1T-sMSc$2u56XTBL z2ZdI64iMrz1{S*%HsAiwk`>**bh_o+cfF|5jw4!SD6m?}=Q6*?6wd1LrBmMvFg=OmSZ@K5yE z=tA`N-&TujZDtKCxmUcOuRKmX+r~`KFbHG_nl$56kdhRl3?fsaFcWu)T%6g_m+5>c za_FO%Rr9A-6(Os~OAu39T7v1tu&^jqn%gC*7-r`iD${u4Lc(!~F#swI063j&?ubHb zfkjkIT%fs*O4o@Yl3WwuL5sCMkMICf!tpctVr)?0!1My%L>94{0Z`{*?u&+OI_o6x z0jqW`&xwF$kASMC1GLKnR4gw5+nw6~+}R1A5ADXZ8z9g3PG3OOADJLHK-9a)a`1hy z9Y9Pe1RsTbucKH`fJ}yntMP<%k-d7OR zUxbfgEt*lQ16aOZyO?6*a#L@LR{dM=Gh1E2YUg3%e3r07_?BnJ9rB)MQX`$b@238TYzW z7xP4%EJ75^rh@Eur&;rK4`Wi~ZfLUS<)OL)EuP&C^kWElt{2D5WRXO|Qam7WIMhR$ z@950%eWc%BH(qr7);c$GyM27|vtav4zy@`Ed&KPJueYuW|2!EySLGJRV)7l{*nWQk z(k8SUE|{ASWS;q}$TtU0exph)lFQ@8LSg&_;;hort1AkJ&tob*!hq zV^_Xe)BHEzg=k^)%-q5n!so>XL-@zm0mXKz^4Fu0cIZh5^Dcs&L~DV`EW$-vj?kWA zcN8gZU2Bx+GA_JZv-P7~{X?&b7nHbHI*+1xIaD!xh1qe3jl>h5Y>@>eW$QAeXi8A@Du)| z5$$YYRFg0=ae6yu;A@s_t1s7e$RI@`XppflrW;z3?LVQa{8{0>9Ur~;pykuXQ(zk_ z7)M$gN)dulot5Mq_SX?dN;ec1ub)<1BcgYE+RP%SpYC)b=T7`1apRidTgw5ol63z? zrz+FmTmyAtXi{>p49-k|s3SBcR8Ya z0B}aDVft6#y`aMd`b+{F^fk7F5h=a&Vo%OaXpwq3Y-_7QmIDYd3~VKL_Qna2%D@%_ z%FRbv4CFtCW8k(S9dV_%_?iNM`>c<^VgWLg& z6)bYRHK0SVm3t*Ci;$_+7H|7+F#UfuMwihohr!|oq~xmdKy$=pq8Vb-rT{8~Cd&r5 zO5hgmtUMSR80VuC`{2BE9N^vz6b104BdYK*XVJAMTnNGJByPkRSkLI|--V!=2yLhV zfzEJEuS9Xt{GESMRu42T-$zDdv{#xd&~Ij%D~x+1gg)hc1QHbIm^2)0SlZBl6o3#+ z4)r{wAb^t{mcqHkF${`{?dUOiOesYM%ZpHe$O;t21djKsQUuscL!EPA;gjOf8se2% zvL)KPHNla_RIJNj+Fi+#Ft132)ULX;rU&ya6L6nSI2PTrU$Eco*m~!H-cGYI4+g_J z`>SMkbXknShX41sM)DY9bjZziFV`m4!tqU` ztS%D{J$dHZ<{WG;90p z)9%}^waJ>*H<^Mv%hLf{U$rb}+qT9O?d{@E1kz}}LphZX>DX8YR-RIf*8_jHj`BWh zg0qoaseMdP4b#^?*AJ90gT_Ii#?ZgQo;>6I8(^zH5M*%n*(Yd*I8(Rnz& zi$=VCsdG5FNxPEW`H5xkze3SNg{5FJF76}fYKF}&?`%o(RsQ(jmZUOzZX;w!S=sAw zdfGngLMO@Af&p}rzj+`ezx;hSdvj_3o!;}wW1lN~yq3F!f3yxu?zT~u4Y^3sQdKr& zMGTen?gfd3~6c z$0sZLlJU{n=z$~+WCmuzvRvfL( zfpA9=juMMRd<^25RRY9#^Xl;kCSziCMMzd8KGXlkB!GOw}$VpZ;bYkB4_RxKPx*+*G>P=^8eFbn^YK7 zXsB9!BL_DjyW8JfS+n=ft__7{=UOGcPWP)|lC@1rtoV(OWg^b6{`xZ9KlWF3$fY0{ zqFb7K1dlmGmW~D&vf~=Op%Iv71XbU5_$WxPtT$12pjBS0pGTKVTF022Wl4H9Mq&l@u6vD)Hz z99+;#9Nb0P{_9mCMu)i$kCnwhah1#OFHY=5VI3-)iqR|(|A|({w(nr2!%9&rJ3po; zatlwW=Lai`$Gjky!F`G$hGIBb&kxr04hDPGySfvuF_-H9B|CI;c=GTy&>9R45$?IH4XpEOps)~Nu!lL@RC zC}AQKRM!Ruek%>^YBqZ7PIk*LpUszA(X+4bu9nx|U3#(b zv2a$s^-T&mPY?#>nYPlk*@0I=kxEQDgMN6$PBth>qVUws@m*k^xZPX+u17HFBlKz7 zc<9D6upVrZxQ<7x`nXL=l1l{nE8iuS!#btQS>Vwl8&N9 zO8MycUW_#}?iu-PLk{zVrY<=%j$f5$oOLWb++35~iSf&p(X|QG&@c%gUTFFm-?IF@ zWqvX_dZcRn?#C|yE!VwYSnpQloN4=p8a~lykfg-bFY7CSwX<)o&EUZ{S&3G5wYqu4 zq1&5LtCqKG-dWxJApDgXJ^iyPTUpOu+Bil@niOebds0VE8B(RY3M2K#zAr?tEUcwY z+BdCnoV}wzX`Dl$b=dKptp0vQjMG2Y(x@qK3rugM6o)z-VY)q3dH(HF%a6EsAbei0 zX#Sk*>=W_n+Zz|9mEG{GEm>+HV{Nco7wkV6h__!CA6=qZ-5iZA1uF3LD zFmr8T)-xAy5Ch4g8{L3yhVF!X+n<#%h8;Fto+l5$N#}ojc6uGsBd;GwsMIF@5fm9s z0}QYn^c4+&)GMaOX0hVvu_+!9Pz$15cUx(bASsaRr8vg+IswrWq&t9&*b9{~>$y9T zYjWcWB-LsJzA00^p$YO`Z(Ie~Bw5f{5i{c&hzt$-MHF>r(4R#=%%-wj`wU@A6ek~h zYVGssx|kq2(B=%X(J>heU)dY6(2``uYm;SofFuNi*feBQ4e5|;P@dIIBrum3!ppfJ zQx_)17u$IaK?k`e7((^LGi&G6Vt5VLq=>b9V7LRfruZ~Gw?V*&+=-0wGr?8-b5vX> zEFI*G>BEpN2_*|c>3YqnvBsW~q!VJqZxq;RWD@3Cp9M~K*&a?N;iB-ib)~(va z{9!J;TI6zgz@@-BSCeYPD~W!>FA!rKY4yYR^unQ^!tGBp;b)$lwbPC5HqYtfX(NK* zbYhEi4=%&YI98{TwfUb?8;@-)?N@<@vgQxX+uPmOE{^ zK6Pi~Y4lKs#lkXA<<7?|RyW__{A`gD?g$$Kj#zsp->%V*Fq^5)>P*Y|c5UjP<3CGQ zM;Cfd-Oe`i5oGB_Evnp_>>7Gwy&JHw#LWJT_>`=6m$tDoNDvO|^~k4P?DZrfGdw+z zbLxa3{oDbJvlc^#ozz$9z`)M7F-0_1q&<+p7Pt;@kdfF!-lJKiyY74V~s&MsY&$ z4Uecz5P~SR)SI81B5u#tCNyu47;S&R3ma8B>yOeHqpGa;-r{t(uY`g5&+N#B=AJ1_ z!79*m1a~I$uRq`X=g7n4SnV`AT~+xKg(;t8px~iA@J$~SH$h;2sy6haGV31x<9GVh z=TD+~8}G|2w%%TkdiAkUrUPU{l72aydLxP2lpLpU&+pdp7ataCE89I#^bhwBN7;#% z=j7&q@gT-4oNf1@P2cs*V80lJT`2aH?FOX3>vuM41Z$H;KllmP1@mUj3!mT8PEe5= zfw9G3bNUrSsD@~AIE7hmZ&%qg>w=edeqhXWWHid`x7z+ckt&Ttd#!GEC^Y{BMn==@ z+P62DBTA$=zJy7D_}7a#4TGufQH5h04~n*SB`aG@v{m^0;Fo77BHW#G$~BT=Q?kfX zm+fps(mm;i`|JSr55IG_{$*G#roQ&#H%;t4eYayEyLoG$U14M(;};HVJ3%n7GDz;l!+KN9 z1A7B0!yW^ni2nQ*{lC5yQ_eV7dk zTh;Ovr>n^PJ!lAe3dCU_Lsh#%kIOoKW=My2K(<69kc!vHfh^nt_JML^cuArdFkZpn zjtE7Kodcr;STpqva3bzyJs>(=+G;1{O09VOO={ISeUyZNhj|5|0w zrpdcjm7i7PHwR{}d#AoIvNl&5RAM%r)m`yF$F5a)TBhx8?NOB)*z4FU1mU%$EX^GHK}`(KLx zB$lPAVi9@#44NkaG?A>JV%5vxNcmN-Q!7Q$YwoYlc&}XX*(kDz_&z?v?K4oVrV^cT z<Vs|~gKlxs<=V_kr98r!~7T9sgtuX9Ve8THh0k2}4zW>g@t<9^HyMpyI zv*Cko@6MK~awtb=8DeORqWtdKA!W7xl**^l{o3T3M6Q&|=D)GW4sQLuu=%m#4wx)k zrPb=n@WK8Gm1st_!Q5Oy!G#-;I4BtL*;*Kln2NLzbPahmZ?Y##rATS0tbMJF69!M! zjxN2)Nysfc5#E0A;q6QQ6@K7a>32dY=h5i5Cuk2W)_Ql1H~gyeS#PminDa`y+$TZ! zqpX^pdND=Jzap+ppC}qEk*WllZp88uRUQFvdq8clz0=L9!6B!RNivrTBR^w!P#SJ8 zOGZx)SWU@TZ8+9=MZHVtiR$SXtP;!3YL}AhB5;rvSzeuA=ns*~oxRd_`dT!UqDF}) zC;#Natxe3T#qFA@@y+HQ;f&tx#msld4yw5G9jzI=HI>P9*EUK3{rHE%=YoFOch>z9LmTU=%f-Ohm(IgQ5^c-N#CBs6?0D?-Nzr4sd+b#rzE6W; zgqMA4>7OBG6+Mz6TS?nGzEhRV%yUXkG^oR$2c4AqH7R$I{|P#-$(gZT5w=8tRa}8j z8|qpOxD?B@V~!7`NfBWW%w2|LTq5Y?8v6dsh4JF`&a-;L4&XN|{uOHM;qnp&;Bp;i zi3!6zO~{q@oYaK7$s9~(6e5U4FmgMo_mC3KeEdjJH_s0Q~oq*H*Wzz7Fw-})Vz7^=j<>;I+c+~b*E z;Q#;l{gNnTW95>{Tw;;Cipm+LS;*L^2{q+1;W%!U~|ArV3ebDPcOh^6Fm%IM+} zGm(-ax#W_{{j%TN`96Msbvm7PG=1KCUtX`*(-{Inhxf~u-j~M)usU0&;pzjDp8ah5 zsq|K9m`-#V{uKT*0))uhA!;RPm0H8uc~#pdljVdRG4C`xd2wu0C2FO56%#|*G=xKQ zfq(%{9)ablRuK@KirrNl23;#Ai%>vAZ3gA6r~-0B3v6TzGQmwnMx5ph{gX4aNxPgwb;^rcVFwM3aRZW&v@zZOE{+b()$=zu8S$}ow#PE05eLvlXu3A-im{1IK8O3H^ z88~@AV#cKPbc-ex$x_h!QxKk1p_6XBPzr^_I#jH;mqbK`5g@&2kLB8%f#4OtZ}A#%Auv zpAK(C&MZECyTMwWxlvgeJrZ_LuW4#rD@MID@ld>M_)#LS9ancp?pam!@BT+_?ZGTB ziglMj)>>#yJbi5L&bGac&9!>Rr|(6N?5H?5sCe=urf?X4)5XSD<>Cd0*ZbS2%Hq8U z!oVyUZz%&aW0PqKgtySa0GUH>p`Q0XdGHthMJTISK0l=HuTkmfUk9Q)Uq=7dySD!G zL*r`FtohYdCb?=qYfILEK&@>L`{_Ai;$Fp&OieG261ClTs@E4`&#QqNGW>sF=*iu^ zF&=qBlxtwO4|x*)C;>E+P3U&m@PQ{By{wWXuPdya&zdZ*`sP! ztYF9z*Hw+j>?(-GnwO{M>zb8Kh^>$$nyBXV+mz$jW2go%!}LFoP6B97G9KZ}Y7|9M+D3Yy4BDbCIek zxC}Z{`5oZ@v@46@eBcsN=x4}8gf#p;kI{zG4oe%jMhTOs&OR{8VSJ}?PGJRf4moFs zQ=H#jr;=e8EW##Bf|)`av3qe@8=2#5iL92P)O>qQ293o(qHjT>+C#^F$9XQVd}y5i zdH)c*;1WKfLVNoB`Q5fW2zo;pFTDBlPO3poB7gjc*Uq8Qf?4yQIhE_mo+~Ayg2R>d z7oPs9qf#tTxfBOHZASaSy^&M47IRsmPWRd6yvk#%tW%Xu)4o!EQiZ+xnlUcUgf6?% zSTwy?9wJjIJl@4COT#KBem=i7Xy7q_ziF;*W3cZ=UyHe3c9Nfx^st>*5O}GuvGFAT z%2eNjr5PDoMui;sfC%8^*jS$O=d~54oOiI(E^nYQ@m!$yK;TGig2R1Oq;Gj)pyy@u9b_dFx!C&`ip&3IcWqFjo2 zuZy*%VIp=ikCxcQ5on_&sU}^6jKwC=iDZkpe|$DRN38EVy`FlwqJGr(XsZ6$Z4$wa z)Qiyq{_H?b{b=K}eLtQytt8AmTSdIRF=BG>P}A2d7oc{U8K!YIP$KDS9oD#Z zJE?@5Hby3LDT;o0>J`pjy|YSdWL z>@sjU;2YR5{^Bn%xZr7~Y$|wE(%c_#1_SF>hjF6Mm22+Fp4Ww=C3;t82epL6eBCUnY>kAZ1_u;hV<1LEh1nEaPZNM=<~w^^-{+r?2svsR-g*EUYiu8&;u^I#M%Aq z4-yaLNbu@*5wTFAzVSccsrb%K!h9XLL%}x zG!wqH7z)%f|4lK}Cy-|a@er-py-QsOKFFwL%4i}Dy9TV?B(>#&8_=D0o20!bXW=t{ z!>iXjZvjF`!N?teo@}?SzYptbK*a&KvyZD}>36Oq2JYGS(HqSW^%5wLO-IYHFoB>} zV?w}}Bv?aTtyPSbkpJD(1E@U^7XjhpN+iouj&LH&y5M~Od>!!t*T~9_EHySsI<-f= zTRf~G?-SM+QcsUKqniKdtzl+r-@PDPtc@Pd5hEkPuL;sc7aRiBm%!c?EK9`IXvoBz zhf_8Od)dd-F_c$&AurNoxOmkG&@vxgQNm+K+_wsLh+w615T zx&wP49Bp>+jl_k;h5Iu{8hc*e81{);lFOaTxx19()8tdDR<3Gu$}xuX*wBkTFhNHz zcwe%nV5gHH@YA4V%eYE?IQ22IFLLeoX;I&arN2eO+CvS~PlK9Hv-TZ16sNO#5M{~|aeTa$}nhnWa$3X@t-6uD)WAv1sxfur`P(w&}FyadaslWRJ z&vlcm&7_=_c=t*fmol(Q_K9db&%g-|O+ZML3i3*>8uPq+K?)&yV!Xh$R{h(Q!&sjs$ViOtp51*YM z{2@4WW=|?IucNji`Dgwg3B_G@($PO`xnRimCz-MAAkG$bpRzAe;NJ! z<-XM?K^B{af%?y1d%3NDlul|T744}0)^7kPa5_7DUxC( zjE2%w!tG3iv6yoURXtlpm8HS32b>2A&@=tO1;;t=7Mov*F#|7>iys|UzRtC5vLu3E zW9wIjLFe2wIBk%kp68g>Ylgqvw*&XHhvyx*U|W^H)di3L}fs=9!)nHw*QQh9dkn>dr35NlAx8qv zH{~FRMR%ft&2eHq;9&S@{pya3y)~lc4;8VbhCHodaC1I5$lM=D-c;t$P=A31<-IA= zX&Vo7w#$ijp5REa;S8TMNrAiR{603AqH&Iu1*&20u!iY^{cLrfDNnI8?lDG?+MnPC z?T9yCn|2o#EM3UMn?8xdj(iOJ1H&GsJGMO{#l;c<88e4>OwOZVZpy=V!B60pjofrg znZUXz7Tsyjf2zu%>A{y=0YReHy&SqS)fraNHg9T-!vE>MQgQ}b|;@_vME4`+CegsLv%oj=qfU{<`DQdbSVMI`oBoSUyW z`RU8-`q#J5R^3HaZ#^FZJr^|+Iwl~7I<)AAlDtWdLJwt=q*lW$)l~ zi=Rflk{eqNdagFDZ_KVapSD<(zIS`}4?8)NGEIt#ukBQL$;`P)_vGuqIQSY}w6n2i ztm$`IkY~9;L!>AgLQ~l+`oKX5hE6P%yL(1M;3uvf*5zQ9=u%E4lbH@y?JguIX`^wW zt+$^LdUSsv2l4H7 zXHLY&5sT&Lr&qd$)(p&p=F%%Y=iWqk7NOMhaY={*t5alevO53MKZS9bHu3QnQ}z86 zw?vVoT)lW^>OtmvMRy$)LxPt#!9NrcIwfx)rq+E{ z^10gV)vnl`=YD=2eYw8Sv=QbSVeYj@O)8s#->uec4227Ctz~EoivGkwbo}OS2W_*P zV8kGYxdaO@3>%woDM)xsa{_@coqg0l-0bM`?dabTH=e)TyZYqdThCt~<=&b<4Y$`9 zT9c*P&XIC%`y+3EO9_2WG7quy)A@DA$;jNqHc`<^s~TljviI8CsF}#VhKF@OS#Pg@ zsXcdN`B6cEm(?`RIKOkNE`yG#R`QORInmf`v79A(r}lF8$J#ycS7rq%dHGUnv~X&^ z7->dmwgQHcRy?4J!Dj{Qmr)`Idy7_QfBd+$FKqd@M$_E#(A<)dC+{4kM&YiMp`93_ zIfYXkr%;1wrDv<7A!H8N+)to0;m{Ae@TWl*UkBbB02NG;5n~VtHO8T9p;(urP%u)}x@a1?yO&in2zbh+yWLf(@!^Fa&-if%69rvGz`J*P^Pn z>oTcV+yM%l1y?J{$$5xa`ESBufqw_6mq`GyClI`x0spiWtBp3*$PeU($#Q{`Lblyw zCsqYJXss9q;(zN&j24x8rifxw>PxWI66Y*n7B}on*@55vkmPX#>2l~=s})p@h}N?giA5%K4#bsIw|l}#-~D31`$YBPhlAY z3o164z(Ed_Fu=z`*q1$1Oc%B(9tinhqGKf)Wt>9UO5VJMVL+J-Ba_kUOYH1A3D=5z2)nmTu^mRe<2LJR`+G5_@=#j|A)dns!4Hxq@Wa7yM zMHnUrucj%fTZLgXT<{f7GQZbya^KUw=4ZQ)&qc5MM{kTpe}2OqGHOM$b2Lm6SiK~- z2}_6hul$^o5la)%O9%I^e>uHcT^ZHm`Y@{Hfk}*tmz}1ZBCj@W#@9DIe!tcO&&2R!_tKY_dw*9%eoqi>oL+mKyO9r|hmg<-q;!rF*Gx-#f|Os_YZr+^P_&&T zotW?BiB%XslNuZkWo5`yFCvq)TOdw`T%(GU7JkaR%lA-L6e}egt6s9%rkG-D-AzJP zTVJ%1vr{8WS)JsOcjR2V1}mb7y+fmbv64IS+iG9L{6J3Qg0RhF<=rBmlz@mQ`yN2M zlZuK=x}>mWPF8%3aSt*T@9QODSw5^aw=w$+bo03@!>${rb62Y^LIpWz#X?vTF)SLn z@LO3w@!N#S;>W05&y|Vjsm91pGmHb3SHAr`tg;V*Vp%n)R(L+^k{YxM(z4RG)l& zMbh3M zUc=h&!=qX@UJhJ^(oVcWQaFJI?zr|>5=F(vHY{d#e2Vtn^D~ozEfH6jPVNm}{_1w( z*U6@l%0tobAMLT_#A>GIFIe8fwF^6qTlJ*^@Bsw$0@c|B#vo1u9Sn_{Ri%ezA;IM^ z!yXzNM=l;7SuOPBJUrLCNeHZ!G7+1Qr-8FW0Ggn%v*ju1RNxl_)7ZdB`-g zKEq)!|D^zMjXumIgGooK^{Ftp8@Tm^xdVv7i{7bD)~O0^PLlu=R`xrJVqB%)GKyOLRpLfjc}Gy5=EokmZf@Ei>A3i zVU7?ZJXe%YtVcu(A}t_D)*V%OXWL&~9Dp;B4A@A7h1W<{!G-n}~lz6TCz z{p`x>;JvlMoyX2ME`^D{2dyVJu6^B|RG^j>dr82uDWlG?bBaS>J!sDvxwO(>a^ua= z8ei|q&(W2(w#ubWo?M$md5iF@l(+#dQz&ee$ZD1@&?&lrOy_&Jz5ZO&C<<6y{_=7r zZ29%eb?(rr{m|1D=E$j+wDAY297Du56Tdw|4xf{jk+*3RC8K!v1e9J6H>~qE-SR@< zmjc3YTnAIdL}MBDatN|^jDeOdJA|=a8?7pRX*(@QLY1LCAaMS5aZIauTa)P4_1^^+ zGZm4azWJYSn*14}cfaHSH3*R?^k~5{{?^9XmeGRtGn7&pe(D(-19a798s6XFWAv=b zjn7+lM$UbRp7z|>fRnS}7feJxCcO>;U~N~n=b1}W{IsWQ%o`>*7dQzPi^+o#iyxxq zUmrZ=dE@n5N~}Z`C-gkq`T47V?kRSt_xz(!1hSv-Nv#(bB`_+6liiEQzW%+cx4dHH z`TIles!8QcIQ$Qcj9rLispdbNjhy$Km6|p-(s)j#?<#HJK=NnOW7uFq)=QMZUfi!@0$Zr%h1NH6C0mSUm3mW{Px6LeGk`F(y+*i(t@w)MZ8CJPpO;K zIc75%*c6~HdYwP)FZJ!%{Evdgr;F~3S0~eVU;nlvH*9&d?U0JQlewRQu>rx2uepF6 zDAkQW8u96`35TW?BT*6zM-KGbSh2~9R8tn49fED~PSX_FviGN5IKVQ$ zz4uA8o5dQttf*HD2=sx03tFM zkgj372|!c`slrHCWx1#pRU8D7Nk`1J@&ORTEr2owU8u#|u4x%SMS+R&zgN~8HYKDy z$q&8*Y|U_*+@`m2zIZD{KCzXDV;t|NwHDJ4%NujVH`D6=vkmzW#IJsi%AGO>Y7g=L z86FZNQ4FWI2MoufHG=PQ8km5mL|1T`a32~2 zpELwbVTtK+0Dg#t6_BXLG4iG;*p=^LRYrke8LTCjai&+7 zhJr?hDdd;}CzEazCTlFAsiKvyA)!;s zl2Z)jW?reWHv`SQ5(RdrBXT6d2)r0+db3f=QD&1%zcXc_#nEPAsB&DA63?#-f`*AP z@sHJ0^PlBhz19IA&R#dh3oO3eUpzK^`jF?Z7YRebex(|?qEH#Db`s7`>62@EZg^6(NH#pDO7#8R?CBQay*8mpc>zaR!D?_r04F$ ztrNd5>=V5jN*P%_w*G=qlKYI+=RiVanZ%P{{Q;|Q#C`Bx95~ae?}gGPs-+0e#J7(t z*x)BSZ!R{?VqcE%ndQqLPdH%?4 z1^L}o)w`{V$@u99sYgD!r@Gv8HZu21JfvQ%t=fahL~j-qwZ&&+?u*w}p1oad-+kjl zwVuVum7~QP8dgS$4gvVmUPn}CS*B(Jtxi!`p`aZqHGgU2(&5)qB z>uXkgYgj)R5c=^&;@i1<`m>eumK*%b|!{p;n4aaYWOgTZGEQEi;>J*3jsGfh9 z|J2sX^3=yWHUaR7ofoJD>7au;5}GkoHuHN7BTwPgmf2O(L6#P)Gp?J%`I~?)nzXkq zG|4$QoFre>M^XYhp3omhhSo)>xhY_&^0U^}z7Vdrh7EDYl@ z8ql8}pa<}in!1*-iE-rHgQ^!r28<7nv^r~A89?Gmk>{PrZ|uDp-_>~66n8NJe> zCR)gHovQE%@zbwUt4Zm3MK7)RUUtDyHi{;vg_h>VO~vFGpD zoa)72OjUG$lgXhOXnNT=`-PDVGf^L(>NL)Nsl77mHv8j6kLO$@Y+Ng*D`?_q%aV7P zL|X(5rA}N!U&Q^hF|3PSXT_b13VnGO&)AdYw6n&o6>vO+P>3AkKqz3$-xLiX4BJ?$ z#VEv5nYZ;7(RZb?v1Q`4N@`l6O*4Hq^6P5U@8;aUMC-FZgbDL~r=#0={s#npu;ENq zmBywJtXR4<*y`I%Sl%RR7F0=XQ#5$wd)6kid+<8d0>AKqoO28m$8y=OG_ zwyy$p;6C-tBdu?lX(=}ab_Txcq>ib?L)1GotK!EC8HbnySu}-#RKm969D*8auvDAH zCY0Rex~>hEM1MN)Y1Ou}{?Fm3l_zGu4v-bA?%DG9Y?hGJY?sn(%%Kjif-pk|$AT>> zU1?_#lGP?}rha!t&IHdsn_WzrJvMuI<9GGLsO7US+km&)qF`9skSd`mpdpOE9SZ|N z^U}T>z=rv2LgnGAz{un3T}*MhMcGGUI9quk86lGNo=hSW|Xm-hZ^{b0vrU0$FbEeOq$819f{Qsa*O zXgu93Ek~@nmsezr=X1h{jSkqEgha?Qnup!tJ3uqN7^p*|20o2lPLSW*in z&?U$+Am+T_PX8%xm9`T_Oe0@ihIUtQC!Pc_7+^ABErHBuZ~2CVu(T%RFm|wV(1G+2 z80L~-%VHYl?uZjB(qP-Ox1%X=(#B9Lad6V++;M^lY>uMV&cY-5co6;>|NhM%uLD;$ z7Nh@7zOgcU^xB8$ub#)3kLxx5)iGYWwb{WcBE`l@7e+F>0@5WHX?yLe?Y1>0tyG7- zQJ)X(yLx4=p)GoJXzh!|Vv^58A8rqK=vV*ZdYi|bL1i$}R*y@BeuomKCu-2eIR7*iGe!^-1deO>L~m(t?J zITQMEyT7>SN2hhv7&~6pvdfEm75LmVza!3;diIgLMOnB;TWVR!@v)CXr=u6w&7b*1 z@KQVMD!!Y4Y7B2za7rk}-MR=C)WfCyr4FY@FLn#m2}bDTT$TN;|d;Ocq{sB66E>JreuG)Sb2`RnVKYxj-geetdxilex*+^wQ@r$D^IA;zp`44 zT=SU?UX1GL6Ae`^ugsnpz3A*E_1O55QvxZ*#aq9_k$*Ac-GiRjuTy?49v|NkJw5yM z%0@7(%sE`W`r-3(lEIursW_57apIqe)|%c23Z}-1<=xVl;_c{NjPQZ?ai{L>4WE1d z>{#@2^7Un|=g)Z?Jn?C=2pmTL2+4FZ()cV1S`kyh)v0Gx$TZ$ms+bKZX zmW23lbTIl#E!5+Uy2YHxkG&;&k@Ks1ZRgeb9^f46a*Hvq*Oa<^0(z!QHB3{8fiy}kn6e*~;t+7FDT`r% zmk>s#E3QBcs76aL(-?dY!U%*{u{0nRWoqlD>l!$7Op;rbQ5hx>ymVw3J#sVQ^`PhQ zN7X_<;{dx~V;9Ib0Cp{{5)(dreCxa%$uaoZ-weRSY(`2rJzaW!x>g}ShprtXk)y;% z(`z#6IdK_z6@YkamBtRjT?)d*=MP!xpQ^uQW<+XXsSC@UV&W-0bznb19wtXs6RewH z?}QBMRL5Z#Al0UI*_2aJeOqz8tVGB5RtcUQ7qZNA(pv4|*uA+SD#;6UMwwS_@>{Y% z{sNTp7^FN7I9k&jFcTAyc4Pyg^#fS5N&p_cqZRlm`0`;FRKgjP$#9&kJ?K zR@x6@Eg%B*BRW6q*_ll+FVh(Z{3xan6LYqZo?EtgD%%Cq7ly=FAKyRj;%!XA%X;&A zu%;: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 literal 0 HcmV?d00001 diff --git a/samples/agent/adk/component_gallery/assets/audio.mp3 b/samples/agent/adk/component_gallery/assets/audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7485e1e8be0f4b63bec3eaf73916570e98390df7 GIT binary patch literal 744576 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�#RU~;)62$WJ90<6{Q?c%XU!? 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≷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�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 str: { "key": "date", "valueString": "2025-10-26" }, { "key": "favorites", "valueMap": [ { "key": "0", "valueString": "A" } - ]} + ]}, + { "key": "favoritesChips", "valueMap": [] }, + { "key": "favoritesFilter", "valueMap": [] } ] } @@ -79,7 +81,7 @@ def add_demo_surface(surface_id, component_def): } }) - # 5. MultipleChoice + # 5. MultipleChoice (Default) add_demo_surface("demo-multichoice", { "MultipleChoice": { "selections": { "path": "galleryData/favorites" }, @@ -91,10 +93,43 @@ def add_demo_surface(surface_id, component_def): } }) + # 5b. MultipleChoice (Chips) + add_demo_surface("demo-multichoice-chips", { + "MultipleChoice": { + "selections": { "path": "galleryData/favoritesChips" }, + "description": "Select tags (Chips)", + "variant": "chips", + "options": [ + { "label": { "literalString": "Work" }, "value": "work" }, + { "label": { "literalString": "Home" }, "value": "home" }, + { "label": { "literalString": "Urgent" }, "value": "urgent" }, + { "label": { "literalString": "Later" }, "value": "later" } + ] + } + }) + + # 5c. MultipleChoice (Filterable) + add_demo_surface("demo-multichoice-filter", { + "MultipleChoice": { + "selections": { "path": "galleryData/favoritesFilter" }, + "description": "Select countries (Filterable)", + "filterable": True, + "options": [ + { "label": { "literalString": "United States" }, "value": "US" }, + { "label": { "literalString": "Canada" }, "value": "CA" }, + { "label": { "literalString": "United Kingdom" }, "value": "UK" }, + { "label": { "literalString": "Australia" }, "value": "AU" }, + { "label": { "literalString": "Germany" }, "value": "DE" }, + { "label": { "literalString": "France" }, "value": "FR" }, + { "label": { "literalString": "Japan" }, "value": "JP" } + ] + } + }) + # 6. Image add_demo_surface("demo-image", { "Image": { - "url": { "literalString": "https://picsum.photos/400/200" }, + "url": { "literalString": "http://localhost:10005/assets/a2ui.png" }, "usageHint": "mediumFeature" } }) @@ -238,6 +273,7 @@ def add_demo_surface(surface_id, component_def): # 12. Video add_demo_surface("demo-video", { "Video": { + # Still external as user only provided audio and image "url": { "literalString": "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" } } }) @@ -305,8 +341,8 @@ def add_demo_surface(surface_id, component_def): # 15. AudioPlayer add_demo_surface("demo-audio", { "AudioPlayer": { - "url": { "literalString": "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" }, - "description": { "literalString": "Sample Audio" } + "url": { "literalString": "http://localhost:10005/assets/audio.mp3" }, + "description": { "literalString": "Local Audio Sample" } } }) @@ -319,7 +355,7 @@ def add_demo_surface(surface_id, component_def): { "id": "response-text", "component": { - "Text": { "text": { "literalString": "Interact with the gallery to see responses." } } + "Text": { "text": { "literalString": "Interact with the gallery to see responses. This view is updated by the agent by relaying the raw action commands it received from the client" } } } } ] diff --git a/samples/agent/adk/uv.lock b/samples/agent/adk/uv.lock index 48cf6be77..dcfe80b04 100644 --- a/samples/agent/adk/uv.lock +++ b/samples/agent/adk/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 2 requires-python = ">=3.13" resolution-markers = [ "python_full_version >= '3.14'", @@ -26,9 +26,9 @@ dependencies = [ { name = "protobuf" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/a3/76f2d94a32a1b0dc760432d893a09ec5ed31de5ad51b1ef0f9d199ceb260/a2a_sdk-0.3.22.tar.gz", hash = "sha256:77a5694bfc4f26679c11b70c7f1062522206d430b34bc1215cfbb1eba67b7e7d", size = 231535, upload-time = "2025-12-16T18:39:21.19Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/a3/76f2d94a32a1b0dc760432d893a09ec5ed31de5ad51b1ef0f9d199ceb260/a2a_sdk-0.3.22.tar.gz", hash = "sha256:77a5694bfc4f26679c11b70c7f1062522206d430b34bc1215cfbb1eba67b7e7d", size = 231535, upload_time = "2025-12-16T18:39:21.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/e8/f4e39fd1cf0b3c4537b974637143f3ebfe1158dad7232d9eef15666a81ba/a2a_sdk-0.3.22-py3-none-any.whl", hash = "sha256:b98701135bb90b0ff85d35f31533b6b7a299bf810658c1c65f3814a6c15ea385", size = 144347, upload-time = "2025-12-16T18:39:19.218Z" }, + { url = "https://files.pythonhosted.org/packages/64/e8/f4e39fd1cf0b3c4537b974637143f3ebfe1158dad7232d9eef15666a81ba/a2a_sdk-0.3.22-py3-none-any.whl", hash = "sha256:b98701135bb90b0ff85d35f31533b6b7a299bf810658c1c65f3814a6c15ea385", size = 144347, upload_time = "2025-12-16T18:39:19.218Z" }, ] [[package]] @@ -52,6 +52,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "pyink", specifier = ">=24.10.0" }, { name = "pytest", specifier = ">=9.0.2" }, { name = "pytest-asyncio", specifier = ">=1.3.0" }, ] @@ -141,9 +142,9 @@ requires-dist = [ 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" } +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" } 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, upload_time = "2025-03-12T01:42:47.083Z" }, ] [[package]] @@ -159,59 +160,59 @@ 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/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, upload_time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { 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" }, ] [[package]] @@ -221,50 +222,50 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -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, upload_time = "2025-07-03T22:54:43.528Z" } 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" }, + { 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 = "aiosqlite" version = "0.22.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload_time = "2025-12-23T19:25:43.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload_time = "2025-12-23T19:25:42.139Z" }, ] [[package]] name = "alembic" -version = "1.18.1" +version = "1.18.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mako" }, { name = "sqlalchemy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/cc/aca263693b2ece99fa99a09b6d092acb89973eb2bb575faef1777e04f8b4/alembic-1.18.1.tar.gz", hash = "sha256:83ac6b81359596816fb3b893099841a0862f2117b2963258e965d70dc62fb866", size = 2044319, upload-time = "2026-01-14T18:53:14.907Z" } +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/83/36/cd9cb6101e81e39076b2fbe303bfa3c85ca34e55142b0324fcbf22c5c6e2/alembic-1.18.1-py3-none-any.whl", hash = "sha256:f1c3b0920b87134e851c25f1f7f236d8a332c34b75416802d06971df5d1b7810", size = 260973, upload-time = "2026-01-14T18:53:17.533Z" }, + { 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" }, ] [[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" } +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" } 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, upload_time = "2025-11-10T22:07:40.673Z" }, ] [[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" } +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" } 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, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -274,39 +275,39 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] -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, upload_time = "2026-01-06T11:45:21.246Z" } 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, upload_time = "2026-01-06T11:45:19.497Z" }, ] [[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" } +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" } 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, upload_time = "2025-10-06T13:54:43.17Z" }, ] [[package]] name = "authlib" -version = "1.6.6" +version = "1.6.7" source = { registry = "https://pypi.org/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/49/dc/ed1681bf1339dd6ea1ce56136bad4baabc6f7ad466e375810702b0237047/authlib-1.6.7.tar.gz", hash = "sha256:dbf10100011d1e1b34048c9d120e83f13b35d69a826ae762b93d2fb5aafc337b", size = 164950, upload_time = "2026-02-06T14:04:14.171Z" } 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/f8/00/3ed12264094ec91f534fae429945efbaa9f8c666f3aa7061cc3b2a26a0cd/authlib-1.6.7-py2.py3-none-any.whl", hash = "sha256:c637340d9a02789d2efa1d003a7437d10d3e565237bcb5fcbc6c134c7b95bab0", size = 244115, upload_time = "2026-02-06T14:04:12.141Z" }, ] [[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" } +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" } 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, upload_time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -316,83 +317,83 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { 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, upload_time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { 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" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -402,101 +403,98 @@ source = { registry = "https://pypi.org/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" } +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" }, + { 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/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload_time = "2025-11-03T09:25:26.604Z" } 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/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload_time = "2025-11-03T09:25:25.534Z" }, ] [[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" } +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" } 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" }, + { 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 = "cryptography" -version = "46.0.3" +version = "46.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, +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" }, ] [[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" } +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" }, + { 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 = "docstring-parser" version = "0.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload_time = "2025-07-21T07:35:01.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload_time = "2025-07-21T07:35:00.684Z" }, ] [[package]] @@ -509,130 +507,130 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/ff/e01087de891010089f1620c916c0c13130f3898177955c13e2b02d22ec4a/fastapi-0.123.10.tar.gz", hash = "sha256:624d384d7cda7c096449c889fc776a0571948ba14c3c929fa8e9a78cd0b0a6a8", size = 356360, upload-time = "2025-12-05T21:27:46.237Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/ff/e01087de891010089f1620c916c0c13130f3898177955c13e2b02d22ec4a/fastapi-0.123.10.tar.gz", hash = "sha256:624d384d7cda7c096449c889fc776a0571948ba14c3c929fa8e9a78cd0b0a6a8", size = 356360, upload_time = "2025-12-05T21:27:46.237Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/f0/7cb92c4a720def85240fd63fbbcf147ce19e7a731c8e1032376bb5a486ac/fastapi-0.123.10-py3-none-any.whl", hash = "sha256:0503b7b7bc71bc98f7c90c9117d21fdf6147c0d74703011b87936becc86985c1", size = 111774, upload-time = "2025-12-05T21:27:44.78Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f0/7cb92c4a720def85240fd63fbbcf147ce19e7a731c8e1032376bb5a486ac/fastapi-0.123.10-py3-none-any.whl", hash = "sha256:0503b7b7bc71bc98f7c90c9117d21fdf6147c0d74703011b87936becc86985c1", size = 111774, upload_time = "2025-12-05T21:27:44.78Z" }, ] [[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/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/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/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" }, ] [[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" } +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" } 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, upload_time = "2026-01-09T17:55:04.334Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "fsspec" -version = "2026.1.0" +version = "2026.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d5/7d/5df2650c57d47c57232af5ef4b4fdbff182070421e405e0d62c6cdbfaa87/fsspec-2026.1.0.tar.gz", hash = "sha256:e987cb0496a0d81bba3a9d1cee62922fb395e7d4c3b575e57f547953334fe07b", size = 310496, upload-time = "2026-01-09T15:21:35.562Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/7c/f60c259dcbf4f0c47cc4ddb8f7720d2dcdc8888c8e5ad84c73ea4531cc5b/fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff", size = 313441, upload_time = "2026-02-05T21:50:53.743Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl", hash = "sha256:cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc", size = 201838, upload-time = "2026-01-09T15:21:34.041Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload_time = "2026-02-05T21:50:51.819Z" }, ] [[package]] @@ -694,9 +692,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/10/05572d33273292bac49c2d1785925f7bc3ff2fe50e3044cf1062c1dde32e/google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7", size = 177828, upload-time = "2026-01-08T22:21:39.269Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/10/05572d33273292bac49c2d1785925f7bc3ff2fe50e3044cf1062c1dde32e/google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7", size = 177828, upload_time = "2026-01-08T22:21:39.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/b6/85c4d21067220b9a78cfb81f516f9725ea6befc1544ec9bd2c1acd97c324/google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9", size = 173906, upload-time = "2026-01-08T22:21:36.093Z" }, + { url = "https://files.pythonhosted.org/packages/77/b6/85c4d21067220b9a78cfb81f516f9725ea6befc1544ec9bd2c1acd97c324/google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9", size = 173906, upload_time = "2026-01-08T22:21:36.093Z" }, ] [package.optional-dependencies] @@ -707,7 +705,7 @@ grpc = [ [[package]] name = "google-api-python-client" -version = "2.188.0" +version = "2.189.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -716,22 +714,23 @@ dependencies = [ { name = "httplib2" }, { name = "uritemplate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/d7/14613c7efbab5b428b400961f5dbac46ad9e019c44e1f3fd14d67c33111c/google_api_python_client-2.188.0.tar.gz", hash = "sha256:5c469db6614f071009e3e5bb8b6aeeccae3beb3647fa9c6cd97f0d551edde0b6", size = 14302906, upload-time = "2026-01-13T22:15:13.747Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/f8/0783aeca3410ee053d4dd1fccafd85197847b8f84dd038e036634605d083/google_api_python_client-2.189.0.tar.gz", hash = "sha256:45f2d8559b5c895dde6ad3fb33de025f5cb2c197fa5862f18df7f5295a172741", size = 13979470, upload_time = "2026-02-03T19:24:55.432Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/67/a99a7d79d7a37a67cb8008f1d7dcedc46d29c6df5063aeb446112afd4aa4/google_api_python_client-2.188.0-py3-none-any.whl", hash = "sha256:3cad1b68f9d48b82b93d77927e8370a6f43f33d97848242601f14a93a1c70ef5", size = 14870005, upload-time = "2026-01-13T22:15:11.345Z" }, + { url = "https://files.pythonhosted.org/packages/04/44/3677ff27998214f2fa7957359da48da378a0ffff1bd0bdaba42e752bc13e/google_api_python_client-2.189.0-py3-none-any.whl", hash = "sha256:a258c09660a49c6159173f8bbece171278e917e104a11f0640b34751b79c8a1a", size = 14547633, upload_time = "2026-02-03T19:24:52.845Z" }, ] [[package]] name = "google-auth" -version = "2.47.0" +version = "2.48.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "cryptography" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/3c/ec64b9a275ca22fa1cd3b6e77fefcf837b0732c890aa32d2bd21313d9b33/google_auth-2.47.0.tar.gz", hash = "sha256:833229070a9dfee1a353ae9877dcd2dec069a8281a4e72e72f77d4a70ff945da", size = 323719, upload-time = "2026-01-06T21:55:31.045Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload_time = "2026-01-26T19:22:47.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/18/79e9008530b79527e0d5f79e7eef08d3b179b7f851cfd3a2f27822fbdfa9/google_auth-2.47.0-py3-none-any.whl", hash = "sha256:c516d68336bfde7cf0da26aab674a36fedcf04b37ac4edd59c597178760c3498", size = 234867, upload-time = "2026-01-06T21:55:28.6Z" }, + { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload_time = "2026-01-26T19:22:45.099Z" }, ] [package.optional-dependencies] @@ -747,14 +746,14 @@ dependencies = [ { name = "google-auth" }, { name = "httplib2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload-time = "2025-12-15T22:13:51.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload_time = "2025-12-15T22:13:51.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload-time = "2025-12-15T22:13:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload_time = "2025-12-15T22:13:51.048Z" }, ] [[package]] name = "google-cloud-aiplatform" -version = "1.134.0" +version = "1.136.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-parser" }, @@ -770,9 +769,9 @@ dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/24/de4f21d0728d640b57bf7bbcd7460827a4daf9eaca61cb5b91be608c40bc/google_cloud_aiplatform-1.134.0.tar.gz", hash = "sha256:964cea117ca1ffc71742970e1091985adac72dfe76e1a1614a02a8cda50d6992", size = 9931075, upload-time = "2026-01-20T19:19:58.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/9c/38ce04e3ef89034c736320a27b4a6e3171ca2f3fb56d38f76a310c745d14/google_cloud_aiplatform-1.136.0.tar.gz", hash = "sha256:01e64a0d0861486e842bf7e904077c847bcc1b654a29883509d57476de915b7d", size = 9946722, upload_time = "2026-02-04T16:28:12.903Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/f4/6863f3951eb07afd790fe6f8f1a5984224f7df836546a34ed29ab0cfe9af/google_cloud_aiplatform-1.134.0-py2.py3-none-any.whl", hash = "sha256:f249ae67d622deca486310e0021093764892ac357fb744b9e79548f490017ddc", size = 8189190, upload-time = "2026-01-20T19:19:55.997Z" }, + { url = "https://files.pythonhosted.org/packages/55/e8/f317dc96c9c73846dd3e4d16691cc5f248801f46354d9d57f2c67fd67413/google_cloud_aiplatform-1.136.0-py2.py3-none-any.whl", hash = "sha256:5c829f002b7b673dcd0e718f55cc0557b571bd10eb5cdb7882d72916cfbf8c0e", size = 8203924, upload_time = "2026-02-04T16:28:10.343Z" }, ] [package.optional-dependencies] @@ -801,9 +800,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/38/89317773c64b5a7e9b56b9aecb2e39ac02d8d6d09fb5b276710c6892e690/google_cloud_appengine_logging-1.8.0.tar.gz", hash = "sha256:84b705a69e4109fc2f68dfe36ce3df6a34d5c3d989eee6d0ac1b024dda0ba6f5", size = 18071, upload-time = "2026-01-15T13:14:40.024Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/38/89317773c64b5a7e9b56b9aecb2e39ac02d8d6d09fb5b276710c6892e690/google_cloud_appengine_logging-1.8.0.tar.gz", hash = "sha256:84b705a69e4109fc2f68dfe36ce3df6a34d5c3d989eee6d0ac1b024dda0ba6f5", size = 18071, upload_time = "2026-01-15T13:14:40.024Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/66/4a9be8afb1d0bf49472478cec20fefe4f4cb3a6e67be2231f097041e7339/google_cloud_appengine_logging-1.8.0-py3-none-any.whl", hash = "sha256:a4ce9ce94a9fd8c89ed07fa0b06fcf9ea3642f9532a1be1a8c7b5f82c0a70ec6", size = 18380, upload-time = "2026-01-09T14:52:58.154Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/4a9be8afb1d0bf49472478cec20fefe4f4cb3a6e67be2231f097041e7339/google_cloud_appengine_logging-1.8.0-py3-none-any.whl", hash = "sha256:a4ce9ce94a9fd8c89ed07fa0b06fcf9ea3642f9532a1be1a8c7b5f82c0a70ec6", size = 18380, upload_time = "2026-01-09T14:52:58.154Z" }, ] [[package]] @@ -814,9 +813,9 @@ dependencies = [ { name = "googleapis-common-protos" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/d2/ad96950410f8a05e921a6da2e1a6ba4aeca674bbb5dda8200c3c7296d7ad/google_cloud_audit_log-0.4.0.tar.gz", hash = "sha256:8467d4dcca9f3e6160520c24d71592e49e874838f174762272ec10e7950b6feb", size = 44682, upload-time = "2025-10-17T02:33:44.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/d2/ad96950410f8a05e921a6da2e1a6ba4aeca674bbb5dda8200c3c7296d7ad/google_cloud_audit_log-0.4.0.tar.gz", hash = "sha256:8467d4dcca9f3e6160520c24d71592e49e874838f174762272ec10e7950b6feb", size = 44682, upload_time = "2025-10-17T02:33:44.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/25/532886995f11102ad6de290496de5db227bd3a73827702445928ad32edcb/google_cloud_audit_log-0.4.0-py3-none-any.whl", hash = "sha256:6b88e2349df45f8f4cc0993b687109b1388da1571c502dc1417efa4b66ec55e0", size = 44890, upload-time = "2025-10-17T02:30:55.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/25/532886995f11102ad6de290496de5db227bd3a73827702445928ad32edcb/google_cloud_audit_log-0.4.0-py3-none-any.whl", hash = "sha256:6b88e2349df45f8f4cc0993b687109b1388da1571c502dc1417efa4b66ec55e0", size = 44890, upload_time = "2025-10-17T02:30:55.11Z" }, ] [[package]] @@ -832,9 +831,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/0a/62438ca138a095945468968696d9cca75a4cfd059e810402e70b0236d8ba/google_cloud_bigquery-3.40.0.tar.gz", hash = "sha256:b3ccb11caf0029f15b29569518f667553fe08f6f1459b959020c83fbbd8f2e68", size = 509287, upload-time = "2026-01-08T01:07:26.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/0a/62438ca138a095945468968696d9cca75a4cfd059e810402e70b0236d8ba/google_cloud_bigquery-3.40.0.tar.gz", hash = "sha256:b3ccb11caf0029f15b29569518f667553fe08f6f1459b959020c83fbbd8f2e68", size = 509287, upload_time = "2026-01-08T01:07:26.065Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/6a/90a04270dd60cc70259b73744f6e610ae9a158b21ab50fb695cca0056a3d/google_cloud_bigquery-3.40.0-py3-none-any.whl", hash = "sha256:0469bcf9e3dad3cab65b67cce98180c8c0aacf3253d47f0f8e976f299b49b5ab", size = 261335, upload-time = "2026-01-08T01:07:23.761Z" }, + { url = "https://files.pythonhosted.org/packages/90/6a/90a04270dd60cc70259b73744f6e610ae9a158b21ab50fb695cca0056a3d/google_cloud_bigquery-3.40.0-py3-none-any.whl", hash = "sha256:0469bcf9e3dad3cab65b67cce98180c8c0aacf3253d47f0f8e976f299b49b5ab", size = 261335, upload_time = "2026-01-08T01:07:23.761Z" }, ] [[package]] @@ -848,9 +847,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/72/b5dbf3487ea320a87c6d1ba8bb7680fafdb3147343a06d928b4209abcdba/google_cloud_bigquery_storage-2.36.0.tar.gz", hash = "sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f", size = 306959, upload-time = "2025-12-18T18:01:45.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/72/b5dbf3487ea320a87c6d1ba8bb7680fafdb3147343a06d928b4209abcdba/google_cloud_bigquery_storage-2.36.0.tar.gz", hash = "sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f", size = 306959, upload_time = "2025-12-18T18:01:45.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/50/70e4bc2d52b52145b6e70008fbf806cef850e809dd3e30b4493d91c069ea/google_cloud_bigquery_storage-2.36.0-py3-none-any.whl", hash = "sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0", size = 303731, upload-time = "2025-12-18T18:01:44.598Z" }, + { url = "https://files.pythonhosted.org/packages/01/50/70e4bc2d52b52145b6e70008fbf806cef850e809dd3e30b4493d91c069ea/google_cloud_bigquery_storage-2.36.0-py3-none-any.whl", hash = "sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0", size = 303731, upload_time = "2025-12-18T18:01:44.598Z" }, ] [[package]] @@ -866,9 +865,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/c9/aceae21411b1a77fb4d3cde6e6f461321ee33c65fb8dc53480d4e47e1a55/google_cloud_bigtable-2.35.0.tar.gz", hash = "sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b", size = 775613, upload-time = "2025-12-17T15:18:14.303Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/c9/aceae21411b1a77fb4d3cde6e6f461321ee33c65fb8dc53480d4e47e1a55/google_cloud_bigtable-2.35.0.tar.gz", hash = "sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b", size = 775613, upload_time = "2025-12-17T15:18:14.303Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/69/03eed134d71f6117ffd9efac2d1033bb2fa2522e9e82545a0828061d32f4/google_cloud_bigtable-2.35.0-py3-none-any.whl", hash = "sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50", size = 540341, upload-time = "2025-12-17T15:18:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/62/69/03eed134d71f6117ffd9efac2d1033bb2fa2522e9e82545a0828061d32f4/google_cloud_bigtable-2.35.0-py3-none-any.whl", hash = "sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50", size = 540341, upload_time = "2025-12-17T15:18:12.176Z" }, ] [[package]] @@ -879,9 +878,9 @@ dependencies = [ { name = "google-api-core" }, { name = "google-auth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/03/ef0bc99d0e0faf4fdbe67ac445e18cdaa74824fd93cd069e7bb6548cb52d/google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963", size = 36027, upload-time = "2025-10-29T23:17:39.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/03/ef0bc99d0e0faf4fdbe67ac445e18cdaa74824fd93cd069e7bb6548cb52d/google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963", size = 36027, upload_time = "2025-10-29T23:17:39.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/20/bfa472e327c8edee00f04beecc80baeddd2ab33ee0e86fd7654da49d45e9/google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", size = 29469, upload-time = "2025-10-29T23:17:38.548Z" }, + { url = "https://files.pythonhosted.org/packages/89/20/bfa472e327c8edee00f04beecc80baeddd2ab33ee0e86fd7654da49d45e9/google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", size = 29469, upload_time = "2025-10-29T23:17:38.548Z" }, ] [[package]] @@ -894,9 +893,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/cd/b33bbc4b096d937abee5ebfad3908b2bdc65acd1582191aa33beaa2b70a5/google_cloud_discoveryengine-0.13.12.tar.gz", hash = "sha256:d6b9f8fadd8ad0d2f4438231c5eb7772a317e9f59cafbcbadc19b5d54c609419", size = 3582382, upload-time = "2025-09-22T16:51:14.052Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/cd/b33bbc4b096d937abee5ebfad3908b2bdc65acd1582191aa33beaa2b70a5/google_cloud_discoveryengine-0.13.12.tar.gz", hash = "sha256:d6b9f8fadd8ad0d2f4438231c5eb7772a317e9f59cafbcbadc19b5d54c609419", size = 3582382, upload_time = "2025-09-22T16:51:14.052Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/70/607f6011648f603d35e60a16c34aee68a0b39510e4268d4859f3268684f9/google_cloud_discoveryengine-0.13.12-py3-none-any.whl", hash = "sha256:295f8c6df3fb26b90fb82c2cd6fbcf4b477661addcb19a94eea16463a5c4e041", size = 3337248, upload-time = "2025-09-22T16:50:57.375Z" }, + { url = "https://files.pythonhosted.org/packages/93/70/607f6011648f603d35e60a16c34aee68a0b39510e4268d4859f3268684f9/google_cloud_discoveryengine-0.13.12-py3-none-any.whl", hash = "sha256:295f8c6df3fb26b90fb82c2cd6fbcf4b477661addcb19a94eea16463a5c4e041", size = 3337248, upload_time = "2025-09-22T16:50:57.375Z" }, ] [[package]] @@ -911,9 +910,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/0b/037b1e1eb601646d6f49bc06d62094c1d0996b373dcbf70c426c6c51572e/google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3", size = 499038, upload-time = "2026-01-15T13:15:08.243Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0b/037b1e1eb601646d6f49bc06d62094c1d0996b373dcbf70c426c6c51572e/google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3", size = 499038, upload_time = "2026-01-15T13:15:08.243Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/44/02ac4e147ea034a3d641c11b54c9d8d0b80fc1ea6a8b7d6c1588d208d42a/google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4", size = 458958, upload-time = "2026-01-15T13:13:40.671Z" }, + { url = "https://files.pythonhosted.org/packages/c8/44/02ac4e147ea034a3d641c11b54c9d8d0b80fc1ea6a8b7d6c1588d208d42a/google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4", size = 458958, upload_time = "2026-01-15T13:13:40.671Z" }, ] [[package]] @@ -931,14 +930,14 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/47/31ef0261802fe8b37c221392e1d6ff01d30b03dce5e20e77fc7d57ddf8a3/google_cloud_logging-3.13.0.tar.gz", hash = "sha256:3aae0573b1a1a4f59ecdf4571f4e7881b5823bd129fe469561c1c49a7fa8a4c1", size = 290169, upload-time = "2025-12-16T14:11:07.345Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/47/31ef0261802fe8b37c221392e1d6ff01d30b03dce5e20e77fc7d57ddf8a3/google_cloud_logging-3.13.0.tar.gz", hash = "sha256:3aae0573b1a1a4f59ecdf4571f4e7881b5823bd129fe469561c1c49a7fa8a4c1", size = 290169, upload_time = "2025-12-16T14:11:07.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/5a/778dca2e375171af4085554cb3bc643627717a7e4e1539842ced3afd6ec4/google_cloud_logging-3.13.0-py3-none-any.whl", hash = "sha256:f215e1c76ee29239c6cacf02443dffa985663c74bf47c9818854694805c6019f", size = 230518, upload-time = "2025-12-16T14:11:05.894Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5a/778dca2e375171af4085554cb3bc643627717a7e4e1539842ced3afd6ec4/google_cloud_logging-3.13.0-py3-none-any.whl", hash = "sha256:f215e1c76ee29239c6cacf02443dffa985663c74bf47c9818854694805c6019f", size = 230518, upload_time = "2025-12-16T14:11:05.894Z" }, ] [[package]] name = "google-cloud-monitoring" -version = "2.29.0" +version = "2.29.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core", extra = ["grpc"] }, @@ -947,9 +946,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/a1/a1a0c678569f2a7b1fa65ef71ff528650231a298fc2b89ad49c9991eab94/google_cloud_monitoring-2.29.0.tar.gz", hash = "sha256:eedb8afd1c4e80e8c62435f05c448e9e65be907250a66d81e6af5909778267b6", size = 404769, upload-time = "2026-01-15T13:04:01.597Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/06/9fc0a34bed4221a68eef3e0373ae054de367dc42c0b689d5d917587ef61b/google_cloud_monitoring-2.29.1.tar.gz", hash = "sha256:86cac55cdd2608561819d19544fb3c129bbb7dcecc445d8de426e34cd6fa8e49", size = 404383, upload_time = "2026-02-05T18:59:13.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/63/b1f6e86ddde8548a0cade2edf3c8ec2183e57f002ea4301b3890a6717190/google_cloud_monitoring-2.29.0-py3-none-any.whl", hash = "sha256:93aa264da0f57f3de2900b0250a37ca27068984f6d94e54175d27aea12a4637f", size = 387988, upload-time = "2026-01-15T13:03:23.528Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/7c27aa95eccf8b62b066295a7c4ad04284364b696d3e7d9d47152b255a24/google_cloud_monitoring-2.29.1-py3-none-any.whl", hash = "sha256:944a57031f20da38617d184d5658c1f938e019e8061f27fd944584831a1b9d5a", size = 387922, upload_time = "2026-02-05T18:58:54.964Z" }, ] [[package]] @@ -964,9 +963,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/7f/db00b2820475793a52958dc55fe9ec2eb8e863546e05fcece9b921f86ebe/google_cloud_resource_manager-1.16.0.tar.gz", hash = "sha256:cc938f87cc36c2672f062b1e541650629e0d954c405a4dac35ceedee70c267c3", size = 459840, upload-time = "2026-01-15T13:04:07.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/7f/db00b2820475793a52958dc55fe9ec2eb8e863546e05fcece9b921f86ebe/google_cloud_resource_manager-1.16.0.tar.gz", hash = "sha256:cc938f87cc36c2672f062b1e541650629e0d954c405a4dac35ceedee70c267c3", size = 459840, upload_time = "2026-01-15T13:04:07.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/ff/4b28bcc791d9d7e4ac8fea00fbd90ccb236afda56746a3b4564d2ae45df3/google_cloud_resource_manager-1.16.0-py3-none-any.whl", hash = "sha256:fb9a2ad2b5053c508e1c407ac31abfd1a22e91c32876c1892830724195819a28", size = 400218, upload-time = "2026-01-15T13:02:47.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/ff/4b28bcc791d9d7e4ac8fea00fbd90ccb236afda56746a3b4564d2ae45df3/google_cloud_resource_manager-1.16.0-py3-none-any.whl", hash = "sha256:fb9a2ad2b5053c508e1c407ac31abfd1a22e91c32876c1892830724195819a28", size = 400218, upload_time = "2026-01-15T13:02:47.378Z" }, ] [[package]] @@ -981,9 +980,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/9c/a6c7144bc96df77376ae3fcc916fb639c40814c2e4bba2051d31dc136cd0/google_cloud_secret_manager-2.26.0.tar.gz", hash = "sha256:0d1d6f76327685a0ed78a4cf50f289e1bfbbe56026ed0affa98663b86d6d50d6", size = 277603, upload-time = "2025-12-18T00:29:31.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/9c/a6c7144bc96df77376ae3fcc916fb639c40814c2e4bba2051d31dc136cd0/google_cloud_secret_manager-2.26.0.tar.gz", hash = "sha256:0d1d6f76327685a0ed78a4cf50f289e1bfbbe56026ed0affa98663b86d6d50d6", size = 277603, upload_time = "2025-12-18T00:29:31.065Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/30/a58739dd12cec0f7f761ed1efb518aed2250a407d4ed14c5a0eeee7eaaf9/google_cloud_secret_manager-2.26.0-py3-none-any.whl", hash = "sha256:940a5447a6ec9951446fd1a0f22c81a4303fde164cd747aae152c5f5c8e6723e", size = 223623, upload-time = "2025-12-18T00:29:29.311Z" }, + { url = "https://files.pythonhosted.org/packages/c8/30/a58739dd12cec0f7f761ed1efb518aed2250a407d4ed14c5a0eeee7eaaf9/google_cloud_secret_manager-2.26.0-py3-none-any.whl", hash = "sha256:940a5447a6ec9951446fd1a0f22c81a4303fde164cd747aae152c5f5c8e6723e", size = 223623, upload_time = "2025-12-18T00:29:29.311Z" }, ] [[package]] @@ -1005,14 +1004,14 @@ dependencies = [ { name = "protobuf" }, { name = "sqlparse" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/80/86e152f887cdddab5b8268c93d18c671a3653545be2ea2babab6b6ad635f/google_cloud_spanner-3.62.0.tar.gz", hash = "sha256:a25bdbfda84bc7a819f04e45473187d8670711fd5ec827cf442e3664661d1d23", size = 722967, upload-time = "2026-01-16T06:33:29.462Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/80/86e152f887cdddab5b8268c93d18c671a3653545be2ea2babab6b6ad635f/google_cloud_spanner-3.62.0.tar.gz", hash = "sha256:a25bdbfda84bc7a819f04e45473187d8670711fd5ec827cf442e3664661d1d23", size = 722967, upload_time = "2026-01-16T06:33:29.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/a3/27c0af7f4350757f449e601733d960fc6e2717fa25d3d826ad29b694de68/google_cloud_spanner-3.62.0-py3-none-any.whl", hash = "sha256:b59d7b731463ce998439c1998730760e36f3d699510608d896f2ca8bc57613a9", size = 516156, upload-time = "2026-01-16T06:33:28.173Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a3/27c0af7f4350757f449e601733d960fc6e2717fa25d3d826ad29b694de68/google_cloud_spanner-3.62.0-py3-none-any.whl", hash = "sha256:b59d7b731463ce998439c1998730760e36f3d699510608d896f2ca8bc57613a9", size = 516156, upload_time = "2026-01-16T06:33:28.173Z" }, ] [[package]] name = "google-cloud-speech" -version = "2.36.0" +version = "2.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core", extra = ["grpc"] }, @@ -1021,14 +1020,14 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/01/0bfe56e1f935285ac21908ddfb5574b09bf5829ad3441649e1403f9f1b34/google_cloud_speech-2.36.0.tar.gz", hash = "sha256:3a445a033cc7772f7d073c03142a7e80048415db42981372c6b81edc76a1e27a", size = 401922, upload-time = "2026-01-15T13:04:52.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b7/b078693abc67af4cbbf60727ebd29d37f786ada8a6146ada2d5918da6a3a/google_cloud_speech-2.36.1.tar.gz", hash = "sha256:30fef3b30c1e1b5f376be3cf82a724c8629994de045935f85e4b7bceae8c2129", size = 401910, upload_time = "2026-02-05T18:59:22.411Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/0e/29e5d7bfe636e7b7b2647d6f4d50ca07b84149ba9adba86c6be219ac8480/google_cloud_speech-2.36.0-py3-none-any.whl", hash = "sha256:bdd0047fe2961d42307bdb7393fe5c7c1491290b2e6d66bfc6e2b7bcdfb8794e", size = 342111, upload-time = "2026-01-15T13:02:59.482Z" }, + { url = "https://files.pythonhosted.org/packages/f0/13/b1437f2716ce56ca13298855929e5fb790c13c3ddee24248a3682ba392a5/google_cloud_speech-2.36.1-py3-none-any.whl", hash = "sha256:a54985b3e7c001a9feae78cec77e67e85d29b3851d00af1f805ffff3f477d8fe", size = 342457, upload_time = "2026-02-05T18:58:59.518Z" }, ] [[package]] name = "google-cloud-storage" -version = "3.8.0" +version = "3.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -1038,9 +1037,9 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/90/4398cecc2704cb066bc7dee6111a5c93c59bcd6fb751f0541315655774a8/google_cloud_storage-3.8.0.tar.gz", hash = "sha256:cc67952dce84ebc9d44970e24647a58260630b7b64d72360cedaf422d6727f28", size = 17273792, upload-time = "2026-01-14T00:45:31.289Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/b1/4f0798e88285b50dfc60ed3a7de071def538b358db2da468c2e0deecbb40/google_cloud_storage-3.9.0.tar.gz", hash = "sha256:f2d8ca7db2f652be757e92573b2196e10fbc09649b5c016f8b422ad593c641cc", size = 17298544, upload_time = "2026-02-02T13:36:34.119Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/db/326279870d349fb9592263343dca4ad76088c17c88ba97b0f64c1088276c/google_cloud_storage-3.8.0-py3-none-any.whl", hash = "sha256:78cfeae7cac2ca9441d0d0271c2eb4ebfa21aa4c6944dd0ccac0389e81d955a7", size = 312430, upload-time = "2026-01-14T00:45:28.689Z" }, + { url = "https://files.pythonhosted.org/packages/46/0b/816a6ae3c9fd096937d2e5f9670558908811d57d59ddf69dd4b83b326fd1/google_cloud_storage-3.9.0-py3-none-any.whl", hash = "sha256:2dce75a9e8b3387078cbbdad44757d410ecdb916101f8ba308abf202b6968066", size = 321324, upload_time = "2026-02-02T13:36:32.271Z" }, ] [[package]] @@ -1054,32 +1053,32 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/34/b1883f4682f1681941100df0e411cb0185013f7c349489ab1330348d7c5c/google_cloud_trace-1.18.0.tar.gz", hash = "sha256:46d42b90273da3bc4850bb0d6b9a205eb826a54561ff1b30ca33cc92174c3f37", size = 103347, upload-time = "2026-01-15T13:04:56.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/34/b1883f4682f1681941100df0e411cb0185013f7c349489ab1330348d7c5c/google_cloud_trace-1.18.0.tar.gz", hash = "sha256:46d42b90273da3bc4850bb0d6b9a205eb826a54561ff1b30ca33cc92174c3f37", size = 103347, upload_time = "2026-01-15T13:04:56.441Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/15/366fd8b028a50a9018c933270d220a4e53dca8022ce9086618b72978ab90/google_cloud_trace-1.18.0-py3-none-any.whl", hash = "sha256:52c002d8d3da802e031fee62cd49a1baf899932d4f548a150f685af6815b5554", size = 107488, upload-time = "2026-01-15T12:17:21.519Z" }, + { url = "https://files.pythonhosted.org/packages/87/15/366fd8b028a50a9018c933270d220a4e53dca8022ce9086618b72978ab90/google_cloud_trace-1.18.0-py3-none-any.whl", hash = "sha256:52c002d8d3da802e031fee62cd49a1baf899932d4f548a150f685af6815b5554", size = 107488, upload_time = "2026-01-15T12:17:21.519Z" }, ] [[package]] name = "google-crc32c" version = "1.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload_time = "2025-12-16T00:35:25.142Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z" }, - { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, - { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, - { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z" }, - { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z" }, - { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z" }, - { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, - { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, - { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload_time = "2025-12-16T00:23:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload_time = "2025-12-16T00:43:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload_time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload_time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload_time = "2025-12-16T00:35:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload_time = "2025-12-16T00:24:48.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload_time = "2025-12-16T00:48:12.163Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload_time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload_time = "2025-12-16T00:40:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload_time = "2025-12-16T00:35:23.142Z" }, ] [[package]] name = "google-genai" -version = "1.60.0" +version = "1.62.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1093,9 +1092,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/3f/a753be0dcee352b7d63bc6d1ba14a72591d63b6391dac0cdff7ac168c530/google_genai-1.60.0.tar.gz", hash = "sha256:9768061775fddfaecfefb0d6d7a6cabefb3952ebd246cd5f65247151c07d33d1", size = 487721, upload-time = "2026-01-21T22:17:30.398Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/4c/71b32b5c8db420cf2fd0d5ef8a672adbde97d85e5d44a0b4fca712264ef1/google_genai-1.62.0.tar.gz", hash = "sha256:709468a14c739a080bc240a4f3191df597bf64485b1ca3728e0fb67517774c18", size = 490888, upload_time = "2026-02-04T22:48:41.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/e5/384b1f383917b5f0ae92e28f47bc27b16e3d26cd9bacb25e9f8ecab3c8fe/google_genai-1.60.0-py3-none-any.whl", hash = "sha256:967338378ffecebec19a8ed90cf8797b26818bacbefd7846a9280beb1099f7f3", size = 719431, upload-time = "2026-01-21T22:17:28.086Z" }, + { url = "https://files.pythonhosted.org/packages/09/5f/4645d8a28c6e431d0dd6011003a852563f3da7037d36af53154925b099fd/google_genai-1.62.0-py3-none-any.whl", hash = "sha256:4c3daeff3d05fafee4b9a1a31f9c07f01bc22051081aa58b4d61f58d16d1bcc0", size = 724166, upload_time = "2026-02-04T22:48:39.956Z" }, ] [[package]] @@ -1105,9 +1104,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-crc32c" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/d7/520b62a35b23038ff005e334dba3ffc75fcf583bee26723f1fd8fd4b6919/google_resumable_media-2.8.0.tar.gz", hash = "sha256:f1157ed8b46994d60a1bc432544db62352043113684d4e030ee02e77ebe9a1ae", size = 2163265, upload-time = "2025-11-17T15:38:06.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/d7/520b62a35b23038ff005e334dba3ffc75fcf583bee26723f1fd8fd4b6919/google_resumable_media-2.8.0.tar.gz", hash = "sha256:f1157ed8b46994d60a1bc432544db62352043113684d4e030ee02e77ebe9a1ae", size = 2163265, upload_time = "2025-11-17T15:38:06.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/0b/93afde9cfe012260e9fe1522f35c9b72d6ee222f316586b1f23ecf44d518/google_resumable_media-2.8.0-py3-none-any.whl", hash = "sha256:dd14a116af303845a8d932ddae161a26e86cc229645bc98b39f026f9b1717582", size = 81340, upload-time = "2025-11-17T15:38:05.594Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0b/93afde9cfe012260e9fe1522f35c9b72d6ee222f316586b1f23ecf44d518/google_resumable_media-2.8.0-py3-none-any.whl", hash = "sha256:dd14a116af303845a8d932ddae161a26e86cc229645bc98b39f026f9b1717582", size = 81340, upload_time = "2025-11-17T15:38:05.594Z" }, ] [[package]] @@ -1117,9 +1116,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload_time = "2025-11-06T18:29:24.087Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload_time = "2025-11-06T18:29:13.14Z" }, ] [package.optional-dependencies] @@ -1131,40 +1130,43 @@ grpc = [ name = "graphviz" version = "0.21" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/b3/3ac91e9be6b761a4b30d66ff165e54439dcd48b83f4e20d644867215f6ca/graphviz-0.21.tar.gz", hash = "sha256:20743e7183be82aaaa8ad6c93f8893c923bd6658a04c32ee115edb3c8a835f78", size = 200434, upload-time = "2025-06-15T09:35:05.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b3/3ac91e9be6b761a4b30d66ff165e54439dcd48b83f4e20d644867215f6ca/graphviz-0.21.tar.gz", hash = "sha256:20743e7183be82aaaa8ad6c93f8893c923bd6658a04c32ee115edb3c8a835f78", size = 200434, upload_time = "2025-06-15T09:35:05.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload-time = "2025-06-15T09:35:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload_time = "2025-06-15T09:35:04.433Z" }, ] [[package]] name = "greenlet" -version = "3.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/e5/40dbda2736893e3e53d25838e0f19a2b417dfc122b9989c91918db30b5d3/greenlet-3.3.0.tar.gz", hash = "sha256:a82bb225a4e9e4d653dd2fb7b8b2d36e4fb25bc0165422a11e48b88e9e6f78fb", size = 190651, upload-time = "2025-12-04T14:49:44.05Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload-time = "2025-12-04T14:23:01.282Z" }, - { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload-time = "2025-12-04T14:50:08.309Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload-time = "2025-12-04T14:57:43.968Z" }, - { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload-time = "2025-12-04T15:07:14.697Z" }, - { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload-time = "2025-12-04T14:26:03.669Z" }, - { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload-time = "2025-12-04T15:04:25.276Z" }, - { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload-time = "2025-12-04T14:27:30.804Z" }, - { url = "https://files.pythonhosted.org/packages/7e/71/ba21c3fb8c5dce83b8c01f458a42e99ffdb1963aeec08fff5a18588d8fd7/greenlet-3.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:9ee1942ea19550094033c35d25d20726e4f1c40d59545815e1128ac58d416d38", size = 301833, upload-time = "2025-12-04T14:32:23.929Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, - { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, - { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, - { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, - { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/9030e6f9aa8fd7808e9c31ba4c38f87c4f8ec324ee67431d181fe396d705/greenlet-3.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:73f51dd0e0bdb596fb0417e475fa3c5e32d4c83638296e560086b8d7da7c4170", size = 305387, upload-time = "2025-12-04T14:26:51.063Z" }, - { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, - { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, - { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, - { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, - { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, - { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, +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/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/06/00/95df0b6a935103c0452dad2203f5be8377e551b8466a29650c4c5a5af6cc/greenlet-3.3.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e", size = 624375, upload_time = "2026-01-23T16:15:55.915Z" }, + { 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/e2/89/b95f2ddcc5f3c2bc09c8ee8d77be312df7f9e7175703ab780f2014a0e781/greenlet-3.3.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d", size = 671455, upload_time = "2026-01-23T16:15:57.232Z" }, + { 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/7c/25/c51a63f3f463171e09cb586eb64db0861eb06667ab01a7968371a24c4f3b/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab", size = 662574, upload_time = "2026-01-23T16:15:58.364Z" }, + { 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" }, ] [[package]] @@ -1176,9 +1178,9 @@ dependencies = [ { name = "grpcio" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/1e/1011451679a983f2f5c6771a1682542ecb027776762ad031fd0d7129164b/grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389", size = 23745, upload-time = "2025-10-15T21:14:53.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/1e/1011451679a983f2f5c6771a1682542ecb027776762ad031fd0d7129164b/grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389", size = 23745, upload_time = "2025-10-15T21:14:53.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/bd/330a1bbdb1afe0b96311249e699b6dc9cfc17916394fd4503ac5aca2514b/grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6", size = 32690, upload-time = "2025-10-15T21:14:51.72Z" }, + { url = "https://files.pythonhosted.org/packages/4a/bd/330a1bbdb1afe0b96311249e699b6dc9cfc17916394fd4503ac5aca2514b/grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6", size = 32690, upload_time = "2025-10-15T21:14:51.72Z" }, ] [[package]] @@ -1188,92 +1190,92 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/28/57449d5567adf4c1d3e216aaca545913fbc21a915f2da6790d6734aac76e/grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926", size = 19322, upload-time = "2023-11-16T02:05:42.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/28/57449d5567adf4c1d3e216aaca545913fbc21a915f2da6790d6734aac76e/grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926", size = 19322, upload_time = "2023-11-16T02:05:42.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/ac/8d53f230a7443401ce81791ec50a3b0e54924bf615ad287654fa4a2f5cdc/grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d", size = 20848, upload-time = "2023-11-16T02:05:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/15/ac/8d53f230a7443401ce81791ec50a3b0e54924bf615ad287654fa4a2f5cdc/grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d", size = 20848, upload_time = "2023-11-16T02:05:40.913Z" }, ] [[package]] name = "grpcio" -version = "1.76.0" +version = "1.78.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" }, - { url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" }, - { url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" }, - { url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" }, - { url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" }, - { url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" }, - { url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" }, - { url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" }, - { url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" }, - { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" }, - { url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" }, - { url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" }, - { url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" }, - { url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" }, - { url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" }, - { url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" }, - { url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" }, - { url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" }, - { url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload_time = "2026-02-06T09:57:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/a9/8f75894993895f361ed8636cd9237f4ab39ef87fd30db17467235ed1c045/grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b", size = 5920143, upload_time = "2026-02-06T09:55:52.035Z" }, + { url = "https://files.pythonhosted.org/packages/55/06/0b78408e938ac424100100fd081189451b472236e8a3a1f6500390dc4954/grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a", size = 11803926, upload_time = "2026-02-06T09:55:55.494Z" }, + { url = "https://files.pythonhosted.org/packages/88/93/b59fe7832ff6ae3c78b813ea43dac60e295fa03606d14d89d2e0ec29f4f3/grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84", size = 6478628, upload_time = "2026-02-06T09:55:58.533Z" }, + { url = "https://files.pythonhosted.org/packages/ed/df/e67e3734527f9926b7d9c0dde6cd998d1d26850c3ed8eeec81297967ac67/grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb", size = 7173574, upload_time = "2026-02-06T09:56:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/cc03fffb07bfba982a9ec097b164e8835546980aec25ecfa5f9c1a47e022/grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5", size = 6692639, upload_time = "2026-02-06T09:56:04.529Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/289c32e301b85bdb67d7ec68b752155e674ee3ba2173a1858f118e399ef3/grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9", size = 7268838, upload_time = "2026-02-06T09:56:08.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/79/1be93f32add280461fa4773880196572563e9c8510861ac2da0ea0f892b6/grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702", size = 8251878, upload_time = "2026-02-06T09:56:10.914Z" }, + { url = "https://files.pythonhosted.org/packages/65/65/793f8e95296ab92e4164593674ae6291b204bb5f67f9d4a711489cd30ffa/grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20", size = 7695412, upload_time = "2026-02-06T09:56:13.593Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9f/1e233fe697ecc82845942c2822ed06bb522e70d6771c28d5528e4c50f6a4/grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670", size = 4064899, upload_time = "2026-02-06T09:56:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload_time = "2026-02-06T09:56:17.882Z" }, + { url = "https://files.pythonhosted.org/packages/29/f2/b56e43e3c968bfe822fa6ce5bca10d5c723aa40875b48791ce1029bb78c7/grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e", size = 5920591, upload_time = "2026-02-06T09:56:20.758Z" }, + { url = "https://files.pythonhosted.org/packages/5d/81/1f3b65bd30c334167bfa8b0d23300a44e2725ce39bba5b76a2460d85f745/grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f", size = 11813685, upload_time = "2026-02-06T09:56:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1c/bbe2f8216a5bd3036119c544d63c2e592bdf4a8ec6e4a1867592f4586b26/grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724", size = 6487803, upload_time = "2026-02-06T09:56:27.367Z" }, + { url = "https://files.pythonhosted.org/packages/16/5c/a6b2419723ea7ddce6308259a55e8e7593d88464ce8db9f4aa857aba96fa/grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b", size = 7173206, upload_time = "2026-02-06T09:56:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/df/1e/b8801345629a415ea7e26c83d75eb5dbe91b07ffe5210cc517348a8d4218/grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7", size = 6693826, upload_time = "2026-02-06T09:56:32.305Z" }, + { url = "https://files.pythonhosted.org/packages/34/84/0de28eac0377742679a510784f049738a80424b17287739fc47d63c2439e/grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452", size = 7277897, upload_time = "2026-02-06T09:56:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9c/ad8685cfe20559a9edb66f735afdcb2b7d3de69b13666fdfc542e1916ebd/grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127", size = 8252404, upload_time = "2026-02-06T09:56:37.553Z" }, + { url = "https://files.pythonhosted.org/packages/3c/05/33a7a4985586f27e1de4803887c417ec7ced145ebd069bc38a9607059e2b/grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65", size = 7696837, upload_time = "2026-02-06T09:56:40.173Z" }, + { url = "https://files.pythonhosted.org/packages/73/77/7382241caf88729b106e49e7d18e3116216c778e6a7e833826eb96de22f7/grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c", size = 4142439, upload_time = "2026-02-06T09:56:43.258Z" }, + { url = "https://files.pythonhosted.org/packages/48/b2/b096ccce418882fbfda4f7496f9357aaa9a5af1896a9a7f60d9f2b275a06/grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb", size = 4929852, upload_time = "2026-02-06T09:56:45.885Z" }, ] [[package]] name = "grpcio-status" -version = "1.76.0" +version = "1.78.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, { name = "grpcio" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/46/e9f19d5be65e8423f886813a2a9d0056ba94757b0c5007aa59aed1a961fa/grpcio_status-1.76.0.tar.gz", hash = "sha256:25fcbfec74c15d1a1cb5da3fab8ee9672852dc16a5a9eeb5baf7d7a9952943cd", size = 13679, upload-time = "2025-10-21T16:28:52.545Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/cd/89ce482a931b543b92cdd9b2888805518c4620e0094409acb8c81dd4610a/grpcio_status-1.78.0.tar.gz", hash = "sha256:a34cfd28101bfea84b5aa0f936b4b423019e9213882907166af6b3bddc59e189", size = 13808, upload_time = "2026-02-06T10:01:48.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/cc/27ba60ad5a5f2067963e6a858743500df408eb5855e98be778eaef8c9b02/grpcio_status-1.76.0-py3-none-any.whl", hash = "sha256:380568794055a8efbbd8871162df92012e0228a5f6dffaf57f2a00c534103b18", size = 14425, upload-time = "2025-10-21T16:28:40.853Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/1241ec22c41028bddd4a052ae9369267b4475265ad0ce7140974548dc3fa/grpcio_status-1.78.0-py3-none-any.whl", hash = "sha256:b492b693d4bf27b47a6c32590701724f1d3b9444b36491878fb71f6208857f34", size = 14523, upload_time = "2026-02-06T10:01:32.584Z" }, ] [[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" } +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" } 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, upload_time = "2025-04-24T03:35:24.344Z" }, ] [[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" }, +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" }, ] [[package]] @@ -1284,21 +1286,21 @@ 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, upload_time = "2025-04-24T22:06:22.219Z" } 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, upload_time = "2025-04-24T22:06:20.566Z" }, ] [[package]] name = "httplib2" -version = "0.31.1" +version = "0.31.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/df/6eb1d485a513776bbdbb1c919b72e59b5acc51c5e7ef28ad1cd444e252a3/httplib2-0.31.1.tar.gz", hash = "sha256:21591655ac54953624c6ab8d587c71675e379e31e2cfe3147c83c11e9ef41f92", size = 250746, upload-time = "2026-01-13T12:14:14.365Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload_time = "2026-01-23T11:04:44.165Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/d8/1b05076441c2f01e4b64f59e5255edc2f0384a711b6d618845c023dc269b/httplib2-0.31.1-py3-none-any.whl", hash = "sha256:d520d22fa7e50c746a7ed856bac298c4300105d01bc2d8c2580a9b57fb9ed617", size = 91101, upload-time = "2026-01-13T12:14:12.676Z" }, + { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload_time = "2026-01-23T11:04:42.78Z" }, ] [[package]] @@ -1311,23 +1313,23 @@ dependencies = [ { 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, upload_time = "2024-12-06T15:37:23.222Z" } 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, upload_time = "2024-12-06T15:37:21.509Z" }, ] [[package]] name = "httpx-sse" version = "0.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload_time = "2025-10-10T21:48:22.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload_time = "2025-10-10T21:48:21.158Z" }, ] [[package]] name = "huggingface-hub" -version = "1.3.2" +version = "1.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -1341,18 +1343,18 @@ dependencies = [ { name = "typer-slim" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/d6/02d1c505e1d3364230e5fa16d2b58c8f36a39c5efe8e99bc4d03d06fd0ca/huggingface_hub-1.3.2.tar.gz", hash = "sha256:15d7902e154f04174a0816d1e9594adcf15cdad57596920a5dc70fadb5d896c7", size = 624018, upload-time = "2026-01-14T13:57:39.635Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload_time = "2026-02-06T09:20:03.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/1d/acd3ef8aabb7813c6ef2f91785d855583ac5cd7c3599e5c1a1a2ed1ec2e5/huggingface_hub-1.3.2-py3-none-any.whl", hash = "sha256:b552b9562a5532102a041fa31a6966bb9de95138fc7aa578bb3703198c25d1b6", size = 534504, upload-time = "2026-01-14T13:57:37.555Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload_time = "2026-02-06T09:20:00.728Z" }, ] [[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" } +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" } 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" }, + { 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]] @@ -1362,9 +1364,9 @@ 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" } +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/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" }, ] [[package]] @@ -1374,60 +1376,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +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" }, + { 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/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" }, +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload_time = "2026-02-02T12:37:56.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload_time = "2026-02-02T12:36:16.748Z" }, + { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload_time = "2026-02-02T12:36:18.351Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload_time = "2026-02-02T12:36:19.746Z" }, + { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload_time = "2026-02-02T12:36:21.243Z" }, + { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload_time = "2026-02-02T12:36:22.688Z" }, + { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload_time = "2026-02-02T12:36:24.106Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload_time = "2026-02-02T12:36:25.519Z" }, + { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload_time = "2026-02-02T12:36:26.866Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload_time = "2026-02-02T12:36:28.217Z" }, + { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload_time = "2026-02-02T12:36:29.678Z" }, + { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload_time = "2026-02-02T12:36:31.808Z" }, + { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload_time = "2026-02-02T12:36:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload_time = "2026-02-02T12:36:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload_time = "2026-02-02T12:36:36.579Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload_time = "2026-02-02T12:36:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload_time = "2026-02-02T12:36:39.417Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload_time = "2026-02-02T12:36:40.791Z" }, + { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload_time = "2026-02-02T12:36:42.077Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f5/f1997e987211f6f9bd71b8083047b316208b4aca0b529bb5f8c96c89ef3e/jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0", size = 308804, upload_time = "2026-02-02T12:36:43.496Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8f/5482a7677731fd44881f0204981ce2d7175db271f82cba2085dd2212e095/jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91", size = 318787, upload_time = "2026-02-02T12:36:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b9/7257ac59778f1cd025b26a23c5520a36a424f7f1b068f2442a5b499b7464/jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09", size = 353880, upload_time = "2026-02-02T12:36:47.365Z" }, + { url = "https://files.pythonhosted.org/packages/c3/87/719eec4a3f0841dad99e3d3604ee4cba36af4419a76f3cb0b8e2e691ad67/jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607", size = 366702, upload_time = "2026-02-02T12:36:48.871Z" }, + { url = "https://files.pythonhosted.org/packages/d2/65/415f0a75cf6921e43365a1bc227c565cb949caca8b7532776e430cbaa530/jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66", size = 486319, upload_time = "2026-02-02T12:36:53.006Z" }, + { url = "https://files.pythonhosted.org/packages/54/a2/9e12b48e82c6bbc6081fd81abf915e1443add1b13d8fc586e1d90bb02bb8/jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2", size = 372289, upload_time = "2026-02-02T12:36:54.593Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/e4693f107a1789a239c759a432e9afc592366f04e901470c2af89cfd28e1/jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad", size = 360165, upload_time = "2026-02-02T12:36:56.112Z" }, + { url = "https://files.pythonhosted.org/packages/17/08/91b9ea976c1c758240614bd88442681a87672eebc3d9a6dde476874e706b/jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d", size = 389634, upload_time = "2026-02-02T12:36:57.495Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/58325ef99390d6d40427ed6005bf1ad54f2577866594bcf13ce55675f87d/jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df", size = 514933, upload_time = "2026-02-02T12:36:58.909Z" }, + { url = "https://files.pythonhosted.org/packages/5b/25/69f1120c7c395fd276c3996bb8adefa9c6b84c12bb7111e5c6ccdcd8526d/jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d", size = 548842, upload_time = "2026-02-02T12:37:00.433Z" }, + { url = "https://files.pythonhosted.org/packages/18/05/981c9669d86850c5fbb0d9e62bba144787f9fba84546ba43d624ee27ef29/jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6", size = 202108, upload_time = "2026-02-02T12:37:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/8d/96/cdcf54dd0b0341db7d25413229888a346c7130bd20820530905fdb65727b/jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f", size = 204027, upload_time = "2026-02-02T12:37:03.075Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f9/724bcaaab7a3cd727031fe4f6995cb86c4bd344909177c186699c8dec51a/jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d", size = 187199, upload_time = "2026-02-02T12:37:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/62/92/1661d8b9fd6a3d7a2d89831db26fe3c1509a287d83ad7838831c7b7a5c7e/jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0", size = 318423, upload_time = "2026-02-02T12:37:05.806Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/f77d342a54d4ebcd128e520fc58ec2f5b30a423b0fd26acdfc0c6fef8e26/jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40", size = 351438, upload_time = "2026-02-02T12:37:07.189Z" }, + { url = "https://files.pythonhosted.org/packages/76/b3/ba9a69f0e4209bd3331470c723c2f5509e6f0482e416b612431a5061ed71/jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202", size = 364774, upload_time = "2026-02-02T12:37:08.579Z" }, + { url = "https://files.pythonhosted.org/packages/b3/16/6cdb31fa342932602458dbb631bfbd47f601e03d2e4950740e0b2100b570/jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0", size = 487238, upload_time = "2026-02-02T12:37:10.066Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b1/956cc7abaca8d95c13aa8d6c9b3f3797241c246cd6e792934cc4c8b250d2/jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95", size = 372892, upload_time = "2026-02-02T12:37:11.656Z" }, + { url = "https://files.pythonhosted.org/packages/26/c4/97ecde8b1e74f67b8598c57c6fccf6df86ea7861ed29da84629cdbba76c4/jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59", size = 360309, upload_time = "2026-02-02T12:37:13.244Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d7/eabe3cf46715854ccc80be2cd78dd4c36aedeb30751dbf85a1d08c14373c/jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe", size = 389607, upload_time = "2026-02-02T12:37:14.881Z" }, + { url = "https://files.pythonhosted.org/packages/df/2d/03963fc0804e6109b82decfb9974eb92df3797fe7222428cae12f8ccaa0c/jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939", size = 514986, upload_time = "2026-02-02T12:37:16.326Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/8c83b45eb3eb1c1e18d841fe30b4b5bc5619d781267ca9bc03e005d8fd0a/jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9", size = 548756, upload_time = "2026-02-02T12:37:17.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/66/eea81dfff765ed66c68fd2ed8c96245109e13c896c2a5015c7839c92367e/jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6", size = 201196, upload_time = "2026-02-02T12:37:19.101Z" }, + { url = "https://files.pythonhosted.org/packages/ff/32/4ac9c7a76402f8f00d00842a7f6b83b284d0cf7c1e9d4227bc95aa6d17fa/jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8", size = 204215, upload_time = "2026-02-02T12:37:20.495Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8e/7def204fea9f9be8b3c21a6f2dd6c020cf56c7d5ff753e0e23ed7f9ea57e/jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024", size = 187152, upload_time = "2026-02-02T12:37:22.124Z" }, ] [[package]] @@ -1440,9 +1442,9 @@ dependencies = [ { 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/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload_time = "2026-01-07T13:41:07.246Z" } 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" }, + { 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]] @@ -1452,20 +1454,19 @@ 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" } +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" }, + { 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.1" +version = "1.81.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, { name = "fastuuid" }, - { name = "grpcio" }, { name = "httpx" }, { name = "importlib-metadata" }, { name = "jinja2" }, @@ -1476,9 +1477,9 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/2b/299d54f95e02e9ed551c186e881a4ac0eaa5a948a6be93ecaa26a748f1be/litellm-1.81.1.tar.gz", hash = "sha256:9c758db8abff04a2f1f43582d042080e36f245fe34cfbafe2f8b7ca8f1de29b6", size = 13487469, upload-time = "2026-01-21T12:55:58.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/1d/e8f95dd1fc0eed36f2698ca82d8a0693d5388c6f2f1718f3f5ed472daaf4/litellm-1.81.8.tar.gz", hash = "sha256:5cc6547697748b8ca38d17d755662871da125df6e378cc987eaf2208a15626fb", size = 14066801, upload_time = "2026-02-05T05:56:03.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/73/8d100c4e48935f6a381df60f894ca9c063ea412ce354fbe7a17770ad4092/litellm-1.81.1-py3-none-any.whl", hash = "sha256:503512a8a7f3cddf9d8fed6182c14f1e77c5655635fe67b09efb09c75234bb87", size = 11795146, upload-time = "2026-01-21T12:55:55.613Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5a/6f391c2f251553dae98b6edca31c070d7e2291cef6153ae69e0688159093/litellm-1.81.8-py3-none-any.whl", hash = "sha256:78cca92f36bc6c267c191d1fe1e2630c812bff6daec32c58cade75748c2692f6", size = 12286316, upload_time = "2026-02-05T05:56:00.248Z" }, ] [[package]] @@ -1488,66 +1489,66 @@ 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" } +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/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload_time = "2025-04-10T12:50:53.297Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "mcp" -version = "1.25.0" +version = "1.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1565,159 +1566,159 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/2d/649d80a0ecf6a1f82632ca44bec21c0461a9d9fc8934d38cb5b319f2db5e/mcp-1.25.0.tar.gz", hash = "sha256:56310361ebf0364e2d438e5b45f7668cbb124e158bb358333cd06e49e83a6802", size = 605387, upload-time = "2025-12-19T10:19:56.985Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload_time = "2026-01-24T19:40:32.468Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/fc/6dc7659c2ae5ddf280477011f4213a74f806862856b796ef08f028e664bf/mcp-1.25.0-py3-none-any.whl", hash = "sha256:b37c38144a666add0862614cc79ec276e97d72aa8ca26d622818d4e278b9721a", size = 233076, upload-time = "2025-12-19T10:19:55.416Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload_time = "2026-01-24T19:40:30.652Z" }, ] [[package]] name = "mmh3" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/af/f28c2c2f51f31abb4725f9a64bc7863d5f491f6539bd26aee2a1d21a649e/mmh3-5.2.0.tar.gz", hash = "sha256:1efc8fec8478e9243a78bb993422cf79f8ff85cb4cf6b79647480a31e0d950a8", size = 33582, upload-time = "2025-07-29T07:43:48.49Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/fa/27f6ab93995ef6ad9f940e96593c5dd24744d61a7389532b0fec03745607/mmh3-5.2.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:e79c00eba78f7258e5b354eccd4d7907d60317ced924ea4a5f2e9d83f5453065", size = 40874, upload-time = "2025-07-29T07:42:30.662Z" }, - { url = "https://files.pythonhosted.org/packages/11/9c/03d13bcb6a03438bc8cac3d2e50f80908d159b31a4367c2e1a7a077ded32/mmh3-5.2.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:956127e663d05edbeec54df38885d943dfa27406594c411139690485128525de", size = 42012, upload-time = "2025-07-29T07:42:31.539Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/0865d9765408a7d504f1789944e678f74e0888b96a766d578cb80b040999/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:c3dca4cb5b946ee91b3d6bb700d137b1cd85c20827f89fdf9c16258253489044", size = 39197, upload-time = "2025-07-29T07:42:32.374Z" }, - { url = "https://files.pythonhosted.org/packages/3e/12/76c3207bd186f98b908b6706c2317abb73756d23a4e68ea2bc94825b9015/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e651e17bfde5840e9e4174b01e9e080ce49277b70d424308b36a7969d0d1af73", size = 39840, upload-time = "2025-07-29T07:42:33.227Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0d/574b6cce5555c9f2b31ea189ad44986755eb14e8862db28c8b834b8b64dc/mmh3-5.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:9f64bf06f4bf623325fda3a6d02d36cd69199b9ace99b04bb2d7fd9f89688504", size = 40644, upload-time = "2025-07-29T07:42:34.099Z" }, - { url = "https://files.pythonhosted.org/packages/52/82/3731f8640b79c46707f53ed72034a58baad400be908c87b0088f1f89f986/mmh3-5.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ddc63328889bcaee77b743309e5c7d2d52cee0d7d577837c91b6e7cc9e755e0b", size = 56153, upload-time = "2025-07-29T07:42:35.031Z" }, - { url = "https://files.pythonhosted.org/packages/4f/34/e02dca1d4727fd9fdeaff9e2ad6983e1552804ce1d92cc796e5b052159bb/mmh3-5.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb0fdc451fb6d86d81ab8f23d881b8d6e37fc373a2deae1c02d27002d2ad7a05", size = 40684, upload-time = "2025-07-29T07:42:35.914Z" }, - { url = "https://files.pythonhosted.org/packages/8f/36/3dee40767356e104967e6ed6d102ba47b0b1ce2a89432239b95a94de1b89/mmh3-5.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b29044e1ffdb84fe164d0a7ea05c7316afea93c00f8ed9449cf357c36fc4f814", size = 40057, upload-time = "2025-07-29T07:42:36.755Z" }, - { url = "https://files.pythonhosted.org/packages/31/58/228c402fccf76eb39a0a01b8fc470fecf21965584e66453b477050ee0e99/mmh3-5.2.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:58981d6ea9646dbbf9e59a30890cbf9f610df0e4a57dbfe09215116fd90b0093", size = 97344, upload-time = "2025-07-29T07:42:37.675Z" }, - { url = "https://files.pythonhosted.org/packages/34/82/fc5ce89006389a6426ef28e326fc065b0fbaaed230373b62d14c889f47ea/mmh3-5.2.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e5634565367b6d98dc4aa2983703526ef556b3688ba3065edb4b9b90ede1c54", size = 103325, upload-time = "2025-07-29T07:42:38.591Z" }, - { url = "https://files.pythonhosted.org/packages/09/8c/261e85777c6aee1ebd53f2f17e210e7481d5b0846cd0b4a5c45f1e3761b8/mmh3-5.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0271ac12415afd3171ab9a3c7cbfc71dee2c68760a7dc9d05bf8ed6ddfa3a7a", size = 106240, upload-time = "2025-07-29T07:42:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/70/73/2f76b3ad8a3d431824e9934403df36c0ddacc7831acf82114bce3c4309c8/mmh3-5.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:45b590e31bc552c6f8e2150ff1ad0c28dd151e9f87589e7eaf508fbdd8e8e908", size = 113060, upload-time = "2025-07-29T07:42:40.585Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b9/7ea61a34e90e50a79a9d87aa1c0b8139a7eaf4125782b34b7d7383472633/mmh3-5.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bdde97310d59604f2a9119322f61b31546748499a21b44f6715e8ced9308a6c5", size = 120781, upload-time = "2025-07-29T07:42:41.618Z" }, - { url = "https://files.pythonhosted.org/packages/0f/5b/ae1a717db98c7894a37aeedbd94b3f99e6472a836488f36b6849d003485b/mmh3-5.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc9c5f280438cf1c1a8f9abb87dc8ce9630a964120cfb5dd50d1e7ce79690c7a", size = 99174, upload-time = "2025-07-29T07:42:42.587Z" }, - { url = "https://files.pythonhosted.org/packages/e3/de/000cce1d799fceebb6d4487ae29175dd8e81b48e314cba7b4da90bcf55d7/mmh3-5.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c903e71fd8debb35ad2a4184c1316b3cb22f64ce517b4e6747f25b0a34e41266", size = 98734, upload-time = "2025-07-29T07:42:43.996Z" }, - { url = "https://files.pythonhosted.org/packages/79/19/0dc364391a792b72fbb22becfdeacc5add85cc043cd16986e82152141883/mmh3-5.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:eed4bba7ff8a0d37106ba931ab03bdd3915fbb025bcf4e1f0aa02bc8114960c5", size = 106493, upload-time = "2025-07-29T07:42:45.07Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b1/bc8c28e4d6e807bbb051fefe78e1156d7f104b89948742ad310612ce240d/mmh3-5.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1fdb36b940e9261aff0b5177c5b74a36936b902f473180f6c15bde26143681a9", size = 110089, upload-time = "2025-07-29T07:42:46.122Z" }, - { url = "https://files.pythonhosted.org/packages/3b/a2/d20f3f5c95e9c511806686c70d0a15479cc3941c5f322061697af1c1ff70/mmh3-5.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7303aab41e97adcf010a09efd8f1403e719e59b7705d5e3cfed3dd7571589290", size = 97571, upload-time = "2025-07-29T07:42:47.18Z" }, - { url = "https://files.pythonhosted.org/packages/7b/23/665296fce4f33488deec39a750ffd245cfc07aafb0e3ef37835f91775d14/mmh3-5.2.0-cp313-cp313-win32.whl", hash = "sha256:03e08c6ebaf666ec1e3d6ea657a2d363bb01effd1a9acfe41f9197decaef0051", size = 40806, upload-time = "2025-07-29T07:42:48.166Z" }, - { url = "https://files.pythonhosted.org/packages/59/b0/92e7103f3b20646e255b699e2d0327ce53a3f250e44367a99dc8be0b7c7a/mmh3-5.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:7fddccd4113e7b736706e17a239a696332360cbaddf25ae75b57ba1acce65081", size = 41600, upload-time = "2025-07-29T07:42:49.371Z" }, - { url = "https://files.pythonhosted.org/packages/99/22/0b2bd679a84574647de538c5b07ccaa435dbccc37815067fe15b90fe8dad/mmh3-5.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa0c966ee727aad5406d516375593c5f058c766b21236ab8985693934bb5085b", size = 39349, upload-time = "2025-07-29T07:42:50.268Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ca/a20db059a8a47048aaf550da14a145b56e9c7386fb8280d3ce2962dcebf7/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e5015f0bb6eb50008bed2d4b1ce0f2a294698a926111e4bb202c0987b4f89078", size = 39209, upload-time = "2025-07-29T07:42:51.559Z" }, - { url = "https://files.pythonhosted.org/packages/98/dd/e5094799d55c7482d814b979a0fd608027d0af1b274bfb4c3ea3e950bfd5/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0f3ed828d709f5b82d8bfe14f8856120718ec4bd44a5b26102c3030a1e12501", size = 39843, upload-time = "2025-07-29T07:42:52.536Z" }, - { url = "https://files.pythonhosted.org/packages/f4/6b/7844d7f832c85400e7cc89a1348e4e1fdd38c5a38415bb5726bbb8fcdb6c/mmh3-5.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:f35727c5118aba95f0397e18a1a5b8405425581bfe53e821f0fb444cbdc2bc9b", size = 40648, upload-time = "2025-07-29T07:42:53.392Z" }, - { url = "https://files.pythonhosted.org/packages/1f/bf/71f791f48a21ff3190ba5225807cbe4f7223360e96862c376e6e3fb7efa7/mmh3-5.2.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bc244802ccab5220008cb712ca1508cb6a12f0eb64ad62997156410579a1770", size = 56164, upload-time = "2025-07-29T07:42:54.267Z" }, - { url = "https://files.pythonhosted.org/packages/70/1f/f87e3d34d83032b4f3f0f528c6d95a98290fcacf019da61343a49dccfd51/mmh3-5.2.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110", size = 40692, upload-time = "2025-07-29T07:42:55.234Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e2/db849eaed07117086f3452feca8c839d30d38b830ac59fe1ce65af8be5ad/mmh3-5.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:37a358cc881fe796e099c1db6ce07ff757f088827b4e8467ac52b7a7ffdca647", size = 40068, upload-time = "2025-07-29T07:42:56.158Z" }, - { url = "https://files.pythonhosted.org/packages/df/6b/209af927207af77425b044e32f77f49105a0b05d82ff88af6971d8da4e19/mmh3-5.2.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b9a87025121d1c448f24f27ff53a5fe7b6ef980574b4a4f11acaabe702420d63", size = 97367, upload-time = "2025-07-29T07:42:57.037Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e0/78adf4104c425606a9ce33fb351f790c76a6c2314969c4a517d1ffc92196/mmh3-5.2.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ba55d6ca32eeef8b2625e1e4bfc3b3db52bc63014bd7e5df8cc11bf2b036b12", size = 103306, upload-time = "2025-07-29T07:42:58.522Z" }, - { url = "https://files.pythonhosted.org/packages/a3/79/c2b89f91b962658b890104745b1b6c9ce38d50a889f000b469b91eeb1b9e/mmh3-5.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9ff37ba9f15637e424c2ab57a1a590c52897c845b768e4e0a4958084ec87f22", size = 106312, upload-time = "2025-07-29T07:42:59.552Z" }, - { url = "https://files.pythonhosted.org/packages/4b/14/659d4095528b1a209be90934778c5ffe312177d51e365ddcbca2cac2ec7c/mmh3-5.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a094319ec0db52a04af9fdc391b4d39a1bc72bc8424b47c4411afb05413a44b5", size = 113135, upload-time = "2025-07-29T07:43:00.745Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6f/cd7734a779389a8a467b5c89a48ff476d6f2576e78216a37551a97e9e42a/mmh3-5.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5584061fd3da584659b13587f26c6cad25a096246a481636d64375d0c1f6c07", size = 120775, upload-time = "2025-07-29T07:43:02.124Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ca/8256e3b96944408940de3f9291d7e38a283b5761fe9614d4808fcf27bd62/mmh3-5.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecbfc0437ddfdced5e7822d1ce4855c9c64f46819d0fdc4482c53f56c707b935", size = 99178, upload-time = "2025-07-29T07:43:03.182Z" }, - { url = "https://files.pythonhosted.org/packages/8a/32/39e2b3cf06b6e2eb042c984dab8680841ac2a0d3ca6e0bea30db1f27b565/mmh3-5.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7b986d506a8e8ea345791897ba5d8ba0d9d8820cd4fc3e52dbe6de19388de2e7", size = 98738, upload-time = "2025-07-29T07:43:04.207Z" }, - { url = "https://files.pythonhosted.org/packages/61/d3/7bbc8e0e8cf65ebbe1b893ffa0467b7ecd1bd07c3bbf6c9db4308ada22ec/mmh3-5.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:38d899a156549da8ef6a9f1d6f7ef231228d29f8f69bce2ee12f5fba6d6fd7c5", size = 106510, upload-time = "2025-07-29T07:43:05.656Z" }, - { url = "https://files.pythonhosted.org/packages/10/99/b97e53724b52374e2f3859046f0eb2425192da356cb19784d64bc17bb1cf/mmh3-5.2.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d86651fa45799530885ba4dab3d21144486ed15285e8784181a0ab37a4552384", size = 110053, upload-time = "2025-07-29T07:43:07.204Z" }, - { url = "https://files.pythonhosted.org/packages/ac/62/3688c7d975ed195155671df68788c83fed6f7909b6ec4951724c6860cb97/mmh3-5.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c463d7c1c4cfc9d751efeaadd936bbba07b5b0ed81a012b3a9f5a12f0872bd6e", size = 97546, upload-time = "2025-07-29T07:43:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/ca/3b/c6153250f03f71a8b7634cded82939546cdfba02e32f124ff51d52c6f991/mmh3-5.2.0-cp314-cp314-win32.whl", hash = "sha256:bb4fe46bdc6104fbc28db7a6bacb115ee6368ff993366bbd8a2a7f0076e6f0c0", size = 41422, upload-time = "2025-07-29T07:43:09.216Z" }, - { url = "https://files.pythonhosted.org/packages/74/01/a27d98bab083a435c4c07e9d1d720d4c8a578bf4c270bae373760b1022be/mmh3-5.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c7f0b342fd06044bedd0b6e72177ddc0076f54fd89ee239447f8b271d919d9b", size = 42135, upload-time = "2025-07-29T07:43:10.183Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c9/dbba5507e95429b8b380e2ba091eff5c20a70a59560934dff0ad8392b8c8/mmh3-5.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:3193752fc05ea72366c2b63ff24b9a190f422e32d75fdeae71087c08fff26115", size = 39879, upload-time = "2025-07-29T07:43:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d1/c8c0ef839c17258b9de41b84f663574fabcf8ac2007b7416575e0f65ff6e/mmh3-5.2.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:69fc339d7202bea69ef9bd7c39bfdf9fdabc8e6822a01eba62fb43233c1b3932", size = 57696, upload-time = "2025-07-29T07:43:11.989Z" }, - { url = "https://files.pythonhosted.org/packages/2f/55/95e2b9ff201e89f9fe37036037ab61a6c941942b25cdb7b6a9df9b931993/mmh3-5.2.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:12da42c0a55c9d86ab566395324213c319c73ecb0c239fad4726324212b9441c", size = 41421, upload-time = "2025-07-29T07:43:13.269Z" }, - { url = "https://files.pythonhosted.org/packages/77/79/9be23ad0b7001a4b22752e7693be232428ecc0a35068a4ff5c2f14ef8b20/mmh3-5.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f7f9034c7cf05ddfaac8d7a2e63a3c97a840d4615d0a0e65ba8bdf6f8576e3be", size = 40853, upload-time = "2025-07-29T07:43:14.888Z" }, - { url = "https://files.pythonhosted.org/packages/ac/1b/96b32058eda1c1dee8264900c37c359a7325c1f11f5ff14fd2be8e24eff9/mmh3-5.2.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11730eeb16dfcf9674fdea9bb6b8e6dd9b40813b7eb839bc35113649eef38aeb", size = 109694, upload-time = "2025-07-29T07:43:15.816Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6f/a2ae44cd7dad697b6dea48390cbc977b1e5ca58fda09628cbcb2275af064/mmh3-5.2.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:932a6eec1d2e2c3c9e630d10f7128d80e70e2d47fe6b8c7ea5e1afbd98733e65", size = 117438, upload-time = "2025-07-29T07:43:16.865Z" }, - { url = "https://files.pythonhosted.org/packages/a0/08/bfb75451c83f05224a28afeaf3950c7b793c0b71440d571f8e819cfb149a/mmh3-5.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca975c51c5028947bbcfc24966517aac06a01d6c921e30f7c5383c195f87991", size = 120409, upload-time = "2025-07-29T07:43:18.207Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ea/8b118b69b2ff8df568f742387d1a159bc654a0f78741b31437dd047ea28e/mmh3-5.2.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b0b58215befe0f0e120b828f7645e97719bbba9f23b69e268ed0ac7adde8645", size = 125909, upload-time = "2025-07-29T07:43:19.39Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/168cc0b6a30650032e351a3b89b8a47382da541993a03af91e1ba2501234/mmh3-5.2.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29c2b9ce61886809d0492a274a5a53047742dea0f703f9c4d5d223c3ea6377d3", size = 135331, upload-time = "2025-07-29T07:43:20.435Z" }, - { url = "https://files.pythonhosted.org/packages/31/05/e3a9849b1c18a7934c64e831492c99e67daebe84a8c2f2c39a7096a830e3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a367d4741ac0103f8198c82f429bccb9359f543ca542b06a51f4f0332e8de279", size = 110085, upload-time = "2025-07-29T07:43:21.92Z" }, - { url = "https://files.pythonhosted.org/packages/d9/d5/a96bcc306e3404601418b2a9a370baec92af84204528ba659fdfe34c242f/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5a5dba98e514fb26241868f6eb90a7f7ca0e039aed779342965ce24ea32ba513", size = 111195, upload-time = "2025-07-29T07:43:23.066Z" }, - { url = "https://files.pythonhosted.org/packages/af/29/0fd49801fec5bff37198684e0849b58e0dab3a2a68382a357cfffb0fafc3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:941603bfd75a46023807511c1ac2f1b0f39cccc393c15039969806063b27e6db", size = 116919, upload-time = "2025-07-29T07:43:24.178Z" }, - { url = "https://files.pythonhosted.org/packages/2d/04/4f3c32b0a2ed762edca45d8b46568fc3668e34f00fb1e0a3b5451ec1281c/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:132dd943451a7c7546978863d2f5a64977928410782e1a87d583cb60eb89e667", size = 123160, upload-time = "2025-07-29T07:43:25.26Z" }, - { url = "https://files.pythonhosted.org/packages/91/76/3d29eaa38821730633d6a240d36fa8ad2807e9dfd432c12e1a472ed211eb/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f698733a8a494466432d611a8f0d1e026f5286dee051beea4b3c3146817e35d5", size = 110206, upload-time = "2025-07-29T07:43:26.699Z" }, - { url = "https://files.pythonhosted.org/packages/44/1c/ccf35892684d3a408202e296e56843743e0b4fb1629e59432ea88cdb3909/mmh3-5.2.0-cp314-cp314t-win32.whl", hash = "sha256:6d541038b3fc360ec538fc116de87462627944765a6750308118f8b509a8eec7", size = 41970, upload-time = "2025-07-29T07:43:27.666Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/b9e4f1e5adb5e21eb104588fcee2cd1eaa8308255173481427d5ecc4284e/mmh3-5.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e912b19cf2378f2967d0c08e86ff4c6c360129887f678e27e4dde970d21b3f4d", size = 43063, upload-time = "2025-07-29T07:43:28.582Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fc/0e61d9a4e29c8679356795a40e48f647b4aad58d71bfc969f0f8f56fb912/mmh3-5.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:e7884931fe5e788163e7b3c511614130c2c59feffdc21112290a194487efb2e9", size = 40455, upload-time = "2025-07-29T07:43:29.563Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a7/af/f28c2c2f51f31abb4725f9a64bc7863d5f491f6539bd26aee2a1d21a649e/mmh3-5.2.0.tar.gz", hash = "sha256:1efc8fec8478e9243a78bb993422cf79f8ff85cb4cf6b79647480a31e0d950a8", size = 33582, upload_time = "2025-07-29T07:43:48.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/fa/27f6ab93995ef6ad9f940e96593c5dd24744d61a7389532b0fec03745607/mmh3-5.2.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:e79c00eba78f7258e5b354eccd4d7907d60317ced924ea4a5f2e9d83f5453065", size = 40874, upload_time = "2025-07-29T07:42:30.662Z" }, + { url = "https://files.pythonhosted.org/packages/11/9c/03d13bcb6a03438bc8cac3d2e50f80908d159b31a4367c2e1a7a077ded32/mmh3-5.2.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:956127e663d05edbeec54df38885d943dfa27406594c411139690485128525de", size = 42012, upload_time = "2025-07-29T07:42:31.539Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/0865d9765408a7d504f1789944e678f74e0888b96a766d578cb80b040999/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:c3dca4cb5b946ee91b3d6bb700d137b1cd85c20827f89fdf9c16258253489044", size = 39197, upload_time = "2025-07-29T07:42:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/3e/12/76c3207bd186f98b908b6706c2317abb73756d23a4e68ea2bc94825b9015/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e651e17bfde5840e9e4174b01e9e080ce49277b70d424308b36a7969d0d1af73", size = 39840, upload_time = "2025-07-29T07:42:33.227Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0d/574b6cce5555c9f2b31ea189ad44986755eb14e8862db28c8b834b8b64dc/mmh3-5.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:9f64bf06f4bf623325fda3a6d02d36cd69199b9ace99b04bb2d7fd9f89688504", size = 40644, upload_time = "2025-07-29T07:42:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/52/82/3731f8640b79c46707f53ed72034a58baad400be908c87b0088f1f89f986/mmh3-5.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ddc63328889bcaee77b743309e5c7d2d52cee0d7d577837c91b6e7cc9e755e0b", size = 56153, upload_time = "2025-07-29T07:42:35.031Z" }, + { url = "https://files.pythonhosted.org/packages/4f/34/e02dca1d4727fd9fdeaff9e2ad6983e1552804ce1d92cc796e5b052159bb/mmh3-5.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb0fdc451fb6d86d81ab8f23d881b8d6e37fc373a2deae1c02d27002d2ad7a05", size = 40684, upload_time = "2025-07-29T07:42:35.914Z" }, + { url = "https://files.pythonhosted.org/packages/8f/36/3dee40767356e104967e6ed6d102ba47b0b1ce2a89432239b95a94de1b89/mmh3-5.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b29044e1ffdb84fe164d0a7ea05c7316afea93c00f8ed9449cf357c36fc4f814", size = 40057, upload_time = "2025-07-29T07:42:36.755Z" }, + { url = "https://files.pythonhosted.org/packages/31/58/228c402fccf76eb39a0a01b8fc470fecf21965584e66453b477050ee0e99/mmh3-5.2.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:58981d6ea9646dbbf9e59a30890cbf9f610df0e4a57dbfe09215116fd90b0093", size = 97344, upload_time = "2025-07-29T07:42:37.675Z" }, + { url = "https://files.pythonhosted.org/packages/34/82/fc5ce89006389a6426ef28e326fc065b0fbaaed230373b62d14c889f47ea/mmh3-5.2.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e5634565367b6d98dc4aa2983703526ef556b3688ba3065edb4b9b90ede1c54", size = 103325, upload_time = "2025-07-29T07:42:38.591Z" }, + { url = "https://files.pythonhosted.org/packages/09/8c/261e85777c6aee1ebd53f2f17e210e7481d5b0846cd0b4a5c45f1e3761b8/mmh3-5.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0271ac12415afd3171ab9a3c7cbfc71dee2c68760a7dc9d05bf8ed6ddfa3a7a", size = 106240, upload_time = "2025-07-29T07:42:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/70/73/2f76b3ad8a3d431824e9934403df36c0ddacc7831acf82114bce3c4309c8/mmh3-5.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:45b590e31bc552c6f8e2150ff1ad0c28dd151e9f87589e7eaf508fbdd8e8e908", size = 113060, upload_time = "2025-07-29T07:42:40.585Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/7ea61a34e90e50a79a9d87aa1c0b8139a7eaf4125782b34b7d7383472633/mmh3-5.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bdde97310d59604f2a9119322f61b31546748499a21b44f6715e8ced9308a6c5", size = 120781, upload_time = "2025-07-29T07:42:41.618Z" }, + { url = "https://files.pythonhosted.org/packages/0f/5b/ae1a717db98c7894a37aeedbd94b3f99e6472a836488f36b6849d003485b/mmh3-5.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc9c5f280438cf1c1a8f9abb87dc8ce9630a964120cfb5dd50d1e7ce79690c7a", size = 99174, upload_time = "2025-07-29T07:42:42.587Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/000cce1d799fceebb6d4487ae29175dd8e81b48e314cba7b4da90bcf55d7/mmh3-5.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c903e71fd8debb35ad2a4184c1316b3cb22f64ce517b4e6747f25b0a34e41266", size = 98734, upload_time = "2025-07-29T07:42:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/79/19/0dc364391a792b72fbb22becfdeacc5add85cc043cd16986e82152141883/mmh3-5.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:eed4bba7ff8a0d37106ba931ab03bdd3915fbb025bcf4e1f0aa02bc8114960c5", size = 106493, upload_time = "2025-07-29T07:42:45.07Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b1/bc8c28e4d6e807bbb051fefe78e1156d7f104b89948742ad310612ce240d/mmh3-5.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1fdb36b940e9261aff0b5177c5b74a36936b902f473180f6c15bde26143681a9", size = 110089, upload_time = "2025-07-29T07:42:46.122Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a2/d20f3f5c95e9c511806686c70d0a15479cc3941c5f322061697af1c1ff70/mmh3-5.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7303aab41e97adcf010a09efd8f1403e719e59b7705d5e3cfed3dd7571589290", size = 97571, upload_time = "2025-07-29T07:42:47.18Z" }, + { url = "https://files.pythonhosted.org/packages/7b/23/665296fce4f33488deec39a750ffd245cfc07aafb0e3ef37835f91775d14/mmh3-5.2.0-cp313-cp313-win32.whl", hash = "sha256:03e08c6ebaf666ec1e3d6ea657a2d363bb01effd1a9acfe41f9197decaef0051", size = 40806, upload_time = "2025-07-29T07:42:48.166Z" }, + { url = "https://files.pythonhosted.org/packages/59/b0/92e7103f3b20646e255b699e2d0327ce53a3f250e44367a99dc8be0b7c7a/mmh3-5.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:7fddccd4113e7b736706e17a239a696332360cbaddf25ae75b57ba1acce65081", size = 41600, upload_time = "2025-07-29T07:42:49.371Z" }, + { url = "https://files.pythonhosted.org/packages/99/22/0b2bd679a84574647de538c5b07ccaa435dbccc37815067fe15b90fe8dad/mmh3-5.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa0c966ee727aad5406d516375593c5f058c766b21236ab8985693934bb5085b", size = 39349, upload_time = "2025-07-29T07:42:50.268Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ca/a20db059a8a47048aaf550da14a145b56e9c7386fb8280d3ce2962dcebf7/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e5015f0bb6eb50008bed2d4b1ce0f2a294698a926111e4bb202c0987b4f89078", size = 39209, upload_time = "2025-07-29T07:42:51.559Z" }, + { url = "https://files.pythonhosted.org/packages/98/dd/e5094799d55c7482d814b979a0fd608027d0af1b274bfb4c3ea3e950bfd5/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0f3ed828d709f5b82d8bfe14f8856120718ec4bd44a5b26102c3030a1e12501", size = 39843, upload_time = "2025-07-29T07:42:52.536Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/7844d7f832c85400e7cc89a1348e4e1fdd38c5a38415bb5726bbb8fcdb6c/mmh3-5.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:f35727c5118aba95f0397e18a1a5b8405425581bfe53e821f0fb444cbdc2bc9b", size = 40648, upload_time = "2025-07-29T07:42:53.392Z" }, + { url = "https://files.pythonhosted.org/packages/1f/bf/71f791f48a21ff3190ba5225807cbe4f7223360e96862c376e6e3fb7efa7/mmh3-5.2.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bc244802ccab5220008cb712ca1508cb6a12f0eb64ad62997156410579a1770", size = 56164, upload_time = "2025-07-29T07:42:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/70/1f/f87e3d34d83032b4f3f0f528c6d95a98290fcacf019da61343a49dccfd51/mmh3-5.2.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110", size = 40692, upload_time = "2025-07-29T07:42:55.234Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e2/db849eaed07117086f3452feca8c839d30d38b830ac59fe1ce65af8be5ad/mmh3-5.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:37a358cc881fe796e099c1db6ce07ff757f088827b4e8467ac52b7a7ffdca647", size = 40068, upload_time = "2025-07-29T07:42:56.158Z" }, + { url = "https://files.pythonhosted.org/packages/df/6b/209af927207af77425b044e32f77f49105a0b05d82ff88af6971d8da4e19/mmh3-5.2.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b9a87025121d1c448f24f27ff53a5fe7b6ef980574b4a4f11acaabe702420d63", size = 97367, upload_time = "2025-07-29T07:42:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e0/78adf4104c425606a9ce33fb351f790c76a6c2314969c4a517d1ffc92196/mmh3-5.2.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ba55d6ca32eeef8b2625e1e4bfc3b3db52bc63014bd7e5df8cc11bf2b036b12", size = 103306, upload_time = "2025-07-29T07:42:58.522Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/c2b89f91b962658b890104745b1b6c9ce38d50a889f000b469b91eeb1b9e/mmh3-5.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9ff37ba9f15637e424c2ab57a1a590c52897c845b768e4e0a4958084ec87f22", size = 106312, upload_time = "2025-07-29T07:42:59.552Z" }, + { url = "https://files.pythonhosted.org/packages/4b/14/659d4095528b1a209be90934778c5ffe312177d51e365ddcbca2cac2ec7c/mmh3-5.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a094319ec0db52a04af9fdc391b4d39a1bc72bc8424b47c4411afb05413a44b5", size = 113135, upload_time = "2025-07-29T07:43:00.745Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6f/cd7734a779389a8a467b5c89a48ff476d6f2576e78216a37551a97e9e42a/mmh3-5.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5584061fd3da584659b13587f26c6cad25a096246a481636d64375d0c1f6c07", size = 120775, upload_time = "2025-07-29T07:43:02.124Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ca/8256e3b96944408940de3f9291d7e38a283b5761fe9614d4808fcf27bd62/mmh3-5.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecbfc0437ddfdced5e7822d1ce4855c9c64f46819d0fdc4482c53f56c707b935", size = 99178, upload_time = "2025-07-29T07:43:03.182Z" }, + { url = "https://files.pythonhosted.org/packages/8a/32/39e2b3cf06b6e2eb042c984dab8680841ac2a0d3ca6e0bea30db1f27b565/mmh3-5.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7b986d506a8e8ea345791897ba5d8ba0d9d8820cd4fc3e52dbe6de19388de2e7", size = 98738, upload_time = "2025-07-29T07:43:04.207Z" }, + { url = "https://files.pythonhosted.org/packages/61/d3/7bbc8e0e8cf65ebbe1b893ffa0467b7ecd1bd07c3bbf6c9db4308ada22ec/mmh3-5.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:38d899a156549da8ef6a9f1d6f7ef231228d29f8f69bce2ee12f5fba6d6fd7c5", size = 106510, upload_time = "2025-07-29T07:43:05.656Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/b97e53724b52374e2f3859046f0eb2425192da356cb19784d64bc17bb1cf/mmh3-5.2.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d86651fa45799530885ba4dab3d21144486ed15285e8784181a0ab37a4552384", size = 110053, upload_time = "2025-07-29T07:43:07.204Z" }, + { url = "https://files.pythonhosted.org/packages/ac/62/3688c7d975ed195155671df68788c83fed6f7909b6ec4951724c6860cb97/mmh3-5.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c463d7c1c4cfc9d751efeaadd936bbba07b5b0ed81a012b3a9f5a12f0872bd6e", size = 97546, upload_time = "2025-07-29T07:43:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ca/3b/c6153250f03f71a8b7634cded82939546cdfba02e32f124ff51d52c6f991/mmh3-5.2.0-cp314-cp314-win32.whl", hash = "sha256:bb4fe46bdc6104fbc28db7a6bacb115ee6368ff993366bbd8a2a7f0076e6f0c0", size = 41422, upload_time = "2025-07-29T07:43:09.216Z" }, + { url = "https://files.pythonhosted.org/packages/74/01/a27d98bab083a435c4c07e9d1d720d4c8a578bf4c270bae373760b1022be/mmh3-5.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c7f0b342fd06044bedd0b6e72177ddc0076f54fd89ee239447f8b271d919d9b", size = 42135, upload_time = "2025-07-29T07:43:10.183Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c9/dbba5507e95429b8b380e2ba091eff5c20a70a59560934dff0ad8392b8c8/mmh3-5.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:3193752fc05ea72366c2b63ff24b9a190f422e32d75fdeae71087c08fff26115", size = 39879, upload_time = "2025-07-29T07:43:11.106Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d1/c8c0ef839c17258b9de41b84f663574fabcf8ac2007b7416575e0f65ff6e/mmh3-5.2.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:69fc339d7202bea69ef9bd7c39bfdf9fdabc8e6822a01eba62fb43233c1b3932", size = 57696, upload_time = "2025-07-29T07:43:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/2f/55/95e2b9ff201e89f9fe37036037ab61a6c941942b25cdb7b6a9df9b931993/mmh3-5.2.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:12da42c0a55c9d86ab566395324213c319c73ecb0c239fad4726324212b9441c", size = 41421, upload_time = "2025-07-29T07:43:13.269Z" }, + { url = "https://files.pythonhosted.org/packages/77/79/9be23ad0b7001a4b22752e7693be232428ecc0a35068a4ff5c2f14ef8b20/mmh3-5.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f7f9034c7cf05ddfaac8d7a2e63a3c97a840d4615d0a0e65ba8bdf6f8576e3be", size = 40853, upload_time = "2025-07-29T07:43:14.888Z" }, + { url = "https://files.pythonhosted.org/packages/ac/1b/96b32058eda1c1dee8264900c37c359a7325c1f11f5ff14fd2be8e24eff9/mmh3-5.2.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11730eeb16dfcf9674fdea9bb6b8e6dd9b40813b7eb839bc35113649eef38aeb", size = 109694, upload_time = "2025-07-29T07:43:15.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6f/a2ae44cd7dad697b6dea48390cbc977b1e5ca58fda09628cbcb2275af064/mmh3-5.2.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:932a6eec1d2e2c3c9e630d10f7128d80e70e2d47fe6b8c7ea5e1afbd98733e65", size = 117438, upload_time = "2025-07-29T07:43:16.865Z" }, + { url = "https://files.pythonhosted.org/packages/a0/08/bfb75451c83f05224a28afeaf3950c7b793c0b71440d571f8e819cfb149a/mmh3-5.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca975c51c5028947bbcfc24966517aac06a01d6c921e30f7c5383c195f87991", size = 120409, upload_time = "2025-07-29T07:43:18.207Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ea/8b118b69b2ff8df568f742387d1a159bc654a0f78741b31437dd047ea28e/mmh3-5.2.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b0b58215befe0f0e120b828f7645e97719bbba9f23b69e268ed0ac7adde8645", size = 125909, upload_time = "2025-07-29T07:43:19.39Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/168cc0b6a30650032e351a3b89b8a47382da541993a03af91e1ba2501234/mmh3-5.2.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29c2b9ce61886809d0492a274a5a53047742dea0f703f9c4d5d223c3ea6377d3", size = 135331, upload_time = "2025-07-29T07:43:20.435Z" }, + { url = "https://files.pythonhosted.org/packages/31/05/e3a9849b1c18a7934c64e831492c99e67daebe84a8c2f2c39a7096a830e3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a367d4741ac0103f8198c82f429bccb9359f543ca542b06a51f4f0332e8de279", size = 110085, upload_time = "2025-07-29T07:43:21.92Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d5/a96bcc306e3404601418b2a9a370baec92af84204528ba659fdfe34c242f/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5a5dba98e514fb26241868f6eb90a7f7ca0e039aed779342965ce24ea32ba513", size = 111195, upload_time = "2025-07-29T07:43:23.066Z" }, + { url = "https://files.pythonhosted.org/packages/af/29/0fd49801fec5bff37198684e0849b58e0dab3a2a68382a357cfffb0fafc3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:941603bfd75a46023807511c1ac2f1b0f39cccc393c15039969806063b27e6db", size = 116919, upload_time = "2025-07-29T07:43:24.178Z" }, + { url = "https://files.pythonhosted.org/packages/2d/04/4f3c32b0a2ed762edca45d8b46568fc3668e34f00fb1e0a3b5451ec1281c/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:132dd943451a7c7546978863d2f5a64977928410782e1a87d583cb60eb89e667", size = 123160, upload_time = "2025-07-29T07:43:25.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/76/3d29eaa38821730633d6a240d36fa8ad2807e9dfd432c12e1a472ed211eb/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f698733a8a494466432d611a8f0d1e026f5286dee051beea4b3c3146817e35d5", size = 110206, upload_time = "2025-07-29T07:43:26.699Z" }, + { url = "https://files.pythonhosted.org/packages/44/1c/ccf35892684d3a408202e296e56843743e0b4fb1629e59432ea88cdb3909/mmh3-5.2.0-cp314-cp314t-win32.whl", hash = "sha256:6d541038b3fc360ec538fc116de87462627944765a6750308118f8b509a8eec7", size = 41970, upload_time = "2025-07-29T07:43:27.666Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/b9e4f1e5adb5e21eb104588fcee2cd1eaa8308255173481427d5ecc4284e/mmh3-5.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e912b19cf2378f2967d0c08e86ff4c6c360129887f678e27e4dde970d21b3f4d", size = 43063, upload_time = "2025-07-29T07:43:28.582Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fc/0e61d9a4e29c8679356795a40e48f647b4aad58d71bfc969f0f8f56fb912/mmh3-5.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:e7884931fe5e788163e7b3c511614130c2c59feffdc21112290a194487efb2e9", size = 40455, upload_time = "2025-07-29T07:43:29.563Z" }, ] [[package]] name = "multidict" -version = "6.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, - { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, - { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, - { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, - { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, - { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, - { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, - { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, - { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, - { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, - { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, - { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, - { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, - { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, - { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, - { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, - { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, - { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, - { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, - { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, - { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, - { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, - { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, - { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, - { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, - { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, - { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, - { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, - { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, - { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, - { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, - { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, - { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, - { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, - { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, - { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, - { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, - { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, - { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, - { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, - { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, - { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, - { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, - { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, - { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, - { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, - { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, - { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, - { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, - { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, - { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, - { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, - { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, - { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, - { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, - { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, - { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, - { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, - { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, - { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +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/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" }, ] [[package]] name = "openai" -version = "2.15.0" +version = "2.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1729,9 +1730,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/f4/4690ecb5d70023ce6bfcfeabfe717020f654bde59a775058ec6ac4692463/openai-2.15.0.tar.gz", hash = "sha256:42eb8cbb407d84770633f31bf727d4ffb4138711c670565a41663d9439174fba", size = 627383, upload-time = "2026-01-09T22:10:08.603Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/a2/677f22c4b487effb8a09439fb6134034b5f0a39ca27df8b95fac23a93720/openai-2.17.0.tar.gz", hash = "sha256:47224b74bd20f30c6b0a6a329505243cb2f26d5cf84d9f8d0825ff8b35e9c999", size = 631445, upload_time = "2026-02-05T16:27:40.953Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl", hash = "sha256:6ae23b932cd7230f7244e52954daa6602716d6b9bf235401a107af731baea6c3", size = 1067879, upload-time = "2026-01-09T22:10:06.446Z" }, + { url = "https://files.pythonhosted.org/packages/44/97/284535aa75e6e84ab388248b5a323fc296b1f70530130dee37f7f4fbe856/openai-2.17.0-py3-none-any.whl", hash = "sha256:4f393fd886ca35e113aac7ff239bcd578b81d8f104f5aedc7d3693eb2af1d338", size = 1069524, upload_time = "2026-02-05T16:27:38.941Z" }, ] [[package]] @@ -1742,9 +1743,9 @@ dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/04/05040d7ce33a907a2a02257e601992f0cdf11c73b33f13c4492bf6c3d6d5/opentelemetry_api-1.37.0.tar.gz", hash = "sha256:540735b120355bd5112738ea53621f8d5edb35ebcd6fe21ada3ab1c61d1cd9a7", size = 64923, upload-time = "2025-09-11T10:29:01.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/04/05040d7ce33a907a2a02257e601992f0cdf11c73b33f13c4492bf6c3d6d5/opentelemetry_api-1.37.0.tar.gz", hash = "sha256:540735b120355bd5112738ea53621f8d5edb35ebcd6fe21ada3ab1c61d1cd9a7", size = 64923, upload_time = "2025-09-11T10:29:01.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/48/28ed9e55dcf2f453128df738210a980e09f4e468a456fa3c763dbc8be70a/opentelemetry_api-1.37.0-py3-none-any.whl", hash = "sha256:accf2024d3e89faec14302213bc39550ec0f4095d1cf5ca688e1bfb1c8612f47", size = 65732, upload-time = "2025-09-11T10:28:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/91/48/28ed9e55dcf2f453128df738210a980e09f4e468a456fa3c763dbc8be70a/opentelemetry_api-1.37.0-py3-none-any.whl", hash = "sha256:accf2024d3e89faec14302213bc39550ec0f4095d1cf5ca688e1bfb1c8612f47", size = 65732, upload_time = "2025-09-11T10:28:41.826Z" }, ] [[package]] @@ -1757,9 +1758,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/2d/6aa7063b009768d8f9415b36a29ae9b3eb1e2c5eff70f58ca15e104c245f/opentelemetry_exporter_gcp_logging-1.11.0a0.tar.gz", hash = "sha256:58496f11b930c84570060ffbd4343cd0b597ea13c7bc5c879df01163dd552f14", size = 22400, upload-time = "2025-11-04T19:32:13.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/2d/6aa7063b009768d8f9415b36a29ae9b3eb1e2c5eff70f58ca15e104c245f/opentelemetry_exporter_gcp_logging-1.11.0a0.tar.gz", hash = "sha256:58496f11b930c84570060ffbd4343cd0b597ea13c7bc5c879df01163dd552f14", size = 22400, upload_time = "2025-11-04T19:32:13.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/b7/2d3df53fa39bfd52f88c78a60367d45a7b1adbf8a756cce62d6ac149d49a/opentelemetry_exporter_gcp_logging-1.11.0a0-py3-none-any.whl", hash = "sha256:f8357c552947cb9c0101c4575a7702b8d3268e28bdeefdd1405cf838e128c6ef", size = 14168, upload-time = "2025-11-04T19:32:07.073Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b7/2d3df53fa39bfd52f88c78a60367d45a7b1adbf8a756cce62d6ac149d49a/opentelemetry_exporter_gcp_logging-1.11.0a0-py3-none-any.whl", hash = "sha256:f8357c552947cb9c0101c4575a7702b8d3268e28bdeefdd1405cf838e128c6ef", size = 14168, upload_time = "2025-11-04T19:32:07.073Z" }, ] [[package]] @@ -1772,9 +1773,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/48/d1c7d2380bb1754d1eb6a011a2e0de08c6868cb6c0f34bcda0444fa0d614/opentelemetry_exporter_gcp_monitoring-1.11.0a0.tar.gz", hash = "sha256:386276eddbbd978a6f30fafd3397975beeb02a1302bdad554185242a8e2c343c", size = 20828, upload-time = "2025-11-04T19:32:14.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/48/d1c7d2380bb1754d1eb6a011a2e0de08c6868cb6c0f34bcda0444fa0d614/opentelemetry_exporter_gcp_monitoring-1.11.0a0.tar.gz", hash = "sha256:386276eddbbd978a6f30fafd3397975beeb02a1302bdad554185242a8e2c343c", size = 20828, upload_time = "2025-11-04T19:32:14.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/8c/03a6e73e270a9c890dbd6cc1c47c83d86b8a8a974a9168d92e043c6277cc/opentelemetry_exporter_gcp_monitoring-1.11.0a0-py3-none-any.whl", hash = "sha256:b6740cba61b2f9555274829fe87a58447b64d0378f1067a4faebb4f5b364ca22", size = 13611, upload-time = "2025-11-04T19:32:08.212Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8c/03a6e73e270a9c890dbd6cc1c47c83d86b8a8a974a9168d92e043c6277cc/opentelemetry_exporter_gcp_monitoring-1.11.0a0-py3-none-any.whl", hash = "sha256:b6740cba61b2f9555274829fe87a58447b64d0378f1067a4faebb4f5b364ca22", size = 13611, upload_time = "2025-11-04T19:32:08.212Z" }, ] [[package]] @@ -1787,9 +1788,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/9c/4c3b26e5494f8b53c7873732a2317df905abe2b8ab33e9edfcbd5a8ff79b/opentelemetry_exporter_gcp_trace-1.11.0.tar.gz", hash = "sha256:c947ab4ab53e16517ade23d6fe71fe88cf7ca3f57a42c9f0e4162d2b929fecb6", size = 18770, upload-time = "2025-11-04T19:32:15.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/9c/4c3b26e5494f8b53c7873732a2317df905abe2b8ab33e9edfcbd5a8ff79b/opentelemetry_exporter_gcp_trace-1.11.0.tar.gz", hash = "sha256:c947ab4ab53e16517ade23d6fe71fe88cf7ca3f57a42c9f0e4162d2b929fecb6", size = 18770, upload_time = "2025-11-04T19:32:15.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/4a/876703e8c5845198d95cd4006c8d1b2e3b129a9e288558e33133360f8d5d/opentelemetry_exporter_gcp_trace-1.11.0-py3-none-any.whl", hash = "sha256:b3dcb314e1a9985e9185cb7720b693eb393886fde98ae4c095ffc0893de6cefa", size = 14016, upload-time = "2025-11-04T19:32:09.009Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/876703e8c5845198d95cd4006c8d1b2e3b129a9e288558e33133360f8d5d/opentelemetry_exporter_gcp_trace-1.11.0-py3-none-any.whl", hash = "sha256:b3dcb314e1a9985e9185cb7720b693eb393886fde98ae4c095ffc0893de6cefa", size = 14016, upload_time = "2025-11-04T19:32:09.009Z" }, ] [[package]] @@ -1799,9 +1800,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/6c/10018cbcc1e6fff23aac67d7fd977c3d692dbe5f9ef9bb4db5c1268726cc/opentelemetry_exporter_otlp_proto_common-1.37.0.tar.gz", hash = "sha256:c87a1bdd9f41fdc408d9cc9367bb53f8d2602829659f2b90be9f9d79d0bfe62c", size = 20430, upload-time = "2025-09-11T10:29:03.605Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/6c/10018cbcc1e6fff23aac67d7fd977c3d692dbe5f9ef9bb4db5c1268726cc/opentelemetry_exporter_otlp_proto_common-1.37.0.tar.gz", hash = "sha256:c87a1bdd9f41fdc408d9cc9367bb53f8d2602829659f2b90be9f9d79d0bfe62c", size = 20430, upload_time = "2025-09-11T10:29:03.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/13/b4ef09837409a777f3c0af2a5b4ba9b7af34872bc43609dda0c209e4060d/opentelemetry_exporter_otlp_proto_common-1.37.0-py3-none-any.whl", hash = "sha256:53038428449c559b0c564b8d718df3314da387109c4d36bd1b94c9a641b0292e", size = 18359, upload-time = "2025-09-11T10:28:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/08/13/b4ef09837409a777f3c0af2a5b4ba9b7af34872bc43609dda0c209e4060d/opentelemetry_exporter_otlp_proto_common-1.37.0-py3-none-any.whl", hash = "sha256:53038428449c559b0c564b8d718df3314da387109c4d36bd1b94c9a641b0292e", size = 18359, upload_time = "2025-09-11T10:28:44.939Z" }, ] [[package]] @@ -1817,9 +1818,9 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/e3/6e320aeb24f951449e73867e53c55542bebbaf24faeee7623ef677d66736/opentelemetry_exporter_otlp_proto_http-1.37.0.tar.gz", hash = "sha256:e52e8600f1720d6de298419a802108a8f5afa63c96809ff83becb03f874e44ac", size = 17281, upload-time = "2025-09-11T10:29:04.844Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/e3/6e320aeb24f951449e73867e53c55542bebbaf24faeee7623ef677d66736/opentelemetry_exporter_otlp_proto_http-1.37.0.tar.gz", hash = "sha256:e52e8600f1720d6de298419a802108a8f5afa63c96809ff83becb03f874e44ac", size = 17281, upload_time = "2025-09-11T10:29:04.844Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload-time = "2025-09-11T10:28:46.726Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload_time = "2025-09-11T10:28:46.726Z" }, ] [[package]] @@ -1829,9 +1830,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/ea/a75f36b463a36f3c5a10c0b5292c58b31dbdde74f6f905d3d0ab2313987b/opentelemetry_proto-1.37.0.tar.gz", hash = "sha256:30f5c494faf66f77faeaefa35ed4443c5edb3b0aa46dad073ed7210e1a789538", size = 46151, upload-time = "2025-09-11T10:29:11.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/ea/a75f36b463a36f3c5a10c0b5292c58b31dbdde74f6f905d3d0ab2313987b/opentelemetry_proto-1.37.0.tar.gz", hash = "sha256:30f5c494faf66f77faeaefa35ed4443c5edb3b0aa46dad073ed7210e1a789538", size = 46151, upload_time = "2025-09-11T10:29:11.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/25/f89ea66c59bd7687e218361826c969443c4fa15dfe89733f3bf1e2a9e971/opentelemetry_proto-1.37.0-py3-none-any.whl", hash = "sha256:8ed8c066ae8828bbf0c39229979bdf583a126981142378a9cbe9d6fd5701c6e2", size = 72534, upload-time = "2025-09-11T10:28:56.831Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/f89ea66c59bd7687e218361826c969443c4fa15dfe89733f3bf1e2a9e971/opentelemetry_proto-1.37.0-py3-none-any.whl", hash = "sha256:8ed8c066ae8828bbf0c39229979bdf583a126981142378a9cbe9d6fd5701c6e2", size = 72534, upload_time = "2025-09-11T10:28:56.831Z" }, ] [[package]] @@ -1844,9 +1845,9 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/5d/2b3240d914b87b6dd9cd5ca2ef1ccaf1d0626b897d4c06877e22c8c10fcf/opentelemetry_resourcedetector_gcp-1.11.0a0.tar.gz", hash = "sha256:915a1d6fd15daca9eedd3fc52b0f705375054f2ef140e2e7a6b4cca95a47cdb1", size = 18796, upload-time = "2025-11-04T19:32:16.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/5d/2b3240d914b87b6dd9cd5ca2ef1ccaf1d0626b897d4c06877e22c8c10fcf/opentelemetry_resourcedetector_gcp-1.11.0a0.tar.gz", hash = "sha256:915a1d6fd15daca9eedd3fc52b0f705375054f2ef140e2e7a6b4cca95a47cdb1", size = 18796, upload_time = "2025-11-04T19:32:16.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6c/1e13fe142a7ca3dc6489167203a1209d32430cca12775e1df9c9a41c54b2/opentelemetry_resourcedetector_gcp-1.11.0a0-py3-none-any.whl", hash = "sha256:5d65a2a039b1d40c6f41421dbb08d5f441368275ac6de6e76a8fccd1f6acb67e", size = 18798, upload-time = "2025-11-04T19:32:10.915Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/1e13fe142a7ca3dc6489167203a1209d32430cca12775e1df9c9a41c54b2/opentelemetry_resourcedetector_gcp-1.11.0a0-py3-none-any.whl", hash = "sha256:5d65a2a039b1d40c6f41421dbb08d5f441368275ac6de6e76a8fccd1f6acb67e", size = 18798, upload_time = "2025-11-04T19:32:10.915Z" }, ] [[package]] @@ -1858,9 +1859,9 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/62/2e0ca80d7fe94f0b193135375da92c640d15fe81f636658d2acf373086bc/opentelemetry_sdk-1.37.0.tar.gz", hash = "sha256:cc8e089c10953ded765b5ab5669b198bbe0af1b3f89f1007d19acd32dc46dda5", size = 170404, upload-time = "2025-09-11T10:29:11.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/62/2e0ca80d7fe94f0b193135375da92c640d15fe81f636658d2acf373086bc/opentelemetry_sdk-1.37.0.tar.gz", hash = "sha256:cc8e089c10953ded765b5ab5669b198bbe0af1b3f89f1007d19acd32dc46dda5", size = 170404, upload_time = "2025-09-11T10:29:11.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/62/9f4ad6a54126fb00f7ed4bb5034964c6e4f00fcd5a905e115bd22707e20d/opentelemetry_sdk-1.37.0-py3-none-any.whl", hash = "sha256:8f3c3c22063e52475c5dbced7209495c2c16723d016d39287dfc215d1771257c", size = 131941, upload-time = "2025-09-11T10:28:57.83Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/9f4ad6a54126fb00f7ed4bb5034964c6e4f00fcd5a905e115bd22707e20d/opentelemetry_sdk-1.37.0-py3-none-any.whl", hash = "sha256:8f3c3c22063e52475c5dbced7209495c2c16723d016d39287dfc215d1771257c", size = 131941, upload_time = "2025-09-11T10:28:57.83Z" }, ] [[package]] @@ -1871,9 +1872,9 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/1b/90701d91e6300d9f2fb352153fb1721ed99ed1f6ea14fa992c756016e63a/opentelemetry_semantic_conventions-0.58b0.tar.gz", hash = "sha256:6bd46f51264279c433755767bb44ad00f1c9e2367e1b42af563372c5a6fa0c25", size = 129867, upload-time = "2025-09-11T10:29:12.597Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/1b/90701d91e6300d9f2fb352153fb1721ed99ed1f6ea14fa992c756016e63a/opentelemetry_semantic_conventions-0.58b0.tar.gz", hash = "sha256:6bd46f51264279c433755767bb44ad00f1c9e2367e1b42af563372c5a6fa0c25", size = 129867, upload_time = "2025-09-11T10:29:12.597Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload-time = "2025-09-11T10:28:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload_time = "2025-09-11T10:28:59.218Z" }, ] [[package]] @@ -1907,150 +1908,150 @@ requires-dist = [ 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" } +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" } 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, upload_time = "2026-01-21T20:50:37.788Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "proto-plus" -version = "1.27.0" +version = "1.27.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/89/9cbe2f4bba860e149108b683bc2efec21f14d5f7ed6e25562ad86acbc373/proto_plus-1.27.0.tar.gz", hash = "sha256:873af56dd0d7e91836aee871e5799e1c6f1bda86ac9a983e0bb9f0c266a568c4", size = 56158, upload-time = "2025-12-16T13:46:25.729Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/02/8832cde80e7380c600fbf55090b6ab7b62bd6825dbedde6d6657c15a1f8e/proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147", size = 56929, upload_time = "2026-02-02T17:34:49.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/24/3b7a0818484df9c28172857af32c2397b6d8fcd99d9468bd4684f98ebf0a/proto_plus-1.27.0-py3-none-any.whl", hash = "sha256:1baa7f81cf0f8acb8bc1f6d085008ba4171eaf669629d1b6d1673b21ed1c0a82", size = 50205, upload-time = "2025-12-16T13:46:24.76Z" }, + { url = "https://files.pythonhosted.org/packages/5d/79/ac273cbbf744691821a9cca88957257f41afe271637794975ca090b9588b/proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc", size = 50480, upload_time = "2026-02-02T17:34:47.339Z" }, ] [[package]] name = "protobuf" -version = "6.33.4" +version = "6.33.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/b8/cda15d9d46d03d4aa3a67cb6bffe05173440ccf86a9541afaf7ac59a1b6b/protobuf-6.33.4.tar.gz", hash = "sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91", size = 444346, upload-time = "2026-01-12T18:33:40.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload_time = "2026-01-29T21:51:33.494Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/be/24ef9f3095bacdf95b458543334d0c4908ccdaee5130420bf064492c325f/protobuf-6.33.4-cp310-abi3-win32.whl", hash = "sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d", size = 425612, upload-time = "2026-01-12T18:33:29.656Z" }, - { url = "https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl", hash = "sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc", size = 436962, upload-time = "2026-01-12T18:33:31.345Z" }, - { url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0", size = 427612, upload-time = "2026-01-12T18:33:32.646Z" }, - { url = "https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e", size = 324484, upload-time = "2026-01-12T18:33:33.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/1c/e53078d3f7fe710572ab2dcffd993e1e3b438ae71cfc031b71bae44fcb2d/protobuf-6.33.4-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6", size = 339256, upload-time = "2026-01-12T18:33:35.231Z" }, - { url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9", size = 323311, upload-time = "2026-01-12T18:33:36.305Z" }, - { url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl", hash = "sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc", size = 170532, upload-time = "2026-01-12T18:33:39.199Z" }, + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload_time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload_time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload_time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload_time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload_time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload_time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload_time = "2026-01-29T21:51:32.557Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "pyasn1" version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload_time = "2026-01-16T18:04:18.534Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, + { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload_time = "2026-01-16T18:04:17.174Z" }, ] [[package]] @@ -2060,18 +2061,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, ] [[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" } +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" } 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, upload_time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -2084,9 +2085,9 @@ dependencies = [ { 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, upload_time = "2025-11-26T15:11:46.471Z" } 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, upload_time = "2025-11-26T15:11:44.605Z" }, ] [[package]] @@ -2096,50 +2097,50 @@ source = { registry = "https://pypi.org/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/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" }, +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/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" }, ] [[package]] @@ -2151,18 +2152,18 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload_time = "2025-11-10T14:25:47.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload_time = "2025-11-10T14:25:45.546Z" }, ] [[package]] name = "pyjwt" -version = "2.10.1" +version = "2.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload_time = "2026-01-30T19:59:55.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload_time = "2026-01-30T19:59:54.539Z" }, ] [package.optional-dependencies] @@ -2174,9 +2175,9 @@ crypto = [ name = "pyparsing" version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload_time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload_time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -2186,27 +2187,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +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" }, + { 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/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload_time = "2025-10-26T15:12:10.434Z" } 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/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" }, ] [[package]] name = "python-multipart" -version = "0.0.21" +version = "0.0.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/78/96/804520d0850c7db98e5ccb70282e29208723f0964e88ffd9d0da2f52ea09/python_multipart-0.0.21.tar.gz", hash = "sha256:7137ebd4d3bbf70ea1622998f902b97a29434a9e8dc40eb203bbcf7c2a2cba92", size = 37196, upload-time = "2025-12-17T09:24:22.446Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/76/03af049af4dcee5d27442f71b6924f01f3efb5d2bd34f23fcd563f2cc5f5/python_multipart-0.0.21-py3-none-any.whl", hash = "sha256:cf7a6713e01c87aa35387f4774e812c4361150938d20d232800f75ffcf266090", size = 24541, upload-time = "2025-12-17T09:24:21.153Z" }, + { 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" }, ] [[package]] @@ -2214,48 +2215,48 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload_time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload_time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload_time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload_time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload_time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload_time = "2025-07-14T20:13:36.379Z" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -2266,81 +2267,81 @@ dependencies = [ { name = "attrs" }, { name = "rpds-py" }, ] -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" } +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" }, + { 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/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" }, +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/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" }, ] [[package]] @@ -2353,9 +2354,9 @@ dependencies = [ { 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, upload_time = "2025-08-18T20:46:02.573Z" } 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, upload_time = "2025-08-18T20:46:00.542Z" }, ] [[package]] @@ -2389,66 +2390,66 @@ requires-dist = [ 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/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" }, +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/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" }, ] [[package]] @@ -2458,36 +2459,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, ] [[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" } +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" } 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, upload_time = "2023-10-24T04:13:38.866Z" }, ] [[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" } +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" } 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" }, + { 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" } +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" }, + { 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]] @@ -2498,31 +2499,31 @@ 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/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" }, +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/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" }, ] [[package]] @@ -2534,18 +2535,18 @@ dependencies = [ { name = "google-cloud-spanner" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/29/21698bb83e542f32e3581886671f39d94b1f7e8b190c24a8bfa994e62fd6/sqlalchemy_spanner-1.17.2.tar.gz", hash = "sha256:56ce4da7168a27442d80ffd71c29ed639b5056d7e69b1e69bb9c1e10190b67c4", size = 82745, upload-time = "2025-12-15T23:30:08.622Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/29/21698bb83e542f32e3581886671f39d94b1f7e8b190c24a8bfa994e62fd6/sqlalchemy_spanner-1.17.2.tar.gz", hash = "sha256:56ce4da7168a27442d80ffd71c29ed639b5056d7e69b1e69bb9c1e10190b67c4", size = 82745, upload_time = "2025-12-15T23:30:08.622Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/87/05be45a086116cea32cfa00fa0059d31b5345360dba7902ee640a1db793b/sqlalchemy_spanner-1.17.2-py3-none-any.whl", hash = "sha256:18713d4d78e0bf048eda0f7a5c80733e08a7b678b34349496415f37652efb12f", size = 31917, upload-time = "2025-12-15T23:30:07.356Z" }, + { url = "https://files.pythonhosted.org/packages/7f/87/05be45a086116cea32cfa00fa0059d31b5345360dba7902ee640a1db793b/sqlalchemy_spanner-1.17.2-py3-none-any.whl", hash = "sha256:18713d4d78e0bf048eda0f7a5c80733e08a7b678b34349496415f37652efb12f", size = 31917, upload_time = "2025-12-15T23:30:07.356Z" }, ] [[package]] name = "sqlparse" version = "0.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload_time = "2025-12-19T07:17:45.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload_time = "2025-12-19T07:17:46.573Z" }, ] [[package]] @@ -2556,9 +2557,9 @@ dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/00d280c03ffd39aaee0e86ec81e2d3b9253036a0f93f51d10503adef0e65/sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422", size = 27253, upload-time = "2026-01-17T13:11:05.62Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/00d280c03ffd39aaee0e86ec81e2d3b9253036a0f93f51d10503adef0e65/sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422", size = 27253, upload_time = "2026-01-17T13:11:05.62Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7f/832f015020844a8b8f7a9cbc103dd76ba8e3875004c41e08440ea3a2b41a/sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf", size = 12763, upload-time = "2026-01-17T13:11:03.775Z" }, + { url = "https://files.pythonhosted.org/packages/96/7f/832f015020844a8b8f7a9cbc103dd76ba8e3875004c41e08440ea3a2b41a/sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf", size = 12763, upload_time = "2026-01-17T13:11:03.775Z" }, ] [[package]] @@ -2568,18 +2569,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -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, upload_time = "2025-11-01T15:25:27.516Z" } 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, upload_time = "2025-11-01T15:25:25.461Z" }, ] [[package]] name = "tenacity" -version = "9.1.2" +version = "9.1.3" 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/1e/4a/c3357c8742f361785e3702bb4c9c68c4cb37a80aa657640b820669be5af1/tenacity-9.1.3.tar.gz", hash = "sha256:a6724c947aa717087e2531f883bde5c9188f603f6669a9b8d54eb998e604c12a", size = 49002, upload_time = "2026-02-05T06:33:12.866Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/64/6b/cdc85edb15e384d8e934aad89638cc8646e118c80de94c60125d0fc0a185/tenacity-9.1.3-py3-none-any.whl", hash = "sha256:51171cfc6b8a7826551e2f029426b10a6af189c5ac6986adcd7eb36d42f17954", size = 28858, upload_time = "2026-02-05T06:33:11.219Z" }, ] [[package]] @@ -2590,36 +2591,36 @@ 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/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" }, +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/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" }, ] [[package]] @@ -2629,35 +2630,35 @@ source = { registry = "https://pypi.org/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" } +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/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" }, ] [[package]] name = "tqdm" -version = "4.67.1" +version = "4.67.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload_time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload_time = "2026-02-03T17:35:50.982Z" }, ] [[package]] @@ -2668,18 +2669,18 @@ 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, upload_time = "2026-01-06T11:21:11.176Z" } 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, upload_time = "2026-01-06T11:21:12.441Z" }, ] [[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" } +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" } 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, upload_time = "2025-08-25T13:49:24.86Z" }, ] [[package]] @@ -2689,18 +2690,18 @@ source = { registry = "https://pypi.org/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, upload_time = "2025-10-01T02:14:41.687Z" } 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, upload_time = "2025-10-01T02:14:40.154Z" }, ] [[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" } +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" } 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, upload_time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -2710,27 +2711,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload_time = "2025-03-05T21:17:41.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload_time = "2025-03-05T21:17:39.857Z" }, ] [[package]] name = "uritemplate" version = "4.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload_time = "2025-06-02T15:12:06.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload_time = "2025-06-02T15:12:03.405Z" }, ] [[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" } +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" } 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, upload_time = "2026-01-07T16:24:42.685Z" }, ] [[package]] @@ -2741,50 +2742,50 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -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, upload_time = "2025-12-21T14:16:22.45Z" } 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, upload_time = "2025-12-21T14:16:21.041Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, ] [[package]] @@ -2796,80 +2797,80 @@ dependencies = [ { 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/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" }, +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/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" } +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" }, + { 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" }, ] diff --git a/samples/client/lit/component_gallery/README.md b/samples/client/lit/component_gallery/README.md index 3c4a73d9f..f9886269f 100644 --- a/samples/client/lit/component_gallery/README.md +++ b/samples/client/lit/component_gallery/README.md @@ -1,30 +1,57 @@ -# A2UI Generator +# A2UI Component Gallery Client -This is a UI to generate and visualize A2UI responses. +This is the client-side application for the A2UI Component Gallery. It is a Lit-based web application that connects to the Component Gallery Agent to render the UI components defined by the server. -## Prerequisites +## Overview -1. [nodejs](https://nodejs.org/en) +The client uses the `@a2ui/lit` renderer to interpret the JSON-based UI descriptions sent by the agent and render them as standard Web Components. It demonstrates how to integrate the A2UI renderer into a modern web application build with Vite. -## Running +## Getting Started -This sample depends on the Lit renderer. Before running this sample, you need to build the renderer. +To fully run the sample, you need to start **both** the Agent (frontend logic) and the Client (web renderer). -1. **Build the renderer:** - ```bash - cd ../../../renderers/lit - npm install - npm run build - ``` +### Prerequisites -2. **Run this sample:** - ```bash - cd - # back to the sample directory - npm install - ``` +- Python 3.10+ & `uv` (for Agent) +- Node.js 18+ & `npm` (for Client) -3. **Run the servers:** - - Run the [A2A server](../../../agent/adk/component_gallery/) - - Run the dev server: `npm run dev` +### 1. Run the Agent (Backend) -After starting the dev server, you can open http://localhost:5173/ to view the sample. \ No newline at end of file +The agent serves the UI definitions and handles user interactions. + +1. Navigate to the agent directory: + ```bash + cd samples/agent/adk/component_gallery + ``` + +2. Install dependencies and start the server: + ```bash + uv run . + ``` + The agent will run on `http://localhost:10005`. + +### 2. Run the Client (Frontend) + +The client connects to the agent and renders the UI. + +1. Open a **new terminal** and navigate to the client directory: + ```bash + cd samples/client/lit/component_gallery + ``` + +2. Install dependencies: + ```bash + npm install + ``` + +3. Start the development server: + ```bash + npm run dev + ``` + Open your browser to the URL shown (usually `http://localhost:5173`). + +## Attribution + +This project uses media assets from the following sources: + +* **Video**: "Big Buck Bunny" (c) Copyright 2008, Blender Foundation / www.bigbuckbunny.org. Licensed under the Creative Commons Attribution 3.0 License. \ No newline at end of file diff --git a/samples/client/lit/component_gallery/client.ts b/samples/client/lit/component_gallery/client.ts index 0603dc992..9ee992654 100644 --- a/samples/client/lit/component_gallery/client.ts +++ b/samples/client/lit/component_gallery/client.ts @@ -15,7 +15,7 @@ */ import { v0_8 } from "@a2ui/lit"; -import { registerContactComponents } from "./ui/custom-components/register-components.js"; + type A2TextPayload = { kind: "text"; text: string; @@ -72,4 +72,4 @@ export class A2UIClient { throw new Error(error.error); } } -registerContactComponents(); + diff --git a/samples/client/lit/component_gallery/component-gallery.ts b/samples/client/lit/component_gallery/component-gallery.ts index 061e5fbc2..8a3cea64d 100644 --- a/samples/client/lit/component_gallery/component-gallery.ts +++ b/samples/client/lit/component_gallery/component-gallery.ts @@ -24,6 +24,8 @@ const DEMO_ITEMS: DemoItem[] = [ { id: "demo-slider", title: "Slider", description: "Select a value from a range.", actionButton: true }, { id: "demo-date", title: "DateTimeInput", description: "Pick a date or time.", actionButton: true }, { id: "demo-multichoice", title: "MultipleChoice", description: "Select valid options from a list.", actionButton: true }, + { id: "demo-multichoice-chips", title: "MultipleChoice (Chips)", description: "Select options using chips.", actionButton: true }, + { id: "demo-multichoice-filter", title: "MultipleChoice (Filterable)", description: "Search and filter options.", actionButton: true }, { id: "demo-image", title: "Image", description: "Displays an image from a URL." }, { id: "demo-button", title: "Button", description: "Triggers a client-side action." }, { id: "demo-tabs", title: "Tabs", description: "Switch between different views." }, @@ -261,7 +263,9 @@ export class A2UIComponentGallery extends SignalWatcher(LitElement) { "demo-checkbox": "galleryData/checkbox", "demo-slider": "galleryData/slider", "demo-date": "galleryData/date", - "demo-multichoice": "galleryData/favorites" + "demo-multichoice": "galleryData/favorites", + "demo-multichoice-chips": "galleryData/favoritesChips", + "demo-multichoice-filter": "galleryData/favoritesFilter" }; const path = pathMap[item.id]; diff --git a/samples/client/lit/shell/README.md b/samples/client/lit/shell/README.md index 80838baa8..36d69f0af 100644 --- a/samples/client/lit/shell/README.md +++ b/samples/client/lit/shell/README.md @@ -27,9 +27,23 @@ This sample depends on the Lit renderer. Before running this sample, you need to ``` 3. **Run the servers:** - - Run the [A2A server](../../../agent/adk/restaurant_finder/) + - Run the [Restaurant Finder Agent](../../../agent/adk/restaurant_finder/) (Default): `npm run demo:restaurant` - Run the dev server: `npm run dev` +### Running the Contact Sample + +The shell app supports multiple configured applications. To run the Contact sample: + +1. **Start the Contact Agent:** + ```bash + npm run demo:contact + ``` + +2. **Open the Contact App:** + - Open `http://localhost:5173/?app=contacts` + +> **Note:** The `?app=` query parameter only supports apps that are actively configured in `app.ts` (e.g., `restaurant`, `contacts`). You cannot run arbitrary agents by passing their URL as a query string without first adding them to the shell configuration. + After starting the dev server, you can open http://localhost:5173/ to view the sample. Important: The sample code provided is for demonstration purposes and illustrates the mechanics of A2UI and the Agent-to-Agent (A2A) protocol. When building production applications, it is critical to treat any agent operating outside of your direct control as a potentially untrusted entity. diff --git a/samples/client/lit/shell/package.json b/samples/client/lit/shell/package.json index 0264f5866..5a8b4d0da 100644 --- a/samples/client/lit/shell/package.json +++ b/samples/client/lit/shell/package.json @@ -12,7 +12,9 @@ "build:tsc": "wireit", "dev": "npm run serve --watch", "test": "wireit", - "serve": "wireit" + "serve": "wireit", + "demo:contact": "(cd ../../../agent/adk/contact_lookup && uv run .)", + "demo:restaurant": "(cd ../../../agent/adk/restaurant_finder && uv run .)" }, "wireit": { "serve": { diff --git a/specification/v0_8/README.md b/specification/v0_8/README.md index c6727a02e..d151a72cf 100644 --- a/specification/v0_8/README.md +++ b/specification/v0_8/README.md @@ -1,12 +1,12 @@ -# Specification v0.8.1 +# Specification v0.8.2 -This directory contains the specification for version 0.8.1 of A2UI, a previous version of the specification, and is no longer under active development. +This directory contains the specification for version 0.8.2 of A2UI, a previous version of the specification, and is no longer under active development. **This specification is closed.** Please do not propose changes here. If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/gspencergoog/A2UI) for the specification currently in development. -## v0.8.1 Documentation +## v0.8.2 Documentation - [Protocol](docs/a2ui_protocol.md) - [Extension Specification](docs/a2ui_extension_specification.md) diff --git a/specification/v0_8/json/standard_catalog_definition.json b/specification/v0_8/json/standard_catalog_definition.json index be2ee7867..5a662cf1d 100644 --- a/specification/v0_8/json/standard_catalog_definition.json +++ b/specification/v0_8/json/standard_catalog_definition.json @@ -586,6 +586,10 @@ "MultipleChoice": { "type": "object", "additionalProperties": false, + "required": [ + "selections", + "options" + ], "properties": { "selections": { "type": "object", @@ -634,9 +638,20 @@ "maxAllowedSelections": { "type": "integer", "description": "The maximum number of options that the user is allowed to select." - } - }, - "required": ["selections", "options"] + }, + "variant": { + "type": "string", + "description": "The display style of the component.", + "enum": [ + "checkbox", + "chips" + ] + }, + "filterable": { + "type": "boolean", + "description": "If true, displays a search input to filter the options." + }, + } }, "Slider": { "type": "object", diff --git a/specification/v0_9/json/standard_catalog.json b/specification/v0_9/json/standard_catalog.json index 74ec11060..06a05b982 100644 --- a/specification/v0_9/json/standard_catalog.json +++ b/specification/v0_9/json/standard_catalog.json @@ -524,6 +524,18 @@ "value": { "$ref": "common_types.json#/$defs/DynamicStringList", "description": "The list of currently selected values. This should be bound to a string array in the data model." + }, + "displayStyle": { + "type": "string", + "description": "The display style of the component.", + "enum": [ + "checkbox", + "chips" + ] + }, + "filterable": { + "type": "boolean", + "description": "If true, displays a search input to filter the options." } }, "required": ["component", "options", "value"] From 83a9aae4724280a51fb1e284aeb1e218ae6a11d1 Mon Sep 17 00:00:00 2001 From: dmandar <11888634+dmandar@users.noreply.github.com> Date: Fri, 6 Feb 2026 17:05:35 -0800 Subject: [PATCH 36/65] Add regex support for textfield on lit renderer (#605) * fix contact sample * Fix dropdown and make it multi-choice * Add a new component_gallery sample agent and client that allows debugging on-the-wire a2UI JSON and actions * Update samples/client/lit/component_gallery/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * fix modal * Create new 0.8.2 version of the spec to support filtering and types for dropdown * Add regex for textfield in lit. * Simplify diff by reverting unrelated changes to icon.ts and checkbox.ts * review fixes * fix review comments --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- renderers/lit/src/0.8/ui/multiple-choice.ts | 2 +- renderers/lit/src/0.8/ui/text-field.ts | 15 + .../agent/adk/component_gallery/__main__.py | 2 + .../adk/component_gallery/gallery_examples.py | 9 + .../client/lit/component_gallery/client.ts | 4 +- .../component_gallery/component-gallery.ts | 2 + .../lit/component_gallery/theme/theme.ts | 3 + .../client/lit/shell/theme/default-theme.ts | 1 + .../json/standard_catalog_definition.json | 134 +- specification/v0_9/json/standard_catalog.json | 1682 ++++++++++------- 10 files changed, 1189 insertions(+), 665 deletions(-) diff --git a/renderers/lit/src/0.8/ui/multiple-choice.ts b/renderers/lit/src/0.8/ui/multiple-choice.ts index 3358055a6..065d48f1d 100644 --- a/renderers/lit/src/0.8/ui/multiple-choice.ts +++ b/renderers/lit/src/0.8/ui/multiple-choice.ts @@ -240,7 +240,7 @@ export class MultipleChoice extends Root { } .chip.selected:hover { - background: var(--md-sys-color-secondary-container-high, #e8def8); + background: var(--md-sys-color-secondary-container-high); } .chip-icon { diff --git a/renderers/lit/src/0.8/ui/text-field.ts b/renderers/lit/src/0.8/ui/text-field.ts index b58d45d1a..08295e874 100644 --- a/renderers/lit/src/0.8/ui/text-field.ts +++ b/renderers/lit/src/0.8/ui/text-field.ts @@ -36,6 +36,9 @@ export class TextField extends Root { @property() accessor inputType: Types.ResolvedTextField["type"] | null = null; + @property() + accessor validationRegexp: string | null = null; + static styles = [ structuralStyles, css` @@ -52,6 +55,17 @@ export class TextField extends Root { display: block; width: 100%; } + + input:invalid { + border-color: var(--color-error); + color: var(--color-error); + outline-color: var(--color-error); + } + + input:invalid:focus { + border-color: var(--color-error); + outline-color: var(--color-error); + } label { display: block; @@ -107,6 +121,7 @@ export class TextField extends Root { id="data" .value=${value} .placeholder=${"Please enter a value"} + pattern=${this.validationRegexp || nothing} type=${this.inputType === "number" ? "number" : "text"} />

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

`; diff --git a/samples/agent/adk/component_gallery/__main__.py b/samples/agent/adk/component_gallery/__main__.py index 331c3deb2..347adbb6f 100644 --- a/samples/agent/adk/component_gallery/__main__.py +++ b/samples/agent/adk/component_gallery/__main__.py @@ -1,3 +1,4 @@ + """Main entry point for the Component Gallery agent.""" import logging import os @@ -14,6 +15,7 @@ from starlette.staticfiles import StaticFiles from dotenv import load_dotenv + from agent_executor import ComponentGalleryExecutor load_dotenv() diff --git a/samples/agent/adk/component_gallery/gallery_examples.py b/samples/agent/adk/component_gallery/gallery_examples.py index 59417c1d2..18630ea4f 100644 --- a/samples/agent/adk/component_gallery/gallery_examples.py +++ b/samples/agent/adk/component_gallery/gallery_examples.py @@ -56,6 +56,15 @@ def add_demo_surface(surface_id, component_def): } }) + # 1b. TextField (Regex) + add_demo_surface("demo-text-regex", { + "TextField": { + "label": { "literalString": "Enter exactly 5 digits" }, + "text": { "path": "galleryData/textFieldRegex" }, + "validationRegexp": "^\\d{5}$" + } + }) + # 2. CheckBox add_demo_surface("demo-checkbox", { "CheckBox": { diff --git a/samples/client/lit/component_gallery/client.ts b/samples/client/lit/component_gallery/client.ts index 9ee992654..0603dc992 100644 --- a/samples/client/lit/component_gallery/client.ts +++ b/samples/client/lit/component_gallery/client.ts @@ -15,7 +15,7 @@ */ import { v0_8 } from "@a2ui/lit"; - +import { registerContactComponents } from "./ui/custom-components/register-components.js"; type A2TextPayload = { kind: "text"; text: string; @@ -72,4 +72,4 @@ export class A2UIClient { throw new Error(error.error); } } - +registerContactComponents(); diff --git a/samples/client/lit/component_gallery/component-gallery.ts b/samples/client/lit/component_gallery/component-gallery.ts index 8a3cea64d..773643ff0 100644 --- a/samples/client/lit/component_gallery/component-gallery.ts +++ b/samples/client/lit/component_gallery/component-gallery.ts @@ -20,6 +20,7 @@ interface DemoItem { const DEMO_ITEMS: DemoItem[] = [ { id: "demo-text", title: "TextField", description: "Allows user to enter text. Supports binding to data model.", actionButton: true }, + { id: "demo-text-regex", title: "TextField (Regex)", description: "TextField with 5-digit regex validation.", actionButton: true }, { id: "demo-checkbox", title: "CheckBox", description: "A binary toggle.", actionButton: true }, { id: "demo-slider", title: "Slider", description: "Select a value from a range.", actionButton: true }, { id: "demo-date", title: "DateTimeInput", description: "Pick a date or time.", actionButton: true }, @@ -260,6 +261,7 @@ export class A2UIComponentGallery extends SignalWatcher(LitElement) { // Map item IDs to data paths based on knowledge of gallery_examples.py const pathMap: Record = { "demo-text": "galleryData/textField", + "demo-text-regex": "galleryData/textFieldRegex", "demo-checkbox": "galleryData/checkbox", "demo-slider": "galleryData/slider", "demo-date": "galleryData/date", diff --git a/samples/client/lit/component_gallery/theme/theme.ts b/samples/client/lit/component_gallery/theme/theme.ts index 82cce9bfd..034299719 100644 --- a/samples/client/lit/component_gallery/theme/theme.ts +++ b/samples/client/lit/component_gallery/theme/theme.ts @@ -217,6 +217,9 @@ export const theme: v0_8.Types.Theme = { display: "flex", flexDirection: "column", }, + MultipleChoice: { + "--md-sys-color-secondary-container-high": "#e8def8", + }, }, components: { AudioPlayer: {}, diff --git a/samples/client/lit/shell/theme/default-theme.ts b/samples/client/lit/shell/theme/default-theme.ts index 34996dffc..581338c4d 100644 --- a/samples/client/lit/shell/theme/default-theme.ts +++ b/samples/client/lit/shell/theme/default-theme.ts @@ -205,6 +205,7 @@ export const theme: v0_8.Types.Theme = { }, TextField: { "--p-0": "light-dark(var(--n-0), #1e293b)", + "--color-error": "#B3261E", }, }, components: { diff --git a/specification/v0_8/json/standard_catalog_definition.json b/specification/v0_8/json/standard_catalog_definition.json index 5a662cf1d..fa6fc228f 100644 --- a/specification/v0_8/json/standard_catalog_definition.json +++ b/specification/v0_8/json/standard_catalog_definition.json @@ -31,7 +31,9 @@ ] } }, - "required": ["text"] + "required": [ + "text" + ] }, "Image": { "type": "object", @@ -74,7 +76,9 @@ ] } }, - "required": ["url"] + "required": [ + "url" + ] }, "Icon": { "type": "object", @@ -144,7 +148,9 @@ } } }, - "required": ["name"] + "required": [ + "name" + ] }, "Video": { "type": "object", @@ -164,7 +170,9 @@ } } }, - "required": ["url"] + "required": [ + "url" + ] }, "AudioPlayer": { "type": "object", @@ -197,7 +205,9 @@ } } }, - "required": ["url"] + "required": [ + "url" + ] }, "Row": { "type": "object", @@ -226,7 +236,10 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, @@ -245,10 +258,17 @@ "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "Column": { "type": "object", @@ -277,7 +297,10 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, @@ -296,10 +319,17 @@ "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] + "enum": [ + "center", + "end", + "start", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "List": { "type": "object", @@ -328,22 +358,35 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, "direction": { "type": "string", "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] + "enum": [ + "vertical", + "horizontal" + ] }, "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "Card": { "type": "object", @@ -354,7 +397,9 @@ "description": "The ID of the component to be rendered inside the card." } }, - "required": ["child"] + "required": [ + "child" + ] }, "Tabs": { "type": "object", @@ -384,11 +429,16 @@ "type": "string" } }, - "required": ["title", "child"] + "required": [ + "title", + "child" + ] } } }, - "required": ["tabItems"] + "required": [ + "tabItems" + ] }, "Divider": { "type": "object", @@ -397,7 +447,10 @@ "axis": { "type": "string", "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"] + "enum": [ + "horizontal", + "vertical" + ] } } }, @@ -414,7 +467,10 @@ "description": "The ID of the component to be displayed inside the modal." } }, - "required": ["entryPointChild", "contentChild"] + "required": [ + "entryPointChild", + "contentChild" + ] }, "Button": { "type": "object", @@ -465,14 +521,22 @@ } } }, - "required": ["key", "value"] + "required": [ + "key", + "value" + ] } } }, - "required": ["name"] + "required": [ + "name" + ] } }, - "required": ["child", "action"] + "required": [ + "child", + "action" + ] }, "CheckBox": { "type": "object", @@ -505,7 +569,10 @@ } } }, - "required": ["label", "value"] + "required": [ + "label", + "value" + ] }, "TextField": { "type": "object", @@ -553,7 +620,9 @@ "description": "A regular expression used for client-side validation of the input." } }, - "required": ["label"] + "required": [ + "label" + ] }, "DateTimeInput": { "type": "object", @@ -581,7 +650,9 @@ "description": "If true, allows the user to select a time." } }, - "required": ["value"] + "required": [ + "value" + ] }, "MultipleChoice": { "type": "object", @@ -632,7 +703,10 @@ "description": "The value to be associated with this option when selected." } }, - "required": ["label", "value"] + "required": [ + "label", + "value" + ] } }, "maxAllowedSelections": { @@ -650,7 +724,7 @@ "filterable": { "type": "boolean", "description": "If true, displays a search input to filter the options." - }, + } } }, "Slider": { @@ -679,7 +753,9 @@ "description": "The maximum value of the slider." } }, - "required": ["value"] + "required": [ + "value" + ] } }, "styles": { diff --git a/specification/v0_9/json/standard_catalog.json b/specification/v0_9/json/standard_catalog.json index 06a05b982..b3860b565 100644 --- a/specification/v0_9/json/standard_catalog.json +++ b/specification/v0_9/json/standard_catalog.json @@ -8,12 +8,18 @@ "Text": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Text" }, + "component": { + "const": "Text" + }, "text": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The text content to display. While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation." @@ -21,10 +27,21 @@ "variant": { "type": "string", "description": "A hint for the base text style.", - "enum": ["h1", "h2", "h3", "h4", "h5", "caption", "body"] + "enum": [ + "h1", + "h2", + "h3", + "h4", + "h5", + "caption", + "body" + ] } }, - "required": ["component", "text"] + "required": [ + "component", + "text" + ] } ], "unevaluatedProperties": false @@ -32,12 +49,18 @@ "Image": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Image" }, + "component": { + "const": "Image" + }, "url": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The URL of the image to display." @@ -45,7 +68,13 @@ "fit": { "type": "string", "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": ["contain", "cover", "fill", "none", "scale-down"] + "enum": [ + "contain", + "cover", + "fill", + "none", + "scale-down" + ] }, "variant": { "type": "string", @@ -60,7 +89,10 @@ ] } }, - "required": ["component", "url"] + "required": [ + "component", + "url" + ] } ], "unevaluatedProperties": false @@ -68,12 +100,18 @@ "Icon": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Icon" }, + "component": { + "const": "Icon" + }, "name": { "description": "The name of the icon to display.", "oneOf": [ @@ -144,15 +182,22 @@ { "type": "object", "properties": { - "path": { "type": "string" } + "path": { + "type": "string" + } }, - "required": ["path"], + "required": [ + "path" + ], "additionalProperties": false } ] } }, - "required": ["component", "name"] + "required": [ + "component", + "name" + ] } ], "unevaluatedProperties": false @@ -160,18 +205,27 @@ "Video": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Video" }, + "component": { + "const": "Video" + }, "url": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The URL of the video to display." } }, - "required": ["component", "url"] + "required": [ + "component", + "url" + ] } ], "unevaluatedProperties": false @@ -179,12 +233,18 @@ "AudioPlayer": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "AudioPlayer" }, + "component": { + "const": "AudioPlayer" + }, "url": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The URL of the audio to be played." @@ -194,7 +254,10 @@ "$ref": "common_types.json#/$defs/DynamicString" } }, - "required": ["component", "url"] + "required": [ + "component", + "url" + ] } ], "unevaluatedProperties": false @@ -202,13 +265,19 @@ "Row": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "description": "A layout component that arranges its children horizontally. To create a grid layout, nest Columns within this Row.", "properties": { - "component": { "const": "Row" }, + "component": { + "const": "Row" + }, "children": { "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.", "$ref": "common_types.json#/$defs/ChildList" @@ -229,10 +298,18 @@ "align": { "type": "string", "description": "Defines the alignment of children along the cross axis (vertically). This is similar to the CSS 'align-items' property, but uses camelCase values (e.g., 'start').", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["component", "children"] + "required": [ + "component", + "children" + ] } ], "unevaluatedProperties": false @@ -240,13 +317,19 @@ "Column": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "description": "A layout component that arranges its children vertically. To create a grid layout, nest Rows within this Column.", "properties": { - "component": { "const": "Column" }, + "component": { + "const": "Column" + }, "children": { "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list. Children cannot be defined inline, they must be referred to by ID.", "$ref": "common_types.json#/$defs/ChildList" @@ -267,10 +350,18 @@ "align": { "type": "string", "description": "Defines the alignment of children along the cross axis (horizontally). This is similar to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] + "enum": [ + "center", + "end", + "start", + "stretch" + ] } }, - "required": ["component", "children"] + "required": [ + "component", + "children" + ] } ], "unevaluatedProperties": false @@ -278,12 +369,18 @@ "List": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "List" }, + "component": { + "const": "List" + }, "children": { "description": "Defines the children. Use an array of strings for a fixed set of children, or a template object to generate children from a data list.", "$ref": "common_types.json#/$defs/ChildList" @@ -291,15 +388,26 @@ "direction": { "type": "string", "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] + "enum": [ + "vertical", + "horizontal" + ] }, "align": { "type": "string", "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["component", "children"] + "required": [ + "component", + "children" + ] } ], "unevaluatedProperties": false @@ -307,18 +415,27 @@ "Card": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Card" }, + "component": { + "const": "Card" + }, "child": { "$ref": "common_types.json#/$defs/ComponentId", "description": "The ID of the single child component to be rendered inside the card. To display multiple elements, you MUST wrap them in a layout component (like Column or Row) and pass that container's ID here. Do NOT pass multiple IDs or a non-existent ID. Do NOT define the child component inline." } }, - "required": ["component", "child"] + "required": [ + "component", + "child" + ] } ], "unevaluatedProperties": false @@ -326,12 +443,18 @@ "Tabs": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Tabs" }, + "component": { + "const": "Tabs" + }, "tabs": { "type": "array", "description": "An array of objects, where each object defines a tab with a title and a child component.", @@ -347,12 +470,18 @@ "description": "The ID of the child component. Do NOT define the component inline." } }, - "required": ["title", "child"], + "required": [ + "title", + "child" + ], "additionalProperties": false } } }, - "required": ["component", "tabs"] + "required": [ + "component", + "tabs" + ] } ], "unevaluatedProperties": false @@ -360,12 +489,18 @@ "Modal": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Modal" }, + "component": { + "const": "Modal" + }, "trigger": { "$ref": "common_types.json#/$defs/ComponentId", "description": "The ID of the component that opens the modal when interacted with (e.g., a button). Do NOT define the component inline." @@ -375,7 +510,11 @@ "description": "The ID of the component to be displayed inside the modal. Do NOT define the component inline." } }, - "required": ["component", "trigger", "content"] + "required": [ + "component", + "trigger", + "content" + ] } ], "unevaluatedProperties": false @@ -383,20 +522,31 @@ "Divider": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, { "type": "object", "properties": { - "component": { "const": "Divider" }, + "component": { + "const": "Divider" + }, "axis": { "type": "string", "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"], + "enum": [ + "horizontal", + "vertical" + ], "default": "horizontal" } }, - "required": ["component"] + "required": [ + "component" + ] } ], "unevaluatedProperties": false @@ -404,13 +554,21 @@ "Button": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, { "type": "object", "properties": { - "component": { "const": "Button" }, + "component": { + "const": "Button" + }, "child": { "$ref": "common_types.json#/$defs/ComponentId", "description": "The ID of the child component. Use a 'Text' component for a labeled button. Only use an 'Icon' if the requirements explicitly ask for an icon-only button. Do NOT define the child component inline." @@ -418,13 +576,20 @@ "variant": { "type": "string", "description": "A hint for the button style. If omitted, a default button style is used. 'primary' indicates this is the main call-to-action button. 'borderless' means the button has no visual border or background, making its child content appear like a clickable link.", - "enum": ["primary", "borderless"] + "enum": [ + "primary", + "borderless" + ] }, "action": { "$ref": "common_types.json#/$defs/Action" } }, - "required": ["component", "child", "action"] + "required": [ + "component", + "child", + "action" + ] } ], "unevaluatedProperties": false @@ -432,13 +597,21 @@ "TextField": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, { "type": "object", "properties": { - "component": { "const": "TextField" }, + "component": { + "const": "TextField" + }, "label": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The text label for the input field." @@ -450,10 +623,22 @@ "variant": { "type": "string", "description": "The type of input field to display.", - "enum": ["longText", "number", "shortText", "obscured"] + "enum": [ + "longText", + "number", + "shortText", + "obscured" + ] + }, + "validationRegexp": { + "type": "string", + "description": "A regular expression used for client-side validation of the input." } }, - "required": ["component", "label"] + "required": [ + "component", + "label" + ] } ], "unevaluatedProperties": false @@ -461,13 +646,21 @@ "CheckBox": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, { "type": "object", "properties": { - "component": { "const": "CheckBox" }, + "component": { + "const": "CheckBox" + }, "label": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The text to display next to the checkbox." @@ -477,7 +670,11 @@ "description": "The current state of the checkbox (true for checked, false for unchecked)." } }, - "required": ["component", "label", "value"] + "required": [ + "component", + "label", + "value" + ] } ], "unevaluatedProperties": false @@ -485,14 +682,22 @@ "ChoicePicker": { "type": "object", "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, { "type": "object", "description": "A component that allows selecting one or more options from a list.", "properties": { - "component": { "const": "ChoicePicker" }, + "component": { + "const": "ChoicePicker" + }, "label": { "$ref": "common_types.json#/$defs/DynamicString", "description": "The label for the group of options." @@ -500,7 +705,10 @@ "variant": { "type": "string", "description": "A hint for how the choice picker should be displayed and behave.", - "enum": ["multipleSelection", "mutuallyExclusive"] + "enum": [ + "multipleSelection", + "mutuallyExclusive" + ] }, "options": { "type": "array", @@ -517,7 +725,10 @@ "description": "The stable value associated with this option." } }, - "required": ["label", "value"], + "required": [ + "label", + "value" + ], "additionalProperties": false } }, @@ -533,618 +744,823 @@ "chips" ] }, - "filterable": { - "type": "boolean", - "description": "If true, displays a search input to filter the options." - } + "type": "string", + "description": "The display style of the component.", + "enum": [ + "checkbox", + "chips" + ] }, - "required": ["component", "options", "value"] - } - ], - "unevaluatedProperties": false - }, - "Slider": { - "type": "object", - "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, - { - "type": "object", - "properties": { - "component": { "const": "Slider" }, - "label": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The label for the slider." - }, - "min": { - "type": "number", - "description": "The minimum value of the slider." - }, - "max": { - "type": "number", - "description": "The maximum value of the slider." - }, - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The current value of the slider." - } + "filterable": { + "type": "boolean", + "description": "If true, displays a search input to filter the options." + } + }, + "required": [ + "component", + "options", + "value" + ] + } + ], + "unevaluatedProperties": false + }, + "Slider": { + "type": "object", + "allOf": [ + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, + { + "type": "object", + "properties": { + "component": { + "const": "Slider" }, - "required": ["component", "value", "min", "max"] - } - ], - "unevaluatedProperties": false - }, - "DateTimeInput": { - "type": "object", - "allOf": [ - { "$ref": "common_types.json#/$defs/ComponentCommon" }, - { "$ref": "#/$defs/CatalogComponentCommon" }, - { "$ref": "common_types.json#/$defs/Checkable" }, - { - "type": "object", - "properties": { - "component": { "const": "DateTimeInput" }, - "value": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string." - }, - "enableDate": { - "type": "boolean", - "description": "If true, allows the user to select a date." - }, - "enableTime": { - "type": "boolean", - "description": "If true, allows the user to select a time." - }, - "min": { - "allOf": [ - { - "$ref": "common_types.json#/$defs/DynamicString" + "label": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The label for the slider." + }, + "min": { + "type": "number", + "description": "The minimum value of the slider." + }, + "max": { + "type": "number", + "description": "The maximum value of the slider." + }, + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The current value of the slider." + } + }, + "required": [ + "component", + "value", + "min", + "max" + ] + } + ], + "unevaluatedProperties": false + }, + "DateTimeInput": { + "type": "object", + "allOf": [ + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, + { + "type": "object", + "properties": { + "component": { + "const": "DateTimeInput" + }, + "value": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string." + }, + "enableDate": { + "type": "boolean", + "description": "If true, allows the user to select a date." + }, + "enableTime": { + "type": "boolean", + "description": "If true, allows the user to select a time." + }, + "min": { + "allOf": [ + { + "$ref": "common_types.json#/$defs/DynamicString" + }, + { + "if": { + "type": "string" }, - { - "if": { - "type": "string" - }, - "then": { - "oneOf": [ - { - "format": "date" - }, - { - "format": "time" - }, - { - "format": "date-time" - } - ] - } + "then": { + "oneOf": [ + { + "format": "date" + }, + { + "format": "time" + }, + { + "format": "date-time" + } + ] } - ], - "description": "The minimum allowed date/time in ISO 8601 format." - }, - "max": { - "allOf": [ - { - "$ref": "common_types.json#/$defs/DynamicString" + } + ], + "description": "The minimum allowed date/time in ISO 8601 format." + }, + "max": { + "allOf": [ + { + "$ref": "common_types.json#/$defs/DynamicString" + }, + { + "if": { + "type": "string" }, - { - "if": { - "type": "string" - }, - "then": { - "oneOf": [ - { - "format": "date" - }, - { - "format": "time" - }, - { - "format": "date-time" - } - ] - } + "then": { + "oneOf": [ + { + "format": "date" + }, + { + "format": "time" + }, + { + "format": "date-time" + } + ] } - ], - "description": "The maximum allowed date/time in ISO 8601 format." - }, - "label": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The text label for the input field." - } + } + ], + "description": "The maximum allowed date/time in ISO 8601 format." }, - "required": ["component", "value"] - } - ], - "unevaluatedProperties": false - } - }, - "functions": { - "required": { - "type": "object", - "description": "Checks that the value is not null, undefined, or empty.", - "properties": { - "call": { - "const": "required" + "label": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The text label for the input field." + } }, - "args": { - "type": "object", - "properties": { - "value": { - "description": "The value to check." - } - }, - "required": ["value"], - "additionalProperties": false + "required": [ + "component", + "value" + ] + } + ], + "unevaluatedProperties": false + } +}, +"functions": { + "required": { + "type": "object", + "description": "Checks that the value is not null, undefined, or empty.", + "properties": { + "call": { + "const": "required" + }, + "args": { + "type": "object", + "properties": { + "value": { + "description": "The value to check." + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value" + ], + "additionalProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "regex": { - "type": "object", - "description": "Checks that the value matches a regular expression string.", - "properties": { - "call": { - "const": "regex" - }, - "args": { - "type": "object", - "properties": { - "value": { "$ref": "common_types.json#/$defs/DynamicString" }, - "pattern": { - "type": "string", - "description": "The regex pattern to match against." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "regex": { + "type": "object", + "description": "Checks that the value matches a regular expression string.", + "properties": { + "call": { + "const": "regex" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" }, - "required": ["value", "pattern"], - "unevaluatedProperties": false + "pattern": { + "type": "string", + "description": "The regex pattern to match against." + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value", + "pattern" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "length": { - "type": "object", - "description": "Checks string length constraints.", - "properties": { - "call": { - "const": "length" - }, - "args": { - "type": "object", - "properties": { - "value": { "$ref": "common_types.json#/$defs/DynamicString" }, - "min": { - "type": "integer", - "minimum": 0, - "description": "The minimum allowed length." - }, - "max": { - "type": "integer", - "minimum": 0, - "description": "The maximum allowed length." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "length": { + "type": "object", + "description": "Checks string length constraints.", + "properties": { + "call": { + "const": "length" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + }, + "min": { + "type": "integer", + "minimum": 0, + "description": "The minimum allowed length." }, - "required": ["value"], - "anyOf": [{ "required": ["min"] }, { "required": ["max"] }], - "unevaluatedProperties": false + "max": { + "type": "integer", + "minimum": 0, + "description": "The maximum allowed length." + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value" + ], + "anyOf": [ + { + "required": [ + "min" + ] + }, + { + "required": [ + "max" + ] + } + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "numeric": { - "type": "object", - "description": "Checks numeric range constraints.", - "properties": { - "call": { - "const": "numeric" - }, - "args": { - "type": "object", - "properties": { - "value": { "$ref": "common_types.json#/$defs/DynamicNumber" }, - "min": { - "type": "number", - "description": "The minimum allowed value." - }, - "max": { - "type": "number", - "description": "The maximum allowed value." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "numeric": { + "type": "object", + "description": "Checks numeric range constraints.", + "properties": { + "call": { + "const": "numeric" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber" }, - "required": ["value"], - "anyOf": [{ "required": ["min"] }, { "required": ["max"] }], - "unevaluatedProperties": false + "min": { + "type": "number", + "description": "The minimum allowed value." + }, + "max": { + "type": "number", + "description": "The maximum allowed value." + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value" + ], + "anyOf": [ + { + "required": [ + "min" + ] + }, + { + "required": [ + "max" + ] + } + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "email": { - "type": "object", - "description": "Checks that the value is a valid email address.", - "properties": { - "call": { - "const": "email" - }, - "args": { - "type": "object", - "properties": { - "value": { "$ref": "common_types.json#/$defs/DynamicString" } - }, - "required": ["value"], - "unevaluatedProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "email": { + "type": "object", + "description": "Checks that the value is a valid email address.", + "properties": { + "call": { + "const": "email" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "formatString": { - "type": "object", - "description": "Performs string interpolation of data model values and other functions in the catalog functions list and returns the resulting string. The value string can contain interpolated expressions in the `${expression}` format. Supported expression types include: JSON Pointer paths to the data model (e.g., `${/absolute/path}` or `${relative/path}`), and client-side function calls (e.g., `${now()}`). Function arguments must be named (e.g., `${formatDate(value:${/currentDate}, format:'MM-dd')}`). To include a literal `${` sequence, escape it as `\\${`.", - "properties": { - "call": { - "const": "formatString" - }, - "args": { - "type": "object", - "properties": { - "value": { "$ref": "common_types.json#/$defs/DynamicString" } - }, - "required": ["value"], - "unevaluatedProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "formatString": { + "type": "object", + "description": "Performs string interpolation of data model values and other functions in the catalog functions list and returns the resulting string. The value string can contain interpolated expressions in the `${expression}` format. Supported expression types include: JSON Pointer paths to the data model (e.g., `${/absolute/path}` or `${relative/path}`), and client-side function calls (e.g., `${now()}`). Function arguments must be named (e.g., `${formatDate(value:${/currentDate}, format:'MM-dd')}`). To include a literal `${` sequence, escape it as `\\${`.", + "properties": { + "call": { + "const": "formatString" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + } }, - "returnType": { - "const": "string" - } + "required": [ + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "string" + } }, - "formatNumber": { - "type": "object", - "description": "Formats a number with the specified grouping and decimal precision.", - "properties": { - "call": { - "const": "formatNumber" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The number to format." - }, - "decimals": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." - }, - "grouping": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "formatNumber": { + "type": "object", + "description": "Formats a number with the specified grouping and decimal precision.", + "properties": { + "call": { + "const": "formatNumber" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The number to format." + }, + "decimals": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." }, - "required": ["value"], - "unevaluatedProperties": false + "grouping": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." + } }, - "returnType": { - "const": "string" - } + "required": [ + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "string" + } }, - "formatCurrency": { - "type": "object", - "description": "Formats a number as a currency string.", - "properties": { - "call": { - "const": "formatCurrency" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The monetary amount." - }, - "currency": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The ISO 4217 currency code (e.g., 'USD', 'EUR')." - }, - "decimals": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." - }, - "grouping": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "formatCurrency": { + "type": "object", + "description": "Formats a number as a currency string.", + "properties": { + "call": { + "const": "formatCurrency" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The monetary amount." }, - "required": ["currency", "value"], - "unevaluatedProperties": false + "currency": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The ISO 4217 currency code (e.g., 'USD', 'EUR')." + }, + "decimals": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." + }, + "grouping": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." + } }, - "returnType": { - "const": "string" - } + "required": [ + "currency", + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "string" + } }, - "formatDate": { - "type": "object", - "description": "Formats a timestamp into a string using a pattern.", - "properties": { - "call": { - "const": "formatDate" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicValue", - "description": "The date to format." - }, - "format": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "A Unicode TR35 date pattern string.\n\nToken Reference:\n- Year: 'yy' (26), 'yyyy' (2026)\n- Month: 'M' (1), 'MM' (01), 'MMM' (Jan), 'MMMM' (January)\n- Day: 'd' (1), 'dd' (01), 'E' (Tue), 'EEEE' (Tuesday)\n- Hour (12h): 'h' (1-12), 'hh' (01-12) - requires 'a' for AM/PM\n- Hour (24h): 'H' (0-23), 'HH' (00-23) - Military Time\n- Minute: 'mm' (00-59)\n- Second: 'ss' (00-59)\n- Period: 'a' (AM/PM)\n\nExamples:\n- 'MMM dd, yyyy' -> 'Jan 16, 2026'\n- 'HH:mm' -> '14:30' (Military)\n- 'h:mm a' -> '2:30 PM'\n- 'EEEE, d MMMM' -> 'Friday, 16 January'" - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "formatDate": { + "type": "object", + "description": "Formats a timestamp into a string using a pattern.", + "properties": { + "call": { + "const": "formatDate" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicValue", + "description": "The date to format." }, - "required": ["format", "value"], - "unevaluatedProperties": false + "format": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "A Unicode TR35 date pattern string.\n\nToken Reference:\n- Year: 'yy' (26), 'yyyy' (2026)\n- Month: 'M' (1), 'MM' (01), 'MMM' (Jan), 'MMMM' (January)\n- Day: 'd' (1), 'dd' (01), 'E' (Tue), 'EEEE' (Tuesday)\n- Hour (12h): 'h' (1-12), 'hh' (01-12) - requires 'a' for AM/PM\n- Hour (24h): 'H' (0-23), 'HH' (00-23) - Military Time\n- Minute: 'mm' (00-59)\n- Second: 'ss' (00-59)\n- Period: 'a' (AM/PM)\n\nExamples:\n- 'MMM dd, yyyy' -> 'Jan 16, 2026'\n- 'HH:mm' -> '14:30' (Military)\n- 'h:mm a' -> '2:30 PM'\n- 'EEEE, d MMMM' -> 'Friday, 16 January'" + } }, - "returnType": { - "const": "string" - } + "required": [ + "format", + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "string" + } }, - "pluralize": { - "type": "object", - "description": "Returns a localized string based on the Common Locale Data Repository (CLDR) plural category of the count (zero, one, two, few, many, other). Requires an 'other' fallback. For English, just use 'one' and 'other'.", - "properties": { - "call": { - "const": "pluralize" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The numeric value used to determine the plural category." - }, - "zero": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'zero' category (e.g., 0 items)." - }, - "one": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'one' category (e.g., 1 item)." - }, - "two": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'two' category (used in Arabic, Welsh, etc.)." - }, - "few": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'few' category (e.g., small groups in Slavic languages)." - }, - "many": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'many' category (e.g., large groups in various languages)." - }, - "other": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The default/fallback string (used for general plural cases)." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "pluralize": { + "type": "object", + "description": "Returns a localized string based on the Common Locale Data Repository (CLDR) plural category of the count (zero, one, two, few, many, other). Requires an 'other' fallback. For English, just use 'one' and 'other'.", + "properties": { + "call": { + "const": "pluralize" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The numeric value used to determine the plural category." + }, + "zero": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'zero' category (e.g., 0 items)." + }, + "one": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'one' category (e.g., 1 item)." + }, + "two": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'two' category (used in Arabic, Welsh, etc.)." }, - "required": ["value", "other"], - "unevaluatedProperties": false + "few": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'few' category (e.g., small groups in Slavic languages)." + }, + "many": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'many' category (e.g., large groups in various languages)." + }, + "other": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The default/fallback string (used for general plural cases)." + } }, - "returnType": { - "const": "string" - } + "required": [ + "value", + "other" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "string" + } }, - "openUrl": { - "type": "object", - "description": "Opens the specified URL in a browser or handler. This function has no return value.", - "properties": { - "call": { - "const": "openUrl" - }, - "args": { - "type": "object", - "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "The URL to open." - } - }, - "required": ["url"], - "additionalProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "openUrl": { + "type": "object", + "description": "Opens the specified URL in a browser or handler. This function has no return value.", + "properties": { + "call": { + "const": "openUrl" + }, + "args": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The URL to open." + } }, - "returnType": { - "const": "void" - } + "required": [ + "url" + ], + "additionalProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "void" + } }, - "and": { - "type": "object", - "description": "Performs a logical AND operation on a list of boolean values.", - "properties": { - "call": { - "const": "and" - }, - "args": { - "type": "object", - "properties": { - "values": { - "type": "array", - "description": "The list of boolean values to evaluate.", - "items": { - "$ref": "common_types.json#/$defs/DynamicBoolean" - }, - "minItems": 2 - } - }, - "required": ["values"], - "unevaluatedProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "and": { + "type": "object", + "description": "Performs a logical AND operation on a list of boolean values.", + "properties": { + "call": { + "const": "and" + }, + "args": { + "type": "object", + "properties": { + "values": { + "type": "array", + "description": "The list of boolean values to evaluate.", + "items": { + "$ref": "common_types.json#/$defs/DynamicBoolean" + }, + "minItems": 2 + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "values" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "or": { - "type": "object", - "description": "Performs a logical OR operation on a list of boolean values.", - "properties": { - "call": { - "const": "or" - }, - "args": { - "type": "object", - "properties": { - "values": { - "type": "array", - "description": "The list of boolean values to evaluate.", - "items": { - "$ref": "common_types.json#/$defs/DynamicBoolean" - }, - "minItems": 2 - } - }, - "required": ["values"], - "unevaluatedProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "or": { + "type": "object", + "description": "Performs a logical OR operation on a list of boolean values.", + "properties": { + "call": { + "const": "or" + }, + "args": { + "type": "object", + "properties": { + "values": { + "type": "array", + "description": "The list of boolean values to evaluate.", + "items": { + "$ref": "common_types.json#/$defs/DynamicBoolean" + }, + "minItems": 2 + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "values" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false + "returnType": { + "const": "boolean" + } }, - "not": { - "type": "object", - "description": "Performs a logical NOT operation on a boolean value.", - "properties": { - "call": { - "const": "not" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "The boolean value to negate." - } - }, - "required": ["value"], - "unevaluatedProperties": false + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + }, + "not": { + "type": "object", + "description": "Performs a logical NOT operation on a boolean value.", + "properties": { + "call": { + "const": "not" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "The boolean value to negate." + } }, - "returnType": { - "const": "boolean" - } + "required": [ + "value" + ], + "unevaluatedProperties": false }, - "required": ["call", "args"], - "unevaluatedProperties": false - } - }, - "theme": { - "primaryColor": { - "type": "string", - "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - }, - "iconUrl": { - "type": "string", - "format": "uri", - "description": "A URL for an image that identifies the agent or tool associated with the surface." + "returnType": { + "const": "boolean" + } }, - "agentDisplayName": { - "type": "string", - "description": "Text to be displayed next to the surface to identify the agent or tool that created it." - } + "required": [ + "call", + "args" + ], + "unevaluatedProperties": false + } +}, +"theme": { + "primaryColor": { + "type": "string", + "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", + "pattern": "^#[0-9a-fA-F]{6}$" }, - "$defs": { - "CatalogComponentCommon": { - "type": "object", - "properties": { - "weight": { - "type": "number", - "description": "The relative weight of this component within a Row or Column. This is similar to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." - } + "iconUrl": { + "type": "string", + "format": "uri", + "description": "A URL for an image that identifies the agent or tool associated with the surface." + }, + "agentDisplayName": { + "type": "string", + "description": "Text to be displayed next to the surface to identify the agent or tool that created it." + } +}, +"$defs": { + "CatalogComponentCommon": { + "type": "object", + "properties": { + "weight": { + "type": "number", + "description": "The relative weight of this component within a Row or Column. This is similar to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." } - }, - "anyComponent": { - "oneOf": [ - { "$ref": "#/components/Text" }, - { "$ref": "#/components/Image" }, - { "$ref": "#/components/Icon" }, - { "$ref": "#/components/Video" }, - { "$ref": "#/components/AudioPlayer" }, - { "$ref": "#/components/Row" }, - { "$ref": "#/components/Column" }, - { "$ref": "#/components/List" }, - { "$ref": "#/components/Card" }, - { "$ref": "#/components/Tabs" }, - { "$ref": "#/components/Modal" }, - { "$ref": "#/components/Divider" }, - { "$ref": "#/components/Button" }, - { "$ref": "#/components/TextField" }, - { "$ref": "#/components/CheckBox" }, - { "$ref": "#/components/ChoicePicker" }, - { "$ref": "#/components/Slider" }, - { "$ref": "#/components/DateTimeInput" } - ], - "discriminator": { - "propertyName": "component" + } + }, + "anyComponent": { + "oneOf": [ + { + "$ref": "#/components/Text" + }, + { + "$ref": "#/components/Image" + }, + { + "$ref": "#/components/Icon" + }, + { + "$ref": "#/components/Video" + }, + { + "$ref": "#/components/AudioPlayer" + }, + { + "$ref": "#/components/Row" + }, + { + "$ref": "#/components/Column" + }, + { + "$ref": "#/components/List" + }, + { + "$ref": "#/components/Card" + }, + { + "$ref": "#/components/Tabs" + }, + { + "$ref": "#/components/Modal" + }, + { + "$ref": "#/components/Divider" + }, + { + "$ref": "#/components/Button" + }, + { + "$ref": "#/components/TextField" + }, + { + "$ref": "#/components/CheckBox" + }, + { + "$ref": "#/components/ChoicePicker" + }, + { + "$ref": "#/components/Slider" + }, + { + "$ref": "#/components/DateTimeInput" } - }, - "anyFunction": { - "oneOf": [ - { "$ref": "#/functions/required" }, - { "$ref": "#/functions/regex" }, - { "$ref": "#/functions/length" }, - { "$ref": "#/functions/numeric" }, - { "$ref": "#/functions/email" }, - { "$ref": "#/functions/formatString" }, - { "$ref": "#/functions/formatNumber" }, - { "$ref": "#/functions/formatCurrency" }, - { "$ref": "#/functions/formatDate" }, - { "$ref": "#/functions/pluralize" }, - { "$ref": "#/functions/openUrl" }, - { "$ref": "#/functions/and" }, - { "$ref": "#/functions/or" }, - { "$ref": "#/functions/not" } - ] + ], + "discriminator": { + "propertyName": "component" } + }, + "anyFunction": { + "oneOf": [ + { + "$ref": "#/functions/required" + }, + { + "$ref": "#/functions/regex" + }, + { + "$ref": "#/functions/length" + }, + { + "$ref": "#/functions/numeric" + }, + { + "$ref": "#/functions/email" + }, + { + "$ref": "#/functions/formatString" + }, + { + "$ref": "#/functions/formatNumber" + }, + { + "$ref": "#/functions/formatCurrency" + }, + { + "$ref": "#/functions/formatDate" + }, + { + "$ref": "#/functions/pluralize" + }, + { + "$ref": "#/functions/openUrl" + }, + { + "$ref": "#/functions/and" + }, + { + "$ref": "#/functions/or" + }, + { + "$ref": "#/functions/not" + } + ] } } +} \ No newline at end of file From 8bc27005746a0bb8e74bc249792e92b6dac4a38b Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Mon, 9 Feb 2026 14:51:21 -0800 Subject: [PATCH 37/65] Use copies instead of redirects (#582) --- .github/workflows/docs.yml | 10 ++++++++++ mkdocs.yaml | 15 +-------------- requirements-docs.txt | 1 - 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 8ca88f3dd..32d9edefc 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -72,6 +72,16 @@ jobs: - name: Validate documentation conversion script run: pip install pytest && pytest docs/scripts/test_convert_docs.py + - name: Copy schemas to documentation + run: | + cp -R specification/* docs/specification/ + # Flatten JSON files to version roots to support clean URLs without redirects + for version in v0_8 v0_9; do + if [ -d "docs/specification/$version/json" ]; then + cp docs/specification/$version/json/*.json docs/specification/$version/ + fi + done + - name: Convert Admonitions in Documentation run: python docs/scripts/convert_docs.py --mode github-to-mkdocs diff --git a/mkdocs.yaml b/mkdocs.yaml index c24df32da..4031e954c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -183,17 +183,4 @@ plugins: # sections: # "Specification": # - a2ui_protocol.md - - redirects: - redirect_maps: - "specification/v0_9/server_to_client.json": "specification/v0_9/json/server_to_client.json" - "specification/v0_9/client_to_server.json": "specification/v0_9/json/client_to_server.json" - "specification/v0_9/common_types.json": "specification/v0_9/json/common_types.json" - "specification/v0_9/standard_catalog.json": "specification/v0_9/json/standard_catalog.json" - "specification/v0_9/a2ui_client_capabilities.json": "specification/v0_9/json/a2ui_client_capabilities.json" - "specification/v0_9/a2ui_client_data_model.json": "specification/v0_9/json/a2ui_client_data_model.json" - "specification/v0_8/a2ui_client_capabilities_schema.json": "specification/v0_8/json/a2ui_client_capabilities_schema.json" - "specification/v0_8/catalog_description_schema.json": "specification/v0_8/json/catalog_description_schema.json" - "specification/v0_8/client_to_server.json": "specification/v0_8/json/client_to_server.json" - "specification/v0_8/server_to_client.json": "specification/v0_8/json/server_to_client.json" - "specification/v0_8/server_to_client_with_standard_catalog.json": "specification/v0_8/json/server_to_client_with_standard_catalog.json" - "specification/v0_8/standard_catalog_definition.json": "specification/v0_8/json/standard_catalog_definition.json" + diff --git a/requirements-docs.txt b/requirements-docs.txt index 573152f22..ac6d4cfe5 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,5 +1,4 @@ mkdocs-material -mkdocs-redirects mkdocs-macros-plugin mkdocs-llmstxt mkdocs-include-markdown-plugin From 01e34f3061386025ad887ba1e418c64f617ef8a5 Mon Sep 17 00:00:00 2001 From: gurusai-voleti Date: Tue, 10 Feb 2026 21:52:30 +0530 Subject: [PATCH 38/65] chore: Migrate gsutil usage to gcloud storage (#610) --- samples/personalized_learning/Quickstart.ipynb | 4 ++-- samples/personalized_learning/quickstart_setup.sh | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/samples/personalized_learning/Quickstart.ipynb b/samples/personalized_learning/Quickstart.ipynb index 56aa8c38f..0996fee9d 100644 --- a/samples/personalized_learning/Quickstart.ipynb +++ b/samples/personalized_learning/Quickstart.ipynb @@ -320,12 +320,12 @@ "import os\n", "\n", "MEDIA_BUCKET = f\"{PROJECT_ID}-media\"\n", - "!gsutil mb -l us-central1 gs://{MEDIA_BUCKET} 2>/dev/null || true\n", + "!gcloud storage buckets create gs://{MEDIA_BUCKET} --location=us-central1 2>/dev/null || true\n", "\n", "for filename in [\"podcast.m4a\", \"video.mp4\"]:\n", " path = f\"public/assets/{filename}\"\n", " if os.path.exists(path):\n", - " !gsutil -q cp {path} gs://{MEDIA_BUCKET}/assets/{filename}\n", + " !gcloud storage cp {path} gs://{MEDIA_BUCKET}/assets/{filename}\n", " print(f\"✅ Uploaded {filename}\")\n", " else:\n", " print(f\"⚠️ {path} not found\")" diff --git a/samples/personalized_learning/quickstart_setup.sh b/samples/personalized_learning/quickstart_setup.sh index aa99303b8..eed432849 100755 --- a/samples/personalized_learning/quickstart_setup.sh +++ b/samples/personalized_learning/quickstart_setup.sh @@ -120,24 +120,24 @@ echo -e "${YELLOW}[5/6]${NC} Creating GCS buckets..." LOCATION="us-central1" # Staging bucket -gsutil mb -l "$LOCATION" "gs://${PROJECT_ID}_cloudbuild" 2>/dev/null || true +gcloud storage buckets create "gs://${PROJECT_ID}_cloudbuild" --location "$LOCATION" 2>/dev/null || true echo " Staging bucket: gs://${PROJECT_ID}_cloudbuild" # Learner context bucket CONTEXT_BUCKET="${PROJECT_ID}-learner-context" -gsutil mb -l "$LOCATION" "gs://${CONTEXT_BUCKET}" 2>/dev/null || true +gcloud storage buckets create "gs://${CONTEXT_BUCKET}" --location "$LOCATION" 2>/dev/null || true echo " Context bucket: gs://${CONTEXT_BUCKET}" # OpenStax content bucket OPENSTAX_BUCKET="${PROJECT_ID}-openstax" -gsutil mb -l "$LOCATION" "gs://${OPENSTAX_BUCKET}" 2>/dev/null || true +gcloud storage buckets create "gs://${OPENSTAX_BUCKET}" --location "$LOCATION" 2>/dev/null || true echo " OpenStax bucket: gs://${OPENSTAX_BUCKET}" # Step 6: Upload learner context echo -e "${YELLOW}[6/6]${NC} Uploading learner context files..." # Note: Using -o flag to disable multiprocessing on macOS to avoid Python multiprocessing issues -gsutil -o "GSUtil:parallel_process_count=1" -m cp -q learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || \ - gsutil cp -q learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || true +gcloud storage cp learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || \ + gcloud storage cp learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || true echo " Learner context uploaded to gs://${CONTEXT_BUCKET}/learner_context/" # Get project number for .env From f479caab20a2447a8a31185721232a9da2b62afb Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Tue, 10 Feb 2026 10:13:39 -0800 Subject: [PATCH 39/65] Fix syntax broken in #604 (#607) --- specification/v0_9/json/standard_catalog.json | 1605 +++++++---------- 1 file changed, 700 insertions(+), 905 deletions(-) diff --git a/specification/v0_9/json/standard_catalog.json b/specification/v0_9/json/standard_catalog.json index b3860b565..575ed2f36 100644 --- a/specification/v0_9/json/standard_catalog.json +++ b/specification/v0_9/json/standard_catalog.json @@ -27,21 +27,10 @@ "variant": { "type": "string", "description": "A hint for the base text style.", - "enum": [ - "h1", - "h2", - "h3", - "h4", - "h5", - "caption", - "body" - ] + "enum": ["h1", "h2", "h3", "h4", "h5", "caption", "body"] } }, - "required": [ - "component", - "text" - ] + "required": ["component", "text"] } ], "unevaluatedProperties": false @@ -68,13 +57,7 @@ "fit": { "type": "string", "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": [ - "contain", - "cover", - "fill", - "none", - "scale-down" - ] + "enum": ["contain", "cover", "fill", "none", "scale-down"] }, "variant": { "type": "string", @@ -89,10 +72,7 @@ ] } }, - "required": [ - "component", - "url" - ] + "required": ["component", "url"] } ], "unevaluatedProperties": false @@ -186,18 +166,13 @@ "type": "string" } }, - "required": [ - "path" - ], + "required": ["path"], "additionalProperties": false } ] } }, - "required": [ - "component", - "name" - ] + "required": ["component", "name"] } ], "unevaluatedProperties": false @@ -222,10 +197,7 @@ "description": "The URL of the video to display." } }, - "required": [ - "component", - "url" - ] + "required": ["component", "url"] } ], "unevaluatedProperties": false @@ -254,10 +226,7 @@ "$ref": "common_types.json#/$defs/DynamicString" } }, - "required": [ - "component", - "url" - ] + "required": ["component", "url"] } ], "unevaluatedProperties": false @@ -298,18 +267,10 @@ "align": { "type": "string", "description": "Defines the alignment of children along the cross axis (vertically). This is similar to the CSS 'align-items' property, but uses camelCase values (e.g., 'start').", - "enum": [ - "start", - "center", - "end", - "stretch" - ] + "enum": ["start", "center", "end", "stretch"] } }, - "required": [ - "component", - "children" - ] + "required": ["component", "children"] } ], "unevaluatedProperties": false @@ -350,18 +311,10 @@ "align": { "type": "string", "description": "Defines the alignment of children along the cross axis (horizontally). This is similar to the CSS 'align-items' property.", - "enum": [ - "center", - "end", - "start", - "stretch" - ] + "enum": ["center", "end", "start", "stretch"] } }, - "required": [ - "component", - "children" - ] + "required": ["component", "children"] } ], "unevaluatedProperties": false @@ -388,26 +341,15 @@ "direction": { "type": "string", "description": "The direction in which the list items are laid out.", - "enum": [ - "vertical", - "horizontal" - ] + "enum": ["vertical", "horizontal"] }, "align": { "type": "string", "description": "Defines the alignment of children along the cross axis.", - "enum": [ - "start", - "center", - "end", - "stretch" - ] + "enum": ["start", "center", "end", "stretch"] } }, - "required": [ - "component", - "children" - ] + "required": ["component", "children"] } ], "unevaluatedProperties": false @@ -432,10 +374,7 @@ "description": "The ID of the single child component to be rendered inside the card. To display multiple elements, you MUST wrap them in a layout component (like Column or Row) and pass that container's ID here. Do NOT pass multiple IDs or a non-existent ID. Do NOT define the child component inline." } }, - "required": [ - "component", - "child" - ] + "required": ["component", "child"] } ], "unevaluatedProperties": false @@ -470,18 +409,12 @@ "description": "The ID of the child component. Do NOT define the component inline." } }, - "required": [ - "title", - "child" - ], + "required": ["title", "child"], "additionalProperties": false } } }, - "required": [ - "component", - "tabs" - ] + "required": ["component", "tabs"] } ], "unevaluatedProperties": false @@ -510,11 +443,7 @@ "description": "The ID of the component to be displayed inside the modal. Do NOT define the component inline." } }, - "required": [ - "component", - "trigger", - "content" - ] + "required": ["component", "trigger", "content"] } ], "unevaluatedProperties": false @@ -537,16 +466,11 @@ "axis": { "type": "string", "description": "The orientation of the divider.", - "enum": [ - "horizontal", - "vertical" - ], + "enum": ["horizontal", "vertical"], "default": "horizontal" } }, - "required": [ - "component" - ] + "required": ["component"] } ], "unevaluatedProperties": false @@ -576,20 +500,13 @@ "variant": { "type": "string", "description": "A hint for the button style. If omitted, a default button style is used. 'primary' indicates this is the main call-to-action button. 'borderless' means the button has no visual border or background, making its child content appear like a clickable link.", - "enum": [ - "primary", - "borderless" - ] + "enum": ["primary", "borderless"] }, "action": { "$ref": "common_types.json#/$defs/Action" } }, - "required": [ - "component", - "child", - "action" - ] + "required": ["component", "child", "action"] } ], "unevaluatedProperties": false @@ -623,22 +540,14 @@ "variant": { "type": "string", "description": "The type of input field to display.", - "enum": [ - "longText", - "number", - "shortText", - "obscured" - ] + "enum": ["longText", "number", "shortText", "obscured"] }, "validationRegexp": { "type": "string", "description": "A regular expression used for client-side validation of the input." } }, - "required": [ - "component", - "label" - ] + "required": ["component", "label"] } ], "unevaluatedProperties": false @@ -670,11 +579,7 @@ "description": "The current state of the checkbox (true for checked, false for unchecked)." } }, - "required": [ - "component", - "label", - "value" - ] + "required": ["component", "label", "value"] } ], "unevaluatedProperties": false @@ -705,10 +610,7 @@ "variant": { "type": "string", "description": "A hint for how the choice picker should be displayed and behave.", - "enum": [ - "multipleSelection", - "mutuallyExclusive" - ] + "enum": ["multipleSelection", "mutuallyExclusive"] }, "options": { "type": "array", @@ -725,10 +627,7 @@ "description": "The stable value associated with this option." } }, - "required": [ - "label", - "value" - ], + "required": ["label", "value"], "additionalProperties": false } }, @@ -739,828 +638,724 @@ "displayStyle": { "type": "string", "description": "The display style of the component.", - "enum": [ - "checkbox", - "chips" - ] + "enum": ["checkbox", "chips"] }, - "type": "string", - "description": "The display style of the component.", - "enum": [ - "checkbox", - "chips" - ] - }, - "filterable": { - "type": "boolean", - "description": "If true, displays a search input to filter the options." - } - }, - "required": [ - "component", - "options", - "value" - ] - } - ], - "unevaluatedProperties": false - }, - "Slider": { - "type": "object", - "allOf": [ - { - "$ref": "common_types.json#/$defs/ComponentCommon" - }, - { - "$ref": "#/$defs/CatalogComponentCommon" - }, - { - "$ref": "common_types.json#/$defs/Checkable" - }, - { - "type": "object", - "properties": { - "component": { - "const": "Slider" - }, - "label": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The label for the slider." - }, - "min": { - "type": "number", - "description": "The minimum value of the slider." - }, - "max": { - "type": "number", - "description": "The maximum value of the slider." - }, - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The current value of the slider." - } - }, - "required": [ - "component", - "value", - "min", - "max" - ] - } - ], - "unevaluatedProperties": false - }, - "DateTimeInput": { - "type": "object", - "allOf": [ - { - "$ref": "common_types.json#/$defs/ComponentCommon" - }, - { - "$ref": "#/$defs/CatalogComponentCommon" - }, - { - "$ref": "common_types.json#/$defs/Checkable" - }, - { - "type": "object", - "properties": { - "component": { - "const": "DateTimeInput" - }, - "value": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string." - }, - "enableDate": { - "type": "boolean", - "description": "If true, allows the user to select a date." + "filterable": { + "type": "boolean", + "description": "If true, displays a search input to filter the options." + } }, - "enableTime": { - "type": "boolean", - "description": "If true, allows the user to select a time." + "required": ["component", "options", "value"] + } + ], + "unevaluatedProperties": false + }, + "Slider": { + "type": "object", + "allOf": [ + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, + { + "type": "object", + "properties": { + "component": { + "const": "Slider" + }, + "label": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The label for the slider." + }, + "min": { + "type": "number", + "description": "The minimum value of the slider." + }, + "max": { + "type": "number", + "description": "The maximum value of the slider." + }, + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The current value of the slider." + } }, - "min": { - "allOf": [ - { - "$ref": "common_types.json#/$defs/DynamicString" - }, - { - "if": { - "type": "string" + "required": ["component", "value", "min", "max"] + } + ], + "unevaluatedProperties": false + }, + "DateTimeInput": { + "type": "object", + "allOf": [ + { + "$ref": "common_types.json#/$defs/ComponentCommon" + }, + { + "$ref": "#/$defs/CatalogComponentCommon" + }, + { + "$ref": "common_types.json#/$defs/Checkable" + }, + { + "type": "object", + "properties": { + "component": { + "const": "DateTimeInput" + }, + "value": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The selected date and/or time value in ISO 8601 format. If not yet set, initialize with an empty string." + }, + "enableDate": { + "type": "boolean", + "description": "If true, allows the user to select a date." + }, + "enableTime": { + "type": "boolean", + "description": "If true, allows the user to select a time." + }, + "min": { + "allOf": [ + { + "$ref": "common_types.json#/$defs/DynamicString" }, - "then": { - "oneOf": [ - { - "format": "date" - }, - { - "format": "time" - }, - { - "format": "date-time" - } - ] + { + "if": { + "type": "string" + }, + "then": { + "oneOf": [ + { + "format": "date" + }, + { + "format": "time" + }, + { + "format": "date-time" + } + ] + } } - } - ], - "description": "The minimum allowed date/time in ISO 8601 format." - }, - "max": { - "allOf": [ - { - "$ref": "common_types.json#/$defs/DynamicString" - }, - { - "if": { - "type": "string" + ], + "description": "The minimum allowed date/time in ISO 8601 format." + }, + "max": { + "allOf": [ + { + "$ref": "common_types.json#/$defs/DynamicString" }, - "then": { - "oneOf": [ - { - "format": "date" - }, - { - "format": "time" - }, - { - "format": "date-time" - } - ] + { + "if": { + "type": "string" + }, + "then": { + "oneOf": [ + { + "format": "date" + }, + { + "format": "time" + }, + { + "format": "date-time" + } + ] + } } - } - ], - "description": "The maximum allowed date/time in ISO 8601 format." + ], + "description": "The maximum allowed date/time in ISO 8601 format." + }, + "label": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The text label for the input field." + } }, - "label": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The text label for the input field." - } - }, - "required": [ - "component", - "value" - ] - } - ], - "unevaluatedProperties": false - } -}, -"functions": { - "required": { - "type": "object", - "description": "Checks that the value is not null, undefined, or empty.", - "properties": { - "call": { - "const": "required" - }, - "args": { - "type": "object", - "properties": { - "value": { - "description": "The value to check." - } - }, - "required": [ - "value" - ], - "additionalProperties": false - }, - "returnType": { - "const": "boolean" - } - }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false + "required": ["component", "value"] + } + ], + "unevaluatedProperties": false + } }, - "regex": { - "type": "object", - "description": "Checks that the value matches a regular expression string.", - "properties": { - "call": { - "const": "regex" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicString" + "functions": { + "required": { + "type": "object", + "description": "Checks that the value is not null, undefined, or empty.", + "properties": { + "call": { + "const": "required" + }, + "args": { + "type": "object", + "properties": { + "value": { + "description": "The value to check." + } }, - "pattern": { - "type": "string", - "description": "The regex pattern to match against." - } - }, - "required": [ - "value", - "pattern" - ], - "unevaluatedProperties": false + "required": ["value"], + "additionalProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "length": { - "type": "object", - "description": "Checks string length constraints.", - "properties": { - "call": { - "const": "length" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicString" - }, - "min": { - "type": "integer", - "minimum": 0, - "description": "The minimum allowed length." - }, - "max": { - "type": "integer", - "minimum": 0, - "description": "The maximum allowed length." - } - }, - "required": [ - "value" - ], - "anyOf": [ - { - "required": [ - "min" - ] + "regex": { + "type": "object", + "description": "Checks that the value matches a regular expression string.", + "properties": { + "call": { + "const": "regex" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + }, + "pattern": { + "type": "string", + "description": "The regex pattern to match against." + } }, - { - "required": [ - "max" - ] - } - ], - "unevaluatedProperties": false + "required": ["value", "pattern"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "numeric": { - "type": "object", - "description": "Checks numeric range constraints.", - "properties": { - "call": { - "const": "numeric" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber" - }, - "min": { - "type": "number", - "description": "The minimum allowed value." - }, - "max": { - "type": "number", - "description": "The maximum allowed value." - } - }, - "required": [ - "value" - ], - "anyOf": [ - { - "required": [ - "min" - ] + "length": { + "type": "object", + "description": "Checks string length constraints.", + "properties": { + "call": { + "const": "length" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + }, + "min": { + "type": "integer", + "minimum": 0, + "description": "The minimum allowed length." + }, + "max": { + "type": "integer", + "minimum": 0, + "description": "The maximum allowed length." + } }, - { - "required": [ - "max" - ] - } - ], - "unevaluatedProperties": false + "required": ["value"], + "anyOf": [ + { + "required": ["min"] + }, + { + "required": ["max"] + } + ], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "email": { - "type": "object", - "description": "Checks that the value is a valid email address.", - "properties": { - "call": { - "const": "email" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicString" - } - }, - "required": [ - "value" - ], - "unevaluatedProperties": false + "numeric": { + "type": "object", + "description": "Checks numeric range constraints.", + "properties": { + "call": { + "const": "numeric" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber" + }, + "min": { + "type": "number", + "description": "The minimum allowed value." + }, + "max": { + "type": "number", + "description": "The maximum allowed value." + } + }, + "required": ["value"], + "anyOf": [ + { + "required": ["min"] + }, + { + "required": ["max"] + } + ], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "formatString": { - "type": "object", - "description": "Performs string interpolation of data model values and other functions in the catalog functions list and returns the resulting string. The value string can contain interpolated expressions in the `${expression}` format. Supported expression types include: JSON Pointer paths to the data model (e.g., `${/absolute/path}` or `${relative/path}`), and client-side function calls (e.g., `${now()}`). Function arguments must be named (e.g., `${formatDate(value:${/currentDate}, format:'MM-dd')}`). To include a literal `${` sequence, escape it as `\\${`.", - "properties": { - "call": { - "const": "formatString" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicString" - } - }, - "required": [ - "value" - ], - "unevaluatedProperties": false + "email": { + "type": "object", + "description": "Checks that the value is a valid email address.", + "properties": { + "call": { + "const": "email" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + } + }, + "required": ["value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "string" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "formatNumber": { - "type": "object", - "description": "Formats a number with the specified grouping and decimal precision.", - "properties": { - "call": { - "const": "formatNumber" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The number to format." - }, - "decimals": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." + "formatString": { + "type": "object", + "description": "Performs string interpolation of data model values and other functions in the catalog functions list and returns the resulting string. The value string can contain interpolated expressions in the `${expression}` format. Supported expression types include: JSON Pointer paths to the data model (e.g., `${/absolute/path}` or `${relative/path}`), and client-side function calls (e.g., `${now()}`). Function arguments must be named (e.g., `${formatDate(value:${/currentDate}, format:'MM-dd')}`). To include a literal `${` sequence, escape it as `\\${`.", + "properties": { + "call": { + "const": "formatString" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicString" + } }, - "grouping": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." - } - }, - "required": [ - "value" - ], - "unevaluatedProperties": false + "required": ["value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "string" + } }, - "returnType": { - "const": "string" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "formatCurrency": { - "type": "object", - "description": "Formats a number as a currency string.", - "properties": { - "call": { - "const": "formatCurrency" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The monetary amount." - }, - "currency": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The ISO 4217 currency code (e.g., 'USD', 'EUR')." - }, - "decimals": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." + "formatNumber": { + "type": "object", + "description": "Formats a number with the specified grouping and decimal precision.", + "properties": { + "call": { + "const": "formatNumber" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The number to format." + }, + "decimals": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." + }, + "grouping": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." + } }, - "grouping": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." - } - }, - "required": [ - "currency", - "value" - ], - "unevaluatedProperties": false + "required": ["value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "string" + } }, - "returnType": { - "const": "string" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "formatDate": { - "type": "object", - "description": "Formats a timestamp into a string using a pattern.", - "properties": { - "call": { - "const": "formatDate" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicValue", - "description": "The date to format." + "formatCurrency": { + "type": "object", + "description": "Formats a number as a currency string.", + "properties": { + "call": { + "const": "formatCurrency" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The monetary amount." + }, + "currency": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The ISO 4217 currency code (e.g., 'USD', 'EUR')." + }, + "decimals": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "Optional. The number of decimal places to show. Defaults to 0 or 2 depending on locale." + }, + "grouping": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "Optional. If true, uses locale-specific grouping separators (e.g. '1,000'). If false, returns raw digits (e.g. '1000'). Defaults to true." + } }, - "format": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "A Unicode TR35 date pattern string.\n\nToken Reference:\n- Year: 'yy' (26), 'yyyy' (2026)\n- Month: 'M' (1), 'MM' (01), 'MMM' (Jan), 'MMMM' (January)\n- Day: 'd' (1), 'dd' (01), 'E' (Tue), 'EEEE' (Tuesday)\n- Hour (12h): 'h' (1-12), 'hh' (01-12) - requires 'a' for AM/PM\n- Hour (24h): 'H' (0-23), 'HH' (00-23) - Military Time\n- Minute: 'mm' (00-59)\n- Second: 'ss' (00-59)\n- Period: 'a' (AM/PM)\n\nExamples:\n- 'MMM dd, yyyy' -> 'Jan 16, 2026'\n- 'HH:mm' -> '14:30' (Military)\n- 'h:mm a' -> '2:30 PM'\n- 'EEEE, d MMMM' -> 'Friday, 16 January'" - } - }, - "required": [ - "format", - "value" - ], - "unevaluatedProperties": false + "required": ["currency", "value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "string" + } }, - "returnType": { - "const": "string" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "pluralize": { - "type": "object", - "description": "Returns a localized string based on the Common Locale Data Repository (CLDR) plural category of the count (zero, one, two, few, many, other). Requires an 'other' fallback. For English, just use 'one' and 'other'.", - "properties": { - "call": { - "const": "pluralize" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicNumber", - "description": "The numeric value used to determine the plural category." - }, - "zero": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'zero' category (e.g., 0 items)." - }, - "one": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'one' category (e.g., 1 item)." - }, - "two": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'two' category (used in Arabic, Welsh, etc.)." - }, - "few": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'few' category (e.g., small groups in Slavic languages)." - }, - "many": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "String for the 'many' category (e.g., large groups in various languages)." + "formatDate": { + "type": "object", + "description": "Formats a timestamp into a string using a pattern.", + "properties": { + "call": { + "const": "formatDate" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicValue", + "description": "The date to format." + }, + "format": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "A Unicode TR35 date pattern string.\n\nToken Reference:\n- Year: 'yy' (26), 'yyyy' (2026)\n- Month: 'M' (1), 'MM' (01), 'MMM' (Jan), 'MMMM' (January)\n- Day: 'd' (1), 'dd' (01), 'E' (Tue), 'EEEE' (Tuesday)\n- Hour (12h): 'h' (1-12), 'hh' (01-12) - requires 'a' for AM/PM\n- Hour (24h): 'H' (0-23), 'HH' (00-23) - Military Time\n- Minute: 'mm' (00-59)\n- Second: 'ss' (00-59)\n- Period: 'a' (AM/PM)\n\nExamples:\n- 'MMM dd, yyyy' -> 'Jan 16, 2026'\n- 'HH:mm' -> '14:30' (Military)\n- 'h:mm a' -> '2:30 PM'\n- 'EEEE, d MMMM' -> 'Friday, 16 January'" + } }, - "other": { - "$ref": "common_types.json#/$defs/DynamicString", - "description": "The default/fallback string (used for general plural cases)." - } - }, - "required": [ - "value", - "other" - ], - "unevaluatedProperties": false + "required": ["format", "value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "string" + } }, - "returnType": { - "const": "string" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "openUrl": { - "type": "object", - "description": "Opens the specified URL in a browser or handler. This function has no return value.", - "properties": { - "call": { - "const": "openUrl" - }, - "args": { - "type": "object", - "properties": { - "url": { - "type": "string", - "format": "uri", - "description": "The URL to open." - } - }, - "required": [ - "url" - ], - "additionalProperties": false + "pluralize": { + "type": "object", + "description": "Returns a localized string based on the Common Locale Data Repository (CLDR) plural category of the count (zero, one, two, few, many, other). Requires an 'other' fallback. For English, just use 'one' and 'other'.", + "properties": { + "call": { + "const": "pluralize" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicNumber", + "description": "The numeric value used to determine the plural category." + }, + "zero": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'zero' category (e.g., 0 items)." + }, + "one": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'one' category (e.g., 1 item)." + }, + "two": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'two' category (used in Arabic, Welsh, etc.)." + }, + "few": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'few' category (e.g., small groups in Slavic languages)." + }, + "many": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "String for the 'many' category (e.g., large groups in various languages)." + }, + "other": { + "$ref": "common_types.json#/$defs/DynamicString", + "description": "The default/fallback string (used for general plural cases)." + } + }, + "required": ["value", "other"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "string" + } }, - "returnType": { - "const": "void" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "and": { - "type": "object", - "description": "Performs a logical AND operation on a list of boolean values.", - "properties": { - "call": { - "const": "and" - }, - "args": { - "type": "object", - "properties": { - "values": { - "type": "array", - "description": "The list of boolean values to evaluate.", - "items": { - "$ref": "common_types.json#/$defs/DynamicBoolean" - }, - "minItems": 2 - } - }, - "required": [ - "values" - ], - "unevaluatedProperties": false + "openUrl": { + "type": "object", + "description": "Opens the specified URL in a browser or handler. This function has no return value.", + "properties": { + "call": { + "const": "openUrl" + }, + "args": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "description": "The URL to open." + } + }, + "required": ["url"], + "additionalProperties": false + }, + "returnType": { + "const": "void" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "or": { - "type": "object", - "description": "Performs a logical OR operation on a list of boolean values.", - "properties": { - "call": { - "const": "or" - }, - "args": { - "type": "object", - "properties": { - "values": { - "type": "array", - "description": "The list of boolean values to evaluate.", - "items": { - "$ref": "common_types.json#/$defs/DynamicBoolean" - }, - "minItems": 2 - } - }, - "required": [ - "values" - ], - "unevaluatedProperties": false + "and": { + "type": "object", + "description": "Performs a logical AND operation on a list of boolean values.", + "properties": { + "call": { + "const": "and" + }, + "args": { + "type": "object", + "properties": { + "values": { + "type": "array", + "description": "The list of boolean values to evaluate.", + "items": { + "$ref": "common_types.json#/$defs/DynamicBoolean" + }, + "minItems": 2 + } + }, + "required": ["values"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - }, - "not": { - "type": "object", - "description": "Performs a logical NOT operation on a boolean value.", - "properties": { - "call": { - "const": "not" - }, - "args": { - "type": "object", - "properties": { - "value": { - "$ref": "common_types.json#/$defs/DynamicBoolean", - "description": "The boolean value to negate." - } - }, - "required": [ - "value" - ], - "unevaluatedProperties": false + "or": { + "type": "object", + "description": "Performs a logical OR operation on a list of boolean values.", + "properties": { + "call": { + "const": "or" + }, + "args": { + "type": "object", + "properties": { + "values": { + "type": "array", + "description": "The list of boolean values to evaluate.", + "items": { + "$ref": "common_types.json#/$defs/DynamicBoolean" + }, + "minItems": 2 + } + }, + "required": ["values"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } }, - "returnType": { - "const": "boolean" - } + "required": ["call", "args"], + "unevaluatedProperties": false }, - "required": [ - "call", - "args" - ], - "unevaluatedProperties": false - } -}, -"theme": { - "primaryColor": { - "type": "string", - "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - }, - "iconUrl": { - "type": "string", - "format": "uri", - "description": "A URL for an image that identifies the agent or tool associated with the surface." - }, - "agentDisplayName": { - "type": "string", - "description": "Text to be displayed next to the surface to identify the agent or tool that created it." - } -}, -"$defs": { - "CatalogComponentCommon": { - "type": "object", - "properties": { - "weight": { - "type": "number", - "description": "The relative weight of this component within a Row or Column. This is similar to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." - } + "not": { + "type": "object", + "description": "Performs a logical NOT operation on a boolean value.", + "properties": { + "call": { + "const": "not" + }, + "args": { + "type": "object", + "properties": { + "value": { + "$ref": "common_types.json#/$defs/DynamicBoolean", + "description": "The boolean value to negate." + } + }, + "required": ["value"], + "unevaluatedProperties": false + }, + "returnType": { + "const": "boolean" + } + }, + "required": ["call", "args"], + "unevaluatedProperties": false } }, - "anyComponent": { - "oneOf": [ - { - "$ref": "#/components/Text" - }, - { - "$ref": "#/components/Image" - }, - { - "$ref": "#/components/Icon" - }, - { - "$ref": "#/components/Video" - }, - { - "$ref": "#/components/AudioPlayer" - }, - { - "$ref": "#/components/Row" - }, - { - "$ref": "#/components/Column" - }, - { - "$ref": "#/components/List" - }, - { - "$ref": "#/components/Card" - }, - { - "$ref": "#/components/Tabs" - }, - { - "$ref": "#/components/Modal" - }, - { - "$ref": "#/components/Divider" - }, - { - "$ref": "#/components/Button" - }, - { - "$ref": "#/components/TextField" - }, - { - "$ref": "#/components/CheckBox" - }, - { - "$ref": "#/components/ChoicePicker" - }, - { - "$ref": "#/components/Slider" - }, - { - "$ref": "#/components/DateTimeInput" - } - ], - "discriminator": { - "propertyName": "component" + "theme": { + "primaryColor": { + "type": "string", + "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", + "pattern": "^#[0-9a-fA-F]{6}$" + }, + "iconUrl": { + "type": "string", + "format": "uri", + "description": "A URL for an image that identifies the agent or tool associated with the surface." + }, + "agentDisplayName": { + "type": "string", + "description": "Text to be displayed next to the surface to identify the agent or tool that created it." } }, - "anyFunction": { - "oneOf": [ - { - "$ref": "#/functions/required" - }, - { - "$ref": "#/functions/regex" - }, - { - "$ref": "#/functions/length" - }, - { - "$ref": "#/functions/numeric" - }, - { - "$ref": "#/functions/email" - }, - { - "$ref": "#/functions/formatString" - }, - { - "$ref": "#/functions/formatNumber" - }, - { - "$ref": "#/functions/formatCurrency" - }, - { - "$ref": "#/functions/formatDate" - }, - { - "$ref": "#/functions/pluralize" - }, - { - "$ref": "#/functions/openUrl" - }, - { - "$ref": "#/functions/and" - }, - { - "$ref": "#/functions/or" - }, - { - "$ref": "#/functions/not" + "$defs": { + "CatalogComponentCommon": { + "type": "object", + "properties": { + "weight": { + "type": "number", + "description": "The relative weight of this component within a Row or Column. This is similar to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." + } + } + }, + "anyComponent": { + "oneOf": [ + { + "$ref": "#/components/Text" + }, + { + "$ref": "#/components/Image" + }, + { + "$ref": "#/components/Icon" + }, + { + "$ref": "#/components/Video" + }, + { + "$ref": "#/components/AudioPlayer" + }, + { + "$ref": "#/components/Row" + }, + { + "$ref": "#/components/Column" + }, + { + "$ref": "#/components/List" + }, + { + "$ref": "#/components/Card" + }, + { + "$ref": "#/components/Tabs" + }, + { + "$ref": "#/components/Modal" + }, + { + "$ref": "#/components/Divider" + }, + { + "$ref": "#/components/Button" + }, + { + "$ref": "#/components/TextField" + }, + { + "$ref": "#/components/CheckBox" + }, + { + "$ref": "#/components/ChoicePicker" + }, + { + "$ref": "#/components/Slider" + }, + { + "$ref": "#/components/DateTimeInput" + } + ], + "discriminator": { + "propertyName": "component" } - ] + }, + "anyFunction": { + "oneOf": [ + { + "$ref": "#/functions/required" + }, + { + "$ref": "#/functions/regex" + }, + { + "$ref": "#/functions/length" + }, + { + "$ref": "#/functions/numeric" + }, + { + "$ref": "#/functions/email" + }, + { + "$ref": "#/functions/formatString" + }, + { + "$ref": "#/functions/formatNumber" + }, + { + "$ref": "#/functions/formatCurrency" + }, + { + "$ref": "#/functions/formatDate" + }, + { + "$ref": "#/functions/pluralize" + }, + { + "$ref": "#/functions/openUrl" + }, + { + "$ref": "#/functions/and" + }, + { + "$ref": "#/functions/or" + }, + { + "$ref": "#/functions/not" + } + ] + } } } -} \ No newline at end of file From df09168bf33e72fe8c5a159fb9ede17cdeaa898a Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Tue, 10 Feb 2026 10:40:27 -0800 Subject: [PATCH 40/65] Fix Quickstart script (#611) --- samples/personalized_learning/quickstart_setup.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/samples/personalized_learning/quickstart_setup.sh b/samples/personalized_learning/quickstart_setup.sh index eed432849..cc7d04d81 100755 --- a/samples/personalized_learning/quickstart_setup.sh +++ b/samples/personalized_learning/quickstart_setup.sh @@ -135,9 +135,7 @@ echo " OpenStax bucket: gs://${OPENSTAX_BUCKET}" # Step 6: Upload learner context echo -e "${YELLOW}[6/6]${NC} Uploading learner context files..." -# Note: Using -o flag to disable multiprocessing on macOS to avoid Python multiprocessing issues -gcloud storage cp learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || \ - gcloud storage cp learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null || true +gcloud storage cp learner_context/*.txt "gs://${CONTEXT_BUCKET}/learner_context/" 2>/dev/null|| true echo " Learner context uploaded to gs://${CONTEXT_BUCKET}/learner_context/" # Get project number for .env From 2e7a7a07fd973d00b412d6b07dc429d818bdfbc2 Mon Sep 17 00:00:00 2001 From: sugoi-yuzuru <75597583+sugoi-yuzuru@users.noreply.github.com> Date: Wed, 11 Feb 2026 14:55:11 -0500 Subject: [PATCH 41/65] =?UTF-8?q?refactor:=20Add=20`declare`=20decorator?= =?UTF-8?q?=20to=20Interfaces=20and=20Types=20that=20need=20t=E2=80=A6=20(?= =?UTF-8?q?#616)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- renderers/web_core/src/v0_8/types/types.ts | 124 ++++++++++----------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/renderers/web_core/src/v0_8/types/types.ts b/renderers/web_core/src/v0_8/types/types.ts index 1e1f6686c..723dd9ea1 100644 --- a/renderers/web_core/src/v0_8/types/types.ts +++ b/renderers/web_core/src/v0_8/types/types.ts @@ -62,7 +62,7 @@ export type MessageProcessor = { resolvePath(path: string, dataContextPath?: string): string; }; -export type Theme = { +export declare type Theme = { components: { AudioPlayer: Record; Button: Record; @@ -197,7 +197,7 @@ export type Theme = { /** * Represents a user-initiated action, sent from the client to the server. */ -export interface UserAction { +export declare interface UserAction { /** * The name of the action, taken from the component's `action.action` * property. @@ -221,7 +221,7 @@ export interface UserAction { } /** A recursive type for any valid JSON-like value in the data model. */ -export type DataValue = +export declare type DataValue = | string | number | boolean @@ -229,24 +229,24 @@ export type DataValue = | DataMap | DataObject | DataArray; -export type DataObject = { [key: string]: DataValue }; -export type DataMap = Map; -export type DataArray = DataValue[]; +export declare type DataObject = { [key: string]: DataValue }; +export declare type DataMap = Map; +export declare type DataArray = DataValue[]; /** A template for creating components from a list in the data model. */ -export interface ComponentArrayTemplate { +export declare interface ComponentArrayTemplate { componentId: string; dataBinding: string; } /** Defines a list of child components, either explicitly or via a template. */ -export interface ComponentArrayReference { +export declare interface ComponentArrayReference { explicitList?: string[]; template?: ComponentArrayTemplate; } /** Represents the general shape of a component's properties. */ -export type ComponentProperties = { +export declare type ComponentProperties = { // Allow any property, but define known structural ones for type safety. children?: ComponentArrayReference; child?: string; @@ -254,31 +254,31 @@ export type ComponentProperties = { }; /** A raw component instance from a SurfaceUpdate message. */ -export interface ComponentInstance { +export declare interface ComponentInstance { id: string; weight?: number; component?: ComponentProperties; } -export interface BeginRenderingMessage { +export declare interface BeginRenderingMessage { surfaceId: string; root: string; styles?: Record; } -export interface SurfaceUpdateMessage { +export declare interface SurfaceUpdateMessage { surfaceId: string; components: ComponentInstance[]; } -export interface DataModelUpdate { +export declare interface DataModelUpdate { surfaceId: string; path?: string; contents: ValueMap[]; } // ValueMap is a type of DataObject for passing to the data model. -export type ValueMap = DataObject & { +export declare type ValueMap = DataObject & { key: string; /** May be JSON */ valueString?: string; @@ -287,11 +287,11 @@ export type ValueMap = DataObject & { valueMap?: ValueMap[]; }; -export interface DeleteSurfaceMessage { +export declare interface DeleteSurfaceMessage { surfaceId: string; } -export interface ServerToClientMessage { +export declare interface ServerToClientMessage { beginRendering?: BeginRenderingMessage; surfaceUpdate?: SurfaceUpdateMessage; dataModelUpdate?: DataModelUpdate; @@ -302,7 +302,7 @@ export interface ServerToClientMessage { * A recursive type for any value that can appear within a resolved component * tree. This is the main type that makes the recursive resolution possible. */ -export type ResolvedValue = +export declare type ResolvedValue = | string | number | boolean @@ -312,10 +312,10 @@ export type ResolvedValue = | ResolvedArray; /** A generic map where each value has been recursively resolved. */ -export type ResolvedMap = { [key: string]: ResolvedValue }; +export declare type ResolvedMap = { [key: string]: ResolvedValue }; /** A generic array where each item has been recursively resolved. */ -export type ResolvedArray = ResolvedValue[]; +export declare type ResolvedArray = ResolvedValue[]; /** * A base interface that all component nodes share. @@ -327,97 +327,97 @@ interface BaseComponentNode { slotName?: string; } -export interface TextNode extends BaseComponentNode { +export declare interface TextNode extends BaseComponentNode { type: "Text"; properties: ResolvedText; } -export interface ImageNode extends BaseComponentNode { +export declare interface ImageNode extends BaseComponentNode { type: "Image"; properties: ResolvedImage; } -export interface IconNode extends BaseComponentNode { +export declare interface IconNode extends BaseComponentNode { type: "Icon"; properties: ResolvedIcon; } -export interface VideoNode extends BaseComponentNode { +export declare interface VideoNode extends BaseComponentNode { type: "Video"; properties: ResolvedVideo; } -export interface AudioPlayerNode extends BaseComponentNode { +export declare interface AudioPlayerNode extends BaseComponentNode { type: "AudioPlayer"; properties: ResolvedAudioPlayer; } -export interface RowNode extends BaseComponentNode { +export declare interface RowNode extends BaseComponentNode { type: "Row"; properties: ResolvedRow; } -export interface ColumnNode extends BaseComponentNode { +export declare interface ColumnNode extends BaseComponentNode { type: "Column"; properties: ResolvedColumn; } -export interface ListNode extends BaseComponentNode { +export declare interface ListNode extends BaseComponentNode { type: "List"; properties: ResolvedList; } -export interface CardNode extends BaseComponentNode { +export declare interface CardNode extends BaseComponentNode { type: "Card"; properties: ResolvedCard; } -export interface TabsNode extends BaseComponentNode { +export declare interface TabsNode extends BaseComponentNode { type: "Tabs"; properties: ResolvedTabs; } -export interface DividerNode extends BaseComponentNode { +export declare interface DividerNode extends BaseComponentNode { type: "Divider"; properties: ResolvedDivider; } -export interface ModalNode extends BaseComponentNode { +export declare interface ModalNode extends BaseComponentNode { type: "Modal"; properties: ResolvedModal; } -export interface ButtonNode extends BaseComponentNode { +export declare interface ButtonNode extends BaseComponentNode { type: "Button"; properties: ResolvedButton; } -export interface CheckboxNode extends BaseComponentNode { +export declare interface CheckboxNode extends BaseComponentNode { type: "CheckBox"; properties: ResolvedCheckbox; } -export interface TextFieldNode extends BaseComponentNode { +export declare interface TextFieldNode extends BaseComponentNode { type: "TextField"; properties: ResolvedTextField; } -export interface DateTimeInputNode extends BaseComponentNode { +export declare interface DateTimeInputNode extends BaseComponentNode { type: "DateTimeInput"; properties: ResolvedDateTimeInput; } -export interface MultipleChoiceNode extends BaseComponentNode { +export declare interface MultipleChoiceNode extends BaseComponentNode { type: "MultipleChoice"; properties: ResolvedMultipleChoice; } -export interface SliderNode extends BaseComponentNode { +export declare interface SliderNode extends BaseComponentNode { type: "Slider"; properties: ResolvedSlider; } -export interface CustomNode extends BaseComponentNode { +export declare interface CustomNode extends BaseComponentNode { type: string; // For custom nodes, properties are just a map of string keys to any resolved value. properties: CustomNodeProperties; @@ -427,7 +427,7 @@ export interface CustomNode extends BaseComponentNode { * The complete discriminated union of all possible resolved component nodes. * A renderer would use this type for any given node in the component tree. */ -export type AnyComponentNode = +export declare type AnyComponentNode = | TextNode | IconNode | ImageNode @@ -450,19 +450,19 @@ export type AnyComponentNode = // These components do not contain other components can reuse their // original interfaces. -export type ResolvedText = Text; -export type ResolvedIcon = Icon; -export type ResolvedImage = Image; -export type ResolvedVideo = Video; -export type ResolvedAudioPlayer = AudioPlayer; -export type ResolvedDivider = Divider; -export type ResolvedCheckbox = Checkbox; -export type ResolvedTextField = TextField; -export type ResolvedDateTimeInput = DateTimeInput; -export type ResolvedMultipleChoice = MultipleChoice; -export type ResolvedSlider = Slider; - -export interface ResolvedRow { +export declare type ResolvedText = Text; +export declare type ResolvedIcon = Icon; +export declare type ResolvedImage = Image; +export declare type ResolvedVideo = Video; +export declare type ResolvedAudioPlayer = AudioPlayer; +export declare type ResolvedDivider = Divider; +export declare type ResolvedCheckbox = Checkbox; +export declare type ResolvedTextField = TextField; +export declare type ResolvedDateTimeInput = DateTimeInput; +export declare type ResolvedMultipleChoice = MultipleChoice; +export declare type ResolvedSlider = Slider; + +export declare interface ResolvedRow { children: AnyComponentNode[]; distribution?: | "start" @@ -474,7 +474,7 @@ export interface ResolvedRow { alignment?: "start" | "center" | "end" | "stretch"; } -export interface ResolvedColumn { +export declare interface ResolvedColumn { children: AnyComponentNode[]; distribution?: | "start" @@ -486,44 +486,44 @@ export interface ResolvedColumn { alignment?: "start" | "center" | "end" | "stretch"; } -export interface ResolvedButton { +export declare interface ResolvedButton { child: AnyComponentNode; action: Button["action"]; } -export interface ResolvedList { +export declare interface ResolvedList { children: AnyComponentNode[]; direction?: "vertical" | "horizontal"; alignment?: "start" | "center" | "end" | "stretch"; } -export interface ResolvedCard { +export declare interface ResolvedCard { child: AnyComponentNode; children: AnyComponentNode[]; } -export interface ResolvedTabItem { +export declare interface ResolvedTabItem { title: StringValue; child: AnyComponentNode; } -export interface ResolvedTabs { +export declare interface ResolvedTabs { tabItems: ResolvedTabItem[]; } -export interface ResolvedModal { +export declare interface ResolvedModal { entryPointChild: AnyComponentNode; contentChild: AnyComponentNode; } -export interface CustomNodeProperties { +export declare interface CustomNodeProperties { [k: string]: ResolvedValue; } -export type SurfaceID = string; +export declare type SurfaceID = string; /** The complete state of a single UI surface. */ -export interface Surface { +export declare interface Surface { rootComponentId: string | null; componentTree: AnyComponentNode | null; dataModel: DataMap; From 667350ac0b1215cd1a1acd93a93789fe0ab9b8d5 Mon Sep 17 00:00:00 2001 From: sugoi-yuzuru <75597583+sugoi-yuzuru@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:08:03 -0500 Subject: [PATCH 42/65] feat: Add `declare` keyword to exported interfaces `StringValue`, `NumberValue`, and `BooleanValue`. (#617) --- renderers/web_core/src/v0_8/types/primitives.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/renderers/web_core/src/v0_8/types/primitives.ts b/renderers/web_core/src/v0_8/types/primitives.ts index cf7ca3552..e50cd590b 100644 --- a/renderers/web_core/src/v0_8/types/primitives.ts +++ b/renderers/web_core/src/v0_8/types/primitives.ts @@ -14,7 +14,7 @@ limitations under the License. */ -export interface StringValue { +export declare interface StringValue { /** * A data binding reference to a location in the data model (e.g., '/user/name'). */ @@ -29,7 +29,7 @@ export interface StringValue { literal?: string; } -export interface NumberValue { +export declare interface NumberValue { /** * A data binding reference to a location in the data model (e.g., '/user/name'). */ @@ -44,7 +44,7 @@ export interface NumberValue { literal?: number; } -export interface BooleanValue { +export declare interface BooleanValue { /** * A data binding reference to a location in the data model (e.g., '/user/name'). */ From 6e4457b0500d6667e8635be44e33ef4dc48e64fd Mon Sep 17 00:00:00 2001 From: jacobsimionato Date: Thu, 12 Feb 2026 10:58:40 +1030 Subject: [PATCH 43/65] Add CODEOWNERS file (#618) --- .github/CODEOWNERS | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..604847d48 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,35 @@ +# CODEOWNERS file +# +# It allows us to define individuals or teams that are responsible for code in the repository. +# +# Syntax: +# pattern owner1 owner2 +# +# The pattern is a glob pattern relative to the root of the repository. +# Owners can be: +# - A GitHub username (e.g., @octocat) +# - An organization team (e.g., @org/team-name) +# - An email address (e.g., octocat@github.com) + +# Default ownership (is overriden by specfic rules below) +* @dmandar @gspencer @jacobsimionato + +# Agents +/a2a_agents/ @nan-yu @dmandar + +# Documentation +/docs/ @zeroasterisk @dmandar @gspencer @jacobsimionato + +# Renderers +/renderers/angular/ @ditman @ava-cassiopeia @crisbeto +/renderers/lit/ @ditman @ava-cassiopeia @paullewis +/renderers/web_core/ @ditman @ava-cassiopeia + +# Samples +/samples/ @dmandar @zeroasterisk + +# Specifications +/specification/ @gspencergoog @jacobsimionato + +# Tools +/tools/ @dmandar @jacobsimionato @paullewis From 7d08d727fcc4d728af1e851dd0cbb837eef4b9a5 Mon Sep 17 00:00:00 2001 From: Rajhans Jadhao Date: Thu, 12 Feb 2026 20:08:31 +0530 Subject: [PATCH 44/65] fix: month value picked as zero-based value (#477) --- renderers/lit/src/0.8/ui/datetime-input.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderers/lit/src/0.8/ui/datetime-input.ts b/renderers/lit/src/0.8/ui/datetime-input.ts index e7b6171c8..289b43907 100644 --- a/renderers/lit/src/0.8/ui/datetime-input.ts +++ b/renderers/lit/src/0.8/ui/datetime-input.ts @@ -134,7 +134,7 @@ export class DateTimeInput extends Root { } const year = this.#padNumber(date.getFullYear()); - const month = this.#padNumber(date.getMonth()); + const month = this.#padNumber(date.getMonth() + 1); const day = this.#padNumber(date.getDate()); const hours = this.#padNumber(date.getHours()); const minutes = this.#padNumber(date.getMinutes()); From e45c9f0af2c302be59531ca17e7510e048d8874b Mon Sep 17 00:00:00 2001 From: jacobsimionato Date: Fri, 13 Feb 2026 08:06:59 +1030 Subject: [PATCH 45/65] Refactor theme validation to use catalog schema reference (#621) --- specification/v0_10/docs/a2ui_protocol.md | 4 +- .../v0_10/json/server_to_client.json | 5 +- .../v0_10/json/standard_catalog.json | 36 ++++++----- .../v0_10/test/cases/theme_validation.json | 63 +++++++++++++++++++ specification/v0_9/docs/a2ui_protocol.md | 4 +- specification/v0_9/json/server_to_client.json | 5 +- specification/v0_9/json/standard_catalog.json | 36 ++++++----- .../v0_9/test/cases/theme_validation.json | 63 +++++++++++++++++++ 8 files changed, 174 insertions(+), 42 deletions(-) create mode 100644 specification/v0_10/test/cases/theme_validation.json create mode 100644 specification/v0_9/test/cases/theme_validation.json diff --git a/specification/v0_10/docs/a2ui_protocol.md b/specification/v0_10/docs/a2ui_protocol.md index 52da38a9c..75220cd87 100644 --- a/specification/v0_10/docs/a2ui_protocol.md +++ b/specification/v0_10/docs/a2ui_protocol.md @@ -137,11 +137,11 @@ The [`server_to_client.json`] schema is the top-level entry point. Every message ### The Standard Catalog -The [`standard_catalog.json`] schema contains the definitions for all specific UI components (e.g., `Text`, `Button`, `Row`) and functions (e.g., `required`, `email`). +The [`standard_catalog.json`] schema contains the definitions for all specific UI components (e.g., `Text`, `Button`, `Row`), functions (e.g., `required`, `email`), and the theme schema. **Swappable Catalogs & Validation:** -The [`server_to_client.json`] envelope schema is designed to be catalog-agnostic. It references components using a placeholder filename: `catalog.json` (specifically `$ref: "catalog.json#/$defs/anyComponent"`). +The [`server_to_client.json`] envelope schema is designed to be catalog-agnostic. It references components and themes using a placeholder filename: `catalog.json` (specifically `$ref: "catalog.json#/$defs/anyComponent"` and `$ref: "catalog.json#/$defs/theme"`). To validate A2UI messages: diff --git a/specification/v0_10/json/server_to_client.json b/specification/v0_10/json/server_to_client.json index 835786fb5..9e393c18f 100644 --- a/specification/v0_10/json/server_to_client.json +++ b/specification/v0_10/json/server_to_client.json @@ -30,9 +30,8 @@ "type": "string" }, "theme": { - "type": "object", - "description": "Initial theme parameters for the surface (e.g., {'primaryColor': '#FF0000'}). These must validate against the 'theme' schema defined in the catalog.", - "additionalProperties": true + "$ref": "catalog.json#/$defs/theme", + "description": "Initial theme parameters for the surface (e.g., {'primaryColor': '#FF0000'}). These must validate against the 'theme' schema defined in the catalog." }, "sendDataModel": { "type": "boolean", diff --git a/specification/v0_10/json/standard_catalog.json b/specification/v0_10/json/standard_catalog.json index 076f9ef69..7e297300a 100644 --- a/specification/v0_10/json/standard_catalog.json +++ b/specification/v0_10/json/standard_catalog.json @@ -1065,22 +1065,6 @@ "unevaluatedProperties": false } }, - "theme": { - "primaryColor": { - "type": "string", - "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - }, - "iconUrl": { - "type": "string", - "format": "uri", - "description": "A URL for an image that identifies the agent or tool associated with the surface." - }, - "agentDisplayName": { - "type": "string", - "description": "Text to be displayed next to the surface to identify the agent or tool that created it." - } - }, "$defs": { "CatalogComponentCommon": { "type": "object", @@ -1091,6 +1075,26 @@ } } }, + "theme": { + "type": "object", + "properties": { + "primaryColor": { + "type": "string", + "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", + "pattern": "^#[0-9a-fA-F]{6}$" + }, + "iconUrl": { + "type": "string", + "format": "uri", + "description": "A URL for an image that identifies the agent or tool associated with the surface." + }, + "agentDisplayName": { + "type": "string", + "description": "Text to be displayed next to the surface to identify the agent or tool that created it." + } + }, + "additionalProperties": true + }, "anyComponent": { "oneOf": [ { "$ref": "#/components/Text" }, diff --git a/specification/v0_10/test/cases/theme_validation.json b/specification/v0_10/test/cases/theme_validation.json new file mode 100644 index 000000000..4a01bce5e --- /dev/null +++ b/specification/v0_10/test/cases/theme_validation.json @@ -0,0 +1,63 @@ +{ + "schema": "server_to_client.json", + "tests": [ + { + "description": "Valid theme in createSurface", + "valid": true, + "data": { + "version": "v0.10", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_10/standard_catalog.json", + "theme": { + "primaryColor": "#00BFFF", + "agentDisplayName": "Test Agent" + } + } + } + }, + { + "description": "Invalid theme property (wrong type)", + "valid": false, + "data": { + "version": "v0.10", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_10/standard_catalog.json", + "theme": { + "primaryColor": 123 + } + } + } + }, + { + "description": "Invalid theme property (invalid hex color)", + "valid": false, + "data": { + "version": "v0.10", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_10/standard_catalog.json", + "theme": { + "primaryColor": "invalid-color" + } + } + } + }, + { + "description": "Additional theme properties are allowed", + "valid": true, + "data": { + "version": "v0.10", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_10/standard_catalog.json", + "theme": { + "primaryColor": "#00BFFF", + "customProperty": "customValue" + } + } + } + } + ] +} diff --git a/specification/v0_9/docs/a2ui_protocol.md b/specification/v0_9/docs/a2ui_protocol.md index 910be0e4d..fca2262ba 100644 --- a/specification/v0_9/docs/a2ui_protocol.md +++ b/specification/v0_9/docs/a2ui_protocol.md @@ -142,11 +142,11 @@ The [`server_to_client.json`] schema is the top-level entry point. Every message ### The Standard Catalog -The [`standard_catalog.json`] schema contains the definitions for all specific UI components (e.g., `Text`, `Button`, `Row`) and functions (e.g., `required`, `email`). +The [`standard_catalog.json`] schema contains the definitions for all specific UI components (e.g., `Text`, `Button`, `Row`), functions (e.g., `required`, `email`), and the theme schema. **Swappable Catalogs & Validation:** -The [`server_to_client.json`] envelope schema is designed to be catalog-agnostic. It references components using a placeholder filename: `catalog.json` (specifically `$ref: "catalog.json#/$defs/anyComponent"`). +The [`server_to_client.json`] envelope schema is designed to be catalog-agnostic. It references components and themes using a placeholder filename: `catalog.json` (specifically `$ref: "catalog.json#/$defs/anyComponent"` and `$ref: "catalog.json#/$defs/theme"`). To validate A2UI messages: diff --git a/specification/v0_9/json/server_to_client.json b/specification/v0_9/json/server_to_client.json index 3ae124216..921e4168a 100644 --- a/specification/v0_9/json/server_to_client.json +++ b/specification/v0_9/json/server_to_client.json @@ -30,9 +30,8 @@ "type": "string" }, "theme": { - "type": "object", - "description": "Initial theme parameters for the surface (e.g., {'primaryColor': '#FF0000'}). These must validate against the 'theme' schema defined in the catalog.", - "additionalProperties": true + "$ref": "catalog.json#/$defs/theme", + "description": "Theme parameters for the surface (e.g., {'primaryColor': '#FF0000'}). These must validate against the 'theme' schema defined in the catalog." }, "sendDataModel": { "type": "boolean", diff --git a/specification/v0_9/json/standard_catalog.json b/specification/v0_9/json/standard_catalog.json index 575ed2f36..32c780dec 100644 --- a/specification/v0_9/json/standard_catalog.json +++ b/specification/v0_9/json/standard_catalog.json @@ -1224,22 +1224,6 @@ "unevaluatedProperties": false } }, - "theme": { - "primaryColor": { - "type": "string", - "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - }, - "iconUrl": { - "type": "string", - "format": "uri", - "description": "A URL for an image that identifies the agent or tool associated with the surface." - }, - "agentDisplayName": { - "type": "string", - "description": "Text to be displayed next to the surface to identify the agent or tool that created it." - } - }, "$defs": { "CatalogComponentCommon": { "type": "object", @@ -1250,6 +1234,26 @@ } } }, + "theme": { + "type": "object", + "properties": { + "primaryColor": { + "type": "string", + "description": "The primary brand color used for highlights (e.g., primary buttons, active borders). Renderers may generate variants of this color for different contexts. Format: Hexadecimal code (e.g., '#00BFFF').", + "pattern": "^#[0-9a-fA-F]{6}$" + }, + "iconUrl": { + "type": "string", + "format": "uri", + "description": "A URL for an image that identifies the agent or tool associated with the surface." + }, + "agentDisplayName": { + "type": "string", + "description": "Text to be displayed next to the surface to identify the agent or tool that created it." + } + }, + "additionalProperties": true + }, "anyComponent": { "oneOf": [ { diff --git a/specification/v0_9/test/cases/theme_validation.json b/specification/v0_9/test/cases/theme_validation.json new file mode 100644 index 000000000..bc56f1fa1 --- /dev/null +++ b/specification/v0_9/test/cases/theme_validation.json @@ -0,0 +1,63 @@ +{ + "schema": "server_to_client.json", + "tests": [ + { + "description": "Valid theme in createSurface", + "valid": true, + "data": { + "version": "v0.9", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_9/standard_catalog.json", + "theme": { + "primaryColor": "#00BFFF", + "agentDisplayName": "Test Agent" + } + } + } + }, + { + "description": "Invalid theme property (wrong type)", + "valid": false, + "data": { + "version": "v0.9", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_9/standard_catalog.json", + "theme": { + "primaryColor": 123 + } + } + } + }, + { + "description": "Invalid theme property (invalid hex color)", + "valid": false, + "data": { + "version": "v0.9", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_9/standard_catalog.json", + "theme": { + "primaryColor": "invalid-color" + } + } + } + }, + { + "description": "Additional theme properties are allowed", + "valid": true, + "data": { + "version": "v0.9", + "createSurface": { + "surfaceId": "test_surface", + "catalogId": "https://a2ui.org/specification/v0_9/standard_catalog.json", + "theme": { + "primaryColor": "#00BFFF", + "customProperty": "customValue" + } + } + } + } + ] +} From 08d40d66aac0951f89528fe34e31910adf973b3b Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 19:02:52 +0000 Subject: [PATCH 46/65] docs: simplify convert_docs.py to uni-directional conversion (#564) The bi-directional support was initially implemented to migrate existing *.md files from MkDocs admonitions to GitHub-flavored markdown. With the migration complete, the reverse transformation is no longer needed. A uni-directional flow (GitHub -> MkDocs) is cleaner and sufficient for the build pipeline. It also adds a README.md file to explain what the scripts do. --- .github/workflows/docs.yml | 2 +- docs/scripts/README.md | 39 ++++++++++++++ docs/scripts/convert_docs.py | 47 +++-------------- docs/scripts/test_convert_docs.py | 86 ++++++++++++------------------- 4 files changed, 80 insertions(+), 94 deletions(-) create mode 100644 docs/scripts/README.md diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 32d9edefc..2a79b9bb1 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -83,7 +83,7 @@ jobs: done - name: Convert Admonitions in Documentation - run: python docs/scripts/convert_docs.py --mode github-to-mkdocs + run: python docs/scripts/convert_docs.py - name: Build Documentation (PR Check) if: github.event_name == 'pull_request' diff --git a/docs/scripts/README.md b/docs/scripts/README.md new file mode 100644 index 000000000..5ff9ff1e8 --- /dev/null +++ b/docs/scripts/README.md @@ -0,0 +1,39 @@ +# Documentation Transformation Scripts + +This directory contains utility scripts to prepare our documentation for the **MkDocs** build process. + +## Purpose + +To ensure a great reading experience both on GitHub and the hosted site, we use **GitHub-flavored Markdown** as our primary source of truth. This script transforms GitHub's native syntax into **MkDocs-compatible syntax** (specifically for the `pymdown-extensions`) during the build pipeline. + +## Supported Conversions (Uni-directional) + +The script performs a uni-directional transformation: **GitHub Markdown → MkDocs Syntax**. + +### Alert/Admonition Conversion + +- GitHub uses a blockquote-based syntax for alerts. +- MkDocs requires the `!!!` or `???` syntax to render colored callout boxes. + +## Running the Conversion + +The conversion is run as part of the build pipeline. No additional steps are required. If you need to run the conversion manually, you can run the `convert_docs.py` script in the repository root. + +```bash +python docs/scripts/convert_docs.py +``` + +### Example + +- **Source (GitHub-flavored Markdown):** + ```markdown + > ⚠️ **Attention** + > + > This is an alert. + ``` + +- **Target (MkDocs Syntax):** + ```markdown + !!! warning "Attention" + This is an alert. + ``` diff --git a/docs/scripts/convert_docs.py b/docs/scripts/convert_docs.py index d117521c9..df0d9cf9d 100644 --- a/docs/scripts/convert_docs.py +++ b/docs/scripts/convert_docs.py @@ -88,57 +88,24 @@ def alert_replacer(match): content = re.sub(GITHUB_ALERT_PATTERN, alert_replacer, content, flags=re.MULTILINE) return content -def to_github(content): - """Converts MkDocs style to GitHub style.""" - - def mkdocs_replacer(match): - adm_type, title, body = match.groups() - # Safely retrieve the emoji, default to 'note' (📝) for unknown/unmapped types - emoji = MAPPING.get(adm_type, {"emoji": "📝"})["emoji"] - - # Strip trailing whitespace from captured body to prevent hanging '>' - clean_body = body.rstrip() - raw_lines = clean_body.split('\n') - content_lines = [re.sub(r'^\s{4}', '', line).rstrip() for line in raw_lines] - - # Header line logic - github_lines = [f"> {emoji} **{title}**"] if title.strip() else [f"> {emoji}"] - github_lines.append(">") # Spacer line - - for line in content_lines: - github_lines.append(f"> {line}" if line else ">") - - return "\n".join(github_lines) + "\n" - - return re.sub(MKDOCS_PATTERN, mkdocs_replacer, content) - -def process_file(path, mode): - mode_map = { - "github-to-mkdocs": to_mkdocs, - "mkdocs-to-github": to_github - } - if mode not in mode_map: - raise ValueError(f"Unsupported mode: {mode}. Choose from {list(mode_map.keys())}.") - target_func = mode_map[mode] - +def process_file(path): with open(path, 'r', encoding='utf-8') as f: content = f.read() - new_content = target_func(content) + new_content = to_mkdocs(content) if new_content != content: with open(path, 'w', encoding='utf-8') as f: f.write(new_content) - print(f"[{mode.upper()}] Converted: {path}") + print(f"[CONVERTED] {path}") -def run_conversion(mode): +def run_conversion(): for root, dirs, files in os.walk('docs'): if any(x in root for x in ['scripts', 'assets', '__pycache__']): continue for file in files: if file.endswith('.md'): - process_file(os.path.join(root, file), mode) + process_file(os.path.join(root, file)) if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Bidirectional Markdown Admonition Converter") - parser.add_argument("--mode", choices=["github-to-mkdocs", "mkdocs-to-github"], required=True, help="Target format") + parser = argparse.ArgumentParser(description="GitHub to MkDocs Markdown Admonition Converter") args = parser.parse_args() - run_conversion(args.mode) + run_conversion() diff --git a/docs/scripts/test_convert_docs.py b/docs/scripts/test_convert_docs.py index 51b97694f..2cfcd1fb8 100644 --- a/docs/scripts/test_convert_docs.py +++ b/docs/scripts/test_convert_docs.py @@ -1,47 +1,39 @@ import pytest -from convert_docs import to_mkdocs, to_github +from convert_docs import to_mkdocs # --- 1. A2UI Specific Header Cases --- ADMONITION_CASES = [ - ('!!! info "Coming soon..."', "Coming soon..."), - ('!!! warning "Status: Early Stage Public Preview"', "Status: Early Stage Public Preview"), - ('!!! success "Stable Release"', "Stable Release"), - ('!!! note "Version Compatibility"', "Version Compatibility"), - ('!!! warning "Attention"', "Attention"), - ('!!! tip "It\'s Just JSON"', "It's Just JSON"), + ('!!! info "Coming soon..."', "Coming soon...", "ℹ️"), + ('!!! warning "Status: Early Stage Public Preview"', "Status: Early Stage Public Preview", "⚠️"), + ('!!! success "Stable Release"', "Stable Release", "✅"), + ('!!! note "Version Compatibility"', "Version Compatibility", "📝"), + ('!!! warning "Attention"', "Attention", "⚠️"), + ('!!! tip "It\'s Just JSON"', "It's Just JSON", "💡"), ] -@pytest.mark.parametrize("header, expected_title", ADMONITION_CASES) -def test_standard_a2ui_round_trip(header, expected_title): - """Verifies that all standard A2UI headers survive a round-trip conversion.""" +@pytest.mark.parametrize("expected_header, title, emoji", ADMONITION_CASES) +def test_standard_a2ui_conversion(expected_header, title, emoji): + """Verifies that GitHub style converts to expected A2UI headers.""" body = " Line 1\n Line 2" - original = f"{header}\n{body}\n" + github_input = f"> {emoji} **{title}**\n>\n> Line 1\n> Line 2\n" - # MkDocs -> GitHub - github = to_github(original) - assert f"**{expected_title}**" in github + expected = f"{expected_header}\n{body}\n" # GitHub -> MkDocs - back = to_mkdocs(github) - assert back.strip() == original.strip() + result = to_mkdocs(github_input) + assert result.strip() == expected.strip() # --- 2. Empty Title Edge Case --- def test_empty_title_case(): """ - Verifies !!! tip "" converts to '> 💡' exactly. - - No trailing spaces - - No bold markers (****) + Verifies '> 💡' converts to !!! tip "". """ - original = '!!! tip ""\n Content.\n' - github = to_github(original) + github_input = "> 💡\n>\n> Content.\n" + expected = '!!! tip ""\n Content.\n' - lines = github.splitlines() - assert lines[0] == "> 💡" # Strictly no space or bold markers - assert lines[1] == ">" # Spacer line - - back = to_mkdocs(github) - assert back == original + result = to_mkdocs(github_input) + assert result == expected # --- 3. Spacing & Internal Paragraph Preservation --- @@ -73,49 +65,37 @@ def test_paragraph_spacing_and_trailing_lines(): assert result == expected -# --- 4. Unmapped/Unknown Type Fallback --- -def test_unknown_type_fallback(): - """ - Verifies that an unknown admonition type defaults to the 'note' emoji (📝). - """ - original = '!!! mystery "Secret"\n Content.\n' - github = to_github(original) - - assert "> 📝 **Secret**" in github - - # Note: Round trip will convert it back to '!!! note' - # because the source type 'mystery' wasn't in the map. - back = to_mkdocs(github) - assert '!!! note "Secret"' in back - - -# --- 5. Multiple Blocks & Isolation --- +# --- 4. Multiple Blocks & Isolation --- def test_multiple_blocks_in_one_file(): """Ensures multiple blocks are processed without bleeding into each other.""" - original = ( + github_input = ( + '> ✅ **Block 1**\n' + '> Content 1\n' + '\n' + '> ℹ️ **Block 2**\n' + '> Content 2\n' + ) + + expected = ( '!!! success "Block 1"\n' ' Content 1\n' '\n' '!!! info "Block 2"\n' ' Content 2\n' ) - github = to_github(original) - assert "> ✅ **Block 1**" in github - assert "> ℹ️ **Block 2**" in github - back = to_mkdocs(github) - assert back == original + result = to_mkdocs(github_input) + assert result == expected -# --- 6. False Positive Prevention --- +# --- 5. False Positive Prevention --- def test_regular_blockquote_ignored(): """Ensures regular quotes are not touched.""" source = "> This is just a quote, not an admonition." assert to_mkdocs(source) == source - assert to_github(source) == source -# --- 7. GitHub Official Alert Syntax Support --- +# --- 6. GitHub Official Alert Syntax Support --- def test_github_alert_to_mkdocs(): """Verifies official [!TYPE] syntax conversion.""" source = "> [!WARNING]\n> **Security Notice**\n> Do not share keys." From 6d5d8e84e23155af2c607a4512f789debb6df4a5 Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 19:09:47 +0000 Subject: [PATCH 47/65] Check the python format for adk samples (#560) It also reformats the adk python samples using `uv run pyink .`. No functional changes. --- .github/workflows/python_samples_build.yml | 4 + .../agent/adk/component_gallery/__main__.py | 130 +- .../adk/component_gallery/a2ui_schema.py | 4 +- samples/agent/adk/component_gallery/agent.py | 130 +- .../adk/component_gallery/agent_executor.py | 181 +- .../adk/component_gallery/gallery_examples.py | 789 ++--- samples/agent/adk/component_gallery/tools.py | 1 - samples/agent/adk/contact_lookup/__main__.py | 132 +- .../agent/adk/contact_lookup/a2ui_schema.py | 4 +- samples/agent/adk/contact_lookup/agent.py | 465 ++- .../adk/contact_lookup/agent_executor.py | 322 +- .../adk/contact_lookup/prompt_builder.py | 48 +- samples/agent/adk/contact_lookup/tools.py | 70 +- .../adk/contact_multiple_surfaces/__main__.py | 132 +- .../a2ui_examples.py | 143 +- .../contact_multiple_surfaces/a2ui_schema.py | 4 +- .../adk/contact_multiple_surfaces/agent.py | 608 ++-- .../agent_executor.py | 376 +-- .../prompt_builder.py | 51 +- .../adk/contact_multiple_surfaces/tools.py | 80 +- samples/agent/adk/mcp/__main__.py | 2 +- samples/agent/adk/mcp/server.py | 249 +- samples/agent/adk/orchestrator/__main__.py | 79 +- samples/agent/adk/orchestrator/agent.py | 374 ++- .../agent/adk/orchestrator/agent_executor.py | 207 +- .../agent/adk/orchestrator/part_converters.py | 52 +- .../orchestrator/subagent_route_manager.py | 14 +- samples/agent/adk/pyproject.toml | 19 + .../agent/adk/restaurant_finder/__main__.py | 129 +- samples/agent/adk/restaurant_finder/agent.py | 474 ++- .../adk/restaurant_finder/agent_executor.py | 302 +- .../adk/restaurant_finder/prompt_builder.py | 58 +- samples/agent/adk/restaurant_finder/tools.py | 68 +- samples/agent/adk/rizzcharts/__main__.py | 151 +- samples/agent/adk/rizzcharts/agent.py | 232 +- .../agent/adk/rizzcharts/agent_executor.py | 268 +- .../rizzcharts/component_catalog_builder.py | 126 +- samples/agent/adk/rizzcharts/tools.py | 154 +- samples/agent/adk/uv.lock | 2673 +++++++++-------- 39 files changed, 4863 insertions(+), 4442 deletions(-) diff --git a/.github/workflows/python_samples_build.yml b/.github/workflows/python_samples_build.yml index 172adeecc..d18b5b0db 100644 --- a/.github/workflows/python_samples_build.yml +++ b/.github/workflows/python_samples_build.yml @@ -45,6 +45,10 @@ jobs: python -m pip install --upgrade pip pip install uv + - name: Check Formatting + working-directory: samples/agent/adk + run: uv run pyink --check . + - name: Build contact_lookup working-directory: samples/agent/adk/contact_lookup run: uv build . diff --git a/samples/agent/adk/component_gallery/__main__.py b/samples/agent/adk/component_gallery/__main__.py index 347adbb6f..836c4eea8 100644 --- a/samples/agent/adk/component_gallery/__main__.py +++ b/samples/agent/adk/component_gallery/__main__.py @@ -1,5 +1,5 @@ - """Main entry point for the Component Gallery agent.""" + import logging import os import sys @@ -29,72 +29,74 @@ logger = logging.getLogger(__name__) + @click.command() @click.option("--host", default="localhost") @click.option("--port", default=10005) def main(host, port): - try: - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], - ) - - # Skill definition - skill = AgentSkill( - id="component_gallery", - name="Component Gallery", - description="Demonstrates A2UI components.", - tags=["gallery", "demo"], - examples=["Show me the gallery"], - ) - - base_url = f"http://{host}:{port}" - - agent_card = AgentCard( - name="Component Gallery Agent", - description="A2UI Component Gallery", - url=base_url, - version="0.0.1", - default_input_modes=["text"], - default_output_modes=["text"], - capabilities=capabilities, - skills=[skill], - ) - - agent_executor = ComponentGalleryExecutor(base_url=base_url) - - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - - server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler - ) - - app = server.build() - - app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:5173"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - # Mount assets directory - assets_dir = os.path.join(os.path.dirname(__file__), "assets") - if os.path.exists(assets_dir): - app.mount("/assets", StaticFiles(directory=assets_dir), name="assets") - else: - logger.warning(f"Assets directory not found at {assets_dir}") - - print(f"Starting Component Gallery Agent on port {port}...") - uvicorn.run(app, host=host, port=port) - - except Exception as e: - logger.error(f"An error occurred during server startup: {e}") - exit(1) + try: + capabilities = AgentCapabilities( + streaming=True, + extensions=[get_a2ui_agent_extension()], + ) + + # Skill definition + skill = AgentSkill( + id="component_gallery", + name="Component Gallery", + description="Demonstrates A2UI components.", + tags=["gallery", "demo"], + examples=["Show me the gallery"], + ) + + base_url = f"http://{host}:{port}" + + agent_card = AgentCard( + name="Component Gallery Agent", + description="A2UI Component Gallery", + url=base_url, + version="0.0.1", + default_input_modes=["text"], + default_output_modes=["text"], + capabilities=capabilities, + skills=[skill], + ) + + agent_executor = ComponentGalleryExecutor(base_url=base_url) + + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + + server = A2AStarletteApplication( + agent_card=agent_card, http_handler=request_handler + ) + + app = server.build() + + app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:5173"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + # Mount assets directory + assets_dir = os.path.join(os.path.dirname(__file__), "assets") + if os.path.exists(assets_dir): + app.mount("/assets", StaticFiles(directory=assets_dir), name="assets") + else: + logger.warning(f"Assets directory not found at {assets_dir}") + + print(f"Starting Component Gallery Agent on port {port}...") + uvicorn.run(app, host=host, port=port) + + except Exception as e: + logger.error(f"An error occurred during server startup: {e}") + exit(1) + if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/component_gallery/a2ui_schema.py b/samples/agent/adk/component_gallery/a2ui_schema.py index f4c776d80..29c72d1d8 100644 --- a/samples/agent/adk/component_gallery/a2ui_schema.py +++ b/samples/agent/adk/component_gallery/a2ui_schema.py @@ -15,7 +15,7 @@ # a2ui_schema.py -A2UI_SCHEMA = r''' +A2UI_SCHEMA = r""" { "title": "A2UI Message Schema", "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", @@ -789,4 +789,4 @@ } } } -''' +""" diff --git a/samples/agent/adk/component_gallery/agent.py b/samples/agent/adk/component_gallery/agent.py index d772df76a..0a17e4ec6 100644 --- a/samples/agent/adk/component_gallery/agent.py +++ b/samples/agent/adk/component_gallery/agent.py @@ -1,5 +1,5 @@ - """Agent logic for the Component Gallery.""" + import logging import json from collections.abc import AsyncIterable @@ -12,69 +12,67 @@ logger = logging.getLogger(__name__) + class ComponentGalleryAgent: - """An agent that displays a component gallery.""" - - def __init__(self, base_url: str): - self.base_url = base_url - - async def stream(self, query: str, session_id: str) -> AsyncIterable[dict[str, Any]]: - """Streams the gallery or responses to actions.""" - - logger.info(f"Stream called with query: {query}") - - # Initial Load or Reset - if "WHO_ARE_YOU" in query or "START" in query: # Simple trigger for initial load - gallery_json = get_gallery_json() - yield { - "is_task_complete": True, - "payload": { - "text": "Here is the component gallery.", - "json_string": gallery_json - } - } - return - - # Handle Actions - if query.startswith("ACTION:"): - action_name = query - # Create a response update for the second surface - - # Simulate network/processing delay - await asyncio.sleep(0.5) - - timestamp = datetime.datetime.now().strftime("%H:%M:%S") - - response_update = [ - { - "surfaceUpdate": { - "surfaceId": "response-surface", - "components": [ - { - "id": "response-text", - "component": { - "Text": { "text": { "literalString": f"Agent Processed Action: {action_name} at {timestamp}" } } - } - } - ] - } - } - ] - - - yield { - "is_task_complete": True, - "payload": { - "text": "Action processed.", - "json_data": response_update - } - } - return - - # Fallback for text - yield { - "is_task_complete": True, - "payload": { - "text": "I am the Component Gallery Agent." - } - } + """An agent that displays a component gallery.""" + + def __init__(self, base_url: str): + self.base_url = base_url + + async def stream(self, query: str, session_id: str) -> AsyncIterable[dict[str, Any]]: + """Streams the gallery or responses to actions.""" + + logger.info(f"Stream called with query: {query}") + + # Initial Load or Reset + if "WHO_ARE_YOU" in query or "START" in query: # Simple trigger for initial load + gallery_json = get_gallery_json() + yield { + "is_task_complete": True, + "payload": { + "text": "Here is the component gallery.", + "json_string": gallery_json, + }, + } + return + + # Handle Actions + if query.startswith("ACTION:"): + action_name = query + # Create a response update for the second surface + + # Simulate network/processing delay + await asyncio.sleep(0.5) + + timestamp = datetime.datetime.now().strftime("%H:%M:%S") + + response_update = [{ + "surfaceUpdate": { + "surfaceId": "response-surface", + "components": [{ + "id": "response-text", + "component": { + "Text": { + "text": { + "literalString": ( + f"Agent Processed Action: {action_name} at" + f" {timestamp}" + ) + } + } + }, + }], + } + }] + + yield { + "is_task_complete": True, + "payload": {"text": "Action processed.", "json_data": response_update}, + } + return + + # Fallback for text + yield { + "is_task_complete": True, + "payload": {"text": "I am the Component Gallery Agent."}, + } diff --git a/samples/agent/adk/component_gallery/agent_executor.py b/samples/agent/adk/component_gallery/agent_executor.py index 332e2c983..9e6b9c4c9 100644 --- a/samples/agent/adk/component_gallery/agent_executor.py +++ b/samples/agent/adk/component_gallery/agent_executor.py @@ -1,105 +1,102 @@ - """Agent executor for Component Gallery.""" + import logging import json from a2a.server.agent_execution import AgentExecutor, RequestContext from a2a.server.events import EventQueue from a2a.server.tasks import TaskUpdater -from a2a.types import ( - DataPart, - Part, - TaskState, - TextPart -) +from a2a.types import (DataPart, Part, TaskState, TextPart) from a2a.utils import new_agent_parts_message, new_task from agent import ComponentGalleryAgent from a2ui.extension.a2ui_extension import create_a2ui_part, try_activate_a2ui_extension logger = logging.getLogger(__name__) + class ComponentGalleryExecutor(AgentExecutor): - def __init__(self, base_url: str): - self.agent = ComponentGalleryAgent(base_url=base_url) - - async def execute(self, context: RequestContext, event_queue: EventQueue) -> None: - query = "START" # Default start - ui_event_part = None - - try_activate_a2ui_extension(context) - - if context.message and context.message.parts: - for part in context.message.parts: - if isinstance(part.root, DataPart): - if "userAction" in part.root.data: - ui_event_part = part.root.data["userAction"] - elif "request" in part.root.data: - query = part.root.data["request"] - elif isinstance(part.root, TextPart): - # If user says something, might want to handle it, but for now defaults to START usually for initial connection - if part.root.text: - query = part.root.text - - if ui_event_part: - action = ui_event_part.get("name") - ctx = ui_event_part.get("context", {}) - query = f"ACTION: {action} with {ctx}" - - task = context.current_task - if not task: - task = new_task(context.message) - await event_queue.enqueue_event(task) - - updater = TaskUpdater(event_queue, task.id, task.context_id) - - async for item in self.agent.stream(query, task.context_id): - final_parts = [] - - if "payload" in item: - payload = item["payload"] - text = payload.get("text") - if text: - final_parts.append(Part(root=TextPart(text=text))) - - json_data = payload.get("json_data") - json_string = payload.get("json_string") - - if json_string: - try: - json_data = json.loads(json_string) - except Exception as e: - logger.error(f"Failed to parse JSON string: {e}") - - if json_data: - if isinstance(json_data, list): - for msg in json_data: - final_parts.append(create_a2ui_part(msg)) - else: - final_parts.append(create_a2ui_part(json_data)) - else: - content = item.get("content", "") - if "---a2ui_JSON---" in content: - text_content, json_string = content.split("---a2ui_JSON---", 1) - if text_content.strip(): - final_parts.append(Part(root=TextPart(text=text_content.strip()))) - - if json_string.strip(): - try: - json_data = json.loads(json_string.strip()) - if isinstance(json_data, list): - for msg in json_data: - final_parts.append(create_a2ui_part(msg)) - else: - final_parts.append(create_a2ui_part(json_data)) - except Exception as e: - logger.error(f"Failed to parse JSON: {e}") - elif content: - final_parts.append(Part(root=TextPart(text=content))) - - await updater.update_status( - TaskState.completed, - new_agent_parts_message(final_parts, task.context_id, task.id), - final=True - ) - - async def cancel(self, request, event_queue): - pass + + def __init__(self, base_url: str): + self.agent = ComponentGalleryAgent(base_url=base_url) + + async def execute(self, context: RequestContext, event_queue: EventQueue) -> None: + query = "START" # Default start + ui_event_part = None + + try_activate_a2ui_extension(context) + + if context.message and context.message.parts: + for part in context.message.parts: + if isinstance(part.root, DataPart): + if "userAction" in part.root.data: + ui_event_part = part.root.data["userAction"] + elif "request" in part.root.data: + query = part.root.data["request"] + elif isinstance(part.root, TextPart): + # If user says something, might want to handle it, but for now defaults to START usually for initial connection + if part.root.text: + query = part.root.text + + if ui_event_part: + action = ui_event_part.get("name") + ctx = ui_event_part.get("context", {}) + query = f"ACTION: {action} with {ctx}" + + task = context.current_task + if not task: + task = new_task(context.message) + await event_queue.enqueue_event(task) + + updater = TaskUpdater(event_queue, task.id, task.context_id) + + async for item in self.agent.stream(query, task.context_id): + final_parts = [] + + if "payload" in item: + payload = item["payload"] + text = payload.get("text") + if text: + final_parts.append(Part(root=TextPart(text=text))) + + json_data = payload.get("json_data") + json_string = payload.get("json_string") + + if json_string: + try: + json_data = json.loads(json_string) + except Exception as e: + logger.error(f"Failed to parse JSON string: {e}") + + if json_data: + if isinstance(json_data, list): + for msg in json_data: + final_parts.append(create_a2ui_part(msg)) + else: + final_parts.append(create_a2ui_part(json_data)) + else: + content = item.get("content", "") + if "---a2ui_JSON---" in content: + text_content, json_string = content.split("---a2ui_JSON---", 1) + if text_content.strip(): + final_parts.append(Part(root=TextPart(text=text_content.strip()))) + + if json_string.strip(): + try: + json_data = json.loads(json_string.strip()) + if isinstance(json_data, list): + for msg in json_data: + final_parts.append(create_a2ui_part(msg)) + else: + final_parts.append(create_a2ui_part(json_data)) + except Exception as e: + logger.error(f"Failed to parse JSON: {e}") + elif content: + final_parts.append(Part(root=TextPart(text=content))) + + await updater.update_status( + TaskState.completed, + new_agent_parts_message(final_parts, task.context_id, task.id), + final=True, + ) + + async def cancel(self, request, event_queue): + pass diff --git a/samples/agent/adk/component_gallery/gallery_examples.py b/samples/agent/adk/component_gallery/gallery_examples.py index 18630ea4f..8ea8b31f7 100644 --- a/samples/agent/adk/component_gallery/gallery_examples.py +++ b/samples/agent/adk/component_gallery/gallery_examples.py @@ -1,374 +1,467 @@ - """Defines the Component Gallery 'Kitchen Sink' example.""" + import json + def get_gallery_json() -> str: - """Returns the JSON structure for the Component Gallery surfaces.""" - - messages = [] - - # Common Data Model - # We use a single global data model for simplicity across all demo surfaces. - # Common Data Model Content - # We define the content here and inject it into EACH surface so they all share the same initial state. - gallery_data_content = { - "key": "galleryData", - "valueMap": [ - { "key": "textField", "valueString": "Hello World" }, - { "key": "checkbox", "valueBoolean": False }, - { "key": "checkboxChecked", "valueBoolean": True }, - { "key": "slider", "valueNumber": 30 }, - { "key": "date", "valueString": "2025-10-26" }, - { "key": "favorites", "valueMap": [ - { "key": "0", "valueString": "A" } - ]}, - { "key": "favoritesChips", "valueMap": [] }, - { "key": "favoritesFilter", "valueMap": [] } - ] - } + """Returns the JSON structure for the Component Gallery surfaces.""" - # Helper to create a surface for a single component - def add_demo_surface(surface_id, component_def): - root_id = f"{surface_id}-root" - - components = [] - components.append({ - "id": root_id, - "component": component_def - }) - - messages.append({ "beginRendering": { "surfaceId": surface_id, "root": root_id } }) - messages.append({ "surfaceUpdate": { "surfaceId": surface_id, "components": components } }) - - # Inject data model for this surface - messages.append({ - "dataModelUpdate": { - "surfaceId": surface_id, - "contents": [gallery_data_content] - } - }) + messages = [] - # 1. TextField - add_demo_surface("demo-text", { - "TextField": { - "label": { "literalString": "Enter some text" }, - "text": { "path": "galleryData/textField" } - } - }) + # Common Data Model + # We use a single global data model for simplicity across all demo surfaces. + # Common Data Model Content + # We define the content here and inject it into EACH surface so they all share the same initial state. + gallery_data_content = { + "key": "galleryData", + "valueMap": [ + {"key": "textField", "valueString": "Hello World"}, + {"key": "checkbox", "valueBoolean": False}, + {"key": "checkboxChecked", "valueBoolean": True}, + {"key": "slider", "valueNumber": 30}, + {"key": "date", "valueString": "2025-10-26"}, + {"key": "favorites", "valueMap": [{"key": "0", "valueString": "A"}]}, + {"key": "favoritesChips", "valueMap": []}, + {"key": "favoritesFilter", "valueMap": []}, + ], + } - # 1b. TextField (Regex) - add_demo_surface("demo-text-regex", { - "TextField": { - "label": { "literalString": "Enter exactly 5 digits" }, - "text": { "path": "galleryData/textFieldRegex" }, - "validationRegexp": "^\\d{5}$" - } - }) + # Helper to create a surface for a single component + def add_demo_surface(surface_id, component_def): + root_id = f"{surface_id}-root" - # 2. CheckBox - add_demo_surface("demo-checkbox", { - "CheckBox": { - "label": { "literalString": "Toggle me" }, - "value": { "path": "galleryData/checkbox" } - } - }) + components = [] + components.append({"id": root_id, "component": component_def}) - # 3. Slider - add_demo_surface("demo-slider", { - "Slider": { - "value": { "path": "galleryData/slider" }, - "minValue": 0, - "maxValue": 100 - } - }) + messages.append({"beginRendering": {"surfaceId": surface_id, "root": root_id}}) + messages.append( + {"surfaceUpdate": {"surfaceId": surface_id, "components": components}} + ) - # 4. DateTimeInput - add_demo_surface("demo-date", { - "DateTimeInput": { - "value": { "path": "galleryData/date" }, - "enableDate": True - } + # Inject data model for this surface + messages.append({ + "dataModelUpdate": {"surfaceId": surface_id, "contents": [gallery_data_content]} }) - # 5. MultipleChoice (Default) - add_demo_surface("demo-multichoice", { - "MultipleChoice": { - "selections": { "path": "galleryData/favorites" }, - "options": [ - { "label": { "literalString": "Apple" }, "value": "A" }, - { "label": { "literalString": "Banana" }, "value": "B" }, - { "label": { "literalString": "Cherry" }, "value": "C" } - ] - } - }) + # 1. TextField + add_demo_surface( + "demo-text", + { + "TextField": { + "label": {"literalString": "Enter some text"}, + "text": {"path": "galleryData/textField"}, + } + }, + ) - # 5b. MultipleChoice (Chips) - add_demo_surface("demo-multichoice-chips", { - "MultipleChoice": { - "selections": { "path": "galleryData/favoritesChips" }, - "description": "Select tags (Chips)", - "variant": "chips", - "options": [ - { "label": { "literalString": "Work" }, "value": "work" }, - { "label": { "literalString": "Home" }, "value": "home" }, - { "label": { "literalString": "Urgent" }, "value": "urgent" }, - { "label": { "literalString": "Later" }, "value": "later" } - ] - } - }) + # 1b. TextField (Regex) + add_demo_surface( + "demo-text-regex", + { + "TextField": { + "label": {"literalString": "Enter exactly 5 digits"}, + "text": {"path": "galleryData/textFieldRegex"}, + "validationRegexp": "^\\d{5}$", + } + }, + ) - # 5c. MultipleChoice (Filterable) - add_demo_surface("demo-multichoice-filter", { - "MultipleChoice": { - "selections": { "path": "galleryData/favoritesFilter" }, - "description": "Select countries (Filterable)", - "filterable": True, - "options": [ - { "label": { "literalString": "United States" }, "value": "US" }, - { "label": { "literalString": "Canada" }, "value": "CA" }, - { "label": { "literalString": "United Kingdom" }, "value": "UK" }, - { "label": { "literalString": "Australia" }, "value": "AU" }, - { "label": { "literalString": "Germany" }, "value": "DE" }, - { "label": { "literalString": "France" }, "value": "FR" }, - { "label": { "literalString": "Japan" }, "value": "JP" } - ] - } - }) + # 2. CheckBox + add_demo_surface( + "demo-checkbox", + { + "CheckBox": { + "label": {"literalString": "Toggle me"}, + "value": {"path": "galleryData/checkbox"}, + } + }, + ) - # 6. Image - add_demo_surface("demo-image", { - "Image": { - "url": { "literalString": "http://localhost:10005/assets/a2ui.png" }, - "usageHint": "mediumFeature" - } - }) + # 3. Slider + add_demo_surface( + "demo-slider", + { + "Slider": { + "value": {"path": "galleryData/slider"}, + "minValue": 0, + "maxValue": 100, + } + }, + ) - # 7. Button - # Button needs a child Text component. - button_surface_id = "demo-button" - btn_root_id = "demo-button-root" - btn_text_id = "demo-button-text" - - messages.append({ "beginRendering": { "surfaceId": button_surface_id, "root": btn_root_id } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": button_surface_id, - "components": [ - { - "id": btn_text_id, - "component": { "Text": { "text": { "literalString": "Trigger Action" } } } - }, - { - "id": btn_root_id, - "component": { - "Button": { - "child": btn_text_id, - "primary": True, - "action": { - "name": "custom_action", - "context": [ - { "key": "info", "value": { "literalString": "Custom Button Clicked" } } - ] - } - } - } - } - ] - } - }) + # 4. DateTimeInput + add_demo_surface( + "demo-date", + {"DateTimeInput": {"value": {"path": "galleryData/date"}, "enableDate": True}}, + ) - # 8. Tabs - tabs_surface_id = "demo-tabs" - tabs_root_id = "demo-tabs-root" - tab1_id = "tab-1-content" - tab2_id = "tab-2-content" + # 5. MultipleChoice (Default) + add_demo_surface( + "demo-multichoice", + { + "MultipleChoice": { + "selections": {"path": "galleryData/favorites"}, + "options": [ + {"label": {"literalString": "Apple"}, "value": "A"}, + {"label": {"literalString": "Banana"}, "value": "B"}, + {"label": {"literalString": "Cherry"}, "value": "C"}, + ], + } + }, + ) - messages.append({ "beginRendering": { "surfaceId": tabs_surface_id, "root": tabs_root_id } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": tabs_surface_id, - "components": [ - { - "id": tab1_id, - "component": { "Text": { "text": { "literalString": "First Tab Content" } } } - }, - { - "id": tab2_id, - "component": { "Text": { "text": { "literalString": "Second Tab Content" } } } - }, - { - "id": tabs_root_id, - "component": { - "Tabs": { - "tabItems": [ - { "title": { "literalString": "View One" }, "child": tab1_id }, - { "title": { "literalString": "View Two" }, "child": tab2_id } - ] - } - } - } - ] - } - }) + # 5b. MultipleChoice (Chips) + add_demo_surface( + "demo-multichoice-chips", + { + "MultipleChoice": { + "selections": {"path": "galleryData/favoritesChips"}, + "description": "Select tags (Chips)", + "variant": "chips", + "options": [ + {"label": {"literalString": "Work"}, "value": "work"}, + {"label": {"literalString": "Home"}, "value": "home"}, + {"label": {"literalString": "Urgent"}, "value": "urgent"}, + {"label": {"literalString": "Later"}, "value": "later"}, + ], + } + }, + ) - # 9. Icon - icon_surface_id = "demo-icon" - messages.append({ "beginRendering": { "surfaceId": icon_surface_id, "root": "icon-root" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": icon_surface_id, - "components": [ - { - "id": "icon-root", - "component": { - "Row": { - "children": { "explicitList": ["icon-1", "icon-2", "icon-3"] }, - "distribution": "spaceEvenly", - "alignment": "center" - } - } - }, - { "id": "icon-1", "component": { "Icon": { "name": { "literalString": "star" } } } }, - { "id": "icon-2", "component": { "Icon": { "name": { "literalString": "home" } } } }, - { "id": "icon-3", "component": { "Icon": { "name": { "literalString": "settings" } } } } - ] - } - }) + # 5c. MultipleChoice (Filterable) + add_demo_surface( + "demo-multichoice-filter", + { + "MultipleChoice": { + "selections": {"path": "galleryData/favoritesFilter"}, + "description": "Select countries (Filterable)", + "filterable": True, + "options": [ + {"label": {"literalString": "United States"}, "value": "US"}, + {"label": {"literalString": "Canada"}, "value": "CA"}, + {"label": {"literalString": "United Kingdom"}, "value": "UK"}, + {"label": {"literalString": "Australia"}, "value": "AU"}, + {"label": {"literalString": "Germany"}, "value": "DE"}, + {"label": {"literalString": "France"}, "value": "FR"}, + {"label": {"literalString": "Japan"}, "value": "JP"}, + ], + } + }, + ) - # 10. Divider - div_surface_id = "demo-divider" - messages.append({ "beginRendering": { "surfaceId": div_surface_id, "root": "div-root" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": div_surface_id, - "components": [ - { - "id": "div-root", - "component": { - "Column": { - "children": { "explicitList": ["div-text-1", "div-horiz", "div-text-2"] }, - "distribution": "start", - "alignment": "stretch" - } - } - }, - { "id": "div-text-1", "component": { "Text": { "text": { "literalString": "Above Divider" } } } }, - { "id": "div-horiz", "component": { "Divider": { "axis": "horizontal" } } }, - { "id": "div-text-2", "component": { "Text": { "text": { "literalString": "Below Divider" } } } } - ] - } - }) + # 6. Image + add_demo_surface( + "demo-image", + { + "Image": { + "url": {"literalString": "http://localhost:10005/assets/a2ui.png"}, + "usageHint": "mediumFeature", + } + }, + ) - # 11. Card - card_surface_id = "demo-card" - messages.append({ "beginRendering": { "surfaceId": card_surface_id, "root": "card-root" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": card_surface_id, - "components": [ - { - "id": "card-root", - "component": { - "Card": { - "child": "card-text" - } - } - }, - { "id": "card-text", "component": { "Text": { "text": { "literalString": "I am inside a Card" } } } } - ] - } - }) + # 7. Button + # Button needs a child Text component. + button_surface_id = "demo-button" + btn_root_id = "demo-button-root" + btn_text_id = "demo-button-text" - # 12. Video - add_demo_surface("demo-video", { - "Video": { - # Still external as user only provided audio and image - "url": { "literalString": "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" } - } - }) + messages.append( + {"beginRendering": {"surfaceId": button_surface_id, "root": btn_root_id}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": button_surface_id, + "components": [ + { + "id": btn_text_id, + "component": {"Text": {"text": {"literalString": "Trigger Action"}}}, + }, + { + "id": btn_root_id, + "component": { + "Button": { + "child": btn_text_id, + "primary": True, + "action": { + "name": "custom_action", + "context": [{ + "key": "info", + "value": {"literalString": "Custom Button Clicked"}, + }], + }, + } + }, + }, + ], + } + }) - # 13. Modal - # Modal needs an entry point (Button) and content. - modal_surface_id = "demo-modal" - messages.append({ "beginRendering": { "surfaceId": modal_surface_id, "root": "modal-root" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": modal_surface_id, - "components": [ - { - "id": "modal-root", - "component": { - "Modal": { - "entryPointChild": "modal-btn", - "contentChild": "modal-content" - } - } - }, - { - "id": "modal-btn", - "component": { - "Button": { - "child": "modal-btn-text", - "primary": False, - "action": { "name": "noop" } - } - } - }, - { "id": "modal-btn-text", "component": { "Text": { "text": { "literalString": "Open Modal" } } } }, - { - "id": "modal-content", - "component": { "Text": { "text": { "literalString": "This is the modal content!" } } } - } - ] - } - }) + # 8. Tabs + tabs_surface_id = "demo-tabs" + tabs_root_id = "demo-tabs-root" + tab1_id = "tab-1-content" + tab2_id = "tab-2-content" - # 14. List - list_surface_id = "demo-list" - messages.append({ "beginRendering": { "surfaceId": list_surface_id, "root": "list-root" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": list_surface_id, - "components": [ - { - "id": "list-root", - "component": { - "List": { - "children": { "explicitList": ["list-item-1", "list-item-2", "list-item-3"] }, - "direction": "vertical", - "alignment": "stretch" - } - } - }, - { "id": "list-item-1", "component": { "Text": { "text": { "literalString": "Item 1" } } } }, - { "id": "list-item-2", "component": { "Text": { "text": { "literalString": "Item 2" } } } }, - { "id": "list-item-3", "component": { "Text": { "text": { "literalString": "Item 3" } } } } - ] - } - }) + messages.append( + {"beginRendering": {"surfaceId": tabs_surface_id, "root": tabs_root_id}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": tabs_surface_id, + "components": [ + { + "id": tab1_id, + "component": { + "Text": {"text": {"literalString": "First Tab Content"}} + }, + }, + { + "id": tab2_id, + "component": { + "Text": {"text": {"literalString": "Second Tab Content"}} + }, + }, + { + "id": tabs_root_id, + "component": { + "Tabs": { + "tabItems": [ + { + "title": {"literalString": "View One"}, + "child": tab1_id, + }, + { + "title": {"literalString": "View Two"}, + "child": tab2_id, + }, + ] + } + }, + }, + ], + } + }) - # 15. AudioPlayer - add_demo_surface("demo-audio", { - "AudioPlayer": { - "url": { "literalString": "http://localhost:10005/assets/audio.mp3" }, - "description": { "literalString": "Local Audio Sample" } - } - }) + # 9. Icon + icon_surface_id = "demo-icon" + messages.append( + {"beginRendering": {"surfaceId": icon_surface_id, "root": "icon-root"}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": icon_surface_id, + "components": [ + { + "id": "icon-root", + "component": { + "Row": { + "children": {"explicitList": ["icon-1", "icon-2", "icon-3"]}, + "distribution": "spaceEvenly", + "alignment": "center", + } + }, + }, + { + "id": "icon-1", + "component": {"Icon": {"name": {"literalString": "star"}}}, + }, + { + "id": "icon-2", + "component": {"Icon": {"name": {"literalString": "home"}}}, + }, + { + "id": "icon-3", + "component": {"Icon": {"name": {"literalString": "settings"}}}, + }, + ], + } + }) - # Response Surface - messages.append({ "beginRendering": { "surfaceId": "response-surface", "root": "response-text" } }) - messages.append({ - "surfaceUpdate": { - "surfaceId": "response-surface", - "components": [ - { - "id": "response-text", - "component": { - "Text": { "text": { "literalString": "Interact with the gallery to see responses. This view is updated by the agent by relaying the raw action commands it received from the client" } } - } - } - ] - } - }) - - return json.dumps(messages, indent=2) + # 10. Divider + div_surface_id = "demo-divider" + messages.append({"beginRendering": {"surfaceId": div_surface_id, "root": "div-root"}}) + messages.append({ + "surfaceUpdate": { + "surfaceId": div_surface_id, + "components": [ + { + "id": "div-root", + "component": { + "Column": { + "children": { + "explicitList": ["div-text-1", "div-horiz", "div-text-2"] + }, + "distribution": "start", + "alignment": "stretch", + } + }, + }, + { + "id": "div-text-1", + "component": {"Text": {"text": {"literalString": "Above Divider"}}}, + }, + {"id": "div-horiz", "component": {"Divider": {"axis": "horizontal"}}}, + { + "id": "div-text-2", + "component": {"Text": {"text": {"literalString": "Below Divider"}}}, + }, + ], + } + }) + + # 11. Card + card_surface_id = "demo-card" + messages.append( + {"beginRendering": {"surfaceId": card_surface_id, "root": "card-root"}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": card_surface_id, + "components": [ + {"id": "card-root", "component": {"Card": {"child": "card-text"}}}, + { + "id": "card-text", + "component": { + "Text": {"text": {"literalString": "I am inside a Card"}} + }, + }, + ], + } + }) + + # 12. Video + add_demo_surface( + "demo-video", + { + "Video": { + # Still external as user only provided audio and image + "url": { + "literalString": ( + "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" + ) + } + } + }, + ) + + # 13. Modal + # Modal needs an entry point (Button) and content. + modal_surface_id = "demo-modal" + messages.append( + {"beginRendering": {"surfaceId": modal_surface_id, "root": "modal-root"}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": modal_surface_id, + "components": [ + { + "id": "modal-root", + "component": { + "Modal": { + "entryPointChild": "modal-btn", + "contentChild": "modal-content", + } + }, + }, + { + "id": "modal-btn", + "component": { + "Button": { + "child": "modal-btn-text", + "primary": False, + "action": {"name": "noop"}, + } + }, + }, + { + "id": "modal-btn-text", + "component": {"Text": {"text": {"literalString": "Open Modal"}}}, + }, + { + "id": "modal-content", + "component": { + "Text": {"text": {"literalString": "This is the modal content!"}} + }, + }, + ], + } + }) + + # 14. List + list_surface_id = "demo-list" + messages.append( + {"beginRendering": {"surfaceId": list_surface_id, "root": "list-root"}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": list_surface_id, + "components": [ + { + "id": "list-root", + "component": { + "List": { + "children": { + "explicitList": [ + "list-item-1", + "list-item-2", + "list-item-3", + ] + }, + "direction": "vertical", + "alignment": "stretch", + } + }, + }, + { + "id": "list-item-1", + "component": {"Text": {"text": {"literalString": "Item 1"}}}, + }, + { + "id": "list-item-2", + "component": {"Text": {"text": {"literalString": "Item 2"}}}, + }, + { + "id": "list-item-3", + "component": {"Text": {"text": {"literalString": "Item 3"}}}, + }, + ], + } + }) + + # 15. AudioPlayer + add_demo_surface( + "demo-audio", + { + "AudioPlayer": { + "url": {"literalString": "http://localhost:10005/assets/audio.mp3"}, + "description": {"literalString": "Local Audio Sample"}, + } + }, + ) + + # Response Surface + messages.append( + {"beginRendering": {"surfaceId": "response-surface", "root": "response-text"}} + ) + messages.append({ + "surfaceUpdate": { + "surfaceId": "response-surface", + "components": [{ + "id": "response-text", + "component": { + "Text": { + "text": { + "literalString": ( + "Interact with the gallery to see responses. This view is" + " updated by the agent by relaying the raw action" + " commands it received from the client" + ) + } + } + }, + }], + } + }) + + return json.dumps(messages, indent=2) diff --git a/samples/agent/adk/component_gallery/tools.py b/samples/agent/adk/component_gallery/tools.py index 0889380ce..be06c0482 100644 --- a/samples/agent/adk/component_gallery/tools.py +++ b/samples/agent/adk/component_gallery/tools.py @@ -1,2 +1 @@ - # Minimal tools.py diff --git a/samples/agent/adk/contact_lookup/__main__.py b/samples/agent/adk/contact_lookup/__main__.py index 713d4c312..13b76a9a1 100644 --- a/samples/agent/adk/contact_lookup/__main__.py +++ b/samples/agent/adk/contact_lookup/__main__.py @@ -34,77 +34,83 @@ class MissingAPIKeyError(Exception): - """Exception for missing API key.""" + """Exception for missing API key.""" @click.command() @click.option("--host", default="localhost") @click.option("--port", default=10003) def main(host, port): - try: - # Check for API key only if Vertex AI is not configured - if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": - if not os.getenv("GEMINI_API_KEY"): - raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI is not TRUE." - ) - - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], + try: + # Check for API key only if Vertex AI is not configured + if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": + if not os.getenv("GEMINI_API_KEY"): + raise MissingAPIKeyError( + "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" + " is not TRUE." ) - skill = AgentSkill( - id="find_contact", - name="Find Contact Tool", - description="Helps find contact information for colleagues (e.g., email, location, team).", - tags=["contact", "directory", "people", "finder"], - examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], - ) - - base_url = f"http://{host}:{port}" - - agent_card = AgentCard( - name="Contact Lookup Agent", - description="This agent helps find contact info for people in your organization.", - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) - - agent_executor = ContactAgentExecutor(base_url=base_url) - - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler - ) - import uvicorn - - app = server.build() - - app.add_middleware( - CORSMiddleware, - allow_origin_regex=r"http://localhost:\d+", - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - app.mount("/static", StaticFiles(directory="images"), name="static") - uvicorn.run(app, host=host, port=port) - except MissingAPIKeyError as e: - logger.error(f"Error: {e}") - exit(1) - except Exception as e: - logger.error(f"An error occurred during server startup: {e}") - exit(1) + capabilities = AgentCapabilities( + streaming=True, + extensions=[get_a2ui_agent_extension()], + ) + skill = AgentSkill( + id="find_contact", + name="Find Contact Tool", + description=( + "Helps find contact information for colleagues (e.g., email, location," + " team)." + ), + tags=["contact", "directory", "people", "finder"], + examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], + ) + + base_url = f"http://{host}:{port}" + + agent_card = AgentCard( + name="Contact Lookup Agent", + description=( + "This agent helps find contact info for people in your organization." + ), + url=base_url, # <-- Use base_url here + version="1.0.0", + default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) + + agent_executor = ContactAgentExecutor(base_url=base_url) + + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + server = A2AStarletteApplication( + agent_card=agent_card, http_handler=request_handler + ) + import uvicorn + + app = server.build() + + app.add_middleware( + CORSMiddleware, + allow_origin_regex=r"http://localhost:\d+", + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + app.mount("/static", StaticFiles(directory="images"), name="static") + + uvicorn.run(app, host=host, port=port) + except MissingAPIKeyError as e: + logger.error(f"Error: {e}") + exit(1) + except Exception as e: + logger.error(f"An error occurred during server startup: {e}") + exit(1) if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/contact_lookup/a2ui_schema.py b/samples/agent/adk/contact_lookup/a2ui_schema.py index 4b6038fdc..52ee845e7 100644 --- a/samples/agent/adk/contact_lookup/a2ui_schema.py +++ b/samples/agent/adk/contact_lookup/a2ui_schema.py @@ -15,7 +15,7 @@ # a2ui_schema.py -A2UI_SCHEMA = r''' +A2UI_SCHEMA = r""" { "title": "A2UI Message Schema", "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", @@ -785,4 +785,4 @@ } } } -''' +""" diff --git a/samples/agent/adk/contact_lookup/agent.py b/samples/agent/adk/contact_lookup/agent.py index d16b58a9e..9a09aaad0 100644 --- a/samples/agent/adk/contact_lookup/agent.py +++ b/samples/agent/adk/contact_lookup/agent.py @@ -31,7 +31,6 @@ from google.adk.sessions import InMemorySessionService from google.genai import types from prompt_builder import ( - get_text_prompt, get_ui_prompt, ) @@ -41,252 +40,250 @@ class ContactAgent: - """An agent that finds contact info for colleagues.""" - - SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] - - def __init__(self, base_url: str, use_ui: bool = False): - self.base_url = base_url - self.use_ui = use_ui - self._agent = self._build_agent(use_ui) - self._user_id = "remote_agent" - self._runner = Runner( - app_name=self._agent.name, - agent=self._agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), + """An agent that finds contact info for colleagues.""" + + SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] + + def __init__(self, base_url: str, use_ui: bool = False): + self.base_url = base_url + self.use_ui = use_ui + self._agent = self._build_agent(use_ui) + self._user_id = "remote_agent" + self._runner = Runner( + app_name=self._agent.name, + agent=self._agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + # --- MODIFICATION: Wrap the schema --- + # Load the A2UI_SCHEMA string into a Python object for validation + try: + # First, load the schema for a *single message* + single_message_schema = json.loads(A2UI_SCHEMA) + + # The prompt instructs the LLM to return a *list* of messages. + # Therefore, our validation schema must be an *array* of the single message schema. + self.a2ui_schema_object = {"type": "array", "items": single_message_schema} + logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") + except json.JSONDecodeError as e: + logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") + self.a2ui_schema_object = None + # --- END MODIFICATION --- + + def get_processing_message(self) -> str: + return "Looking up contact information..." + + def _build_agent(self, use_ui: bool) -> LlmAgent: + """Builds the LLM agent for the contact agent.""" + LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") + + if use_ui: + instruction = get_ui_prompt(self.base_url, CONTACT_UI_EXAMPLES) + else: + # The text prompt function also returns a complete prompt. + instruction = get_text_prompt() + + return LlmAgent( + model=LiteLlm(model=LITELLM_MODEL), + name="contact_agent", + description="An agent that finds colleague contact info.", + instruction=instruction, + tools=[get_contact_info], + ) + + async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: + session_state = {"base_url": self.base_url} + + session = await self._runner.session_service.get_session( + app_name=self._agent.name, + user_id=self._user_id, + session_id=session_id, + ) + if session is None: + session = await self._runner.session_service.create_session( + app_name=self._agent.name, + user_id=self._user_id, + state=session_state, + session_id=session_id, + ) + elif "base_url" not in session.state: + session.state["base_url"] = self.base_url + + # --- Begin: UI Validation and Retry Logic --- + max_retries = 1 # Total 2 attempts + attempt = 0 + current_query_text = query + + # Ensure schema was loaded + if self.use_ui and self.a2ui_schema_object is None: + logger.error( + "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " + "Cannot perform UI validation. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm facing an internal configuration error with my UI" + " components. Please contact support." + ), + } + return + + while attempt <= max_retries: + attempt += 1 + logger.info( + f"--- ContactAgent.stream: Attempt {attempt}/{max_retries + 1} " + f"for session {session_id} ---" + ) + + current_message = types.Content( + role="user", parts=[types.Part.from_text(text=current_query_text)] + ) + final_response_content = None + + async for event in self._runner.run_async( + user_id=self._user_id, + session_id=session.id, + new_message=current_message, + ): + logger.info(f"Event from runner: {event}") + if event.is_final_response(): + if event.content and event.content.parts and event.content.parts[0].text: + final_response_content = "\n".join( + [p.text for p in event.content.parts if p.text] + ) + break # Got the final response, stop consuming events + else: + logger.info(f"Intermediate event: {event}") + # Yield intermediate updates on every attempt + yield { + "is_task_complete": False, + "updates": self.get_processing_message(), + } + + if final_response_content is None: + logger.warning( + "--- ContactAgent.stream: Received no final response content from runner " + f"(Attempt {attempt}). ---" + ) + if attempt <= max_retries: + current_query_text = ( + "I received no response. Please try again." + f"Please retry the original request: '{query}'" + ) + continue # Go to next retry + else: + # Retries exhausted on no-response + final_response_content = ( + "I'm sorry, I encountered an error and couldn't process your request." + ) + # Fall through to send this as a text-only error + + is_valid = False + error_message = "" + + if self.use_ui: + logger.info( + "--- ContactAgent.stream: Validating UI response (Attempt" + f" {attempt})... ---" ) - - # --- MODIFICATION: Wrap the schema --- - # Load the A2UI_SCHEMA string into a Python object for validation try: - # First, load the schema for a *single message* - single_message_schema = json.loads(A2UI_SCHEMA) + if "---a2ui_JSON---" not in final_response_content: + raise ValueError("Delimiter '---a2ui_JSON---' not found.") + + text_part, json_string = final_response_content.split("---a2ui_JSON---", 1) - # The prompt instructs the LLM to return a *list* of messages. - # Therefore, our validation schema must be an *array* of the single message schema. - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} + # Handle the "no results found" case + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() + ) + if not json_string.strip() or json_string_cleaned == "[]": logger.info( - "A2UI_SCHEMA successfully loaded and wrapped in an array validator." + "--- ContactAgent.stream: Empty JSON list found. Assuming valid (e.g.," + " 'no results'). ---" ) - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- - - def get_processing_message(self) -> str: - return "Looking up contact information..." + is_valid = True - def _build_agent(self, use_ui: bool) -> LlmAgent: - """Builds the LLM agent for the contact agent.""" - LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - - if use_ui: - instruction = get_ui_prompt(self.base_url, CONTACT_UI_EXAMPLES) - else: - # The text prompt function also returns a complete prompt. - instruction = get_text_prompt() - - return LlmAgent( - model=LiteLlm(model=LITELLM_MODEL), - name="contact_agent", - description="An agent that finds colleague contact info.", - instruction=instruction, - tools=[get_contact_info], - ) + else: + if not json_string_cleaned: + raise ValueError("Cleaned JSON string is empty.") - async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: - session_state = {"base_url": self.base_url} + # --- New Validation Steps --- + # 1. Check if it's parsable JSON + parsed_json_data = json.loads(json_string_cleaned) - session = await self._runner.session_service.get_session( - app_name=self._agent.name, - user_id=self._user_id, - session_id=session_id, - ) - if session is None: - session = await self._runner.session_service.create_session( - app_name=self._agent.name, - user_id=self._user_id, - state=session_state, - session_id=session_id, - ) - elif "base_url" not in session.state: - session.state["base_url"] = self.base_url - - # --- Begin: UI Validation and Retry Logic --- - max_retries = 1 # Total 2 attempts - attempt = 0 - current_query_text = query - - # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: - logger.error( - "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " - "Cannot perform UI validation. ---" - ) - yield { - "is_task_complete": True, - "content": ( - "I'm sorry, I'm facing an internal configuration error with my UI components. " - "Please contact support." - ), - } - return - - while attempt <= max_retries: - attempt += 1 + # 2. Check if it validates against the A2UI_SCHEMA + # This will raise jsonschema.exceptions.ValidationError if it fails logger.info( - f"--- ContactAgent.stream: Attempt {attempt}/{max_retries + 1} " - f"for session {session_id} ---" + "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" + ) + jsonschema.validate( + instance=parsed_json_data, schema=self.a2ui_schema_object ) + # --- End New Validation Steps --- - current_message = types.Content( - role="user", parts=[types.Part.from_text(text=current_query_text)] + logger.info( + "--- ContactAgent.stream: UI JSON successfully parsed AND validated" + f" against schema. Validation OK (Attempt {attempt}). ---" ) - final_response_content = None - - async for event in self._runner.run_async( - user_id=self._user_id, - session_id=session.id, - new_message=current_message, - ): - logger.info(f"Event from runner: {event}") - if event.is_final_response(): - if ( - event.content - and event.content.parts - and event.content.parts[0].text - ): - final_response_content = "\n".join( - [p.text for p in event.content.parts if p.text] - ) - break # Got the final response, stop consuming events - else: - logger.info(f"Intermediate event: {event}") - # Yield intermediate updates on every attempt - yield { - "is_task_complete": False, - "updates": self.get_processing_message(), - } - - if final_response_content is None: - logger.warning( - f"--- ContactAgent.stream: Received no final response content from runner " - f"(Attempt {attempt}). ---" - ) - if attempt <= max_retries: - current_query_text = ( - "I received no response. Please try again." - f"Please retry the original request: '{query}'" - ) - continue # Go to next retry - else: - # Retries exhausted on no-response - final_response_content = "I'm sorry, I encountered an error and couldn't process your request." - # Fall through to send this as a text-only error - - is_valid = False - error_message = "" - - if self.use_ui: - logger.info( - f"--- ContactAgent.stream: Validating UI response (Attempt {attempt})... ---" - ) - try: - if "---a2ui_JSON---" not in final_response_content: - raise ValueError("Delimiter '---a2ui_JSON---' not found.") - - text_part, json_string = final_response_content.split( - "---a2ui_JSON---", 1 - ) - - # Handle the "no results found" case - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - if not json_string.strip() or json_string_cleaned == "[]": - logger.info( - "--- ContactAgent.stream: Empty JSON list found. Assuming valid (e.g., 'no results'). ---" - ) - is_valid = True - - else: - if not json_string_cleaned: - raise ValueError("Cleaned JSON string is empty.") - - # --- New Validation Steps --- - # 1. Check if it's parsable JSON - parsed_json_data = json.loads(json_string_cleaned) - - # 2. Check if it validates against the A2UI_SCHEMA - # This will raise jsonschema.exceptions.ValidationError if it fails - logger.info( - "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" - ) - jsonschema.validate( - instance=parsed_json_data, schema=self.a2ui_schema_object - ) - # --- End New Validation Steps --- - - logger.info( - f"--- ContactAgent.stream: UI JSON successfully parsed AND validated against schema. " - f"Validation OK (Attempt {attempt}). ---" - ) - is_valid = True - - except ( - ValueError, - json.JSONDecodeError, - jsonschema.exceptions.ValidationError, - ) as e: - logger.warning( - f"--- ContactAgent.stream: A2UI validation failed: {e} (Attempt {attempt}) ---" - ) - logger.warning( - f"--- Failed response content: {final_response_content[:500]}... ---" - ) - error_message = f"Validation failed: {e}." - - else: # Not using UI, so text is always "valid" - is_valid = True - - if is_valid: - logger.info( - f"--- ContactAgent.stream: Response is valid. Sending final response (Attempt {attempt}). ---" - ) - logger.info(f"Final response: {final_response_content}") - yield { - "is_task_complete": True, - "content": final_response_content, - } - return # We're done, exit the generator - - # --- If we're here, it means validation failed --- - - if attempt <= max_retries: - logger.warning( - f"--- ContactAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" - ) - # Prepare the query for the retry - current_query_text = ( - f"Your previous response was invalid. {error_message} " - "You MUST generate a valid response that strictly follows the A2UI JSON SCHEMA. " - "The response MUST be a JSON list of A2UI messages. " - "Ensure the response is split by '---a2ui_JSON---' and the JSON part is well-formed. " - f"Please retry the original request: '{query}'" - ) - # Loop continues... - - # --- If we're here, it means we've exhausted retries --- - logger.error( - "--- ContactAgent.stream: Max retries exhausted. Sending text-only error. ---" + is_valid = True + + except ( + ValueError, + json.JSONDecodeError, + jsonschema.exceptions.ValidationError, + ) as e: + logger.warning( + f"--- ContactAgent.stream: A2UI validation failed: {e} (Attempt" + f" {attempt}) ---" + ) + logger.warning( + f"--- Failed response content: {final_response_content[:500]}... ---" + ) + error_message = f"Validation failed: {e}." + + else: # Not using UI, so text is always "valid" + is_valid = True + + if is_valid: + logger.info( + "--- ContactAgent.stream: Response is valid. Sending final response" + f" (Attempt {attempt}). ---" ) + logger.info(f"Final response: {final_response_content}") yield { "is_task_complete": True, - "content": ( - "I'm sorry, I'm having trouble generating the interface for that request right now. " - "Please try again in a moment." - ), + "content": final_response_content, } - # --- End: UI Validation and Retry Logic --- + return # We're done, exit the generator + + # --- If we're here, it means validation failed --- + + if attempt <= max_retries: + logger.warning( + f"--- ContactAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" + ) + # Prepare the query for the retry + current_query_text = ( + f"Your previous response was invalid. {error_message} You MUST generate a" + " valid response that strictly follows the A2UI JSON SCHEMA. The response" + " MUST be a JSON list of A2UI messages. Ensure the response is split by" + " '---a2ui_JSON---' and the JSON part is well-formed. Please retry the" + f" original request: '{query}'" + ) + # Loop continues... + + # --- If we're here, it means we've exhausted retries --- + logger.error( + "--- ContactAgent.stream: Max retries exhausted. Sending text-only error. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm having trouble generating the interface for that request" + " right now. Please try again in a moment." + ), + } + # --- End: UI Validation and Retry Logic --- diff --git a/samples/agent/adk/contact_lookup/agent_executor.py b/samples/agent/adk/contact_lookup/agent_executor.py index f32110e7e..c58bbce18 100644 --- a/samples/agent/adk/contact_lookup/agent_executor.py +++ b/samples/agent/adk/contact_lookup/agent_executor.py @@ -39,173 +39,169 @@ class ContactAgentExecutor(AgentExecutor): - """Contact AgentExecutor Example.""" - - def __init__(self, base_url: str): - # Instantiate two agents: one for UI and one for text-only. - # The appropriate one will be chosen at execution time. - self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) - self.text_agent = ContactAgent(base_url=base_url, use_ui=False) - - async def execute( - self, - context: RequestContext, - event_queue: EventQueue, - ) -> None: - query = "" - ui_event_part = None - action = None - - logger.info( - f"--- Client requested extensions: {context.requested_extensions} ---" - ) - use_ui = try_activate_a2ui_extension(context) - - # Determine which agent to use based on whether the a2ui extension is active. - if use_ui: - agent = self.ui_agent - logger.info( - "--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---" - ) - else: - agent = self.text_agent - logger.info( - "--- AGENT_EXECUTOR: A2UI extension is not active. Using text agent. ---" - ) - - if context.message and context.message.parts: - logger.info( - f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message parts ---" - ) - for i, part in enumerate(context.message.parts): - if isinstance(part.root, DataPart): - if "userAction" in part.root.data: - logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") - ui_event_part = part.root.data["userAction"] - else: - logger.info(f" Part {i}: DataPart (data: {part.root.data})") - elif isinstance(part.root, TextPart): - logger.info(f" Part {i}: TextPart (text: {part.root.text})") - else: - logger.info(f" Part {i}: Unknown part type ({type(part.root)})") - - if ui_event_part: - logger.info(f"Received a2ui ClientEvent: {ui_event_part}") - # Fix: Check both 'actionName' and 'name' - action = ui_event_part.get("name") - ctx = ui_event_part.get("context", {}) - - if action == "view_profile": - contact_name = ctx.get("contactName", "Unknown") - department = ctx.get("department", "") - query = f"WHO_IS: {contact_name} from {department}" - - elif action == "send_email": - contact_name = ctx.get("contactName", "Unknown") - email = ctx.get("email", "Unknown") - query = f"USER_WANTS_TO_EMAIL: {contact_name} at {email}" - - elif action == "send_message": - contact_name = ctx.get("contactName", "Unknown") - query = f"USER_WANTS_TO_MESSAGE: {contact_name}" - - elif action == "follow_contact": - query = "ACTION: follow_contact" - - elif action == "view_full_profile": - contact_name = ctx.get("contactName", "Unknown") - query = f"USER_WANTS_FULL_PROFILE: {contact_name}" - - else: - query = f"User submitted an event: {action} with data: {ctx}" + """Contact AgentExecutor Example.""" + + def __init__(self, base_url: str): + # Instantiate two agents: one for UI and one for text-only. + # The appropriate one will be chosen at execution time. + self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) + self.text_agent = ContactAgent(base_url=base_url, use_ui=False) + + async def execute( + self, + context: RequestContext, + event_queue: EventQueue, + ) -> None: + query = "" + ui_event_part = None + action = None + + logger.info(f"--- Client requested extensions: {context.requested_extensions} ---") + use_ui = try_activate_a2ui_extension(context) + + # Determine which agent to use based on whether the a2ui extension is active. + if use_ui: + agent = self.ui_agent + logger.info("--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---") + else: + agent = self.text_agent + logger.info( + "--- AGENT_EXECUTOR: A2UI extension is not active. Using text agent. ---" + ) + + if context.message and context.message.parts: + logger.info( + f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message" + " parts ---" + ) + for i, part in enumerate(context.message.parts): + if isinstance(part.root, DataPart): + if "userAction" in part.root.data: + logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") + ui_event_part = part.root.data["userAction"] + else: + logger.info(f" Part {i}: DataPart (data: {part.root.data})") + elif isinstance(part.root, TextPart): + logger.info(f" Part {i}: TextPart (text: {part.root.text})") else: - logger.info("No a2ui UI event part found. Falling back to text input.") - query = context.get_user_input() + logger.info(f" Part {i}: Unknown part type ({type(part.root)})") + + if ui_event_part: + logger.info(f"Received a2ui ClientEvent: {ui_event_part}") + # Fix: Check both 'actionName' and 'name' + action = ui_event_part.get("name") + ctx = ui_event_part.get("context", {}) + + if action == "view_profile": + contact_name = ctx.get("contactName", "Unknown") + department = ctx.get("department", "") + query = f"WHO_IS: {contact_name} from {department}" + + elif action == "send_email": + contact_name = ctx.get("contactName", "Unknown") + email = ctx.get("email", "Unknown") + query = f"USER_WANTS_TO_EMAIL: {contact_name} at {email}" + + elif action == "send_message": + contact_name = ctx.get("contactName", "Unknown") + query = f"USER_WANTS_TO_MESSAGE: {contact_name}" + + elif action == "follow_contact": + query = "ACTION: follow_contact" + + elif action == "view_full_profile": + contact_name = ctx.get("contactName", "Unknown") + query = f"USER_WANTS_FULL_PROFILE: {contact_name}" + + else: + query = f"User submitted an event: {action} with data: {ctx}" + else: + logger.info("No a2ui UI event part found. Falling back to text input.") + query = context.get_user_input() + + logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") + + task = context.current_task + + if not task: + task = new_task(context.message) + await event_queue.enqueue_event(task) + updater = TaskUpdater(event_queue, task.id, task.context_id) + + async for item in agent.stream(query, task.context_id): + is_task_complete = item["is_task_complete"] + if not is_task_complete: + await updater.update_status( + TaskState.working, + new_agent_text_message(item["updates"], task.context_id, task.id), + ) + continue - logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") + final_state = TaskState.input_required # Default + if action in ["send_email", "send_message", "view_full_profile"]: + final_state = TaskState.completed - task = context.current_task + content = item["content"] + final_parts = [] + if "---a2ui_JSON---" in content: + logger.info("Splitting final response into text and UI parts.") + text_content, json_string = content.split("---a2ui_JSON---", 1) - if not task: - task = new_task(context.message) - await event_queue.enqueue_event(task) - updater = TaskUpdater(event_queue, task.id, task.context_id) + if text_content.strip(): + final_parts.append(Part(root=TextPart(text=text_content.strip()))) - async for item in agent.stream(query, task.context_id): - is_task_complete = item["is_task_complete"] - if not is_task_complete: - await updater.update_status( - TaskState.working, - new_agent_text_message(item["updates"], task.context_id, task.id), - ) - continue - - final_state = TaskState.input_required # Default - if action in ["send_email", "send_message", "view_full_profile"]: - final_state = TaskState.completed - - content = item["content"] - final_parts = [] - if "---a2ui_JSON---" in content: - logger.info("Splitting final response into text and UI parts.") - text_content, json_string = content.split("---a2ui_JSON---", 1) - - if text_content.strip(): - final_parts.append(Part(root=TextPart(text=text_content.strip()))) - - if json_string.strip(): - try: - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - - # Handle empty JSON list (e.g., no results) - if not json_string_cleaned or json_string_cleaned == "[]": - logger.info("Received empty/no JSON part. Skipping DataPart.") - else: - json_data = json.loads(json_string_cleaned) - if isinstance(json_data, list): - logger.info( - f"Found {len(json_data)} messages. Creating individual DataParts." - ) - for message in json_data: - final_parts.append(create_a2ui_part(message)) - - else: - # Handle the case where a single JSON object is returned - logger.info( - "Received a single JSON object. Creating a DataPart." - ) - final_parts.append(create_a2ui_part(json_data)) - - except json.JSONDecodeError as e: - logger.error(f"Failed to parse UI JSON: {e}") - final_parts.append(Part(root=TextPart(text=json_string))) - else: - final_parts.append(Part(root=TextPart(text=content.strip()))) - - # If after all that, we only have empty parts, add a default text response - if not final_parts or all(isinstance(p.root, TextPart) and not p.root.text for p in final_parts): - final_parts = [Part(root=TextPart(text="OK."))] - - - logger.info("--- FINAL PARTS TO BE SENT ---") - for i, part in enumerate(final_parts): - logger.info(f" - Part {i}: Type = {type(part.root)}") - if isinstance(part.root, TextPart): - logger.info(f" - Text: {part.root.text[:200]}...") - elif isinstance(part.root, DataPart): - logger.info(f" - Data: {str(part.root.data)[:200]}...") - logger.info("-----------------------------") - - await updater.update_status( - final_state, - new_agent_parts_message(final_parts, task.context_id, task.id), - final=(final_state == TaskState.completed), + if json_string.strip(): + try: + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() ) - break - async def cancel( - self, request: RequestContext, event_queue: EventQueue - ) -> Task | None: - raise ServerError(error=UnsupportedOperationError()) + # Handle empty JSON list (e.g., no results) + if not json_string_cleaned or json_string_cleaned == "[]": + logger.info("Received empty/no JSON part. Skipping DataPart.") + else: + json_data = json.loads(json_string_cleaned) + if isinstance(json_data, list): + logger.info( + f"Found {len(json_data)} messages. Creating individual DataParts." + ) + for message in json_data: + final_parts.append(create_a2ui_part(message)) + + else: + # Handle the case where a single JSON object is returned + logger.info("Received a single JSON object. Creating a DataPart.") + final_parts.append(create_a2ui_part(json_data)) + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse UI JSON: {e}") + final_parts.append(Part(root=TextPart(text=json_string))) + else: + final_parts.append(Part(root=TextPart(text=content.strip()))) + + # If after all that, we only have empty parts, add a default text response + if not final_parts or all( + isinstance(p.root, TextPart) and not p.root.text for p in final_parts + ): + final_parts = [Part(root=TextPart(text="OK."))] + + logger.info("--- FINAL PARTS TO BE SENT ---") + for i, part in enumerate(final_parts): + logger.info(f" - Part {i}: Type = {type(part.root)}") + if isinstance(part.root, TextPart): + logger.info(f" - Text: {part.root.text[:200]}...") + elif isinstance(part.root, DataPart): + logger.info(f" - Data: {str(part.root.data)[:200]}...") + logger.info("-----------------------------") + + await updater.update_status( + final_state, + new_agent_parts_message(final_parts, task.context_id, task.id), + final=(final_state == TaskState.completed), + ) + break + + async def cancel( + self, request: RequestContext, event_queue: EventQueue + ) -> Task | None: + raise ServerError(error=UnsupportedOperationError()) diff --git a/samples/agent/adk/contact_lookup/prompt_builder.py b/samples/agent/adk/contact_lookup/prompt_builder.py index 3fe269e65..af472be82 100644 --- a/samples/agent/adk/contact_lookup/prompt_builder.py +++ b/samples/agent/adk/contact_lookup/prompt_builder.py @@ -39,23 +39,23 @@ def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. + """ + Constructs the full prompt with UI instructions, rules, examples, and schema. - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. + Args: + base_url: The base URL for resolving static assets like logos. + examples: A string containing the specific UI examples for the agent's task. - Returns: - A formatted string to be used as the system prompt for the LLM. - """ + Returns: + A formatted string to be used as the system prompt for the LLM. + """ - # --- THIS IS THE FIX --- - # We no longer call .format() on the examples, as it breaks the JSON. - formatted_examples = examples - # --- END FIX --- + # --- THIS IS THE FIX --- + # We no longer call .format() on the examples, as it breaks the JSON. + formatted_examples = examples + # --- END FIX --- - return f""" + return f""" You are a helpful contact lookup assistant. Your final output MUST be a a2ui UI JSON response. To generate the response, you MUST follow these rules: @@ -90,10 +90,10 @@ def get_ui_prompt(base_url: str, examples: str) -> str: def get_text_prompt() -> str: - """ - Constructs the prompt for a text-only agent. - """ - return """ + """ + Constructs the prompt for a text-only agent. + """ + return """ You are a helpful contact lookup assistant. Your final output MUST be a text response. To generate the response, you MUST follow these rules: @@ -109,10 +109,10 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder - my_base_url = "http://localhost:8000" - contact_prompt = get_ui_prompt(my_base_url, CONTACT_UI_EXAMPLES) - print(contact_prompt) - with open("generated_prompt.txt", "w") as f: - f.write(contact_prompt) - print("\nGenerated prompt saved to generated_prompt.txt") + # Example of how to use the prompt builder + my_base_url = "http://localhost:8000" + contact_prompt = get_ui_prompt(my_base_url, CONTACT_UI_EXAMPLES) + print(contact_prompt) + with open("generated_prompt.txt", "w") as f: + f.write(contact_prompt) + print("\nGenerated prompt saved to generated_prompt.txt") diff --git a/samples/agent/adk/contact_lookup/tools.py b/samples/agent/adk/contact_lookup/tools.py index 56c9e15eb..3bf8989eb 100644 --- a/samples/agent/adk/contact_lookup/tools.py +++ b/samples/agent/adk/contact_lookup/tools.py @@ -22,47 +22,45 @@ def get_contact_info(name: str, tool_context: ToolContext, department: str = "") -> str: - """Call this tool to get a list of contacts based on a name and optional department. - 'name' is the person's name to search for. - 'department' is the optional department to filter by. - """ - logger.info("--- TOOL CALLED: get_contact_info ---") - logger.info(f" - Name: {name}") - logger.info(f" - Department: {department}") + """Call this tool to get a list of contacts based on a name and optional department. + 'name' is the person's name to search for. + 'department' is the optional department to filter by. + """ + logger.info("--- TOOL CALLED: get_contact_info ---") + logger.info(f" - Name: {name}") + logger.info(f" - Department: {department}") - results = [] - try: - script_dir = os.path.dirname(__file__) - file_path = os.path.join(script_dir, "contact_data.json") - with open(file_path) as f: - contact_data_str = f.read() - if base_url := tool_context.state.get("base_url"): - contact_data_str = contact_data_str.replace("http://localhost:10002", base_url) - logger.info(f'Updated base URL from tool context: {base_url}') - all_contacts = json.loads(contact_data_str) + results = [] + try: + script_dir = os.path.dirname(__file__) + file_path = os.path.join(script_dir, "contact_data.json") + with open(file_path) as f: + contact_data_str = f.read() + if base_url := tool_context.state.get("base_url"): + contact_data_str = contact_data_str.replace("http://localhost:10002", base_url) + logger.info(f"Updated base URL from tool context: {base_url}") + all_contacts = json.loads(contact_data_str) - name_lower = name.lower() + name_lower = name.lower() - dept_lower = department.lower() if department else "" + dept_lower = department.lower() if department else "" - # Filter by name - results = [ - contact for contact in all_contacts if name_lower in contact["name"].lower() - ] + # Filter by name + results = [ + contact for contact in all_contacts if name_lower in contact["name"].lower() + ] - # If department is provided, filter results further - if dept_lower: - results = [ - contact - for contact in results - if dept_lower in contact["department"].lower() - ] + # If department is provided, filter results further + if dept_lower: + results = [ + contact for contact in results if dept_lower in contact["department"].lower() + ] - logger.info(f" - Success: Found {len(results)} matching contacts.") + logger.info(f" - Success: Found {len(results)} matching contacts.") - except FileNotFoundError: - logger.error(f" - Error: contact_data.json not found at {file_path}") - except json.JSONDecodeError: - logger.error(f" - Error: Failed to decode JSON from {file_path}") + except FileNotFoundError: + logger.error(f" - Error: contact_data.json not found at {file_path}") + except json.JSONDecodeError: + logger.error(f" - Error: Failed to decode JSON from {file_path}") - return json.dumps(results) + return json.dumps(results) diff --git a/samples/agent/adk/contact_multiple_surfaces/__main__.py b/samples/agent/adk/contact_multiple_surfaces/__main__.py index 76289ba96..b2e73c900 100644 --- a/samples/agent/adk/contact_multiple_surfaces/__main__.py +++ b/samples/agent/adk/contact_multiple_surfaces/__main__.py @@ -34,77 +34,83 @@ class MissingAPIKeyError(Exception): - """Exception for missing API key.""" + """Exception for missing API key.""" @click.command() @click.option("--host", default="localhost") @click.option("--port", default=10004) def main(host, port): - try: - # Check for API key only if Vertex AI is not configured - if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": - if not os.getenv("GEMINI_API_KEY"): - raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI is not TRUE." - ) - - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], + try: + # Check for API key only if Vertex AI is not configured + if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": + if not os.getenv("GEMINI_API_KEY"): + raise MissingAPIKeyError( + "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" + " is not TRUE." ) - skill = AgentSkill( - id="find_contact", - name="Find Contact Tool", - description="Helps find contact information for colleagues (e.g., email, location, team).", - tags=["contact", "directory", "people", "finder"], - examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], - ) - - base_url = f"http://{host}:{port}" - - agent_card = AgentCard( - name="Contact Lookup Agent", - description="This agent helps find contact info for people in your organization.", - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) - - agent_executor = ContactAgentExecutor(base_url=base_url) - - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler - ) - import uvicorn - - app = server.build() - - app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:5173"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - app.mount("/static", StaticFiles(directory="images"), name="static") - uvicorn.run(app, host=host, port=port) - except MissingAPIKeyError as e: - logger.error(f"Error: {e}") - exit(1) - except Exception as e: - logger.error(f"An error occurred during server startup: {e}") - exit(1) + capabilities = AgentCapabilities( + streaming=True, + extensions=[get_a2ui_agent_extension()], + ) + skill = AgentSkill( + id="find_contact", + name="Find Contact Tool", + description=( + "Helps find contact information for colleagues (e.g., email, location," + " team)." + ), + tags=["contact", "directory", "people", "finder"], + examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], + ) + + base_url = f"http://{host}:{port}" + + agent_card = AgentCard( + name="Contact Lookup Agent", + description=( + "This agent helps find contact info for people in your organization." + ), + url=base_url, # <-- Use base_url here + version="1.0.0", + default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) + + agent_executor = ContactAgentExecutor(base_url=base_url) + + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + server = A2AStarletteApplication( + agent_card=agent_card, http_handler=request_handler + ) + import uvicorn + + app = server.build() + + app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:5173"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + app.mount("/static", StaticFiles(directory="images"), name="static") + + uvicorn.run(app, host=host, port=port) + except MissingAPIKeyError as e: + logger.error(f"Error: {e}") + exit(1) + except Exception as e: + logger.error(f"An error occurred during server startup: {e}") + exit(1) if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py b/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py index da2884d9c..07a064527 100644 --- a/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py +++ b/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py @@ -34,79 +34,84 @@ FLOOR_PLAN_FILE = "floor_plan.json" + def load_examples(base_url: str = "http://localhost:10004") -> str: - """ - Loads, validates, and formats the UI examples from JSON files. - - Args: - base_url: The base URL to replace placeholder URLs with. - (Currently examples have http://localhost:10004 hardcoded, - but we can make this dynamic if needed). - - Returns: - A string containing all formatted examples for the prompt. - """ - - # Pre-parse validator + """ + Loads, validates, and formats the UI examples from JSON files. + + Args: + base_url: The base URL to replace placeholder URLs with. + (Currently examples have http://localhost:10004 hardcoded, + but we can make this dynamic if needed). + + Returns: + A string containing all formatted examples for the prompt. + """ + + # Pre-parse validator + try: + single_msg_schema = json.loads(A2UI_SCHEMA) + # Examples are typically lists of messages + list_schema = {"type": "array", "items": single_msg_schema} + except json.JSONDecodeError: + logger.error("Failed to parse A2UI_SCHEMA for validation") + list_schema = None + + examples_dir = Path(os.path.dirname(__file__)) / "examples" + formatted_output = [] + + for curr_name, filename in EXAMPLE_FILES.items(): + file_path = examples_dir / filename try: - single_msg_schema = json.loads(A2UI_SCHEMA) - # Examples are typically lists of messages - list_schema = {"type": "array", "items": single_msg_schema} - except json.JSONDecodeError: - logger.error("Failed to parse A2UI_SCHEMA for validation") - list_schema = None - - examples_dir = Path(os.path.dirname(__file__)) / "examples" - formatted_output = [] - - for curr_name, filename in EXAMPLE_FILES.items(): - file_path = examples_dir / filename + content = file_path.read_text(encoding="utf-8") + + # basic replacement if we decide to template the URL in JSON files + # content = content.replace("{{BASE_URL}}", base_url) + + # Validation + if list_schema: try: - content = file_path.read_text(encoding="utf-8") - - # basic replacement if we decide to template the URL in JSON files - # content = content.replace("{{BASE_URL}}", base_url) - - # Validation - if list_schema: - try: - data = json.loads(content) - jsonschema.validate(instance=data, schema=list_schema) - except (json.JSONDecodeError, jsonschema.ValidationError) as e: - logger.warning(f"Example {filename} validation failed: {e}") - - formatted_output.append(f"---BEGIN {curr_name}---") - # Handle examples that include user/model text - if curr_name == "ORG_CHART_EXAMPLE": - formatted_output.append("User: Show me the org chart for Casey Smith") - formatted_output.append("Model: Here is the organizational chart.") - formatted_output.append("---a2ui_JSON---") - elif curr_name == "MULTI_SURFACE_EXAMPLE": - formatted_output.append("User: Full profile for Casey Smith") - formatted_output.append("Model: Here is the full profile including contact details and org chart.") - formatted_output.append("---a2ui_JSON---") - elif curr_name == "CHART_NODE_CLICK_EXAMPLE": - formatted_output.append('User: ACTION: chart_node_click (context: clickedNodeName="John Smith") (from modal)') - formatted_output.append("Model: Here is the profile for John Smith.") - formatted_output.append("---a2ui_JSON---") - - formatted_output.append(content.strip()) - formatted_output.append(f"---END {curr_name}---") - formatted_output.append("") # Newline - - except FileNotFoundError: - logger.error(f"Example file not found: {file_path}") - - return "\n".join(formatted_output) + data = json.loads(content) + jsonschema.validate(instance=data, schema=list_schema) + except (json.JSONDecodeError, jsonschema.ValidationError) as e: + logger.warning(f"Example {filename} validation failed: {e}") + + formatted_output.append(f"---BEGIN {curr_name}---") + # Handle examples that include user/model text + if curr_name == "ORG_CHART_EXAMPLE": + formatted_output.append("User: Show me the org chart for Casey Smith") + formatted_output.append("Model: Here is the organizational chart.") + formatted_output.append("---a2ui_JSON---") + elif curr_name == "MULTI_SURFACE_EXAMPLE": + formatted_output.append("User: Full profile for Casey Smith") + formatted_output.append( + "Model: Here is the full profile including contact details and org chart." + ) + formatted_output.append("---a2ui_JSON---") + elif curr_name == "CHART_NODE_CLICK_EXAMPLE": + formatted_output.append( + 'User: ACTION: chart_node_click (context: clickedNodeName="John Smith")' + " (from modal)" + ) + formatted_output.append("Model: Here is the profile for John Smith.") + formatted_output.append("---a2ui_JSON---") + + formatted_output.append(content.strip()) + formatted_output.append(f"---END {curr_name}---") + formatted_output.append("") # Newline -def load_floor_plan_example() -> str: - """Loads the floor plan example specifically.""" - examples_dir = Path(os.path.dirname(__file__)) / "examples" - file_path = examples_dir / FLOOR_PLAN_FILE - try: - return file_path.read_text(encoding="utf-8") except FileNotFoundError: - logger.error(f"Floor plan example not found: {file_path}") - return "[]" + logger.error(f"Example file not found: {file_path}") + + return "\n".join(formatted_output) +def load_floor_plan_example() -> str: + """Loads the floor plan example specifically.""" + examples_dir = Path(os.path.dirname(__file__)) / "examples" + file_path = examples_dir / FLOOR_PLAN_FILE + try: + return file_path.read_text(encoding="utf-8") + except FileNotFoundError: + logger.error(f"Floor plan example not found: {file_path}") + return "[]" diff --git a/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py b/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py index f4c776d80..29c72d1d8 100644 --- a/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py +++ b/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py @@ -15,7 +15,7 @@ # a2ui_schema.py -A2UI_SCHEMA = r''' +A2UI_SCHEMA = r""" { "title": "A2UI Message Schema", "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", @@ -789,4 +789,4 @@ } } } -''' +""" diff --git a/samples/agent/adk/contact_multiple_surfaces/agent.py b/samples/agent/adk/contact_multiple_surfaces/agent.py index 29001eef0..91245a85b 100644 --- a/samples/agent/adk/contact_multiple_surfaces/agent.py +++ b/samples/agent/adk/contact_multiple_surfaces/agent.py @@ -31,7 +31,6 @@ from google.adk.sessions import InMemorySessionService from google.genai import types from prompt_builder import ( - get_text_prompt, get_ui_prompt, ) @@ -41,320 +40,327 @@ class ContactAgent: - """An agent that finds contact info for colleagues.""" - - SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] - - def __init__(self, base_url: str, use_ui: bool = False): - self.base_url = base_url - self.use_ui = use_ui - self._agent = self._build_agent(use_ui) - self._user_id = "remote_agent" - self._runner = Runner( - app_name=self._agent.name, - agent=self._agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - - # Load A2UI_SCHEMA and wrap it in an array validator for list responses + """An agent that finds contact info for colleagues.""" + + SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] + + def __init__(self, base_url: str, use_ui: bool = False): + self.base_url = base_url + self.use_ui = use_ui + self._agent = self._build_agent(use_ui) + self._user_id = "remote_agent" + self._runner = Runner( + app_name=self._agent.name, + agent=self._agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + # Load A2UI_SCHEMA and wrap it in an array validator for list responses + try: + single_message_schema = json.loads(A2UI_SCHEMA) + self.a2ui_schema_object = {"type": "array", "items": single_message_schema} + logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") + except json.JSONDecodeError as e: + logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") + self.a2ui_schema_object = None + # --- END MODIFICATION --- + + def get_processing_message(self) -> str: + return "Looking up contact information..." + + def _build_agent(self, use_ui: bool) -> LlmAgent: + """Builds the LLM agent for the contact agent.""" + LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") + + if use_ui: + examples = load_examples(self.base_url) + instruction = get_ui_prompt(self.base_url, examples) + else: + # The text prompt function also returns a complete prompt. + instruction = get_text_prompt() + + return LlmAgent( + model=LiteLlm(model=LITELLM_MODEL), + name="contact_agent", + description="An agent that finds colleague contact info.", + instruction=instruction, + tools=[get_contact_info], + ) + + async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: + session_state = {"base_url": self.base_url} + + session = await self._runner.session_service.get_session( + app_name=self._agent.name, + user_id=self._user_id, + session_id=session_id, + ) + if session is None: + session = await self._runner.session_service.create_session( + app_name=self._agent.name, + user_id=self._user_id, + state=session_state, + session_id=session_id, + ) + elif "base_url" not in session.state: + session.state["base_url"] = self.base_url + + # --- Begin: UI Validation and Retry Logic --- + max_retries = 1 # Total 2 attempts + attempt = 0 + current_query_text = query + + # Ensure schema was loaded + if self.use_ui and self.a2ui_schema_object is None: + logger.error( + "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " + "Cannot perform UI validation. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm facing an internal configuration error with my UI" + " components. Please contact support." + ), + } + return + + while attempt <= max_retries: + attempt += 1 + logger.info( + f"--- ContactAgent.stream: Attempt {attempt}/{max_retries + 1} " + f"for session {session_id} ---" + ) + logger.info(f"--- ContactAgent.stream: Received query: '{query}' ---") + + # --- Check for User Action --- + # If the query looks like an action (starts with "ACTION:"), parsing it to see if it's send_message + + if query.startswith("ACTION:") and "send_message" in query: + logger.info("--- ContactAgent.stream: Detected send_message ACTION ---") + + # Load the action confirmation example dynamically try: - single_message_schema = json.loads(A2UI_SCHEMA) - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} - logger.info( - "A2UI_SCHEMA successfully loaded and wrapped in an array validator." + from a2ui_examples import load_examples + # We might want to expose a specific loader for this, or just read the file here. + # Since we moved logic to a2ui_examples check if we can import the file constant or just read. + # Actually, a2ui_examples has EXAMPLE_FILES, let's just re-read using pathlib for simplicity or add a helper. + # But wait, load_examples returns the formatted string, including delimiters. + # Let's use the helper we added in a2ui_examples if possible, or just read the file. + # I didn't add a specific helper for action confirmation in a2ui_examples, but I can read the file. + pass + except ImportError: + pass + + # Re-implement logic to read from file + from pathlib import Path + + examples_dir = Path(__file__).parent / "examples" + action_file = examples_dir / "action_confirmation.json" + + if action_file.exists(): + json_content = action_file.read_text(encoding="utf-8").strip() + + # Extract contact name from query if present + contact_name = "Unknown" + if "(contact:" in query: + try: + contact_name = query.split("(contact:")[1].split(")")[0].strip() + except Exception: + pass + + # Inject contact name into the message + if contact_name != "Unknown": + json_content = json_content.replace( + "Your action has been processed.", f"Message sent to {contact_name}!" ) - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- - def get_processing_message(self) -> str: - return "Looking up contact information..." - - def _build_agent(self, use_ui: bool) -> LlmAgent: - """Builds the LLM agent for the contact agent.""" - LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - - if use_ui: - examples = load_examples(self.base_url) - instruction = get_ui_prompt(self.base_url, examples) else: - # The text prompt function also returns a complete prompt. - instruction = get_text_prompt() - - return LlmAgent( - model=LiteLlm(model=LITELLM_MODEL), - name="contact_agent", - description="An agent that finds colleague contact info.", - instruction=instruction, - tools=[get_contact_info], + logger.error( + "Could not find ACTION_CONFIRMATION_EXAMPLE in CONTACT_UI_EXAMPLES" + ) + # Fallback to a minimal valid response to avoid crash + json_content = ( + '[{ "beginRendering": { "surfaceId": "action-modal", "root":' + ' "modal-wrapper" } }, { "surfaceUpdate": { "surfaceId": "action-modal",' + ' "components": [ { "id": "modal-wrapper", "component": { "Modal": {' + ' "entryPointChild": "hidden", "contentChild": "msg", "open": true } } },' + ' { "id": "hidden", "component": { "Text": { "text": {"literalString": "' + ' "} } } }, { "id": "msg", "component": { "Text": { "text":' + ' {"literalString": "Message Sent (Fallback)"} } } } ] } }]' + ) + + final_response_content = ( + f"Message sent to {contact_name}\n---a2ui_JSON---\n{json_content}" ) - async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: - session_state = {"base_url": self.base_url} + yield { + "is_task_complete": True, + "content": final_response_content, + } + return + + if query.startswith("ACTION:") and "view_location" in query: + logger.info("--- ContactAgent.stream: Detected view_location ACTION ---") + + # Use the predefined example floor plan + json_content = load_floor_plan_example().strip() + start_idx = json_content.find("[") + end_idx = json_content.rfind("]") + if start_idx != -1 and end_idx != -1: + json_content = json_content[start_idx : end_idx + 1] - session = await self._runner.session_service.get_session( - app_name=self._agent.name, - user_id=self._user_id, - session_id=session_id, + logger.info(f"--- ContactAgent.stream: Sending Floor Plan ---") + final_response_content = ( + f"Here is the floor plan.\n---a2ui_JSON---\n{json_content}" ) - if session is None: - session = await self._runner.session_service.create_session( - app_name=self._agent.name, - user_id=self._user_id, - state=session_state, - session_id=session_id, + yield {"is_task_complete": True, "content": final_response_content} + return + + current_message = types.Content( + role="user", parts=[types.Part.from_text(text=current_query_text)] + ) + final_response_content = None + + async for event in self._runner.run_async( + user_id=self._user_id, + session_id=session.id, + new_message=current_message, + ): + logger.info(f"Event from runner: {event}") + if event.is_final_response(): + if event.content and event.content.parts and event.content.parts[0].text: + final_response_content = "\n".join( + [p.text for p in event.content.parts if p.text] ) - elif "base_url" not in session.state: - session.state["base_url"] = self.base_url - - # --- Begin: UI Validation and Retry Logic --- - max_retries = 1 # Total 2 attempts - attempt = 0 - current_query_text = query - - # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: - logger.error( - "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " - "Cannot perform UI validation. ---" + break # Got the final response, stop consuming events + else: + logger.info(f"Intermediate event: {event}") + # Yield intermediate updates on every attempt + yield { + "is_task_complete": False, + "updates": self.get_processing_message(), + } + + if final_response_content is None: + logger.warning( + "--- ContactAgent.stream: Received no final response content from runner " + f"(Attempt {attempt}). ---" + ) + if attempt <= max_retries: + current_query_text = ( + "I received no response. Please try again." + f"Please retry the original request: '{query}'" + ) + continue # Go to next retry + else: + # Retries exhausted on no-response + final_response_content = ( + "I'm sorry, I encountered an error and couldn't process your request." + ) + # Fall through to send this as a text-only error + + is_valid = False + error_message = "" + + if self.use_ui: + logger.info( + "--- ContactAgent.stream: Validating UI response (Attempt" + f" {attempt})... ---" + ) + try: + if "---a2ui_JSON---" not in final_response_content: + raise ValueError("Delimiter '---a2ui_JSON---' not found.") + + text_part, json_string = final_response_content.split("---a2ui_JSON---", 1) + + # Handle the "no results found" case + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() + ) + if not json_string.strip() or json_string_cleaned == "[]": + logger.info( + "--- ContactAgent.stream: Empty JSON list found. Assuming valid (e.g.," + " 'no results'). ---" ) - yield { - "is_task_complete": True, - "content": ( - "I'm sorry, I'm facing an internal configuration error with my UI components. " - "Please contact support." - ), - } - return - - while attempt <= max_retries: - attempt += 1 + is_valid = True + + else: + if not json_string_cleaned: + raise ValueError("Cleaned JSON string is empty.") + + # Validate parsed JSON against A2UI_SCHEMA + parsed_json_data = json.loads(json_string_cleaned) logger.info( - f"--- ContactAgent.stream: Attempt {attempt}/{max_retries + 1} " - f"for session {session_id} ---" + "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" ) - logger.info(f"--- ContactAgent.stream: Received query: '{query}' ---") - - - # --- Check for User Action --- - # If the query looks like an action (starts with "ACTION:"), parsing it to see if it's send_message - - if query.startswith("ACTION:") and "send_message" in query: - logger.info("--- ContactAgent.stream: Detected send_message ACTION ---") - - # Load the action confirmation example dynamically - try: - from a2ui_examples import load_examples - # We might want to expose a specific loader for this, or just read the file here. - # Since we moved logic to a2ui_examples check if we can import the file constant or just read. - # Actually, a2ui_examples has EXAMPLE_FILES, let's just re-read using pathlib for simplicity or add a helper. - # But wait, load_examples returns the formatted string, including delimiters. - # Let's use the helper we added in a2ui_examples if possible, or just read the file. - # I didn't add a specific helper for action confirmation in a2ui_examples, but I can read the file. - pass - except ImportError: - pass - - # Re-implement logic to read from file - from pathlib import Path - examples_dir = Path(__file__).parent / "examples" - action_file = examples_dir / "action_confirmation.json" - - if action_file.exists(): - json_content = action_file.read_text(encoding="utf-8").strip() - - # Extract contact name from query if present - contact_name = "Unknown" - if "(contact:" in query: - try: - contact_name = query.split("(contact:")[1].split(")")[0].strip() - except Exception: - pass - - # Inject contact name into the message - if contact_name != "Unknown": - json_content = json_content.replace( - "Your action has been processed.", - f"Message sent to {contact_name}!" - ) - - else: - logger.error("Could not find ACTION_CONFIRMATION_EXAMPLE in CONTACT_UI_EXAMPLES") - # Fallback to a minimal valid response to avoid crash - json_content = '[{ "beginRendering": { "surfaceId": "action-modal", "root": "modal-wrapper" } }, { "surfaceUpdate": { "surfaceId": "action-modal", "components": [ { "id": "modal-wrapper", "component": { "Modal": { "entryPointChild": "hidden", "contentChild": "msg", "open": true } } }, { "id": "hidden", "component": { "Text": { "text": {"literalString": " "} } } }, { "id": "msg", "component": { "Text": { "text": {"literalString": "Message Sent (Fallback)"} } } } ] } }]' - - final_response_content = f"Message sent to {contact_name}\n---a2ui_JSON---\n{json_content}" - - yield { - "is_task_complete": True, - "content": final_response_content, - } - return - - if query.startswith("ACTION:") and "view_location" in query: - logger.info("--- ContactAgent.stream: Detected view_location ACTION ---") - - # Use the predefined example floor plan - json_content = load_floor_plan_example().strip() - start_idx = json_content.find("[") - end_idx = json_content.rfind("]") - if start_idx != -1 and end_idx != -1: - json_content = json_content[start_idx:end_idx+1] - - logger.info(f"--- ContactAgent.stream: Sending Floor Plan ---") - final_response_content = f"Here is the floor plan.\n---a2ui_JSON---\n{json_content}" - yield { "is_task_complete": True, "content": final_response_content } - return - - - - - - current_message = types.Content( - role="user", parts=[types.Part.from_text(text=current_query_text)] + jsonschema.validate( + instance=parsed_json_data, schema=self.a2ui_schema_object ) - final_response_content = None - - async for event in self._runner.run_async( - user_id=self._user_id, - session_id=session.id, - new_message=current_message, - ): - logger.info(f"Event from runner: {event}") - if event.is_final_response(): - if ( - event.content - and event.content.parts - and event.content.parts[0].text - ): - final_response_content = "\n".join( - [p.text for p in event.content.parts if p.text] - ) - break # Got the final response, stop consuming events - else: - logger.info(f"Intermediate event: {event}") - # Yield intermediate updates on every attempt - yield { - "is_task_complete": False, - "updates": self.get_processing_message(), - } - - if final_response_content is None: - logger.warning( - f"--- ContactAgent.stream: Received no final response content from runner " - f"(Attempt {attempt}). ---" - ) - if attempt <= max_retries: - current_query_text = ( - "I received no response. Please try again." - f"Please retry the original request: '{query}'" - ) - continue # Go to next retry - else: - # Retries exhausted on no-response - final_response_content = "I'm sorry, I encountered an error and couldn't process your request." - # Fall through to send this as a text-only error - - is_valid = False - error_message = "" - - if self.use_ui: - logger.info( - f"--- ContactAgent.stream: Validating UI response (Attempt {attempt})... ---" - ) - try: - if "---a2ui_JSON---" not in final_response_content: - raise ValueError("Delimiter '---a2ui_JSON---' not found.") - - text_part, json_string = final_response_content.split( - "---a2ui_JSON---", 1 - ) - - # Handle the "no results found" case - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - if not json_string.strip() or json_string_cleaned == "[]": - logger.info( - "--- ContactAgent.stream: Empty JSON list found. Assuming valid (e.g., 'no results'). ---" - ) - is_valid = True - - else: - if not json_string_cleaned: - raise ValueError("Cleaned JSON string is empty.") - - # Validate parsed JSON against A2UI_SCHEMA - parsed_json_data = json.loads(json_string_cleaned) - logger.info( - "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" - ) - jsonschema.validate( - instance=parsed_json_data, schema=self.a2ui_schema_object - ) - # --- End New Validation Steps --- - - logger.info( - f"--- ContactAgent.stream: UI JSON successfully parsed AND validated against schema. " - f"Validation OK (Attempt {attempt}). ---" - ) - is_valid = True - - except ( - ValueError, - json.JSONDecodeError, - jsonschema.exceptions.ValidationError, - ) as e: - logger.warning( - f"--- ContactAgent.stream: A2UI validation failed: {e} (Attempt {attempt}) ---" - ) - logger.warning( - f"--- Failed response content: {final_response_content[:500]}... ---" - ) - error_message = f"Validation failed: {e}." - - else: # Not using UI, so text is always "valid" - is_valid = True - - if is_valid: - logger.info( - f"--- ContactAgent.stream: Response is valid. Sending final response (Attempt {attempt}). ---" - ) - logger.info(f"Final response: {final_response_content}") - yield { - "is_task_complete": True, - "content": final_response_content, - } - return # We're done, exit the generator - - # --- If we're here, it means validation failed --- - - if attempt <= max_retries: - logger.warning( - f"--- ContactAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" - ) - # Prepare the query for the retry - current_query_text = ( - f"Your previous response was invalid. {error_message} " - "You MUST generate a valid response that strictly follows the A2UI JSON SCHEMA. " - "The response MUST be a JSON list of A2UI messages. " - "Ensure the response is split by '---a2ui_JSON---' and the JSON part is well-formed. " - f"Please retry the original request: '{query}'" - ) - # Loop continues... - - # --- If we're here, it means we've exhausted retries --- - logger.error( - "--- ContactAgent.stream: Max retries exhausted. Sending text-only error. ---" + # --- End New Validation Steps --- + + logger.info( + "--- ContactAgent.stream: UI JSON successfully parsed AND validated" + f" against schema. Validation OK (Attempt {attempt}). ---" + ) + is_valid = True + + except ( + ValueError, + json.JSONDecodeError, + jsonschema.exceptions.ValidationError, + ) as e: + logger.warning( + f"--- ContactAgent.stream: A2UI validation failed: {e} (Attempt" + f" {attempt}) ---" + ) + logger.warning( + f"--- Failed response content: {final_response_content[:500]}... ---" + ) + error_message = f"Validation failed: {e}." + + else: # Not using UI, so text is always "valid" + is_valid = True + + if is_valid: + logger.info( + "--- ContactAgent.stream: Response is valid. Sending final response" + f" (Attempt {attempt}). ---" ) + logger.info(f"Final response: {final_response_content}") yield { "is_task_complete": True, - "content": ( - "I'm sorry, I'm having trouble generating the interface for that request right now. " - "Please try again in a moment." - ), + "content": final_response_content, } - # --- End: UI Validation and Retry Logic --- + return # We're done, exit the generator + + # --- If we're here, it means validation failed --- + + if attempt <= max_retries: + logger.warning( + f"--- ContactAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" + ) + # Prepare the query for the retry + current_query_text = ( + f"Your previous response was invalid. {error_message} You MUST generate a" + " valid response that strictly follows the A2UI JSON SCHEMA. The response" + " MUST be a JSON list of A2UI messages. Ensure the response is split by" + " '---a2ui_JSON---' and the JSON part is well-formed. Please retry the" + f" original request: '{query}'" + ) + # Loop continues... + + # --- If we're here, it means we've exhausted retries --- + logger.error( + "--- ContactAgent.stream: Max retries exhausted. Sending text-only error. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm having trouble generating the interface for that request" + " right now. Please try again in a moment." + ), + } + # --- End: UI Validation and Retry Logic --- diff --git a/samples/agent/adk/contact_multiple_surfaces/agent_executor.py b/samples/agent/adk/contact_multiple_surfaces/agent_executor.py index 47e39fd40..55fd2ad85 100644 --- a/samples/agent/adk/contact_multiple_surfaces/agent_executor.py +++ b/samples/agent/adk/contact_multiple_surfaces/agent_executor.py @@ -40,197 +40,199 @@ class ContactAgentExecutor(AgentExecutor): - """Contact AgentExecutor Example.""" - - def __init__(self, base_url: str): - # Instantiate the UI agent. - self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) - - async def execute( - self, - context: RequestContext, - event_queue: EventQueue, - ) -> None: - query = "" - ui_event_part = None - action = None - - logger.info( - f"--- Client requested extensions: {context.requested_extensions} ---" - ) - use_ui = try_activate_a2ui_extension(context) - - # Determine which agent to use based on whether the a2ui extension is active. - if use_ui: - agent = self.ui_agent - logger.info( - "--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---" - ) - else: - # Enforce A2UI extension as per review comment - error_msg = "A2UI extension is NOT active. This agent requires A2UI to function." - logger.error(f"--- AGENT_EXECUTOR: {error_msg} ---") - raise ServerError(error=UnsupportedOperationError(error_msg)) - - if context.message and context.message.parts: - logger.info( - f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message parts ---" - ) - for i, part in enumerate(context.message.parts): - if isinstance(part.root, DataPart): - if "userAction" in part.root.data: - logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") - ui_event_part = part.root.data["userAction"] - elif "request" in part.root.data: - logger.info(f" Part {i}: Found 'request' in DataPart.") - query = part.root.data["request"] - - # Check for inline catalog - if "metadata" in part.root.data and "inlineCatalogs" in part.root.data["metadata"]: - logger.info(f" Part {i}: Found 'inlineCatalogs' in DataPart.") - inline_catalog = part.root.data["metadata"]["inlineCatalogs"] - catalog_json = json.dumps(inline_catalog) - # Append to query so the agent sees it (simple injection) - query += f"\n\n[SYSTEM: The client supports the following custom components: {catalog_json}]" - else: - logger.info(f" Part {i}: DataPart (data: {part.root.data})") - elif isinstance(part.root, TextPart): - logger.info(f" Part {i}: TextPart (text: {part.root.text})") - else: - logger.info(f" Part {i}: Unknown part type ({type(part.root)})") - - if ui_event_part: - logger.info(f"Received a2ui ClientEvent: {ui_event_part}") - action = ui_event_part.get("name") - ctx = ui_event_part.get("context", {}) - - if action == "view_profile": - contact_name = ctx.get("contactName", "Unknown") - department = ctx.get("department", "") - query = f"WHO_IS: {contact_name} from {department}" - - elif action == "send_email": - contact_name = ctx.get("contactName", "Unknown") - email = ctx.get("email", "Unknown") - query = f"USER_WANTS_TO_EMAIL: {contact_name} at {email}" - - elif action == "send_message": - contact_name = ctx.get("contactName", "Unknown") - query = f"ACTION: send_message (contact: {contact_name})" - - elif action == "view_full_profile": - contact_name = ctx.get("contactName", "Unknown") - query = f"USER_WANTS_FULL_PROFILE: {contact_name}" - - elif action == "view_location": - contact_id = ctx.get("contactId", "Unknown") - query = f"ACTION: view_location (contactId: {contact_id})" - - elif action == "select_desk": - contact_id = ctx.get("contactId", "Unknown") - query = f"ACTION: select_desk contactId:{contact_id}" - - elif action == "chart_node_click": - node_name = ctx.get("clickedNodeName", "Unknown") - source = ctx.get("source", "") - query = f"ACTION: chart_node_click (context: clickedNodeName=\"{node_name}\")" - if source == "modal": - query += " (from modal)" - - elif action == "dismiss_modal" or action == "close_modal": - query = "ACTION: close_modal" - - else: - query = f"User submitted an event: {action} with data: {ctx}" + """Contact AgentExecutor Example.""" + + def __init__(self, base_url: str): + # Instantiate the UI agent. + self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) + + async def execute( + self, + context: RequestContext, + event_queue: EventQueue, + ) -> None: + query = "" + ui_event_part = None + action = None + + logger.info(f"--- Client requested extensions: {context.requested_extensions} ---") + use_ui = try_activate_a2ui_extension(context) + + # Determine which agent to use based on whether the a2ui extension is active. + if use_ui: + agent = self.ui_agent + logger.info("--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---") + else: + # Enforce A2UI extension as per review comment + error_msg = "A2UI extension is NOT active. This agent requires A2UI to function." + logger.error(f"--- AGENT_EXECUTOR: {error_msg} ---") + raise ServerError(error=UnsupportedOperationError(error_msg)) + + if context.message and context.message.parts: + logger.info( + f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message" + " parts ---" + ) + for i, part in enumerate(context.message.parts): + if isinstance(part.root, DataPart): + if "userAction" in part.root.data: + logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") + ui_event_part = part.root.data["userAction"] + elif "request" in part.root.data: + logger.info(f" Part {i}: Found 'request' in DataPart.") + query = part.root.data["request"] + + # Check for inline catalog + if ( + "metadata" in part.root.data + and "inlineCatalogs" in part.root.data["metadata"] + ): + logger.info(f" Part {i}: Found 'inlineCatalogs' in DataPart.") + inline_catalog = part.root.data["metadata"]["inlineCatalogs"] + catalog_json = json.dumps(inline_catalog) + # Append to query so the agent sees it (simple injection) + query += ( + "\n\n[SYSTEM: The client supports the following custom components:" + f" {catalog_json}]" + ) + else: + logger.info(f" Part {i}: DataPart (data: {part.root.data})") + elif isinstance(part.root, TextPart): + logger.info(f" Part {i}: TextPart (text: {part.root.text})") else: - if not query: - logger.info("No a2ui UI event part found. Falling back to text input.") - query = context.get_user_input() + logger.info(f" Part {i}: Unknown part type ({type(part.root)})") + + if ui_event_part: + logger.info(f"Received a2ui ClientEvent: {ui_event_part}") + action = ui_event_part.get("name") + ctx = ui_event_part.get("context", {}) + + if action == "view_profile": + contact_name = ctx.get("contactName", "Unknown") + department = ctx.get("department", "") + query = f"WHO_IS: {contact_name} from {department}" + + elif action == "send_email": + contact_name = ctx.get("contactName", "Unknown") + email = ctx.get("email", "Unknown") + query = f"USER_WANTS_TO_EMAIL: {contact_name} at {email}" + + elif action == "send_message": + contact_name = ctx.get("contactName", "Unknown") + query = f"ACTION: send_message (contact: {contact_name})" + + elif action == "view_full_profile": + contact_name = ctx.get("contactName", "Unknown") + query = f"USER_WANTS_FULL_PROFILE: {contact_name}" + + elif action == "view_location": + contact_id = ctx.get("contactId", "Unknown") + query = f"ACTION: view_location (contactId: {contact_id})" + + elif action == "select_desk": + contact_id = ctx.get("contactId", "Unknown") + query = f"ACTION: select_desk contactId:{contact_id}" + + elif action == "chart_node_click": + node_name = ctx.get("clickedNodeName", "Unknown") + source = ctx.get("source", "") + query = f'ACTION: chart_node_click (context: clickedNodeName="{node_name}")' + if source == "modal": + query += " (from modal)" + + elif action == "dismiss_modal" or action == "close_modal": + query = "ACTION: close_modal" + + else: + query = f"User submitted an event: {action} with data: {ctx}" + else: + if not query: + logger.info("No a2ui UI event part found. Falling back to text input.") + query = context.get_user_input() + + logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") + + task = context.current_task + + if not task: + task = new_task(context.message) + await event_queue.enqueue_event(task) + updater = TaskUpdater(event_queue, task.id, task.context_id) + + async for item in agent.stream(query, task.context_id): + is_task_complete = item["is_task_complete"] + if not is_task_complete: + await updater.update_status( + TaskState.working, + new_agent_text_message(item["updates"], task.context_id, task.id), + ) + continue - logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") + final_state = TaskState.input_required # Default + if action in ["send_email", "send_message", "view_full_profile"]: + final_state = TaskState.completed - task = context.current_task + content = item["content"] + final_parts = [] + if "---a2ui_JSON---" in content: + logger.info("Splitting final response into text and UI parts.") + text_content, json_string = content.split("---a2ui_JSON---", 1) - if not task: - task = new_task(context.message) - await event_queue.enqueue_event(task) - updater = TaskUpdater(event_queue, task.id, task.context_id) + if text_content.strip(): + final_parts.append(Part(root=TextPart(text=text_content.strip()))) - async for item in agent.stream(query, task.context_id): - is_task_complete = item["is_task_complete"] - if not is_task_complete: - await updater.update_status( - TaskState.working, - new_agent_text_message(item["updates"], task.context_id, task.id), - ) - continue - - final_state = TaskState.input_required # Default - if action in ["send_email", "send_message", "view_full_profile"]: - final_state = TaskState.completed - - content = item["content"] - final_parts = [] - if "---a2ui_JSON---" in content: - logger.info("Splitting final response into text and UI parts.") - text_content, json_string = content.split("---a2ui_JSON---", 1) - - if text_content.strip(): - final_parts.append(Part(root=TextPart(text=text_content.strip()))) - - if json_string.strip(): - try: - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - - # Handle empty JSON list (e.g., no results) - if not json_string_cleaned or json_string_cleaned == "[]": - logger.info("Received empty/no JSON part. Skipping DataPart.") - else: - json_data = json.loads(json_string_cleaned) - if isinstance(json_data, list): - logger.info( - f"Found {len(json_data)} messages. Creating individual DataParts." - ) - for message in json_data: - final_parts.append(create_a2ui_part(message)) - - else: - # Handle the case where a single JSON object is returned - logger.info( - "Received a single JSON object. Creating a DataPart." - ) - final_parts.append(create_a2ui_part(json_data)) - - except json.JSONDecodeError as e: - logger.error(f"Failed to parse UI JSON: {e}") - final_parts.append(Part(root=TextPart(text=json_string))) - else: - final_parts.append(Part(root=TextPart(text=content.strip()))) - - # If after all that, we only have empty parts, add a default text response - if not final_parts or all(isinstance(p.root, TextPart) and not p.root.text for p in final_parts): - final_parts = [Part(root=TextPart(text="OK."))] - - - logger.info("--- FINAL PARTS TO BE SENT ---") - for i, part in enumerate(final_parts): - logger.info(f" - Part {i}: Type = {type(part.root)}") - if isinstance(part.root, TextPart): - logger.info(f" - Text: {part.root.text[:200]}...") - elif isinstance(part.root, DataPart): - logger.info(f" - Data: {str(part.root.data)[:200]}...") - logger.info("-----------------------------") - - await updater.update_status( - final_state, - new_agent_parts_message(final_parts, task.context_id, task.id), - final=(final_state == TaskState.completed), + if json_string.strip(): + try: + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() ) - break - async def cancel( - self, request: RequestContext, event_queue: EventQueue - ) -> Task | None: - raise ServerError(error=UnsupportedOperationError()) + # Handle empty JSON list (e.g., no results) + if not json_string_cleaned or json_string_cleaned == "[]": + logger.info("Received empty/no JSON part. Skipping DataPart.") + else: + json_data = json.loads(json_string_cleaned) + if isinstance(json_data, list): + logger.info( + f"Found {len(json_data)} messages. Creating individual DataParts." + ) + for message in json_data: + final_parts.append(create_a2ui_part(message)) + + else: + # Handle the case where a single JSON object is returned + logger.info("Received a single JSON object. Creating a DataPart.") + final_parts.append(create_a2ui_part(json_data)) + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse UI JSON: {e}") + final_parts.append(Part(root=TextPart(text=json_string))) + else: + final_parts.append(Part(root=TextPart(text=content.strip()))) + + # If after all that, we only have empty parts, add a default text response + if not final_parts or all( + isinstance(p.root, TextPart) and not p.root.text for p in final_parts + ): + final_parts = [Part(root=TextPart(text="OK."))] + + logger.info("--- FINAL PARTS TO BE SENT ---") + for i, part in enumerate(final_parts): + logger.info(f" - Part {i}: Type = {type(part.root)}") + if isinstance(part.root, TextPart): + logger.info(f" - Text: {part.root.text[:200]}...") + elif isinstance(part.root, DataPart): + logger.info(f" - Data: {str(part.root.data)[:200]}...") + logger.info("-----------------------------") + + await updater.update_status( + final_state, + new_agent_parts_message(final_parts, task.context_id, task.id), + final=(final_state == TaskState.completed), + ) + break + + async def cancel( + self, request: RequestContext, event_queue: EventQueue + ) -> Task | None: + raise ServerError(error=UnsupportedOperationError()) diff --git a/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py b/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py index c1b8be5f6..1914e13ed 100644 --- a/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py +++ b/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py @@ -38,23 +38,23 @@ def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. + """ + Constructs the full prompt with UI instructions, rules, examples, and schema. - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. + Args: + base_url: The base URL for resolving static assets like logos. + examples: A string containing the specific UI examples for the agent's task. - Returns: - A formatted string to be used as the system prompt for the LLM. - """ + Returns: + A formatted string to be used as the system prompt for the LLM. + """ - # --- THIS IS THE FIX --- - # We no longer call .format() on the examples, as it breaks the JSON. - formatted_examples = examples - # --- END FIX --- + # --- THIS IS THE FIX --- + # We no longer call .format() on the examples, as it breaks the JSON. + formatted_examples = examples + # --- END FIX --- - return f""" + return f""" {AGENT_INSTRUCTION} You are a helpful contact lookup assistant. Your final output MUST be a a2ui UI JSON response. @@ -91,10 +91,10 @@ def get_ui_prompt(base_url: str, examples: str) -> str: def get_text_prompt() -> str: - """ - Constructs the prompt for a text-only agent. - """ - return """ + """ + Constructs the prompt for a text-only agent. + """ + return """ You are a helpful contact lookup assistant. Your final output MUST be a text response. To generate the response, you MUST follow these rules: @@ -110,11 +110,12 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder - my_base_url = "http://localhost:8000" - from a2ui_examples import load_examples - contact_prompt = get_ui_prompt(my_base_url, load_examples(my_base_url)) - print(contact_prompt) - with open("generated_prompt.txt", "w") as f: - f.write(contact_prompt) - print("\nGenerated prompt saved to generated_prompt.txt") + # Example of how to use the prompt builder + my_base_url = "http://localhost:8000" + from a2ui_examples import load_examples + + contact_prompt = get_ui_prompt(my_base_url, load_examples(my_base_url)) + print(contact_prompt) + with open("generated_prompt.txt", "w") as f: + f.write(contact_prompt) + print("\nGenerated prompt saved to generated_prompt.txt") diff --git a/samples/agent/adk/contact_multiple_surfaces/tools.py b/samples/agent/adk/contact_multiple_surfaces/tools.py index 0b679c486..2a0c845f4 100644 --- a/samples/agent/adk/contact_multiple_surfaces/tools.py +++ b/samples/agent/adk/contact_multiple_surfaces/tools.py @@ -22,44 +22,42 @@ def get_contact_info(name: str, tool_context: ToolContext, department: str = "") -> str: - """Call this tool to get a list of contacts based on a name and optional department. - 'name' is the person's name to search for. - 'department' is the optional department to filter by. - """ - logger.info("--- TOOL CALLED: get_contact_info ---") - logger.info(f" - Name: {name}") - logger.info(f" - Department: {department}") - - results = [] - try: - script_dir = os.path.dirname(__file__) - file_path = os.path.join(script_dir, "contact_data.json") - with open(file_path) as f: - contact_data_str = f.read() - all_contacts = json.loads(contact_data_str) - - name_lower = name.lower() - - dept_lower = department.lower() if department else "" - - # Filter by name - results = [ - contact for contact in all_contacts if name_lower in contact["name"].lower() - ] - - # If department is provided, filter results further - if dept_lower: - results = [ - contact - for contact in results - if dept_lower in contact["department"].lower() - ] - - logger.info(f" - Success: Found {len(results)} matching contacts.") - - except FileNotFoundError: - logger.error(f" - Error: contact_data.json not found at {file_path}") - except json.JSONDecodeError: - logger.error(f" - Error: Failed to decode JSON from {file_path}") - - return json.dumps(results) + """Call this tool to get a list of contacts based on a name and optional department. + 'name' is the person's name to search for. + 'department' is the optional department to filter by. + """ + logger.info("--- TOOL CALLED: get_contact_info ---") + logger.info(f" - Name: {name}") + logger.info(f" - Department: {department}") + + results = [] + try: + script_dir = os.path.dirname(__file__) + file_path = os.path.join(script_dir, "contact_data.json") + with open(file_path) as f: + contact_data_str = f.read() + all_contacts = json.loads(contact_data_str) + + name_lower = name.lower() + + dept_lower = department.lower() if department else "" + + # Filter by name + results = [ + contact for contact in all_contacts if name_lower in contact["name"].lower() + ] + + # If department is provided, filter results further + if dept_lower: + results = [ + contact for contact in results if dept_lower in contact["department"].lower() + ] + + logger.info(f" - Success: Found {len(results)} matching contacts.") + + except FileNotFoundError: + logger.error(f" - Error: contact_data.json not found at {file_path}") + except json.JSONDecodeError: + logger.error(f" - Error: Failed to decode JSON from {file_path}") + + return json.dumps(results) diff --git a/samples/agent/adk/mcp/__main__.py b/samples/agent/adk/mcp/__main__.py index d6931ceaf..4efdd53e1 100644 --- a/samples/agent/adk/mcp/__main__.py +++ b/samples/agent/adk/mcp/__main__.py @@ -16,4 +16,4 @@ from server import main -sys.exit(main()) # type: ignore[call-arg] \ No newline at end of file +sys.exit(main()) # type: ignore[call-arg] diff --git a/samples/agent/adk/mcp/server.py b/samples/agent/adk/mcp/server.py index 464df4dea..19a9e6af3 100644 --- a/samples/agent/adk/mcp/server.py +++ b/samples/agent/adk/mcp/server.py @@ -26,29 +26,33 @@ def load_a2ui_schema() -> dict[str, Any]: - current_dir = pathlib.Path(__file__).resolve().parent - spec_root = current_dir / "../../../../specification/v0_8/json" + current_dir = pathlib.Path(__file__).resolve().parent + spec_root = current_dir / "../../../../specification/v0_8/json" - server_to_client_content = (spec_root / "server_to_client.json").read_text() - server_to_client_json = json.loads(server_to_client_content) - - standard_catalog_content = ( - spec_root / "standard_catalog_definition.json" - ).read_text() - standard_catalog_json = json.loads(standard_catalog_content) - - server_to_client_json["properties"]["surfaceUpdate"]["properties"]["components"]["items"]["properties"]["component"]["properties"] = standard_catalog_json + server_to_client_content = (spec_root / "server_to_client.json").read_text() + server_to_client_json = json.loads(server_to_client_content) + + standard_catalog_content = ( + spec_root / "standard_catalog_definition.json" + ).read_text() + standard_catalog_json = json.loads(standard_catalog_content) + + server_to_client_json["properties"]["surfaceUpdate"]["properties"]["components"][ + "items" + ]["properties"]["component"]["properties"] = standard_catalog_json + + return wrap_as_json_array(server_to_client_json) - return wrap_as_json_array(server_to_client_json) def load_a2ui_client_to_server_schema() -> dict[str, Any]: - current_dir = pathlib.Path(__file__).resolve().parent - spec_root = current_dir / "../../../../specification/v0_8/json" + current_dir = pathlib.Path(__file__).resolve().parent + spec_root = current_dir / "../../../../specification/v0_8/json" + + client_to_server_content = (spec_root / "client_to_server.json").read_text() + client_to_server_json = json.loads(client_to_server_content) + + return client_to_server_json - client_to_server_content = (spec_root / "client_to_server.json").read_text() - client_to_server_json = json.loads(client_to_server_content) - - return client_to_server_json @click.command() @click.option("--port", default=8000, help="Port to listen on for SSE") @@ -59,110 +63,107 @@ def load_a2ui_client_to_server_schema() -> dict[str, Any]: help="Transport type", ) def main(port: int, transport: str) -> int: - a2ui_schema = load_a2ui_schema() - print(f"Loaded A2UI schema: {a2ui_schema}") - - recipe_a2ui_json = json.loads((pathlib.Path(__file__).resolve().parent / "recipe_a2ui.json").read_text()) - jsonschema.validate( - instance=recipe_a2ui_json, schema=a2ui_schema - ) - print(f"Loaded Recipe A2UI JSON: {recipe_a2ui_json}") - - a2ui_client_to_server_schema = load_a2ui_client_to_server_schema() - print(f"Loaded A2UI client to server schema: {a2ui_client_to_server_schema}") - - app = Server("a2ui-over-mcp-demo") - - @app.call_tool() - async def handle_call_tool(name: str, arguments: dict[str, Any]) -> dict[str, Any]: - if name=="get_recipe_a2ui": - return {"events": recipe_a2ui_json} - - if name=="send_a2ui_user_action": - return {"response": f"Received A2UI user action", "args": arguments} - - if name=="send_a2ui_error": - return {"response": f"Received A2UI error", "args": arguments} - - raise ValueError(f"Unknown tool: {name}") - - @app.list_tools() - async def list_tools() -> list[types.Tool]: - return [ - types.Tool( - name="get_recipe_a2ui", - title="Get Recipe A2UI", - description="Returns the A2UI JSON to show a recipe", - inputSchema={ - "type": "object", - "additionalProperties": False - }, - # MCP throws an error for "type":"array" so wrapping in an object - # TODO fix this in MCP SDK - outputSchema={ - "type": "object", - "properties": {"events": a2ui_schema}, - "required": ["events"], - "additionalProperties": False - } - ), - types.Tool( - name="send_a2ui_user_action", - title="Send A2UI User Action", - description="Sends an A2UI user action", - inputSchema=a2ui_client_to_server_schema["properties"]["userAction"], - ), - types.Tool( - name="send_a2ui_error", - title="Send A2UI Error", - description="Sends an A2UI error", - inputSchema=a2ui_client_to_server_schema["properties"]["error"], + a2ui_schema = load_a2ui_schema() + print(f"Loaded A2UI schema: {a2ui_schema}") + + recipe_a2ui_json = json.loads( + (pathlib.Path(__file__).resolve().parent / "recipe_a2ui.json").read_text() + ) + jsonschema.validate(instance=recipe_a2ui_json, schema=a2ui_schema) + print(f"Loaded Recipe A2UI JSON: {recipe_a2ui_json}") + + a2ui_client_to_server_schema = load_a2ui_client_to_server_schema() + print(f"Loaded A2UI client to server schema: {a2ui_client_to_server_schema}") + + app = Server("a2ui-over-mcp-demo") + + @app.call_tool() + async def handle_call_tool(name: str, arguments: dict[str, Any]) -> dict[str, Any]: + if name == "get_recipe_a2ui": + return {"events": recipe_a2ui_json} + + if name == "send_a2ui_user_action": + return {"response": f"Received A2UI user action", "args": arguments} + + if name == "send_a2ui_error": + return {"response": f"Received A2UI error", "args": arguments} + + raise ValueError(f"Unknown tool: {name}") + + @app.list_tools() + async def list_tools() -> list[types.Tool]: + return [ + types.Tool( + name="get_recipe_a2ui", + title="Get Recipe A2UI", + description="Returns the A2UI JSON to show a recipe", + inputSchema={"type": "object", "additionalProperties": False}, + # MCP throws an error for "type":"array" so wrapping in an object + # TODO fix this in MCP SDK + outputSchema={ + "type": "object", + "properties": {"events": a2ui_schema}, + "required": ["events"], + "additionalProperties": False, + }, + ), + types.Tool( + name="send_a2ui_user_action", + title="Send A2UI User Action", + description="Sends an A2UI user action", + inputSchema=a2ui_client_to_server_schema["properties"]["userAction"], + ), + types.Tool( + name="send_a2ui_error", + title="Send A2UI Error", + description="Sends an A2UI error", + inputSchema=a2ui_client_to_server_schema["properties"]["error"], + ), + ] + + if transport == "sse": + from mcp.server.sse import SseServerTransport + from starlette.applications import Starlette + from starlette.responses import Response + from starlette.routing import Mount, Route + from starlette.middleware import Middleware + from starlette.middleware.cors import CORSMiddleware + + sse = SseServerTransport("/messages/") + + async def handle_sse(request: Request): + async with sse.connect_sse(request.scope, request.receive, request._send) as streams: # type: ignore[reportPrivateUsage] + await app.run(streams[0], streams[1], app.create_initialization_options()) + return Response() + + starlette_app = Starlette( + debug=True, + routes=[ + Route("/sse", endpoint=handle_sse, methods=["GET"]), + Mount("/messages/", app=sse.handle_post_message), + ], + middleware=[ + Middleware( + CORSMiddleware, + allow_origins=["*"], + allow_methods=["*"], + allow_headers=["*"], ) - ] - - if transport == "sse": - from mcp.server.sse import SseServerTransport - from starlette.applications import Starlette - from starlette.responses import Response - from starlette.routing import Mount, Route - from starlette.middleware import Middleware - from starlette.middleware.cors import CORSMiddleware - - sse = SseServerTransport("/messages/") - - async def handle_sse(request: Request): - async with sse.connect_sse(request.scope, request.receive, request._send) as streams: # type: ignore[reportPrivateUsage] - await app.run(streams[0], streams[1], app.create_initialization_options()) - return Response() - - starlette_app = Starlette( - debug=True, - routes=[ - Route("/sse", endpoint=handle_sse, methods=["GET"]), - Mount("/messages/", app=sse.handle_post_message), - ], - middleware=[ - Middleware( - CORSMiddleware, - allow_origins=["*"], - allow_methods=["*"], - allow_headers=["*"], - ) - ], - ) - - import uvicorn - - print(f"Server running at 127.0.0.1:{port} using sse") - uvicorn.run(starlette_app, host="127.0.0.1", port=port) - else: - from mcp.server.stdio import stdio_server - - async def arun(): - async with stdio_server() as streams: - await app.run(streams[0], streams[1], app.create_initialization_options()) - - click.echo("Server running using stdio", err=True) - anyio.run(arun) - - return 0 \ No newline at end of file + ], + ) + + import uvicorn + + print(f"Server running at 127.0.0.1:{port} using sse") + uvicorn.run(starlette_app, host="127.0.0.1", port=port) + else: + from mcp.server.stdio import stdio_server + + async def arun(): + async with stdio_server() as streams: + await app.run(streams[0], streams[1], app.create_initialization_options()) + + click.echo("Server running using stdio", err=True) + anyio.run(arun) + + return 0 diff --git a/samples/agent/adk/orchestrator/__main__.py b/samples/agent/adk/orchestrator/__main__.py index 92514d4fb..f7fa23cb9 100644 --- a/samples/agent/adk/orchestrator/__main__.py +++ b/samples/agent/adk/orchestrator/__main__.py @@ -32,7 +32,7 @@ class MissingAPIKeyError(Exception): - """Exception for missing API key.""" + """Exception for missing API key.""" @click.command() @@ -40,48 +40,51 @@ class MissingAPIKeyError(Exception): @click.option("--port", default=10002, type=int) @click.option("--subagent_urls", multiple=True, type=str, required=True) def main(host, port, subagent_urls): - try: - # Check for API key only if Vertex AI is not configured - if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": - if not os.getenv("GEMINI_API_KEY"): - raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI is not TRUE." - ) + try: + # Check for API key only if Vertex AI is not configured + if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": + if not os.getenv("GEMINI_API_KEY"): + raise MissingAPIKeyError( + "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" + " is not TRUE." + ) - base_url = f"http://{host}:{port}" - - orchestrator_agent, agent_card = asyncio.run(OrchestratorAgent.build_agent(base_url=base_url, subagent_urls=subagent_urls)) - agent_executor = OrchestratorAgentExecutor(agent=orchestrator_agent) + base_url = f"http://{host}:{port}" - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler - ) - import uvicorn + orchestrator_agent, agent_card = asyncio.run( + OrchestratorAgent.build_agent(base_url=base_url, subagent_urls=subagent_urls) + ) + agent_executor = OrchestratorAgentExecutor(agent=orchestrator_agent) - app = server.build() + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + server = A2AStarletteApplication( + agent_card=agent_card, http_handler=request_handler + ) + import uvicorn - app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:5173"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) + app = server.build() - uvicorn.run(app, host=host, port=port) - except MissingAPIKeyError as e: - logger.error(f"Error: {e} {traceback.format_exc()}") - exit(1) - except Exception as e: - logger.error( - f"An error occurred during server startup: {e} {traceback.format_exc()}" - ) - exit(1) + app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:5173"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + uvicorn.run(app, host=host, port=port) + except MissingAPIKeyError as e: + logger.error(f"Error: {e} {traceback.format_exc()}") + exit(1) + except Exception as e: + logger.error( + f"An error occurred during server startup: {e} {traceback.format_exc()}" + ) + exit(1) if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/orchestrator/agent.py b/samples/agent/adk/orchestrator/agent.py index 7298dd627..23fe938ab 100644 --- a/samples/agent/adk/orchestrator/agent.py +++ b/samples/agent/adk/orchestrator/agent.py @@ -25,7 +25,7 @@ import httpx import re import part_converters -from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.callback_context import CallbackContext from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse from subagent_route_manager import SubagentRouteManager @@ -41,177 +41,225 @@ logger = logging.getLogger(__name__) + class A2UIMetadataInterceptor(ClientCallInterceptor): - @override - async def intercept( - self, - method_name: str, - request_payload: dict[str, Any], - http_kwargs: dict[str, Any], - agent_card: AgentCard | None, - context: ClientCallContext | None, - ) -> tuple[dict[str, Any], dict[str, Any]]: - """Enables the A2UI extension header and adds A2UI client capabilities to remote agent message metadata.""" - logger.info("Intercepting client call to method: " + method_name + " and payload " + json.dumps(request_payload)) - - if context and context.state and context.state.get("use_ui"): - # Add A2UI extension header - http_kwargs["headers"] = {HTTP_EXTENSION_HEADER: A2UI_EXTENSION_URI} - - # Add A2UI client capabilities (supported catalogs, etc) to message metadata - if (params := request_payload.get("params")) and (message := params.get("message")): - client_capabilities = context.state.get("client_capabilities") - if "metadata" not in message: - message["metadata"] = {} - message["metadata"][A2UI_CLIENT_CAPABILITIES_KEY] = client_capabilities - logger.info(f"Added client capabilities to remote agent message metadata: {client_capabilities}") - - return request_payload, http_kwargs + + @override + async def intercept( + self, + method_name: str, + request_payload: dict[str, Any], + http_kwargs: dict[str, Any], + agent_card: AgentCard | None, + context: ClientCallContext | None, + ) -> tuple[dict[str, Any], dict[str, Any]]: + """Enables the A2UI extension header and adds A2UI client capabilities to remote agent message metadata.""" + logger.info( + "Intercepting client call to method: " + + method_name + + " and payload " + + json.dumps(request_payload) + ) + + if context and context.state and context.state.get("use_ui"): + # Add A2UI extension header + http_kwargs["headers"] = {HTTP_EXTENSION_HEADER: A2UI_EXTENSION_URI} + + # Add A2UI client capabilities (supported catalogs, etc) to message metadata + if (params := request_payload.get("params")) and ( + message := params.get("message") + ): + client_capabilities = context.state.get("client_capabilities") + if "metadata" not in message: + message["metadata"] = {} + message["metadata"][A2UI_CLIENT_CAPABILITIES_KEY] = client_capabilities + logger.info( + "Added client capabilities to remote agent message metadata:" + f" {client_capabilities}" + ) + + return request_payload, http_kwargs + class A2AClientFactoryWithA2UIMetadata(A2AClientFactory): - @override - def create( - self, - card: AgentCard, - consumers: list[Consumer] | None = None, - interceptors: list[ClientCallInterceptor] | None = None, - ) -> Client: - # Add A2UI metadata interceptor - return super().create(card, consumers, (interceptors or []) + [A2UIMetadataInterceptor()]) + + @override + def create( + self, + card: AgentCard, + consumers: list[Consumer] | None = None, + interceptors: list[ClientCallInterceptor] | None = None, + ) -> Client: + # Add A2UI metadata interceptor + return super().create( + card, consumers, (interceptors or []) + [A2UIMetadataInterceptor()] + ) + class OrchestratorAgent: - """An agent that runs an ecommerce dashboard""" - - SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] - - @classmethod - async def programmtically_route_user_action_to_subagent( - cls, - callback_context: CallbackContext, - llm_request: LlmRequest, - ) -> LlmResponse: - if ( - llm_request.contents - and (last_content := llm_request.contents[-1]).parts - and (a2a_part := part_converters.convert_genai_part_to_a2a_part(last_content.parts[-1])) - and is_a2ui_part(a2a_part) - and (user_action := a2a_part.root.data.get("userAction")) - and (surface_id := user_action.get("surfaceId")) - and (target_agent := await SubagentRouteManager.get_route_to_subagent_name(surface_id, callback_context.state)) - ): - logger.info(f"Programmatically routing userAction for surfaceId '{surface_id}' to subagent '{target_agent}'") - return LlmResponse( - content=genai_types.Content( - parts=[ - genai_types.Part( - function_call=genai_types.FunctionCall( - name="transfer_to_agent", - args={"agent_name": target_agent}, - ) - ) - ] - ) + """An agent that runs an ecommerce dashboard""" + + SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] + + @classmethod + async def programmtically_route_user_action_to_subagent( + cls, + callback_context: CallbackContext, + llm_request: LlmRequest, + ) -> LlmResponse: + if ( + llm_request.contents + and (last_content := llm_request.contents[-1]).parts + and ( + a2a_part := part_converters.convert_genai_part_to_a2a_part( + last_content.parts[-1] ) - - return None - - @classmethod - async def build_agent(cls, base_url: str, subagent_urls: List[str]) -> (LlmAgent, AgentCard): - """Builds the LLM agent for the orchestrator_agent agent.""" - - subagents = [] - supported_catalog_ids = set() - skills = [] - accepts_inline_catalogs = False - for subagent_url in subagent_urls: - async with httpx.AsyncClient() as httpx_client: - resolver = A2ACardResolver( - httpx_client=httpx_client, - base_url=subagent_url, - ) - - subagent_card = await resolver.get_agent_card() - for extension in subagent_card.capabilities.extensions or []: - if extension.uri == A2UI_EXTENSION_URI and extension.params: - supported_catalog_ids.update(extension.params.get(AGENT_EXTENSION_SUPPORTED_CATALOG_IDS_KEY) or []) - accepts_inline_catalogs |= bool(extension.params.get(AGENT_EXTENSION_ACCEPTS_INLINE_CATALOGS_KEY)) - - skills.extend(subagent_card.skills) - - logger.info('Successfully fetched public agent card:' + subagent_card.model_dump_json(indent=2, exclude_none=True)) - - # clean name for adk - clean_name = re.sub(r'[^0-9a-zA-Z_]+', '_', subagent_card.name) - if clean_name == "": - clean_name = "_" - if clean_name[0].isdigit(): - clean_name = f"_{clean_name}" - - # make remote agent - description = json.dumps({ - "id": clean_name, - "name": subagent_card.name, - "description": subagent_card.description, - "skills": [ - { - "name": skill.name, - "description": skill.description, - "examples": skill.examples, - "tags": skill.tags - } for skill in subagent_card.skills - ] - }, indent=2) - remote_a2a_agent = RemoteA2aAgent( - clean_name, - subagent_card, - description=description, # This will be appended to system instructions - a2a_part_converter=part_converters.convert_a2a_part_to_genai_part, - genai_part_converter=part_converters.convert_genai_part_to_a2a_part, - a2a_client_factory=A2AClientFactoryWithA2UIMetadata( - config=A2AClientConfig( - httpx_client=httpx.AsyncClient( - timeout=httpx.Timeout(timeout=DEFAULT_TIMEOUT), - ), - streaming=False, - polling=False, - supported_transports=[A2ATransport.jsonrpc], - ) - ) - ) - subagents.append(remote_a2a_agent) - - logger.info(f'Created remote agent with description: {description}') - - LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - agent = LlmAgent( - model=LiteLlm(model=LITELLM_MODEL), - name="orchestrator_agent", - description="An agent that orchestrates requests to multiple other agents", - instruction="You are an orchestrator agent. Your sole responsibility is to analyze the incoming user request, determine the user's intent, and route the task to exactly one of your expert subagents", - tools=[], - planner=BuiltInPlanner( - thinking_config=genai_types.ThinkingConfig( - include_thoughts=True, + ) + and is_a2ui_part(a2a_part) + and (user_action := a2a_part.root.data.get("userAction")) + and (surface_id := user_action.get("surfaceId")) + and ( + target_agent := await SubagentRouteManager.get_route_to_subagent_name( + surface_id, callback_context.state + ) + ) + ): + logger.info( + f"Programmatically routing userAction for surfaceId '{surface_id}' to" + f" subagent '{target_agent}'" + ) + return LlmResponse( + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + name="transfer_to_agent", + args={"agent_name": target_agent}, + ) + ) + ] + ) + ) + + return None + + @classmethod + async def build_agent( + cls, base_url: str, subagent_urls: List[str] + ) -> (LlmAgent, AgentCard): + """Builds the LLM agent for the orchestrator_agent agent.""" + + subagents = [] + supported_catalog_ids = set() + skills = [] + accepts_inline_catalogs = False + for subagent_url in subagent_urls: + async with httpx.AsyncClient() as httpx_client: + resolver = A2ACardResolver( + httpx_client=httpx_client, + base_url=subagent_url, + ) + + subagent_card = await resolver.get_agent_card() + for extension in subagent_card.capabilities.extensions or []: + if extension.uri == A2UI_EXTENSION_URI and extension.params: + supported_catalog_ids.update( + extension.params.get(AGENT_EXTENSION_SUPPORTED_CATALOG_IDS_KEY) or [] + ) + accepts_inline_catalogs |= bool( + extension.params.get(AGENT_EXTENSION_ACCEPTS_INLINE_CATALOGS_KEY) + ) + + skills.extend(subagent_card.skills) + + logger.info( + "Successfully fetched public agent card:" + + subagent_card.model_dump_json(indent=2, exclude_none=True) + ) + + # clean name for adk + clean_name = re.sub(r"[^0-9a-zA-Z_]+", "_", subagent_card.name) + if clean_name == "": + clean_name = "_" + if clean_name[0].isdigit(): + clean_name = f"_{clean_name}" + + # make remote agent + description = json.dumps( + { + "id": clean_name, + "name": subagent_card.name, + "description": subagent_card.description, + "skills": [ + { + "name": skill.name, + "description": skill.description, + "examples": skill.examples, + "tags": skill.tags, + } + for skill in subagent_card.skills + ], + }, + indent=2, + ) + remote_a2a_agent = RemoteA2aAgent( + clean_name, + subagent_card, + description=description, # This will be appended to system instructions + a2a_part_converter=part_converters.convert_a2a_part_to_genai_part, + genai_part_converter=part_converters.convert_genai_part_to_a2a_part, + a2a_client_factory=A2AClientFactoryWithA2UIMetadata( + config=A2AClientConfig( + httpx_client=httpx.AsyncClient( + timeout=httpx.Timeout(timeout=DEFAULT_TIMEOUT), + ), + streaming=False, + polling=False, + supported_transports=[A2ATransport.jsonrpc], ) ), - sub_agents=subagents, - before_model_callback=cls.programmtically_route_user_action_to_subagent, ) + subagents.append(remote_a2a_agent) - agent_card = AgentCard( - name="Orchestrator Agent", - description="This agent orchestrates requests to multiple subagents.", - url=base_url, - version="1.0.0", - default_input_modes=OrchestratorAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=OrchestratorAgent.SUPPORTED_CONTENT_TYPES, - capabilities=AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension( + logger.info(f"Created remote agent with description: {description}") + + LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") + agent = LlmAgent( + model=LiteLlm(model=LITELLM_MODEL), + name="orchestrator_agent", + description="An agent that orchestrates requests to multiple other agents", + instruction=( + "You are an orchestrator agent. Your sole responsibility is to analyze the" + " incoming user request, determine the user's intent, and route the task to" + " exactly one of your expert subagents" + ), + tools=[], + planner=BuiltInPlanner( + thinking_config=genai_types.ThinkingConfig( + include_thoughts=True, + ) + ), + sub_agents=subagents, + before_model_callback=cls.programmtically_route_user_action_to_subagent, + ) + + agent_card = AgentCard( + name="Orchestrator Agent", + description="This agent orchestrates requests to multiple subagents.", + url=base_url, + version="1.0.0", + default_input_modes=OrchestratorAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=OrchestratorAgent.SUPPORTED_CONTENT_TYPES, + capabilities=AgentCapabilities( + streaming=True, + extensions=[ + get_a2ui_agent_extension( accepts_inline_catalogs=accepts_inline_catalogs, - supported_catalog_ids=list(supported_catalog_ids))], - ), - skills=skills, - ) + supported_catalog_ids=list(supported_catalog_ids), + ) + ], + ), + skills=skills, + ) - return agent, agent_card \ No newline at end of file + return agent, agent_card diff --git a/samples/agent/adk/orchestrator/agent_executor.py b/samples/agent/adk/orchestrator/agent_executor.py index 0d1dab4cd..64d8dc509 100644 --- a/samples/agent/adk/orchestrator/agent_executor.py +++ b/samples/agent/adk/orchestrator/agent_executor.py @@ -46,100 +46,113 @@ class OrchestratorAgentExecutor(A2aAgentExecutor): - """Contact AgentExecutor Example.""" - - def __init__(self, agent: LlmAgent): - config = A2aAgentExecutorConfig( - gen_ai_part_converter=part_converters.convert_genai_part_to_a2a_part, - a2a_part_converter=part_converters.convert_a2a_part_to_genai_part, - event_converter=self.convert_event_to_a2a_events_and_save_surface_id_to_subagent_name, - ) - - runner = Runner( - app_name=agent.name, - agent=agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - - super().__init__(runner=runner, config=config) - - @classmethod - def convert_event_to_a2a_events_and_save_surface_id_to_subagent_name( - cls, - event: Event, - invocation_context: InvocationContext, - task_id: Optional[str] = None, - context_id: Optional[str] = None, - part_converter: part_converter.GenAIPartToA2APartConverter = part_converter.convert_genai_part_to_a2a_part, - ) -> List[A2AEvent]: - a2a_events = event_converter.convert_event_to_a2a_events( - event, - invocation_context, - task_id, - context_id, - part_converter, - ) - - for a2a_event in a2a_events: - # Try to populate subagent agent card if available. - subagent_card = None - if (active_subagent_name := event.author): - # We need to find the subagent by name - if (subagent := next((sub for sub in invocation_context.agent.sub_agents if sub.name == active_subagent_name), None)): - try: - subagent_card = json.loads(subagent.description) - except Exception: - logger.warning(f"Failed to parse agent description for {active_subagent_name}") - if subagent_card: - if a2a_event.metadata is None: - a2a_event.metadata = {} - a2a_event.metadata["a2a_subagent"] = subagent_card - - for a2a_part in a2a_event.status.message.parts: - if ( - is_a2ui_part(a2a_part) - and (begin_rendering := a2a_part.root.data.get("beginRendering")) - and (surface_id := begin_rendering.get("surfaceId")) - ): - asyncio.run_coroutine_threadsafe( - SubagentRouteManager.set_route_to_subagent_name( - surface_id, - event.author, - invocation_context.session_service, - invocation_context.session, - ), - asyncio.get_event_loop(), - ) - - return a2a_events - - @override - async def _prepare_session( - self, - context: RequestContext, - run_request: AgentRunRequest, - runner: Runner, - ): - session = await super()._prepare_session(context, run_request, runner) - - if try_activate_a2ui_extension(context): - client_capabilities = context.message.metadata.get(A2UI_CLIENT_CAPABILITIES_KEY) if context.message and context.message.metadata else None - - await runner.session_service.append_event( - session, - Event( - invocation_id=new_invocation_context_id(), - author="system", - actions=EventActions( - state_delta={ - # These values are used to configure A2UI messages to remote agent calls - "use_ui": True, - "client_capabilities": client_capabilities - } - ), - ), - ) - - return session \ No newline at end of file + """Contact AgentExecutor Example.""" + + def __init__(self, agent: LlmAgent): + config = A2aAgentExecutorConfig( + gen_ai_part_converter=part_converters.convert_genai_part_to_a2a_part, + a2a_part_converter=part_converters.convert_a2a_part_to_genai_part, + event_converter=self.convert_event_to_a2a_events_and_save_surface_id_to_subagent_name, + ) + + runner = Runner( + app_name=agent.name, + agent=agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + super().__init__(runner=runner, config=config) + + @classmethod + def convert_event_to_a2a_events_and_save_surface_id_to_subagent_name( + cls, + event: Event, + invocation_context: InvocationContext, + task_id: Optional[str] = None, + context_id: Optional[str] = None, + part_converter: part_converter.GenAIPartToA2APartConverter = part_converter.convert_genai_part_to_a2a_part, + ) -> List[A2AEvent]: + a2a_events = event_converter.convert_event_to_a2a_events( + event, + invocation_context, + task_id, + context_id, + part_converter, + ) + + for a2a_event in a2a_events: + # Try to populate subagent agent card if available. + subagent_card = None + if active_subagent_name := event.author: + # We need to find the subagent by name + if subagent := next( + ( + sub + for sub in invocation_context.agent.sub_agents + if sub.name == active_subagent_name + ), + None, + ): + try: + subagent_card = json.loads(subagent.description) + except Exception: + logger.warning( + f"Failed to parse agent description for {active_subagent_name}" + ) + if subagent_card: + if a2a_event.metadata is None: + a2a_event.metadata = {} + a2a_event.metadata["a2a_subagent"] = subagent_card + + for a2a_part in a2a_event.status.message.parts: + if ( + is_a2ui_part(a2a_part) + and (begin_rendering := a2a_part.root.data.get("beginRendering")) + and (surface_id := begin_rendering.get("surfaceId")) + ): + asyncio.run_coroutine_threadsafe( + SubagentRouteManager.set_route_to_subagent_name( + surface_id, + event.author, + invocation_context.session_service, + invocation_context.session, + ), + asyncio.get_event_loop(), + ) + + return a2a_events + + @override + async def _prepare_session( + self, + context: RequestContext, + run_request: AgentRunRequest, + runner: Runner, + ): + session = await super()._prepare_session(context, run_request, runner) + + if try_activate_a2ui_extension(context): + client_capabilities = ( + context.message.metadata.get(A2UI_CLIENT_CAPABILITIES_KEY) + if context.message and context.message.metadata + else None + ) + + await runner.session_service.append_event( + session, + Event( + invocation_id=new_invocation_context_id(), + author="system", + actions=EventActions( + state_delta={ + # These values are used to configure A2UI messages to remote agent calls + "use_ui": True, + "client_capabilities": client_capabilities, + } + ), + ), + ) + + return session diff --git a/samples/agent/adk/orchestrator/part_converters.py b/samples/agent/adk/orchestrator/part_converters.py index d9c3b656d..ad15c3648 100644 --- a/samples/agent/adk/orchestrator/part_converters.py +++ b/samples/agent/adk/orchestrator/part_converters.py @@ -25,27 +25,39 @@ logger = logging.getLogger(__name__) + def convert_a2a_part_to_genai_part( a2a_part: a2a_types.Part, -) -> Optional[genai_types.Part]: - if is_a2ui_part(a2a_part): - genai_part = genai_types.Part(text=a2a_part.model_dump_json()) - logger.info(f'Converted A2UI part from A2A: {a2a_part.model_dump_json(exclude_none=True)} to GenAI: {genai_part.model_dump_json(exclude_none=True)}'[:200] + "...") - return genai_part - - return part_converter.convert_a2a_part_to_genai_part(a2a_part) - -def convert_genai_part_to_a2a_part( +) -> Optional[genai_types.Part]: + if is_a2ui_part(a2a_part): + genai_part = genai_types.Part(text=a2a_part.model_dump_json()) + logger.info( + f"Converted A2UI part from A2A: {a2a_part.model_dump_json(exclude_none=True)} to GenAI: {genai_part.model_dump_json(exclude_none=True)}"[ + :200 + ] + + "..." + ) + return genai_part + + return part_converter.convert_a2a_part_to_genai_part(a2a_part) + + +def convert_genai_part_to_a2a_part( part: genai_types.Part, ) -> Optional[a2a_types.Part]: - if part.text: - try: - a2a_part = a2a_types.Part.model_validate_json(part.text) - if is_a2ui_part(a2a_part): - logger.info(f'Converted A2UI part from GenAI: {part.model_dump_json(exclude_none=True)} to A2A: {a2a_part.model_dump_json(exclude_none=True)}'[:200] + "...") - return a2a_part - except pydantic.ValidationError: - # Expected for normal text input - pass - - return part_converter.convert_genai_part_to_a2a_part(part) \ No newline at end of file + if part.text: + try: + a2a_part = a2a_types.Part.model_validate_json(part.text) + if is_a2ui_part(a2a_part): + logger.info( + f"Converted A2UI part from GenAI: {part.model_dump_json(exclude_none=True)} to A2A: {a2a_part.model_dump_json(exclude_none=True)}"[ + :200 + ] + + "..." + ) + return a2a_part + except pydantic.ValidationError: + # Expected for normal text input + pass + + return part_converter.convert_genai_part_to_a2a_part(part) diff --git a/samples/agent/adk/orchestrator/subagent_route_manager.py b/samples/agent/adk/orchestrator/subagent_route_manager.py index 2bd025cdd..bd6dae9c7 100644 --- a/samples/agent/adk/orchestrator/subagent_route_manager.py +++ b/samples/agent/adk/orchestrator/subagent_route_manager.py @@ -37,7 +37,11 @@ async def get_route_to_subagent_name( ) -> Optional[str]: """Gets the subagent route for the given tool call id.""" subagent_name = state.get(cls._get_routing_key(surface_id), None) - logging.info("Got subagent route for surface_id %s to subagent_name %s", surface_id, subagent_name) + logging.info( + "Got subagent route for surface_id %s to subagent_name %s", + surface_id, + subagent_name, + ) return subagent_name @classmethod @@ -49,7 +53,7 @@ async def set_route_to_subagent_name( session: Session, ): """Sets the subagent route for the given tool call id.""" - key = cls._get_routing_key(surface_id) + key = cls._get_routing_key(surface_id) if session.state.get(key) != subagent_name: await session_service.append_event( @@ -61,4 +65,8 @@ async def set_route_to_subagent_name( ), ) - logging.info("Set subagent route for surface_id %s to subagent_name %s", surface_id, subagent_name) \ No newline at end of file + logging.info( + "Set subagent route for surface_id %s to subagent_name %s", + surface_id, + subagent_name, + ) diff --git a/samples/agent/adk/pyproject.toml b/samples/agent/adk/pyproject.toml index 0f0914e10..8df3e4626 100644 --- a/samples/agent/adk/pyproject.toml +++ b/samples/agent/adk/pyproject.toml @@ -8,3 +8,22 @@ members = ["contact_lookup", "contact_multiple_surfaces", "orchestrator", "resta [tool.uv.sources] a2ui-agent = { path = "../../../a2a_agents/python/a2ui_agent", editable = true } +[tool.pyink] +unstable = true +target-version = [] +pyink-indentation = 2 +pyink-use-majority-quotes = true +pyink-annotation-pragmas = [ + "noqa", + "pylint:", + "type: ignore", + "pytype:", + "mypy:", + "pyright:", + "pyre-", +] + +[dependency-groups] +dev = [ + "pyink>=24.10.0", +] diff --git a/samples/agent/adk/restaurant_finder/__main__.py b/samples/agent/adk/restaurant_finder/__main__.py index b7114fd78..ee4e9115b 100644 --- a/samples/agent/adk/restaurant_finder/__main__.py +++ b/samples/agent/adk/restaurant_finder/__main__.py @@ -34,77 +34,80 @@ class MissingAPIKeyError(Exception): - """Exception for missing API key.""" + """Exception for missing API key.""" @click.command() @click.option("--host", default="localhost") @click.option("--port", default=10002) def main(host, port): - try: - # Check for API key only if Vertex AI is not configured - if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": - if not os.getenv("GEMINI_API_KEY"): - raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI is not TRUE." - ) - - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], + try: + # Check for API key only if Vertex AI is not configured + if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": + if not os.getenv("GEMINI_API_KEY"): + raise MissingAPIKeyError( + "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" + " is not TRUE." ) - skill = AgentSkill( - id="find_restaurants", - name="Find Restaurants Tool", - description="Helps find restaurants based on user criteria (e.g., cuisine, location).", - tags=["restaurant", "finder"], - examples=["Find me the top 10 chinese restaurants in the US"], - ) - - base_url = f"http://{host}:{port}" - - agent_card = AgentCard( - name="Restaurant Agent", - description="This agent helps find restaurants based on user criteria.", - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) - - agent_executor = RestaurantAgentExecutor(base_url=base_url) - - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler - ) - import uvicorn - - app = server.build() - - app.add_middleware( - CORSMiddleware, - allow_origin_regex=r"http://localhost:\d+", - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - app.mount("/static", StaticFiles(directory="images"), name="static") - uvicorn.run(app, host=host, port=port) - except MissingAPIKeyError as e: - logger.error(f"Error: {e}") - exit(1) - except Exception as e: - logger.error(f"An error occurred during server startup: {e}") - exit(1) + capabilities = AgentCapabilities( + streaming=True, + extensions=[get_a2ui_agent_extension()], + ) + skill = AgentSkill( + id="find_restaurants", + name="Find Restaurants Tool", + description=( + "Helps find restaurants based on user criteria (e.g., cuisine, location)." + ), + tags=["restaurant", "finder"], + examples=["Find me the top 10 chinese restaurants in the US"], + ) + + base_url = f"http://{host}:{port}" + + agent_card = AgentCard( + name="Restaurant Agent", + description="This agent helps find restaurants based on user criteria.", + url=base_url, # <-- Use base_url here + version="1.0.0", + default_input_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) + + agent_executor = RestaurantAgentExecutor(base_url=base_url) + + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + server = A2AStarletteApplication( + agent_card=agent_card, http_handler=request_handler + ) + import uvicorn + + app = server.build() + + app.add_middleware( + CORSMiddleware, + allow_origin_regex=r"http://localhost:\d+", + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + app.mount("/static", StaticFiles(directory="images"), name="static") + + uvicorn.run(app, host=host, port=port) + except MissingAPIKeyError as e: + logger.error(f"Error: {e}") + exit(1) + except Exception as e: + logger.error(f"An error occurred during server startup: {e}") + exit(1) if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/restaurant_finder/agent.py b/samples/agent/adk/restaurant_finder/agent.py index 5283cd882..e4f9e3fef 100644 --- a/samples/agent/adk/restaurant_finder/agent.py +++ b/samples/agent/adk/restaurant_finder/agent.py @@ -54,250 +54,246 @@ class RestaurantAgent: - """An agent that finds restaurants based on user criteria.""" - - SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] - - def __init__(self, base_url: str, use_ui: bool = False): - self.base_url = base_url - self.use_ui = use_ui - self._agent = self._build_agent(use_ui) - self._user_id = "remote_agent" - self._runner = Runner( - app_name=self._agent.name, - agent=self._agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - - # --- MODIFICATION: Wrap the schema --- - # Load the A2UI_SCHEMA string into a Python object for validation - try: - # First, load the schema for a *single message* - single_message_schema = json.loads(A2UI_SCHEMA) - - # The prompt instructs the LLM to return a *list* of messages. - # Therefore, our validation schema must be an *array* of the single message schema. - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} - logger.info( - "A2UI_SCHEMA successfully loaded and wrapped in an array validator." - ) - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- - - def get_processing_message(self) -> str: - return "Finding restaurants that match your criteria..." - - def _build_agent(self, use_ui: bool) -> LlmAgent: - """Builds the LLM agent for the restaurant agent.""" - LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - - if use_ui: - # Construct the full prompt with UI instructions, examples, and schema - instruction = AGENT_INSTRUCTION + get_ui_prompt( - self.base_url, RESTAURANT_UI_EXAMPLES + """An agent that finds restaurants based on user criteria.""" + + SUPPORTED_CONTENT_TYPES = ["text", "text/plain"] + + def __init__(self, base_url: str, use_ui: bool = False): + self.base_url = base_url + self.use_ui = use_ui + self._agent = self._build_agent(use_ui) + self._user_id = "remote_agent" + self._runner = Runner( + app_name=self._agent.name, + agent=self._agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + # --- MODIFICATION: Wrap the schema --- + # Load the A2UI_SCHEMA string into a Python object for validation + try: + # First, load the schema for a *single message* + single_message_schema = json.loads(A2UI_SCHEMA) + + # The prompt instructs the LLM to return a *list* of messages. + # Therefore, our validation schema must be an *array* of the single message schema. + self.a2ui_schema_object = {"type": "array", "items": single_message_schema} + logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") + except json.JSONDecodeError as e: + logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") + self.a2ui_schema_object = None + # --- END MODIFICATION --- + + def get_processing_message(self) -> str: + return "Finding restaurants that match your criteria..." + + def _build_agent(self, use_ui: bool) -> LlmAgent: + """Builds the LLM agent for the restaurant agent.""" + LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") + + if use_ui: + # Construct the full prompt with UI instructions, examples, and schema + instruction = AGENT_INSTRUCTION + get_ui_prompt( + self.base_url, RESTAURANT_UI_EXAMPLES + ) + else: + instruction = get_text_prompt() + + return LlmAgent( + model=LiteLlm(model=LITELLM_MODEL), + name="restaurant_agent", + description="An agent that finds restaurants and helps book tables.", + instruction=instruction, + tools=[get_restaurants], + ) + + async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: + session_state = {"base_url": self.base_url} + + session = await self._runner.session_service.get_session( + app_name=self._agent.name, + user_id=self._user_id, + session_id=session_id, + ) + if session is None: + session = await self._runner.session_service.create_session( + app_name=self._agent.name, + user_id=self._user_id, + state=session_state, + session_id=session_id, + ) + elif "base_url" not in session.state: + session.state["base_url"] = self.base_url + + # --- Begin: UI Validation and Retry Logic --- + max_retries = 1 # Total 2 attempts + attempt = 0 + current_query_text = query + + # Ensure schema was loaded + if self.use_ui and self.a2ui_schema_object is None: + logger.error( + "--- RestaurantAgent.stream: A2UI_SCHEMA is not loaded. " + "Cannot perform UI validation. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm facing an internal configuration error with my UI" + " components. Please contact support." + ), + } + return + + while attempt <= max_retries: + attempt += 1 + logger.info( + f"--- RestaurantAgent.stream: Attempt {attempt}/{max_retries + 1} " + f"for session {session_id} ---" + ) + + current_message = types.Content( + role="user", parts=[types.Part.from_text(text=current_query_text)] + ) + final_response_content = None + + async for event in self._runner.run_async( + user_id=self._user_id, + session_id=session.id, + new_message=current_message, + ): + logger.info(f"Event from runner: {event}") + if event.is_final_response(): + if event.content and event.content.parts and event.content.parts[0].text: + final_response_content = "\n".join( + [p.text for p in event.content.parts if p.text] ) + break # Got the final response, stop consuming events else: - instruction = get_text_prompt() - - return LlmAgent( - model=LiteLlm(model=LITELLM_MODEL), - name="restaurant_agent", - description="An agent that finds restaurants and helps book tables.", - instruction=instruction, - tools=[get_restaurants], + logger.info(f"Intermediate event: {event}") + # Yield intermediate updates on every attempt + yield { + "is_task_complete": False, + "updates": self.get_processing_message(), + } + + if final_response_content is None: + logger.warning( + "--- RestaurantAgent.stream: Received no final response content from" + f" runner (Attempt {attempt}). ---" ) - - async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: - session_state = {"base_url": self.base_url} - - session = await self._runner.session_service.get_session( - app_name=self._agent.name, - user_id=self._user_id, - session_id=session_id, + if attempt <= max_retries: + current_query_text = ( + "I received no response. Please try again." + f"Please retry the original request: '{query}'" + ) + continue # Go to next retry + else: + # Retries exhausted on no-response + final_response_content = ( + "I'm sorry, I encountered an error and couldn't process your request." + ) + # Fall through to send this as a text-only error + + is_valid = False + error_message = "" + + if self.use_ui: + logger.info( + "--- RestaurantAgent.stream: Validating UI response (Attempt" + f" {attempt})... ---" ) - if session is None: - session = await self._runner.session_service.create_session( - app_name=self._agent.name, - user_id=self._user_id, - state=session_state, - session_id=session_id, - ) - elif "base_url" not in session.state: - session.state["base_url"] = self.base_url - - # --- Begin: UI Validation and Retry Logic --- - max_retries = 1 # Total 2 attempts - attempt = 0 - current_query_text = query - - # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: - logger.error( - "--- RestaurantAgent.stream: A2UI_SCHEMA is not loaded. " - "Cannot perform UI validation. ---" - ) - yield { - "is_task_complete": True, - "content": ( - "I'm sorry, I'm facing an internal configuration error with my UI components. " - "Please contact support." - ), - } - return - - while attempt <= max_retries: - attempt += 1 - logger.info( - f"--- RestaurantAgent.stream: Attempt {attempt}/{max_retries + 1} " - f"for session {session_id} ---" - ) - - current_message = types.Content( - role="user", parts=[types.Part.from_text(text=current_query_text)] - ) - final_response_content = None - - async for event in self._runner.run_async( - user_id=self._user_id, - session_id=session.id, - new_message=current_message, - ): - logger.info(f"Event from runner: {event}") - if event.is_final_response(): - if ( - event.content - and event.content.parts - and event.content.parts[0].text - ): - final_response_content = "\n".join( - [p.text for p in event.content.parts if p.text] - ) - break # Got the final response, stop consuming events - else: - logger.info(f"Intermediate event: {event}") - # Yield intermediate updates on every attempt - yield { - "is_task_complete": False, - "updates": self.get_processing_message(), - } - - if final_response_content is None: - logger.warning( - f"--- RestaurantAgent.stream: Received no final response content from runner " - f"(Attempt {attempt}). ---" - ) - if attempt <= max_retries: - current_query_text = ( - "I received no response. Please try again." - f"Please retry the original request: '{query}'" - ) - continue # Go to next retry - else: - # Retries exhausted on no-response - final_response_content = "I'm sorry, I encountered an error and couldn't process your request." - # Fall through to send this as a text-only error - - is_valid = False - error_message = "" - - if self.use_ui: - logger.info( - f"--- RestaurantAgent.stream: Validating UI response (Attempt {attempt})... ---" - ) - try: - if "---a2ui_JSON---" not in final_response_content: - raise ValueError("Delimiter '---a2ui_JSON---' not found.") - - text_part, json_string = final_response_content.split( - "---a2ui_JSON---", 1 - ) - - if not json_string.strip(): - raise ValueError("JSON part is empty.") - - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - - if not json_string_cleaned: - raise ValueError("Cleaned JSON string is empty.") - - # --- New Validation Steps --- - # 1. Check if it's parsable JSON - parsed_json_data = json.loads(json_string_cleaned) - - # 2. Check if it validates against the A2UI_SCHEMA - # This will raise jsonschema.exceptions.ValidationError if it fails - logger.info( - "--- RestaurantAgent.stream: Validating against A2UI_SCHEMA... ---" - ) - jsonschema.validate( - instance=parsed_json_data, schema=self.a2ui_schema_object - ) - # --- End New Validation Steps --- - - logger.info( - f"--- RestaurantAgent.stream: UI JSON successfully parsed AND validated against schema. " - f"Validation OK (Attempt {attempt}). ---" - ) - is_valid = True - - except ( - ValueError, - json.JSONDecodeError, - jsonschema.exceptions.ValidationError, - ) as e: - logger.warning( - f"--- RestaurantAgent.stream: A2UI validation failed: {e} (Attempt {attempt}) ---" - ) - logger.warning( - f"--- Failed response content: {final_response_content[:500]}... ---" - ) - error_message = f"Validation failed: {e}." - - else: # Not using UI, so text is always "valid" - is_valid = True - - if is_valid: - logger.info( - f"--- RestaurantAgent.stream: Response is valid. Sending final response (Attempt {attempt}). ---" - ) - logger.info(f"Final response: {final_response_content}") - yield { - "is_task_complete": True, - "content": final_response_content, - } - return # We're done, exit the generator - - # --- If we're here, it means validation failed --- - - if attempt <= max_retries: - logger.warning( - f"--- RestaurantAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" - ) - # Prepare the query for the retry - current_query_text = ( - f"Your previous response was invalid. {error_message} " - "You MUST generate a valid response that strictly follows the A2UI JSON SCHEMA. " - "The response MUST be a JSON list of A2UI messages. " - "Ensure the response is split by '---a2ui_JSON---' and the JSON part is well-formed. " - f"Please retry the original request: '{query}'" - ) - # Loop continues... - - # --- If we're here, it means we've exhausted retries --- - logger.error( - "--- RestaurantAgent.stream: Max retries exhausted. Sending text-only error. ---" + try: + if "---a2ui_JSON---" not in final_response_content: + raise ValueError("Delimiter '---a2ui_JSON---' not found.") + + text_part, json_string = final_response_content.split("---a2ui_JSON---", 1) + + if not json_string.strip(): + raise ValueError("JSON part is empty.") + + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() + ) + + if not json_string_cleaned: + raise ValueError("Cleaned JSON string is empty.") + + # --- New Validation Steps --- + # 1. Check if it's parsable JSON + parsed_json_data = json.loads(json_string_cleaned) + + # 2. Check if it validates against the A2UI_SCHEMA + # This will raise jsonschema.exceptions.ValidationError if it fails + logger.info( + "--- RestaurantAgent.stream: Validating against A2UI_SCHEMA... ---" + ) + jsonschema.validate(instance=parsed_json_data, schema=self.a2ui_schema_object) + # --- End New Validation Steps --- + + logger.info( + "--- RestaurantAgent.stream: UI JSON successfully parsed AND validated" + f" against schema. Validation OK (Attempt {attempt}). ---" + ) + is_valid = True + + except ( + ValueError, + json.JSONDecodeError, + jsonschema.exceptions.ValidationError, + ) as e: + logger.warning( + f"--- RestaurantAgent.stream: A2UI validation failed: {e} (Attempt" + f" {attempt}) ---" + ) + logger.warning( + f"--- Failed response content: {final_response_content[:500]}... ---" + ) + error_message = f"Validation failed: {e}." + + else: # Not using UI, so text is always "valid" + is_valid = True + + if is_valid: + logger.info( + "--- RestaurantAgent.stream: Response is valid. Sending final response" + f" (Attempt {attempt}). ---" ) + logger.info(f"Final response: {final_response_content}") yield { "is_task_complete": True, - "content": ( - "I'm sorry, I'm having trouble generating the interface for that request right now. " - "Please try again in a moment." - ), + "content": final_response_content, } - # --- End: UI Validation and Retry Logic --- + return # We're done, exit the generator + + # --- If we're here, it means validation failed --- + + if attempt <= max_retries: + logger.warning( + f"--- RestaurantAgent.stream: Retrying... ({attempt}/{max_retries + 1}) ---" + ) + # Prepare the query for the retry + current_query_text = ( + f"Your previous response was invalid. {error_message} You MUST generate a" + " valid response that strictly follows the A2UI JSON SCHEMA. The response" + " MUST be a JSON list of A2UI messages. Ensure the response is split by" + " '---a2ui_JSON---' and the JSON part is well-formed. Please retry the" + f" original request: '{query}'" + ) + # Loop continues... + + # --- If we're here, it means we've exhausted retries --- + logger.error( + "--- RestaurantAgent.stream: Max retries exhausted. Sending text-only" + " error. ---" + ) + yield { + "is_task_complete": True, + "content": ( + "I'm sorry, I'm having trouble generating the interface for that request" + " right now. Please try again in a moment." + ), + } + # --- End: UI Validation and Retry Logic --- diff --git a/samples/agent/adk/restaurant_finder/agent_executor.py b/samples/agent/adk/restaurant_finder/agent_executor.py index a693e45de..9664d6071 100644 --- a/samples/agent/adk/restaurant_finder/agent_executor.py +++ b/samples/agent/adk/restaurant_finder/agent_executor.py @@ -39,159 +39,161 @@ class RestaurantAgentExecutor(AgentExecutor): - """Restaurant AgentExecutor Example.""" - - def __init__(self, base_url: str): - # Instantiate two agents: one for UI and one for text-only. - # The appropriate one will be chosen at execution time. - self.ui_agent = RestaurantAgent(base_url=base_url, use_ui=True) - self.text_agent = RestaurantAgent(base_url=base_url, use_ui=False) - - async def execute( - self, - context: RequestContext, - event_queue: EventQueue, - ) -> None: - query = "" - ui_event_part = None - action = None - - logger.info( - f"--- Client requested extensions: {context.requested_extensions} ---" + """Restaurant AgentExecutor Example.""" + + def __init__(self, base_url: str): + # Instantiate two agents: one for UI and one for text-only. + # The appropriate one will be chosen at execution time. + self.ui_agent = RestaurantAgent(base_url=base_url, use_ui=True) + self.text_agent = RestaurantAgent(base_url=base_url, use_ui=False) + + async def execute( + self, + context: RequestContext, + event_queue: EventQueue, + ) -> None: + query = "" + ui_event_part = None + action = None + + logger.info(f"--- Client requested extensions: {context.requested_extensions} ---") + use_ui = try_activate_a2ui_extension(context) + + # Determine which agent to use based on whether the a2ui extension is active. + if use_ui: + agent = self.ui_agent + logger.info("--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---") + else: + agent = self.text_agent + logger.info( + "--- AGENT_EXECUTOR: A2UI extension is not active. Using text agent. ---" + ) + + if context.message and context.message.parts: + logger.info( + f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message" + " parts ---" + ) + for i, part in enumerate(context.message.parts): + if isinstance(part.root, DataPart): + if "userAction" in part.root.data: + logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") + ui_event_part = part.root.data["userAction"] + else: + logger.info(f" Part {i}: DataPart (data: {part.root.data})") + elif isinstance(part.root, TextPart): + logger.info(f" Part {i}: TextPart (text: {part.root.text})") + else: + logger.info(f" Part {i}: Unknown part type ({type(part.root)})") + + if ui_event_part: + logger.info(f"Received a2ui ClientEvent: {ui_event_part}") + action = ui_event_part.get("actionName") + ctx = ui_event_part.get("context", {}) + + if action == "book_restaurant": + restaurant_name = ctx.get("restaurantName", "Unknown Restaurant") + address = ctx.get("address", "Address not provided") + image_url = ctx.get("imageUrl", "") + query = ( + f"USER_WANTS_TO_BOOK: {restaurant_name}, Address: {address}, ImageURL:" + f" {image_url}" ) - use_ui = try_activate_a2ui_extension(context) - # Determine which agent to use based on whether the a2ui extension is active. - if use_ui: - agent = self.ui_agent - logger.info( - "--- AGENT_EXECUTOR: A2UI extension is active. Using UI agent. ---" - ) - else: - agent = self.text_agent - logger.info( - "--- AGENT_EXECUTOR: A2UI extension is not active. Using text agent. ---" - ) + elif action == "submit_booking": + restaurant_name = ctx.get("restaurantName", "Unknown Restaurant") + party_size = ctx.get("partySize", "Unknown Size") + reservation_time = ctx.get("reservationTime", "Unknown Time") + dietary_reqs = ctx.get("dietary", "None") + image_url = ctx.get("imageUrl", "") + query = ( + f"User submitted a booking for {restaurant_name} for {party_size} people at" + f" {reservation_time} with dietary requirements: {dietary_reqs}. The image" + f" URL is {image_url}" + ) - if context.message and context.message.parts: - logger.info( - f"--- AGENT_EXECUTOR: Processing {len(context.message.parts)} message parts ---" - ) - for i, part in enumerate(context.message.parts): - if isinstance(part.root, DataPart): - if "userAction" in part.root.data: - logger.info(f" Part {i}: Found a2ui UI ClientEvent payload.") - ui_event_part = part.root.data["userAction"] - else: - logger.info(f" Part {i}: DataPart (data: {part.root.data})") - elif isinstance(part.root, TextPart): - logger.info(f" Part {i}: TextPart (text: {part.root.text})") - else: - logger.info(f" Part {i}: Unknown part type ({type(part.root)})") - - if ui_event_part: - logger.info(f"Received a2ui ClientEvent: {ui_event_part}") - action = ui_event_part.get("actionName") - ctx = ui_event_part.get("context", {}) - - if action == "book_restaurant": - restaurant_name = ctx.get("restaurantName", "Unknown Restaurant") - address = ctx.get("address", "Address not provided") - image_url = ctx.get("imageUrl", "") - query = f"USER_WANTS_TO_BOOK: {restaurant_name}, Address: {address}, ImageURL: {image_url}" - - elif action == "submit_booking": - restaurant_name = ctx.get("restaurantName", "Unknown Restaurant") - party_size = ctx.get("partySize", "Unknown Size") - reservation_time = ctx.get("reservationTime", "Unknown Time") - dietary_reqs = ctx.get("dietary", "None") - image_url = ctx.get("imageUrl", "") - query = f"User submitted a booking for {restaurant_name} for {party_size} people at {reservation_time} with dietary requirements: {dietary_reqs}. The image URL is {image_url}" + else: + query = f"User submitted an event: {action} with data: {ctx}" + else: + logger.info("No a2ui UI event part found. Falling back to text input.") + query = context.get_user_input() - else: - query = f"User submitted an event: {action} with data: {ctx}" - else: - logger.info("No a2ui UI event part found. Falling back to text input.") - query = context.get_user_input() - - logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") - - task = context.current_task - - if not task: - task = new_task(context.message) - await event_queue.enqueue_event(task) - updater = TaskUpdater(event_queue, task.id, task.context_id) - - async for item in agent.stream(query, task.context_id): - is_task_complete = item["is_task_complete"] - if not is_task_complete: - await updater.update_status( - TaskState.working, - new_agent_text_message(item["updates"], task.context_id, task.id), - ) - continue - - final_state = ( - TaskState.completed - if action == "submit_booking" - else TaskState.input_required - ) + logger.info(f"--- AGENT_EXECUTOR: Final query for LLM: '{query}' ---") - content = item["content"] - final_parts = [] - if "---a2ui_JSON---" in content: - logger.info("Splitting final response into text and UI parts.") - text_content, json_string = content.split("---a2ui_JSON---", 1) - - if text_content.strip(): - final_parts.append(Part(root=TextPart(text=text_content.strip()))) - - if json_string.strip(): - try: - json_string_cleaned = ( - json_string.strip().lstrip("```json").rstrip("```").strip() - ) - # The new protocol sends a stream of JSON objects. - # For this example, we'll assume they are sent as a list in the final response. - json_data = json.loads(json_string_cleaned) - - if isinstance(json_data, list): - logger.info( - f"Found {len(json_data)} messages. Creating individual DataParts." - ) - for message in json_data: - final_parts.append(create_a2ui_part(message)) - else: - # Handle the case where a single JSON object is returned - logger.info( - "Received a single JSON object. Creating a DataPart." - ) - final_parts.append(create_a2ui_part(json_data)) - - except json.JSONDecodeError as e: - logger.error(f"Failed to parse UI JSON: {e}") - final_parts.append(Part(root=TextPart(text=json_string))) - else: - final_parts.append(Part(root=TextPart(text=content.strip()))) - - logger.info("--- FINAL PARTS TO BE SENT ---") - for i, part in enumerate(final_parts): - logger.info(f" - Part {i}: Type = {type(part.root)}") - if isinstance(part.root, TextPart): - logger.info(f" - Text: {part.root.text[:200]}...") - elif isinstance(part.root, DataPart): - logger.info(f" - Data: {str(part.root.data)[:200]}...") - logger.info("-----------------------------") - - await updater.update_status( - final_state, - new_agent_parts_message(final_parts, task.context_id, task.id), - final=(final_state == TaskState.completed), - ) - break + task = context.current_task + + if not task: + task = new_task(context.message) + await event_queue.enqueue_event(task) + updater = TaskUpdater(event_queue, task.id, task.context_id) - async def cancel( - self, request: RequestContext, event_queue: EventQueue - ) -> Task | None: - raise ServerError(error=UnsupportedOperationError()) + async for item in agent.stream(query, task.context_id): + is_task_complete = item["is_task_complete"] + if not is_task_complete: + await updater.update_status( + TaskState.working, + new_agent_text_message(item["updates"], task.context_id, task.id), + ) + continue + + final_state = ( + TaskState.completed + if action == "submit_booking" + else TaskState.input_required + ) + + content = item["content"] + final_parts = [] + if "---a2ui_JSON---" in content: + logger.info("Splitting final response into text and UI parts.") + text_content, json_string = content.split("---a2ui_JSON---", 1) + + if text_content.strip(): + final_parts.append(Part(root=TextPart(text=text_content.strip()))) + + if json_string.strip(): + try: + json_string_cleaned = ( + json_string.strip().lstrip("```json").rstrip("```").strip() + ) + # The new protocol sends a stream of JSON objects. + # For this example, we'll assume they are sent as a list in the final response. + json_data = json.loads(json_string_cleaned) + + if isinstance(json_data, list): + logger.info( + f"Found {len(json_data)} messages. Creating individual DataParts." + ) + for message in json_data: + final_parts.append(create_a2ui_part(message)) + else: + # Handle the case where a single JSON object is returned + logger.info("Received a single JSON object. Creating a DataPart.") + final_parts.append(create_a2ui_part(json_data)) + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse UI JSON: {e}") + final_parts.append(Part(root=TextPart(text=json_string))) + else: + final_parts.append(Part(root=TextPart(text=content.strip()))) + + logger.info("--- FINAL PARTS TO BE SENT ---") + for i, part in enumerate(final_parts): + logger.info(f" - Part {i}: Type = {type(part.root)}") + if isinstance(part.root, TextPart): + logger.info(f" - Text: {part.root.text[:200]}...") + elif isinstance(part.root, DataPart): + logger.info(f" - Data: {str(part.root.data)[:200]}...") + logger.info("-----------------------------") + + await updater.update_status( + final_state, + new_agent_parts_message(final_parts, task.context_id, task.id), + final=(final_state == TaskState.completed), + ) + break + + async def cancel( + self, request: RequestContext, event_queue: EventQueue + ) -> Task | None: + raise ServerError(error=UnsupportedOperationError()) diff --git a/samples/agent/adk/restaurant_finder/prompt_builder.py b/samples/agent/adk/restaurant_finder/prompt_builder.py index 1cc8445e9..0985df8a3 100644 --- a/samples/agent/adk/restaurant_finder/prompt_builder.py +++ b/samples/agent/adk/restaurant_finder/prompt_builder.py @@ -13,7 +13,7 @@ # limitations under the License. # The A2UI schema remains constant for all A2UI responses. -A2UI_SCHEMA = r''' +A2UI_SCHEMA = r""" { "title": "A2UI Message Schema", "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", @@ -783,26 +783,26 @@ } } } -''' +""" from a2ui_examples import RESTAURANT_UI_EXAMPLES def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. + """ + Constructs the full prompt with UI instructions, rules, examples, and schema. - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. + Args: + base_url: The base URL for resolving static assets like logos. + examples: A string containing the specific UI examples for the agent's task. - Returns: - A formatted string to be used as the system prompt for the LLM. - """ - # The f-string substitution for base_url happens here, at runtime. - formatted_examples = examples.format(base_url=base_url) + Returns: + A formatted string to be used as the system prompt for the LLM. + """ + # The f-string substitution for base_url happens here, at runtime. + formatted_examples = examples.format(base_url=base_url) - return f""" + return f""" You are a helpful restaurant finding assistant. Your final output MUST be a a2ui UI JSON response. To generate the response, you MUST follow these rules: @@ -827,10 +827,10 @@ def get_ui_prompt(base_url: str, examples: str) -> str: def get_text_prompt() -> str: - """ - Constructs the prompt for a text-only agent. - """ - return """ + """ + Constructs the prompt for a text-only agent. + """ + return """ You are a helpful restaurant finding assistant. Your final output MUST be a text response. To generate the response, you MUST follow these rules: @@ -847,18 +847,18 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder - # In your actual application, you would call this from your main agent logic. - my_base_url = "http://localhost:8000" + # Example of how to use the prompt builder + # In your actual application, you would call this from your main agent logic. + my_base_url = "http://localhost:8000" - # You can now easily construct a prompt with the relevant examples. - # For a different agent (e.g., a flight booker), you would pass in - # different examples but use the same `get_ui_prompt` function. - restaurant_prompt = get_ui_prompt(my_base_url, RESTAURANT_UI_EXAMPLES) + # You can now easily construct a prompt with the relevant examples. + # For a different agent (e.g., a flight booker), you would pass in + # different examples but use the same `get_ui_prompt` function. + restaurant_prompt = get_ui_prompt(my_base_url, RESTAURANT_UI_EXAMPLES) - print(restaurant_prompt) + print(restaurant_prompt) - # This demonstrates how you could save the prompt to a file for inspection - with open("generated_prompt.txt", "w") as f: - f.write(restaurant_prompt) - print("\nGenerated prompt saved to generated_prompt.txt") + # This demonstrates how you could save the prompt to a file for inspection + with open("generated_prompt.txt", "w") as f: + f.write(restaurant_prompt) + print("\nGenerated prompt saved to generated_prompt.txt") diff --git a/samples/agent/adk/restaurant_finder/tools.py b/samples/agent/adk/restaurant_finder/tools.py index 6a6dd453a..da0e48e52 100644 --- a/samples/agent/adk/restaurant_finder/tools.py +++ b/samples/agent/adk/restaurant_finder/tools.py @@ -21,35 +21,39 @@ logger = logging.getLogger(__name__) -def get_restaurants(cuisine: str, location: str, tool_context: ToolContext, count: int = 5) -> str: - """Call this tool to get a list of restaurants based on a cuisine and location. - 'count' is the number of restaurants to return. - """ - logger.info(f"--- TOOL CALLED: get_restaurants (count: {count}) ---") - logger.info(f" - Cuisine: {cuisine}") - logger.info(f" - Location: {location}") - - items = [] - if "new york" in location.lower() or "ny" in location.lower(): - try: - script_dir = os.path.dirname(__file__) - file_path = os.path.join(script_dir, "restaurant_data.json") - with open(file_path) as f: - restaurant_data_str = f.read() - if base_url := tool_context.state.get("base_url"): - restaurant_data_str = restaurant_data_str.replace("http://localhost:10002", base_url) - logger.info(f'Updated base URL from tool context: {base_url}') - all_items = json.loads(restaurant_data_str) - - # Slice the list to return only the requested number of items - items = all_items[:count] - logger.info( - f" - Success: Found {len(all_items)} restaurants, returning {len(items)}." - ) - - except FileNotFoundError: - logger.error(f" - Error: restaurant_data.json not found at {file_path}") - except json.JSONDecodeError: - logger.error(f" - Error: Failed to decode JSON from {file_path}") - - return json.dumps(items) +def get_restaurants( + cuisine: str, location: str, tool_context: ToolContext, count: int = 5 +) -> str: + """Call this tool to get a list of restaurants based on a cuisine and location. + 'count' is the number of restaurants to return. + """ + logger.info(f"--- TOOL CALLED: get_restaurants (count: {count}) ---") + logger.info(f" - Cuisine: {cuisine}") + logger.info(f" - Location: {location}") + + items = [] + if "new york" in location.lower() or "ny" in location.lower(): + try: + script_dir = os.path.dirname(__file__) + file_path = os.path.join(script_dir, "restaurant_data.json") + with open(file_path) as f: + restaurant_data_str = f.read() + if base_url := tool_context.state.get("base_url"): + restaurant_data_str = restaurant_data_str.replace( + "http://localhost:10002", base_url + ) + logger.info(f"Updated base URL from tool context: {base_url}") + all_items = json.loads(restaurant_data_str) + + # Slice the list to return only the requested number of items + items = all_items[:count] + logger.info( + f" - Success: Found {len(all_items)} restaurants, returning {len(items)}." + ) + + except FileNotFoundError: + logger.error(f" - Error: restaurant_data.json not found at {file_path}") + except json.JSONDecodeError: + logger.error(f" - Error: Failed to decode JSON from {file_path}") + + return json.dumps(items) diff --git a/samples/agent/adk/rizzcharts/__main__.py b/samples/agent/adk/rizzcharts/__main__.py index ab459ee07..7b9481214 100644 --- a/samples/agent/adk/rizzcharts/__main__.py +++ b/samples/agent/adk/rizzcharts/__main__.py @@ -38,90 +38,91 @@ class MissingAPIKeyError(Exception): - """Exception for missing API key.""" + """Exception for missing API key.""" @click.command() @click.option("--host", default="localhost") @click.option("--port", default=10002) def main(host, port): - try: - # Check for API key only if Vertex AI is not configured - if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": - if not os.getenv("GEMINI_API_KEY"): - raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI is not TRUE." - ) - - lite_llm_model = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - agent = RizzchartsAgent( - model=LiteLlm(model=lite_llm_model), - a2ui_enabled_provider=get_a2ui_enabled, - a2ui_schema_provider=get_a2ui_schema, - ) - runner = Runner( - app_name=agent.name, - agent=agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - ) - - current_dir = pathlib.Path(__file__).resolve().parent - spec_root = current_dir / "../../../../specification/v0_8/json" - - try: - a2ui_schema_content = (spec_root / "server_to_client.json").read_text() - standard_catalog_content = ( - spec_root / "standard_catalog_definition.json" - ).read_text() - rizzcharts_catalog_content = ( - current_dir / "rizzcharts_catalog_definition.json" - ).read_text() - except FileNotFoundError as e: - logger.error(f"Failed to load required JSON files: {e}") - exit(1) - - logger.info(f"Loaded schema from {spec_root}") - - base_url = f"http://{host}:{port}" - agent_executor = RizzchartsAgentExecutor( - base_url=base_url, - runner=runner, - a2ui_schema_content=a2ui_schema_content, - standard_catalog_content=standard_catalog_content, - rizzcharts_catalog_content=rizzcharts_catalog_content, + try: + # Check for API key only if Vertex AI is not configured + if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": + if not os.getenv("GEMINI_API_KEY"): + raise MissingAPIKeyError( + "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" + " is not TRUE." ) - request_handler = DefaultRequestHandler( - agent_executor=agent_executor, - task_store=InMemoryTaskStore(), - ) - server = A2AStarletteApplication( - agent_card=agent_executor.get_agent_card(), http_handler=request_handler - ) - import uvicorn + lite_llm_model = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") + agent = RizzchartsAgent( + model=LiteLlm(model=lite_llm_model), + a2ui_enabled_provider=get_a2ui_enabled, + a2ui_schema_provider=get_a2ui_schema, + ) + runner = Runner( + app_name=agent.name, + agent=agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) + + current_dir = pathlib.Path(__file__).resolve().parent + spec_root = current_dir / "../../../../specification/v0_8/json" - app = server.build() - - app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:5173"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], - ) - - uvicorn.run(app, host=host, port=port) - except MissingAPIKeyError as e: - logger.error(f"Error: {e} {traceback.format_exc()}") - exit(1) - except Exception as e: - logger.error( - f"An error occurred during server startup: {e} {traceback.format_exc()}" - ) - exit(1) + try: + a2ui_schema_content = (spec_root / "server_to_client.json").read_text() + standard_catalog_content = ( + spec_root / "standard_catalog_definition.json" + ).read_text() + rizzcharts_catalog_content = ( + current_dir / "rizzcharts_catalog_definition.json" + ).read_text() + except FileNotFoundError as e: + logger.error(f"Failed to load required JSON files: {e}") + exit(1) + + logger.info(f"Loaded schema from {spec_root}") + + base_url = f"http://{host}:{port}" + agent_executor = RizzchartsAgentExecutor( + base_url=base_url, + runner=runner, + a2ui_schema_content=a2ui_schema_content, + standard_catalog_content=standard_catalog_content, + rizzcharts_catalog_content=rizzcharts_catalog_content, + ) + + request_handler = DefaultRequestHandler( + agent_executor=agent_executor, + task_store=InMemoryTaskStore(), + ) + server = A2AStarletteApplication( + agent_card=agent_executor.get_agent_card(), http_handler=request_handler + ) + import uvicorn + + app = server.build() + + app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:5173"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + uvicorn.run(app, host=host, port=port) + except MissingAPIKeyError as e: + logger.error(f"Error: {e} {traceback.format_exc()}") + exit(1) + except Exception as e: + logger.error( + f"An error occurred during server startup: {e} {traceback.format_exc()}" + ) + exit(1) if __name__ == "__main__": - main() + main() diff --git a/samples/agent/adk/rizzcharts/agent.py b/samples/agent/adk/rizzcharts/agent.py index e85e7a194..a1958d4fb 100644 --- a/samples/agent/adk/rizzcharts/agent.py +++ b/samples/agent/adk/rizzcharts/agent.py @@ -29,123 +29,134 @@ from pydantic import PrivateAttr try: - from .tools import get_sales_data, get_store_sales + from .tools import get_sales_data, get_store_sales except ImportError: - from tools import get_sales_data, get_store_sales + from tools import get_sales_data, get_store_sales logger = logging.getLogger(__name__) RIZZCHARTS_CATALOG_URI = "https://github.com/google/A2UI/blob/main/samples/agent/adk/rizzcharts/rizzcharts_catalog_definition.json" A2UI_CATALOG_URI_STATE_KEY = "user:a2ui_catalog_uri" + class RizzchartsAgent(LlmAgent): - """An agent that runs an ecommerce dashboard""" - - SUPPORTED_CONTENT_TYPES: ClassVar[list[str]] = ["text", "text/plain"] - _a2ui_enabled_provider: A2uiEnabledProvider = PrivateAttr() - _a2ui_schema_provider: A2uiSchemaProvider = PrivateAttr() - - def __init__( - self, - model: Any, - a2ui_enabled_provider: A2uiEnabledProvider, - a2ui_schema_provider: A2uiSchemaProvider - ): - """Initializes the RizzchartsAgent. - - Args: - model: The LLM model to use. - a2ui_enabled_provider: A provider to check if A2UI is enabled. - a2ui_schema_provider: A provider to retrieve the A2UI schema. - """ - super().__init__( - model=model, - name="rizzcharts_agent", - description="An agent that lets sales managers request sales data.", - instruction=self.get_instructions, - tools=[get_store_sales, get_sales_data, SendA2uiToClientToolset( + """An agent that runs an ecommerce dashboard""" + + SUPPORTED_CONTENT_TYPES: ClassVar[list[str]] = ["text", "text/plain"] + _a2ui_enabled_provider: A2uiEnabledProvider = PrivateAttr() + _a2ui_schema_provider: A2uiSchemaProvider = PrivateAttr() + + def __init__( + self, + model: Any, + a2ui_enabled_provider: A2uiEnabledProvider, + a2ui_schema_provider: A2uiSchemaProvider, + ): + """Initializes the RizzchartsAgent. + + Args: + model: The LLM model to use. + a2ui_enabled_provider: A provider to check if A2UI is enabled. + a2ui_schema_provider: A provider to retrieve the A2UI schema. + """ + super().__init__( + model=model, + name="rizzcharts_agent", + description="An agent that lets sales managers request sales data.", + instruction=self.get_instructions, + tools=[ + get_store_sales, + get_sales_data, + SendA2uiToClientToolset( a2ui_schema=a2ui_schema_provider, a2ui_enabled=a2ui_enabled_provider, - )], - planner=BuiltInPlanner( - thinking_config=types.ThinkingConfig( - include_thoughts=True, - ) ), - disallow_transfer_to_peers=True, - ) - - self._a2ui_enabled_provider = a2ui_enabled_provider - self._a2ui_schema_provider = a2ui_schema_provider - - def get_a2ui_schema(self, ctx: ReadonlyContext) -> dict[str, Any]: - """Retrieves and wraps the A2UI schema from the session state. - - Args: - ctx: The ReadonlyContext for resolving the schema. - - Returns: - The wrapped A2UI schema. - """ - a2ui_schema = self._a2ui_schema_provider(ctx) - return wrap_as_json_array(a2ui_schema) - - def load_example(self, path: str, a2ui_schema: dict[str, Any]) -> dict[str, Any]: - """Loads an example JSON file and validates it against the A2UI schema. - - Args: - path: Relative path to the example JSON file. - a2ui_schema: The A2UI schema to validate against. - - Returns: - The loaded and validated JSON data. - """ - data = None - try: - # Try pkgutil first (for Google3) - package_name = __package__ or "" - data = pkgutil.get_data(package_name, path) - except ImportError: - logger.info("pkgutil failed to get data, falling back to file system.") - - if data: - example_str = data.decode("utf-8") - else: - # Fallback to direct Path relative to this file (for local dev) - full_path = Path(__file__).parent / path - example_str = full_path.read_text() - - example_json = json.loads(example_str) - jsonschema.validate( - instance=example_json, schema=a2ui_schema - ) - return example_json - - def get_instructions(self, readonly_context: ReadonlyContext) -> str: - """Generates the system instructions for the agent. - - Args: - readonly_context: The ReadonlyContext for resolving instructions. - - Returns: - The generated system instructions. - """ - use_ui = self._a2ui_enabled_provider(readonly_context) - if not use_ui: - raise ValueError("A2UI must be enabled to run rizzcharts agent") - - a2ui_schema = self.get_a2ui_schema(readonly_context) - catalog_uri = readonly_context.state.get(A2UI_CATALOG_URI_STATE_KEY) - if catalog_uri == RIZZCHARTS_CATALOG_URI: - map_example = self.load_example("examples/rizzcharts_catalog/map.json", a2ui_schema) - chart_example = self.load_example("examples/rizzcharts_catalog/chart.json", a2ui_schema) - elif catalog_uri == STANDARD_CATALOG_ID: - map_example = self.load_example("examples/standard_catalog/map.json", a2ui_schema) - chart_example = self.load_example("examples/standard_catalog/chart.json", a2ui_schema) - else: - raise ValueError(f"Unsupported catalog uri: {catalog_uri if catalog_uri else 'None'}") - - final_prompt = f""" + ], + planner=BuiltInPlanner( + thinking_config=types.ThinkingConfig( + include_thoughts=True, + ) + ), + disallow_transfer_to_peers=True, + ) + + self._a2ui_enabled_provider = a2ui_enabled_provider + self._a2ui_schema_provider = a2ui_schema_provider + + def get_a2ui_schema(self, ctx: ReadonlyContext) -> dict[str, Any]: + """Retrieves and wraps the A2UI schema from the session state. + + Args: + ctx: The ReadonlyContext for resolving the schema. + + Returns: + The wrapped A2UI schema. + """ + a2ui_schema = self._a2ui_schema_provider(ctx) + return wrap_as_json_array(a2ui_schema) + + def load_example(self, path: str, a2ui_schema: dict[str, Any]) -> dict[str, Any]: + """Loads an example JSON file and validates it against the A2UI schema. + + Args: + path: Relative path to the example JSON file. + a2ui_schema: The A2UI schema to validate against. + + Returns: + The loaded and validated JSON data. + """ + data = None + try: + # Try pkgutil first (for Google3) + package_name = __package__ or "" + data = pkgutil.get_data(package_name, path) + except ImportError: + logger.info("pkgutil failed to get data, falling back to file system.") + + if data: + example_str = data.decode("utf-8") + else: + # Fallback to direct Path relative to this file (for local dev) + full_path = Path(__file__).parent / path + example_str = full_path.read_text() + + example_json = json.loads(example_str) + jsonschema.validate(instance=example_json, schema=a2ui_schema) + return example_json + + def get_instructions(self, readonly_context: ReadonlyContext) -> str: + """Generates the system instructions for the agent. + + Args: + readonly_context: The ReadonlyContext for resolving instructions. + + Returns: + The generated system instructions. + """ + use_ui = self._a2ui_enabled_provider(readonly_context) + if not use_ui: + raise ValueError("A2UI must be enabled to run rizzcharts agent") + + a2ui_schema = self.get_a2ui_schema(readonly_context) + catalog_uri = readonly_context.state.get(A2UI_CATALOG_URI_STATE_KEY) + if catalog_uri == RIZZCHARTS_CATALOG_URI: + map_example = self.load_example( + "examples/rizzcharts_catalog/map.json", a2ui_schema + ) + chart_example = self.load_example( + "examples/rizzcharts_catalog/chart.json", a2ui_schema + ) + elif catalog_uri == STANDARD_CATALOG_ID: + map_example = self.load_example("examples/standard_catalog/map.json", a2ui_schema) + chart_example = self.load_example( + "examples/standard_catalog/chart.json", a2ui_schema + ) + else: + raise ValueError( + f"Unsupported catalog uri: {catalog_uri if catalog_uri else 'None'}" + ) + + final_prompt = f""" ### System Instructions You are an expert A2UI Ecommerce Dashboard analyst. Your primary function is to translate user requests for ecommerce data into A2UI JSON payloads to display charts and visualizations. You MUST use the `send_a2ui_json_to_client` tool with the `a2ui_json` argument set to the A2UI JSON payload to send to the client. You should also include a brief text message with each response saying what you did and asking if you can help with anything else. @@ -199,7 +210,10 @@ def get_instructions(self, readonly_context: ReadonlyContext) -> str: {json.dumps(map_example)} ---END MAP EXAMPLE--- """ - - logger.info(f"Generated system instructions for A2UI {'ENABLED' if use_ui else 'DISABLED'} and catalog {catalog_uri}") - return final_prompt + logger.info( + f"Generated system instructions for A2UI {'ENABLED' if use_ui else 'DISABLED'}" + f" and catalog {catalog_uri}" + ) + + return final_prompt diff --git a/samples/agent/adk/rizzcharts/agent_executor.py b/samples/agent/adk/rizzcharts/agent_executor.py index bd2002724..05d985fc9 100644 --- a/samples/agent/adk/rizzcharts/agent_executor.py +++ b/samples/agent/adk/rizzcharts/agent_executor.py @@ -24,16 +24,17 @@ from a2ui.extension.a2ui_extension import get_a2ui_agent_extension from a2ui.extension.a2ui_extension import try_activate_a2ui_extension from a2ui.extension.send_a2ui_to_client_toolset import convert_send_a2ui_to_client_genai_part_to_a2a_part + try: - from .agent import A2UI_CATALOG_URI_STATE_KEY # pylint: disable=import-error - from .agent import RIZZCHARTS_CATALOG_URI # pylint: disable=import-error - from .agent import RizzchartsAgent # pylint: disable=import-error - from .component_catalog_builder import ComponentCatalogBuilder # pylint: disable=import-error + from .agent import A2UI_CATALOG_URI_STATE_KEY # pylint: disable=import-error + from .agent import RIZZCHARTS_CATALOG_URI # pylint: disable=import-error + from .agent import RizzchartsAgent # pylint: disable=import-error + from .component_catalog_builder import ComponentCatalogBuilder # pylint: disable=import-error except ImportError: - from agent import A2UI_CATALOG_URI_STATE_KEY - from agent import RIZZCHARTS_CATALOG_URI - from agent import RizzchartsAgent - from component_catalog_builder import ComponentCatalogBuilder + from agent import A2UI_CATALOG_URI_STATE_KEY + from agent import RIZZCHARTS_CATALOG_URI + from agent import RizzchartsAgent + from component_catalog_builder import ComponentCatalogBuilder from google.adk.a2a.converters.request_converter import AgentRunRequest from google.adk.a2a.executor.a2a_agent_executor import A2aAgentExecutor from google.adk.a2a.executor.a2a_agent_executor import A2aAgentExecutorConfig @@ -48,131 +49,148 @@ _A2UI_ENABLED_KEY = "system:a2ui_enabled" _A2UI_SCHEMA_KEY = "system:a2ui_schema" + def get_a2ui_schema(ctx: ReadonlyContext): - """Retrieves the A2UI schema from the session state. + """Retrieves the A2UI schema from the session state. - Args: - ctx: The ReadonlyContext for resolving the schema. + Args: + ctx: The ReadonlyContext for resolving the schema. + + Returns: + The A2UI schema or None if not found. + """ + return ctx.state.get(_A2UI_SCHEMA_KEY) - Returns: - The A2UI schema or None if not found. - """ - return ctx.state.get(_A2UI_SCHEMA_KEY) def get_a2ui_enabled(ctx: ReadonlyContext): - """Checks if A2UI is enabled in the current session. + """Checks if A2UI is enabled in the current session. - Args: - ctx: The ReadonlyContext for resolving enablement. + Args: + ctx: The ReadonlyContext for resolving enablement. + + Returns: + True if A2UI is enabled, False otherwise. + """ + return ctx.state.get(_A2UI_ENABLED_KEY, False) - Returns: - True if A2UI is enabled, False otherwise. - """ - return ctx.state.get(_A2UI_ENABLED_KEY, False) class RizzchartsAgentExecutor(A2aAgentExecutor): - """Executor for the Rizzcharts agent that handles A2UI session setup.""" - - def __init__( - self, - base_url: str, - runner: Runner, - a2ui_schema_content: str, - standard_catalog_content: str, - rizzcharts_catalog_content: str, - ): - self._base_url = base_url - self._component_catalog_builder = ComponentCatalogBuilder( - a2ui_schema_content=a2ui_schema_content, - uri_to_local_catalog_content={ - STANDARD_CATALOG_ID: standard_catalog_content, - RIZZCHARTS_CATALOG_URI: rizzcharts_catalog_content, - }, - default_catalog_uri=STANDARD_CATALOG_ID, - ) - - config = A2aAgentExecutorConfig( - gen_ai_part_converter=convert_send_a2ui_to_client_genai_part_to_a2a_part - ) - super().__init__(runner=runner, config=config) - - def get_agent_card(self) -> AgentCard: - """Returns the AgentCard defining this agent's metadata and skills. - - Returns: - An AgentCard object. - """ - return AgentCard( - name="Ecommerce Dashboard Agent", - description="This agent visualizes ecommerce data, showing sales breakdowns, YOY revenue performance, and regional sales outliers.", - url=self._base_url, - version="1.0.0", - default_input_modes=RizzchartsAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=RizzchartsAgent.SUPPORTED_CONTENT_TYPES, - capabilities=AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension( - supported_catalog_ids=[STANDARD_CATALOG_ID, RIZZCHARTS_CATALOG_URI])], - ), - skills=[ - AgentSkill( - id="view_sales_by_category", - name="View Sales by Category", - description="Displays a pie chart of sales broken down by product category for a given time period.", - tags=["sales", "breakdown", "category", "pie chart", "revenue"], - examples=[ - "show my sales breakdown by product category for q3", - "What's the sales breakdown for last month?", - ], - ), - AgentSkill( - id="view_regional_outliers", - name="View Regional Sales Outliers", - description="Displays a map showing regional sales outliers or store-level performance.", - tags=["sales", "regional", "outliers", "stores", "map", "performance"], - examples=[ - "interesting. were there any outlier stores", - "show me a map of store performance", - ], - ), + """Executor for the Rizzcharts agent that handles A2UI session setup.""" + + def __init__( + self, + base_url: str, + runner: Runner, + a2ui_schema_content: str, + standard_catalog_content: str, + rizzcharts_catalog_content: str, + ): + self._base_url = base_url + self._component_catalog_builder = ComponentCatalogBuilder( + a2ui_schema_content=a2ui_schema_content, + uri_to_local_catalog_content={ + STANDARD_CATALOG_ID: standard_catalog_content, + RIZZCHARTS_CATALOG_URI: rizzcharts_catalog_content, + }, + default_catalog_uri=STANDARD_CATALOG_ID, + ) + + config = A2aAgentExecutorConfig( + gen_ai_part_converter=convert_send_a2ui_to_client_genai_part_to_a2a_part + ) + super().__init__(runner=runner, config=config) + + def get_agent_card(self) -> AgentCard: + """Returns the AgentCard defining this agent's metadata and skills. + + Returns: + An AgentCard object. + """ + return AgentCard( + name="Ecommerce Dashboard Agent", + description=( + "This agent visualizes ecommerce data, showing sales breakdowns, YOY" + " revenue performance, and regional sales outliers." + ), + url=self._base_url, + version="1.0.0", + default_input_modes=RizzchartsAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=RizzchartsAgent.SUPPORTED_CONTENT_TYPES, + capabilities=AgentCapabilities( + streaming=True, + extensions=[ + get_a2ui_agent_extension( + supported_catalog_ids=[STANDARD_CATALOG_ID, RIZZCHARTS_CATALOG_URI] + ) ], - ) - - @override - async def _prepare_session( - self, - context: RequestContext, - run_request: AgentRunRequest, - runner: Runner, - ): - logger.info(f"Loading session for message {context.message}") - - session = await super()._prepare_session(context, run_request, runner) - - if "base_url" not in session.state: - session.state["base_url"] = self._base_url - - use_ui = try_activate_a2ui_extension(context) - if use_ui: - a2ui_schema, catalog_uri = self._component_catalog_builder.load_a2ui_schema( - client_ui_capabilities=context.message.metadata.get(A2UI_CLIENT_CAPABILITIES_KEY) - if context.message and context.message.metadata - else None - ) - - await runner.session_service.append_event( - session, - Event( - invocation_id=new_invocation_context_id(), - author="system", - actions=EventActions( - state_delta={ - _A2UI_ENABLED_KEY: True, - _A2UI_SCHEMA_KEY: a2ui_schema, - A2UI_CATALOG_URI_STATE_KEY: catalog_uri, - } - ), + ), + skills=[ + AgentSkill( + id="view_sales_by_category", + name="View Sales by Category", + description=( + "Displays a pie chart of sales broken down by product category for" + " a given time period." ), - ) - - return session + tags=["sales", "breakdown", "category", "pie chart", "revenue"], + examples=[ + "show my sales breakdown by product category for q3", + "What's the sales breakdown for last month?", + ], + ), + AgentSkill( + id="view_regional_outliers", + name="View Regional Sales Outliers", + description=( + "Displays a map showing regional sales outliers or store-level" + " performance." + ), + tags=["sales", "regional", "outliers", "stores", "map", "performance"], + examples=[ + "interesting. were there any outlier stores", + "show me a map of store performance", + ], + ), + ], + ) + + @override + async def _prepare_session( + self, + context: RequestContext, + run_request: AgentRunRequest, + runner: Runner, + ): + logger.info(f"Loading session for message {context.message}") + + session = await super()._prepare_session(context, run_request, runner) + + if "base_url" not in session.state: + session.state["base_url"] = self._base_url + + use_ui = try_activate_a2ui_extension(context) + if use_ui: + a2ui_schema, catalog_uri = self._component_catalog_builder.load_a2ui_schema( + client_ui_capabilities=context.message.metadata.get( + A2UI_CLIENT_CAPABILITIES_KEY + ) + if context.message and context.message.metadata + else None + ) + + await runner.session_service.append_event( + session, + Event( + invocation_id=new_invocation_context_id(), + author="system", + actions=EventActions( + state_delta={ + _A2UI_ENABLED_KEY: True, + _A2UI_SCHEMA_KEY: a2ui_schema, + A2UI_CATALOG_URI_STATE_KEY: catalog_uri, + } + ), + ), + ) + + return session diff --git a/samples/agent/adk/rizzcharts/component_catalog_builder.py b/samples/agent/adk/rizzcharts/component_catalog_builder.py index c362b60bf..4b7f45dd5 100644 --- a/samples/agent/adk/rizzcharts/component_catalog_builder.py +++ b/samples/agent/adk/rizzcharts/component_catalog_builder.py @@ -16,70 +16,88 @@ import logging from typing import Any, List, Optional from a2ui.extension.a2ui_extension import INLINE_CATALOGS_KEY, SUPPORTED_CATALOG_IDS_KEY + try: - from .agent import RIZZCHARTS_CATALOG_URI, STANDARD_CATALOG_ID + from .agent import RIZZCHARTS_CATALOG_URI, STANDARD_CATALOG_ID except ImportError: - from agent import RIZZCHARTS_CATALOG_URI, STANDARD_CATALOG_ID + from agent import RIZZCHARTS_CATALOG_URI, STANDARD_CATALOG_ID logger = logging.getLogger(__name__) class ComponentCatalogBuilder: - def __init__(self, - a2ui_schema_content: str, - uri_to_local_catalog_content: dict[str, str], - default_catalog_uri: Optional[str], - ): - self._a2ui_schema_content = a2ui_schema_content - self._uri_to_local_catalog_content = uri_to_local_catalog_content - self._default_catalog_uri = default_catalog_uri - def load_a2ui_schema(self, client_ui_capabilities: Optional[dict[str, Any]]) -> tuple[dict[str, Any], Optional[str]]: - """ - Returns: - A tuple of the a2ui_schema and the catalog uri - """ - try: - logger.info(f"Loading A2UI client capabilities {client_ui_capabilities}") - - if client_ui_capabilities: - supported_catalog_uris: List[str] = client_ui_capabilities.get(SUPPORTED_CATALOG_IDS_KEY) - if RIZZCHARTS_CATALOG_URI in supported_catalog_uris: - catalog_uri = RIZZCHARTS_CATALOG_URI - elif STANDARD_CATALOG_ID in supported_catalog_uris: - catalog_uri = STANDARD_CATALOG_ID - else: - catalog_uri = None + def __init__( + self, + a2ui_schema_content: str, + uri_to_local_catalog_content: dict[str, str], + default_catalog_uri: Optional[str], + ): + self._a2ui_schema_content = a2ui_schema_content + self._uri_to_local_catalog_content = uri_to_local_catalog_content + self._default_catalog_uri = default_catalog_uri + + def load_a2ui_schema( + self, client_ui_capabilities: Optional[dict[str, Any]] + ) -> tuple[dict[str, Any], Optional[str]]: + """ + Returns: + A tuple of the a2ui_schema and the catalog uri + """ + try: + logger.info(f"Loading A2UI client capabilities {client_ui_capabilities}") + + if client_ui_capabilities: + supported_catalog_uris: List[str] = client_ui_capabilities.get( + SUPPORTED_CATALOG_IDS_KEY + ) + if RIZZCHARTS_CATALOG_URI in supported_catalog_uris: + catalog_uri = RIZZCHARTS_CATALOG_URI + elif STANDARD_CATALOG_ID in supported_catalog_uris: + catalog_uri = STANDARD_CATALOG_ID + else: + catalog_uri = None + + inline_catalog_str = client_ui_capabilities.get(INLINE_CATALOGS_KEY) + elif self._default_catalog_uri: + logger.info( + f"Using default catalog {self._default_catalog_uri} since client UI" + " capabilities not found" + ) + catalog_uri = self._default_catalog_uri + inline_catalog_str = None + else: + raise ValueError("Client UI capabilities not provided") - inline_catalog_str = client_ui_capabilities.get(INLINE_CATALOGS_KEY) - elif self._default_catalog_uri: - logger.info(f"Using default catalog {self._default_catalog_uri} since client UI capabilities not found") - catalog_uri = self._default_catalog_uri - inline_catalog_str = None - else: - raise ValueError("Client UI capabilities not provided") - - if catalog_uri and inline_catalog_str: - raise ValueError(f"Cannot set both {SUPPORTED_CATALOG_IDS_KEY} and {INLINE_CATALOGS_KEY} in ClientUiCapabilities: {client_ui_capabilities}") - elif catalog_uri: - if catalog_str := self._uri_to_local_catalog_content.get(catalog_uri): - logger.info(f"Loading local component catalog with uri {catalog_uri}") - catalog_json = json.loads(catalog_str) - else: - raise ValueError(f"Local component catalog with URI {catalog_uri} not found") - elif inline_catalog_str: - logger.info(f"Loading inline component catalog {inline_catalog_str[:200]}") - catalog_json = json.loads(inline_catalog_str) - else: - raise ValueError("No supported catalogs found in client UI capabilities") + if catalog_uri and inline_catalog_str: + raise ValueError( + f"Cannot set both {SUPPORTED_CATALOG_IDS_KEY} and {INLINE_CATALOGS_KEY} in" + f" ClientUiCapabilities: {client_ui_capabilities}" + ) + elif catalog_uri: + if catalog_str := self._uri_to_local_catalog_content.get(catalog_uri): + logger.info(f"Loading local component catalog with uri {catalog_uri}") + catalog_json = json.loads(catalog_str) + else: + raise ValueError(f"Local component catalog with URI {catalog_uri} not found") + elif inline_catalog_str: + logger.info(f"Loading inline component catalog {inline_catalog_str[:200]}") + catalog_json = json.loads(inline_catalog_str) + else: + raise ValueError("No supported catalogs found in client UI capabilities") - logger.info("Loading A2UI schema") - a2ui_schema_json = json.loads(self._a2ui_schema_content) + logger.info("Loading A2UI schema") + a2ui_schema_json = json.loads(self._a2ui_schema_content) - a2ui_schema_json["properties"]["surfaceUpdate"]["properties"]["components"]["items"]["properties"]["component"]["properties"] = catalog_json + a2ui_schema_json["properties"]["surfaceUpdate"]["properties"]["components"][ + "items" + ]["properties"]["component"]["properties"] = catalog_json - return a2ui_schema_json, catalog_uri + return a2ui_schema_json, catalog_uri - except Exception as e: - logger.error(f"Failed to a2ui schema with client ui capabilities {client_ui_capabilities}: {e}") - raise e + except Exception as e: + logger.error( + "Failed to a2ui schema with client ui capabilities" + f" {client_ui_capabilities}: {e}" + ) + raise e diff --git a/samples/agent/adk/rizzcharts/tools.py b/samples/agent/adk/rizzcharts/tools.py index 61424872e..9acca87a0 100644 --- a/samples/agent/adk/rizzcharts/tools.py +++ b/samples/agent/adk/rizzcharts/tools.py @@ -19,89 +19,89 @@ def get_store_sales(region: str = "all", **kwargs: Any) -> dict[str, Any]: - """ - Gets individual store sales + """ + Gets individual store sales - Args: - region: The region to get store sales for. - **kwargs: Additional arguments. + Args: + region: The region to get store sales for. + **kwargs: Additional arguments. - Returns: - A dict containing the stores with locations and their sales, and with outlier stores highlighted - """ - logger.info("get_store_sales called with region=%s, kwargs=%s", region, kwargs) + Returns: + A dict containing the stores with locations and their sales, and with outlier stores highlighted + """ + logger.info("get_store_sales called with region=%s, kwargs=%s", region, kwargs) - return { - "center": {"lat": 34, "lng": -118.2437}, - "zoom": 10, - "locations": [ - { - "lat": 34.0195, - "lng": -118.4912, - "name": "Santa Monica Branch", - "description": "High traffic coastal location.", - "outlier_reason": "Yes, 15% sales over baseline", - "background": "#4285F4", - "borderColor": "#FFFFFF", - "glyphColor": "#FFFFFF", - }, - {"lat": 34.0488, "lng": -118.2518, "name": "Downtown Flagship"}, - {"lat": 34.1016, "lng": -118.3287, "name": "Hollywood Boulevard Store"}, - {"lat": 34.1478, "lng": -118.1445, "name": "Pasadena Location"}, - {"lat": 33.7701, "lng": -118.1937, "name": "Long Beach Outlet"}, - {"lat": 34.0736, "lng": -118.4004, "name": "Beverly Hills Boutique"}, - ], - } + return { + "center": {"lat": 34, "lng": -118.2437}, + "zoom": 10, + "locations": [ + { + "lat": 34.0195, + "lng": -118.4912, + "name": "Santa Monica Branch", + "description": "High traffic coastal location.", + "outlier_reason": "Yes, 15% sales over baseline", + "background": "#4285F4", + "borderColor": "#FFFFFF", + "glyphColor": "#FFFFFF", + }, + {"lat": 34.0488, "lng": -118.2518, "name": "Downtown Flagship"}, + {"lat": 34.1016, "lng": -118.3287, "name": "Hollywood Boulevard Store"}, + {"lat": 34.1478, "lng": -118.1445, "name": "Pasadena Location"}, + {"lat": 33.7701, "lng": -118.1937, "name": "Long Beach Outlet"}, + {"lat": 34.0736, "lng": -118.4004, "name": "Beverly Hills Boutique"}, + ], + } def get_sales_data(time_period: str = "year", **kwargs: Any) -> dict[str, Any]: - """ - Gets the sales data. + """ + Gets the sales data. - Args: - time_period: The time period to get sales data for (e.g. 'Q1', 'year'). Defaults to 'year'. - **kwargs: Additional arguments. + Args: + time_period: The time period to get sales data for (e.g. 'Q1', 'year'). Defaults to 'year'. + **kwargs: Additional arguments. - Returns: - A dict containing the sales breakdown by product category. - """ - logger.info( - "get_sales_data called with time_period=%s, kwargs=%s", time_period, kwargs - ) + Returns: + A dict containing the sales breakdown by product category. + """ + logger.info( + "get_sales_data called with time_period=%s, kwargs=%s", time_period, kwargs + ) - return { - "sales_data": [ - { - "label": "Apparel", - "value": 41, - "drillDown": [ - {"label": "Tops", "value": 31}, - {"label": "Bottoms", "value": 38}, - {"label": "Outerwear", "value": 20}, - {"label": "Footwear", "value": 11}, - ], - }, - { - "label": "Home Goods", - "value": 15, - "drillDown": [ - {"label": "Pillow", "value": 8}, - {"label": "Coffee Maker", "value": 16}, - {"label": "Area Rug", "value": 3}, - {"label": "Bath Towels", "value": 14}, - ], - }, - { - "label": "Electronics", - "value": 28, - "drillDown": [ - {"label": "Phones", "value": 25}, - {"label": "Laptops", "value": 27}, - {"label": "TVs", "value": 21}, - {"label": "Other", "value": 27}, - ], - }, - {"label": "Health & Beauty", "value": 10}, - {"label": "Other", "value": 6}, - ] - } + return { + "sales_data": [ + { + "label": "Apparel", + "value": 41, + "drillDown": [ + {"label": "Tops", "value": 31}, + {"label": "Bottoms", "value": 38}, + {"label": "Outerwear", "value": 20}, + {"label": "Footwear", "value": 11}, + ], + }, + { + "label": "Home Goods", + "value": 15, + "drillDown": [ + {"label": "Pillow", "value": 8}, + {"label": "Coffee Maker", "value": 16}, + {"label": "Area Rug", "value": 3}, + {"label": "Bath Towels", "value": 14}, + ], + }, + { + "label": "Electronics", + "value": 28, + "drillDown": [ + {"label": "Phones", "value": 25}, + {"label": "Laptops", "value": 27}, + {"label": "TVs", "value": 21}, + {"label": "Other", "value": 27}, + ], + }, + {"label": "Health & Beauty", "value": 10}, + {"label": "Other", "value": 6}, + ] + } diff --git a/samples/agent/adk/uv.lock b/samples/agent/adk/uv.lock index dcfe80b04..dfc582e88 100644 --- a/samples/agent/adk/uv.lock +++ b/samples/agent/adk/uv.lock @@ -15,6 +15,9 @@ members = [ "rizzcharts", ] +[manifest.dependency-groups] +dev = [{ name = "pyink", specifier = ">=24.10.0" }] + [[package]] name = "a2a-sdk" version = "0.3.22" @@ -26,9 +29,9 @@ dependencies = [ { name = "protobuf" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/a3/76f2d94a32a1b0dc760432d893a09ec5ed31de5ad51b1ef0f9d199ceb260/a2a_sdk-0.3.22.tar.gz", hash = "sha256:77a5694bfc4f26679c11b70c7f1062522206d430b34bc1215cfbb1eba67b7e7d", size = 231535, upload_time = "2025-12-16T18:39:21.19Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/a3/76f2d94a32a1b0dc760432d893a09ec5ed31de5ad51b1ef0f9d199ceb260/a2a_sdk-0.3.22.tar.gz", hash = "sha256:77a5694bfc4f26679c11b70c7f1062522206d430b34bc1215cfbb1eba67b7e7d", size = 231535, upload-time = "2025-12-16T18:39:21.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/e8/f4e39fd1cf0b3c4537b974637143f3ebfe1158dad7232d9eef15666a81ba/a2a_sdk-0.3.22-py3-none-any.whl", hash = "sha256:b98701135bb90b0ff85d35f31533b6b7a299bf810658c1c65f3814a6c15ea385", size = 144347, upload_time = "2025-12-16T18:39:19.218Z" }, + { url = "https://files.pythonhosted.org/packages/64/e8/f4e39fd1cf0b3c4537b974637143f3ebfe1158dad7232d9eef15666a81ba/a2a_sdk-0.3.22-py3-none-any.whl", hash = "sha256:b98701135bb90b0ff85d35f31533b6b7a299bf810658c1c65f3814a6c15ea385", size = 144347, upload-time = "2025-12-16T18:39:19.218Z" }, ] [[package]] @@ -142,9 +145,9 @@ requires-dist = [ 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" } +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" } 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, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] @@ -160,59 +163,59 @@ 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/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, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { 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" }, ] [[package]] @@ -222,50 +225,50 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -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, upload-time = "2025-07-03T22:54:43.528Z" } 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" }, + { 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 = "aiosqlite" version = "0.22.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload_time = "2025-12-23T19:25:43.997Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821, upload-time = "2025-12-23T19:25:43.997Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload_time = "2025-12-23T19:25:42.139Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405, upload-time = "2025-12-23T19:25:42.139Z" }, ] [[package]] name = "alembic" -version = "1.18.3" +version = "1.18.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mako" }, { name = "sqlalchemy" }, { 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" } +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } 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/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, ] [[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" } +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" } 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, upload-time = "2025-11-10T22:07:40.673Z" }, ] [[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" } +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" } 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, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -275,18 +278,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, ] -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, upload-time = "2026-01-06T11:45:21.246Z" } 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, upload-time = "2026-01-06T11:45:19.497Z" }, ] [[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" } +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" } 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, upload-time = "2025-10-06T13:54:43.17Z" }, ] [[package]] @@ -296,18 +299,45 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/dc/ed1681bf1339dd6ea1ce56136bad4baabc6f7ad466e375810702b0237047/authlib-1.6.7.tar.gz", hash = "sha256:dbf10100011d1e1b34048c9d120e83f13b35d69a826ae762b93d2fb5aafc337b", size = 164950, upload_time = "2026-02-06T14:04:14.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/dc/ed1681bf1339dd6ea1ce56136bad4baabc6f7ad466e375810702b0237047/authlib-1.6.7.tar.gz", hash = "sha256:dbf10100011d1e1b34048c9d120e83f13b35d69a826ae762b93d2fb5aafc337b", size = 164950, upload-time = "2026-02-06T14:04:14.171Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/00/3ed12264094ec91f534fae429945efbaa9f8c666f3aa7061cc3b2a26a0cd/authlib-1.6.7-py2.py3-none-any.whl", hash = "sha256:c637340d9a02789d2efa1d003a7437d10d3e565237bcb5fcbc6c134c7b95bab0", size = 244115, upload-time = "2026-02-06T14:04:12.141Z" }, +] + +[[package]] +name = "black" +version = "25.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/d9/07b458a3f1c525ac392b5edc6b191ff140b596f9d77092429417a54e249d/black-25.12.0.tar.gz", hash = "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7", size = 659264, upload-time = "2025-12-08T01:40:52.501Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/00/3ed12264094ec91f534fae429945efbaa9f8c666f3aa7061cc3b2a26a0cd/authlib-1.6.7-py2.py3-none-any.whl", hash = "sha256:c637340d9a02789d2efa1d003a7437d10d3e565237bcb5fcbc6c134c7b95bab0", size = 244115, upload_time = "2026-02-06T14:04:12.141Z" }, + { url = "https://files.pythonhosted.org/packages/c8/52/c551e36bc95495d2aa1a37d50566267aa47608c81a53f91daa809e03293f/black-25.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5", size = 1923809, upload-time = "2025-12-08T01:46:55.126Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f7/aac9b014140ee56d247e707af8db0aae2e9efc28d4a8aba92d0abd7ae9d1/black-25.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f", size = 1742384, upload-time = "2025-12-08T01:49:37.022Z" }, + { url = "https://files.pythonhosted.org/packages/74/98/38aaa018b2ab06a863974c12b14a6266badc192b20603a81b738c47e902e/black-25.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf", size = 1798761, upload-time = "2025-12-08T01:46:05.386Z" }, + { url = "https://files.pythonhosted.org/packages/16/3a/a8ac542125f61574a3f015b521ca83b47321ed19bb63fe6d7560f348bfe1/black-25.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d", size = 1429180, upload-time = "2025-12-08T01:45:34.903Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2d/bdc466a3db9145e946762d52cd55b1385509d9f9004fec1c97bdc8debbfb/black-25.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce", size = 1239350, upload-time = "2025-12-08T01:46:09.458Z" }, + { url = "https://files.pythonhosted.org/packages/35/46/1d8f2542210c502e2ae1060b2e09e47af6a5e5963cb78e22ec1a11170b28/black-25.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5", size = 1917015, upload-time = "2025-12-08T01:53:27.987Z" }, + { url = "https://files.pythonhosted.org/packages/41/37/68accadf977672beb8e2c64e080f568c74159c1aaa6414b4cd2aef2d7906/black-25.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f", size = 1741830, upload-time = "2025-12-08T01:54:36.861Z" }, + { url = "https://files.pythonhosted.org/packages/ac/76/03608a9d8f0faad47a3af3a3c8c53af3367f6c0dd2d23a84710456c7ac56/black-25.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f", size = 1791450, upload-time = "2025-12-08T01:44:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/06/99/b2a4bd7dfaea7964974f947e1c76d6886d65fe5d24f687df2d85406b2609/black-25.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83", size = 1452042, upload-time = "2025-12-08T01:46:13.188Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7c/d9825de75ae5dd7795d007681b752275ea85a1c5d83269b4b9c754c2aaab/black-25.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b", size = 1267446, upload-time = "2025-12-08T01:46:14.497Z" }, + { url = "https://files.pythonhosted.org/packages/68/11/21331aed19145a952ad28fca2756a1433ee9308079bd03bd898e903a2e53/black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", size = 206191, upload-time = "2025-12-08T01:40:50.963Z" }, ] [[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" } +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" } 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, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -317,83 +347,83 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload_time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { 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, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { 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" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -403,98 +433,98 @@ source = { registry = "https://pypi.org/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" } +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" }, + { 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/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } 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/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, ] [[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" } +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" } 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" }, + { 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 = "cryptography" -version = "46.0.4" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/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" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, ] [[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" } +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" }, + { 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 = "docstring-parser" version = "0.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload_time = "2025-07-21T07:35:01.868Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/9d/c3b43da9515bd270df0f80548d9944e389870713cc1fe2b8fb35fe2bcefd/docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", size = 27442, upload-time = "2025-07-21T07:35:01.868Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload_time = "2025-07-21T07:35:00.684Z" }, + { url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" }, ] [[package]] @@ -507,130 +537,130 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/ff/e01087de891010089f1620c916c0c13130f3898177955c13e2b02d22ec4a/fastapi-0.123.10.tar.gz", hash = "sha256:624d384d7cda7c096449c889fc776a0571948ba14c3c929fa8e9a78cd0b0a6a8", size = 356360, upload_time = "2025-12-05T21:27:46.237Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/ff/e01087de891010089f1620c916c0c13130f3898177955c13e2b02d22ec4a/fastapi-0.123.10.tar.gz", hash = "sha256:624d384d7cda7c096449c889fc776a0571948ba14c3c929fa8e9a78cd0b0a6a8", size = 356360, upload-time = "2025-12-05T21:27:46.237Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/f0/7cb92c4a720def85240fd63fbbcf147ce19e7a731c8e1032376bb5a486ac/fastapi-0.123.10-py3-none-any.whl", hash = "sha256:0503b7b7bc71bc98f7c90c9117d21fdf6147c0d74703011b87936becc86985c1", size = 111774, upload_time = "2025-12-05T21:27:44.78Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f0/7cb92c4a720def85240fd63fbbcf147ce19e7a731c8e1032376bb5a486ac/fastapi-0.123.10-py3-none-any.whl", hash = "sha256:0503b7b7bc71bc98f7c90c9117d21fdf6147c0d74703011b87936becc86985c1", size = 111774, upload-time = "2025-12-05T21:27:44.78Z" }, ] [[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/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/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/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" }, ] [[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" } +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" } 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, upload-time = "2026-01-09T17:55:04.334Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "fsspec" version = "2026.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/7c/f60c259dcbf4f0c47cc4ddb8f7720d2dcdc8888c8e5ad84c73ea4531cc5b/fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff", size = 313441, upload_time = "2026-02-05T21:50:53.743Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/7c/f60c259dcbf4f0c47cc4ddb8f7720d2dcdc8888c8e5ad84c73ea4531cc5b/fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff", size = 313441, upload-time = "2026-02-05T21:50:53.743Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload_time = "2026-02-05T21:50:51.819Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] [[package]] @@ -692,9 +722,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/10/05572d33273292bac49c2d1785925f7bc3ff2fe50e3044cf1062c1dde32e/google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7", size = 177828, upload_time = "2026-01-08T22:21:39.269Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/10/05572d33273292bac49c2d1785925f7bc3ff2fe50e3044cf1062c1dde32e/google_api_core-2.29.0.tar.gz", hash = "sha256:84181be0f8e6b04006df75ddfe728f24489f0af57c96a529ff7cf45bc28797f7", size = 177828, upload-time = "2026-01-08T22:21:39.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/b6/85c4d21067220b9a78cfb81f516f9725ea6befc1544ec9bd2c1acd97c324/google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9", size = 173906, upload_time = "2026-01-08T22:21:36.093Z" }, + { url = "https://files.pythonhosted.org/packages/77/b6/85c4d21067220b9a78cfb81f516f9725ea6befc1544ec9bd2c1acd97c324/google_api_core-2.29.0-py3-none-any.whl", hash = "sha256:d30bc60980daa36e314b5d5a3e5958b0200cb44ca8fa1be2b614e932b75a3ea9", size = 173906, upload-time = "2026-01-08T22:21:36.093Z" }, ] [package.optional-dependencies] @@ -705,7 +735,7 @@ grpc = [ [[package]] name = "google-api-python-client" -version = "2.189.0" +version = "2.190.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -714,9 +744,9 @@ dependencies = [ { name = "httplib2" }, { name = "uritemplate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/f8/0783aeca3410ee053d4dd1fccafd85197847b8f84dd038e036634605d083/google_api_python_client-2.189.0.tar.gz", hash = "sha256:45f2d8559b5c895dde6ad3fb33de025f5cb2c197fa5862f18df7f5295a172741", size = 13979470, upload_time = "2026-02-03T19:24:55.432Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/8d/4ab3e3516b93bb50ed7814738ea61d49cba3f72f4e331dc9518ae2731e92/google_api_python_client-2.190.0.tar.gz", hash = "sha256:5357f34552e3724d80d2604c8fa146766e0a9d6bb0afada886fafed9feafeef6", size = 14111143, upload-time = "2026-02-12T00:38:03.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/44/3677ff27998214f2fa7957359da48da378a0ffff1bd0bdaba42e752bc13e/google_api_python_client-2.189.0-py3-none-any.whl", hash = "sha256:a258c09660a49c6159173f8bbece171278e917e104a11f0640b34751b79c8a1a", size = 14547633, upload_time = "2026-02-03T19:24:52.845Z" }, + { url = "https://files.pythonhosted.org/packages/07/ad/223d5f4b0b987669ffeb3eadd7e9f85ece633aa7fd3246f1e2f6238e1e05/google_api_python_client-2.190.0-py3-none-any.whl", hash = "sha256:d9b5266758f96c39b8c21d9bbfeb4e58c14dbfba3c931f7c5a8d7fdcd292dd57", size = 14682070, upload-time = "2026-02-12T00:38:00.974Z" }, ] [[package]] @@ -728,9 +758,9 @@ dependencies = [ { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload_time = "2026-01-26T19:22:47.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload-time = "2026-01-26T19:22:47.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload_time = "2026-01-26T19:22:45.099Z" }, + { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload-time = "2026-01-26T19:22:45.099Z" }, ] [package.optional-dependencies] @@ -746,14 +776,14 @@ dependencies = [ { name = "google-auth" }, { name = "httplib2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload_time = "2025-12-15T22:13:51.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload-time = "2025-12-15T22:13:51.825Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload_time = "2025-12-15T22:13:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload-time = "2025-12-15T22:13:51.048Z" }, ] [[package]] name = "google-cloud-aiplatform" -version = "1.136.0" +version = "1.137.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-parser" }, @@ -769,9 +799,9 @@ dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/9c/38ce04e3ef89034c736320a27b4a6e3171ca2f3fb56d38f76a310c745d14/google_cloud_aiplatform-1.136.0.tar.gz", hash = "sha256:01e64a0d0861486e842bf7e904077c847bcc1b654a29883509d57476de915b7d", size = 9946722, upload_time = "2026-02-04T16:28:12.903Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/76/0da98f663f5c58239900fa8f99488d01439b1ca7846c9667217a3aee20b1/google_cloud_aiplatform-1.137.0.tar.gz", hash = "sha256:76e66e2c3879936e51039d8bbd82581451510b4c7a840a588daaecee893d7d1e", size = 9947045, upload-time = "2026-02-11T16:23:18.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/e8/f317dc96c9c73846dd3e4d16691cc5f248801f46354d9d57f2c67fd67413/google_cloud_aiplatform-1.136.0-py2.py3-none-any.whl", hash = "sha256:5c829f002b7b673dcd0e718f55cc0557b571bd10eb5cdb7882d72916cfbf8c0e", size = 8203924, upload_time = "2026-02-04T16:28:10.343Z" }, + { url = "https://files.pythonhosted.org/packages/72/b5/795c410120cb350058b9328f051b57a49a897514ba1bc65677ade0f6c1be/google_cloud_aiplatform-1.137.0-py2.py3-none-any.whl", hash = "sha256:e99dd235c237cbbeb0e73b0fc4b1ca9588b4144ac243a6242b2005b339b40ce8", size = 8204286, upload-time = "2026-02-11T16:23:15.462Z" }, ] [package.optional-dependencies] @@ -800,9 +830,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/38/89317773c64b5a7e9b56b9aecb2e39ac02d8d6d09fb5b276710c6892e690/google_cloud_appengine_logging-1.8.0.tar.gz", hash = "sha256:84b705a69e4109fc2f68dfe36ce3df6a34d5c3d989eee6d0ac1b024dda0ba6f5", size = 18071, upload_time = "2026-01-15T13:14:40.024Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/38/89317773c64b5a7e9b56b9aecb2e39ac02d8d6d09fb5b276710c6892e690/google_cloud_appengine_logging-1.8.0.tar.gz", hash = "sha256:84b705a69e4109fc2f68dfe36ce3df6a34d5c3d989eee6d0ac1b024dda0ba6f5", size = 18071, upload-time = "2026-01-15T13:14:40.024Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/66/4a9be8afb1d0bf49472478cec20fefe4f4cb3a6e67be2231f097041e7339/google_cloud_appengine_logging-1.8.0-py3-none-any.whl", hash = "sha256:a4ce9ce94a9fd8c89ed07fa0b06fcf9ea3642f9532a1be1a8c7b5f82c0a70ec6", size = 18380, upload_time = "2026-01-09T14:52:58.154Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/4a9be8afb1d0bf49472478cec20fefe4f4cb3a6e67be2231f097041e7339/google_cloud_appengine_logging-1.8.0-py3-none-any.whl", hash = "sha256:a4ce9ce94a9fd8c89ed07fa0b06fcf9ea3642f9532a1be1a8c7b5f82c0a70ec6", size = 18380, upload-time = "2026-01-09T14:52:58.154Z" }, ] [[package]] @@ -813,9 +843,9 @@ dependencies = [ { name = "googleapis-common-protos" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/d2/ad96950410f8a05e921a6da2e1a6ba4aeca674bbb5dda8200c3c7296d7ad/google_cloud_audit_log-0.4.0.tar.gz", hash = "sha256:8467d4dcca9f3e6160520c24d71592e49e874838f174762272ec10e7950b6feb", size = 44682, upload_time = "2025-10-17T02:33:44.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/d2/ad96950410f8a05e921a6da2e1a6ba4aeca674bbb5dda8200c3c7296d7ad/google_cloud_audit_log-0.4.0.tar.gz", hash = "sha256:8467d4dcca9f3e6160520c24d71592e49e874838f174762272ec10e7950b6feb", size = 44682, upload-time = "2025-10-17T02:33:44.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/25/532886995f11102ad6de290496de5db227bd3a73827702445928ad32edcb/google_cloud_audit_log-0.4.0-py3-none-any.whl", hash = "sha256:6b88e2349df45f8f4cc0993b687109b1388da1571c502dc1417efa4b66ec55e0", size = 44890, upload_time = "2025-10-17T02:30:55.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/25/532886995f11102ad6de290496de5db227bd3a73827702445928ad32edcb/google_cloud_audit_log-0.4.0-py3-none-any.whl", hash = "sha256:6b88e2349df45f8f4cc0993b687109b1388da1571c502dc1417efa4b66ec55e0", size = 44890, upload-time = "2025-10-17T02:30:55.11Z" }, ] [[package]] @@ -831,9 +861,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/0a/62438ca138a095945468968696d9cca75a4cfd059e810402e70b0236d8ba/google_cloud_bigquery-3.40.0.tar.gz", hash = "sha256:b3ccb11caf0029f15b29569518f667553fe08f6f1459b959020c83fbbd8f2e68", size = 509287, upload_time = "2026-01-08T01:07:26.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/0a/62438ca138a095945468968696d9cca75a4cfd059e810402e70b0236d8ba/google_cloud_bigquery-3.40.0.tar.gz", hash = "sha256:b3ccb11caf0029f15b29569518f667553fe08f6f1459b959020c83fbbd8f2e68", size = 509287, upload-time = "2026-01-08T01:07:26.065Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/6a/90a04270dd60cc70259b73744f6e610ae9a158b21ab50fb695cca0056a3d/google_cloud_bigquery-3.40.0-py3-none-any.whl", hash = "sha256:0469bcf9e3dad3cab65b67cce98180c8c0aacf3253d47f0f8e976f299b49b5ab", size = 261335, upload_time = "2026-01-08T01:07:23.761Z" }, + { url = "https://files.pythonhosted.org/packages/90/6a/90a04270dd60cc70259b73744f6e610ae9a158b21ab50fb695cca0056a3d/google_cloud_bigquery-3.40.0-py3-none-any.whl", hash = "sha256:0469bcf9e3dad3cab65b67cce98180c8c0aacf3253d47f0f8e976f299b49b5ab", size = 261335, upload-time = "2026-01-08T01:07:23.761Z" }, ] [[package]] @@ -847,9 +877,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/72/b5dbf3487ea320a87c6d1ba8bb7680fafdb3147343a06d928b4209abcdba/google_cloud_bigquery_storage-2.36.0.tar.gz", hash = "sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f", size = 306959, upload_time = "2025-12-18T18:01:45.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/72/b5dbf3487ea320a87c6d1ba8bb7680fafdb3147343a06d928b4209abcdba/google_cloud_bigquery_storage-2.36.0.tar.gz", hash = "sha256:d3c1ce9d2d3a4d7116259889dcbe3c7c70506f71f6ce6bbe54aa0a68bbba8f8f", size = 306959, upload-time = "2025-12-18T18:01:45.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/50/70e4bc2d52b52145b6e70008fbf806cef850e809dd3e30b4493d91c069ea/google_cloud_bigquery_storage-2.36.0-py3-none-any.whl", hash = "sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0", size = 303731, upload_time = "2025-12-18T18:01:44.598Z" }, + { url = "https://files.pythonhosted.org/packages/01/50/70e4bc2d52b52145b6e70008fbf806cef850e809dd3e30b4493d91c069ea/google_cloud_bigquery_storage-2.36.0-py3-none-any.whl", hash = "sha256:1769e568070db672302771d2aec18341de10712aa9c4a8c549f417503e0149f0", size = 303731, upload-time = "2025-12-18T18:01:44.598Z" }, ] [[package]] @@ -865,9 +895,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/c9/aceae21411b1a77fb4d3cde6e6f461321ee33c65fb8dc53480d4e47e1a55/google_cloud_bigtable-2.35.0.tar.gz", hash = "sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b", size = 775613, upload_time = "2025-12-17T15:18:14.303Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/c9/aceae21411b1a77fb4d3cde6e6f461321ee33c65fb8dc53480d4e47e1a55/google_cloud_bigtable-2.35.0.tar.gz", hash = "sha256:f5699012c5fea4bd4bdf7e80e5e3a812a847eb8f41bf8dc2f43095d6d876b83b", size = 775613, upload-time = "2025-12-17T15:18:14.303Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/69/03eed134d71f6117ffd9efac2d1033bb2fa2522e9e82545a0828061d32f4/google_cloud_bigtable-2.35.0-py3-none-any.whl", hash = "sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50", size = 540341, upload_time = "2025-12-17T15:18:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/62/69/03eed134d71f6117ffd9efac2d1033bb2fa2522e9e82545a0828061d32f4/google_cloud_bigtable-2.35.0-py3-none-any.whl", hash = "sha256:f355bfce1f239453ec2bb3839b0f4f9937cf34ef06ef29e1ca63d58fd38d0c50", size = 540341, upload-time = "2025-12-17T15:18:12.176Z" }, ] [[package]] @@ -878,9 +908,9 @@ dependencies = [ { name = "google-api-core" }, { name = "google-auth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/03/ef0bc99d0e0faf4fdbe67ac445e18cdaa74824fd93cd069e7bb6548cb52d/google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963", size = 36027, upload_time = "2025-10-29T23:17:39.513Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/03/ef0bc99d0e0faf4fdbe67ac445e18cdaa74824fd93cd069e7bb6548cb52d/google_cloud_core-2.5.0.tar.gz", hash = "sha256:7c1b7ef5c92311717bd05301aa1a91ffbc565673d3b0b4163a52d8413a186963", size = 36027, upload-time = "2025-10-29T23:17:39.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/20/bfa472e327c8edee00f04beecc80baeddd2ab33ee0e86fd7654da49d45e9/google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", size = 29469, upload_time = "2025-10-29T23:17:38.548Z" }, + { url = "https://files.pythonhosted.org/packages/89/20/bfa472e327c8edee00f04beecc80baeddd2ab33ee0e86fd7654da49d45e9/google_cloud_core-2.5.0-py3-none-any.whl", hash = "sha256:67d977b41ae6c7211ee830c7912e41003ea8194bff15ae7d72fd6f51e57acabc", size = 29469, upload-time = "2025-10-29T23:17:38.548Z" }, ] [[package]] @@ -893,9 +923,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/cd/b33bbc4b096d937abee5ebfad3908b2bdc65acd1582191aa33beaa2b70a5/google_cloud_discoveryengine-0.13.12.tar.gz", hash = "sha256:d6b9f8fadd8ad0d2f4438231c5eb7772a317e9f59cafbcbadc19b5d54c609419", size = 3582382, upload_time = "2025-09-22T16:51:14.052Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/cd/b33bbc4b096d937abee5ebfad3908b2bdc65acd1582191aa33beaa2b70a5/google_cloud_discoveryengine-0.13.12.tar.gz", hash = "sha256:d6b9f8fadd8ad0d2f4438231c5eb7772a317e9f59cafbcbadc19b5d54c609419", size = 3582382, upload-time = "2025-09-22T16:51:14.052Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/70/607f6011648f603d35e60a16c34aee68a0b39510e4268d4859f3268684f9/google_cloud_discoveryengine-0.13.12-py3-none-any.whl", hash = "sha256:295f8c6df3fb26b90fb82c2cd6fbcf4b477661addcb19a94eea16463a5c4e041", size = 3337248, upload_time = "2025-09-22T16:50:57.375Z" }, + { url = "https://files.pythonhosted.org/packages/93/70/607f6011648f603d35e60a16c34aee68a0b39510e4268d4859f3268684f9/google_cloud_discoveryengine-0.13.12-py3-none-any.whl", hash = "sha256:295f8c6df3fb26b90fb82c2cd6fbcf4b477661addcb19a94eea16463a5c4e041", size = 3337248, upload-time = "2025-09-22T16:50:57.375Z" }, ] [[package]] @@ -910,9 +940,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/0b/037b1e1eb601646d6f49bc06d62094c1d0996b373dcbf70c426c6c51572e/google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3", size = 499038, upload_time = "2026-01-15T13:15:08.243Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0b/037b1e1eb601646d6f49bc06d62094c1d0996b373dcbf70c426c6c51572e/google_cloud_iam-2.21.0.tar.gz", hash = "sha256:fc560527e22b97c6cbfba0797d867cf956c727ba687b586b9aa44d78e92281a3", size = 499038, upload-time = "2026-01-15T13:15:08.243Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/44/02ac4e147ea034a3d641c11b54c9d8d0b80fc1ea6a8b7d6c1588d208d42a/google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4", size = 458958, upload_time = "2026-01-15T13:13:40.671Z" }, + { url = "https://files.pythonhosted.org/packages/c8/44/02ac4e147ea034a3d641c11b54c9d8d0b80fc1ea6a8b7d6c1588d208d42a/google_cloud_iam-2.21.0-py3-none-any.whl", hash = "sha256:1b4a21302b186a31f3a516ccff303779638308b7c801fb61a2406b6a0c6293c4", size = 458958, upload-time = "2026-01-15T13:13:40.671Z" }, ] [[package]] @@ -930,9 +960,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/47/31ef0261802fe8b37c221392e1d6ff01d30b03dce5e20e77fc7d57ddf8a3/google_cloud_logging-3.13.0.tar.gz", hash = "sha256:3aae0573b1a1a4f59ecdf4571f4e7881b5823bd129fe469561c1c49a7fa8a4c1", size = 290169, upload_time = "2025-12-16T14:11:07.345Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/47/31ef0261802fe8b37c221392e1d6ff01d30b03dce5e20e77fc7d57ddf8a3/google_cloud_logging-3.13.0.tar.gz", hash = "sha256:3aae0573b1a1a4f59ecdf4571f4e7881b5823bd129fe469561c1c49a7fa8a4c1", size = 290169, upload-time = "2025-12-16T14:11:07.345Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/5a/778dca2e375171af4085554cb3bc643627717a7e4e1539842ced3afd6ec4/google_cloud_logging-3.13.0-py3-none-any.whl", hash = "sha256:f215e1c76ee29239c6cacf02443dffa985663c74bf47c9818854694805c6019f", size = 230518, upload_time = "2025-12-16T14:11:05.894Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5a/778dca2e375171af4085554cb3bc643627717a7e4e1539842ced3afd6ec4/google_cloud_logging-3.13.0-py3-none-any.whl", hash = "sha256:f215e1c76ee29239c6cacf02443dffa985663c74bf47c9818854694805c6019f", size = 230518, upload-time = "2025-12-16T14:11:05.894Z" }, ] [[package]] @@ -946,9 +976,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/06/9fc0a34bed4221a68eef3e0373ae054de367dc42c0b689d5d917587ef61b/google_cloud_monitoring-2.29.1.tar.gz", hash = "sha256:86cac55cdd2608561819d19544fb3c129bbb7dcecc445d8de426e34cd6fa8e49", size = 404383, upload_time = "2026-02-05T18:59:13.026Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/06/9fc0a34bed4221a68eef3e0373ae054de367dc42c0b689d5d917587ef61b/google_cloud_monitoring-2.29.1.tar.gz", hash = "sha256:86cac55cdd2608561819d19544fb3c129bbb7dcecc445d8de426e34cd6fa8e49", size = 404383, upload-time = "2026-02-05T18:59:13.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/97/7c27aa95eccf8b62b066295a7c4ad04284364b696d3e7d9d47152b255a24/google_cloud_monitoring-2.29.1-py3-none-any.whl", hash = "sha256:944a57031f20da38617d184d5658c1f938e019e8061f27fd944584831a1b9d5a", size = 387922, upload_time = "2026-02-05T18:58:54.964Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/7c27aa95eccf8b62b066295a7c4ad04284364b696d3e7d9d47152b255a24/google_cloud_monitoring-2.29.1-py3-none-any.whl", hash = "sha256:944a57031f20da38617d184d5658c1f938e019e8061f27fd944584831a1b9d5a", size = 387922, upload-time = "2026-02-05T18:58:54.964Z" }, ] [[package]] @@ -963,9 +993,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4e/7f/db00b2820475793a52958dc55fe9ec2eb8e863546e05fcece9b921f86ebe/google_cloud_resource_manager-1.16.0.tar.gz", hash = "sha256:cc938f87cc36c2672f062b1e541650629e0d954c405a4dac35ceedee70c267c3", size = 459840, upload_time = "2026-01-15T13:04:07.726Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/7f/db00b2820475793a52958dc55fe9ec2eb8e863546e05fcece9b921f86ebe/google_cloud_resource_manager-1.16.0.tar.gz", hash = "sha256:cc938f87cc36c2672f062b1e541650629e0d954c405a4dac35ceedee70c267c3", size = 459840, upload-time = "2026-01-15T13:04:07.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/ff/4b28bcc791d9d7e4ac8fea00fbd90ccb236afda56746a3b4564d2ae45df3/google_cloud_resource_manager-1.16.0-py3-none-any.whl", hash = "sha256:fb9a2ad2b5053c508e1c407ac31abfd1a22e91c32876c1892830724195819a28", size = 400218, upload_time = "2026-01-15T13:02:47.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/ff/4b28bcc791d9d7e4ac8fea00fbd90ccb236afda56746a3b4564d2ae45df3/google_cloud_resource_manager-1.16.0-py3-none-any.whl", hash = "sha256:fb9a2ad2b5053c508e1c407ac31abfd1a22e91c32876c1892830724195819a28", size = 400218, upload-time = "2026-01-15T13:02:47.378Z" }, ] [[package]] @@ -980,9 +1010,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/9c/a6c7144bc96df77376ae3fcc916fb639c40814c2e4bba2051d31dc136cd0/google_cloud_secret_manager-2.26.0.tar.gz", hash = "sha256:0d1d6f76327685a0ed78a4cf50f289e1bfbbe56026ed0affa98663b86d6d50d6", size = 277603, upload_time = "2025-12-18T00:29:31.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/9c/a6c7144bc96df77376ae3fcc916fb639c40814c2e4bba2051d31dc136cd0/google_cloud_secret_manager-2.26.0.tar.gz", hash = "sha256:0d1d6f76327685a0ed78a4cf50f289e1bfbbe56026ed0affa98663b86d6d50d6", size = 277603, upload-time = "2025-12-18T00:29:31.065Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/30/a58739dd12cec0f7f761ed1efb518aed2250a407d4ed14c5a0eeee7eaaf9/google_cloud_secret_manager-2.26.0-py3-none-any.whl", hash = "sha256:940a5447a6ec9951446fd1a0f22c81a4303fde164cd747aae152c5f5c8e6723e", size = 223623, upload_time = "2025-12-18T00:29:29.311Z" }, + { url = "https://files.pythonhosted.org/packages/c8/30/a58739dd12cec0f7f761ed1efb518aed2250a407d4ed14c5a0eeee7eaaf9/google_cloud_secret_manager-2.26.0-py3-none-any.whl", hash = "sha256:940a5447a6ec9951446fd1a0f22c81a4303fde164cd747aae152c5f5c8e6723e", size = 223623, upload-time = "2025-12-18T00:29:29.311Z" }, ] [[package]] @@ -1004,9 +1034,9 @@ dependencies = [ { name = "protobuf" }, { name = "sqlparse" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/80/86e152f887cdddab5b8268c93d18c671a3653545be2ea2babab6b6ad635f/google_cloud_spanner-3.62.0.tar.gz", hash = "sha256:a25bdbfda84bc7a819f04e45473187d8670711fd5ec827cf442e3664661d1d23", size = 722967, upload_time = "2026-01-16T06:33:29.462Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/80/86e152f887cdddab5b8268c93d18c671a3653545be2ea2babab6b6ad635f/google_cloud_spanner-3.62.0.tar.gz", hash = "sha256:a25bdbfda84bc7a819f04e45473187d8670711fd5ec827cf442e3664661d1d23", size = 722967, upload-time = "2026-01-16T06:33:29.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/a3/27c0af7f4350757f449e601733d960fc6e2717fa25d3d826ad29b694de68/google_cloud_spanner-3.62.0-py3-none-any.whl", hash = "sha256:b59d7b731463ce998439c1998730760e36f3d699510608d896f2ca8bc57613a9", size = 516156, upload_time = "2026-01-16T06:33:28.173Z" }, + { url = "https://files.pythonhosted.org/packages/9c/a3/27c0af7f4350757f449e601733d960fc6e2717fa25d3d826ad29b694de68/google_cloud_spanner-3.62.0-py3-none-any.whl", hash = "sha256:b59d7b731463ce998439c1998730760e36f3d699510608d896f2ca8bc57613a9", size = 516156, upload-time = "2026-01-16T06:33:28.173Z" }, ] [[package]] @@ -1020,9 +1050,9 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b7/b078693abc67af4cbbf60727ebd29d37f786ada8a6146ada2d5918da6a3a/google_cloud_speech-2.36.1.tar.gz", hash = "sha256:30fef3b30c1e1b5f376be3cf82a724c8629994de045935f85e4b7bceae8c2129", size = 401910, upload_time = "2026-02-05T18:59:22.411Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b7/b078693abc67af4cbbf60727ebd29d37f786ada8a6146ada2d5918da6a3a/google_cloud_speech-2.36.1.tar.gz", hash = "sha256:30fef3b30c1e1b5f376be3cf82a724c8629994de045935f85e4b7bceae8c2129", size = 401910, upload-time = "2026-02-05T18:59:22.411Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/13/b1437f2716ce56ca13298855929e5fb790c13c3ddee24248a3682ba392a5/google_cloud_speech-2.36.1-py3-none-any.whl", hash = "sha256:a54985b3e7c001a9feae78cec77e67e85d29b3851d00af1f805ffff3f477d8fe", size = 342457, upload_time = "2026-02-05T18:58:59.518Z" }, + { url = "https://files.pythonhosted.org/packages/f0/13/b1437f2716ce56ca13298855929e5fb790c13c3ddee24248a3682ba392a5/google_cloud_speech-2.36.1-py3-none-any.whl", hash = "sha256:a54985b3e7c001a9feae78cec77e67e85d29b3851d00af1f805ffff3f477d8fe", size = 342457, upload-time = "2026-02-05T18:58:59.518Z" }, ] [[package]] @@ -1037,9 +1067,9 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/b1/4f0798e88285b50dfc60ed3a7de071def538b358db2da468c2e0deecbb40/google_cloud_storage-3.9.0.tar.gz", hash = "sha256:f2d8ca7db2f652be757e92573b2196e10fbc09649b5c016f8b422ad593c641cc", size = 17298544, upload_time = "2026-02-02T13:36:34.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/b1/4f0798e88285b50dfc60ed3a7de071def538b358db2da468c2e0deecbb40/google_cloud_storage-3.9.0.tar.gz", hash = "sha256:f2d8ca7db2f652be757e92573b2196e10fbc09649b5c016f8b422ad593c641cc", size = 17298544, upload-time = "2026-02-02T13:36:34.119Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/0b/816a6ae3c9fd096937d2e5f9670558908811d57d59ddf69dd4b83b326fd1/google_cloud_storage-3.9.0-py3-none-any.whl", hash = "sha256:2dce75a9e8b3387078cbbdad44757d410ecdb916101f8ba308abf202b6968066", size = 321324, upload_time = "2026-02-02T13:36:32.271Z" }, + { url = "https://files.pythonhosted.org/packages/46/0b/816a6ae3c9fd096937d2e5f9670558908811d57d59ddf69dd4b83b326fd1/google_cloud_storage-3.9.0-py3-none-any.whl", hash = "sha256:2dce75a9e8b3387078cbbdad44757d410ecdb916101f8ba308abf202b6968066", size = 321324, upload-time = "2026-02-02T13:36:32.271Z" }, ] [[package]] @@ -1053,32 +1083,32 @@ dependencies = [ { name = "proto-plus" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/34/b1883f4682f1681941100df0e411cb0185013f7c349489ab1330348d7c5c/google_cloud_trace-1.18.0.tar.gz", hash = "sha256:46d42b90273da3bc4850bb0d6b9a205eb826a54561ff1b30ca33cc92174c3f37", size = 103347, upload_time = "2026-01-15T13:04:56.441Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/34/b1883f4682f1681941100df0e411cb0185013f7c349489ab1330348d7c5c/google_cloud_trace-1.18.0.tar.gz", hash = "sha256:46d42b90273da3bc4850bb0d6b9a205eb826a54561ff1b30ca33cc92174c3f37", size = 103347, upload-time = "2026-01-15T13:04:56.441Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/15/366fd8b028a50a9018c933270d220a4e53dca8022ce9086618b72978ab90/google_cloud_trace-1.18.0-py3-none-any.whl", hash = "sha256:52c002d8d3da802e031fee62cd49a1baf899932d4f548a150f685af6815b5554", size = 107488, upload_time = "2026-01-15T12:17:21.519Z" }, + { url = "https://files.pythonhosted.org/packages/87/15/366fd8b028a50a9018c933270d220a4e53dca8022ce9086618b72978ab90/google_cloud_trace-1.18.0-py3-none-any.whl", hash = "sha256:52c002d8d3da802e031fee62cd49a1baf899932d4f548a150f685af6815b5554", size = 107488, upload-time = "2026-01-15T12:17:21.519Z" }, ] [[package]] name = "google-crc32c" version = "1.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload_time = "2025-12-16T00:35:25.142Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload_time = "2025-12-16T00:23:20.709Z" }, - { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload_time = "2025-12-16T00:43:14.628Z" }, - { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload_time = "2025-12-16T00:40:24.742Z" }, - { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload_time = "2025-12-16T00:40:25.505Z" }, - { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload_time = "2025-12-16T00:35:22.107Z" }, - { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload_time = "2025-12-16T00:24:48.527Z" }, - { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload_time = "2025-12-16T00:48:12.163Z" }, - { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload_time = "2025-12-16T00:40:26.268Z" }, - { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload_time = "2025-12-16T00:40:27.028Z" }, - { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload_time = "2025-12-16T00:35:23.142Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, ] [[package]] name = "google-genai" -version = "1.62.0" +version = "1.63.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1092,9 +1122,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/4c/71b32b5c8db420cf2fd0d5ef8a672adbde97d85e5d44a0b4fca712264ef1/google_genai-1.62.0.tar.gz", hash = "sha256:709468a14c739a080bc240a4f3191df597bf64485b1ca3728e0fb67517774c18", size = 490888, upload_time = "2026-02-04T22:48:41.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/d7/07ec5dadd0741f09e89f3ff5f0ce051ce2aa3a76797699d661dc88def077/google_genai-1.63.0.tar.gz", hash = "sha256:dc76cab810932df33cbec6c7ef3ce1538db5bef27aaf78df62ac38666c476294", size = 491970, upload-time = "2026-02-11T23:46:28.472Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/5f/4645d8a28c6e431d0dd6011003a852563f3da7037d36af53154925b099fd/google_genai-1.62.0-py3-none-any.whl", hash = "sha256:4c3daeff3d05fafee4b9a1a31f9c07f01bc22051081aa58b4d61f58d16d1bcc0", size = 724166, upload_time = "2026-02-04T22:48:39.956Z" }, + { url = "https://files.pythonhosted.org/packages/82/c8/ba32159e553fab787708c612cf0c3a899dafe7aca81115d841766e3bfe69/google_genai-1.63.0-py3-none-any.whl", hash = "sha256:6206c13fc20f332703ca7375bea7c191c82f95d6781c29936c6982d86599b359", size = 724747, upload-time = "2026-02-11T23:46:26.697Z" }, ] [[package]] @@ -1104,9 +1134,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-crc32c" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/d7/520b62a35b23038ff005e334dba3ffc75fcf583bee26723f1fd8fd4b6919/google_resumable_media-2.8.0.tar.gz", hash = "sha256:f1157ed8b46994d60a1bc432544db62352043113684d4e030ee02e77ebe9a1ae", size = 2163265, upload_time = "2025-11-17T15:38:06.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/d7/520b62a35b23038ff005e334dba3ffc75fcf583bee26723f1fd8fd4b6919/google_resumable_media-2.8.0.tar.gz", hash = "sha256:f1157ed8b46994d60a1bc432544db62352043113684d4e030ee02e77ebe9a1ae", size = 2163265, upload-time = "2025-11-17T15:38:06.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/0b/93afde9cfe012260e9fe1522f35c9b72d6ee222f316586b1f23ecf44d518/google_resumable_media-2.8.0-py3-none-any.whl", hash = "sha256:dd14a116af303845a8d932ddae161a26e86cc229645bc98b39f026f9b1717582", size = 81340, upload_time = "2025-11-17T15:38:05.594Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0b/93afde9cfe012260e9fe1522f35c9b72d6ee222f316586b1f23ecf44d518/google_resumable_media-2.8.0-py3-none-any.whl", hash = "sha256:dd14a116af303845a8d932ddae161a26e86cc229645bc98b39f026f9b1717582", size = 81340, upload-time = "2025-11-17T15:38:05.594Z" }, ] [[package]] @@ -1116,9 +1146,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload_time = "2025-11-06T18:29:24.087Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/7b/adfd75544c415c487b33061fe7ae526165241c1ea133f9a9125a56b39fd8/googleapis_common_protos-1.72.0.tar.gz", hash = "sha256:e55a601c1b32b52d7a3e65f43563e2aa61bcd737998ee672ac9b951cd49319f5", size = 147433, upload-time = "2025-11-06T18:29:24.087Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload_time = "2025-11-06T18:29:13.14Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ab/09169d5a4612a5f92490806649ac8d41e3ec9129c636754575b3553f4ea4/googleapis_common_protos-1.72.0-py3-none-any.whl", hash = "sha256:4299c5a82d5ae1a9702ada957347726b167f9f8d1fc352477702a1e851ff4038", size = 297515, upload-time = "2025-11-06T18:29:13.14Z" }, ] [package.optional-dependencies] @@ -1130,43 +1160,40 @@ grpc = [ name = "graphviz" version = "0.21" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/b3/3ac91e9be6b761a4b30d66ff165e54439dcd48b83f4e20d644867215f6ca/graphviz-0.21.tar.gz", hash = "sha256:20743e7183be82aaaa8ad6c93f8893c923bd6658a04c32ee115edb3c8a835f78", size = 200434, upload_time = "2025-06-15T09:35:05.824Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b3/3ac91e9be6b761a4b30d66ff165e54439dcd48b83f4e20d644867215f6ca/graphviz-0.21.tar.gz", hash = "sha256:20743e7183be82aaaa8ad6c93f8893c923bd6658a04c32ee115edb3c8a835f78", size = 200434, upload-time = "2025-06-15T09:35:05.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload_time = "2025-06-15T09:35:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/e0ce1ef95d4000ebc1c11801f9b944fa5910ecc15b5e351865763d8657f8/graphviz-0.21-py3-none-any.whl", hash = "sha256:54f33de9f4f911d7e84e4191749cac8cc5653f815b06738c54db9a15ab8b1e42", size = 47300, upload-time = "2025-06-15T09:35:04.433Z" }, ] [[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/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/06/00/95df0b6a935103c0452dad2203f5be8377e551b8466a29650c4c5a5af6cc/greenlet-3.3.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e", size = 624375, upload_time = "2026-01-23T16:15:55.915Z" }, - { 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/e2/89/b95f2ddcc5f3c2bc09c8ee8d77be312df7f9e7175703ab780f2014a0e781/greenlet-3.3.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d", size = 671455, upload_time = "2026-01-23T16:15:57.232Z" }, - { 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/7c/25/c51a63f3f463171e09cb586eb64db0861eb06667ab01a7968371a24c4f3b/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab", size = 662574, upload_time = "2026-01-23T16:15:58.364Z" }, - { 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/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/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" }, ] [[package]] @@ -1178,9 +1205,9 @@ dependencies = [ { name = "grpcio" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/1e/1011451679a983f2f5c6771a1682542ecb027776762ad031fd0d7129164b/grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389", size = 23745, upload_time = "2025-10-15T21:14:53.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/1e/1011451679a983f2f5c6771a1682542ecb027776762ad031fd0d7129164b/grpc_google_iam_v1-0.14.3.tar.gz", hash = "sha256:879ac4ef33136c5491a6300e27575a9ec760f6cdf9a2518798c1b8977a5dc389", size = 23745, upload-time = "2025-10-15T21:14:53.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/bd/330a1bbdb1afe0b96311249e699b6dc9cfc17916394fd4503ac5aca2514b/grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6", size = 32690, upload_time = "2025-10-15T21:14:51.72Z" }, + { url = "https://files.pythonhosted.org/packages/4a/bd/330a1bbdb1afe0b96311249e699b6dc9cfc17916394fd4503ac5aca2514b/grpc_google_iam_v1-0.14.3-py3-none-any.whl", hash = "sha256:7a7f697e017a067206a3dfef44e4c634a34d3dee135fe7d7a4613fe3e59217e6", size = 32690, upload-time = "2025-10-15T21:14:51.72Z" }, ] [[package]] @@ -1190,9 +1217,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/28/57449d5567adf4c1d3e216aaca545913fbc21a915f2da6790d6734aac76e/grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926", size = 19322, upload_time = "2023-11-16T02:05:42.459Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/28/57449d5567adf4c1d3e216aaca545913fbc21a915f2da6790d6734aac76e/grpc-interceptor-0.15.4.tar.gz", hash = "sha256:1f45c0bcb58b6f332f37c637632247c9b02bc6af0fdceb7ba7ce8d2ebbfb0926", size = 19322, upload-time = "2023-11-16T02:05:42.459Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/ac/8d53f230a7443401ce81791ec50a3b0e54924bf615ad287654fa4a2f5cdc/grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d", size = 20848, upload_time = "2023-11-16T02:05:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/15/ac/8d53f230a7443401ce81791ec50a3b0e54924bf615ad287654fa4a2f5cdc/grpc_interceptor-0.15.4-py3-none-any.whl", hash = "sha256:0035f33228693ed3767ee49d937bac424318db173fef4d2d0170b3215f254d9d", size = 20848, upload-time = "2023-11-16T02:05:40.913Z" }, ] [[package]] @@ -1202,28 +1229,28 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload_time = "2026-02-06T09:57:18.093Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/a9/8f75894993895f361ed8636cd9237f4ab39ef87fd30db17467235ed1c045/grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b", size = 5920143, upload_time = "2026-02-06T09:55:52.035Z" }, - { url = "https://files.pythonhosted.org/packages/55/06/0b78408e938ac424100100fd081189451b472236e8a3a1f6500390dc4954/grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a", size = 11803926, upload_time = "2026-02-06T09:55:55.494Z" }, - { url = "https://files.pythonhosted.org/packages/88/93/b59fe7832ff6ae3c78b813ea43dac60e295fa03606d14d89d2e0ec29f4f3/grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84", size = 6478628, upload_time = "2026-02-06T09:55:58.533Z" }, - { url = "https://files.pythonhosted.org/packages/ed/df/e67e3734527f9926b7d9c0dde6cd998d1d26850c3ed8eeec81297967ac67/grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb", size = 7173574, upload_time = "2026-02-06T09:56:01.786Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/cc03fffb07bfba982a9ec097b164e8835546980aec25ecfa5f9c1a47e022/grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5", size = 6692639, upload_time = "2026-02-06T09:56:04.529Z" }, - { url = "https://files.pythonhosted.org/packages/bf/9a/289c32e301b85bdb67d7ec68b752155e674ee3ba2173a1858f118e399ef3/grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9", size = 7268838, upload_time = "2026-02-06T09:56:08.397Z" }, - { url = "https://files.pythonhosted.org/packages/0e/79/1be93f32add280461fa4773880196572563e9c8510861ac2da0ea0f892b6/grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702", size = 8251878, upload_time = "2026-02-06T09:56:10.914Z" }, - { url = "https://files.pythonhosted.org/packages/65/65/793f8e95296ab92e4164593674ae6291b204bb5f67f9d4a711489cd30ffa/grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20", size = 7695412, upload_time = "2026-02-06T09:56:13.593Z" }, - { url = "https://files.pythonhosted.org/packages/1c/9f/1e233fe697ecc82845942c2822ed06bb522e70d6771c28d5528e4c50f6a4/grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670", size = 4064899, upload_time = "2026-02-06T09:56:15.601Z" }, - { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload_time = "2026-02-06T09:56:17.882Z" }, - { url = "https://files.pythonhosted.org/packages/29/f2/b56e43e3c968bfe822fa6ce5bca10d5c723aa40875b48791ce1029bb78c7/grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e", size = 5920591, upload_time = "2026-02-06T09:56:20.758Z" }, - { url = "https://files.pythonhosted.org/packages/5d/81/1f3b65bd30c334167bfa8b0d23300a44e2725ce39bba5b76a2460d85f745/grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f", size = 11813685, upload_time = "2026-02-06T09:56:24.315Z" }, - { url = "https://files.pythonhosted.org/packages/0e/1c/bbe2f8216a5bd3036119c544d63c2e592bdf4a8ec6e4a1867592f4586b26/grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724", size = 6487803, upload_time = "2026-02-06T09:56:27.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/5c/a6b2419723ea7ddce6308259a55e8e7593d88464ce8db9f4aa857aba96fa/grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b", size = 7173206, upload_time = "2026-02-06T09:56:29.876Z" }, - { url = "https://files.pythonhosted.org/packages/df/1e/b8801345629a415ea7e26c83d75eb5dbe91b07ffe5210cc517348a8d4218/grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7", size = 6693826, upload_time = "2026-02-06T09:56:32.305Z" }, - { url = "https://files.pythonhosted.org/packages/34/84/0de28eac0377742679a510784f049738a80424b17287739fc47d63c2439e/grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452", size = 7277897, upload_time = "2026-02-06T09:56:34.915Z" }, - { url = "https://files.pythonhosted.org/packages/ca/9c/ad8685cfe20559a9edb66f735afdcb2b7d3de69b13666fdfc542e1916ebd/grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127", size = 8252404, upload_time = "2026-02-06T09:56:37.553Z" }, - { url = "https://files.pythonhosted.org/packages/3c/05/33a7a4985586f27e1de4803887c417ec7ced145ebd069bc38a9607059e2b/grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65", size = 7696837, upload_time = "2026-02-06T09:56:40.173Z" }, - { url = "https://files.pythonhosted.org/packages/73/77/7382241caf88729b106e49e7d18e3116216c778e6a7e833826eb96de22f7/grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c", size = 4142439, upload_time = "2026-02-06T09:56:43.258Z" }, - { url = "https://files.pythonhosted.org/packages/48/b2/b096ccce418882fbfda4f7496f9357aaa9a5af1896a9a7f60d9f2b275a06/grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb", size = 4929852, upload_time = "2026-02-06T09:56:45.885Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/06/8a/3d098f35c143a89520e568e6539cc098fcd294495910e359889ce8741c84/grpcio-1.78.0.tar.gz", hash = "sha256:7382b95189546f375c174f53a5fa873cef91c4b8005faa05cc5b3beea9c4f1c5", size = 12852416, upload-time = "2026-02-06T09:57:18.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/a9/8f75894993895f361ed8636cd9237f4ab39ef87fd30db17467235ed1c045/grpcio-1.78.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ce3a90455492bf8bfa38e56fbbe1dbd4f872a3d8eeaf7337dc3b1c8aa28c271b", size = 5920143, upload-time = "2026-02-06T09:55:52.035Z" }, + { url = "https://files.pythonhosted.org/packages/55/06/0b78408e938ac424100100fd081189451b472236e8a3a1f6500390dc4954/grpcio-1.78.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:2bf5e2e163b356978b23652c4818ce4759d40f4712ee9ec5a83c4be6f8c23a3a", size = 11803926, upload-time = "2026-02-06T09:55:55.494Z" }, + { url = "https://files.pythonhosted.org/packages/88/93/b59fe7832ff6ae3c78b813ea43dac60e295fa03606d14d89d2e0ec29f4f3/grpcio-1.78.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8f2ac84905d12918e4e55a16da17939eb63e433dc11b677267c35568aa63fc84", size = 6478628, upload-time = "2026-02-06T09:55:58.533Z" }, + { url = "https://files.pythonhosted.org/packages/ed/df/e67e3734527f9926b7d9c0dde6cd998d1d26850c3ed8eeec81297967ac67/grpcio-1.78.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b58f37edab4a3881bc6c9bca52670610e0c9ca14e2ea3cf9debf185b870457fb", size = 7173574, upload-time = "2026-02-06T09:56:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/cc03fffb07bfba982a9ec097b164e8835546980aec25ecfa5f9c1a47e022/grpcio-1.78.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:735e38e176a88ce41840c21bb49098ab66177c64c82426e24e0082500cc68af5", size = 6692639, upload-time = "2026-02-06T09:56:04.529Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/289c32e301b85bdb67d7ec68b752155e674ee3ba2173a1858f118e399ef3/grpcio-1.78.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2045397e63a7a0ee7957c25f7dbb36ddc110e0cfb418403d110c0a7a68a844e9", size = 7268838, upload-time = "2026-02-06T09:56:08.397Z" }, + { url = "https://files.pythonhosted.org/packages/0e/79/1be93f32add280461fa4773880196572563e9c8510861ac2da0ea0f892b6/grpcio-1.78.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a9f136fbafe7ccf4ac7e8e0c28b31066e810be52d6e344ef954a3a70234e1702", size = 8251878, upload-time = "2026-02-06T09:56:10.914Z" }, + { url = "https://files.pythonhosted.org/packages/65/65/793f8e95296ab92e4164593674ae6291b204bb5f67f9d4a711489cd30ffa/grpcio-1.78.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:748b6138585379c737adc08aeffd21222abbda1a86a0dca2a39682feb9196c20", size = 7695412, upload-time = "2026-02-06T09:56:13.593Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9f/1e233fe697ecc82845942c2822ed06bb522e70d6771c28d5528e4c50f6a4/grpcio-1.78.0-cp313-cp313-win32.whl", hash = "sha256:271c73e6e5676afe4fc52907686670c7cea22ab2310b76a59b678403ed40d670", size = 4064899, upload-time = "2026-02-06T09:56:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/4d/27/d86b89e36de8a951501fb06a0f38df19853210f341d0b28f83f4aa0ffa08/grpcio-1.78.0-cp313-cp313-win_amd64.whl", hash = "sha256:f2d4e43ee362adfc05994ed479334d5a451ab7bc3f3fee1b796b8ca66895acb4", size = 4797393, upload-time = "2026-02-06T09:56:17.882Z" }, + { url = "https://files.pythonhosted.org/packages/29/f2/b56e43e3c968bfe822fa6ce5bca10d5c723aa40875b48791ce1029bb78c7/grpcio-1.78.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:e87cbc002b6f440482b3519e36e1313eb5443e9e9e73d6a52d43bd2004fcfd8e", size = 5920591, upload-time = "2026-02-06T09:56:20.758Z" }, + { url = "https://files.pythonhosted.org/packages/5d/81/1f3b65bd30c334167bfa8b0d23300a44e2725ce39bba5b76a2460d85f745/grpcio-1.78.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:c41bc64626db62e72afec66b0c8a0da76491510015417c127bfc53b2fe6d7f7f", size = 11813685, upload-time = "2026-02-06T09:56:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1c/bbe2f8216a5bd3036119c544d63c2e592bdf4a8ec6e4a1867592f4586b26/grpcio-1.78.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8dfffba826efcf366b1e3ccc37e67afe676f290e13a3b48d31a46739f80a8724", size = 6487803, upload-time = "2026-02-06T09:56:27.367Z" }, + { url = "https://files.pythonhosted.org/packages/16/5c/a6b2419723ea7ddce6308259a55e8e7593d88464ce8db9f4aa857aba96fa/grpcio-1.78.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74be1268d1439eaaf552c698cdb11cd594f0c49295ae6bb72c34ee31abbe611b", size = 7173206, upload-time = "2026-02-06T09:56:29.876Z" }, + { url = "https://files.pythonhosted.org/packages/df/1e/b8801345629a415ea7e26c83d75eb5dbe91b07ffe5210cc517348a8d4218/grpcio-1.78.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be63c88b32e6c0f1429f1398ca5c09bc64b0d80950c8bb7807d7d7fb36fb84c7", size = 6693826, upload-time = "2026-02-06T09:56:32.305Z" }, + { url = "https://files.pythonhosted.org/packages/34/84/0de28eac0377742679a510784f049738a80424b17287739fc47d63c2439e/grpcio-1.78.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3c586ac70e855c721bda8f548d38c3ca66ac791dc49b66a8281a1f99db85e452", size = 7277897, upload-time = "2026-02-06T09:56:34.915Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9c/ad8685cfe20559a9edb66f735afdcb2b7d3de69b13666fdfc542e1916ebd/grpcio-1.78.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:35eb275bf1751d2ffbd8f57cdbc46058e857cf3971041521b78b7db94bdaf127", size = 8252404, upload-time = "2026-02-06T09:56:37.553Z" }, + { url = "https://files.pythonhosted.org/packages/3c/05/33a7a4985586f27e1de4803887c417ec7ced145ebd069bc38a9607059e2b/grpcio-1.78.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:207db540302c884b8848036b80db352a832b99dfdf41db1eb554c2c2c7800f65", size = 7696837, upload-time = "2026-02-06T09:56:40.173Z" }, + { url = "https://files.pythonhosted.org/packages/73/77/7382241caf88729b106e49e7d18e3116216c778e6a7e833826eb96de22f7/grpcio-1.78.0-cp314-cp314-win32.whl", hash = "sha256:57bab6deef2f4f1ca76cc04565df38dc5713ae6c17de690721bdf30cb1e0545c", size = 4142439, upload-time = "2026-02-06T09:56:43.258Z" }, + { url = "https://files.pythonhosted.org/packages/48/b2/b096ccce418882fbfda4f7496f9357aaa9a5af1896a9a7f60d9f2b275a06/grpcio-1.78.0-cp314-cp314-win_amd64.whl", hash = "sha256:dce09d6116df20a96acfdbf85e4866258c3758180e8c49845d6ba8248b6d0bbb", size = 4929852, upload-time = "2026-02-06T09:56:45.885Z" }, ] [[package]] @@ -1235,47 +1262,47 @@ dependencies = [ { name = "grpcio" }, { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/cd/89ce482a931b543b92cdd9b2888805518c4620e0094409acb8c81dd4610a/grpcio_status-1.78.0.tar.gz", hash = "sha256:a34cfd28101bfea84b5aa0f936b4b423019e9213882907166af6b3bddc59e189", size = 13808, upload_time = "2026-02-06T10:01:48.034Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/cd/89ce482a931b543b92cdd9b2888805518c4620e0094409acb8c81dd4610a/grpcio_status-1.78.0.tar.gz", hash = "sha256:a34cfd28101bfea84b5aa0f936b4b423019e9213882907166af6b3bddc59e189", size = 13808, upload-time = "2026-02-06T10:01:48.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/8a/1241ec22c41028bddd4a052ae9369267b4475265ad0ce7140974548dc3fa/grpcio_status-1.78.0-py3-none-any.whl", hash = "sha256:b492b693d4bf27b47a6c32590701724f1d3b9444b36491878fb71f6208857f34", size = 14523, upload_time = "2026-02-06T10:01:32.584Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/1241ec22c41028bddd4a052ae9369267b4475265ad0ce7140974548dc3fa/grpcio_status-1.78.0-py3-none-any.whl", hash = "sha256:b492b693d4bf27b47a6c32590701724f1d3b9444b36491878fb71f6208857f34", size = 14523, upload-time = "2026-02-06T10:01:32.584Z" }, ] [[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" } +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" } 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, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[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" }, +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" }, ] [[package]] @@ -1286,9 +1313,9 @@ 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, upload-time = "2025-04-24T22:06:22.219Z" } 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, upload-time = "2025-04-24T22:06:20.566Z" }, ] [[package]] @@ -1298,9 +1325,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload_time = "2026-01-23T11:04:44.165Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload_time = "2026-01-23T11:04:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" }, ] [[package]] @@ -1313,18 +1340,18 @@ dependencies = [ { 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, upload-time = "2024-12-06T15:37:23.222Z" } 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, upload-time = "2024-12-06T15:37:21.509Z" }, ] [[package]] name = "httpx-sse" version = "0.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload_time = "2025-10-10T21:48:22.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload_time = "2025-10-10T21:48:21.158Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] [[package]] @@ -1343,18 +1370,18 @@ dependencies = [ { name = "typer-slim" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload_time = "2026-02-06T09:20:03.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/fc/eb9bc06130e8bbda6a616e1b80a7aa127681c448d6b49806f61db2670b61/huggingface_hub-1.4.1.tar.gz", hash = "sha256:b41131ec35e631e7383ab26d6146b8d8972abc8b6309b963b306fbcca87f5ed5", size = 642156, upload-time = "2026-02-06T09:20:03.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload_time = "2026-02-06T09:20:00.728Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ae/2f6d96b4e6c5478d87d606a1934b5d436c4a2bce6bb7c6fdece891c128e3/huggingface_hub-1.4.1-py3-none-any.whl", hash = "sha256:9931d075fb7a79af5abc487106414ec5fba2c0ae86104c0c62fd6cae38873d18", size = 553326, upload-time = "2026-02-06T09:20:00.728Z" }, ] [[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" } +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" } 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" }, + { 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]] @@ -1364,9 +1391,9 @@ 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" } +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/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" }, ] [[package]] @@ -1376,60 +1403,60 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } +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" }, + { 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.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload_time = "2026-02-02T12:37:56.441Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload_time = "2026-02-02T12:36:16.748Z" }, - { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload_time = "2026-02-02T12:36:18.351Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload_time = "2026-02-02T12:36:19.746Z" }, - { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload_time = "2026-02-02T12:36:21.243Z" }, - { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload_time = "2026-02-02T12:36:22.688Z" }, - { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload_time = "2026-02-02T12:36:24.106Z" }, - { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload_time = "2026-02-02T12:36:25.519Z" }, - { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload_time = "2026-02-02T12:36:26.866Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload_time = "2026-02-02T12:36:28.217Z" }, - { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload_time = "2026-02-02T12:36:29.678Z" }, - { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload_time = "2026-02-02T12:36:31.808Z" }, - { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload_time = "2026-02-02T12:36:33.679Z" }, - { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload_time = "2026-02-02T12:36:35.065Z" }, - { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload_time = "2026-02-02T12:36:36.579Z" }, - { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload_time = "2026-02-02T12:36:38.058Z" }, - { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload_time = "2026-02-02T12:36:39.417Z" }, - { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload_time = "2026-02-02T12:36:40.791Z" }, - { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload_time = "2026-02-02T12:36:42.077Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f5/f1997e987211f6f9bd71b8083047b316208b4aca0b529bb5f8c96c89ef3e/jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0", size = 308804, upload_time = "2026-02-02T12:36:43.496Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8f/5482a7677731fd44881f0204981ce2d7175db271f82cba2085dd2212e095/jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91", size = 318787, upload_time = "2026-02-02T12:36:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b9/7257ac59778f1cd025b26a23c5520a36a424f7f1b068f2442a5b499b7464/jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09", size = 353880, upload_time = "2026-02-02T12:36:47.365Z" }, - { url = "https://files.pythonhosted.org/packages/c3/87/719eec4a3f0841dad99e3d3604ee4cba36af4419a76f3cb0b8e2e691ad67/jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607", size = 366702, upload_time = "2026-02-02T12:36:48.871Z" }, - { url = "https://files.pythonhosted.org/packages/d2/65/415f0a75cf6921e43365a1bc227c565cb949caca8b7532776e430cbaa530/jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66", size = 486319, upload_time = "2026-02-02T12:36:53.006Z" }, - { url = "https://files.pythonhosted.org/packages/54/a2/9e12b48e82c6bbc6081fd81abf915e1443add1b13d8fc586e1d90bb02bb8/jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2", size = 372289, upload_time = "2026-02-02T12:36:54.593Z" }, - { url = "https://files.pythonhosted.org/packages/4e/c1/e4693f107a1789a239c759a432e9afc592366f04e901470c2af89cfd28e1/jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad", size = 360165, upload_time = "2026-02-02T12:36:56.112Z" }, - { url = "https://files.pythonhosted.org/packages/17/08/91b9ea976c1c758240614bd88442681a87672eebc3d9a6dde476874e706b/jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d", size = 389634, upload_time = "2026-02-02T12:36:57.495Z" }, - { url = "https://files.pythonhosted.org/packages/18/23/58325ef99390d6d40427ed6005bf1ad54f2577866594bcf13ce55675f87d/jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df", size = 514933, upload_time = "2026-02-02T12:36:58.909Z" }, - { url = "https://files.pythonhosted.org/packages/5b/25/69f1120c7c395fd276c3996bb8adefa9c6b84c12bb7111e5c6ccdcd8526d/jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d", size = 548842, upload_time = "2026-02-02T12:37:00.433Z" }, - { url = "https://files.pythonhosted.org/packages/18/05/981c9669d86850c5fbb0d9e62bba144787f9fba84546ba43d624ee27ef29/jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6", size = 202108, upload_time = "2026-02-02T12:37:01.718Z" }, - { url = "https://files.pythonhosted.org/packages/8d/96/cdcf54dd0b0341db7d25413229888a346c7130bd20820530905fdb65727b/jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f", size = 204027, upload_time = "2026-02-02T12:37:03.075Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f9/724bcaaab7a3cd727031fe4f6995cb86c4bd344909177c186699c8dec51a/jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d", size = 187199, upload_time = "2026-02-02T12:37:04.414Z" }, - { url = "https://files.pythonhosted.org/packages/62/92/1661d8b9fd6a3d7a2d89831db26fe3c1509a287d83ad7838831c7b7a5c7e/jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0", size = 318423, upload_time = "2026-02-02T12:37:05.806Z" }, - { url = "https://files.pythonhosted.org/packages/4f/3b/f77d342a54d4ebcd128e520fc58ec2f5b30a423b0fd26acdfc0c6fef8e26/jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40", size = 351438, upload_time = "2026-02-02T12:37:07.189Z" }, - { url = "https://files.pythonhosted.org/packages/76/b3/ba9a69f0e4209bd3331470c723c2f5509e6f0482e416b612431a5061ed71/jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202", size = 364774, upload_time = "2026-02-02T12:37:08.579Z" }, - { url = "https://files.pythonhosted.org/packages/b3/16/6cdb31fa342932602458dbb631bfbd47f601e03d2e4950740e0b2100b570/jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0", size = 487238, upload_time = "2026-02-02T12:37:10.066Z" }, - { url = "https://files.pythonhosted.org/packages/ed/b1/956cc7abaca8d95c13aa8d6c9b3f3797241c246cd6e792934cc4c8b250d2/jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95", size = 372892, upload_time = "2026-02-02T12:37:11.656Z" }, - { url = "https://files.pythonhosted.org/packages/26/c4/97ecde8b1e74f67b8598c57c6fccf6df86ea7861ed29da84629cdbba76c4/jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59", size = 360309, upload_time = "2026-02-02T12:37:13.244Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d7/eabe3cf46715854ccc80be2cd78dd4c36aedeb30751dbf85a1d08c14373c/jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe", size = 389607, upload_time = "2026-02-02T12:37:14.881Z" }, - { url = "https://files.pythonhosted.org/packages/df/2d/03963fc0804e6109b82decfb9974eb92df3797fe7222428cae12f8ccaa0c/jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939", size = 514986, upload_time = "2026-02-02T12:37:16.326Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/8c83b45eb3eb1c1e18d841fe30b4b5bc5619d781267ca9bc03e005d8fd0a/jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9", size = 548756, upload_time = "2026-02-02T12:37:17.736Z" }, - { url = "https://files.pythonhosted.org/packages/47/66/eea81dfff765ed66c68fd2ed8c96245109e13c896c2a5015c7839c92367e/jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6", size = 201196, upload_time = "2026-02-02T12:37:19.101Z" }, - { url = "https://files.pythonhosted.org/packages/ff/32/4ac9c7a76402f8f00d00842a7f6b83b284d0cf7c1e9d4227bc95aa6d17fa/jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8", size = 204215, upload_time = "2026-02-02T12:37:20.495Z" }, - { url = "https://files.pythonhosted.org/packages/f9/8e/7def204fea9f9be8b3c21a6f2dd6c020cf56c7d5ff753e0e23ed7f9ea57e/jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024", size = 187152, upload_time = "2026-02-02T12:37:22.124Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/9c/7ee5a6ff4b9991e1a45263bfc46731634c4a2bde27dfda6c8251df2d958c/jiter-0.13.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1f8a55b848cbabf97d861495cd65f1e5c590246fabca8b48e1747c4dfc8f85bf", size = 306897, upload-time = "2026-02-02T12:36:16.748Z" }, + { url = "https://files.pythonhosted.org/packages/7c/02/be5b870d1d2be5dd6a91bdfb90f248fbb7dcbd21338f092c6b89817c3dbf/jiter-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f556aa591c00f2c45eb1b89f68f52441a016034d18b65da60e2d2875bbbf344a", size = 317507, upload-time = "2026-02-02T12:36:18.351Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/b25d2ec333615f5f284f3a4024f7ce68cfa0604c322c6808b2344c7f5d2b/jiter-0.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7e1d61da332ec412350463891923f960c3073cf1aae93b538f0bb4c8cd46efb", size = 350560, upload-time = "2026-02-02T12:36:19.746Z" }, + { url = "https://files.pythonhosted.org/packages/be/ec/74dcb99fef0aca9fbe56b303bf79f6bd839010cb18ad41000bf6cc71eec0/jiter-0.13.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3097d665a27bc96fd9bbf7f86178037db139f319f785e4757ce7ccbf390db6c2", size = 363232, upload-time = "2026-02-02T12:36:21.243Z" }, + { url = "https://files.pythonhosted.org/packages/1b/37/f17375e0bb2f6a812d4dd92d7616e41917f740f3e71343627da9db2824ce/jiter-0.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d01ecc3a8cbdb6f25a37bd500510550b64ddf9f7d64a107d92f3ccb25035d0f", size = 483727, upload-time = "2026-02-02T12:36:22.688Z" }, + { url = "https://files.pythonhosted.org/packages/77/d2/a71160a5ae1a1e66c1395b37ef77da67513b0adba73b993a27fbe47eb048/jiter-0.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed9bbc30f5d60a3bdf63ae76beb3f9db280d7f195dfcfa61af792d6ce912d159", size = 370799, upload-time = "2026-02-02T12:36:24.106Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/ed5e478ff0eb4e8aa5fd998f9d69603c9fd3f32de3bd16c2b1194f68361c/jiter-0.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fbafb6e88256f4454de33c1f40203d09fc33ed19162a68b3b257b29ca7f663", size = 359120, upload-time = "2026-02-02T12:36:25.519Z" }, + { url = "https://files.pythonhosted.org/packages/16/be/7ffd08203277a813f732ba897352797fa9493faf8dc7995b31f3d9cb9488/jiter-0.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5467696f6b827f1116556cb0db620440380434591e93ecee7fd14d1a491b6daa", size = 390664, upload-time = "2026-02-02T12:36:26.866Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/e0787856196d6d346264d6dcccb01f741e5f0bd014c1d9a2ebe149caf4f3/jiter-0.13.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2d08c9475d48b92892583df9da592a0e2ac49bcd41fae1fec4f39ba6cf107820", size = 513543, upload-time = "2026-02-02T12:36:28.217Z" }, + { url = "https://files.pythonhosted.org/packages/65/50/ecbd258181c4313cf79bca6c88fb63207d04d5bf5e4f65174114d072aa55/jiter-0.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:aed40e099404721d7fcaf5b89bd3b4568a4666358bcac7b6b15c09fb6252ab68", size = 547262, upload-time = "2026-02-02T12:36:29.678Z" }, + { url = "https://files.pythonhosted.org/packages/27/da/68f38d12e7111d2016cd198161b36e1f042bd115c169255bcb7ec823a3bf/jiter-0.13.0-cp313-cp313-win32.whl", hash = "sha256:36ebfbcffafb146d0e6ffb3e74d51e03d9c35ce7c625c8066cdbfc7b953bdc72", size = 200630, upload-time = "2026-02-02T12:36:31.808Z" }, + { url = "https://files.pythonhosted.org/packages/25/65/3bd1a972c9a08ecd22eb3b08a95d1941ebe6938aea620c246cf426ae09c2/jiter-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:8d76029f077379374cf0dbc78dbe45b38dec4a2eb78b08b5194ce836b2517afc", size = 202602, upload-time = "2026-02-02T12:36:33.679Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/13bd3678a311aa67686bb303654792c48206a112068f8b0b21426eb6851e/jiter-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:bb7613e1a427cfcb6ea4544f9ac566b93d5bf67e0d48c787eca673ff9c9dff2b", size = 185939, upload-time = "2026-02-02T12:36:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/49/19/a929ec002ad3228bc97ca01dbb14f7632fffdc84a95ec92ceaf4145688ae/jiter-0.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fa476ab5dd49f3bf3a168e05f89358c75a17608dbabb080ef65f96b27c19ab10", size = 316616, upload-time = "2026-02-02T12:36:36.579Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/d19a9a194afa37c1728831e5fb81b7722c3de18a3109e8f282bfc23e587a/jiter-0.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade8cb6ff5632a62b7dbd4757d8c5573f7a2e9ae285d6b5b841707d8363205ef", size = 346850, upload-time = "2026-02-02T12:36:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/36/4a/94e831c6bf287754a8a019cb966ed39ff8be6ab78cadecf08df3bb02d505/jiter-0.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9950290340acc1adaded363edd94baebcee7dabdfa8bee4790794cd5cfad2af6", size = 358551, upload-time = "2026-02-02T12:36:39.417Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ec/a4c72c822695fa80e55d2b4142b73f0012035d9fcf90eccc56bc060db37c/jiter-0.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2b4972c6df33731aac0742b64fd0d18e0a69bc7d6e03108ce7d40c85fd9e3e6d", size = 201950, upload-time = "2026-02-02T12:36:40.791Z" }, + { url = "https://files.pythonhosted.org/packages/b6/00/393553ec27b824fbc29047e9c7cd4a3951d7fbe4a76743f17e44034fa4e4/jiter-0.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:701a1e77d1e593c1b435315ff625fd071f0998c5f02792038a5ca98899261b7d", size = 185852, upload-time = "2026-02-02T12:36:42.077Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f5/f1997e987211f6f9bd71b8083047b316208b4aca0b529bb5f8c96c89ef3e/jiter-0.13.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cc5223ab19fe25e2f0bf2643204ad7318896fe3729bf12fde41b77bfc4fafff0", size = 308804, upload-time = "2026-02-02T12:36:43.496Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8f/5482a7677731fd44881f0204981ce2d7175db271f82cba2085dd2212e095/jiter-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9776ebe51713acf438fd9b4405fcd86893ae5d03487546dae7f34993217f8a91", size = 318787, upload-time = "2026-02-02T12:36:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b9/7257ac59778f1cd025b26a23c5520a36a424f7f1b068f2442a5b499b7464/jiter-0.13.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879e768938e7b49b5e90b7e3fecc0dbec01b8cb89595861fb39a8967c5220d09", size = 353880, upload-time = "2026-02-02T12:36:47.365Z" }, + { url = "https://files.pythonhosted.org/packages/c3/87/719eec4a3f0841dad99e3d3604ee4cba36af4419a76f3cb0b8e2e691ad67/jiter-0.13.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:682161a67adea11e3aae9038c06c8b4a9a71023228767477d683f69903ebc607", size = 366702, upload-time = "2026-02-02T12:36:48.871Z" }, + { url = "https://files.pythonhosted.org/packages/d2/65/415f0a75cf6921e43365a1bc227c565cb949caca8b7532776e430cbaa530/jiter-0.13.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a13b68cd1cd8cc9de8f244ebae18ccb3e4067ad205220ef324c39181e23bbf66", size = 486319, upload-time = "2026-02-02T12:36:53.006Z" }, + { url = "https://files.pythonhosted.org/packages/54/a2/9e12b48e82c6bbc6081fd81abf915e1443add1b13d8fc586e1d90bb02bb8/jiter-0.13.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87ce0f14c6c08892b610686ae8be350bf368467b6acd5085a5b65441e2bf36d2", size = 372289, upload-time = "2026-02-02T12:36:54.593Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/e4693f107a1789a239c759a432e9afc592366f04e901470c2af89cfd28e1/jiter-0.13.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c365005b05505a90d1c47856420980d0237adf82f70c4aff7aebd3c1cc143ad", size = 360165, upload-time = "2026-02-02T12:36:56.112Z" }, + { url = "https://files.pythonhosted.org/packages/17/08/91b9ea976c1c758240614bd88442681a87672eebc3d9a6dde476874e706b/jiter-0.13.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1317fdffd16f5873e46ce27d0e0f7f4f90f0cdf1d86bf6abeaea9f63ca2c401d", size = 389634, upload-time = "2026-02-02T12:36:57.495Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/58325ef99390d6d40427ed6005bf1ad54f2577866594bcf13ce55675f87d/jiter-0.13.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c05b450d37ba0c9e21c77fef1f205f56bcee2330bddca68d344baebfc55ae0df", size = 514933, upload-time = "2026-02-02T12:36:58.909Z" }, + { url = "https://files.pythonhosted.org/packages/5b/25/69f1120c7c395fd276c3996bb8adefa9c6b84c12bb7111e5c6ccdcd8526d/jiter-0.13.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:775e10de3849d0631a97c603f996f518159272db00fdda0a780f81752255ee9d", size = 548842, upload-time = "2026-02-02T12:37:00.433Z" }, + { url = "https://files.pythonhosted.org/packages/18/05/981c9669d86850c5fbb0d9e62bba144787f9fba84546ba43d624ee27ef29/jiter-0.13.0-cp314-cp314-win32.whl", hash = "sha256:632bf7c1d28421c00dd8bbb8a3bac5663e1f57d5cd5ed962bce3c73bf62608e6", size = 202108, upload-time = "2026-02-02T12:37:01.718Z" }, + { url = "https://files.pythonhosted.org/packages/8d/96/cdcf54dd0b0341db7d25413229888a346c7130bd20820530905fdb65727b/jiter-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:f22ef501c3f87ede88f23f9b11e608581c14f04db59b6a801f354397ae13739f", size = 204027, upload-time = "2026-02-02T12:37:03.075Z" }, + { url = "https://files.pythonhosted.org/packages/fb/f9/724bcaaab7a3cd727031fe4f6995cb86c4bd344909177c186699c8dec51a/jiter-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:07b75fe09a4ee8e0c606200622e571e44943f47254f95e2436c8bdcaceb36d7d", size = 187199, upload-time = "2026-02-02T12:37:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/62/92/1661d8b9fd6a3d7a2d89831db26fe3c1509a287d83ad7838831c7b7a5c7e/jiter-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964538479359059a35fb400e769295d4b315ae61e4105396d355a12f7fef09f0", size = 318423, upload-time = "2026-02-02T12:37:05.806Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/f77d342a54d4ebcd128e520fc58ec2f5b30a423b0fd26acdfc0c6fef8e26/jiter-0.13.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e104da1db1c0991b3eaed391ccd650ae8d947eab1480c733e5a3fb28d4313e40", size = 351438, upload-time = "2026-02-02T12:37:07.189Z" }, + { url = "https://files.pythonhosted.org/packages/76/b3/ba9a69f0e4209bd3331470c723c2f5509e6f0482e416b612431a5061ed71/jiter-0.13.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e3a5f0cde8ff433b8e88e41aa40131455420fb3649a3c7abdda6145f8cb7202", size = 364774, upload-time = "2026-02-02T12:37:08.579Z" }, + { url = "https://files.pythonhosted.org/packages/b3/16/6cdb31fa342932602458dbb631bfbd47f601e03d2e4950740e0b2100b570/jiter-0.13.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57aab48f40be1db920a582b30b116fe2435d184f77f0e4226f546794cedd9cf0", size = 487238, upload-time = "2026-02-02T12:37:10.066Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b1/956cc7abaca8d95c13aa8d6c9b3f3797241c246cd6e792934cc4c8b250d2/jiter-0.13.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7772115877c53f62beeb8fd853cab692dbc04374ef623b30f997959a4c0e7e95", size = 372892, upload-time = "2026-02-02T12:37:11.656Z" }, + { url = "https://files.pythonhosted.org/packages/26/c4/97ecde8b1e74f67b8598c57c6fccf6df86ea7861ed29da84629cdbba76c4/jiter-0.13.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1211427574b17b633cfceba5040de8081e5abf114f7a7602f73d2e16f9fdaa59", size = 360309, upload-time = "2026-02-02T12:37:13.244Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d7/eabe3cf46715854ccc80be2cd78dd4c36aedeb30751dbf85a1d08c14373c/jiter-0.13.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7beae3a3d3b5212d3a55d2961db3c292e02e302feb43fce6a3f7a31b90ea6dfe", size = 389607, upload-time = "2026-02-02T12:37:14.881Z" }, + { url = "https://files.pythonhosted.org/packages/df/2d/03963fc0804e6109b82decfb9974eb92df3797fe7222428cae12f8ccaa0c/jiter-0.13.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e5562a0f0e90a6223b704163ea28e831bd3a9faa3512a711f031611e6b06c939", size = 514986, upload-time = "2026-02-02T12:37:16.326Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/8c83b45eb3eb1c1e18d841fe30b4b5bc5619d781267ca9bc03e005d8fd0a/jiter-0.13.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:6c26a424569a59140fb51160a56df13f438a2b0967365e987889186d5fc2f6f9", size = 548756, upload-time = "2026-02-02T12:37:17.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/66/eea81dfff765ed66c68fd2ed8c96245109e13c896c2a5015c7839c92367e/jiter-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:24dc96eca9f84da4131cdf87a95e6ce36765c3b156fc9ae33280873b1c32d5f6", size = 201196, upload-time = "2026-02-02T12:37:19.101Z" }, + { url = "https://files.pythonhosted.org/packages/ff/32/4ac9c7a76402f8f00d00842a7f6b83b284d0cf7c1e9d4227bc95aa6d17fa/jiter-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0a8d76c7524087272c8ae913f5d9d608bd839154b62c4322ef65723d2e5bb0b8", size = 204215, upload-time = "2026-02-02T12:37:20.495Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8e/7def204fea9f9be8b3c21a6f2dd6c020cf56c7d5ff753e0e23ed7f9ea57e/jiter-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2c26cf47e2cad140fa23b6d58d435a7c0161f5c514284802f25e87fddfe11024", size = 187152, upload-time = "2026-02-02T12:37:22.124Z" }, ] [[package]] @@ -1442,9 +1469,9 @@ dependencies = [ { 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/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } 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" }, + { 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]] @@ -1454,14 +1481,14 @@ 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" } +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" }, + { 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.8" +version = "1.81.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1477,9 +1504,9 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/1d/e8f95dd1fc0eed36f2698ca82d8a0693d5388c6f2f1718f3f5ed472daaf4/litellm-1.81.8.tar.gz", hash = "sha256:5cc6547697748b8ca38d17d755662871da125df6e378cc987eaf2208a15626fb", size = 14066801, upload_time = "2026-02-05T05:56:03.37Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/fc/78887158b4057835ba2c647a1bd4da650fd79142f8412c6d0bbe6d8c6081/litellm-1.81.10.tar.gz", hash = "sha256:8d769a7200888e1295592af5ce5cb0ff035832250bd0102a4ca50acf5820ca50", size = 16297572, upload-time = "2026-02-11T00:17:47.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/5a/6f391c2f251553dae98b6edca31c070d7e2291cef6153ae69e0688159093/litellm-1.81.8-py3-none-any.whl", hash = "sha256:78cca92f36bc6c267c191d1fe1e2630c812bff6daec32c58cade75748c2692f6", size = 12286316, upload_time = "2026-02-05T05:56:00.248Z" }, + { url = "https://files.pythonhosted.org/packages/b1/bb/3f3cc3d79657bc9daaa1319ec3a9d75e4889fc88d07e327f0ac02cd2ac7d/litellm-1.81.10-py3-none-any.whl", hash = "sha256:9efa1cbe61ac051f6500c267b173d988ff2d511c2eecf1c8f2ee546c0870747c", size = 14457931, upload-time = "2026-02-11T00:17:43.431Z" }, ] [[package]] @@ -1489,61 +1516,73 @@ 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" } +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/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/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" } +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" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -1566,159 +1605,177 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload_time = "2026-01-24T19:40:32.468Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" }, +] + +[[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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload_time = "2026-01-24T19:40:30.652Z" }, + { 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" }, ] [[package]] name = "mmh3" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/af/f28c2c2f51f31abb4725f9a64bc7863d5f491f6539bd26aee2a1d21a649e/mmh3-5.2.0.tar.gz", hash = "sha256:1efc8fec8478e9243a78bb993422cf79f8ff85cb4cf6b79647480a31e0d950a8", size = 33582, upload_time = "2025-07-29T07:43:48.49Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/fa/27f6ab93995ef6ad9f940e96593c5dd24744d61a7389532b0fec03745607/mmh3-5.2.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:e79c00eba78f7258e5b354eccd4d7907d60317ced924ea4a5f2e9d83f5453065", size = 40874, upload_time = "2025-07-29T07:42:30.662Z" }, - { url = "https://files.pythonhosted.org/packages/11/9c/03d13bcb6a03438bc8cac3d2e50f80908d159b31a4367c2e1a7a077ded32/mmh3-5.2.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:956127e663d05edbeec54df38885d943dfa27406594c411139690485128525de", size = 42012, upload_time = "2025-07-29T07:42:31.539Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/0865d9765408a7d504f1789944e678f74e0888b96a766d578cb80b040999/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:c3dca4cb5b946ee91b3d6bb700d137b1cd85c20827f89fdf9c16258253489044", size = 39197, upload_time = "2025-07-29T07:42:32.374Z" }, - { url = "https://files.pythonhosted.org/packages/3e/12/76c3207bd186f98b908b6706c2317abb73756d23a4e68ea2bc94825b9015/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e651e17bfde5840e9e4174b01e9e080ce49277b70d424308b36a7969d0d1af73", size = 39840, upload_time = "2025-07-29T07:42:33.227Z" }, - { url = "https://files.pythonhosted.org/packages/5d/0d/574b6cce5555c9f2b31ea189ad44986755eb14e8862db28c8b834b8b64dc/mmh3-5.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:9f64bf06f4bf623325fda3a6d02d36cd69199b9ace99b04bb2d7fd9f89688504", size = 40644, upload_time = "2025-07-29T07:42:34.099Z" }, - { url = "https://files.pythonhosted.org/packages/52/82/3731f8640b79c46707f53ed72034a58baad400be908c87b0088f1f89f986/mmh3-5.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ddc63328889bcaee77b743309e5c7d2d52cee0d7d577837c91b6e7cc9e755e0b", size = 56153, upload_time = "2025-07-29T07:42:35.031Z" }, - { url = "https://files.pythonhosted.org/packages/4f/34/e02dca1d4727fd9fdeaff9e2ad6983e1552804ce1d92cc796e5b052159bb/mmh3-5.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb0fdc451fb6d86d81ab8f23d881b8d6e37fc373a2deae1c02d27002d2ad7a05", size = 40684, upload_time = "2025-07-29T07:42:35.914Z" }, - { url = "https://files.pythonhosted.org/packages/8f/36/3dee40767356e104967e6ed6d102ba47b0b1ce2a89432239b95a94de1b89/mmh3-5.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b29044e1ffdb84fe164d0a7ea05c7316afea93c00f8ed9449cf357c36fc4f814", size = 40057, upload_time = "2025-07-29T07:42:36.755Z" }, - { url = "https://files.pythonhosted.org/packages/31/58/228c402fccf76eb39a0a01b8fc470fecf21965584e66453b477050ee0e99/mmh3-5.2.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:58981d6ea9646dbbf9e59a30890cbf9f610df0e4a57dbfe09215116fd90b0093", size = 97344, upload_time = "2025-07-29T07:42:37.675Z" }, - { url = "https://files.pythonhosted.org/packages/34/82/fc5ce89006389a6426ef28e326fc065b0fbaaed230373b62d14c889f47ea/mmh3-5.2.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e5634565367b6d98dc4aa2983703526ef556b3688ba3065edb4b9b90ede1c54", size = 103325, upload_time = "2025-07-29T07:42:38.591Z" }, - { url = "https://files.pythonhosted.org/packages/09/8c/261e85777c6aee1ebd53f2f17e210e7481d5b0846cd0b4a5c45f1e3761b8/mmh3-5.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0271ac12415afd3171ab9a3c7cbfc71dee2c68760a7dc9d05bf8ed6ddfa3a7a", size = 106240, upload_time = "2025-07-29T07:42:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/70/73/2f76b3ad8a3d431824e9934403df36c0ddacc7831acf82114bce3c4309c8/mmh3-5.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:45b590e31bc552c6f8e2150ff1ad0c28dd151e9f87589e7eaf508fbdd8e8e908", size = 113060, upload_time = "2025-07-29T07:42:40.585Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b9/7ea61a34e90e50a79a9d87aa1c0b8139a7eaf4125782b34b7d7383472633/mmh3-5.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bdde97310d59604f2a9119322f61b31546748499a21b44f6715e8ced9308a6c5", size = 120781, upload_time = "2025-07-29T07:42:41.618Z" }, - { url = "https://files.pythonhosted.org/packages/0f/5b/ae1a717db98c7894a37aeedbd94b3f99e6472a836488f36b6849d003485b/mmh3-5.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc9c5f280438cf1c1a8f9abb87dc8ce9630a964120cfb5dd50d1e7ce79690c7a", size = 99174, upload_time = "2025-07-29T07:42:42.587Z" }, - { url = "https://files.pythonhosted.org/packages/e3/de/000cce1d799fceebb6d4487ae29175dd8e81b48e314cba7b4da90bcf55d7/mmh3-5.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c903e71fd8debb35ad2a4184c1316b3cb22f64ce517b4e6747f25b0a34e41266", size = 98734, upload_time = "2025-07-29T07:42:43.996Z" }, - { url = "https://files.pythonhosted.org/packages/79/19/0dc364391a792b72fbb22becfdeacc5add85cc043cd16986e82152141883/mmh3-5.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:eed4bba7ff8a0d37106ba931ab03bdd3915fbb025bcf4e1f0aa02bc8114960c5", size = 106493, upload_time = "2025-07-29T07:42:45.07Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b1/bc8c28e4d6e807bbb051fefe78e1156d7f104b89948742ad310612ce240d/mmh3-5.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1fdb36b940e9261aff0b5177c5b74a36936b902f473180f6c15bde26143681a9", size = 110089, upload_time = "2025-07-29T07:42:46.122Z" }, - { url = "https://files.pythonhosted.org/packages/3b/a2/d20f3f5c95e9c511806686c70d0a15479cc3941c5f322061697af1c1ff70/mmh3-5.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7303aab41e97adcf010a09efd8f1403e719e59b7705d5e3cfed3dd7571589290", size = 97571, upload_time = "2025-07-29T07:42:47.18Z" }, - { url = "https://files.pythonhosted.org/packages/7b/23/665296fce4f33488deec39a750ffd245cfc07aafb0e3ef37835f91775d14/mmh3-5.2.0-cp313-cp313-win32.whl", hash = "sha256:03e08c6ebaf666ec1e3d6ea657a2d363bb01effd1a9acfe41f9197decaef0051", size = 40806, upload_time = "2025-07-29T07:42:48.166Z" }, - { url = "https://files.pythonhosted.org/packages/59/b0/92e7103f3b20646e255b699e2d0327ce53a3f250e44367a99dc8be0b7c7a/mmh3-5.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:7fddccd4113e7b736706e17a239a696332360cbaddf25ae75b57ba1acce65081", size = 41600, upload_time = "2025-07-29T07:42:49.371Z" }, - { url = "https://files.pythonhosted.org/packages/99/22/0b2bd679a84574647de538c5b07ccaa435dbccc37815067fe15b90fe8dad/mmh3-5.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa0c966ee727aad5406d516375593c5f058c766b21236ab8985693934bb5085b", size = 39349, upload_time = "2025-07-29T07:42:50.268Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ca/a20db059a8a47048aaf550da14a145b56e9c7386fb8280d3ce2962dcebf7/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e5015f0bb6eb50008bed2d4b1ce0f2a294698a926111e4bb202c0987b4f89078", size = 39209, upload_time = "2025-07-29T07:42:51.559Z" }, - { url = "https://files.pythonhosted.org/packages/98/dd/e5094799d55c7482d814b979a0fd608027d0af1b274bfb4c3ea3e950bfd5/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0f3ed828d709f5b82d8bfe14f8856120718ec4bd44a5b26102c3030a1e12501", size = 39843, upload_time = "2025-07-29T07:42:52.536Z" }, - { url = "https://files.pythonhosted.org/packages/f4/6b/7844d7f832c85400e7cc89a1348e4e1fdd38c5a38415bb5726bbb8fcdb6c/mmh3-5.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:f35727c5118aba95f0397e18a1a5b8405425581bfe53e821f0fb444cbdc2bc9b", size = 40648, upload_time = "2025-07-29T07:42:53.392Z" }, - { url = "https://files.pythonhosted.org/packages/1f/bf/71f791f48a21ff3190ba5225807cbe4f7223360e96862c376e6e3fb7efa7/mmh3-5.2.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bc244802ccab5220008cb712ca1508cb6a12f0eb64ad62997156410579a1770", size = 56164, upload_time = "2025-07-29T07:42:54.267Z" }, - { url = "https://files.pythonhosted.org/packages/70/1f/f87e3d34d83032b4f3f0f528c6d95a98290fcacf019da61343a49dccfd51/mmh3-5.2.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110", size = 40692, upload_time = "2025-07-29T07:42:55.234Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e2/db849eaed07117086f3452feca8c839d30d38b830ac59fe1ce65af8be5ad/mmh3-5.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:37a358cc881fe796e099c1db6ce07ff757f088827b4e8467ac52b7a7ffdca647", size = 40068, upload_time = "2025-07-29T07:42:56.158Z" }, - { url = "https://files.pythonhosted.org/packages/df/6b/209af927207af77425b044e32f77f49105a0b05d82ff88af6971d8da4e19/mmh3-5.2.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b9a87025121d1c448f24f27ff53a5fe7b6ef980574b4a4f11acaabe702420d63", size = 97367, upload_time = "2025-07-29T07:42:57.037Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e0/78adf4104c425606a9ce33fb351f790c76a6c2314969c4a517d1ffc92196/mmh3-5.2.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ba55d6ca32eeef8b2625e1e4bfc3b3db52bc63014bd7e5df8cc11bf2b036b12", size = 103306, upload_time = "2025-07-29T07:42:58.522Z" }, - { url = "https://files.pythonhosted.org/packages/a3/79/c2b89f91b962658b890104745b1b6c9ce38d50a889f000b469b91eeb1b9e/mmh3-5.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9ff37ba9f15637e424c2ab57a1a590c52897c845b768e4e0a4958084ec87f22", size = 106312, upload_time = "2025-07-29T07:42:59.552Z" }, - { url = "https://files.pythonhosted.org/packages/4b/14/659d4095528b1a209be90934778c5ffe312177d51e365ddcbca2cac2ec7c/mmh3-5.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a094319ec0db52a04af9fdc391b4d39a1bc72bc8424b47c4411afb05413a44b5", size = 113135, upload_time = "2025-07-29T07:43:00.745Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6f/cd7734a779389a8a467b5c89a48ff476d6f2576e78216a37551a97e9e42a/mmh3-5.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5584061fd3da584659b13587f26c6cad25a096246a481636d64375d0c1f6c07", size = 120775, upload_time = "2025-07-29T07:43:02.124Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ca/8256e3b96944408940de3f9291d7e38a283b5761fe9614d4808fcf27bd62/mmh3-5.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecbfc0437ddfdced5e7822d1ce4855c9c64f46819d0fdc4482c53f56c707b935", size = 99178, upload_time = "2025-07-29T07:43:03.182Z" }, - { url = "https://files.pythonhosted.org/packages/8a/32/39e2b3cf06b6e2eb042c984dab8680841ac2a0d3ca6e0bea30db1f27b565/mmh3-5.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7b986d506a8e8ea345791897ba5d8ba0d9d8820cd4fc3e52dbe6de19388de2e7", size = 98738, upload_time = "2025-07-29T07:43:04.207Z" }, - { url = "https://files.pythonhosted.org/packages/61/d3/7bbc8e0e8cf65ebbe1b893ffa0467b7ecd1bd07c3bbf6c9db4308ada22ec/mmh3-5.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:38d899a156549da8ef6a9f1d6f7ef231228d29f8f69bce2ee12f5fba6d6fd7c5", size = 106510, upload_time = "2025-07-29T07:43:05.656Z" }, - { url = "https://files.pythonhosted.org/packages/10/99/b97e53724b52374e2f3859046f0eb2425192da356cb19784d64bc17bb1cf/mmh3-5.2.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d86651fa45799530885ba4dab3d21144486ed15285e8784181a0ab37a4552384", size = 110053, upload_time = "2025-07-29T07:43:07.204Z" }, - { url = "https://files.pythonhosted.org/packages/ac/62/3688c7d975ed195155671df68788c83fed6f7909b6ec4951724c6860cb97/mmh3-5.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c463d7c1c4cfc9d751efeaadd936bbba07b5b0ed81a012b3a9f5a12f0872bd6e", size = 97546, upload_time = "2025-07-29T07:43:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/ca/3b/c6153250f03f71a8b7634cded82939546cdfba02e32f124ff51d52c6f991/mmh3-5.2.0-cp314-cp314-win32.whl", hash = "sha256:bb4fe46bdc6104fbc28db7a6bacb115ee6368ff993366bbd8a2a7f0076e6f0c0", size = 41422, upload_time = "2025-07-29T07:43:09.216Z" }, - { url = "https://files.pythonhosted.org/packages/74/01/a27d98bab083a435c4c07e9d1d720d4c8a578bf4c270bae373760b1022be/mmh3-5.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c7f0b342fd06044bedd0b6e72177ddc0076f54fd89ee239447f8b271d919d9b", size = 42135, upload_time = "2025-07-29T07:43:10.183Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c9/dbba5507e95429b8b380e2ba091eff5c20a70a59560934dff0ad8392b8c8/mmh3-5.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:3193752fc05ea72366c2b63ff24b9a190f422e32d75fdeae71087c08fff26115", size = 39879, upload_time = "2025-07-29T07:43:11.106Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d1/c8c0ef839c17258b9de41b84f663574fabcf8ac2007b7416575e0f65ff6e/mmh3-5.2.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:69fc339d7202bea69ef9bd7c39bfdf9fdabc8e6822a01eba62fb43233c1b3932", size = 57696, upload_time = "2025-07-29T07:43:11.989Z" }, - { url = "https://files.pythonhosted.org/packages/2f/55/95e2b9ff201e89f9fe37036037ab61a6c941942b25cdb7b6a9df9b931993/mmh3-5.2.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:12da42c0a55c9d86ab566395324213c319c73ecb0c239fad4726324212b9441c", size = 41421, upload_time = "2025-07-29T07:43:13.269Z" }, - { url = "https://files.pythonhosted.org/packages/77/79/9be23ad0b7001a4b22752e7693be232428ecc0a35068a4ff5c2f14ef8b20/mmh3-5.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f7f9034c7cf05ddfaac8d7a2e63a3c97a840d4615d0a0e65ba8bdf6f8576e3be", size = 40853, upload_time = "2025-07-29T07:43:14.888Z" }, - { url = "https://files.pythonhosted.org/packages/ac/1b/96b32058eda1c1dee8264900c37c359a7325c1f11f5ff14fd2be8e24eff9/mmh3-5.2.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11730eeb16dfcf9674fdea9bb6b8e6dd9b40813b7eb839bc35113649eef38aeb", size = 109694, upload_time = "2025-07-29T07:43:15.816Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6f/a2ae44cd7dad697b6dea48390cbc977b1e5ca58fda09628cbcb2275af064/mmh3-5.2.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:932a6eec1d2e2c3c9e630d10f7128d80e70e2d47fe6b8c7ea5e1afbd98733e65", size = 117438, upload_time = "2025-07-29T07:43:16.865Z" }, - { url = "https://files.pythonhosted.org/packages/a0/08/bfb75451c83f05224a28afeaf3950c7b793c0b71440d571f8e819cfb149a/mmh3-5.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca975c51c5028947bbcfc24966517aac06a01d6c921e30f7c5383c195f87991", size = 120409, upload_time = "2025-07-29T07:43:18.207Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ea/8b118b69b2ff8df568f742387d1a159bc654a0f78741b31437dd047ea28e/mmh3-5.2.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b0b58215befe0f0e120b828f7645e97719bbba9f23b69e268ed0ac7adde8645", size = 125909, upload_time = "2025-07-29T07:43:19.39Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/168cc0b6a30650032e351a3b89b8a47382da541993a03af91e1ba2501234/mmh3-5.2.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29c2b9ce61886809d0492a274a5a53047742dea0f703f9c4d5d223c3ea6377d3", size = 135331, upload_time = "2025-07-29T07:43:20.435Z" }, - { url = "https://files.pythonhosted.org/packages/31/05/e3a9849b1c18a7934c64e831492c99e67daebe84a8c2f2c39a7096a830e3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a367d4741ac0103f8198c82f429bccb9359f543ca542b06a51f4f0332e8de279", size = 110085, upload_time = "2025-07-29T07:43:21.92Z" }, - { url = "https://files.pythonhosted.org/packages/d9/d5/a96bcc306e3404601418b2a9a370baec92af84204528ba659fdfe34c242f/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5a5dba98e514fb26241868f6eb90a7f7ca0e039aed779342965ce24ea32ba513", size = 111195, upload_time = "2025-07-29T07:43:23.066Z" }, - { url = "https://files.pythonhosted.org/packages/af/29/0fd49801fec5bff37198684e0849b58e0dab3a2a68382a357cfffb0fafc3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:941603bfd75a46023807511c1ac2f1b0f39cccc393c15039969806063b27e6db", size = 116919, upload_time = "2025-07-29T07:43:24.178Z" }, - { url = "https://files.pythonhosted.org/packages/2d/04/4f3c32b0a2ed762edca45d8b46568fc3668e34f00fb1e0a3b5451ec1281c/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:132dd943451a7c7546978863d2f5a64977928410782e1a87d583cb60eb89e667", size = 123160, upload_time = "2025-07-29T07:43:25.26Z" }, - { url = "https://files.pythonhosted.org/packages/91/76/3d29eaa38821730633d6a240d36fa8ad2807e9dfd432c12e1a472ed211eb/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f698733a8a494466432d611a8f0d1e026f5286dee051beea4b3c3146817e35d5", size = 110206, upload_time = "2025-07-29T07:43:26.699Z" }, - { url = "https://files.pythonhosted.org/packages/44/1c/ccf35892684d3a408202e296e56843743e0b4fb1629e59432ea88cdb3909/mmh3-5.2.0-cp314-cp314t-win32.whl", hash = "sha256:6d541038b3fc360ec538fc116de87462627944765a6750308118f8b509a8eec7", size = 41970, upload_time = "2025-07-29T07:43:27.666Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/b9e4f1e5adb5e21eb104588fcee2cd1eaa8308255173481427d5ecc4284e/mmh3-5.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e912b19cf2378f2967d0c08e86ff4c6c360129887f678e27e4dde970d21b3f4d", size = 43063, upload_time = "2025-07-29T07:43:28.582Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fc/0e61d9a4e29c8679356795a40e48f647b4aad58d71bfc969f0f8f56fb912/mmh3-5.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:e7884931fe5e788163e7b3c511614130c2c59feffdc21112290a194487efb2e9", size = 40455, upload_time = "2025-07-29T07:43:29.563Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a7/af/f28c2c2f51f31abb4725f9a64bc7863d5f491f6539bd26aee2a1d21a649e/mmh3-5.2.0.tar.gz", hash = "sha256:1efc8fec8478e9243a78bb993422cf79f8ff85cb4cf6b79647480a31e0d950a8", size = 33582, upload-time = "2025-07-29T07:43:48.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/fa/27f6ab93995ef6ad9f940e96593c5dd24744d61a7389532b0fec03745607/mmh3-5.2.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:e79c00eba78f7258e5b354eccd4d7907d60317ced924ea4a5f2e9d83f5453065", size = 40874, upload-time = "2025-07-29T07:42:30.662Z" }, + { url = "https://files.pythonhosted.org/packages/11/9c/03d13bcb6a03438bc8cac3d2e50f80908d159b31a4367c2e1a7a077ded32/mmh3-5.2.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:956127e663d05edbeec54df38885d943dfa27406594c411139690485128525de", size = 42012, upload-time = "2025-07-29T07:42:31.539Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/0865d9765408a7d504f1789944e678f74e0888b96a766d578cb80b040999/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:c3dca4cb5b946ee91b3d6bb700d137b1cd85c20827f89fdf9c16258253489044", size = 39197, upload-time = "2025-07-29T07:42:32.374Z" }, + { url = "https://files.pythonhosted.org/packages/3e/12/76c3207bd186f98b908b6706c2317abb73756d23a4e68ea2bc94825b9015/mmh3-5.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e651e17bfde5840e9e4174b01e9e080ce49277b70d424308b36a7969d0d1af73", size = 39840, upload-time = "2025-07-29T07:42:33.227Z" }, + { url = "https://files.pythonhosted.org/packages/5d/0d/574b6cce5555c9f2b31ea189ad44986755eb14e8862db28c8b834b8b64dc/mmh3-5.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:9f64bf06f4bf623325fda3a6d02d36cd69199b9ace99b04bb2d7fd9f89688504", size = 40644, upload-time = "2025-07-29T07:42:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/52/82/3731f8640b79c46707f53ed72034a58baad400be908c87b0088f1f89f986/mmh3-5.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ddc63328889bcaee77b743309e5c7d2d52cee0d7d577837c91b6e7cc9e755e0b", size = 56153, upload-time = "2025-07-29T07:42:35.031Z" }, + { url = "https://files.pythonhosted.org/packages/4f/34/e02dca1d4727fd9fdeaff9e2ad6983e1552804ce1d92cc796e5b052159bb/mmh3-5.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bb0fdc451fb6d86d81ab8f23d881b8d6e37fc373a2deae1c02d27002d2ad7a05", size = 40684, upload-time = "2025-07-29T07:42:35.914Z" }, + { url = "https://files.pythonhosted.org/packages/8f/36/3dee40767356e104967e6ed6d102ba47b0b1ce2a89432239b95a94de1b89/mmh3-5.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b29044e1ffdb84fe164d0a7ea05c7316afea93c00f8ed9449cf357c36fc4f814", size = 40057, upload-time = "2025-07-29T07:42:36.755Z" }, + { url = "https://files.pythonhosted.org/packages/31/58/228c402fccf76eb39a0a01b8fc470fecf21965584e66453b477050ee0e99/mmh3-5.2.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:58981d6ea9646dbbf9e59a30890cbf9f610df0e4a57dbfe09215116fd90b0093", size = 97344, upload-time = "2025-07-29T07:42:37.675Z" }, + { url = "https://files.pythonhosted.org/packages/34/82/fc5ce89006389a6426ef28e326fc065b0fbaaed230373b62d14c889f47ea/mmh3-5.2.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e5634565367b6d98dc4aa2983703526ef556b3688ba3065edb4b9b90ede1c54", size = 103325, upload-time = "2025-07-29T07:42:38.591Z" }, + { url = "https://files.pythonhosted.org/packages/09/8c/261e85777c6aee1ebd53f2f17e210e7481d5b0846cd0b4a5c45f1e3761b8/mmh3-5.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0271ac12415afd3171ab9a3c7cbfc71dee2c68760a7dc9d05bf8ed6ddfa3a7a", size = 106240, upload-time = "2025-07-29T07:42:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/70/73/2f76b3ad8a3d431824e9934403df36c0ddacc7831acf82114bce3c4309c8/mmh3-5.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:45b590e31bc552c6f8e2150ff1ad0c28dd151e9f87589e7eaf508fbdd8e8e908", size = 113060, upload-time = "2025-07-29T07:42:40.585Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/7ea61a34e90e50a79a9d87aa1c0b8139a7eaf4125782b34b7d7383472633/mmh3-5.2.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bdde97310d59604f2a9119322f61b31546748499a21b44f6715e8ced9308a6c5", size = 120781, upload-time = "2025-07-29T07:42:41.618Z" }, + { url = "https://files.pythonhosted.org/packages/0f/5b/ae1a717db98c7894a37aeedbd94b3f99e6472a836488f36b6849d003485b/mmh3-5.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc9c5f280438cf1c1a8f9abb87dc8ce9630a964120cfb5dd50d1e7ce79690c7a", size = 99174, upload-time = "2025-07-29T07:42:42.587Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/000cce1d799fceebb6d4487ae29175dd8e81b48e314cba7b4da90bcf55d7/mmh3-5.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c903e71fd8debb35ad2a4184c1316b3cb22f64ce517b4e6747f25b0a34e41266", size = 98734, upload-time = "2025-07-29T07:42:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/79/19/0dc364391a792b72fbb22becfdeacc5add85cc043cd16986e82152141883/mmh3-5.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:eed4bba7ff8a0d37106ba931ab03bdd3915fbb025bcf4e1f0aa02bc8114960c5", size = 106493, upload-time = "2025-07-29T07:42:45.07Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b1/bc8c28e4d6e807bbb051fefe78e1156d7f104b89948742ad310612ce240d/mmh3-5.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:1fdb36b940e9261aff0b5177c5b74a36936b902f473180f6c15bde26143681a9", size = 110089, upload-time = "2025-07-29T07:42:46.122Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a2/d20f3f5c95e9c511806686c70d0a15479cc3941c5f322061697af1c1ff70/mmh3-5.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7303aab41e97adcf010a09efd8f1403e719e59b7705d5e3cfed3dd7571589290", size = 97571, upload-time = "2025-07-29T07:42:47.18Z" }, + { url = "https://files.pythonhosted.org/packages/7b/23/665296fce4f33488deec39a750ffd245cfc07aafb0e3ef37835f91775d14/mmh3-5.2.0-cp313-cp313-win32.whl", hash = "sha256:03e08c6ebaf666ec1e3d6ea657a2d363bb01effd1a9acfe41f9197decaef0051", size = 40806, upload-time = "2025-07-29T07:42:48.166Z" }, + { url = "https://files.pythonhosted.org/packages/59/b0/92e7103f3b20646e255b699e2d0327ce53a3f250e44367a99dc8be0b7c7a/mmh3-5.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:7fddccd4113e7b736706e17a239a696332360cbaddf25ae75b57ba1acce65081", size = 41600, upload-time = "2025-07-29T07:42:49.371Z" }, + { url = "https://files.pythonhosted.org/packages/99/22/0b2bd679a84574647de538c5b07ccaa435dbccc37815067fe15b90fe8dad/mmh3-5.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa0c966ee727aad5406d516375593c5f058c766b21236ab8985693934bb5085b", size = 39349, upload-time = "2025-07-29T07:42:50.268Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ca/a20db059a8a47048aaf550da14a145b56e9c7386fb8280d3ce2962dcebf7/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e5015f0bb6eb50008bed2d4b1ce0f2a294698a926111e4bb202c0987b4f89078", size = 39209, upload-time = "2025-07-29T07:42:51.559Z" }, + { url = "https://files.pythonhosted.org/packages/98/dd/e5094799d55c7482d814b979a0fd608027d0af1b274bfb4c3ea3e950bfd5/mmh3-5.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:e0f3ed828d709f5b82d8bfe14f8856120718ec4bd44a5b26102c3030a1e12501", size = 39843, upload-time = "2025-07-29T07:42:52.536Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/7844d7f832c85400e7cc89a1348e4e1fdd38c5a38415bb5726bbb8fcdb6c/mmh3-5.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:f35727c5118aba95f0397e18a1a5b8405425581bfe53e821f0fb444cbdc2bc9b", size = 40648, upload-time = "2025-07-29T07:42:53.392Z" }, + { url = "https://files.pythonhosted.org/packages/1f/bf/71f791f48a21ff3190ba5225807cbe4f7223360e96862c376e6e3fb7efa7/mmh3-5.2.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bc244802ccab5220008cb712ca1508cb6a12f0eb64ad62997156410579a1770", size = 56164, upload-time = "2025-07-29T07:42:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/70/1f/f87e3d34d83032b4f3f0f528c6d95a98290fcacf019da61343a49dccfd51/mmh3-5.2.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110", size = 40692, upload-time = "2025-07-29T07:42:55.234Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e2/db849eaed07117086f3452feca8c839d30d38b830ac59fe1ce65af8be5ad/mmh3-5.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:37a358cc881fe796e099c1db6ce07ff757f088827b4e8467ac52b7a7ffdca647", size = 40068, upload-time = "2025-07-29T07:42:56.158Z" }, + { url = "https://files.pythonhosted.org/packages/df/6b/209af927207af77425b044e32f77f49105a0b05d82ff88af6971d8da4e19/mmh3-5.2.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b9a87025121d1c448f24f27ff53a5fe7b6ef980574b4a4f11acaabe702420d63", size = 97367, upload-time = "2025-07-29T07:42:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e0/78adf4104c425606a9ce33fb351f790c76a6c2314969c4a517d1ffc92196/mmh3-5.2.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ba55d6ca32eeef8b2625e1e4bfc3b3db52bc63014bd7e5df8cc11bf2b036b12", size = 103306, upload-time = "2025-07-29T07:42:58.522Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/c2b89f91b962658b890104745b1b6c9ce38d50a889f000b469b91eeb1b9e/mmh3-5.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9ff37ba9f15637e424c2ab57a1a590c52897c845b768e4e0a4958084ec87f22", size = 106312, upload-time = "2025-07-29T07:42:59.552Z" }, + { url = "https://files.pythonhosted.org/packages/4b/14/659d4095528b1a209be90934778c5ffe312177d51e365ddcbca2cac2ec7c/mmh3-5.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a094319ec0db52a04af9fdc391b4d39a1bc72bc8424b47c4411afb05413a44b5", size = 113135, upload-time = "2025-07-29T07:43:00.745Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6f/cd7734a779389a8a467b5c89a48ff476d6f2576e78216a37551a97e9e42a/mmh3-5.2.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c5584061fd3da584659b13587f26c6cad25a096246a481636d64375d0c1f6c07", size = 120775, upload-time = "2025-07-29T07:43:02.124Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ca/8256e3b96944408940de3f9291d7e38a283b5761fe9614d4808fcf27bd62/mmh3-5.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecbfc0437ddfdced5e7822d1ce4855c9c64f46819d0fdc4482c53f56c707b935", size = 99178, upload-time = "2025-07-29T07:43:03.182Z" }, + { url = "https://files.pythonhosted.org/packages/8a/32/39e2b3cf06b6e2eb042c984dab8680841ac2a0d3ca6e0bea30db1f27b565/mmh3-5.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7b986d506a8e8ea345791897ba5d8ba0d9d8820cd4fc3e52dbe6de19388de2e7", size = 98738, upload-time = "2025-07-29T07:43:04.207Z" }, + { url = "https://files.pythonhosted.org/packages/61/d3/7bbc8e0e8cf65ebbe1b893ffa0467b7ecd1bd07c3bbf6c9db4308ada22ec/mmh3-5.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:38d899a156549da8ef6a9f1d6f7ef231228d29f8f69bce2ee12f5fba6d6fd7c5", size = 106510, upload-time = "2025-07-29T07:43:05.656Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/b97e53724b52374e2f3859046f0eb2425192da356cb19784d64bc17bb1cf/mmh3-5.2.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d86651fa45799530885ba4dab3d21144486ed15285e8784181a0ab37a4552384", size = 110053, upload-time = "2025-07-29T07:43:07.204Z" }, + { url = "https://files.pythonhosted.org/packages/ac/62/3688c7d975ed195155671df68788c83fed6f7909b6ec4951724c6860cb97/mmh3-5.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c463d7c1c4cfc9d751efeaadd936bbba07b5b0ed81a012b3a9f5a12f0872bd6e", size = 97546, upload-time = "2025-07-29T07:43:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ca/3b/c6153250f03f71a8b7634cded82939546cdfba02e32f124ff51d52c6f991/mmh3-5.2.0-cp314-cp314-win32.whl", hash = "sha256:bb4fe46bdc6104fbc28db7a6bacb115ee6368ff993366bbd8a2a7f0076e6f0c0", size = 41422, upload-time = "2025-07-29T07:43:09.216Z" }, + { url = "https://files.pythonhosted.org/packages/74/01/a27d98bab083a435c4c07e9d1d720d4c8a578bf4c270bae373760b1022be/mmh3-5.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c7f0b342fd06044bedd0b6e72177ddc0076f54fd89ee239447f8b271d919d9b", size = 42135, upload-time = "2025-07-29T07:43:10.183Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c9/dbba5507e95429b8b380e2ba091eff5c20a70a59560934dff0ad8392b8c8/mmh3-5.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:3193752fc05ea72366c2b63ff24b9a190f422e32d75fdeae71087c08fff26115", size = 39879, upload-time = "2025-07-29T07:43:11.106Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d1/c8c0ef839c17258b9de41b84f663574fabcf8ac2007b7416575e0f65ff6e/mmh3-5.2.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:69fc339d7202bea69ef9bd7c39bfdf9fdabc8e6822a01eba62fb43233c1b3932", size = 57696, upload-time = "2025-07-29T07:43:11.989Z" }, + { url = "https://files.pythonhosted.org/packages/2f/55/95e2b9ff201e89f9fe37036037ab61a6c941942b25cdb7b6a9df9b931993/mmh3-5.2.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:12da42c0a55c9d86ab566395324213c319c73ecb0c239fad4726324212b9441c", size = 41421, upload-time = "2025-07-29T07:43:13.269Z" }, + { url = "https://files.pythonhosted.org/packages/77/79/9be23ad0b7001a4b22752e7693be232428ecc0a35068a4ff5c2f14ef8b20/mmh3-5.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f7f9034c7cf05ddfaac8d7a2e63a3c97a840d4615d0a0e65ba8bdf6f8576e3be", size = 40853, upload-time = "2025-07-29T07:43:14.888Z" }, + { url = "https://files.pythonhosted.org/packages/ac/1b/96b32058eda1c1dee8264900c37c359a7325c1f11f5ff14fd2be8e24eff9/mmh3-5.2.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11730eeb16dfcf9674fdea9bb6b8e6dd9b40813b7eb839bc35113649eef38aeb", size = 109694, upload-time = "2025-07-29T07:43:15.816Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6f/a2ae44cd7dad697b6dea48390cbc977b1e5ca58fda09628cbcb2275af064/mmh3-5.2.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:932a6eec1d2e2c3c9e630d10f7128d80e70e2d47fe6b8c7ea5e1afbd98733e65", size = 117438, upload-time = "2025-07-29T07:43:16.865Z" }, + { url = "https://files.pythonhosted.org/packages/a0/08/bfb75451c83f05224a28afeaf3950c7b793c0b71440d571f8e819cfb149a/mmh3-5.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca975c51c5028947bbcfc24966517aac06a01d6c921e30f7c5383c195f87991", size = 120409, upload-time = "2025-07-29T07:43:18.207Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ea/8b118b69b2ff8df568f742387d1a159bc654a0f78741b31437dd047ea28e/mmh3-5.2.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5b0b58215befe0f0e120b828f7645e97719bbba9f23b69e268ed0ac7adde8645", size = 125909, upload-time = "2025-07-29T07:43:19.39Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/168cc0b6a30650032e351a3b89b8a47382da541993a03af91e1ba2501234/mmh3-5.2.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29c2b9ce61886809d0492a274a5a53047742dea0f703f9c4d5d223c3ea6377d3", size = 135331, upload-time = "2025-07-29T07:43:20.435Z" }, + { url = "https://files.pythonhosted.org/packages/31/05/e3a9849b1c18a7934c64e831492c99e67daebe84a8c2f2c39a7096a830e3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a367d4741ac0103f8198c82f429bccb9359f543ca542b06a51f4f0332e8de279", size = 110085, upload-time = "2025-07-29T07:43:21.92Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d5/a96bcc306e3404601418b2a9a370baec92af84204528ba659fdfe34c242f/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5a5dba98e514fb26241868f6eb90a7f7ca0e039aed779342965ce24ea32ba513", size = 111195, upload-time = "2025-07-29T07:43:23.066Z" }, + { url = "https://files.pythonhosted.org/packages/af/29/0fd49801fec5bff37198684e0849b58e0dab3a2a68382a357cfffb0fafc3/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:941603bfd75a46023807511c1ac2f1b0f39cccc393c15039969806063b27e6db", size = 116919, upload-time = "2025-07-29T07:43:24.178Z" }, + { url = "https://files.pythonhosted.org/packages/2d/04/4f3c32b0a2ed762edca45d8b46568fc3668e34f00fb1e0a3b5451ec1281c/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:132dd943451a7c7546978863d2f5a64977928410782e1a87d583cb60eb89e667", size = 123160, upload-time = "2025-07-29T07:43:25.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/76/3d29eaa38821730633d6a240d36fa8ad2807e9dfd432c12e1a472ed211eb/mmh3-5.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f698733a8a494466432d611a8f0d1e026f5286dee051beea4b3c3146817e35d5", size = 110206, upload-time = "2025-07-29T07:43:26.699Z" }, + { url = "https://files.pythonhosted.org/packages/44/1c/ccf35892684d3a408202e296e56843743e0b4fb1629e59432ea88cdb3909/mmh3-5.2.0-cp314-cp314t-win32.whl", hash = "sha256:6d541038b3fc360ec538fc116de87462627944765a6750308118f8b509a8eec7", size = 41970, upload-time = "2025-07-29T07:43:27.666Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/b9e4f1e5adb5e21eb104588fcee2cd1eaa8308255173481427d5ecc4284e/mmh3-5.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e912b19cf2378f2967d0c08e86ff4c6c360129887f678e27e4dde970d21b3f4d", size = 43063, upload-time = "2025-07-29T07:43:28.582Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fc/0e61d9a4e29c8679356795a40e48f647b4aad58d71bfc969f0f8f56fb912/mmh3-5.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:e7884931fe5e788163e7b3c511614130c2c59feffdc21112290a194487efb2e9", size = 40455, upload-time = "2025-07-29T07:43:29.563Z" }, ] [[package]] name = "multidict" version = "6.7.1" source = { registry = "https://pypi.org/simple" } -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/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, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { 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" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "openai" -version = "2.17.0" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1730,9 +1787,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/a2/677f22c4b487effb8a09439fb6134034b5f0a39ca27df8b95fac23a93720/openai-2.17.0.tar.gz", hash = "sha256:47224b74bd20f30c6b0a6a329505243cb2f26d5cf84d9f8d0825ff8b35e9c999", size = 631445, upload_time = "2026-02-05T16:27:40.953Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/5a/f495777c02625bfa18212b6e3b73f1893094f2bf660976eb4bc6f43a1ca2/openai-2.20.0.tar.gz", hash = "sha256:2654a689208cd0bf1098bb9462e8d722af5cbe961e6bba54e6f19fb843d88db1", size = 642355, upload-time = "2026-02-10T19:02:54.145Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/97/284535aa75e6e84ab388248b5a323fc296b1f70530130dee37f7f4fbe856/openai-2.17.0-py3-none-any.whl", hash = "sha256:4f393fd886ca35e113aac7ff239bcd578b81d8f104f5aedc7d3693eb2af1d338", size = 1069524, upload_time = "2026-02-05T16:27:38.941Z" }, + { url = "https://files.pythonhosted.org/packages/b5/a0/cf4297aa51bbc21e83ef0ac018947fa06aea8f2364aad7c96cbf148590e6/openai-2.20.0-py3-none-any.whl", hash = "sha256:38d989c4b1075cd1f76abc68364059d822327cf1a932531d429795f4fc18be99", size = 1098479, upload-time = "2026-02-10T19:02:52.157Z" }, ] [[package]] @@ -1743,9 +1800,9 @@ dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/04/05040d7ce33a907a2a02257e601992f0cdf11c73b33f13c4492bf6c3d6d5/opentelemetry_api-1.37.0.tar.gz", hash = "sha256:540735b120355bd5112738ea53621f8d5edb35ebcd6fe21ada3ab1c61d1cd9a7", size = 64923, upload_time = "2025-09-11T10:29:01.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/63/04/05040d7ce33a907a2a02257e601992f0cdf11c73b33f13c4492bf6c3d6d5/opentelemetry_api-1.37.0.tar.gz", hash = "sha256:540735b120355bd5112738ea53621f8d5edb35ebcd6fe21ada3ab1c61d1cd9a7", size = 64923, upload-time = "2025-09-11T10:29:01.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/48/28ed9e55dcf2f453128df738210a980e09f4e468a456fa3c763dbc8be70a/opentelemetry_api-1.37.0-py3-none-any.whl", hash = "sha256:accf2024d3e89faec14302213bc39550ec0f4095d1cf5ca688e1bfb1c8612f47", size = 65732, upload_time = "2025-09-11T10:28:41.826Z" }, + { url = "https://files.pythonhosted.org/packages/91/48/28ed9e55dcf2f453128df738210a980e09f4e468a456fa3c763dbc8be70a/opentelemetry_api-1.37.0-py3-none-any.whl", hash = "sha256:accf2024d3e89faec14302213bc39550ec0f4095d1cf5ca688e1bfb1c8612f47", size = 65732, upload-time = "2025-09-11T10:28:41.826Z" }, ] [[package]] @@ -1758,9 +1815,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/2d/6aa7063b009768d8f9415b36a29ae9b3eb1e2c5eff70f58ca15e104c245f/opentelemetry_exporter_gcp_logging-1.11.0a0.tar.gz", hash = "sha256:58496f11b930c84570060ffbd4343cd0b597ea13c7bc5c879df01163dd552f14", size = 22400, upload_time = "2025-11-04T19:32:13.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/2d/6aa7063b009768d8f9415b36a29ae9b3eb1e2c5eff70f58ca15e104c245f/opentelemetry_exporter_gcp_logging-1.11.0a0.tar.gz", hash = "sha256:58496f11b930c84570060ffbd4343cd0b597ea13c7bc5c879df01163dd552f14", size = 22400, upload-time = "2025-11-04T19:32:13.812Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/b7/2d3df53fa39bfd52f88c78a60367d45a7b1adbf8a756cce62d6ac149d49a/opentelemetry_exporter_gcp_logging-1.11.0a0-py3-none-any.whl", hash = "sha256:f8357c552947cb9c0101c4575a7702b8d3268e28bdeefdd1405cf838e128c6ef", size = 14168, upload_time = "2025-11-04T19:32:07.073Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b7/2d3df53fa39bfd52f88c78a60367d45a7b1adbf8a756cce62d6ac149d49a/opentelemetry_exporter_gcp_logging-1.11.0a0-py3-none-any.whl", hash = "sha256:f8357c552947cb9c0101c4575a7702b8d3268e28bdeefdd1405cf838e128c6ef", size = 14168, upload-time = "2025-11-04T19:32:07.073Z" }, ] [[package]] @@ -1773,9 +1830,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/48/d1c7d2380bb1754d1eb6a011a2e0de08c6868cb6c0f34bcda0444fa0d614/opentelemetry_exporter_gcp_monitoring-1.11.0a0.tar.gz", hash = "sha256:386276eddbbd978a6f30fafd3397975beeb02a1302bdad554185242a8e2c343c", size = 20828, upload_time = "2025-11-04T19:32:14.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/48/d1c7d2380bb1754d1eb6a011a2e0de08c6868cb6c0f34bcda0444fa0d614/opentelemetry_exporter_gcp_monitoring-1.11.0a0.tar.gz", hash = "sha256:386276eddbbd978a6f30fafd3397975beeb02a1302bdad554185242a8e2c343c", size = 20828, upload-time = "2025-11-04T19:32:14.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/8c/03a6e73e270a9c890dbd6cc1c47c83d86b8a8a974a9168d92e043c6277cc/opentelemetry_exporter_gcp_monitoring-1.11.0a0-py3-none-any.whl", hash = "sha256:b6740cba61b2f9555274829fe87a58447b64d0378f1067a4faebb4f5b364ca22", size = 13611, upload_time = "2025-11-04T19:32:08.212Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8c/03a6e73e270a9c890dbd6cc1c47c83d86b8a8a974a9168d92e043c6277cc/opentelemetry_exporter_gcp_monitoring-1.11.0a0-py3-none-any.whl", hash = "sha256:b6740cba61b2f9555274829fe87a58447b64d0378f1067a4faebb4f5b364ca22", size = 13611, upload-time = "2025-11-04T19:32:08.212Z" }, ] [[package]] @@ -1788,9 +1845,9 @@ dependencies = [ { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/9c/4c3b26e5494f8b53c7873732a2317df905abe2b8ab33e9edfcbd5a8ff79b/opentelemetry_exporter_gcp_trace-1.11.0.tar.gz", hash = "sha256:c947ab4ab53e16517ade23d6fe71fe88cf7ca3f57a42c9f0e4162d2b929fecb6", size = 18770, upload_time = "2025-11-04T19:32:15.109Z" } +sdist = { url = "https://files.pythonhosted.org/packages/10/9c/4c3b26e5494f8b53c7873732a2317df905abe2b8ab33e9edfcbd5a8ff79b/opentelemetry_exporter_gcp_trace-1.11.0.tar.gz", hash = "sha256:c947ab4ab53e16517ade23d6fe71fe88cf7ca3f57a42c9f0e4162d2b929fecb6", size = 18770, upload-time = "2025-11-04T19:32:15.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/4a/876703e8c5845198d95cd4006c8d1b2e3b129a9e288558e33133360f8d5d/opentelemetry_exporter_gcp_trace-1.11.0-py3-none-any.whl", hash = "sha256:b3dcb314e1a9985e9185cb7720b693eb393886fde98ae4c095ffc0893de6cefa", size = 14016, upload_time = "2025-11-04T19:32:09.009Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/876703e8c5845198d95cd4006c8d1b2e3b129a9e288558e33133360f8d5d/opentelemetry_exporter_gcp_trace-1.11.0-py3-none-any.whl", hash = "sha256:b3dcb314e1a9985e9185cb7720b693eb393886fde98ae4c095ffc0893de6cefa", size = 14016, upload-time = "2025-11-04T19:32:09.009Z" }, ] [[package]] @@ -1800,9 +1857,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/6c/10018cbcc1e6fff23aac67d7fd977c3d692dbe5f9ef9bb4db5c1268726cc/opentelemetry_exporter_otlp_proto_common-1.37.0.tar.gz", hash = "sha256:c87a1bdd9f41fdc408d9cc9367bb53f8d2602829659f2b90be9f9d79d0bfe62c", size = 20430, upload_time = "2025-09-11T10:29:03.605Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/6c/10018cbcc1e6fff23aac67d7fd977c3d692dbe5f9ef9bb4db5c1268726cc/opentelemetry_exporter_otlp_proto_common-1.37.0.tar.gz", hash = "sha256:c87a1bdd9f41fdc408d9cc9367bb53f8d2602829659f2b90be9f9d79d0bfe62c", size = 20430, upload-time = "2025-09-11T10:29:03.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/13/b4ef09837409a777f3c0af2a5b4ba9b7af34872bc43609dda0c209e4060d/opentelemetry_exporter_otlp_proto_common-1.37.0-py3-none-any.whl", hash = "sha256:53038428449c559b0c564b8d718df3314da387109c4d36bd1b94c9a641b0292e", size = 18359, upload_time = "2025-09-11T10:28:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/08/13/b4ef09837409a777f3c0af2a5b4ba9b7af34872bc43609dda0c209e4060d/opentelemetry_exporter_otlp_proto_common-1.37.0-py3-none-any.whl", hash = "sha256:53038428449c559b0c564b8d718df3314da387109c4d36bd1b94c9a641b0292e", size = 18359, upload-time = "2025-09-11T10:28:44.939Z" }, ] [[package]] @@ -1818,9 +1875,9 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/e3/6e320aeb24f951449e73867e53c55542bebbaf24faeee7623ef677d66736/opentelemetry_exporter_otlp_proto_http-1.37.0.tar.gz", hash = "sha256:e52e8600f1720d6de298419a802108a8f5afa63c96809ff83becb03f874e44ac", size = 17281, upload_time = "2025-09-11T10:29:04.844Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/e3/6e320aeb24f951449e73867e53c55542bebbaf24faeee7623ef677d66736/opentelemetry_exporter_otlp_proto_http-1.37.0.tar.gz", hash = "sha256:e52e8600f1720d6de298419a802108a8f5afa63c96809ff83becb03f874e44ac", size = 17281, upload-time = "2025-09-11T10:29:04.844Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload_time = "2025-09-11T10:28:46.726Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/70d74a664d83976556cec395d6bfedd9b85ec1498b778367d5f93e373397/opentelemetry_exporter_otlp_proto_http-1.37.0-py3-none-any.whl", hash = "sha256:54c42b39945a6cc9d9a2a33decb876eabb9547e0dcb49df090122773447f1aef", size = 19576, upload-time = "2025-09-11T10:28:46.726Z" }, ] [[package]] @@ -1830,9 +1887,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/ea/a75f36b463a36f3c5a10c0b5292c58b31dbdde74f6f905d3d0ab2313987b/opentelemetry_proto-1.37.0.tar.gz", hash = "sha256:30f5c494faf66f77faeaefa35ed4443c5edb3b0aa46dad073ed7210e1a789538", size = 46151, upload_time = "2025-09-11T10:29:11.04Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/ea/a75f36b463a36f3c5a10c0b5292c58b31dbdde74f6f905d3d0ab2313987b/opentelemetry_proto-1.37.0.tar.gz", hash = "sha256:30f5c494faf66f77faeaefa35ed4443c5edb3b0aa46dad073ed7210e1a789538", size = 46151, upload-time = "2025-09-11T10:29:11.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/25/f89ea66c59bd7687e218361826c969443c4fa15dfe89733f3bf1e2a9e971/opentelemetry_proto-1.37.0-py3-none-any.whl", hash = "sha256:8ed8c066ae8828bbf0c39229979bdf583a126981142378a9cbe9d6fd5701c6e2", size = 72534, upload_time = "2025-09-11T10:28:56.831Z" }, + { url = "https://files.pythonhosted.org/packages/c4/25/f89ea66c59bd7687e218361826c969443c4fa15dfe89733f3bf1e2a9e971/opentelemetry_proto-1.37.0-py3-none-any.whl", hash = "sha256:8ed8c066ae8828bbf0c39229979bdf583a126981142378a9cbe9d6fd5701c6e2", size = 72534, upload-time = "2025-09-11T10:28:56.831Z" }, ] [[package]] @@ -1845,9 +1902,9 @@ dependencies = [ { name = "requests" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/5d/2b3240d914b87b6dd9cd5ca2ef1ccaf1d0626b897d4c06877e22c8c10fcf/opentelemetry_resourcedetector_gcp-1.11.0a0.tar.gz", hash = "sha256:915a1d6fd15daca9eedd3fc52b0f705375054f2ef140e2e7a6b4cca95a47cdb1", size = 18796, upload_time = "2025-11-04T19:32:16.59Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/5d/2b3240d914b87b6dd9cd5ca2ef1ccaf1d0626b897d4c06877e22c8c10fcf/opentelemetry_resourcedetector_gcp-1.11.0a0.tar.gz", hash = "sha256:915a1d6fd15daca9eedd3fc52b0f705375054f2ef140e2e7a6b4cca95a47cdb1", size = 18796, upload-time = "2025-11-04T19:32:16.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6c/1e13fe142a7ca3dc6489167203a1209d32430cca12775e1df9c9a41c54b2/opentelemetry_resourcedetector_gcp-1.11.0a0-py3-none-any.whl", hash = "sha256:5d65a2a039b1d40c6f41421dbb08d5f441368275ac6de6e76a8fccd1f6acb67e", size = 18798, upload_time = "2025-11-04T19:32:10.915Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/1e13fe142a7ca3dc6489167203a1209d32430cca12775e1df9c9a41c54b2/opentelemetry_resourcedetector_gcp-1.11.0a0-py3-none-any.whl", hash = "sha256:5d65a2a039b1d40c6f41421dbb08d5f441368275ac6de6e76a8fccd1f6acb67e", size = 18798, upload-time = "2025-11-04T19:32:10.915Z" }, ] [[package]] @@ -1859,9 +1916,9 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/62/2e0ca80d7fe94f0b193135375da92c640d15fe81f636658d2acf373086bc/opentelemetry_sdk-1.37.0.tar.gz", hash = "sha256:cc8e089c10953ded765b5ab5669b198bbe0af1b3f89f1007d19acd32dc46dda5", size = 170404, upload_time = "2025-09-11T10:29:11.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/62/2e0ca80d7fe94f0b193135375da92c640d15fe81f636658d2acf373086bc/opentelemetry_sdk-1.37.0.tar.gz", hash = "sha256:cc8e089c10953ded765b5ab5669b198bbe0af1b3f89f1007d19acd32dc46dda5", size = 170404, upload-time = "2025-09-11T10:29:11.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/62/9f4ad6a54126fb00f7ed4bb5034964c6e4f00fcd5a905e115bd22707e20d/opentelemetry_sdk-1.37.0-py3-none-any.whl", hash = "sha256:8f3c3c22063e52475c5dbced7209495c2c16723d016d39287dfc215d1771257c", size = 131941, upload_time = "2025-09-11T10:28:57.83Z" }, + { url = "https://files.pythonhosted.org/packages/9f/62/9f4ad6a54126fb00f7ed4bb5034964c6e4f00fcd5a905e115bd22707e20d/opentelemetry_sdk-1.37.0-py3-none-any.whl", hash = "sha256:8f3c3c22063e52475c5dbced7209495c2c16723d016d39287dfc215d1771257c", size = 131941, upload-time = "2025-09-11T10:28:57.83Z" }, ] [[package]] @@ -1872,9 +1929,9 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/1b/90701d91e6300d9f2fb352153fb1721ed99ed1f6ea14fa992c756016e63a/opentelemetry_semantic_conventions-0.58b0.tar.gz", hash = "sha256:6bd46f51264279c433755767bb44ad00f1c9e2367e1b42af563372c5a6fa0c25", size = 129867, upload_time = "2025-09-11T10:29:12.597Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/1b/90701d91e6300d9f2fb352153fb1721ed99ed1f6ea14fa992c756016e63a/opentelemetry_semantic_conventions-0.58b0.tar.gz", hash = "sha256:6bd46f51264279c433755767bb44ad00f1c9e2367e1b42af563372c5a6fa0c25", size = 129867, upload-time = "2025-09-11T10:29:12.597Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload_time = "2025-09-11T10:28:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/07/90/68152b7465f50285d3ce2481b3aec2f82822e3f52e5152eeeaf516bab841/opentelemetry_semantic_conventions-0.58b0-py3-none-any.whl", hash = "sha256:5564905ab1458b96684db1340232729fce3b5375a06e140e8904c78e4f815b28", size = 207954, upload-time = "2025-09-11T10:28:59.218Z" }, ] [[package]] @@ -1908,78 +1965,96 @@ requires-dist = [ 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" } +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" } +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" }, +] + +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } 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/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -1989,69 +2064,69 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/02/8832cde80e7380c600fbf55090b6ab7b62bd6825dbedde6d6657c15a1f8e/proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147", size = 56929, upload_time = "2026-02-02T17:34:49.035Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/02/8832cde80e7380c600fbf55090b6ab7b62bd6825dbedde6d6657c15a1f8e/proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147", size = 56929, upload-time = "2026-02-02T17:34:49.035Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/79/ac273cbbf744691821a9cca88957257f41afe271637794975ca090b9588b/proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc", size = 50480, upload_time = "2026-02-02T17:34:47.339Z" }, + { url = "https://files.pythonhosted.org/packages/5d/79/ac273cbbf744691821a9cca88957257f41afe271637794975ca090b9588b/proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc", size = 50480, upload-time = "2026-02-02T17:34:47.339Z" }, ] [[package]] name = "protobuf" version = "6.33.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload_time = "2026-01-29T21:51:33.494Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload_time = "2026-01-29T21:51:21.751Z" }, - { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload_time = "2026-01-29T21:51:24.022Z" }, - { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload_time = "2026-01-29T21:51:25.413Z" }, - { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload_time = "2026-01-29T21:51:26.423Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload_time = "2026-01-29T21:51:27.446Z" }, - { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload_time = "2026-01-29T21:51:28.925Z" }, - { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload_time = "2026-01-29T21:51:32.557Z" }, + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, ] [[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/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" }, +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/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" }, ] [[package]] name = "pyasn1" version = "0.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload_time = "2026-01-16T18:04:18.534Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload_time = "2026-01-16T18:04:17.174Z" }, + { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" }, ] [[package]] @@ -2061,18 +2136,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, ] [[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" } +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" } 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, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] @@ -2085,9 +2160,9 @@ dependencies = [ { 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, upload-time = "2025-11-26T15:11:46.471Z" } 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, upload-time = "2025-11-26T15:11:44.605Z" }, ] [[package]] @@ -2097,50 +2172,50 @@ source = { registry = "https://pypi.org/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/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" }, +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/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" }, ] [[package]] @@ -2152,18 +2227,45 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload_time = "2025-11-10T14:25:47.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload_time = "2025-11-10T14:25:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, +] + +[[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" } +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" }, +] + +[[package]] +name = "pyink" +version = "25.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "black" }, + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, + { name = "pytokens" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/45/5940abea3a364768b267ff4c73d898f7d692f649540e613a8fe67089abcc/pyink-25.12.0.tar.gz", hash = "sha256:930a913fed2824ffbbd3c10847fad1171c2b075dd709a13dc435caea851de7b8", size = 279674, upload-time = "2026-01-02T15:02:22.259Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/0b/209f6cde8f7c2ad8a47a2b5e41da101e6af782f8896d99f6cf2620c87ba7/pyink-25.12.0-py3-none-any.whl", hash = "sha256:3c9ed8c6f1f6f4a7f3a6a3a31bff5a7ab6b3c88954dc456273c8e71ce6ff0508", size = 143528, upload-time = "2026-01-02T15:02:20.385Z" }, ] [[package]] name = "pyjwt" version = "2.11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload_time = "2026-01-30T19:59:55.694Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019, upload-time = "2026-01-30T19:59:55.694Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload_time = "2026-01-30T19:59:54.539Z" }, + { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224, upload-time = "2026-01-30T19:59:54.539Z" }, ] [package.optional-dependencies] @@ -2175,9 +2277,9 @@ crypto = [ name = "pyparsing" version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload_time = "2026-01-21T03:57:59.36Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload_time = "2026-01-21T03:57:55.912Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -2187,27 +2289,51 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } +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" }, + { 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/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } 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/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" }, ] [[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" } +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" } 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, upload-time = "2026-01-25T10:15:54.811Z" }, +] + +[[package]] +name = "pytokens" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, ] [[package]] @@ -2215,48 +2341,48 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload_time = "2025-07-14T20:13:26.471Z" }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload_time = "2025-07-14T20:13:28.243Z" }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload_time = "2025-07-14T20:13:30.348Z" }, - { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload_time = "2025-07-14T20:13:32.449Z" }, - { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload_time = "2025-07-14T20:13:34.312Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload_time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, ] [[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/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" }, +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/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" }, ] [[package]] @@ -2267,81 +2393,81 @@ dependencies = [ { name = "attrs" }, { name = "rpds-py" }, ] -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" } +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" }, + { 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/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" }, +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/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" }, ] [[package]] @@ -2354,9 +2480,22 @@ dependencies = [ { 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, upload-time = "2025-08-18T20:46:02.573Z" } 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, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rich" +version = "14.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/99/a4cab2acbb884f80e558b0771e97e21e939c5dfb460f488d19df485e8298/rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8", size = 230143, upload-time = "2026-02-01T16:20:47.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/45/615f5babd880b4bd7d405cc0dc348234c5ffb6ed1ea33e152ede08b2072d/rich-14.3.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69", size = 309963, upload-time = "2026-02-01T16:20:46.078Z" }, ] [[package]] @@ -2390,66 +2529,66 @@ requires-dist = [ 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/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" }, +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/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" }, ] [[package]] @@ -2459,36 +2598,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] [[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" } +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" } 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, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[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" } +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" } 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" }, + { 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" } +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" }, + { 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]] @@ -2499,31 +2638,31 @@ 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/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" }, +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/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" }, ] [[package]] @@ -2535,18 +2674,18 @@ dependencies = [ { name = "google-cloud-spanner" }, { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/29/21698bb83e542f32e3581886671f39d94b1f7e8b190c24a8bfa994e62fd6/sqlalchemy_spanner-1.17.2.tar.gz", hash = "sha256:56ce4da7168a27442d80ffd71c29ed639b5056d7e69b1e69bb9c1e10190b67c4", size = 82745, upload_time = "2025-12-15T23:30:08.622Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/29/21698bb83e542f32e3581886671f39d94b1f7e8b190c24a8bfa994e62fd6/sqlalchemy_spanner-1.17.2.tar.gz", hash = "sha256:56ce4da7168a27442d80ffd71c29ed639b5056d7e69b1e69bb9c1e10190b67c4", size = 82745, upload-time = "2025-12-15T23:30:08.622Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/87/05be45a086116cea32cfa00fa0059d31b5345360dba7902ee640a1db793b/sqlalchemy_spanner-1.17.2-py3-none-any.whl", hash = "sha256:18713d4d78e0bf048eda0f7a5c80733e08a7b678b34349496415f37652efb12f", size = 31917, upload_time = "2025-12-15T23:30:07.356Z" }, + { url = "https://files.pythonhosted.org/packages/7f/87/05be45a086116cea32cfa00fa0059d31b5345360dba7902ee640a1db793b/sqlalchemy_spanner-1.17.2-py3-none-any.whl", hash = "sha256:18713d4d78e0bf048eda0f7a5c80733e08a7b678b34349496415f37652efb12f", size = 31917, upload-time = "2025-12-15T23:30:07.356Z" }, ] [[package]] name = "sqlparse" version = "0.5.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload_time = "2025-12-19T07:17:45.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload_time = "2025-12-19T07:17:46.573Z" }, + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, ] [[package]] @@ -2557,9 +2696,9 @@ dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/00d280c03ffd39aaee0e86ec81e2d3b9253036a0f93f51d10503adef0e65/sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422", size = 27253, upload_time = "2026-01-17T13:11:05.62Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/8d/00d280c03ffd39aaee0e86ec81e2d3b9253036a0f93f51d10503adef0e65/sse_starlette-3.2.0.tar.gz", hash = "sha256:8127594edfb51abe44eac9c49e59b0b01f1039d0c7461c6fd91d4e03b70da422", size = 27253, upload-time = "2026-01-17T13:11:05.62Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7f/832f015020844a8b8f7a9cbc103dd76ba8e3875004c41e08440ea3a2b41a/sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf", size = 12763, upload_time = "2026-01-17T13:11:03.775Z" }, + { url = "https://files.pythonhosted.org/packages/96/7f/832f015020844a8b8f7a9cbc103dd76ba8e3875004c41e08440ea3a2b41a/sse_starlette-3.2.0-py3-none-any.whl", hash = "sha256:5876954bd51920fc2cd51baee47a080eb88a37b5b784e615abb0b283f801cdbf", size = 12763, upload-time = "2026-01-17T13:11:03.775Z" }, ] [[package]] @@ -2569,18 +2708,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -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, upload-time = "2025-11-01T15:25:27.516Z" } 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, upload-time = "2025-11-01T15:25:25.461Z" }, ] [[package]] name = "tenacity" -version = "9.1.3" +version = "9.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/4a/c3357c8742f361785e3702bb4c9c68c4cb37a80aa657640b820669be5af1/tenacity-9.1.3.tar.gz", hash = "sha256:a6724c947aa717087e2531f883bde5c9188f603f6669a9b8d54eb998e604c12a", size = 49002, upload_time = "2026-02-05T06:33:12.866Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6b/cdc85edb15e384d8e934aad89638cc8646e118c80de94c60125d0fc0a185/tenacity-9.1.3-py3-none-any.whl", hash = "sha256:51171cfc6b8a7826551e2f029426b10a6af189c5ac6986adcd7eb36d42f17954", size = 28858, upload_time = "2026-02-05T06:33:11.219Z" }, + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, ] [[package]] @@ -2591,36 +2730,36 @@ 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/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" }, +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/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" }, ] [[package]] @@ -2630,23 +2769,23 @@ source = { registry = "https://pypi.org/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" } +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/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" }, ] [[package]] @@ -2656,31 +2795,45 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload_time = "2026-02-03T17:35:53.048Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload_time = "2026-02-03T17:35:50.982Z" }, + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] [[package]] -name = "typer-slim" -version = "0.21.1" +name = "typer" +version = "0.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "click" }, - { name = "typing-extensions" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/e6/44e073787aa57cd71c151f44855232feb0f748428fd5242d7366e3c4ae8b/typer-0.23.0.tar.gz", hash = "sha256:d8378833e47ada5d3d093fa20c4c63427cc4e27127f6b349a6c359463087d8cc", size = 120181, upload-time = "2026-02-11T15:22:18.637Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/ed/d6fca788b51d0d4640c4bc82d0e85bad4b49809bca36bf4af01b4dcb66a7/typer-0.23.0-py3-none-any.whl", hash = "sha256:79f4bc262b6c37872091072a3cb7cb6d7d79ee98c0c658b4364bdcde3c42c913", size = 56668, upload-time = "2026-02-11T15:22:21.075Z" }, +] + +[[package]] +name = "typer-slim" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typer" }, ] -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/1f/8a/881cfd399a119db89619dc1b93d36e2fb6720ddb112bceff41203f1abd72/typer_slim-0.23.0.tar.gz", hash = "sha256:be8b60243df27cfee444c6db1b10a85f4f3e54d940574f31a996f78aa35a8254", size = 4773, upload-time = "2026-02-11T15:22:19.106Z" } 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/07/3e/ba3a222c80ee070d9497ece3e1fe77253c142925dd4c90f04278aac0a9eb/typer_slim-0.23.0-py3-none-any.whl", hash = "sha256:1d693daf22d998a7b1edab8413cdcb8af07254154ce3956c1664dc11b01e2f8b", size = 3399, upload-time = "2026-02-11T15:22:17.792Z" }, ] [[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" } +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" } 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, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] @@ -2690,18 +2843,18 @@ source = { registry = "https://pypi.org/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, upload-time = "2025-10-01T02:14:41.687Z" } 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, upload-time = "2025-10-01T02:14:40.154Z" }, ] [[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" } +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" } 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, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -2711,27 +2864,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload_time = "2025-03-05T21:17:41.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload_time = "2025-03-05T21:17:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, ] [[package]] name = "uritemplate" version = "4.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload_time = "2025-06-02T15:12:06.318Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload_time = "2025-06-02T15:12:03.405Z" }, + { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" }, ] [[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" } +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" } 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, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] @@ -2742,50 +2895,50 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -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, upload-time = "2025-12-21T14:16:22.45Z" } 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, upload-time = "2025-12-21T14:16:21.041Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] [[package]] @@ -2797,80 +2950,80 @@ dependencies = [ { 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/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" }, +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/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" } +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" }, + { 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" }, ] From abc7456ae8856c1f9404ef4c8efc418fc8ff473e Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 19:22:13 +0000 Subject: [PATCH 48/65] feat: implement schema packaging and runtime loading (#555) - Add a base InferenceStrategy class - Add PackSpecsBuildHook to copy JSON schemas into the package during build time. - Update pyproject.toml to include assets and configure the build hook. - Implement A2uiSchemaManager for robust schema loading, pruning, and prompt generation. --- .../python_a2ui_agent_build_and_test.yml | 8 +- a2a_agents/python/a2ui_agent/.gitignore | 1 + .../python/a2ui_agent/pack_specs_hook.py | 88 ++++ a2a_agents/python/a2ui_agent/pyproject.toml | 7 + .../a2ui_agent/src/a2ui/inference/__init__.py | 13 + .../src/a2ui/inference/inference_strategy.py | 47 ++ .../src/a2ui/inference/schema/__init__.py | 13 + .../src/a2ui/inference/schema/catalog.py | 255 ++++++++++ .../src/a2ui/inference/schema/constants.py | 52 ++ .../src/a2ui/inference/schema/loader.py | 70 +++ .../src/a2ui/inference/schema/manager.py | 321 +++++++++++++ .../src/a2ui/inference/template/__init__.py | 13 + .../src/a2ui/inference/template/manager.py | 32 ++ .../tests/inference/test_catalog.py | 160 +++++++ .../inference/test_resolve_catalog_schema.py | 201 ++++++++ .../tests/inference/test_schema_manager.py | 448 ++++++++++++++++++ .../tests/integration/verify_load_real.py | 45 ++ a2a_agents/python/a2ui_agent/uv.lock | 119 ++--- 18 files changed, 1835 insertions(+), 58 deletions(-) create mode 100644 a2a_agents/python/a2ui_agent/.gitignore create mode 100644 a2a_agents/python/a2ui_agent/pack_specs_hook.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/__init__.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/__init__.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/loader.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/template/__init__.py create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py create mode 100644 a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py create mode 100644 a2a_agents/python/a2ui_agent/tests/inference/test_resolve_catalog_schema.py create mode 100644 a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py create mode 100644 a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py diff --git a/.github/workflows/python_a2ui_agent_build_and_test.yml b/.github/workflows/python_a2ui_agent_build_and_test.yml index 4d3f44e8e..4ecd60d27 100644 --- a/.github/workflows/python_a2ui_agent_build_and_test.yml +++ b/.github/workflows/python_a2ui_agent_build_and_test.yml @@ -46,10 +46,14 @@ jobs: working-directory: a2a_agents/python/a2ui_agent run: uv run pyink --check . + - name: Run unit tests + working-directory: a2a_agents/python/a2ui_agent + run: uv run --with pytest pytest tests/ + - name: Build the python SDK working-directory: a2a_agents/python/a2ui_agent run: uv build . - - name: Run unit tests + - name: Run validation scripts on assets packing working-directory: a2a_agents/python/a2ui_agent - run: uv run --with pytest pytest tests/ + run: uv run python tests/integration/verify_load_real.py diff --git a/a2a_agents/python/a2ui_agent/.gitignore b/a2a_agents/python/a2ui_agent/.gitignore new file mode 100644 index 000000000..22b91a08b --- /dev/null +++ b/a2a_agents/python/a2ui_agent/.gitignore @@ -0,0 +1 @@ +src/a2ui/assets/**/*.json diff --git a/a2a_agents/python/a2ui_agent/pack_specs_hook.py b/a2a_agents/python/a2ui_agent/pack_specs_hook.py new file mode 100644 index 000000000..7d4f5f226 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/pack_specs_hook.py @@ -0,0 +1,88 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import importlib.util +import os +import shutil +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + + +def load_constants(project_root): + """Loads the shared constants module directly from its path in src/.""" + constants_path = os.path.join( + project_root, "src", "a2ui", "inference", "schema", "constants.py" + ) + if not os.path.exists(constants_path): + raise RuntimeError(f"Could not find shared constants at {constants_path}") + + spec = importlib.util.spec_from_file_location("_constants_load", constants_path) + if spec and spec.loader: + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + raise RuntimeError(f"Could not load shared constants from {constants_path}") + + +class PackSpecsBuildHook(BuildHookInterface): + + def initialize(self, version, build_data): + project_root = self.root + + # Load constants dynamically from src/a2ui/inference/schema/constants.py + a2ui_constants = load_constants(project_root) + + spec_version_map = a2ui_constants.SPEC_VERSION_MAP + a2ui_asset_package = a2ui_constants.A2UI_ASSET_PACKAGE + specification_dir = a2ui_constants.SPECIFICATION_DIR + + # project root is in a2a_agents/python/a2ui_agent + # Dynamically find repo root by looking for specification_dir + repo_root = a2ui_constants.find_repo_root(project_root) + if not repo_root: + # Check for PKG-INFO which implies a packaged state (sdist). + # If PKG-INFO is present, trust the bundled assets. + if os.path.exists(os.path.join(project_root, "PKG-INFO")): + print("Repository root not found, but PKG-INFO present (sdist). Skipping copy.") + return + + raise RuntimeError( + f"Could not find repository root (looked for '{specification_dir}'" + " directory)." + ) + + # Target directory: src/a2ui/assets + target_base = os.path.join( + project_root, "src", a2ui_asset_package.replace(".", os.sep) + ) + + for ver, schema_map in spec_version_map.items(): + target_dir = os.path.join(target_base, ver) + os.makedirs(target_dir, exist_ok=True) + + for _schema_key, source_rel_path in schema_map.items(): + source_path = os.path.join(repo_root, source_rel_path) + + if not os.path.exists(source_path): + print( + f"WARNING: Source schema file not found at {source_path}. Build" + " might produce incomplete wheel if not running from monorepo" + " root." + ) + continue + + filename = os.path.basename(source_path) + dst_file = os.path.join(target_dir, filename) + + print(f"Copying {source_path} -> {dst_file}") + shutil.copy2(source_path, dst_file) diff --git a/a2a_agents/python/a2ui_agent/pyproject.toml b/a2a_agents/python/a2ui_agent/pyproject.toml index 513db8577..f8e3c9fd5 100644 --- a/a2a_agents/python/a2ui_agent/pyproject.toml +++ b/a2a_agents/python/a2ui_agent/pyproject.toml @@ -17,6 +17,13 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/a2ui"] +artifacts = ["src/a2ui/assets/**"] + +[tool.hatch.build.targets.sdist] +artifacts = ["src/a2ui/assets/**"] + +[tool.hatch.build.hooks.custom] +path = "pack_specs_hook.py" [[tool.uv.index]] url = "https://pypi.org/simple" diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/__init__.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/__init__.py new file mode 100644 index 000000000..4df27a209 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py new file mode 100644 index 000000000..ed1b0789f --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py @@ -0,0 +1,47 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from abc import ABC, abstractmethod +from typing import List, Optional, Any + + +class InferenceStrategy(ABC): + + @abstractmethod + def generate_system_prompt( + self, + role_description: str, + workflow_description: str = "", + ui_description: str = "", + supported_catalog_ids: List[str] = [], + allowed_components: List[str] = [], + include_schema: bool = False, + include_examples: bool = False, + ) -> str: + """ + Generates a system prompt for all LLM requests. + + Args: + role_description: Description of the agent's role. + workflow_description: Description of the workflow. + ui_description: Description of the UI. + supported_catalog_ids: List of supported catalog IDs. + allowed_components: List of allowed components. + include_schema: Whether to include the schema. + include_examples: Whether to include examples. + + Returns: + The system prompt. + """ + pass diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/__init__.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/__init__.py new file mode 100644 index 000000000..4df27a209 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py new file mode 100644 index 000000000..0a53f1a1a --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py @@ -0,0 +1,255 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import json +import logging +import os +from dataclasses import dataclass, replace +from typing import Any, Dict, List, Optional + +from .constants import CATALOG_COMPONENTS_KEY, CATALOG_ID_KEY +from referencing import Registry, Resource + + +@dataclass +class CustomCatalogConfig: + """Configuration for a custom component catalog.""" + + name: str + catalog_path: str + examples_path: Optional[str] = None + + +@dataclass(frozen=True) +class A2uiCatalog: + """Represents a processed component catalog with its schema. + + Attributes: + version: The version of the catalog. + name: The name of the catalog. + s2c_schema: The server-to-client schema. + common_types_schema: The common types schema. + catalog_schema: The catalog schema. + """ + + version: str + name: str + s2c_schema: Dict[str, Any] + common_types_schema: Dict[str, Any] + catalog_schema: Dict[str, Any] + + @property + def catalog_id(self) -> str: + if CATALOG_ID_KEY not in self.catalog_schema: + raise ValueError(f"Catalog '{self.name}' missing catalogId") + return self.catalog_schema[CATALOG_ID_KEY] + + def with_pruned_components(self, allowed_components: List[str]) -> "A2uiCatalog": + """Returns a new catalog with only allowed components. + + Args: + allowed_components: List of component names to include. + + Returns: + A copy of the catalog with only allowed components. + """ + + schema_copy = copy.deepcopy(self.catalog_schema) + + # Allow all components if no allowed components are specified + if not allowed_components: + return self + + if CATALOG_COMPONENTS_KEY in schema_copy and isinstance( + schema_copy[CATALOG_COMPONENTS_KEY], dict + ): + all_comps = schema_copy[CATALOG_COMPONENTS_KEY] + schema_copy[CATALOG_COMPONENTS_KEY] = { + k: v for k, v in all_comps.items() if k in allowed_components + } + + # Filter anyComponent oneOf if it exists + # Path: $defs -> anyComponent -> oneOf + if "$defs" in schema_copy and "anyComponent" in schema_copy["$defs"]: + any_comp = schema_copy["$defs"]["anyComponent"] + if "oneOf" in any_comp and isinstance(any_comp["oneOf"], list): + filtered_one_of = [] + for item in any_comp["oneOf"]: + if "$ref" in item: + ref = item["$ref"] + if ref.startswith(f"#/{CATALOG_COMPONENTS_KEY}/"): + comp_name = ref.split("/")[-1] + if comp_name in allowed_components: + filtered_one_of.append(item) + else: + logging.warning(f"Skipping unknown ref format: {ref}") + else: + logging.warning(f"Skipping non-ref item in anyComponent oneOf: {item}") + + any_comp["oneOf"] = filtered_one_of + + return replace(self, catalog_schema=schema_copy) + + def render_as_llm_instructions(self) -> str: + """Renders the catalog and schema as LLM instructions.""" + all_schemas = [] + all_schemas.append("---BEGIN A2UI JSON SCHEMA---") + + server_client_str = ( + json.dumps(self.s2c_schema, indent=2) if self.s2c_schema else "{}" + ) + all_schemas.append(f"### Server To Client Schema:\n{server_client_str}") + + if self.common_types_schema: + common_str = json.dumps(self.common_types_schema, indent=2) + all_schemas.append(f"### Common Types Schema:\n{common_str}") + + catalog_str = json.dumps(self.catalog_schema, indent=2) + all_schemas.append(f"### Catalog Schema:\n{catalog_str}") + + all_schemas.append("---END A2UI JSON SCHEMA---") + + return "\n\n".join(all_schemas) + + def load_examples(self, path: Optional[str]) -> str: + """Loads and validates examples from a directory.""" + if not path or not os.path.isdir(path): + if path: + logging.warning(f"Example path {path} is not a directory") + return "" + + merged_examples = [] + for filename in os.listdir(path): + if filename.endswith(".json"): + full_path = os.path.join(path, filename) + basename = os.path.splitext(filename)[0] + try: + with open(full_path, "r", encoding="utf-8") as f: + content = f.read() + merged_examples.append( + f"---BEGIN {basename}---\n{content}\n---END {basename}---" + ) + except Exception as e: + logging.warning(f"Failed to load example {full_path}: {e}") + if not merged_examples: + return "" + return "\n\n".join(merged_examples) + + @staticmethod + def resolve_schema(basic: Dict[str, Any], custom: Dict[str, Any]) -> Dict[str, Any]: + """Resolves references in custom catalog schema against the basic catalog. + + Args: + basic: The basic catalog schema. + custom: The custom catalog schema. + + Returns: + A new dictionary with references resolved. + """ + result = copy.deepcopy(custom) + + # Initialize registry with basic catalog and maybe others from basic's $id + registry = Registry() + if CATALOG_ID_KEY in basic: + basic_resource = Resource.from_contents(basic) + registry = registry.with_resource(basic[CATALOG_ID_KEY], basic_resource) + + def resolve_ref(ref_uri: str) -> Any: + try: + resolver = registry.resolver() + resolved = resolver.lookup(ref_uri) + return resolved.contents + except Exception as e: + logging.warning("Could not resolve reference %s: %s", ref_uri, e) + return None + + def merge_into(target: Dict[str, Any], source: Dict[str, Any]): + for key, value in source.items(): + if key not in target: + target[key] = copy.deepcopy(value) + + # Process components + if CATALOG_COMPONENTS_KEY in result: + comp_dict = result[CATALOG_COMPONENTS_KEY] + if "$ref" in comp_dict: + resolved = resolve_ref(comp_dict["$ref"]) + if isinstance(resolved, dict): + merge_into(comp_dict, resolved) + del comp_dict["$ref"] + + # Process functions + if "functions" in result: + func_dict = result["functions"] + if "$ref" in func_dict: + resolved = resolve_ref(func_dict["$ref"]) + if isinstance(resolved, dict): + merge_into(func_dict, resolved) + del func_dict["$ref"] + + # Process $defs + if "$defs" in result: + res_defs = result["$defs"] + if "$ref" in res_defs: + resolved = resolve_ref(res_defs["$ref"]) + if isinstance(resolved, dict): + merge_into(res_defs, resolved) + del res_defs["$ref"] + + for name in ["anyComponent", "anyFunction"]: + if name in res_defs: + target = res_defs[name] + one_of = target.get("oneOf", []) + new_one_of = [] + for item in one_of: + if isinstance(item, dict) and "$ref" in item: + ref_uri = item["$ref"] + # Check if it points to basic collector + resolved = resolve_ref(ref_uri) + if isinstance(resolved, dict) and "oneOf" in resolved: + # Merge oneOf items and resolve transitive refs to components/functions + for sub_item in resolved["oneOf"]: + if sub_item not in new_one_of: + new_one_of.append(copy.deepcopy(sub_item)) + # Transitive merge: if sub_item is a ref to a component/function + if isinstance(sub_item, dict) and "$ref" in sub_item: + sub_ref = sub_item["$ref"] + if ( + sub_ref.startswith("#/components/") + and CATALOG_COMPONENTS_KEY in basic + ): + comp_name = sub_ref.split("/")[-1] + if comp_name in basic[CATALOG_COMPONENTS_KEY]: + if CATALOG_COMPONENTS_KEY not in result: + result[CATALOG_COMPONENTS_KEY] = {} + if comp_name not in result[CATALOG_COMPONENTS_KEY]: + result[CATALOG_COMPONENTS_KEY][comp_name] = copy.deepcopy( + basic[CATALOG_COMPONENTS_KEY][comp_name] + ) + elif sub_ref.startswith("#/functions/") and "functions" in basic: + func_name = sub_ref.split("/")[-1] + if func_name in basic["functions"]: + if "functions" not in result: + result["functions"] = {} + if func_name not in result["functions"]: + result["functions"][func_name] = copy.deepcopy( + basic["functions"][func_name] + ) + else: + new_one_of.append(item) + else: + new_one_of.append(item) + target["oneOf"] = new_one_of + + return result diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py new file mode 100644 index 000000000..8a8682090 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py @@ -0,0 +1,52 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +A2UI_ASSET_PACKAGE = "a2ui.assets" +SERVER_TO_CLIENT_SCHEMA_KEY = "server_to_client" +COMMON_TYPES_SCHEMA_KEY = "common_types" +CATALOG_SCHEMA_KEY = "catalog" +CATALOG_COMPONENTS_KEY = "components" +CATALOG_ID_KEY = "catalogId" + +BASE_SCHEMA_URL = "https://a2ui.org/" +BASIC_CATALOG_NAME = "basic" +INLINE_CATALOG_NAME = "inline" + +SPEC_VERSION_MAP = { + "0.8": { + SERVER_TO_CLIENT_SCHEMA_KEY: "specification/v0_8/json/server_to_client.json", + CATALOG_SCHEMA_KEY: "specification/v0_8/json/standard_catalog_definition.json", + }, + "0.9": { + SERVER_TO_CLIENT_SCHEMA_KEY: "specification/v0_9/json/server_to_client.json", + CATALOG_SCHEMA_KEY: "specification/v0_9/json/standard_catalog.json", + COMMON_TYPES_SCHEMA_KEY: "specification/v0_9/json/common_types.json", + }, +} + +SPECIFICATION_DIR = "specification" + + +def find_repo_root(start_path: str) -> str | None: + """Finds the repository root by looking for the 'specification' directory.""" + current = os.path.abspath(start_path) + while True: + if os.path.isdir(os.path.join(current, SPECIFICATION_DIR)): + return current + parent = os.path.dirname(current) + if parent == current: + return None + current = parent diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/loader.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/loader.py new file mode 100644 index 000000000..71dec984e --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/loader.py @@ -0,0 +1,70 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +from json.decoder import JSONDecodeError +import os +import importlib.resources +from typing import List, Dict, Any + +from abc import ABC, abstractmethod + +ENCODING = "utf-8" + + +class A2uiSchemaLoader(ABC): + """Abstract base class for loading schema files.""" + + @abstractmethod + def load(self, filename: str) -> Any: + """Loads a JSON file.""" + pass + + +class FileSystemLoader(A2uiSchemaLoader): + """Loads schema files from the local filesystem. + + This loader assumes that all referenced schema files are located in the + same flat directory structure. + """ + + def __init__(self, base_dir: str): + self.base_dir = base_dir + + def load(self, filename: str) -> Any: + path = os.path.join(self.base_dir, filename) + with open(path, "r", encoding=ENCODING) as f: + return json.load(f) + + +class PackageLoader(A2uiSchemaLoader): + """Loads schema files from package resources. + + This loader assumes that all referenced schema files are located in the + same flat package structure. + """ + + def __init__(self, package_path: str): + self.package_path = package_path + + def load(self, filename: str) -> Any: + try: + traversable = importlib.resources.files(self.package_path) + resource_path = traversable.joinpath(filename) + with resource_path.open("r", encoding=ENCODING) as f: + return json.load(f) + except (ModuleNotFoundError, FileNotFoundError, JSONDecodeError) as e: + raise IOError( + f"Could not load package resource {filename} in {self.package_path}: {e}" + ) from e diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py new file mode 100644 index 000000000..106590f00 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py @@ -0,0 +1,321 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import json +import logging +import os +import importlib.resources +from typing import List, Dict, Any, Optional +from dataclasses import dataclass, field +from .loader import A2uiSchemaLoader, PackageLoader, FileSystemLoader +from ..inference_strategy import InferenceStrategy +from .constants import ( + A2UI_ASSET_PACKAGE, + SERVER_TO_CLIENT_SCHEMA_KEY, + COMMON_TYPES_SCHEMA_KEY, + CATALOG_SCHEMA_KEY, + CATALOG_COMPONENTS_KEY, + CATALOG_ID_KEY, + BASE_SCHEMA_URL, + SPEC_VERSION_MAP, + SPECIFICATION_DIR, + INLINE_CATALOG_NAME, + BASIC_CATALOG_NAME, + find_repo_root, +) +from .catalog import CustomCatalogConfig, A2uiCatalog +from ...extension.a2ui_extension import INLINE_CATALOGS_KEY, SUPPORTED_CATALOG_IDS_KEY + + +def _load_basic_component(version: str, spec_name: str) -> Dict: + """Loads a basic schema component using fallback logic. + + Args: + version: The version of the schema to load. + spec_name: The name of the schema component (e.g. 'server_to_client', 'standard_catalog', 'common_types') to load. + + Returns: + The loaded schema component. + + Raises: + IOError: If the schema file cannot be loaded from any of the fallback locations. + """ + + spec_map = SPEC_VERSION_MAP[version] + if spec_name not in spec_map: + return None + path = spec_map.get(spec_name) + filename = os.path.basename(path) + + # 1. Try to load from package resources + try: + loader = PackageLoader(f"{A2UI_ASSET_PACKAGE}.{version}") + return loader.load(filename) + except IOError as e: + logging.debug("Could not load schema '%s' from package: %s", filename, e) + + # 2. Fallback: Local Assets + # This handles cases where assets might be present in src but not installed + try: + potential_path = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + "..", + "assets", + version, + filename, + ) + ) + loader = FileSystemLoader(os.path.dirname(potential_path)) + return loader.load(filename) + except Exception as e: + logging.debug("Could not load schema '%s' from local assets: %s", filename, e) + + # 3. Fallback: Source Repository (specification/...) + # This handles cases where we are running directly from source tree + # And assets are not yet copied to src/a2ui/assets + # schema_manager.py is at a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py + # Dynamically find repo root by looking for "specification" directory + try: + repo_root = find_repo_root(os.path.dirname(__file__)) + except Exception as e: + logging.debug("Could not find repo root: %s", e) + + if repo_root: + source_path = os.path.join(repo_root, path) + if os.path.exists(source_path): + loader = FileSystemLoader(os.path.dirname(source_path)) + return loader.load(filename) + + raise IOError(f"Could not load schema {filename} for version {version}") + + +def _load_from_path(path: str) -> Dict: + """Loads a schema from a direct file path.""" + try: + loader = FileSystemLoader(os.path.dirname(path)) + return loader.load(os.path.basename(path)) + except Exception as e: + raise ValueError(f"Failed to load schema at {path}: {e}") + + +class A2uiSchemaManager(InferenceStrategy): + """Manages A2UI schema levels and prompt injection.""" + + def __init__( + self, + version: str, + basic_examples_path: Optional[str] = None, + custom_catalogs: Optional[List[CustomCatalogConfig]] = None, + exclude_basic_catalog: bool = False, + accepts_inline_catalogs: bool = False, + ): + self._version = version + self._exclude_basic_catalog = exclude_basic_catalog + self._accepts_inline_catalogs = accepts_inline_catalogs + + self._server_to_client_schema = None + self._common_types_schema = None + self._supported_catalogs: Dict[str, A2uiCatalog] = {} + self._catalog_example_paths: Dict[str, str] = {} + self._basic_catalog = None + self._load_schemas(version, custom_catalogs, basic_examples_path) + + @property + def accepts_inline_catalogs(self) -> bool: + return self._accepts_inline_catalogs + + @property + def supported_catalogs(self) -> Dict[str, A2uiCatalog]: + return self._supported_catalogs + + def _load_schemas( + self, + version: str, + custom_catalogs: Optional[List[CustomCatalogConfig]] = None, + basic_examples_path: Optional[str] = None, + ): + """Loads separate schema components and processes catalogs.""" + if version not in SPEC_VERSION_MAP: + raise ValueError( + f"Unknown A2UI specification version: {version}. Supported:" + f" {list(SPEC_VERSION_MAP.keys())}" + ) + + # Load server-to-client and common types schemas + self._server_to_client_schema = _load_basic_component( + version, SERVER_TO_CLIENT_SCHEMA_KEY + ) + self._common_types_schema = _load_basic_component(version, COMMON_TYPES_SCHEMA_KEY) + + # Process basic catalog + basic_catalog_schema = _load_basic_component(version, CATALOG_SCHEMA_KEY) + if not basic_catalog_schema: + basic_catalog_schema = {} + + # Ensure catalog id and schema url are set in the basic catalog schema + if CATALOG_ID_KEY not in basic_catalog_schema: + catalog_file = ( + # Strip the `json/` part from the catalog file path. + SPEC_VERSION_MAP[version][CATALOG_SCHEMA_KEY].replace("/json/", "/") + if CATALOG_SCHEMA_KEY in SPEC_VERSION_MAP[version] + else f"specification/{version}/standard_catalog.json" + ) + basic_catalog_schema[CATALOG_ID_KEY] = BASE_SCHEMA_URL + catalog_file + if "$schema" not in basic_catalog_schema: + basic_catalog_schema["$schema"] = "https://json-schema.org/draft/2020-12/schema" + + self._basic_catalog = A2uiCatalog( + version=version, + name=BASIC_CATALOG_NAME, + catalog_schema=basic_catalog_schema, + s2c_schema=self._server_to_client_schema, + common_types_schema=self._common_types_schema, + ) + if not self._exclude_basic_catalog: + self._supported_catalogs[self._basic_catalog.catalog_id] = self._basic_catalog + self._catalog_example_paths[self._basic_catalog.catalog_id] = basic_examples_path + + # Process custom catalogs + if custom_catalogs: + for config in custom_catalogs: + custom_catalog_schema = _load_from_path(config.catalog_path) + resolved_catalog_schema = A2uiCatalog.resolve_schema( + basic_catalog_schema, custom_catalog_schema + ) + catalog = A2uiCatalog( + version=version, + name=config.name, + catalog_schema=resolved_catalog_schema, + s2c_schema=self._server_to_client_schema, + common_types_schema=self._common_types_schema, + ) + self._supported_catalogs[catalog.catalog_id] = catalog + self._catalog_example_paths[catalog.catalog_id] = config.examples_path + + def _determine_catalog( + self, client_ui_capabilities: Optional[dict[str, Any]] = None + ) -> A2uiCatalog: + """Determines the catalog to use based on supported catalog IDs. + + If neither inline catalogs nor supported catalog IDs are provided, the basic catalog is used. + If inline catalogs are provided, the first inline catalog is used. + If supported catalog IDs are provided, the first supported catalog that is recognized is used. + + Args: + client_ui_capabilities: A dictionary of client UI capabilities. + + Returns: + The A2uiCatalog to use to generate the schema string in the prompt. + + Raises: + ValueError: If both inline catalogs and supported catalog IDs are provided, + or if no supported catalog is recognized. + """ + if not client_ui_capabilities or not isinstance(client_ui_capabilities, dict): + return self._basic_catalog + + inline_catalogs: List[dict[str, Any]] = client_ui_capabilities.get( + INLINE_CATALOGS_KEY, [] + ) + supported_catalog_ids: List[str] = client_ui_capabilities.get( + SUPPORTED_CATALOG_IDS_KEY, [] + ) + + if not self._accepts_inline_catalogs and inline_catalogs: + raise ValueError( + f"Inline catalog '{INLINE_CATALOGS_KEY}' is provided in client UI" + " capabilities. However, the agent does not accept inline catalogs." + ) + + if inline_catalogs and supported_catalog_ids: + raise ValueError( + f"Both '{INLINE_CATALOGS_KEY}' and '{SUPPORTED_CATALOG_IDS_KEY}' " + "are provided in client UI capabilities. Only one is allowed." + ) + + if inline_catalogs: + # Load the first custom inline catalog schema. + inline_catalog_schema = inline_catalogs[0] + resolved_catalog_schema = A2uiCatalog.resolve_schema( + self._basic_catalog.catalog_schema, inline_catalog_schema + ) + return A2uiCatalog( + version=self._version, + name=INLINE_CATALOG_NAME, + catalog_schema=resolved_catalog_schema, + s2c_schema=self._server_to_client_schema, + common_types_schema=self._common_types_schema, + ) + + if not supported_catalog_ids: + return self._basic_catalog + + for scid in supported_catalog_ids: + if scid in self._supported_catalogs: + # Return the first supported catalog. + return self._supported_catalogs[scid] + + raise ValueError( + "No supported catalog found on the agent side. Agent supported catalogs are:" + f" {list(self._supported_catalogs.keys())}" + ) + + def get_effective_catalog( + self, + client_ui_capabilities: Optional[dict[str, Any]] = None, + allowed_components: List[str] = [], + ) -> A2uiCatalog: + """Gets the effective catalog after selection and component pruning.""" + catalog = self._determine_catalog(client_ui_capabilities) + pruned_catalog = catalog.with_pruned_components(allowed_components) + return pruned_catalog + + def load_examples(self, catalog: A2uiCatalog) -> str: + """Loads examples for a catalog.""" + if catalog.catalog_id in self._catalog_example_paths: + return catalog.load_examples(self._catalog_example_paths[catalog.catalog_id]) + return "" + + def generate_system_prompt( + self, + role_description: str, + workflow_description: str = "", + ui_description: str = "", + client_ui_capabilities: Optional[dict[str, Any]] = None, + allowed_components: List[str] = [], + include_schema: bool = False, + include_examples: bool = False, + ) -> str: + """Assembles the final system instruction for the LLM.""" + parts = [role_description] + if workflow_description: + parts.append(f"## Workflow Description:\n{workflow_description}") + if ui_description: + parts.append(f"## UI Description:\n{ui_description}") + + final_catalog = self.get_effective_catalog( + client_ui_capabilities, allowed_components + ) + + if include_schema: + parts.append(final_catalog.render_as_llm_instructions()) + + if include_examples: + examples_str = self.load_examples(final_catalog) + if examples_str: + parts.append(f"### Examples:\n{examples_str}") + + return "\n\n".join(parts) diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/__init__.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/__init__.py new file mode 100644 index 000000000..4df27a209 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py new file mode 100644 index 000000000..41f5a8ec9 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py @@ -0,0 +1,32 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ..inference_strategy import InferenceStrategy +from typing import List, Optional, Any + + +class A2uiTemplateManager(InferenceStrategy): + + def generate_system_prompt( + self, + role_description: str, + workflow_description: str = "", + ui_description: str = "", + supported_catalog_ids: List[str] = [], + allowed_components: List[str] = [], + include_schema: bool = False, + include_examples: bool = False, + ) -> str: + # TODO: Implementation logic for Template Manager + raise NotImplementedError("This method is not yet implemented.") diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py b/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py new file mode 100644 index 000000000..89874db82 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py @@ -0,0 +1,160 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +import pytest +from typing import Any, Dict, List +from a2ui.inference.schema.catalog import A2uiCatalog +from a2ui.inference.schema.constants import BASIC_CATALOG_NAME + + +def test_catalog_id_property(): + catalog_id = "https://a2ui.org/basic_catalog.json" + catalog = A2uiCatalog( + version="0.8", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema={"catalogId": catalog_id}, + ) + assert catalog.catalog_id == catalog_id + + +def test_catalog_id_missing_raises_error(): + catalog = A2uiCatalog( + version="0.8", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema={}, # No catalogId + ) + with pytest.raises( + ValueError, match=f"Catalog '{BASIC_CATALOG_NAME}' missing catalogId" + ): + _ = catalog.catalog_id + + +def test_load_examples(tmp_path): + example_dir = tmp_path / "examples" + example_dir.mkdir() + (example_dir / "example1.json").write_text('{"foo": "bar"}') + (example_dir / "example2.json").write_text('{"baz": "qux"}') + (example_dir / "ignored.txt").write_text("should not be loaded") + + catalog = A2uiCatalog( + version="0.8", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema={}, + ) + + examples_str = catalog.load_examples(str(example_dir)) + assert "---BEGIN example1---" in examples_str + assert '{"foo": "bar"}' in examples_str + assert "---BEGIN example2---" in examples_str + assert '{"baz": "qux"}' in examples_str + assert "ignored" not in examples_str + + +def test_load_examples_none_or_invalid_path(): + catalog = A2uiCatalog( + version="0.8", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema={}, + ) + + assert catalog.load_examples(None) == "" + assert catalog.load_examples("/non/existent/path") == "" + + +def test_with_pruned_components(): + catalog_schema = { + "catalogId": "basic", + "components": { + "Text": {"type": "object"}, + "Button": {"type": "object"}, + "Image": {"type": "object"}, + }, + } + catalog = A2uiCatalog( + version="0.8", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema=catalog_schema, + ) + + # Test basic pruning + pruned_catalog = catalog.with_pruned_components(["Text", "Button"]) + pruned = pruned_catalog.catalog_schema + assert "Text" in pruned["components"] + assert "Button" in pruned["components"] + assert "Image" not in pruned["components"] + assert pruned_catalog is not catalog # Should be a new instance + + # Test anyComponent oneOf filtering + catalog_schema_with_defs = { + "catalogId": "basic", + "$defs": { + "anyComponent": { + "oneOf": [ + {"$ref": "#/components/Text"}, + {"$ref": "#/components/Button"}, + {"$ref": "#/components/Image"}, + ] + } + }, + "components": {"Text": {}, "Button": {}, "Image": {}}, + } + catalog_with_defs = A2uiCatalog( + version="0.9", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema=catalog_schema_with_defs, + ) + pruned_catalog_defs = catalog_with_defs.with_pruned_components(["Text"]) + any_comp = pruned_catalog_defs.catalog_schema["$defs"]["anyComponent"] + assert len(any_comp["oneOf"]) == 1 + assert any_comp["oneOf"][0]["$ref"] == "#/components/Text" + + # Test empty allowed components (should return original self) + assert catalog.with_pruned_components([]) is catalog + + +def test_render_as_llm_instructions(): + catalog = A2uiCatalog( + version="0.9", + name=BASIC_CATALOG_NAME, + s2c_schema={"s2c": "schema"}, + common_types_schema={"common": "types"}, + catalog_schema={ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalog": "schema", + "catalogId": "id_basic", + }, + ) + + schema_str = catalog.render_as_llm_instructions() + assert "---BEGIN A2UI JSON SCHEMA---" in schema_str + assert '### Server To Client Schema:\n{\n "s2c": "schema"\n}' in schema_str + assert '### Common Types Schema:\n{\n "common": "types"\n}' in schema_str + assert "### Catalog Schema:" in schema_str + assert '"catalog": "schema"' in schema_str + assert '"catalogId": "id_basic"' in schema_str + assert "---END A2UI JSON SCHEMA---" in schema_str diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_resolve_catalog_schema.py b/a2a_agents/python/a2ui_agent/tests/inference/test_resolve_catalog_schema.py new file mode 100644 index 000000000..20ff4cff0 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_resolve_catalog_schema.py @@ -0,0 +1,201 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +from a2ui.inference.schema.catalog import A2uiCatalog +from a2ui.inference.schema.constants import CATALOG_COMPONENTS_KEY, CATALOG_ID_KEY + + +def test_resolve_no_ref(): + custom = { + CATALOG_COMPONENTS_KEY: { + "CustomButton": { + "type": "object", + "properties": {"label": {"type": "string"}}, + } + } + } + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"text": {"type": "string"}}} + }, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "CustomButton" in resolved[CATALOG_COMPONENTS_KEY] + assert "Text" not in resolved[CATALOG_COMPONENTS_KEY] + + +def test_resolve_with_ref(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"text": {"type": "string"}}}, + "Image": {"type": "object"}, + }, + } + custom = { + CATALOG_COMPONENTS_KEY: { + "$ref": "https://a2ui.org/basic_catalog.json#/components", + "Canvas": {"type": "object"}, + } + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "Canvas" in resolved[CATALOG_COMPONENTS_KEY] + assert "Text" in resolved[CATALOG_COMPONENTS_KEY] + assert "Image" in resolved[CATALOG_COMPONENTS_KEY] + assert "$ref" not in resolved[CATALOG_COMPONENTS_KEY] + + +def test_resolve_override_without_ref(): + custom = { + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"custom": {"type": "string"}}} + } + } + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"text": {"type": "string"}}} + }, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "custom" in resolved[CATALOG_COMPONENTS_KEY]["Text"]["properties"] + assert "text" not in resolved[CATALOG_COMPONENTS_KEY]["Text"]["properties"] + + +def test_resolve_any_component_with_ref(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"text": {"type": "string"}}} + }, + "$defs": {"anyComponent": {"oneOf": [{"$ref": "#/components/Text"}]}}, + } + custom = { + CATALOG_COMPONENTS_KEY: { + "CustomComp": {"type": "object", "properties": {"custom": {"type": "string"}}} + }, + "$defs": { + "anyComponent": { + "oneOf": [ + {"$ref": "#/components/CustomComp"}, + {"$ref": "https://a2ui.org/basic_catalog.json#/$defs/anyComponent"}, + ] + } + }, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + one_of = resolved["$defs"]["anyComponent"]["oneOf"] + assert len(one_of) == 2 + refs = {item["$ref"] for item in one_of} + assert "#/components/CustomComp" in refs + assert "#/components/Text" in refs + assert "CustomComp" in resolved[CATALOG_COMPONENTS_KEY] + assert "Text" in resolved[CATALOG_COMPONENTS_KEY] + + +def test_resolve_any_component_without_ref(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + CATALOG_COMPONENTS_KEY: { + "Text": {"type": "object", "properties": {"text": {"type": "string"}}} + }, + "$defs": {"anyComponent": {"oneOf": [{"$ref": "#/components/Text"}]}}, + } + custom = { + CATALOG_COMPONENTS_KEY: { + "CustomComp": {"type": "object", "properties": {"custom": {"type": "string"}}} + }, + "$defs": {"anyComponent": {"oneOf": [{"$ref": "#/components/CustomComp"}]}}, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + one_of = resolved["$defs"]["anyComponent"]["oneOf"] + assert len(one_of) == 1 + assert one_of[0]["$ref"] == "#/components/CustomComp" + assert "CustomComp" in resolved[CATALOG_COMPONENTS_KEY] + assert "Text" not in resolved[CATALOG_COMPONENTS_KEY] + + +def test_resolve_functions_no_ref(): + custom = {"functions": {"customFunc": {"call": "customFunc"}}} + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + "functions": {"required": {"call": "required"}}, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "customFunc" in resolved["functions"] + assert "required" not in resolved["functions"] + + +def test_resolve_functions_with_ref(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + "functions": {"FuncA": {"type": "object"}, "FuncB": {"type": "object"}}, + } + custom = { + "functions": { + "$ref": "https://a2ui.org/basic_catalog.json#/functions", + "FuncC": {"type": "object"}, + } + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "FuncA" in resolved["functions"] + assert "FuncB" in resolved["functions"] + assert "FuncC" in resolved["functions"] + assert "$ref" not in resolved["functions"] + + +def test_resolve_any_function_with_ref(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + "functions": {"FuncA": {"type": "object"}}, + "$defs": {"anyFunction": {"oneOf": [{"$ref": "#/functions/FuncA"}]}}, + } + custom = { + "functions": {"FuncB": {"type": "object"}}, + "$defs": { + "anyFunction": { + "oneOf": [ + {"$ref": "#/functions/FuncB"}, + {"$ref": "https://a2ui.org/basic_catalog.json#/$defs/anyFunction"}, + ] + } + }, + } + resolved = A2uiCatalog.resolve_schema(basic, custom) + one_of = resolved["$defs"]["anyFunction"]["oneOf"] + assert len(one_of) == 2 + refs = {item["$ref"] for item in one_of} + assert "#/functions/FuncA" in refs + assert "#/functions/FuncB" in refs + assert "FuncA" in resolved["functions"] + assert "FuncB" in resolved["functions"] + + +def test_resolve_functions_override(): + basic = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + CATALOG_ID_KEY: "https://a2ui.org/basic_catalog.json", + "functions": {"FuncA": {"properties": {"a": {"type": "string"}}}}, + } + custom = {"functions": {"FuncA": {"properties": {"b": {"type": "string"}}}}} + resolved = A2uiCatalog.resolve_schema(basic, custom) + assert "b" in resolved["functions"]["FuncA"]["properties"] + assert "a" not in resolved["functions"]["FuncA"]["properties"] diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py b/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py new file mode 100644 index 000000000..354286290 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py @@ -0,0 +1,448 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +import io +import pytest +import json +import os +from unittest.mock import patch, MagicMock, PropertyMock +from a2ui.inference.schema.manager import A2uiSchemaManager, A2uiCatalog, CustomCatalogConfig +from a2ui.inference.schema.constants import ( + CATALOG_COMPONENTS_KEY, + INLINE_CATALOG_NAME, + BASIC_CATALOG_NAME, +) +from a2ui.extension.a2ui_extension import INLINE_CATALOGS_KEY, SUPPORTED_CATALOG_IDS_KEY + +test_version = "0.8" + + +@pytest.fixture +def mock_importlib_resources(): + with patch("importlib.resources.files") as mock_files: + yield mock_files + + +def test_schema_manager_init_valid_version(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + + def files_side_effect(package): + if package == f"a2ui.assets.{test_version}": + return mock_traversable + return MagicMock() + + mock_files.side_effect = files_side_effect + + # Mock file open calls for server_to_client and catalog + def joinpath_side_effect(path): + mock_file = MagicMock() + if path == "server_to_client.json": + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "version":' + ' "0.8", "defs": "server_defs"}' + ) + elif path == "standard_catalog_definition.json": + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "version":' + ' "0.8", "components": {"Text": {}}}' + ) + else: + content = '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + manager = A2uiSchemaManager(test_version) + + assert manager._server_to_client_schema["defs"] == "server_defs" + # Basic catalog might have a URI-based ID if not explicitly matched + # So we check if any catalog exists + assert len(manager._supported_catalogs) >= 1 + # The first one should be the basic one + catalog = list(manager._supported_catalogs.values())[0] + assert catalog.catalog_schema["version"] == test_version + assert "Text" in catalog.catalog_schema["components"] + + +def test_schema_manager_fallback_local_assets(mock_importlib_resources): + # Force importlib to fail + mock_importlib_resources.side_effect = FileNotFoundError("Package not found") + + with ( + patch("os.path.exists") as mock_exists, + patch("builtins.open", new_callable=MagicMock) as mock_open, + ): + + def open_side_effect(path, *args, **kwargs): + path_str = str(path) + if "server_to_client" in path_str: + return io.StringIO('{"defs": "local_server"}') + elif "standard_catalog" in path_str or "catalog" in path_str: + return io.StringIO('{"catalogId": "basic", "components": {"LocalText": {}}}') + raise FileNotFoundError(path) + + mock_open.side_effect = open_side_effect + + manager = A2uiSchemaManager(test_version) + + assert manager._server_to_client_schema["defs"] == "local_server" + catalog = list(manager._supported_catalogs.values())[0] + assert "LocalText" in catalog.catalog_schema["components"] + + +def test_schema_manager_init_invalid_version(): + with pytest.raises(ValueError, match="Unknown A2UI specification version"): + A2uiSchemaManager("invalid_version") + + +def test_schema_manager_init_custom_catalog(tmp_path, mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + if "server_to_client" in path: + mock_file.open.return_value.__enter__.return_value = io.StringIO( + '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + ) + elif "catalog" in path: + mock_file.open.return_value.__enter__.return_value = io.StringIO( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "catalogId":' + ' "basic", "components": {}}' + ) + else: + mock_file.open.return_value.__enter__.return_value = io.StringIO( + '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + ) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + d = tmp_path / "custom_catalog.json" + d.write_text( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "catalogId":' + ' "Custom", "components": {"Custom": {}}}', + encoding="utf-8", + ) + + config = CustomCatalogConfig(name="Custom", catalog_path=str(d)) + manager = A2uiSchemaManager(test_version, custom_catalogs=[config]) + + assert len(manager._supported_catalogs) == 2 + assert "basic" in manager._supported_catalogs + assert "Custom" in manager._supported_catalogs + assert "Custom" in manager._supported_catalogs["Custom"].catalog_schema["components"] + + +def test_generate_system_prompt(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + if "server_to_client" in path: + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "type":' + ' "object", "properties": {"server_schema": {"type": "string"}}}' + ) + elif "catalog" in path: + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "catalogId":' + ' "basic", "components": {"Text": {}}}' + ) + else: + content = '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + manager = A2uiSchemaManager("0.8") + prompt = manager.generate_system_prompt( + role_description="You are a helpful assistant.", + workflow_description="Manage workflow.", + ui_description="Render UI.", + client_ui_capabilities={SUPPORTED_CATALOG_IDS_KEY: ["basic"]}, + allowed_components=["Text"], + include_schema=True, + ) + + assert "You are a helpful assistant." in prompt + assert "## Workflow Description:" in prompt + assert "Manage workflow." in prompt + assert "## UI Description:" in prompt + assert "RENDERUI." in prompt.replace(" ", "").upper() + assert "---BEGIN A2UI JSON SCHEMA---" in prompt + assert "### Server To Client Schema:" in prompt + assert "### Catalog Schema" in prompt + assert "---END A2UI JSON SCHEMA---" in prompt + assert '"Text":{}' in prompt.replace(" ", "") + + +def test_generate_system_prompt_with_examples(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + if "catalog" in path: + content = '{"catalogId": "basic", "components": {}}' + else: + content = "{}" + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + manager = A2uiSchemaManager("0.8") + + # Test with examples + with patch("os.path.isdir", return_value=True): + with patch.object( + A2uiCatalog, + "load_examples", + return_value="---BEGIN example1---\n{}\n---END example1---", + ): + prompt = manager.generate_system_prompt("Role description", include_examples=True) + assert "### Examples:" in prompt + assert "example1" in prompt + + # Test without examples + prompt_no_examples = manager.generate_system_prompt("Role description") + assert "## Examples:" not in prompt_no_examples + + +def test_generate_system_prompt_v0_9_common_types(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + content = '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + if path == "common_types.json": + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "types":' + ' {"Common": {}}}' + ) + elif "server_to_client" in path: + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "type":' + ' "object", "properties": {"server_schema": {"type": "string"}}}' + ) + elif "catalog" in path: + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "catalogId":' + ' "basic", "components": {}}' + ) + + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + # Initialize with version 0.9 which expects common types + manager = A2uiSchemaManager("0.9") + + prompt = manager.generate_system_prompt("Role", include_schema=True) + + assert "### Common Types Schema:" in prompt + assert '"types":{"Common":{}}' in prompt.replace(" ", "").replace("\n", "") + + +def test_generate_system_prompt_minimal_args(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + if "catalog" in path: + content = '{"catalogId": "basic", "components": {}}' + else: + content = "{}" + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + + manager = A2uiSchemaManager("0.8") + prompt = manager.generate_system_prompt("Just Role") + + # Check that optional sections are missing + assert "## Workflow Description:" not in prompt + assert "## UI Description:" not in prompt + assert "## Examples:" not in prompt + assert "Just Role" in prompt + assert "---BEGIN A2UI JSON SCHEMA---" not in prompt + + +def test_generate_system_prompt_with_inline_catalog(mock_importlib_resources): + mock_files = mock_importlib_resources + mock_traversable = MagicMock() + mock_files.return_value = mock_traversable + + def joinpath_side_effect(path): + mock_file = MagicMock() + content = '{"$schema": "https://json-schema.org/draft/2020-12/schema"}' + if "catalog" in path: + content = ( + '{"$schema": "https://json-schema.org/draft/2020-12/schema", "catalogId":' + ' "basic", "components": {}}' + ) + mock_file.open.return_value.__enter__.return_value = io.StringIO(content) + return mock_file + + mock_traversable.joinpath.side_effect = joinpath_side_effect + manager = A2uiSchemaManager("0.8", accepts_inline_catalogs=True) + inline_schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalogId": "id_inline", + "components": {"Button": {}}, + } + client_caps = {INLINE_CATALOGS_KEY: [inline_schema]} + + prompt = manager.generate_system_prompt( + "Role", client_ui_capabilities=client_caps, include_schema=True + ) + + assert "Role" in prompt + assert "---BEGIN A2UI JSON SCHEMA---" in prompt + assert ( + '### Catalog Schema:\n{\n "$schema":' + ' "https://json-schema.org/draft/2020-12/schema",\n "catalogId": "id_inline"' + in prompt + ) + assert '"Button": {}' in prompt + + +def test_determine_catalog_logic(): + basic = A2uiCatalog( + version="0.9", + name=BASIC_CATALOG_NAME, + s2c_schema={}, + common_types_schema={}, + catalog_schema={ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalogId": "id_basic", + }, + ) + custom1 = A2uiCatalog( + version="0.9", + name="custom1", + s2c_schema={}, + common_types_schema={}, + catalog_schema={ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalogId": "id_custom1", + }, + ) + custom2 = A2uiCatalog( + version="0.9", + name="custom2", + s2c_schema={}, + common_types_schema={}, + catalog_schema={ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalogId": "id_custom2", + }, + ) + + # Create a mock manager with these catalogs + manager = MagicMock(spec=A2uiSchemaManager) + manager._supported_catalogs = { + basic.catalog_id: basic, + custom1.catalog_id: custom1, + custom2.catalog_id: custom2, + } + manager._version = "0.9" + manager._server_to_client_schema = {"s2c": "schema"} + manager._common_types_schema = {"common": "types"} + manager._basic_catalog = basic + manager._accepts_inline_catalogs = True + + # Rule 1: If supported_catalog_ids is not provided, return the basic catalog + assert A2uiSchemaManager._determine_catalog(manager, {}) == basic + assert A2uiSchemaManager._determine_catalog(manager, None) == basic + + # Rule 2: Exception if both inline and supported IDs are provided + with pytest.raises(ValueError, match="Only one is allowed"): + A2uiSchemaManager._determine_catalog( + manager, + { + INLINE_CATALOGS_KEY: [{"inline": "catalog"}], + SUPPORTED_CATALOG_IDS_KEY: ["id_custom1"], + }, + ) + + # Rule 3: Inline catalog loading + inline_schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "catalogId": "id_inline", + "components": {}, + } + # Mock A2uiCatalog.resolve_schema + with patch.object(A2uiCatalog, "resolve_schema", return_value=inline_schema): + catalog_inline = A2uiSchemaManager._determine_catalog( + manager, {INLINE_CATALOGS_KEY: [inline_schema]} + ) + assert catalog_inline.name == INLINE_CATALOG_NAME + assert catalog_inline.catalog_schema == inline_schema + assert catalog_inline.s2c_schema == manager._server_to_client_schema + assert catalog_inline.common_types_schema == manager._common_types_schema + + # Rule 3b: Inline catalog loading should fail if not accepted. + manager._accepts_inline_catalogs = False + with pytest.raises(ValueError, match="the agent does not accept inline catalogs"): + A2uiSchemaManager._determine_catalog( + manager, {INLINE_CATALOGS_KEY: [inline_schema]} + ) + manager._accepts_inline_catalogs = True + + # Rule 4: Otherwise, find the intersection, return any catalog that matches. + # The priority is determined by the order in supported_catalog_ids. + assert ( + A2uiSchemaManager._determine_catalog( + manager, {SUPPORTED_CATALOG_IDS_KEY: ["id_custom1"]} + ) + == custom1 + ) + assert ( + A2uiSchemaManager._determine_catalog( + manager, {SUPPORTED_CATALOG_IDS_KEY: ["id_custom2", "id_custom1"]} + ) + == custom2 + ) # returns first match in supported list + assert ( + A2uiSchemaManager._determine_catalog( + manager, {SUPPORTED_CATALOG_IDS_KEY: ["id_basic", "id_custom2"]} + ) + == basic + ) # returns first match in supported list (basic is first) + + # Rule 5: Raise ValueError if supported list is non-empty but no match exists + with pytest.raises(ValueError, match="No supported catalog found"): + A2uiSchemaManager._determine_catalog( + manager, {SUPPORTED_CATALOG_IDS_KEY: ["id_not_exists"]} + ) + + assert ( + A2uiSchemaManager._determine_catalog( + manager, {SUPPORTED_CATALOG_IDS_KEY: ["id_basic"]} + ) + == basic + ) diff --git a/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py new file mode 100644 index 000000000..9b039bd43 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py @@ -0,0 +1,45 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.constants import CATALOG_COMPONENTS_KEY + + +def verify(): + print("Verifying A2uiSchemaManager...") + try: + manager = A2uiSchemaManager("0.8") + catalog = manager.get_effective_catalog() + catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] + print(f"Successfully loaded 0.8: {len(catalog_components)} components") + print(f"Components found: {list(catalog_components.keys())[:5]}...") + except Exception as e: + print(f"Failed to load 0.8: {e}") + sys.exit(1) + + try: + manager = A2uiSchemaManager("0.9") + catalog = manager.get_effective_catalog() + catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] + print(f"Successfully loaded 0.9: {len(catalog_components)} components") + print(f"Components found: {list(catalog_components.keys())}...") + except Exception as e: + print(f"Failed to load 0.9: {e}") + sys.exit(1) + + +if __name__ == "__main__": + verify() diff --git a/a2a_agents/python/a2ui_agent/uv.lock b/a2a_agents/python/a2ui_agent/uv.lock index 3c413688b..62f5effd3 100644 --- a/a2a_agents/python/a2ui_agent/uv.lock +++ b/a2a_agents/python/a2ui_agent/uv.lock @@ -485,7 +485,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] 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" } wheels = [ @@ -509,7 +509,7 @@ wheels = [ [[package]] name = "google-adk" -version = "1.22.1" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiosqlite" }, @@ -556,9 +556,9 @@ dependencies = [ { name = "watchdog" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/7e/1fe2704d8079d93bffb5888aa2bd1081251855e8bf14d97f648abd9fd7fa/google_adk-1.22.1.tar.gz", hash = "sha256:4590df0a9340cf05cf5a9899986dfcc3db1c624c6165d76c04be16de535e6404", size = 2046783, upload-time = "2026-01-12T20:50:08.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/25/a8c7058812ae3a6046c1c909da31b4c95a6534f555ec50730fe215b2592c/google_adk-1.23.0.tar.gz", hash = "sha256:07829b3198d412ecddb8b102c6bc9511607a234989b7659be102d806e4c92258", size = 2072294, upload-time = "2026-01-22T23:26:52.352Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/ea/5fee720ca26eff38e338ff0dc1eae4abd06fc712b841333689f5caf4c55f/google_adk-1.22.1-py3-none-any.whl", hash = "sha256:65c921a1343220eb7823ec8972479c046e7d9464f17c0829fb5508551678a9ef", size = 2368855, upload-time = "2026-01-12T20:50:06.087Z" }, + { url = "https://files.pythonhosted.org/packages/60/36/2abbcaad2bd4691863ac05189070c1e9f8d12ec16194f41a975c984883af/google_adk-1.23.0-py3-none-any.whl", hash = "sha256:94b77c9afa39042e77a35c2b3dad7e122d940e065cb5a9ba9e7b5de73786f993", size = 2418796, upload-time = "2026-01-22T23:26:50.289Z" }, ] [[package]] @@ -994,7 +994,7 @@ wheels = [ [[package]] name = "google-genai" -version = "1.59.0" +version = "1.60.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1008,9 +1008,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/40/34/c03bcbc759d67ac3d96077838cdc1eac85417de6ea3b65b313fe53043eee/google_genai-1.59.0.tar.gz", hash = "sha256:0b7a2dc24582850ae57294209d8dfc2c4f5fcfde0a3f11d81dc5aca75fb619e2", size = 487374, upload-time = "2026-01-15T20:29:46.619Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/3f/a753be0dcee352b7d63bc6d1ba14a72591d63b6391dac0cdff7ac168c530/google_genai-1.60.0.tar.gz", hash = "sha256:9768061775fddfaecfefb0d6d7a6cabefb3952ebd246cd5f65247151c07d33d1", size = 487721, upload-time = "2026-01-21T22:17:30.398Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/53/6d00692fe50d73409b3406ae90c71bc4499c8ae7fac377ba16e283da917c/google_genai-1.59.0-py3-none-any.whl", hash = "sha256:59fc01a225d074fe9d1e626c3433da292f33249dadce4deb34edea698305a6df", size = 719099, upload-time = "2026-01-15T20:29:44.604Z" }, + { url = "https://files.pythonhosted.org/packages/31/e5/384b1f383917b5f0ae92e28f47bc27b16e3d26cd9bacb25e9f8ecab3c8fe/google_genai-1.60.0-py3-none-any.whl", hash = "sha256:967338378ffecebec19a8ed90cf8797b26818bacbefd7846a9280beb1099f7f3", size = 719431, upload-time = "2026-01-21T22:17:28.086Z" }, ] [[package]] @@ -1703,11 +1703,11 @@ wheels = [ [[package]] name = "packaging" -version = "25.0" +version = "26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { 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" }, ] [[package]] @@ -1844,11 +1844,11 @@ wheels = [ [[package]] name = "pycparser" -version = "2.23" +version = "3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +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" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, + { 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" }, ] [[package]] @@ -2043,11 +2043,11 @@ crypto = [ [[package]] name = "pyparsing" -version = "3.3.1" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] @@ -2420,51 +2420,58 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.45" +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/be/f9/5e4491e5ccf42f5d9cfc663741d261b3e6e1683ae7812114e7636409fcc6/sqlalchemy-2.0.45.tar.gz", hash = "sha256:1632a4bda8d2d25703fdad6363058d882541bdaaee0e5e3ddfa0cd3229efce88", size = 9869912, upload-time = "2025-12-09T21:05:16.737Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/70/75b1387d72e2847220441166c5eb4e9846dd753895208c13e6d66523b2d9/sqlalchemy-2.0.45-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c64772786d9eee72d4d3784c28f0a636af5b0a29f3fe26ff11f55efe90c0bd85", size = 2154148, upload-time = "2025-12-10T20:03:21.023Z" }, - { url = "https://files.pythonhosted.org/packages/d8/a4/7805e02323c49cb9d1ae5cd4913b28c97103079765f520043f914fca4cb3/sqlalchemy-2.0.45-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7ae64ebf7657395824a19bca98ab10eb9a3ecb026bf09524014f1bb81cb598d4", size = 3233051, upload-time = "2025-12-09T22:06:04.768Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ec/32ae09139f61bef3de3142e85c47abdee8db9a55af2bb438da54a4549263/sqlalchemy-2.0.45-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f02325709d1b1a1489f23a39b318e175a171497374149eae74d612634b234c0", size = 3232781, upload-time = "2025-12-09T22:09:54.435Z" }, - { url = "https://files.pythonhosted.org/packages/ad/bd/bf7b869b6f5585eac34222e1cf4405f4ba8c3b85dd6b1af5d4ce8bca695f/sqlalchemy-2.0.45-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2c3684fca8a05f0ac1d9a21c1f4a266983a7ea9180efb80ffeb03861ecd01a0", size = 3182096, upload-time = "2025-12-09T22:06:06.169Z" }, - { url = "https://files.pythonhosted.org/packages/21/6a/c219720a241bb8f35c88815ccc27761f5af7fdef04b987b0e8a2c1a6dcaa/sqlalchemy-2.0.45-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040f6f0545b3b7da6b9317fc3e922c9a98fc7243b2a1b39f78390fc0942f7826", size = 3205109, upload-time = "2025-12-09T22:09:55.969Z" }, - { url = "https://files.pythonhosted.org/packages/bd/c4/6ccf31b2bc925d5d95fab403ffd50d20d7c82b858cf1a4855664ca054dce/sqlalchemy-2.0.45-cp310-cp310-win32.whl", hash = "sha256:830d434d609fe7bfa47c425c445a8b37929f140a7a44cdaf77f6d34df3a7296a", size = 2114240, upload-time = "2025-12-09T21:29:54.007Z" }, - { url = "https://files.pythonhosted.org/packages/de/29/a27a31fca07316def418db6f7c70ab14010506616a2decef1906050a0587/sqlalchemy-2.0.45-cp310-cp310-win_amd64.whl", hash = "sha256:0209d9753671b0da74da2cfbb9ecf9c02f72a759e4b018b3ab35f244c91842c7", size = 2137615, upload-time = "2025-12-09T21:29:55.85Z" }, - { url = "https://files.pythonhosted.org/packages/a2/1c/769552a9d840065137272ebe86ffbb0bc92b0f1e0a68ee5266a225f8cd7b/sqlalchemy-2.0.45-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e90a344c644a4fa871eb01809c32096487928bd2038bf10f3e4515cb688cc56", size = 2153860, upload-time = "2025-12-10T20:03:23.843Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f8/9be54ff620e5b796ca7b44670ef58bc678095d51b0e89d6e3102ea468216/sqlalchemy-2.0.45-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8c8b41b97fba5f62349aa285654230296829672fc9939cd7f35aab246d1c08b", size = 3309379, upload-time = "2025-12-09T22:06:07.461Z" }, - { url = "https://files.pythonhosted.org/packages/f6/2b/60ce3ee7a5ae172bfcd419ce23259bb874d2cddd44f67c5df3760a1e22f9/sqlalchemy-2.0.45-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12c694ed6468333a090d2f60950e4250b928f457e4962389553d6ba5fe9951ac", size = 3309948, upload-time = "2025-12-09T22:09:57.643Z" }, - { url = "https://files.pythonhosted.org/packages/a3/42/bac8d393f5db550e4e466d03d16daaafd2bad1f74e48c12673fb499a7fc1/sqlalchemy-2.0.45-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f7d27a1d977a1cfef38a0e2e1ca86f09c4212666ce34e6ae542f3ed0a33bc606", size = 3261239, upload-time = "2025-12-09T22:06:08.879Z" }, - { url = "https://files.pythonhosted.org/packages/6f/12/43dc70a0528c59842b04ea1c1ed176f072a9b383190eb015384dd102fb19/sqlalchemy-2.0.45-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d62e47f5d8a50099b17e2bfc1b0c7d7ecd8ba6b46b1507b58cc4f05eefc3bb1c", size = 3284065, upload-time = "2025-12-09T22:09:59.454Z" }, - { url = "https://files.pythonhosted.org/packages/cf/9c/563049cf761d9a2ec7bc489f7879e9d94e7b590496bea5bbee9ed7b4cc32/sqlalchemy-2.0.45-cp311-cp311-win32.whl", hash = "sha256:3c5f76216e7b85770d5bb5130ddd11ee89f4d52b11783674a662c7dd57018177", size = 2113480, upload-time = "2025-12-09T21:29:57.03Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fa/09d0a11fe9f15c7fa5c7f0dd26be3d235b0c0cbf2f9544f43bc42efc8a24/sqlalchemy-2.0.45-cp311-cp311-win_amd64.whl", hash = "sha256:a15b98adb7f277316f2c276c090259129ee4afca783495e212048daf846654b2", size = 2138407, upload-time = "2025-12-09T21:29:58.556Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c7/1900b56ce19bff1c26f39a4ce427faec7716c81ac792bfac8b6a9f3dca93/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3ee2aac15169fb0d45822983631466d60b762085bc4535cd39e66bea362df5f", size = 3333760, upload-time = "2025-12-09T22:11:02.66Z" }, - { url = "https://files.pythonhosted.org/packages/0a/93/3be94d96bb442d0d9a60e55a6bb6e0958dd3457751c6f8502e56ef95fed0/sqlalchemy-2.0.45-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba547ac0b361ab4f1608afbc8432db669bd0819b3e12e29fb5fa9529a8bba81d", size = 3348268, upload-time = "2025-12-09T22:13:49.054Z" }, - { url = "https://files.pythonhosted.org/packages/48/4b/f88ded696e61513595e4a9778f9d3f2bf7332cce4eb0c7cedaabddd6687b/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:215f0528b914e5c75ef2559f69dca86878a3beeb0c1be7279d77f18e8d180ed4", size = 3278144, upload-time = "2025-12-09T22:11:04.14Z" }, - { url = "https://files.pythonhosted.org/packages/ed/6a/310ecb5657221f3e1bd5288ed83aa554923fb5da48d760a9f7622afeb065/sqlalchemy-2.0.45-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:107029bf4f43d076d4011f1afb74f7c3e2ea029ec82eb23d8527d5e909e97aa6", size = 3313907, upload-time = "2025-12-09T22:13:50.598Z" }, - { url = "https://files.pythonhosted.org/packages/5c/39/69c0b4051079addd57c84a5bfb34920d87456dd4c90cf7ee0df6efafc8ff/sqlalchemy-2.0.45-cp312-cp312-win32.whl", hash = "sha256:0c9f6ada57b58420a2c0277ff853abe40b9e9449f8d7d231763c6bc30f5c4953", size = 2112182, upload-time = "2025-12-09T21:39:30.824Z" }, - { url = "https://files.pythonhosted.org/packages/f7/4e/510db49dd89fc3a6e994bee51848c94c48c4a00dc905e8d0133c251f41a7/sqlalchemy-2.0.45-cp312-cp312-win_amd64.whl", hash = "sha256:8defe5737c6d2179c7997242d6473587c3beb52e557f5ef0187277009f73e5e1", size = 2139200, upload-time = "2025-12-09T21:39:32.321Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c8/7cc5221b47a54edc72a0140a1efa56e0a2730eefa4058d7ed0b4c4357ff8/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe187fc31a54d7fd90352f34e8c008cf3ad5d064d08fedd3de2e8df83eb4a1cf", size = 3277082, upload-time = "2025-12-09T22:11:06.167Z" }, - { url = "https://files.pythonhosted.org/packages/0e/50/80a8d080ac7d3d321e5e5d420c9a522b0aa770ec7013ea91f9a8b7d36e4a/sqlalchemy-2.0.45-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:672c45cae53ba88e0dad74b9027dddd09ef6f441e927786b05bec75d949fbb2e", size = 3293131, upload-time = "2025-12-09T22:13:52.626Z" }, - { url = "https://files.pythonhosted.org/packages/da/4c/13dab31266fc9904f7609a5dc308a2432a066141d65b857760c3bef97e69/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:470daea2c1ce73910f08caf10575676a37159a6d16c4da33d0033546bddebc9b", size = 3225389, upload-time = "2025-12-09T22:11:08.093Z" }, - { url = "https://files.pythonhosted.org/packages/74/04/891b5c2e9f83589de202e7abaf24cd4e4fa59e1837d64d528829ad6cc107/sqlalchemy-2.0.45-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9c6378449e0940476577047150fd09e242529b761dc887c9808a9a937fe990c8", size = 3266054, upload-time = "2025-12-09T22:13:54.262Z" }, - { url = "https://files.pythonhosted.org/packages/f1/24/fc59e7f71b0948cdd4cff7a286210e86b0443ef1d18a23b0d83b87e4b1f7/sqlalchemy-2.0.45-cp313-cp313-win32.whl", hash = "sha256:4b6bec67ca45bc166c8729910bd2a87f1c0407ee955df110d78948f5b5827e8a", size = 2110299, upload-time = "2025-12-09T21:39:33.486Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c5/d17113020b2d43073412aeca09b60d2009442420372123b8d49cc253f8b8/sqlalchemy-2.0.45-cp313-cp313-win_amd64.whl", hash = "sha256:afbf47dc4de31fa38fd491f3705cac5307d21d4bb828a4f020ee59af412744ee", size = 2136264, upload-time = "2025-12-09T21:39:36.801Z" }, - { url = "https://files.pythonhosted.org/packages/3d/8d/bb40a5d10e7a5f2195f235c0b2f2c79b0bf6e8f00c0c223130a4fbd2db09/sqlalchemy-2.0.45-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83d7009f40ce619d483d26ac1b757dfe3167b39921379a8bd1b596cf02dab4a6", size = 3521998, upload-time = "2025-12-09T22:13:28.622Z" }, - { url = "https://files.pythonhosted.org/packages/75/a5/346128b0464886f036c039ea287b7332a410aa2d3fb0bb5d404cb8861635/sqlalchemy-2.0.45-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d8a2ca754e5415cde2b656c27900b19d50ba076aa05ce66e2207623d3fe41f5a", size = 3473434, upload-time = "2025-12-09T22:13:30.188Z" }, - { url = "https://files.pythonhosted.org/packages/cc/64/4e1913772646b060b025d3fc52ce91a58967fe58957df32b455de5a12b4f/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f46ec744e7f51275582e6a24326e10c49fbdd3fc99103e01376841213028774", size = 3272404, upload-time = "2025-12-09T22:11:09.662Z" }, - { url = "https://files.pythonhosted.org/packages/b3/27/caf606ee924282fe4747ee4fd454b335a72a6e018f97eab5ff7f28199e16/sqlalchemy-2.0.45-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:883c600c345123c033c2f6caca18def08f1f7f4c3ebeb591a63b6fceffc95cce", size = 3277057, upload-time = "2025-12-09T22:13:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/85/d0/3d64218c9724e91f3d1574d12eb7ff8f19f937643815d8daf792046d88ab/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2c0b74aa79e2deade948fe8593654c8ef4228c44ba862bb7c9585c8e0db90f33", size = 3222279, upload-time = "2025-12-09T22:11:11.1Z" }, - { url = "https://files.pythonhosted.org/packages/24/10/dd7688a81c5bc7690c2a3764d55a238c524cd1a5a19487928844cb247695/sqlalchemy-2.0.45-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8a420169cef179d4c9064365f42d779f1e5895ad26ca0c8b4c0233920973db74", size = 3244508, upload-time = "2025-12-09T22:13:57.932Z" }, - { url = "https://files.pythonhosted.org/packages/aa/41/db75756ca49f777e029968d9c9fee338c7907c563267740c6d310a8e3f60/sqlalchemy-2.0.45-cp314-cp314-win32.whl", hash = "sha256:e50dcb81a5dfe4b7b4a4aa8f338116d127cb209559124f3694c70d6cd072b68f", size = 2113204, upload-time = "2025-12-09T21:39:38.365Z" }, - { url = "https://files.pythonhosted.org/packages/89/a2/0e1590e9adb292b1d576dbcf67ff7df8cf55e56e78d2c927686d01080f4b/sqlalchemy-2.0.45-cp314-cp314-win_amd64.whl", hash = "sha256:4748601c8ea959e37e03d13dcda4a44837afcd1b21338e637f7c935b8da06177", size = 2138785, upload-time = "2025-12-09T21:39:39.503Z" }, - { url = "https://files.pythonhosted.org/packages/42/39/f05f0ed54d451156bbed0e23eb0516bcad7cbb9f18b3bf219c786371b3f0/sqlalchemy-2.0.45-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd337d3526ec5298f67d6a30bbbe4ed7e5e68862f0bf6dd21d289f8d37b7d60b", size = 3522029, upload-time = "2025-12-09T22:13:32.09Z" }, - { url = "https://files.pythonhosted.org/packages/54/0f/d15398b98b65c2bce288d5ee3f7d0a81f77ab89d9456994d5c7cc8b2a9db/sqlalchemy-2.0.45-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9a62b446b7d86a3909abbcd1cd3cc550a832f99c2bc37c5b22e1925438b9367b", size = 3475142, upload-time = "2025-12-09T22:13:33.739Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e1/3ccb13c643399d22289c6a9786c1a91e3dcbb68bce4beb44926ac2c557bf/sqlalchemy-2.0.45-py3-none-any.whl", hash = "sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0", size = 1936672, upload-time = "2025-12-09T21:54:52.608Z" }, +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" }, ] [[package]] From a1b092081249b16f2ce6b078c28cfe4d8ae3a92d Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 19:26:38 +0000 Subject: [PATCH 49/65] feat: Add a A2uiValidator to validate loaded examples (#557) --- a2a_agents/python/a2ui_agent/pyproject.toml | 2 +- .../src/a2ui/inference/inference_strategy.py | 2 + .../src/a2ui/inference/schema/catalog.py | 26 +- .../src/a2ui/inference/schema/constants.py | 1 + .../src/a2ui/inference/schema/manager.py | 9 +- .../src/a2ui/inference/schema/validator.py | 179 ++++++ .../src/a2ui/inference/template/manager.py | 1 + .../tests/inference/test_catalog.py | 12 +- .../tests/inference/test_schema_manager.py | 2 +- .../tests/inference/test_validator.py | 538 ++++++++++++++++ .../tests/integration/verify_load_real.py | 589 +++++++++++++++++- 11 files changed, 1339 insertions(+), 22 deletions(-) create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/validator.py create mode 100644 a2a_agents/python/a2ui_agent/tests/inference/test_validator.py diff --git a/a2a_agents/python/a2ui_agent/pyproject.toml b/a2a_agents/python/a2ui_agent/pyproject.toml index f8e3c9fd5..960a031dd 100644 --- a/a2a_agents/python/a2ui_agent/pyproject.toml +++ b/a2a_agents/python/a2ui_agent/pyproject.toml @@ -12,7 +12,7 @@ dependencies = [ ] [build-system] -requires = ["hatchling"] +requires = ["hatchling", "jsonschema"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py index ed1b0789f..f74db8585 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/inference_strategy.py @@ -28,6 +28,7 @@ def generate_system_prompt( allowed_components: List[str] = [], include_schema: bool = False, include_examples: bool = False, + validate_examples: bool = False, ) -> str: """ Generates a system prompt for all LLM requests. @@ -40,6 +41,7 @@ def generate_system_prompt( allowed_components: List of allowed components. include_schema: Whether to include the schema. include_examples: Whether to include examples. + validate_examples: Whether to validate examples. Returns: The system prompt. diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py index 0a53f1a1a..6dbe5d7df 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/catalog.py @@ -16,12 +16,15 @@ import json import logging import os -from dataclasses import dataclass, replace -from typing import Any, Dict, List, Optional +from dataclasses import dataclass, field, replace +from typing import Any, Dict, List, Optional, TYPE_CHECKING from .constants import CATALOG_COMPONENTS_KEY, CATALOG_ID_KEY from referencing import Registry, Resource +if TYPE_CHECKING: + from .validator import A2uiValidator + @dataclass class CustomCatalogConfig: @@ -56,6 +59,12 @@ def catalog_id(self) -> str: raise ValueError(f"Catalog '{self.name}' missing catalogId") return self.catalog_schema[CATALOG_ID_KEY] + @property + def validator(self) -> "A2uiValidator": + from .validator import A2uiValidator + + return A2uiValidator(self) + def with_pruned_components(self, allowed_components: List[str]) -> "A2uiCatalog": """Returns a new catalog with only allowed components. @@ -123,7 +132,7 @@ def render_as_llm_instructions(self) -> str: return "\n\n".join(all_schemas) - def load_examples(self, path: Optional[str]) -> str: + def load_examples(self, path: Optional[str], validate: bool = False) -> str: """Loads and validates examples from a directory.""" if not path or not os.path.isdir(path): if path: @@ -138,6 +147,8 @@ def load_examples(self, path: Optional[str]) -> str: try: with open(full_path, "r", encoding="utf-8") as f: content = f.read() + if validate and not self._validate_example(full_path, basename, content): + continue merged_examples.append( f"---BEGIN {basename}---\n{content}\n---END {basename}---" ) @@ -253,3 +264,12 @@ def merge_into(target: Dict[str, Any], source: Dict[str, Any]): target["oneOf"] = new_one_of return result + + def _validate_example(self, full_path: str, basename: str, content: str) -> bool: + try: + json_data = json.loads(content) + self.validator.validate(json_data) + except Exception as e: + logging.warning(f"Failed to validate example {full_path}: {e}") + return False + return True diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py index 8a8682090..e3def1e13 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/constants.py @@ -20,6 +20,7 @@ CATALOG_SCHEMA_KEY = "catalog" CATALOG_COMPONENTS_KEY = "components" CATALOG_ID_KEY = "catalogId" +CATALOG_STYLES_KEY = "styles" BASE_SCHEMA_URL = "https://a2ui.org/" BASIC_CATALOG_NAME = "basic" diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py index 106590f00..e9e00cf9e 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py @@ -283,10 +283,12 @@ def get_effective_catalog( pruned_catalog = catalog.with_pruned_components(allowed_components) return pruned_catalog - def load_examples(self, catalog: A2uiCatalog) -> str: + def load_examples(self, catalog: A2uiCatalog, validate: bool = False) -> str: """Loads examples for a catalog.""" if catalog.catalog_id in self._catalog_example_paths: - return catalog.load_examples(self._catalog_example_paths[catalog.catalog_id]) + return catalog.load_examples( + self._catalog_example_paths[catalog.catalog_id], validate=validate + ) return "" def generate_system_prompt( @@ -298,6 +300,7 @@ def generate_system_prompt( allowed_components: List[str] = [], include_schema: bool = False, include_examples: bool = False, + validate_examples: bool = False, ) -> str: """Assembles the final system instruction for the LLM.""" parts = [role_description] @@ -314,7 +317,7 @@ def generate_system_prompt( parts.append(final_catalog.render_as_llm_instructions()) if include_examples: - examples_str = self.load_examples(final_catalog) + examples_str = self.load_examples(final_catalog, validate=validate_examples) if examples_str: parts.append(f"### Examples:\n{examples_str}") diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/validator.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/validator.py new file mode 100644 index 000000000..a42b2052e --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/validator.py @@ -0,0 +1,179 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple + +from jsonschema import Draft202012Validator + +if TYPE_CHECKING: + from .catalog import A2uiCatalog + +from .constants import ( + BASE_SCHEMA_URL, + CATALOG_COMPONENTS_KEY, + CATALOG_ID_KEY, + CATALOG_STYLES_KEY, +) + + +def _inject_additional_properties( + schema: Dict[str, Any], + source_properties: Dict[str, Any], + mapping: Dict[str, str] = None, +) -> Tuple[Dict[str, Any], Set[str]]: + """ + Recursively injects properties from source_properties into nodes with additionalProperties=True and sets additionalProperties=False. + + Args: + schema: The target schema to traverse and patch. + source_properties: A dictionary of top-level property groups (e.g., "components", "styles") from the source schema. + + Returns: + A tuple containing: + - The patched schema. + - A set of keys from source_properties that were injected. + """ + injected_keys = set() + + def recursive_inject(obj): + if isinstance(obj, dict): + new_obj = {} + for k, v in obj.items(): + # If this node has additionalProperties=True, we inject the source properties + if isinstance(v, dict) and v.get("additionalProperties") is True: + if k in source_properties: + injected_keys.add(k) + new_node = dict(v) + new_node["additionalProperties"] = False + new_node["properties"] = { + **new_node.get("properties", {}), + **source_properties[k], + } + new_obj[k] = new_node + else: # No matching source group, keep as is but recurse children + new_obj[k] = recursive_inject(v) + else: # Not a node with additionalProperties, recurse children + new_obj[k] = recursive_inject(v) + return new_obj + elif isinstance(obj, list): + return [recursive_inject(i) for i in obj] + return obj + + return recursive_inject(schema), injected_keys + + +# LLM is instructed to generate a list of messages, so we wrap the bundled schema in an array. +def _wrap_main_schema(schema: Dict[str, Any]) -> Dict[str, Any]: + return {"type": "array", "items": schema} + + +class A2uiValidator: + """Validator for A2UI messages.""" + + def __init__(self, catalog: "A2uiCatalog"): + self._catalog = catalog + self._validator = self._build_validator() + + def _build_validator(self) -> Draft202012Validator: + """Builds a validator for the A2UI schema.""" + + if self._catalog.version == "0.8": + return self._build_0_8_validator() + return self._build_0_9_validator() + + def _bundle_0_8_schemas(self) -> Dict[str, Any]: + if not self._catalog.s2c_schema: + return {} + + bundled = copy.deepcopy(self._catalog.s2c_schema) + + # Prepare catalog components and styles for injection + source_properties = {} + catalog_schema = self._catalog.catalog_schema + if catalog_schema: + if CATALOG_COMPONENTS_KEY in catalog_schema: + # Special mapping for v0.8: "components" -> "component" + source_properties["component"] = catalog_schema[CATALOG_COMPONENTS_KEY] + if CATALOG_STYLES_KEY in catalog_schema: + source_properties[CATALOG_STYLES_KEY] = catalog_schema[CATALOG_STYLES_KEY] + + bundled, _ = _inject_additional_properties(bundled, source_properties) + return bundled + + def _build_0_8_validator(self) -> Draft202012Validator: + """Builds a validator for the A2UI schema version 0.8.""" + bundled_schema = self._bundle_0_8_schemas() + full_schema = _wrap_main_schema(bundled_schema) + return Draft202012Validator(full_schema) + + def _build_0_9_validator(self) -> Draft202012Validator: + """Builds a validator for the A2UI schema version 0.9+.""" + full_schema = _wrap_main_schema(self._catalog.s2c_schema) + + from referencing import Registry, Resource + + # v0.9 schemas (e.g. server_to_client.json) use relative references like + # 'catalog.json#/$defs/anyComponent'. Since server_to_client.json has + # $id: https://a2ui.org/specification/v0_9/server_to_client.json, + # these resolve to https://a2ui.org/specification/v0_9/catalog.json. + # We must register them using these absolute URIs. + base_uri = self._catalog.s2c_schema.get("$id", BASE_SCHEMA_URL) + import os + + def get_sibling_uri(uri, filename): + return os.path.join(os.path.dirname(uri), filename) + + catalog_uri = get_sibling_uri(base_uri, "catalog.json") + common_types_uri = get_sibling_uri(base_uri, "common_types.json") + + resources = [ + ( + common_types_uri, + Resource.from_contents(self._catalog.common_types_schema), + ), + ( + catalog_uri, + Resource.from_contents(self._catalog.catalog_schema), + ), + # Fallbacks for robustness + ("catalog.json", Resource.from_contents(self._catalog.catalog_schema)), + ( + "common_types.json", + Resource.from_contents(self._catalog.common_types_schema), + ), + ] + # Also register the catalog ID if it's different from the catalog URI + if self._catalog.catalog_id and self._catalog.catalog_id != catalog_uri: + resources.append(( + self._catalog.catalog_id, + Resource.from_contents(self._catalog.catalog_schema), + )) + + registry = Registry().with_resources(resources) + validator_schema = copy.deepcopy(full_schema) + validator_schema["$schema"] = "https://json-schema.org/draft/2020-12/schema" + + return Draft202012Validator(validator_schema, registry=registry) + + def validate(self, message: Dict[str, Any]) -> None: + """Validates an A2UI message against the schema.""" + error = next(self._validator.iter_errors(message), None) + if error is not None: + msg = f"Validation failed: {error.message}" + if error.context: + msg += "\nContext failures:" + for sub_error in error.context: + msg += f"\n - {sub_error.message}" + raise ValueError(msg) diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py index 41f5a8ec9..235eb1880 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/template/manager.py @@ -27,6 +27,7 @@ def generate_system_prompt( allowed_components: List[str] = [], include_schema: bool = False, include_examples: bool = False, + validate_examples: bool = False, ) -> str: # TODO: Implementation logic for Template Manager raise NotImplementedError("This method is not yet implemented.") diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py b/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py index 89874db82..f0cf9a7fa 100644 --- a/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_catalog.py @@ -49,8 +49,12 @@ def test_catalog_id_missing_raises_error(): def test_load_examples(tmp_path): example_dir = tmp_path / "examples" example_dir.mkdir() - (example_dir / "example1.json").write_text('{"foo": "bar"}') - (example_dir / "example2.json").write_text('{"baz": "qux"}') + (example_dir / "example1.json").write_text( + '[{"beginRendering": {"surfaceId": "id"}}]' + ) + (example_dir / "example2.json").write_text( + '[{"beginRendering": {"surfaceId": "id"}}]' + ) (example_dir / "ignored.txt").write_text("should not be loaded") catalog = A2uiCatalog( @@ -63,9 +67,9 @@ def test_load_examples(tmp_path): examples_str = catalog.load_examples(str(example_dir)) assert "---BEGIN example1---" in examples_str - assert '{"foo": "bar"}' in examples_str + assert '[{"beginRendering": {"surfaceId": "id"}}]' in examples_str assert "---BEGIN example2---" in examples_str - assert '{"baz": "qux"}' in examples_str + assert '[{"beginRendering": {"surfaceId": "id"}}]' in examples_str assert "ignored" not in examples_str diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py b/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py index 354286290..03b1545d3 100644 --- a/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_schema_manager.py @@ -218,7 +218,7 @@ def joinpath_side_effect(path): return_value="---BEGIN example1---\n{}\n---END example1---", ): prompt = manager.generate_system_prompt("Role description", include_examples=True) - assert "### Examples:" in prompt + assert "### Examples" in prompt assert "example1" in prompt # Test without examples diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_validator.py b/a2a_agents/python/a2ui_agent/tests/inference/test_validator.py new file mode 100644 index 000000000..72f56425d --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_validator.py @@ -0,0 +1,538 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import copy +import pytest +from unittest.mock import MagicMock +from a2ui.inference.schema.manager import A2uiSchemaManager, A2uiCatalog, CustomCatalogConfig + + +class TestValidator: + + @pytest.fixture + def catalog_0_9(self): + s2c_schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://a2ui.org/specification/v0_9/server_to_client.json", + "title": "A2UI Message Schema", + "oneOf": [ + {"$ref": "#/$defs/CreateSurfaceMessage"}, + {"$ref": "#/$defs/UpdateComponentsMessage"}, + ], + "$defs": { + "CreateSurfaceMessage": { + "type": "object", + "properties": { + "version": {"const": "v0.9"}, + "createSurface": { + "type": "object", + "properties": { + "surfaceId": { + "type": "string", + }, + "catalogId": { + "type": "string", + }, + "theme": {"type": "object", "additionalProperties": True}, + }, + "required": ["surfaceId", "catalogId"], + "additionalProperties": False, + }, + }, + "required": ["version", "createSurface"], + "additionalProperties": False, + }, + "UpdateComponentsMessage": { + "type": "object", + "properties": { + "version": {"const": "v0.9"}, + "updateComponents": { + "type": "object", + "properties": { + "surfaceId": { + "type": "string", + }, + "components": { + "type": "array", + "minItems": 1, + "items": {"$ref": "catalog.json#/$defs/anyComponent"}, + }, + }, + "required": ["surfaceId", "components"], + "additionalProperties": False, + }, + }, + "required": ["version", "updateComponents"], + "additionalProperties": False, + }, + "UpdateDataModelMessage": { + "type": "object", + "properties": { + "version": {"const": "v0.9"}, + "updateDataModel": { + "type": "object", + "properties": { + "surfaceId": { + "type": "string", + }, + "value": {"additionalProperties": True}, + }, + "required": ["surfaceId"], + "additionalProperties": False, + }, + }, + "required": ["version", "updateDataModel"], + "additionalProperties": False, + }, + }, + } + catalog_schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://a2ui.org/specification/v0_9/standard_catalog.json", + "title": "A2UI Standard Catalog", + "catalogId": "https://a2ui.dev/specification/v0_9/standard_catalog.json", + "components": { + "Text": { + "type": "object", + "allOf": [ + {"$ref": "common_types.json#/$defs/ComponentCommon"}, + {"$ref": "#/$defs/CatalogComponentCommon"}, + { + "type": "object", + "properties": { + "component": {"const": "Text"}, + "text": {"$ref": "common_types.json#/$defs/DynamicString"}, + "variant": { + "type": "string", + "enum": [ + "h1", + "h2", + "h3", + "h4", + "h5", + "caption", + "body", + ], + }, + }, + "required": ["component", "text"], + }, + ], + }, + "Image": {}, + "Icon": {}, + }, + "theme": {"primaryColor": {"type": "string"}, "iconUrl": {"type": "string"}}, + "$defs": { + "CatalogComponentCommon": { + "type": "object", + "properties": {"weight": {"type": "number"}}, + }, + "anyComponent": { + "oneOf": [ + {"$ref": "#/components/Text"}, + {"$ref": "#/components/Image"}, + {"$ref": "#/components/Icon"}, + ], + "discriminator": {"propertyName": "component"}, + }, + }, + } + common_types_schema = { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://a2ui.org/specification/v0_9/common_types.json", + "title": "A2UI Common Types", + "$defs": { + "ComponentId": { + "type": "string", + }, + "AccessibilityAttributes": { + "type": "object", + "properties": { + "label": { + "$ref": "#/$defs/DynamicString", + } + }, + }, + "ComponentCommon": { + "type": "object", + "properties": {"id": {"$ref": "#/$defs/ComponentId"}}, + "required": ["id"], + }, + "DataBinding": {"type": "object"}, + "DynamicString": { + "anyOf": [{"type": "string"}, {"$ref": "#/$defs/DataBinding"}] + }, + "DynamicValue": { + "anyOf": [ + {"type": "object"}, + {"type": "array"}, + {"$ref": "#/$defs/DataBinding"}, + ] + }, + "DynamicNumber": { + "anyOf": [{"type": "number"}, {"$ref": "#/$defs/DataBinding"}] + }, + "ChildList": { + "oneOf": [ + {"type": "array", "items": {"type": "string"}}, + {"$ref": "#/$defs/DataBinding"}, + ] + }, + }, + } + return A2uiCatalog( + version="0.9", + name="standard", + catalog_schema=catalog_schema, + s2c_schema=s2c_schema, + common_types_schema=common_types_schema, + ) + + @pytest.fixture + def catalog_0_8(self): + s2c_schema = { + "title": "A2UI Message Schema", + "description": "Describes a JSON payload for an A2UI message.", + "type": "object", + "additionalProperties": False, + "properties": { + "beginRendering": { + "type": "object", + "additionalProperties": False, + "properties": { + "surfaceId": {"type": "string"}, + "styles": { + "type": "object", + "description": "Styling information for the UI.", + "additionalProperties": True, + }, + }, + "required": ["surfaceId"], + }, + "surfaceUpdate": { + "type": "object", + "additionalProperties": False, + "properties": { + "surfaceId": { + "type": "string", + }, + "components": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": False, + "properties": { + "id": { + "type": "string", + }, + "component": { + "type": "object", + "description": "A wrapper object.", + "additionalProperties": True, + }, + }, + "required": ["id", "component"], + }, + }, + }, + }, + "required": ["surfaceId", "components"], + }, + } + catalog_schema = { + "catalogId": ( + "https://a2ui.org/specification/v0_8/json/standard_catalog_definition.json" + ), + "components": {"Text": {"type": "object"}, "Button": {"type": "object"}}, + "styles": {"font": {"type": "string"}, "primaryColor": {"type": "string"}}, + } + return A2uiCatalog( + version="0.8", + name="standard", + catalog_schema=catalog_schema, + s2c_schema=s2c_schema, + common_types_schema=None, + ) + + def test_validator_0_9(self, catalog_0_9): + # v0.9+ uses Registry and referencing, not monolithic bundling. + # We test by validating a sample message. + message = [{ + "version": "v0.9", + "createSurface": { + "surfaceId": "test-id", + "catalogId": "standard", + "theme": {"primaryColor": "blue", "iconUrl": "http://img"}, + }, + }] + # Should not raise exception + catalog_0_9.validator.validate(message) + + # Test failure: version is missing + invalid_message = [{"createSurface": {"surfaceId": "123", "catalogId": "standard"}}] + # Note: version is missing in the message object + with pytest.raises(ValueError) as excinfo: + catalog_0_9.validator.validate(invalid_message) + assert "'version' is a required property" in str(excinfo.value) + + # Test failure: wrong version const + invalid_message = [{ + "version": "0.9", + "createSurface": {"surfaceId": "123", "catalogId": "standard"}, + }] + with pytest.raises(ValueError) as excinfo: + catalog_0_9.validator.validate(invalid_message) + assert "'v0.9' was expected" in str(excinfo.value) + + # Test failure: surfaceId must be string + invalid_message = [{ + "version": "v0.9", + "createSurface": {"surfaceId": 123, "catalogId": "standard"}, + }] + with pytest.raises(ValueError) as excinfo: + catalog_0_9.validator.validate(invalid_message) + assert "123 is not of type 'string'" in str(excinfo.value) + + # Test failure: catalogId is missing + invalid_message = [{"version": "v0.9", "createSurface": {"surfaceId": "123"}}] + with pytest.raises(ValueError) as excinfo: + catalog_0_9.validator.validate(invalid_message) + assert "'catalogId' is a required property" in str(excinfo.value) + + def test_validator_0_8(self, catalog_0_8): + # v0.8 uses monolithic bundling for validation + message = [{ + "beginRendering": { + "surfaceId": "test-id", + "styles": {"primaryColor": "#ff0000"}, + } + }] + # Should not raise exception + catalog_0_8.validator.validate(message) + + # Test failure: surfaceId must be string + invalid_message = [{"beginRendering": {"surfaceId": 123}}] + with pytest.raises(ValueError) as excinfo: + catalog_0_8.validator.validate(invalid_message) + assert "123 is not of type 'string'" in str(excinfo.value) + + # Test failure: styles must be object + invalid_message = [ + {"beginRendering": {"surfaceId": "id", "styles": "not-an-object"}} + ] + with pytest.raises(ValueError) as excinfo: + catalog_0_8.validator.validate(invalid_message) + assert "'not-an-object' is not of type 'object'" in str(excinfo.value) + + def test_custom_catalog_0_8(self, catalog_0_8): + """Tests validation with a custom catalog in v0.8.""" + custom_components = { + "Canvas": { + "type": "object", + "properties": { + "children": { + "type": "object", + "properties": { + "explicitList": {"type": "array", "items": {"type": "string"}} + }, + "required": ["explicitList"], + } + }, + "required": ["children"], + }, + "Chart": { + "type": "object", + "properties": { + "type": {"type": "string", "enum": ["doughnut", "pie"]}, + "title": { + "type": "object", + "properties": { + "literalString": {"type": "string"}, + "path": {"type": "string"}, + }, + }, + "chartData": { + "type": "object", + "properties": { + "literalArray": {"type": "array"}, + "path": {"type": "string"}, + }, + }, + }, + "required": ["type", "chartData"], + }, + "GoogleMap": { + "type": "object", + "properties": { + "center": { + "type": "object", + "properties": { + "literalObject": {"type": "object"}, + "path": {"type": "string"}, + }, + }, + "zoom": { + "type": "object", + "properties": { + "literalNumber": {"type": "number"}, + "path": {"type": "string"}, + }, + }, + }, + "required": ["center", "zoom"], + }, + } + + # Create a new catalog with these components + catalog_schema = copy.deepcopy(catalog_0_8.catalog_schema) + catalog_schema["components"] = custom_components + + custom_catalog = A2uiCatalog( + version="0.8", + name="custom", + catalog_schema=catalog_schema, + s2c_schema=catalog_0_8.s2c_schema, + common_types_schema=None, + ) + + # Valid message + message = [{ + "surfaceUpdate": { + "surfaceId": "id1", + "components": [ + { + "id": "c1", + "component": {"Canvas": {"children": {"explicitList": ["item1"]}}}, + }, + { + "id": "c2", + "component": { + "Chart": {"type": "pie", "chartData": {"path": "/data"}} + }, + }, + ], + } + }] + custom_catalog.validator.validate(message) + + def test_custom_catalog_0_9(self, catalog_0_9): + """Tests validation with a custom catalog in v0.9.""" + # Use the existing catalog_0_9 fixture but override its catalog_schema + # to include the custom components. + custom_components = { + "Canvas": { + "type": "object", + "allOf": [ + {"$ref": "common_types.json#/$defs/ComponentCommon"}, + {"$ref": "#/$defs/CatalogComponentCommon"}, + { + "type": "object", + "properties": { + "component": {"const": "Canvas"}, + "children": {"$ref": "common_types.json#/$defs/ChildList"}, + }, + "required": ["component", "children"], + }, + ], + }, + "Chart": { + "type": "object", + "allOf": [ + {"$ref": "common_types.json#/$defs/ComponentCommon"}, + {"$ref": "#/$defs/CatalogComponentCommon"}, + { + "type": "object", + "properties": { + "component": {"const": "Chart"}, + "chartType": {"enum": ["doughnut", "pie"]}, + "title": {"$ref": "common_types.json#/$defs/DynamicString"}, + "chartData": {"$ref": "common_types.json#/$defs/DynamicValue"}, + }, + "required": ["component", "chartType", "chartData"], + }, + ], + }, + "GoogleMap": { + "type": "object", + "allOf": [ + {"$ref": "common_types.json#/$defs/ComponentCommon"}, + {"$ref": "#/$defs/CatalogComponentCommon"}, + { + "type": "object", + "properties": { + "component": {"const": "GoogleMap"}, + "center": {"$ref": "common_types.json#/$defs/DynamicValue"}, + "zoom": {"$ref": "common_types.json#/$defs/DynamicNumber"}, + "pins": {"$ref": "common_types.json#/$defs/DynamicValue"}, + }, + "required": ["component", "center", "zoom"], + }, + ], + }, + } + + # Create a new catalog with these components + catalog_schema = copy.deepcopy(catalog_0_9.catalog_schema) + catalog_schema["components"] = custom_components + # Update anyComponent to include them + catalog_schema["$defs"]["anyComponent"]["oneOf"] = [ + {"$ref": "#/components/Canvas"}, + {"$ref": "#/components/Chart"}, + {"$ref": "#/components/GoogleMap"}, + ] + + custom_catalog = A2uiCatalog( + version="0.9", + name="custom", + catalog_schema=catalog_schema, + s2c_schema=catalog_0_9.s2c_schema, + common_types_schema=catalog_0_9.common_types_schema, + ) + + # Valid message + message = [{ + "version": "v0.9", + "updateComponents": { + "surfaceId": "s1", + "components": [ + {"id": "c1", "component": "Canvas", "children": ["child1"]}, + { + "id": "c2", + "component": "Chart", + "chartType": "doughnut", + "chartData": {"path": "/data"}, + }, + ], + }, + }] + custom_catalog.validator.validate(message) + + def test_bundle_0_8(self, catalog_0_8): + bundled = catalog_0_8.validator._bundle_0_8_schemas() + + # Verify styles injection + styles_node = bundled["properties"]["beginRendering"]["properties"]["styles"] + assert styles_node["additionalProperties"] is False + assert "font" in styles_node["properties"] + assert "primaryColor" in styles_node["properties"] + + # Verify component injection + component_node = bundled["properties"]["surfaceUpdate"]["properties"]["components"][ + "items" + ]["properties"]["component"] + assert component_node["additionalProperties"] is False + assert "Text" in component_node["properties"] + assert "Button" in component_node["properties"] diff --git a/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py index 9b039bd43..eecc7d6b7 100644 --- a/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py +++ b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py @@ -19,27 +19,596 @@ def verify(): - print("Verifying A2uiSchemaManager...") + print('Verifying A2uiSchemaManager...') try: - manager = A2uiSchemaManager("0.8") + manager = A2uiSchemaManager('0.8') catalog = manager.get_effective_catalog() catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] - print(f"Successfully loaded 0.8: {len(catalog_components)} components") - print(f"Components found: {list(catalog_components.keys())[:5]}...") + print(f'Successfully loaded 0.8: {len(catalog_components)} components') + print(f'Components found: {list(catalog_components.keys())[:5]}...') + + a2ui_message = [ + {'beginRendering': {'surfaceId': 'contact-card', 'root': 'main_card'}}, + { + 'surfaceUpdate': { + 'surfaceId': 'contact-card', + 'components': [ + { + 'id': 'profile_image', + 'component': { + 'Image': { + 'url': {'path': 'imageUrl'}, + 'usageHint': 'avatar', + 'fit': 'cover', + } + }, + }, + { + 'id': 'user_heading', + 'weight': 1, + 'component': { + 'Text': {'text': {'path': 'name'}, 'usageHint': 'h2'} + }, + }, + { + 'id': 'description_text_1', + 'component': {'Text': {'text': {'path': 'title'}}}, + }, + { + 'id': 'description_text_2', + 'component': {'Text': {'text': {'path': 'team'}}}, + }, + { + 'id': 'description_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'user_heading', + 'description_text_1', + 'description_text_2', + ] + }, + 'alignment': 'center', + } + }, + }, + { + 'id': 'calendar_icon', + 'component': { + 'Icon': {'name': {'literalString': 'calendarToday'}} + }, + }, + { + 'id': 'calendar_primary_text', + 'component': { + 'Text': {'usageHint': 'h5', 'text': {'path': 'calendar'}} + }, + }, + { + 'id': 'calendar_secondary_text', + 'component': {'Text': {'text': {'literalString': 'Calendar'}}}, + }, + { + 'id': 'calendar_text_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'calendar_primary_text', + 'calendar_secondary_text', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'info_row_1', + 'component': { + 'Row': { + 'children': { + 'explicitList': [ + 'calendar_icon', + 'calendar_text_column', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'location_icon', + 'component': { + 'Icon': {'name': {'literalString': 'locationOn'}} + }, + }, + { + 'id': 'location_primary_text', + 'component': { + 'Text': {'usageHint': 'h5', 'text': {'path': 'location'}} + }, + }, + { + 'id': 'location_secondary_text', + 'component': {'Text': {'text': {'literalString': 'Location'}}}, + }, + { + 'id': 'location_text_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'location_primary_text', + 'location_secondary_text', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'info_row_2', + 'component': { + 'Row': { + 'children': { + 'explicitList': [ + 'location_icon', + 'location_text_column', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'mail_icon', + 'component': {'Icon': {'name': {'literalString': 'mail'}}}, + }, + { + 'id': 'mail_primary_text', + 'component': { + 'Text': {'usageHint': 'h5', 'text': {'path': 'email'}} + }, + }, + { + 'id': 'mail_secondary_text', + 'component': {'Text': {'text': {'literalString': 'Email'}}}, + }, + { + 'id': 'mail_text_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'mail_primary_text', + 'mail_secondary_text', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'info_row_3', + 'component': { + 'Row': { + 'children': { + 'explicitList': ['mail_icon', 'mail_text_column'] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + {'id': 'div', 'component': {'Divider': {}}}, + { + 'id': 'call_icon', + 'component': {'Icon': {'name': {'literalString': 'call'}}}, + }, + { + 'id': 'call_primary_text', + 'component': { + 'Text': {'usageHint': 'h5', 'text': {'path': 'mobile'}} + }, + }, + { + 'id': 'call_secondary_text', + 'component': {'Text': {'text': {'literalString': 'Mobile'}}}, + }, + { + 'id': 'call_text_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'call_primary_text', + 'call_secondary_text', + ] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'info_row_4', + 'component': { + 'Row': { + 'children': { + 'explicitList': ['call_icon', 'call_text_column'] + }, + 'distribution': 'start', + 'alignment': 'start', + } + }, + }, + { + 'id': 'info_rows_column', + 'weight': 1, + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'info_row_1', + 'info_row_2', + 'info_row_3', + 'info_row_4', + ] + }, + 'alignment': 'stretch', + } + }, + }, + { + 'id': 'button_1_text', + 'component': {'Text': {'text': {'literalString': 'Follow'}}}, + }, + { + 'id': 'button_1', + 'component': { + 'Button': { + 'child': 'button_1_text', + 'primary': True, + 'action': {'name': 'follow_contact'}, + } + }, + }, + { + 'id': 'button_2_text', + 'component': {'Text': {'text': {'literalString': 'Message'}}}, + }, + { + 'id': 'button_2', + 'component': { + 'Button': { + 'child': 'button_2_text', + 'primary': False, + 'action': {'name': 'send_message'}, + } + }, + }, + { + 'id': 'action_buttons_row', + 'component': { + 'Row': { + 'children': {'explicitList': ['button_1', 'button_2']}, + 'distribution': 'center', + 'alignment': 'center', + } + }, + }, + { + 'id': 'link_text', + 'component': { + 'Text': { + 'text': { + 'literalString': '[View Full Profile](/profile)' + } + } + }, + }, + { + 'id': 'link_text_wrapper', + 'component': { + 'Row': { + 'children': {'explicitList': ['link_text']}, + 'distribution': 'center', + 'alignment': 'center', + } + }, + }, + { + 'id': 'main_column', + 'component': { + 'Column': { + 'children': { + 'explicitList': [ + 'profile_image', + 'description_column', + 'div', + 'info_rows_column', + 'action_buttons_row', + 'link_text_wrapper', + ] + }, + 'alignment': 'stretch', + } + }, + }, + { + 'id': 'main_card', + 'component': {'Card': {'child': 'main_column'}}, + }, + ], + } + }, + { + 'dataModelUpdate': { + 'surfaceId': 'contact-card', + 'path': '/', + 'contents': [ + {'key': 'name', 'valueString': 'Casey Smith'}, + {'key': 'title', 'valueString': 'Digital Marketing Specialist'}, + {'key': 'team', 'valueString': 'Growth Team'}, + {'key': 'location', 'valueString': 'New York'}, + {'key': 'email', 'valueString': 'casey.smith@example.com'}, + {'key': 'mobile', 'valueString': '+1 (415) 222-3333'}, + {'key': 'calendar', 'valueString': 'In a meeting'}, + { + 'key': 'imageUrl', + 'valueString': 'http://localhost:10003/static/profile2.png', + }, + ], + } + }, + ] + catalog.validator.validate(a2ui_message) + print('Validation successful') except Exception as e: - print(f"Failed to load 0.8: {e}") + print(f'Failed to load 0.8: {e}') sys.exit(1) try: - manager = A2uiSchemaManager("0.9") + manager = A2uiSchemaManager('0.9') catalog = manager.get_effective_catalog() catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] - print(f"Successfully loaded 0.9: {len(catalog_components)} components") - print(f"Components found: {list(catalog_components.keys())}...") + print(f'Successfully loaded 0.9: {len(catalog_components)} components') + print(f'Components found: {list(catalog_components.keys())}...') + + a2ui_message = [ + { + 'version': 'v0.9', + 'createSurface': { + 'surfaceId': 'contact_form_1', + 'catalogId': ( + 'https://a2ui.dev/specification/v0_9/standard_catalog.json' + ), + }, + }, + { + 'version': 'v0.9', + 'updateComponents': { + 'surfaceId': 'contact_form_1', + 'components': [ + {'id': 'root', 'component': 'Card', 'child': 'form_container'}, + { + 'id': 'form_container', + 'component': 'Column', + 'children': [ + 'header_row', + 'name_row', + 'email_group', + 'phone_group', + 'pref_group', + 'divider_1', + 'newsletter_checkbox', + 'submit_button', + ], + 'justify': 'start', + 'align': 'stretch', + }, + { + 'id': 'header_row', + 'component': 'Row', + 'children': ['header_icon', 'header_text'], + 'align': 'center', + }, + {'id': 'header_icon', 'component': 'Icon', 'name': 'mail'}, + { + 'id': 'header_text', + 'component': 'Text', + 'text': '# Contact Us', + 'variant': 'h2', + }, + { + 'id': 'name_row', + 'component': 'Row', + 'children': ['first_name_group', 'last_name_group'], + 'justify': 'spaceBetween', + }, + { + 'id': 'first_name_group', + 'component': 'Column', + 'children': ['first_name_label', 'first_name_field'], + 'weight': 1, + }, + { + 'id': 'first_name_label', + 'component': 'Text', + 'text': 'First Name', + 'variant': 'caption', + }, + { + 'id': 'first_name_field', + 'component': 'TextField', + 'label': 'First Name', + 'value': {'path': '/contact/firstName'}, + 'variant': 'shortText', + }, + { + 'id': 'last_name_group', + 'component': 'Column', + 'children': ['last_name_label', 'last_name_field'], + 'weight': 1, + }, + { + 'id': 'last_name_label', + 'component': 'Text', + 'text': 'Last Name', + 'variant': 'caption', + }, + { + 'id': 'last_name_field', + 'component': 'TextField', + 'label': 'Last Name', + 'value': {'path': '/contact/lastName'}, + 'variant': 'shortText', + }, + { + 'id': 'email_group', + 'component': 'Column', + 'children': ['email_label', 'email_field'], + }, + { + 'id': 'email_label', + 'component': 'Text', + 'text': 'Email Address', + 'variant': 'caption', + }, + { + 'id': 'email_field', + 'component': 'TextField', + 'label': 'Email', + 'value': {'path': '/contact/email'}, + 'variant': 'shortText', + 'checks': [ + { + 'condition': { + 'call': 'required', + 'args': {'value': {'path': '/contact/email'}}, + }, + 'message': 'Email is required.', + }, + { + 'condition': { + 'call': 'email', + 'args': {'value': {'path': '/contact/email'}}, + }, + 'message': 'Please enter a valid email address.', + }, + ], + }, + { + 'id': 'phone_group', + 'component': 'Column', + 'children': ['phone_label', 'phone_field'], + }, + { + 'id': 'phone_label', + 'component': 'Text', + 'text': 'Phone Number', + 'variant': 'caption', + }, + { + 'id': 'phone_field', + 'component': 'TextField', + 'label': 'Phone', + 'value': {'path': '/contact/phone'}, + 'variant': 'shortText', + 'checks': [{ + 'condition': { + 'call': 'regex', + 'args': { + 'value': {'path': '/contact/phone'}, + 'pattern': '^\\d{10}$', + }, + }, + 'message': 'Phone number must be 10 digits.', + }], + }, + { + 'id': 'pref_group', + 'component': 'Column', + 'children': ['pref_label', 'pref_picker'], + }, + { + 'id': 'pref_label', + 'component': 'Text', + 'text': 'Preferred Contact Method', + 'variant': 'caption', + }, + { + 'id': 'pref_picker', + 'component': 'ChoicePicker', + 'variant': 'mutuallyExclusive', + 'options': [ + {'label': 'Email', 'value': 'email'}, + {'label': 'Phone', 'value': 'phone'}, + {'label': 'SMS', 'value': 'sms'}, + ], + 'value': {'path': '/contact/preference'}, + }, + {'id': 'divider_1', 'component': 'Divider', 'axis': 'horizontal'}, + { + 'id': 'newsletter_checkbox', + 'component': 'CheckBox', + 'label': 'Subscribe to our newsletter', + 'value': {'path': '/contact/subscribe'}, + }, + { + 'id': 'submit_button_label', + 'component': 'Text', + 'text': 'Send Message', + }, + { + 'id': 'submit_button', + 'component': 'Button', + 'child': 'submit_button_label', + 'variant': 'primary', + 'action': { + 'event': { + 'name': 'submitContactForm', + 'context': { + 'formId': 'contact_form_1', + 'isNewsletterSubscribed': { + 'path': '/contact/subscribe' + }, + }, + } + }, + }, + ], + }, + }, + { + 'version': 'v0.9', + 'updateDataModel': { + 'surfaceId': 'contact_form_1', + 'path': '/contact', + 'value': { + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'john.doe@example.com', + 'phone': '1234567890', + 'preference': ['email'], + 'subscribe': True, + }, + }, + }, + {'version': 'v0.9', 'deleteSurface': {'surfaceId': 'contact_form_1'}}, + ] + catalog.validator.validate(a2ui_message) + print('Validation successful') except Exception as e: - print(f"Failed to load 0.9: {e}") + print(f'Failed to load 0.9: {e}') sys.exit(1) -if __name__ == "__main__": +if __name__ == '__main__': verify() From d5e3314ec53e10e96f068893ac11efb0dc46a19c Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 21:06:44 +0000 Subject: [PATCH 50/65] Update the agent/contact_lookup sample to use the a2ui-agent python SDK (#559) Tested: - [x] The contact_lookup client successfully connected to the contact_lookup agent and rendered the response correctly. --- .../src/a2ui/inference/schema/manager.py | 7 +- samples/agent/adk/contact_lookup/__main__.py | 36 +- .../agent/adk/contact_lookup/a2ui_examples.py | 162 ---- .../agent/adk/contact_lookup/a2ui_schema.py | 788 ------------------ samples/agent/adk/contact_lookup/agent.py | 84 +- .../adk/contact_lookup/agent_executor.py | 6 +- .../examples/action_confirmation.json | 23 + .../contact_lookup/examples/contact_card.json | 54 ++ .../contact_lookup/examples/contact_list.json | 232 ++++++ .../examples/follow_success.json | 60 ++ .../adk/contact_lookup/prompt_builder.py | 117 +-- samples/agent/adk/uv.lock | 2 +- 12 files changed, 478 insertions(+), 1093 deletions(-) delete mode 100644 samples/agent/adk/contact_lookup/a2ui_examples.py delete mode 100644 samples/agent/adk/contact_lookup/a2ui_schema.py create mode 100644 samples/agent/adk/contact_lookup/examples/action_confirmation.json create mode 100644 samples/agent/adk/contact_lookup/examples/contact_card.json create mode 100644 samples/agent/adk/contact_lookup/examples/contact_list.json create mode 100644 samples/agent/adk/contact_lookup/examples/follow_success.json diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py index e9e00cf9e..cec03ca58 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py @@ -36,7 +36,8 @@ find_repo_root, ) from .catalog import CustomCatalogConfig, A2uiCatalog -from ...extension.a2ui_extension import INLINE_CATALOGS_KEY, SUPPORTED_CATALOG_IDS_KEY +from ...extension.a2ui_extension import INLINE_CATALOGS_KEY, SUPPORTED_CATALOG_IDS_KEY, get_a2ui_agent_extension +from a2a.types import AgentExtension def _load_basic_component(version: str, spec_name: str) -> Dict: @@ -322,3 +323,7 @@ def generate_system_prompt( parts.append(f"### Examples:\n{examples_str}") return "\n\n".join(parts) + + def get_agent_extension(self) -> AgentExtension: + catalog_ids = self._supported_catalogs.keys() + return get_a2ui_agent_extension(supported_catalog_ids=list(catalog_ids)) diff --git a/samples/agent/adk/contact_lookup/__main__.py b/samples/agent/adk/contact_lookup/__main__.py index 13b76a9a1..69ac07eb0 100644 --- a/samples/agent/adk/contact_lookup/__main__.py +++ b/samples/agent/adk/contact_lookup/__main__.py @@ -19,8 +19,6 @@ from a2a.server.apps import A2AStarletteApplication from a2a.server.request_handlers import DefaultRequestHandler from a2a.server.tasks import InMemoryTaskStore -from a2a.types import AgentCapabilities, AgentCard, AgentSkill -from a2ui.extension.a2ui_extension import get_a2ui_agent_extension from agent import ContactAgent from agent_executor import ContactAgentExecutor from dotenv import load_dotenv @@ -50,44 +48,18 @@ def main(host, port): " is not TRUE." ) - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], - ) - skill = AgentSkill( - id="find_contact", - name="Find Contact Tool", - description=( - "Helps find contact information for colleagues (e.g., email, location," - " team)." - ), - tags=["contact", "directory", "people", "finder"], - examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], - ) - base_url = f"http://{host}:{port}" + ui_agent = ContactAgent(base_url=base_url, use_ui=True) + text_agent = ContactAgent(base_url=base_url, use_ui=False) - agent_card = AgentCard( - name="Contact Lookup Agent", - description=( - "This agent helps find contact info for people in your organization." - ), - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) - - agent_executor = ContactAgentExecutor(base_url=base_url) + agent_executor = ContactAgentExecutor(ui_agent=ui_agent, text_agent=text_agent) request_handler = DefaultRequestHandler( agent_executor=agent_executor, task_store=InMemoryTaskStore(), ) server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler + agent_card=ui_agent.get_agent_card(), http_handler=request_handler ) import uvicorn diff --git a/samples/agent/adk/contact_lookup/a2ui_examples.py b/samples/agent/adk/contact_lookup/a2ui_examples.py deleted file mode 100644 index dcf74210a..000000000 --- a/samples/agent/adk/contact_lookup/a2ui_examples.py +++ /dev/null @@ -1,162 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# a2ui_examples.py - -CONTACT_UI_EXAMPLES = """ ----BEGIN CONTACT_LIST_EXAMPLE--- -[ - { "beginRendering": { "surfaceId": "contact-list", "root": "root-column", "styles": { "primaryColor": "#007BFF", "font": "Roboto" } } }, - { "surfaceUpdate": { - "surfaceId": "contact-list", - "components": [ - { "id": "root-column", "component": { "Column": { "children": { "explicitList": ["title-heading", "item-list"] } } } }, - { "id": "title-heading", "component": { "Text": { "usageHint": "h1", "text": { "literalString": "Found Contacts" } } } }, - { "id": "item-list", "component": { "List": { "direction": "vertical", "children": { "template": { "componentId": "item-card-template", "dataBinding": "/contacts" } } } } }, - { "id": "item-card-template", "component": { "Card": { "child": "card-layout" } } }, - { "id": "card-layout", "component": { "Row": { "children": { "explicitList": ["template-image", "card-details", "view-button"] }, "alignment": "center" } } }, - { "id": "template-image", "component": { "Image": { "url": { "path": "imageUrl" }, "fit": "cover" } } }, - { "id": "card-details", "component": { "Column": { "children": { "explicitList": ["template-name", "template-title"] } } } }, - { "id": "template-name", "component": { "Text": { "usageHint": "h3", "text": { "path": "name" } } } }, - { "id": "template-title", "component": { "Text": { "text": { "path": "title" } } } }, - { "id": "view-button-text", "component": { "Text": { "text": { "literalString": "View" } } } }, - { "id": "view-button", "component": { "Button": { "child": "view-button-text", "primary": true, "action": { "name": "view_profile", "context": [ { "key": "contactName", "value": { "path": "name" } }, { "key": "department", "value": { "path": "department" } } ] } } } } - ] - } }, - { "dataModelUpdate": { - "surfaceId": "contact-list", - "path": "/", - "contents": [ - {{ "key": "contacts", "valueMap": [ - {{ "key": "contact1", "valueMap": [ - {{ "key": "name", "valueString": "Alice Wonderland" }}, - {{ "key": "phone", "valueString": "+1-555-123-4567" }}, - {{ "key": "email", "valueString": "alice@example.com" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/alice.jpg" }}, - {{ "key": "title", "valueString": "Mad Hatter" }}, - {{ "key": "department", "valueString": "Wonderland" }} - ] }}, - {{ "key": "contact2", "valueMap": [ - {{ "key": "name", "valueString": "Bob The Builder" }}, - {{ "key": "phone", "valueString": "+1-555-765-4321" }}, - {{ "key": "email", "valueString": "bob@example.com" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/bob.jpg" }}, - {{ "key": "title", "valueString": "Construction" }}, - {{ "key": "department", "valueString": "Building" }} - ] }} - ] }} - ] - } } -] ----END CONTACT_LIST_EXAMPLE--- - ----BEGIN CONTACT_CARD_EXAMPLE--- - -[ - { "beginRendering": { "surfaceId":"contact-card","root":"main_card"} }, - { "surfaceUpdate": { "surfaceId":"contact-card", - "components":[ - { "id": "profile_image", "component": { "Image": { "url": { "path": "imageUrl"}, "usageHint": "avatar", "fit": "cover" } } } , - { "id": "user_heading", "weight": 1, "component": { "Text": { "text": { "path": "name"} , "usageHint": "h2"} } } , - { "id": "description_text_1", "component": { "Text": { "text": { "path": "title"} } } } , - { "id": "description_text_2", "component": { "Text": { "text": { "path": "team"} } } } , - { "id": "description_column", "component": { "Column": { "children": { "explicitList": ["user_heading", "description_text_1", "description_text_2"]} , "alignment": "center"} } } , - { "id": "calendar_icon", "component": { "Icon": { "name": { "literalString": "calendar_today"} } } } , - { "id": "calendar_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "calendar"} } } } , - { "id": "calendar_secondary_text", "component": { "Text": { "text": { "literalString": "Calendar"} } } } , - { "id": "calendar_text_column", "component": { "Column": { "children": { "explicitList": ["calendar_primary_text", "calendar_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "info_row_1", "component": { "Row": { "children": { "explicitList": ["calendar_icon", "calendar_text_column"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "location_icon", "component": { "Icon": { "name": { "literalString": "location_on"} } } } , - { "id": "location_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "location"} } } } , - { "id": "location_secondary_text", "component": { "Text": { "text": { "literalString": "Location"} } } } , - { "id": "location_text_column", "component": { "Column": { "children": { "explicitList": ["location_primary_text", "location_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "info_row_2", "component": { "Row": { "children": { "explicitList": ["location_icon", "location_text_column"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "mail_icon", "component": { "Icon": { "name": { "literalString": "mail"} } } } , - { "id": "mail_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "email"} } } } , - { "id": "mail_secondary_text", "component": { "Text": { "text": { "literalString": "Email"} } } } , - { "id": "mail_text_column", "component": { "Column": { "children": { "explicitList": ["mail_primary_text", "mail_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "info_row_3", "component": { "Row": { "children": { "explicitList": ["mail_icon", "mail_text_column"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "div", "component": { "Divider": { } } } , { "id": "call_icon", "component": { "Icon": { "name": { "literalString": "call"} } } } , - { "id": "call_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "mobile"} } } } , - { "id": "call_secondary_text", "component": { "Text": { "text": { "literalString": "Mobile"} } } } , - { "id": "call_text_column", "component": { "Column": { "children": { "explicitList": ["call_primary_text", "call_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "info_row_4", "component": { "Row": { "children": { "explicitList": ["call_icon", "call_text_column"]} , "distribution": "start", "alignment": "start"} } } , - { "id": "info_rows_column", "weight": 1, "component": { "Column": { "children": { "explicitList": ["info_row_1", "info_row_2", "info_row_3", "info_row_4"]} , "alignment": "stretch"} } } , - { "id": "button_1_text", "component": { "Text": { "text": { "literalString": "Follow"} } } } , { "id": "button_1", "component": { "Button": { "child": "button_1_text", "primary": true, "action": { "name": "follow_contact"} } } } , - { "id": "button_2_text", "component": { "Text": { "text": { "literalString": "Message"} } } } , { "id": "button_2", "component": { "Button": { "child": "button_2_text", "primary": false, "action": { "name": "send_message"} } } } , - { "id": "action_buttons_row", "component": { "Row": { "children": { "explicitList": ["button_1", "button_2"]} , "distribution": "center", "alignment": "center"} } } , - { "id": "link_text", "component": { "Text": { "text": { "literalString": "[View Full Profile](/profile)"} } } } , - { "id": "link_text_wrapper", "component": { "Row": { "children": { "explicitList": ["link_text"]} , "distribution": "center", "alignment": "center"} } } , - { "id": "main_column", "component": { "Column": { "children": { "explicitList": ["profile_image", "description_column", "div", "info_rows_column", "action_buttons_row", "link_text_wrapper"]} , "alignment": "stretch"} } } , - { "id": "main_card", "component": { "Card": { "child": "main_column"} } } - ] - } }, - { "dataModelUpdate": { - "surfaceId": "contact-card", - "path": "/", - "contents": [ - { "key": "name", "valueString": "" }, - { "key": "title", "valueString": "" }, - { "key": "team", "valueString": "" }, - { "key": "location", "valueString": "" }, - { "key": "email", "valueString": "" }, - { "key": "mobile", "valueString": "" }, - { "key": "calendar", "valueString": "" }, - { "key": "imageUrl", "valueString": "" } - ] - } } -] ----END CONTACT_CARD_EXAMPLE--- - ----BEGIN ACTION_CONFIRMATION_EXAMPLE--- -[ - { "beginRendering": { "surfaceId": "action-modal", "root": "modal-wrapper", "styles": { "primaryColor": "#007BFF", "font": "Roboto" } } }, - { "surfaceUpdate": { - "surfaceId": "action-modal", - "components": [ - { "id": "modal-wrapper", "component": { "Modal": { "entryPointChild": "hidden-entry-point", "contentChild": "modal-content-column" } } }, - { "id": "hidden-entry-point", "component": { "Text": { "text": { "literalString": "" } } } }, - { "id": "modal-content-column", "component": { "Column": { "children": { "explicitList": ["modal-title", "modal-message", "dismiss-button"] }, "alignment": "center" } } }, - { "id": "modal-title", "component": { "Text": { "usageHint": "h2", "text": { "path": "actionTitle" } } } }, - { "id": "modal-message", "component": { "Text": { "text": { "path": "actionMessage" } } } }, - { "id": "dismiss-button-text", "component": { "Text": { "text": { "literalString": "Dismiss" } } } }, - { "id": "dismiss-button", "component": { "Button": { "child": "dismiss-button-text", "primary": true, "action": { "name": "dismiss_modal" } } } } - ] - } }, - { "dataModelUpdate": { - "surfaceId": "action-modal", - "path": "/", - "contents": [ - { "key": "actionTitle", "valueString": "Action Confirmation" }, - { "key": "actionMessage", "valueString": "Your action has been processed." } - ] - } } -] ----END ACTION_CONFIRMATION_EXAMPLE--- - ----BEGIN FOLLOW_SUCCESS_EXAMPLE--- -[ - { "beginRendering": { "surfaceId": "contact-card", "root": "success_card"} }, - { "surfaceUpdate": { - "surfaceId": "contact-card", - "components": [ - { "id": "success_icon", "component": { "Icon": { "name": { "literalString": "check_circle"}, "size": 48.0, "color": "#4CAF50"} } } , - { "id": "success_text", "component": { "Text": { "text": { "literalString": "Successfully Followed"}, "usageHint": "h2"} } } , - { "id": "success_column", "component": { "Column": { "children": { "explicitList": ["success_icon", "success_text"]} , "alignment": "center"} } } , - { "id": "success_card", "component": { "Card": { "child": "success_column"} } } - ] - } } -] ----END FOLLOW_SUCCESS_EXAMPLE--- -""" diff --git a/samples/agent/adk/contact_lookup/a2ui_schema.py b/samples/agent/adk/contact_lookup/a2ui_schema.py deleted file mode 100644 index 52ee845e7..000000000 --- a/samples/agent/adk/contact_lookup/a2ui_schema.py +++ /dev/null @@ -1,788 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# a2ui_schema.py - -A2UI_SCHEMA = r""" -{ - "title": "A2UI Message Schema", - "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", - "type": "object", - "properties": { - "beginRendering": { - "type": "object", - "description": "Signals the client to begin rendering a surface with a root component and specific styles.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be rendered." - }, - "root": { - "type": "string", - "description": "The ID of the root component to render." - }, - "styles": { - "type": "object", - "description": "Styling information for the UI.", - "properties": { - "font": { - "type": "string", - "description": "The primary font for the UI." - }, - "primaryColor": { - "type": "string", - "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - } - } - } - }, - "required": ["root", "surfaceId"] - }, - "surfaceUpdate": { - "type": "object", - "description": "Updates a surface with a new set of components.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown." - }, - "components": { - "type": "array", - "description": "A list containing all UI components for the surface.", - "minItems": 1, - "items": { - "type": "object", - "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for this component." - }, - "weight": { - "type": "number", - "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." - }, - "component": { - "type": "object", - "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type (e.g., 'Heading'). The value is an object containing the properties for that specific component.", - "properties": { - "Text": { - "type": "object", - "properties": { - "text": { - "type": "object", - "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "usageHint": { - "type": "string", - "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.", - "enum": [ - "h1", - "h2", - "h3", - "h4", - "h5", - "caption", - "body" - ] - } - }, - "required": ["text"] - }, - "Image": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "fit": { - "type": "string", - "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": [ - "contain", - "cover", - "fill", - "none", - "scale-down" - ] - }, - "usageHint": { - "type": "string", - "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.", - "enum": [ - "icon", - "avatar", - "smallFeature", - "mediumFeature", - "largeFeature", - "header" - ] - } - }, - "required": ["url"] - }, - "Icon": { - "type": "object", - "properties": { - "name": { - "type": "object", - "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').", - "properties": { - "literalString": { - "type": "string", - "enum": [ - "accountCircle", - "add", - "arrowBack", - "arrowForward", - "attachFile", - "calendarToday", - "call", - "camera", - "check", - "close", - "delete", - "download", - "edit", - "event", - "error", - "favorite", - "favoriteOff", - "folder", - "help", - "home", - "info", - "locationOn", - "lock", - "lockOpen", - "mail", - "menu", - "moreVert", - "moreHoriz", - "notificationsOff", - "notifications", - "payment", - "person", - "phone", - "photo", - "print", - "refresh", - "search", - "send", - "settings", - "share", - "shoppingCart", - "star", - "starHalf", - "starOff", - "upload", - "visibility", - "visibilityOff", - "warning" - ] - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["name"] - }, - "Video": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "AudioPlayer": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "description": { - "type": "object", - "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "Row": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "center", - "end", - "spaceAround", - "spaceBetween", - "spaceEvenly", - "start" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Column": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "start", - "center", - "end", - "spaceBetween", - "spaceAround", - "spaceEvenly" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] - } - }, - "required": ["children"] - }, - "List": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "direction": { - "type": "string", - "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Card": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to be rendered inside the card." - } - }, - "required": ["child"] - }, - "Tabs": { - "type": "object", - "properties": { - "tabItems": { - "type": "array", - "description": "An array of objects, where each object defines a tab with a title and a child component.", - "items": { - "type": "object", - "properties": { - "title": { - "type": "object", - "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "child": { - "type": "string" - } - }, - "required": ["title", "child"] - } - } - }, - "required": ["tabItems"] - }, - "Divider": { - "type": "object", - "properties": { - "axis": { - "type": "string", - "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"] - } - } - }, - "Modal": { - "type": "object", - "properties": { - "entryPointChild": { - "type": "string", - "description": "The ID of the component that opens the modal when interacted with (e.g., a button)." - }, - "contentChild": { - "type": "string", - "description": "The ID of the component to be displayed inside the modal." - } - }, - "required": ["entryPointChild", "contentChild"] - }, - "Button": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to display in the button, typically a Text component." - }, - "primary": { - "type": "boolean", - "description": "Indicates if this button should be styled as the primary action." - }, - "action": { - "type": "object", - "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.", - "properties": { - "name": { - "type": "string" - }, - "context": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "object", - "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').", - "properties": { - "path": { - "type": "string" - }, - "literalString": { - "type": "string" - }, - "literalNumber": { - "type": "number" - }, - "literalBoolean": { - "type": "boolean" - } - } - } - }, - "required": ["key", "value"] - } - } - }, - "required": ["name"] - } - }, - "required": ["child", "action"] - }, - "CheckBox": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "object", - "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').", - "properties": { - "literalBoolean": { - "type": "boolean" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["label", "value"] - }, - "TextField": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "text": { - "type": "object", - "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "textFieldType": { - "type": "string", - "description": "The type of input field to display.", - "enum": [ - "date", - "longText", - "number", - "shortText", - "obscured" - ] - }, - "validationRegexp": { - "type": "string", - "description": "A regular expression used for client-side validation of the input." - } - }, - "required": ["label"] - }, - "DateTimeInput": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The selected date and/or time value in ISO 8601 format. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "enableDate": { - "type": "boolean", - "description": "If true, allows the user to select a date." - }, - "enableTime": { - "type": "boolean", - "description": "If true, allows the user to select a time." - } - }, - "required": ["value"] - }, - "MultipleChoice": { - "type": "object", - "properties": { - "selections": { - "type": "object", - "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').", - "properties": { - "literalArray": { - "type": "array", - "items": { - "type": "string" - } - }, - "path": { - "type": "string" - } - } - }, - "options": { - "type": "array", - "description": "An array of available options for the user to choose from.", - "items": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "string", - "description": "The value to be associated with this option when selected." - } - }, - "required": ["label", "value"] - } - }, - "maxAllowedSelections": { - "type": "integer", - "description": "The maximum number of options that the user is allowed to select." - } - }, - "required": ["selections", "options"] - }, - "Slider": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').", - "properties": { - "literalNumber": { - "type": "number" - }, - "path": { - "type": "string" - } - } - }, - "minValue": { - "type": "number", - "description": "The minimum value of the slider." - }, - "maxValue": { - "type": "number", - "description": "The maximum value of the slider." - } - }, - "required": ["value"] - } - } - } - }, - "required": ["id", "component"] - } - } - }, - "required": ["surfaceId", "components"] - }, - "dataModelUpdate": { - "type": "object", - "description": "Updates the data model for a surface.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface this data model update applies to." - }, - "path": { - "type": "string", - "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced." - }, - "contents": { - "type": "array", - "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.", - "items": { - "type": "object", - "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string", - "description": "The key for this data entry." - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - }, - "valueMap": { - "description": "Represents a map as an adjacency list.", - "type": "array", - "items": { - "type": "object", - "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string" - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - } - }, - "required": ["key"] - } - } - }, - "required": ["key"] - } - } - }, - "required": ["contents", "surfaceId"] - }, - "deleteSurface": { - "type": "object", - "description": "Signals the client to delete the surface identified by 'surfaceId'.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be deleted." - } - }, - "required": ["surfaceId"] - } - } -} -""" diff --git a/samples/agent/adk/contact_lookup/agent.py b/samples/agent/adk/contact_lookup/agent.py index 9a09aaad0..0bde787c1 100644 --- a/samples/agent/adk/contact_lookup/agent.py +++ b/samples/agent/adk/contact_lookup/agent.py @@ -19,22 +19,20 @@ from typing import Any import jsonschema -from a2ui_examples import CONTACT_UI_EXAMPLES # Corrected imports from our new/refactored files -from a2ui_schema import A2UI_SCHEMA from google.adk.agents.llm_agent import LlmAgent from google.adk.artifacts import InMemoryArtifactService from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.models.lite_llm import LiteLlm from google.adk.runners import Runner from google.adk.sessions import InMemorySessionService +from a2a.types import AgentCapabilities, AgentCard, AgentSkill + from google.genai import types -from prompt_builder import ( - get_text_prompt, - get_ui_prompt, -) +from prompt_builder import get_text_prompt, ROLE_DESCRIPTION, WORKFLOW_DESCRIPTION, UI_DESCRIPTION from tools import get_contact_info +from a2ui.inference.schema.manager import A2uiSchemaManager logger = logging.getLogger(__name__) @@ -47,6 +45,9 @@ class ContactAgent: def __init__(self, base_url: str, use_ui: bool = False): self.base_url = base_url self.use_ui = use_ui + self._schema_manager = ( + A2uiSchemaManager("0.8", basic_examples_path="examples") if use_ui else None + ) self._agent = self._build_agent(use_ui) self._user_id = "remote_agent" self._runner = Runner( @@ -57,20 +58,37 @@ def __init__(self, base_url: str, use_ui: bool = False): memory_service=InMemoryMemoryService(), ) - # --- MODIFICATION: Wrap the schema --- - # Load the A2UI_SCHEMA string into a Python object for validation - try: - # First, load the schema for a *single message* - single_message_schema = json.loads(A2UI_SCHEMA) - - # The prompt instructs the LLM to return a *list* of messages. - # Therefore, our validation schema must be an *array* of the single message schema. - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} - logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- + def get_agent_card(self) -> AgentCard: + capabilities = AgentCapabilities( + streaming=True, + extensions=[self._schema_manager.get_agent_extension()], + ) + skill = AgentSkill( + id="find_contact", + name="Find Contact Tool", + description=( + "Helps find contact information for colleagues (e.g., email, location," + " team)." + ), + tags=["contact", "directory", "people", "finder"], + examples=[ + "Who is David Chen in marketing?", + "Find Sarah Lee from engineering", + ], + ) + + return AgentCard( + name="Contact Lookup Agent", + description=( + "This agent helps find contact info for people in your organization." + ), + url=self.base_url, + version="1.0.0", + default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) def get_processing_message(self) -> str: return "Looking up contact information..." @@ -79,11 +97,18 @@ def _build_agent(self, use_ui: bool) -> LlmAgent: """Builds the LLM agent for the contact agent.""" LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - if use_ui: - instruction = get_ui_prompt(self.base_url, CONTACT_UI_EXAMPLES) - else: - # The text prompt function also returns a complete prompt. - instruction = get_text_prompt() + instruction = ( + self._schema_manager.generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_schema=True, + include_examples=True, + validate_examples=False, # Use invalid examples to test retry logic + ) + if use_ui + else get_text_prompt() + ) return LlmAgent( model=LiteLlm(model=LITELLM_MODEL), @@ -116,8 +141,9 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: attempt = 0 current_query_text = query - # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: + # Ensure catalog schema was loaded + effective_catalog = self._schema_manager.get_effective_catalog() + if self.use_ui and not effective_catalog.catalog_schema: logger.error( "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " "Cannot perform UI validation. ---" @@ -219,9 +245,7 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: logger.info( "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" ) - jsonschema.validate( - instance=parsed_json_data, schema=self.a2ui_schema_object - ) + effective_catalog.validator.validate(parsed_json_data) # --- End New Validation Steps --- logger.info( diff --git a/samples/agent/adk/contact_lookup/agent_executor.py b/samples/agent/adk/contact_lookup/agent_executor.py index c58bbce18..1c60551a1 100644 --- a/samples/agent/adk/contact_lookup/agent_executor.py +++ b/samples/agent/adk/contact_lookup/agent_executor.py @@ -41,11 +41,11 @@ class ContactAgentExecutor(AgentExecutor): """Contact AgentExecutor Example.""" - def __init__(self, base_url: str): + def __init__(self, ui_agent: ContactAgent, text_agent: ContactAgent): # Instantiate two agents: one for UI and one for text-only. # The appropriate one will be chosen at execution time. - self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) - self.text_agent = ContactAgent(base_url=base_url, use_ui=False) + self.ui_agent = ui_agent + self.text_agent = text_agent async def execute( self, diff --git a/samples/agent/adk/contact_lookup/examples/action_confirmation.json b/samples/agent/adk/contact_lookup/examples/action_confirmation.json new file mode 100644 index 000000000..f961363d7 --- /dev/null +++ b/samples/agent/adk/contact_lookup/examples/action_confirmation.json @@ -0,0 +1,23 @@ +[ + { "beginRendering": { "surfaceId": "action-modal", "root": "modal-wrapper", "styles": { "primaryColor": "#007BFF", "font": "Roboto" } } }, + { "surfaceUpdate": { + "surfaceId": "action-modal", + "components": [ + { "id": "modal-wrapper", "component": { "Modal": { "entryPointChild": "hidden-entry-point", "contentChild": "modal-content-column" } } }, + { "id": "hidden-entry-point", "component": { "Text": { "text": { "literalString": "" } } } }, + { "id": "modal-content-column", "component": { "Column": { "children": { "explicitList": ["modal-title", "modal-message", "dismiss-button"] }, "alignment": "center" } } }, + { "id": "modal-title", "component": { "Text": { "usageHint": "h2", "text": { "path": "actionTitle" } } } }, + { "id": "modal-message", "component": { "Text": { "text": { "path": "actionMessage" } } } }, + { "id": "dismiss-button-text", "component": { "Text": { "text": { "literalString": "Dismiss" } } } }, + { "id": "dismiss-button", "component": { "Button": { "child": "dismiss-button-text", "primary": true, "action": { "name": "dismiss_modal" } } } } + ] + } }, + { "dataModelUpdate": { + "surfaceId": "action-modal", + "path": "/", + "contents": [ + { "key": "actionTitle", "valueString": "Action Confirmation" }, + { "key": "actionMessage", "valueString": "Your action has been processed." } + ] + } } +] \ No newline at end of file diff --git a/samples/agent/adk/contact_lookup/examples/contact_card.json b/samples/agent/adk/contact_lookup/examples/contact_card.json new file mode 100644 index 000000000..70f0787b3 --- /dev/null +++ b/samples/agent/adk/contact_lookup/examples/contact_card.json @@ -0,0 +1,54 @@ +[ + { "beginRendering": { "surfaceId":"contact-card","root":"main_card"} }, + { "surfaceUpdate": { "surfaceId":"contact-card", + "components":[ + { "id": "profile_image", "component": { "Image": { "url": { "path": "imageUrl"}, "usageHint": "avatar", "fit": "cover" } } } , + { "id": "user_heading", "weight": 1, "component": { "Text": { "text": { "path": "name"} , "usageHint": "h2"} } } , + { "id": "description_text_1", "component": { "Text": { "text": { "path": "title"} } } } , + { "id": "description_text_2", "component": { "Text": { "text": { "path": "team"} } } } , + { "id": "description_column", "component": { "Column": { "children": { "explicitList": ["user_heading", "description_text_1", "description_text_2"]} , "alignment": "center"} } } , + { "id": "calendar_icon", "component": { "Icon": { "name": { "literalString": "calendar_today"} } } } , + { "id": "calendar_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "calendar"} } } } , + { "id": "calendar_secondary_text", "component": { "Text": { "text": { "literalString": "Calendar"} } } } , + { "id": "calendar_text_column", "component": { "Column": { "children": { "explicitList": ["calendar_primary_text", "calendar_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "info_row_1", "component": { "Row": { "children": { "explicitList": ["calendar_icon", "calendar_text_column"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "location_icon", "component": { "Icon": { "name": { "literalString": "location_on"} } } } , + { "id": "location_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "location"} } } } , + { "id": "location_secondary_text", "component": { "Text": { "text": { "literalString": "Location"} } } } , + { "id": "location_text_column", "component": { "Column": { "children": { "explicitList": ["location_primary_text", "location_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "info_row_2", "component": { "Row": { "children": { "explicitList": ["location_icon", "location_text_column"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "mail_icon", "component": { "Icon": { "name": { "literalString": "mail"} } } } , + { "id": "mail_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "email"} } } } , + { "id": "mail_secondary_text", "component": { "Text": { "text": { "literalString": "Email"} } } } , + { "id": "mail_text_column", "component": { "Column": { "children": { "explicitList": ["mail_primary_text", "mail_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "info_row_3", "component": { "Row": { "children": { "explicitList": ["mail_icon", "mail_text_column"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "div", "component": { "Divider": { } } } , { "id": "call_icon", "component": { "Icon": { "name": { "literalString": "call"} } } } , + { "id": "call_primary_text", "component": { "Text": { "usageHint": "h5", "text": { "path": "mobile"} } } } , + { "id": "call_secondary_text", "component": { "Text": { "text": { "literalString": "Mobile"} } } } , + { "id": "call_text_column", "component": { "Column": { "children": { "explicitList": ["call_primary_text", "call_secondary_text"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "info_row_4", "component": { "Row": { "children": { "explicitList": ["call_icon", "call_text_column"]} , "distribution": "start", "alignment": "start"} } } , + { "id": "info_rows_column", "weight": 1, "component": { "Column": { "children": { "explicitList": ["info_row_1", "info_row_2", "info_row_3", "info_row_4"]} , "alignment": "stretch"} } } , + { "id": "button_1_text", "component": { "Text": { "text": { "literalString": "Follow"} } } } , { "id": "button_1", "component": { "Button": { "child": "button_1_text", "primary": true, "action": { "name": "follow_contact"} } } } , + { "id": "button_2_text", "component": { "Text": { "text": { "literalString": "Message"} } } } , { "id": "button_2", "component": { "Button": { "child": "button_2_text", "primary": false, "action": { "name": "send_message"} } } } , + { "id": "action_buttons_row", "component": { "Row": { "children": { "explicitList": ["button_1", "button_2"]} , "distribution": "center", "alignment": "center"} } } , + { "id": "link_text", "component": { "Text": { "text": { "literalString": "[View Full Profile](/profile)"} } } } , + { "id": "link_text_wrapper", "component": { "Row": { "children": { "explicitList": ["link_text"]} , "distribution": "center", "alignment": "center"} } } , + { "id": "main_column", "component": { "Column": { "children": { "explicitList": ["profile_image", "description_column", "div", "info_rows_column", "action_buttons_row", "link_text_wrapper"]} , "alignment": "stretch"} } } , + { "id": "main_card", "component": { "Card": { "child": "main_column"} } } + ] + } }, + { "dataModelUpdate": { + "surfaceId": "contact-card", + "path": "/", + "contents": [ + { "key": "name", "valueString": "" }, + { "key": "title", "valueString": "" }, + { "key": "team", "valueString": "" }, + { "key": "location", "valueString": "" }, + { "key": "email", "valueString": "" }, + { "key": "mobile", "valueString": "" }, + { "key": "calendar", "valueString": "" }, + { "key": "imageUrl", "valueString": "" } + ] + } } +] \ No newline at end of file diff --git a/samples/agent/adk/contact_lookup/examples/contact_list.json b/samples/agent/adk/contact_lookup/examples/contact_list.json new file mode 100644 index 000000000..4f87d069b --- /dev/null +++ b/samples/agent/adk/contact_lookup/examples/contact_list.json @@ -0,0 +1,232 @@ +[ + { + "beginRendering": { + "surfaceId": "contact-list", + "root": "root-column", + "styles": { + "primaryColor": "#007BFF", + "font": "Roboto" + } + } + }, + { + "surfaceUpdate": { + "surfaceId": "contact-list", + "components": [ + { + "id": "root-column", + "component": { + "Column": { + "children": { + "explicitList": [ + "title-heading", + "item-list" + ] + } + } + } + }, + { + "id": "title-heading", + "component": { + "Text": { + "usageHint": "h1", + "text": { + "literalString": "Found Contacts" + } + } + } + }, + { + "id": "item-list", + "component": { + "List": { + "direction": "vertical", + "children": { + "template": { + "componentId": "item-card-template", + "dataBinding": "/contacts" + } + } + } + } + }, + { + "id": "item-card-template", + "component": { + "Card": { + "child": "card-layout" + } + } + }, + { + "id": "card-layout", + "component": { + "Row": { + "children": { + "explicitList": [ + "template-image", + "card-details", + "view-button" + ] + }, + "alignment": "center" + } + } + }, + { + "id": "template-image", + "component": { + "Image": { + "url": { + "path": "imageUrl" + }, + "fit": "cover" + } + } + }, + { + "id": "card-details", + "component": { + "Column": { + "children": { + "explicitList": [ + "template-name", + "template-title" + ] + } + } + } + }, + { + "id": "template-name", + "component": { + "Text": { + "usageHint": "h3", + "text": { + "path": "name" + } + } + } + }, + { + "id": "template-title", + "component": { + "Text": { + "text": { + "path": "title" + } + } + } + }, + { + "id": "view-button-text", + "component": { + "Text": { + "text": { + "literalString": "View" + } + } + } + }, + { + "id": "view-button", + "component": { + "Button": { + "child": "view-button-text", + "primary": true, + "action": { + "name": "view_profile", + "context": [ + { + "key": "contactName", + "value": { + "path": "name" + } + }, + { + "key": "department", + "value": { + "path": "department" + } + } + ] + } + } + } + } + ] + } + }, + { + "dataModelUpdate": { + "surfaceId": "contact-list", + "path": "/", + "contents": [ + { + "key": "contacts", + "valueMap": [ + { + "key": "contact1", + "valueMap": [ + { + "key": "name", + "valueString": "Alice Wonderland" + }, + { + "key": "phone", + "valueString": "+1-555-123-4567" + }, + { + "key": "email", + "valueString": "alice@example.com" + }, + { + "key": "imageUrl", + "valueString": "https://example.com/alice.jpg" + }, + { + "key": "title", + "valueString": "Mad Hatter" + }, + { + "key": "department", + "valueString": "Wonderland" + } + ] + }, + { + "key": "contact2", + "valueMap": [ + { + "key": "name", + "valueString": "Bob The Builder" + }, + { + "key": "phone", + "valueString": "+1-555-765-4321" + }, + { + "key": "email", + "valueString": "bob@example.com" + }, + { + "key": "imageUrl", + "valueString": "https://example.com/bob.jpg" + }, + { + "key": "title", + "valueString": "Construction" + }, + { + "key": "department", + "valueString": "Building" + } + ] + } + ] + } + ] + } + } +] \ No newline at end of file diff --git a/samples/agent/adk/contact_lookup/examples/follow_success.json b/samples/agent/adk/contact_lookup/examples/follow_success.json new file mode 100644 index 000000000..4822dbed4 --- /dev/null +++ b/samples/agent/adk/contact_lookup/examples/follow_success.json @@ -0,0 +1,60 @@ +[ + { + "beginRendering": { + "surfaceId": "contact-card", + "root": "success_card" + } + }, + { + "surfaceUpdate": { + "surfaceId": "contact-card", + "components": [ + { + "id": "success_icon", + "component": { + "Icon": { + "name": { + "literalString": "check_circle" + }, + "size": 48.0, + "color": "#4CAF50" + } + } + }, + { + "id": "success_text", + "component": { + "Text": { + "text": { + "literalString": "Successfully Followed" + }, + "usageHint": "h2" + } + } + }, + { + "id": "success_column", + "component": { + "Column": { + "children": { + "explicitList": [ + "success_icon", + "success_text" + ] + }, + "alignment": "center" + } + } + }, + { + "id": "success_card", + "component": { + "Card": { + "child": "success_column" + } + } + } + ] + } + } +] \ No newline at end of file diff --git a/samples/agent/adk/contact_lookup/prompt_builder.py b/samples/agent/adk/contact_lookup/prompt_builder.py index af472be82..d50dfc2d1 100644 --- a/samples/agent/adk/contact_lookup/prompt_builder.py +++ b/samples/agent/adk/contact_lookup/prompt_builder.py @@ -12,81 +12,38 @@ # See the License for the specific language governing permissions and # limitations under the License. -from a2ui_examples import CONTACT_UI_EXAMPLES -from a2ui_schema import A2UI_SCHEMA - -# This is the agent's master instruction, separate from the UI prompt formatting. -AGENT_INSTRUCTION = """ - You are a helpful contact lookup assistant. Your goal is to help users find colleagues using a rich UI. - - To achieve this, you MUST follow this logic: - - 1. **For finding contacts (e.g., "Who is Alex Jordan?"):** - a. You MUST call the `get_contact_info` tool. Extract the name and department. - b. After receiving the data: - i. If the tool returns a **single contact**, you MUST use the `CONTACT_CARD_EXAMPLE` template. - ii. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. - iii. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" - - 2. **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** - a. You MUST call the `get_contact_info` tool with the specific name. - b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. - - 3. **For handling actions (e.g., "USER_WANTS_TO_EMAIL: ..."):** - a. You MUST use the `ACTION_CONFIRMATION_EXAMPLE` template. - b. Populate the `dataModelUpdate.contents` with a confirmation title and message. +from a2ui.inference.schema.manager import A2uiSchemaManager + +ROLE_DESCRIPTION = ( + "You are a helpful contact lookup assistant. Your final output MUST be an A2UI JSON" + " response." +) + +WORKFLOW_DESCRIPTION = """ +To generate the response, you MUST follow these rules: +1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. +2. The first part is your conversational text response (e.g., "Here is the contact you requested..."). +3. The second part is a single, raw JSON object which is a list of A2UI messages. +4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. +5. Buttons that represent the main action on a card or view (e.g., 'Follow', 'Email', 'Search') SHOULD include the `"primary": true` attribute. """ - -def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. - - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. - - Returns: - A formatted string to be used as the system prompt for the LLM. - """ - - # --- THIS IS THE FIX --- - # We no longer call .format() on the examples, as it breaks the JSON. - formatted_examples = examples - # --- END FIX --- - - return f""" - You are a helpful contact lookup assistant. Your final output MUST be a a2ui UI JSON response. - - To generate the response, you MUST follow these rules: - 1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. - 2. The first part is your conversational text response (e.g., "Here is the contact you requested..."). - 3. The second part is a single, raw JSON object which is a list of A2UI messages. - 4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. - 5. Buttons that represent the main action on a card or view (e.g., 'Follow', 'Email', 'Search') SHOULD include the `"primary": true` attribute. - - --- UI TEMPLATE RULES --- - - **For finding contacts (e.g., "Who is Alex Jordan?"):** - a. You MUST call the `get_contact_info` tool. - b. If the tool returns a **single contact**, you MUST use the `CONTACT_CARD_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the contact's details (name, title, email, etc.). - c. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the list of contacts for the "contacts" key. - d. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" - - - **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** - a. You MUST call the `get_contact_info` tool with the specific name. - b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. - - - **For handling actions (e.g., "follow_contact"):** - a. You MUST use the `FOLLOW_SUCCESS_EXAMPLE` template. - b. This will render a new card with a "Successfully Followed" message. - c. Respond with a text confirmation like "You are now following this contact." along with the JSON. - - {formatted_examples} - - ---BEGIN A2UI JSON SCHEMA--- - {A2UI_SCHEMA} - ---END A2UI JSON SCHEMA--- - """ +UI_DESCRIPTION = """ +- **For finding contacts (e.g., "Who is Alex Jordan?"):** + a. You MUST call the `get_contact_info` tool. + b. If the tool returns a **single contact**, you MUST use the `CONTACT_CARD_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the contact's details (name, title, email, etc.). + c. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the list of contacts for the "contacts" key. + d. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" + +- **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** + a. You MUST call the `get_contact_info` tool with the specific name. + b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. + +- **For handling actions (e.g., "follow_contact"):** + a. You MUST use the `FOLLOW_SUCCESS_EXAMPLE` template. + b. This will render a new card with a "Successfully Followed" message. + c. Respond with a text confirmation like "You are now following this contact." along with the JSON. +""" def get_text_prompt() -> str: @@ -109,9 +66,17 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder - my_base_url = "http://localhost:8000" - contact_prompt = get_ui_prompt(my_base_url, CONTACT_UI_EXAMPLES) + # Example of how to use the A2UI Schema Manager to generate a system prompt + contact_prompt = A2uiSchemaManager( + "0.8", basic_examples_path="examples" + ).generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_schema=True, + include_examples=True, + validate_examples=False, + ) print(contact_prompt) with open("generated_prompt.txt", "w") as f: f.write(contact_prompt) diff --git a/samples/agent/adk/uv.lock b/samples/agent/adk/uv.lock index dfc582e88..0fb42d7e9 100644 --- a/samples/agent/adk/uv.lock +++ b/samples/agent/adk/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.13" resolution-markers = [ "python_full_version >= '3.14'", From be5c3f2cc341b1c17e58f41d7dec64476a193033 Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 21:27:40 +0000 Subject: [PATCH 51/65] Update contact multiple surfaces sample (#569) * feat: Add schema modifiers to A2uiSchemaManager Introduces a `schema_modifiers` parameter to A2uiSchemaManager, allowing custom callable hooks to transform schemas after loading. This enables flexible schema customization, such as relaxing strict validation constraints during testing. * Update contact_multiple_surfaces sample It updates the sample to use the A2uiSchemaManager from the a2ui-agent python SDK. Tested: - [x] The `contact` lit client successfully connected to the `contact_multiple_surfaces` agent and rendered the response correctly. --- .../a2ui/inference/schema/common_modifiers.py | 27 + .../src/a2ui/inference/schema/manager.py | 28 +- .../tests/inference/test_modifiers.py | 74 ++ .../tests/integration/verify_load_real.py | 13 +- .../adk/contact_multiple_surfaces/__main__.py | 38 +- .../a2ui_examples.py | 72 -- .../contact_multiple_surfaces/a2ui_schema.py | 792 ------------------ .../adk/contact_multiple_surfaces/agent.py | 109 ++- .../agent_executor.py | 22 +- .../prompt_builder.py | 144 ++-- samples/client/lit/contact/client.ts | 4 +- 11 files changed, 290 insertions(+), 1033 deletions(-) create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/common_modifiers.py create mode 100644 a2a_agents/python/a2ui_agent/tests/inference/test_modifiers.py delete mode 100644 samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/common_modifiers.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/common_modifiers.py new file mode 100644 index 000000000..36a5a3a33 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/common_modifiers.py @@ -0,0 +1,27 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +def remove_strict_validation(schema): + if isinstance(schema, dict): + new_schema = {k: remove_strict_validation(v) for k, v in schema.items()} + if ( + 'additionalProperties' in new_schema + and new_schema['additionalProperties'] is False + ): + del new_schema['additionalProperties'] + return new_schema + elif isinstance(schema, list): + return [remove_strict_validation(item) for item in schema] + return schema diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py index cec03ca58..2ac87ed0f 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/inference/schema/manager.py @@ -17,7 +17,7 @@ import logging import os import importlib.resources -from typing import List, Dict, Any, Optional +from typing import List, Dict, Any, Optional, Callable from dataclasses import dataclass, field from .loader import A2uiSchemaLoader, PackageLoader, FileSystemLoader from ..inference_strategy import InferenceStrategy @@ -122,6 +122,7 @@ def __init__( custom_catalogs: Optional[List[CustomCatalogConfig]] = None, exclude_basic_catalog: bool = False, accepts_inline_catalogs: bool = False, + schema_modifiers: List[Callable[[Dict[str, Any]], Dict[str, Any]]] = None, ): self._version = version self._exclude_basic_catalog = exclude_basic_catalog @@ -132,6 +133,7 @@ def __init__( self._supported_catalogs: Dict[str, A2uiCatalog] = {} self._catalog_example_paths: Dict[str, str] = {} self._basic_catalog = None + self._schema_modifiers = schema_modifiers self._load_schemas(version, custom_catalogs, basic_examples_path) @property @@ -142,6 +144,12 @@ def accepts_inline_catalogs(self) -> bool: def supported_catalogs(self) -> Dict[str, A2uiCatalog]: return self._supported_catalogs + def _apply_modifiers(self, schema: Dict[str, Any]) -> Dict[str, Any]: + if self._schema_modifiers: + for modifier in self._schema_modifiers: + schema = modifier(schema) + return schema + def _load_schemas( self, version: str, @@ -156,13 +164,17 @@ def _load_schemas( ) # Load server-to-client and common types schemas - self._server_to_client_schema = _load_basic_component( - version, SERVER_TO_CLIENT_SCHEMA_KEY + self._server_to_client_schema = self._apply_modifiers( + _load_basic_component(version, SERVER_TO_CLIENT_SCHEMA_KEY) + ) + self._common_types_schema = self._apply_modifiers( + _load_basic_component(version, COMMON_TYPES_SCHEMA_KEY) ) - self._common_types_schema = _load_basic_component(version, COMMON_TYPES_SCHEMA_KEY) # Process basic catalog - basic_catalog_schema = _load_basic_component(version, CATALOG_SCHEMA_KEY) + basic_catalog_schema = self._apply_modifiers( + _load_basic_component(version, CATALOG_SCHEMA_KEY) + ) if not basic_catalog_schema: basic_catalog_schema = {} @@ -192,14 +204,16 @@ def _load_schemas( # Process custom catalogs if custom_catalogs: for config in custom_catalogs: - custom_catalog_schema = _load_from_path(config.catalog_path) + custom_catalog_schema = self._apply_modifiers( + _load_from_path(config.catalog_path) + ) resolved_catalog_schema = A2uiCatalog.resolve_schema( basic_catalog_schema, custom_catalog_schema ) catalog = A2uiCatalog( version=version, name=config.name, - catalog_schema=resolved_catalog_schema, + catalog_schema=self._apply_modifiers(resolved_catalog_schema), s2c_schema=self._server_to_client_schema, common_types_schema=self._common_types_schema, ) diff --git a/a2a_agents/python/a2ui_agent/tests/inference/test_modifiers.py b/a2a_agents/python/a2ui_agent/tests/inference/test_modifiers.py new file mode 100644 index 000000000..4b0939b8c --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/inference/test_modifiers.py @@ -0,0 +1,74 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest +from unittest.mock import patch +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.common_modifiers import remove_strict_validation + + +def test_remove_strict_validation(): + """Tests the remove_strict_validation modifier.""" + schema = { + "type": "object", + "properties": { + "a": {"type": "string", "additionalProperties": False}, + "b": { + "type": "array", + "items": {"type": "object", "additionalProperties": False}, + }, + }, + "additionalProperties": False, + } + + modified = remove_strict_validation(schema) + + # Check that additionalProperties: False is removed + assert "additionalProperties" not in modified + assert "additionalProperties" not in modified["properties"]["a"] + assert "additionalProperties" not in modified["properties"]["b"]["items"] + + # Check that it didn't mutate the original + assert schema["additionalProperties"] is False + assert schema["properties"]["a"]["additionalProperties"] is False + + +def test_manager_with_modifiers(): + """Tests that A2uiSchemaManager applies modifiers during loading.""" + # Mock _load_basic_component to return a simple schema with strict validation + mock_schema = {"type": "object", "additionalProperties": False} + with patch( + "a2ui.inference.schema.manager._load_basic_component", return_value=mock_schema + ): + manager = A2uiSchemaManager("0.8", schema_modifiers=[remove_strict_validation]) + + # Verify that loaded schemas have modifiers applied + assert "additionalProperties" not in manager._server_to_client_schema + assert "additionalProperties" not in manager._common_types_schema + + # basic catalog should also be modified + for catalog in manager._supported_catalogs.values(): + assert "additionalProperties" not in catalog.catalog_schema + + +def test_manager_no_modifiers(): + """Tests that A2uiSchemaManager works fine without modifiers.""" + mock_schema = {"type": "object", "additionalProperties": False} + with patch( + "a2ui.inference.schema.manager._load_basic_component", return_value=mock_schema + ): + manager = A2uiSchemaManager("0.8", schema_modifiers=None) + + # Verify that schemas are NOT modified + assert manager._server_to_client_schema["additionalProperties"] is False diff --git a/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py index eecc7d6b7..bb0a67ed3 100644 --- a/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py +++ b/a2a_agents/python/a2ui_agent/tests/integration/verify_load_real.py @@ -16,12 +16,13 @@ from a2ui.inference.schema.manager import A2uiSchemaManager from a2ui.inference.schema.constants import CATALOG_COMPONENTS_KEY +from a2ui.inference.schema.common_modifiers import remove_strict_validation def verify(): print('Verifying A2uiSchemaManager...') try: - manager = A2uiSchemaManager('0.8') + manager = A2uiSchemaManager('0.8', schema_modifiers=[remove_strict_validation]) catalog = manager.get_effective_catalog() catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] print(f'Successfully loaded 0.8: {len(catalog_components)} components') @@ -364,6 +365,13 @@ def verify(): 'key': 'imageUrl', 'valueString': 'http://localhost:10003/static/profile2.png', }, + { + 'key': 'contacts', + 'valueMap': [{ + 'key': 'contact1', + 'valueMap': [{'key': 'name', 'valueString': 'Casey Smith'}], + }], + }, ], } }, @@ -375,7 +383,7 @@ def verify(): sys.exit(1) try: - manager = A2uiSchemaManager('0.9') + manager = A2uiSchemaManager('0.9', schema_modifiers=[remove_strict_validation]) catalog = manager.get_effective_catalog() catalog_components = catalog.catalog_schema[CATALOG_COMPONENTS_KEY] print(f'Successfully loaded 0.9: {len(catalog_components)} components') @@ -389,6 +397,7 @@ def verify(): 'catalogId': ( 'https://a2ui.dev/specification/v0_9/standard_catalog.json' ), + 'fakeProperty': 'should be allowed', }, }, { diff --git a/samples/agent/adk/contact_multiple_surfaces/__main__.py b/samples/agent/adk/contact_multiple_surfaces/__main__.py index b2e73c900..cccd51e3b 100644 --- a/samples/agent/adk/contact_multiple_surfaces/__main__.py +++ b/samples/agent/adk/contact_multiple_surfaces/__main__.py @@ -19,8 +19,6 @@ from a2a.server.apps import A2AStarletteApplication from a2a.server.request_handlers import DefaultRequestHandler from a2a.server.tasks import InMemoryTaskStore -from a2a.types import AgentCapabilities, AgentCard, AgentSkill -from a2ui.extension.a2ui_extension import get_a2ui_agent_extension from agent import ContactAgent from agent_executor import ContactAgentExecutor from dotenv import load_dotenv @@ -46,48 +44,22 @@ def main(host, port): if not os.getenv("GOOGLE_GENAI_USE_VERTEXAI") == "TRUE": if not os.getenv("GEMINI_API_KEY"): raise MissingAPIKeyError( - "GEMINI_API_KEY environment variable not set and GOOGLE_GENAI_USE_VERTEXAI" - " is not TRUE." + "GEMINI_API_KEY environment variable not set and" + " GOOGLE_GENAI_USE_VERTEXAI is not TRUE." ) - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], - ) - skill = AgentSkill( - id="find_contact", - name="Find Contact Tool", - description=( - "Helps find contact information for colleagues (e.g., email, location," - " team)." - ), - tags=["contact", "directory", "people", "finder"], - examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], - ) - base_url = f"http://{host}:{port}" - agent_card = AgentCard( - name="Contact Lookup Agent", - description=( - "This agent helps find contact info for people in your organization." - ), - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) + agent = ContactAgent(base_url=base_url, use_ui=True) - agent_executor = ContactAgentExecutor(base_url=base_url) + agent_executor = ContactAgentExecutor(agent=agent) request_handler = DefaultRequestHandler( agent_executor=agent_executor, task_store=InMemoryTaskStore(), ) server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler + agent_card=agent.get_agent_card(), http_handler=request_handler ) import uvicorn diff --git a/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py b/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py index 07a064527..fc08f25af 100644 --- a/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py +++ b/samples/agent/adk/contact_multiple_surfaces/a2ui_examples.py @@ -18,7 +18,6 @@ from pathlib import Path import jsonschema -from a2ui_schema import A2UI_SCHEMA logger = logging.getLogger(__name__) @@ -35,77 +34,6 @@ FLOOR_PLAN_FILE = "floor_plan.json" -def load_examples(base_url: str = "http://localhost:10004") -> str: - """ - Loads, validates, and formats the UI examples from JSON files. - - Args: - base_url: The base URL to replace placeholder URLs with. - (Currently examples have http://localhost:10004 hardcoded, - but we can make this dynamic if needed). - - Returns: - A string containing all formatted examples for the prompt. - """ - - # Pre-parse validator - try: - single_msg_schema = json.loads(A2UI_SCHEMA) - # Examples are typically lists of messages - list_schema = {"type": "array", "items": single_msg_schema} - except json.JSONDecodeError: - logger.error("Failed to parse A2UI_SCHEMA for validation") - list_schema = None - - examples_dir = Path(os.path.dirname(__file__)) / "examples" - formatted_output = [] - - for curr_name, filename in EXAMPLE_FILES.items(): - file_path = examples_dir / filename - try: - content = file_path.read_text(encoding="utf-8") - - # basic replacement if we decide to template the URL in JSON files - # content = content.replace("{{BASE_URL}}", base_url) - - # Validation - if list_schema: - try: - data = json.loads(content) - jsonschema.validate(instance=data, schema=list_schema) - except (json.JSONDecodeError, jsonschema.ValidationError) as e: - logger.warning(f"Example {filename} validation failed: {e}") - - formatted_output.append(f"---BEGIN {curr_name}---") - # Handle examples that include user/model text - if curr_name == "ORG_CHART_EXAMPLE": - formatted_output.append("User: Show me the org chart for Casey Smith") - formatted_output.append("Model: Here is the organizational chart.") - formatted_output.append("---a2ui_JSON---") - elif curr_name == "MULTI_SURFACE_EXAMPLE": - formatted_output.append("User: Full profile for Casey Smith") - formatted_output.append( - "Model: Here is the full profile including contact details and org chart." - ) - formatted_output.append("---a2ui_JSON---") - elif curr_name == "CHART_NODE_CLICK_EXAMPLE": - formatted_output.append( - 'User: ACTION: chart_node_click (context: clickedNodeName="John Smith")' - " (from modal)" - ) - formatted_output.append("Model: Here is the profile for John Smith.") - formatted_output.append("---a2ui_JSON---") - - formatted_output.append(content.strip()) - formatted_output.append(f"---END {curr_name}---") - formatted_output.append("") # Newline - - except FileNotFoundError: - logger.error(f"Example file not found: {file_path}") - - return "\n".join(formatted_output) - - def load_floor_plan_example() -> str: """Loads the floor plan example specifically.""" examples_dir = Path(os.path.dirname(__file__)) / "examples" diff --git a/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py b/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py deleted file mode 100644 index 29c72d1d8..000000000 --- a/samples/agent/adk/contact_multiple_surfaces/a2ui_schema.py +++ /dev/null @@ -1,792 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# a2ui_schema.py - -A2UI_SCHEMA = r""" -{ - "title": "A2UI Message Schema", - "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", - "type": "object", - "properties": { - "beginRendering": { - "type": "object", - "description": "Signals the client to begin rendering a surface with a root component and specific styles.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be rendered." - }, - "root": { - "type": "string", - "description": "The ID of the root component to render." - }, - "styles": { - "type": "object", - "description": "Styling information for the UI.", - "properties": { - "font": { - "type": "string", - "description": "The primary font for the UI." - }, - "primaryColor": { - "type": "string", - "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - } - } - } - }, - "required": ["root", "surfaceId"] - }, - "surfaceUpdate": { - "type": "object", - "description": "Updates a surface with a new set of components.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown." - }, - "components": { - "type": "array", - "description": "A list containing all UI components for the surface.", - "minItems": 1, - "items": { - "type": "object", - "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for this component." - }, - "weight": { - "type": "number", - "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." - }, - "component": { - "type": "object", - "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type (e.g., 'Heading'). The value is an object containing the properties for that specific component.", - "properties": { - "Text": { - "type": "object", - "properties": { - "text": { - "type": "object", - "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "usageHint": { - "type": "string", - "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.", - "enum": [ - "h1", - "h2", - "h3", - "h4", - "h5", - "caption", - "body" - ] - } - }, - "required": ["text"] - }, - "Image": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "fit": { - "type": "string", - "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": [ - "contain", - "cover", - "fill", - "none", - "scale-down" - ] - }, - "usageHint": { - "type": "string", - "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.", - "enum": [ - "icon", - "avatar", - "smallFeature", - "mediumFeature", - "largeFeature", - "header" - ] - } - }, - "required": ["url"] - }, - "Icon": { - "type": "object", - "properties": { - "name": { - "type": "object", - "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').", - "properties": { - "literalString": { - "type": "string", - "enum": [ - "accountCircle", - "add", - "arrowBack", - "arrowForward", - "attachFile", - "calendarToday", - "call", - "camera", - "check", - "close", - "delete", - "download", - "edit", - "event", - "error", - "favorite", - "favoriteOff", - "folder", - "help", - "home", - "info", - "locationOn", - "lock", - "lockOpen", - "mail", - "menu", - "moreVert", - "moreHoriz", - "notificationsOff", - "notifications", - "payment", - "person", - "phone", - "photo", - "print", - "refresh", - "search", - "send", - "settings", - "share", - "shoppingCart", - "star", - "starHalf", - "starOff", - "upload", - "visibility", - "visibilityOff", - "warning" - ] - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["name"] - }, - "Video": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "AudioPlayer": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "description": { - "type": "object", - "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "Row": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "center", - "end", - "spaceAround", - "spaceBetween", - "spaceEvenly", - "start" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Column": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "start", - "center", - "end", - "spaceBetween", - "spaceAround", - "spaceEvenly" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] - } - }, - "required": ["children"] - }, - "List": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "direction": { - "type": "string", - "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Card": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to be rendered inside the card." - } - }, - "required": ["child"] - }, - "Tabs": { - "type": "object", - "properties": { - "tabItems": { - "type": "array", - "description": "An array of objects, where each object defines a tab with a title and a child component.", - "items": { - "type": "object", - "properties": { - "title": { - "type": "object", - "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "child": { - "type": "string" - } - }, - "required": ["title", "child"] - } - } - }, - "required": ["tabItems"] - }, - "Divider": { - "type": "object", - "properties": { - "axis": { - "type": "string", - "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"] - } - } - }, - "Modal": { - "type": "object", - "properties": { - "entryPointChild": { - "type": "string", - "description": "The ID of the component that opens the modal when interacted with (e.g., a button)." - }, - "contentChild": { - "type": "string", - "description": "The ID of the component to be displayed inside the modal." - } - }, - "required": ["entryPointChild", "contentChild"] - }, - "Button": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to display in the button, typically a Text component." - }, - "primary": { - "type": "boolean", - "description": "Indicates if this button should be styled as the primary action." - }, - "action": { - "type": "object", - "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.", - "properties": { - "name": { - "type": "string" - }, - "context": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "object", - "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').", - "properties": { - "path": { - "type": "string" - }, - "literalString": { - "type": "string" - }, - "literalNumber": { - "type": "number" - }, - "literalBoolean": { - "type": "boolean" - } - } - } - }, - "required": ["key", "value"] - } - } - }, - "required": ["name"] - } - }, - "required": ["child", "action"] - }, - "CheckBox": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "object", - "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').", - "properties": { - "literalBoolean": { - "type": "boolean" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["label", "value"] - }, - "TextField": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "text": { - "type": "object", - "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "textFieldType": { - "type": "string", - "description": "The type of input field to display.", - "enum": [ - "date", - "longText", - "number", - "shortText", - "obscured" - ] - }, - "validationRegexp": { - "type": "string", - "description": "A regular expression used for client-side validation of the input." - } - }, - "required": ["label"] - }, - "DateTimeInput": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The selected date and/or time value. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "enableDate": { - "type": "boolean", - "description": "If true, allows the user to select a date." - }, - "enableTime": { - "type": "boolean", - "description": "If true, allows the user to select a time." - }, - "outputFormat": { - "type": "string", - "description": "The desired format for the output string after a date or time is selected." - } - }, - "required": ["value"] - }, - "MultipleChoice": { - "type": "object", - "properties": { - "selections": { - "type": "object", - "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').", - "properties": { - "literalArray": { - "type": "array", - "items": { - "type": "string" - } - }, - "path": { - "type": "string" - } - } - }, - "options": { - "type": "array", - "description": "An array of available options for the user to choose from.", - "items": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "string", - "description": "The value to be associated with this option when selected." - } - }, - "required": ["label", "value"] - } - }, - "maxAllowedSelections": { - "type": "integer", - "description": "The maximum number of options that the user is allowed to select." - } - }, - "required": ["selections", "options"] - }, - "Slider": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').", - "properties": { - "literalNumber": { - "type": "number" - }, - "path": { - "type": "string" - } - } - }, - "minValue": { - "type": "number", - "description": "The minimum value of the slider." - }, - "maxValue": { - "type": "number", - "description": "The maximum value of the slider." - } - }, - "required": ["value"] - } - } - } - }, - "required": ["id", "component"] - } - } - }, - "required": ["surfaceId", "components"] - }, - "dataModelUpdate": { - "type": "object", - "description": "Updates the data model for a surface.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface this data model update applies to." - }, - "path": { - "type": "string", - "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced." - }, - "contents": { - "type": "array", - "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.", - "items": { - "type": "object", - "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string", - "description": "The key for this data entry." - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - }, - "valueMap": { - "description": "Represents a map as an adjacency list.", - "type": "array", - "items": { - "type": "object", - "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string" - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - } - }, - "required": ["key"] - } - } - }, - "required": ["key"] - } - } - }, - "required": ["contents", "surfaceId"] - }, - "deleteSurface": { - "type": "object", - "description": "Signals the client to delete the surface identified by 'surfaceId'.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be deleted." - } - }, - "required": ["surfaceId"] - } - } -} -""" diff --git a/samples/agent/adk/contact_multiple_surfaces/agent.py b/samples/agent/adk/contact_multiple_surfaces/agent.py index 91245a85b..256ac9781 100644 --- a/samples/agent/adk/contact_multiple_surfaces/agent.py +++ b/samples/agent/adk/contact_multiple_surfaces/agent.py @@ -19,10 +19,9 @@ from typing import Any import jsonschema -from a2ui_examples import load_examples, load_floor_plan_example +from a2ui_examples import load_floor_plan_example -# Corrected imports from our new/refactored files -from a2ui_schema import A2UI_SCHEMA +from a2a.types import AgentCapabilities, AgentCard, AgentSkill from google.adk.agents.llm_agent import LlmAgent from google.adk.artifacts import InMemoryArtifactService from google.adk.memory.in_memory_memory_service import InMemoryMemoryService @@ -32,9 +31,13 @@ from google.genai import types from prompt_builder import ( get_text_prompt, - get_ui_prompt, + ROLE_DESCRIPTION, + WORKFLOW_DESCRIPTION, + UI_DESCRIPTION, ) from tools import get_contact_info +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.common_modifiers import remove_strict_validation logger = logging.getLogger(__name__) @@ -47,6 +50,16 @@ class ContactAgent: def __init__(self, base_url: str, use_ui: bool = False): self.base_url = base_url self.use_ui = use_ui + self.schema_manager = ( + A2uiSchemaManager( + version="0.8", + basic_examples_path="examples", + schema_modifiers=[remove_strict_validation], + accepts_inline_catalogs=True, + ) + if use_ui + else None + ) self._agent = self._build_agent(use_ui) self._user_id = "remote_agent" self._runner = Runner( @@ -57,15 +70,34 @@ def __init__(self, base_url: str, use_ui: bool = False): memory_service=InMemoryMemoryService(), ) - # Load A2UI_SCHEMA and wrap it in an array validator for list responses - try: - single_message_schema = json.loads(A2UI_SCHEMA) - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} - logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- + def get_agent_card(self) -> AgentCard: + capabilities = AgentCapabilities( + streaming=True, + extensions=[self.schema_manager.get_agent_extension()], + ) + skill = AgentSkill( + id="find_contact", + name="Find Contact Tool", + description=( + "Helps find contact information for colleagues (e.g., email, location," + " team)." + ), + tags=["contact", "directory", "people", "finder"], + examples=["Who is David Chen in marketing?", "Find Sarah Lee from engineering"], + ) + + return AgentCard( + name="Contact Lookup Agent", + description=( + "This agent helps find contact info for people in your organization." + ), + url=self.base_url, + version="1.0.0", + default_input_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=ContactAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) def get_processing_message(self) -> str: return "Looking up contact information..." @@ -74,12 +106,18 @@ def _build_agent(self, use_ui: bool) -> LlmAgent: """Builds the LLM agent for the contact agent.""" LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - if use_ui: - examples = load_examples(self.base_url) - instruction = get_ui_prompt(self.base_url, examples) - else: - # The text prompt function also returns a complete prompt. - instruction = get_text_prompt() + instruction = ( + self.schema_manager.generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_examples=True, + include_schema=True, + validate_examples=False, # Missing inline_catalogs for OrgChart and WebFrame validation + ) + if use_ui + else get_text_prompt() + ) return LlmAgent( model=LiteLlm(model=LITELLM_MODEL), @@ -113,7 +151,8 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: current_query_text = query # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: + effective_catalog = self.schema_manager.get_effective_catalog() + if self.use_ui and not effective_catalog.catalog_schema: logger.error( "--- ContactAgent.stream: A2UI_SCHEMA is not loaded. " "Cannot perform UI validation. ---" @@ -141,19 +180,6 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: if query.startswith("ACTION:") and "send_message" in query: logger.info("--- ContactAgent.stream: Detected send_message ACTION ---") - # Load the action confirmation example dynamically - try: - from a2ui_examples import load_examples - # We might want to expose a specific loader for this, or just read the file here. - # Since we moved logic to a2ui_examples check if we can import the file constant or just read. - # Actually, a2ui_examples has EXAMPLE_FILES, let's just re-read using pathlib for simplicity or add a helper. - # But wait, load_examples returns the formatted string, including delimiters. - # Let's use the helper we added in a2ui_examples if possible, or just read the file. - # I didn't add a specific helper for action confirmation in a2ui_examples, but I can read the file. - pass - except ImportError: - pass - # Re-implement logic to read from file from pathlib import Path @@ -291,15 +317,14 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: if not json_string_cleaned: raise ValueError("Cleaned JSON string is empty.") - # Validate parsed JSON against A2UI_SCHEMA - parsed_json_data = json.loads(json_string_cleaned) - logger.info( - "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" - ) - jsonschema.validate( - instance=parsed_json_data, schema=self.a2ui_schema_object - ) - # --- End New Validation Steps --- + # Validate parsed JSON against A2UI_SCHEMA + # TODO: Re-enable validation after resolving the inline catalog issue + # parsed_json_data = json.loads(json_string_cleaned) + # logger.info( + # "--- ContactAgent.stream: Validating against A2UI_SCHEMA... ---" + # ) + # effective_catalog.validator.validate(parsed_json_data) + # --- End New Validation Steps --- logger.info( "--- ContactAgent.stream: UI JSON successfully parsed AND validated" diff --git a/samples/agent/adk/contact_multiple_surfaces/agent_executor.py b/samples/agent/adk/contact_multiple_surfaces/agent_executor.py index 55fd2ad85..1645ebe07 100644 --- a/samples/agent/adk/contact_multiple_surfaces/agent_executor.py +++ b/samples/agent/adk/contact_multiple_surfaces/agent_executor.py @@ -42,9 +42,9 @@ class ContactAgentExecutor(AgentExecutor): """Contact AgentExecutor Example.""" - def __init__(self, base_url: str): + def __init__(self, agent: ContactAgent): # Instantiate the UI agent. - self.ui_agent = ContactAgent(base_url=base_url, use_ui=True) + self.ui_agent = agent async def execute( self, @@ -84,16 +84,22 @@ async def execute( # Check for inline catalog if ( - "metadata" in part.root.data - and "inlineCatalogs" in part.root.data["metadata"] + agent.schema_manager.accepts_inline_catalogs + and "metadata" in part.root.data + and "a2uiClientCapabilities" in part.root.data["metadata"] ): - logger.info(f" Part {i}: Found 'inlineCatalogs' in DataPart.") - inline_catalog = part.root.data["metadata"]["inlineCatalogs"] - catalog_json = json.dumps(inline_catalog) + logger.info(f" Part {i}: Found 'a2uiClientCapabilities' in DataPart.") + client_ui_capabilities = part.root.data["metadata"][ + "a2uiClientCapabilities" + ] + catalog = agent.schema_manager.get_effective_catalog( + client_ui_capabilities=client_ui_capabilities + ) + catalog_schema_str = catalog.render_as_llm_instructions() # Append to query so the agent sees it (simple injection) query += ( "\n\n[SYSTEM: The client supports the following custom components:" - f" {catalog_json}]" + f" {catalog_schema_str}]" ) else: logger.info(f" Part {i}: DataPart (data: {part.root.data})") diff --git a/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py b/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py index 1914e13ed..00517ff0a 100644 --- a/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py +++ b/samples/agent/adk/contact_multiple_surfaces/prompt_builder.py @@ -12,82 +12,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -from a2ui_schema import A2UI_SCHEMA - -# This is the agent's master instruction, separate from the UI prompt formatting. -AGENT_INSTRUCTION = """ - You are a helpful contact lookup assistant. Your goal is to help users find colleagues using a rich UI. - - To achieve this, you MUST follow this logic: - - 1. **For finding contacts (e.g., "Who is Alex Jordan?"):** - a. You MUST call the `get_contact_info` tool. Extract the name and department. - b. After receiving the data: - i. If the tool returns a **single contact**, you MUST use the `CONTACT_CARD_EXAMPLE` template. - ii. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. - iii. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" - - 2. **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** - a. You MUST call the `get_contact_info` tool with the specific name. - b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. - - 3. **For handling actions (e.g., "USER_WANTS_TO_EMAIL: ..."):** - a. You MUST use the `ACTION_CONFIRMATION_EXAMPLE` template. - b. Populate the `dataModelUpdate.contents` with a confirmation title and message. +import json +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.common_modifiers import remove_strict_validation + +ROLE_DESCRIPTION = ( + "You are a helpful contact lookup assistant. Your final output MUST be a a2ui UI" + " JSON response." +) + +WORKFLOW_DESCRIPTION = """ +To generate the response, you MUST follow these rules: +1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. +2. The first part is your conversational text response (e.g., "Here is the contact you requested..."). +3. The second part is a single, raw JSON object which is a list of A2UI messages. +4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. +5. Buttons that represent the main action on a card or view (e.g., 'Follow', 'Email', 'Search') SHOULD include the `"primary": true` attribute. """ +UI_DESCRIPTION = """ +- **For finding contacts (e.g., "Who is Alex Jordan?"):** + a. You MUST call the `get_contact_info` tool. + b. If the tool returns a **single contact**, you MUST use the `MULTI_SURFACE_EXAMPLE` template. Provide BOTH the Contact Card and the Org Chart in a single response. + c. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the list of contacts for the "contacts" key. + d. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" -def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. - - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. - - Returns: - A formatted string to be used as the system prompt for the LLM. - """ - - # --- THIS IS THE FIX --- - # We no longer call .format() on the examples, as it breaks the JSON. - formatted_examples = examples - # --- END FIX --- - - return f""" - {AGENT_INSTRUCTION} - You are a helpful contact lookup assistant. Your final output MUST be a a2ui UI JSON response. +- **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** + a. You MUST call the `get_contact_info` tool with the specific name. + b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. - To generate the response, you MUST follow these rules: - 1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. - 2. The first part is your conversational text response (e.g., "Here is the contact you requested..."). - 3. The second part is a single, raw JSON object which is a list of A2UI messages. - 4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. - 5. Buttons that represent the main action on a card or view (e.g., 'Follow', 'Email', 'Search') SHOULD include the `"primary": true` attribute. - - --- UI TEMPLATE RULES --- - - **For finding contacts (e.g., "Who is Alex Jordan?"):** - a. You MUST call the `get_contact_info` tool. - b. If the tool returns a **single contact**, you MUST use the `MULTI_SURFACE_EXAMPLE` template. Provide BOTH the Contact Card and the Org Chart in a single response. - c. If the tool returns **multiple contacts**, you MUST use the `CONTACT_LIST_EXAMPLE` template. Populate the `dataModelUpdate.contents` with the list of contacts for the "contacts" key. - d. If the tool returns an **empty list**, respond with text only and an empty JSON list: "I couldn't find anyone by that name.---a2ui_JSON---[]" - - - **For handling a profile view (e.g., "WHO_IS: Alex Jordan..."):** - a. You MUST call the `get_contact_info` tool with the specific name. - b. This will return a single contact. You MUST use the `CONTACT_CARD_EXAMPLE` template. - - - **For handling actions (e.g., "USER_WANTS_TO_EMAIL: ..."):** - a. You MUST use the `ACTION_CONFIRMATION_EXAMPLE` template. - b. Populate the `dataModelUpdate.contents` with a confirmation title and message (e.g., title: "Email Drafted", message: "Drafting an email to Alex Jordan..."). - - - - {formatted_examples} - - ---BEGIN A2UI JSON SCHEMA--- - {A2UI_SCHEMA} - ---END A2UI JSON SCHEMA--- - """ +- **For handling actions (e.g., "USER_WANTS_TO_EMAIL: ..."):** + a. You MUST use the `ACTION_CONFIRMATION_EXAMPLE` template. + b. Populate the `dataModelUpdate.contents` with a confirmation title and message (e.g., title: "Email Drafted", message: "Drafting an email to Alex Jordan..."). +""" def get_text_prompt() -> str: @@ -110,12 +67,47 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder + # Example of how to use the A2UI Schema Manager to generate a system prompt my_base_url = "http://localhost:8000" - from a2ui_examples import load_examples - - contact_prompt = get_ui_prompt(my_base_url, load_examples(my_base_url)) + schema_manager = A2uiSchemaManager( + "0.8", + basic_examples_path="examples", + accepts_inline_catalogs=True, + schema_modifiers=[remove_strict_validation], + ) + contact_prompt = schema_manager.generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_schema=True, + include_examples=True, + validate_examples=True, + ) print(contact_prompt) with open("generated_prompt.txt", "w") as f: f.write(contact_prompt) print("\nGenerated prompt saved to generated_prompt.txt") + + client_ui_capabilities_str = ( + '{"inlineCatalogs":[{"catalogId": "inline_catalog",' + ' "components":{"OrgChart":{"type":"object","properties":{"chain":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"name":{"type":"string"}},"required":["title","name"]}},"action":{"$ref":"#/definitions/Action"}},"required":["chain"]},"WebFrame":{"type":"object","properties":{"url":{"type":"string"},"html":{"type":"string"},"height":{"type":"number"},"interactionMode":{"type":"string","enum":["readOnly","interactive"]},"allowedEvents":{"type":"array","items":{"type":"string"}}}}}}]}' + ) + client_ui_capabilities = json.loads(client_ui_capabilities_str) + inline_catalog = schema_manager.get_effective_catalog( + client_ui_capabilities=client_ui_capabilities, + ) + request_prompt = inline_catalog.render_as_llm_instructions() + print(request_prompt) + with open("request_prompt.txt", "w") as f: + f.write(request_prompt) + print("\nGenerated request prompt saved to request_prompt.txt") + + basic_catalog = schema_manager.get_effective_catalog() + examples = schema_manager.load_examples( + basic_catalog, + validate=True, + ) + print(examples) + with open("examples.txt", "w") as f: + f.write(examples) + print("\nGenerated examples saved to examples.txt") diff --git a/samples/client/lit/contact/client.ts b/samples/client/lit/contact/client.ts index 0603dc992..b64dda60a 100644 --- a/samples/client/lit/contact/client.ts +++ b/samples/client/lit/contact/client.ts @@ -45,7 +45,9 @@ export class A2UIClient { const finalMessage = { ...message, metadata: { - inlineCatalogs: [catalog], + "a2uiClientCapabilities": { + "inlineCatalogs": [catalog], + }, }, }; From 4f74b4aeaf9343485f66bcad64f849b414db4e73 Mon Sep 17 00:00:00 2001 From: wrenj Date: Fri, 13 Feb 2026 21:44:00 +0000 Subject: [PATCH 52/65] Add basic validation function in python (#624) --- .../extension/send_a2ui_to_client_toolset.py | 3 +- .../src/a2ui/extension/validation.py | 290 ++++++++++++++ .../a2ui_agent/tests/test_validation.py | 358 ++++++++++++++++++ 3 files changed, 650 insertions(+), 1 deletion(-) create mode 100644 a2a_agents/python/a2ui_agent/src/a2ui/extension/validation.py create mode 100644 a2a_agents/python/a2ui_agent/tests/test_validation.py diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/extension/send_a2ui_to_client_toolset.py b/a2a_agents/python/a2ui_agent/src/a2ui/extension/send_a2ui_to_client_toolset.py index 1101869cf..baba339f4 100644 --- a/a2a_agents/python/a2ui_agent/src/a2ui/extension/send_a2ui_to_client_toolset.py +++ b/a2a_agents/python/a2ui_agent/src/a2ui/extension/send_a2ui_to_client_toolset.py @@ -87,6 +87,7 @@ async def get_schema(ctx: ReadonlyContext) -> dict[str, Any]: from a2a import types as a2a_types from a2ui.extension.a2ui_extension import create_a2ui_part from a2ui.extension.a2ui_schema_utils import wrap_as_json_array +from a2ui.extension.validation import validate_a2ui_json from google.adk.a2a.converters import part_converter from google.adk.agents.readonly_context import ReadonlyContext from google.adk.models import LlmRequest @@ -262,7 +263,7 @@ async def run_async( a2ui_json_payload = [a2ui_json_payload] a2ui_schema = await self.get_a2ui_schema(tool_context) - jsonschema.validate(instance=a2ui_json_payload, schema=a2ui_schema) + validate_a2ui_json(a2ui_json_payload, a2ui_schema) logger.info( f"Validated call to tool {self.TOOL_NAME} with {self.A2UI_JSON_ARG_NAME}" diff --git a/a2a_agents/python/a2ui_agent/src/a2ui/extension/validation.py b/a2a_agents/python/a2ui_agent/src/a2ui/extension/validation.py new file mode 100644 index 000000000..db98e16f9 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/src/a2ui/extension/validation.py @@ -0,0 +1,290 @@ +from typing import Any, Dict, Iterator, List, Set, Tuple, Union +import jsonschema +import re + +# RFC 6901 compliant regex for JSON Pointer +JSON_POINTER_PATTERN = re.compile(r"^(?:\/(?:[^~\/]|~[01])*)*$") + +# Recursion Limits +MAX_GLOBAL_DEPTH = 50 +MAX_FUNC_CALL_DEPTH = 5 + +# Constants +COMPONENTS = "components" +ID = "id" +COMPONENT_PROPERTIES = "componentProperties" +ROOT = "root" +PATH = "path" +FUNCTION_CALL = "functionCall" +CALL = "call" +ARGS = "args" + + +def validate_a2ui_json( + a2ui_json: Union[Dict[str, Any], List[Any]], a2ui_schema: Dict[str, Any] +) -> None: + """ + Validates the A2UI JSON payload against the provided schema and checks for integrity. + + Checks performed: + 1. **JSON Schema Validation**: Ensures payload adheres to the A2UI schema. + 2. **Component Integrity**: + - All component IDs are unique. + - A 'root' component exists. + - All unique component references point to valid IDs. + 3. **Topology**: + - No circular references (including self-references). + - No orphaned components (all components must be reachable from 'root'). + 4. **Recursion Limits**: + - Global recursion depth limit (50). + - FunctionCall recursion depth limit (5). + 5. **Path Syntax**: + - Validates JSON Pointer syntax for data paths. + + Args: + a2ui_json: The JSON payload to validate. + a2ui_schema: The schema to validate against. + + Raises: + jsonschema.ValidationError: If the payload does not match the schema. + ValueError: If integrity, topology, or recursion checks fail. + """ + jsonschema.validate(instance=a2ui_json, schema=a2ui_schema) + + # Normalize to list for iteration + messages = a2ui_json if isinstance(a2ui_json, list) else [a2ui_json] + + for message in messages: + if not isinstance(message, dict): + continue + + # Check for SurfaceUpdate which has 'components' + if COMPONENTS in message: + ref_map = _extract_component_ref_fields(a2ui_schema) + _validate_component_integrity(message[COMPONENTS], ref_map) + _validate_topology(message[COMPONENTS], ref_map) + + _validate_recursion_and_paths(message) + + +def _validate_component_integrity( + components: List[Dict[str, Any]], + ref_fields_map: Dict[str, tuple[Set[str], Set[str]]], +) -> None: + """ + Validates that: + 1. All component IDs are unique. + 2. A 'root' component exists. + 3. All references (children, child, etc.) point to existing IDs. + """ + ids: Set[str] = set() + + # 1. Collect IDs and check for duplicates + for comp in components: + comp_id = comp.get(ID) + if comp_id is None: + continue + + if comp_id in ids: + raise ValueError(f"Duplicate component ID found: '{comp_id}'") + ids.add(comp_id) + + # 2. Check for root component + if ROOT not in ids: + raise ValueError( + f"Missing '{ROOT}' component: One component must have '{ID}' set to '{ROOT}'." + ) + + # 3. Check for dangling references using helper + for comp in components: + for ref_id, field_name in _get_component_references(comp, ref_fields_map): + if ref_id not in ids: + raise ValueError( + f"Component '{comp.get(ID)}' references missing ID '{ref_id}' in field" + f" '{field_name}'" + ) + + +def _validate_topology( + components: List[Dict[str, Any]], + ref_fields_map: Dict[str, tuple[Set[str], Set[str]]], +) -> None: + """ + Validates the topology of the component tree: + 1. No circular references (including self-references). + 2. No orphaned components (all components must be reachable from 'root'). + """ + adj_list: Dict[str, List[str]] = {} + all_ids: Set[str] = set() + + # Build Adjacency List + for comp in components: + comp_id = comp.get(ID) + if comp_id is None: + continue + + all_ids.add(comp_id) + if comp_id not in adj_list: + adj_list[comp_id] = [] + + for ref_id, field_name in _get_component_references(comp, ref_fields_map): + if ref_id == comp_id: + raise ValueError( + f"Self-reference detected: Component '{comp_id}' references itself in field" + f" '{field_name}'" + ) + adj_list[comp_id].append(ref_id) + + # Detect Cycles using DFS + visited: Set[str] = set() + recursion_stack: Set[str] = set() + + def dfs(node_id: str): + visited.add(node_id) + recursion_stack.add(node_id) + + for neighbor in adj_list.get(node_id, []): + if neighbor not in visited: + dfs(neighbor) + elif neighbor in recursion_stack: + raise ValueError( + f"Circular reference detected involving component '{neighbor}'" + ) + + recursion_stack.remove(node_id) + + if ROOT in all_ids: + dfs(ROOT) + + # Check for Orphans + orphans = all_ids - visited + if orphans: + sorted_orphans = sorted(list(orphans)) + raise ValueError( + f"Orphaned components detected (not reachable from '{ROOT}'): {sorted_orphans}" + ) + + +def _extract_component_ref_fields( + schema: Dict[str, Any], +) -> Dict[str, tuple[Set[str], Set[str]]]: + """ + Parses the JSON schema to identify which component properties reference other components. + Returns a map: { component_name: (set_of_single_ref_fields, set_of_list_ref_fields) } + """ + ref_map = {} + + root_defs = schema.get("$defs") or schema.get("definitions", {}) + + # Helper to check if a property schema looks like a ComponentId reference + def is_component_id_ref(prop_schema: Dict[str, Any]) -> bool: + ref = prop_schema.get("$ref", "") + if ref.endswith("ComponentId"): + return True + return False + + def is_child_list_ref(prop_schema: Dict[str, Any]) -> bool: + ref = prop_schema.get("$ref", "") + if ref.endswith("ChildList"): + return True + # Or array of ComponentIds + if prop_schema.get("type") == "array": + items = prop_schema.get("items", {}) + if is_component_id_ref(items): + return True + return False + + comps_schema = schema.get("properties", {}).get(COMPONENTS, {}) + items_schema = comps_schema.get("items", {}) + comp_props_schema = items_schema.get("properties", {}).get(COMPONENT_PROPERTIES, {}) + all_components = comp_props_schema.get("properties", {}) + + for comp_name, comp_schema in all_components.items(): + single_refs = set() + list_refs = set() + + props = comp_schema.get("properties", {}) + for prop_name, prop_schema in props.items(): + if is_component_id_ref(prop_schema): + single_refs.add(prop_name) + elif is_child_list_ref(prop_schema): + list_refs.add(prop_name) + + if single_refs or list_refs: + ref_map[comp_name] = (single_refs, list_refs) + + return ref_map + + +def _get_component_references( + component: Dict[str, Any], ref_fields_map: Dict[str, tuple[Set[str], Set[str]]] +) -> Iterator[Tuple[str, str]]: + """ + Helper to extract all referenced component IDs from a component. + Yields (referenced_id, field_name). + """ + comp_props_container = component.get(COMPONENT_PROPERTIES) + if not isinstance(comp_props_container, dict): + return + + for comp_type, props in comp_props_container.items(): + if not isinstance(props, dict): + continue + + single_refs, list_refs = ref_fields_map.get(comp_type, (set(), set())) + + for key, value in props.items(): + if key in single_refs: + if isinstance(value, str): + yield value, key + elif key in list_refs: + if isinstance(value, list): + for item in value: + if isinstance(item, str): + yield item, key + + +def _validate_recursion_and_paths(data: Any) -> None: + """ + Validates: + 1. Global recursion depth limit (50). + 2. FunctionCall recursion depth limit (5). + 3. Path syntax for DataBindings/DataModelUpdates. + """ + + def traverse(item: Any, global_depth: int, func_depth: int): + if global_depth > MAX_GLOBAL_DEPTH: + raise ValueError(f"Global recursion limit exceeded: Depth > {MAX_GLOBAL_DEPTH}") + + if isinstance(item, list): + for x in item: + traverse(x, global_depth + 1, func_depth) + return + + if isinstance(item, dict): + # Check for path + if PATH in item and isinstance(item[PATH], str): + path = item[PATH] + if not re.fullmatch(JSON_POINTER_PATTERN, path): + raise ValueError(f"Invalid JSON Pointer syntax: '{path}'") + + # Check for FunctionCall + is_func = CALL in item and ARGS in item + + if is_func: + if func_depth >= MAX_FUNC_CALL_DEPTH: + raise ValueError( + f"Recursion limit exceeded: {FUNCTION_CALL} depth > {MAX_FUNC_CALL_DEPTH}" + ) + + # Increment func_depth only for 'args', but global_depth matches traversal + for k, v in item.items(): + if k == ARGS: + traverse(v, global_depth + 1, func_depth + 1) + else: + traverse(v, global_depth + 1, func_depth) + else: + for v in item.values(): + traverse(v, global_depth + 1, func_depth) + + traverse(data, 0, 0) diff --git a/a2a_agents/python/a2ui_agent/tests/test_validation.py b/a2a_agents/python/a2ui_agent/tests/test_validation.py new file mode 100644 index 000000000..afd642e58 --- /dev/null +++ b/a2a_agents/python/a2ui_agent/tests/test_validation.py @@ -0,0 +1,358 @@ +import pytest +import jsonschema +from a2ui.extension.validation import validate_a2ui_json + + +# Fixture for the schema +@pytest.fixture +def schema(): + return { + "type": "object", + "$defs": { + "ComponentId": {"type": "string"}, + "ChildList": {"type": "array", "items": {"$ref": "#/$defs/ComponentId"}}, + }, + "properties": { + "components": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": {"$ref": "#/$defs/ComponentId"}, + "componentProperties": { + "type": "object", + "properties": { + "Column": { + "type": "object", + "properties": { + "children": {"$ref": "#/$defs/ChildList"} + }, + }, + "Row": { + "type": "object", + "properties": { + "children": {"$ref": "#/$defs/ChildList"} + }, + }, + "Container": { + "type": "object", + "properties": { + "children": {"$ref": "#/$defs/ChildList"} + }, + }, + "Card": { + "type": "object", + "properties": { + "child": {"$ref": "#/$defs/ComponentId"} + }, + }, + "Button": { + "type": "object", + "properties": { + "child": {"$ref": "#/$defs/ComponentId"}, + "action": { + "properties": { + "functionCall": { + "properties": { + "call": {"type": "string"}, + "args": {"type": "object"}, + } + } + } + }, + }, + }, + "Text": { + "type": "object", + "properties": { + "text": { + "oneOf": [ + {"type": "string"}, + {"type": "object"}, + ] + } + }, + }, + }, + }, + }, + "required": ["id"], + }, + } + }, + } + + +def test_validate_a2ui_json_valid_integrity(schema): + payload = { + "components": [ + {"id": "root", "componentProperties": {"Column": {"children": ["child1"]}}}, + {"id": "child1", "componentProperties": {"Text": {"text": "Hello"}}}, + ] + } + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_duplicate_ids(schema): + payload = { + "components": [ + {"id": "root", "componentProperties": {}}, + {"id": "root", "componentProperties": {}}, + ] + } + with pytest.raises(ValueError, match="Duplicate component ID found: 'root'"): + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_missing_root(schema): + payload = {"components": [{"id": "not-root", "componentProperties": {}}]} + with pytest.raises(ValueError, match="Missing 'root' component"): + validate_a2ui_json(payload, schema) + + +@pytest.mark.parametrize( + "component_type, field_name, ids_to_ref", + [ + ("Card", "child", "missing_child"), + ("Column", "children", ["child1", "missing_child"]), + ], +) +def test_validate_a2ui_json_dangling_references( + schema, component_type, field_name, ids_to_ref +): + """Test dangling references for both single and list fields.""" + # Construct payload dynamically + props = {field_name: ids_to_ref} + payload = { + "components": [{"id": "root", "componentProperties": {component_type: props}}] + } + if isinstance(ids_to_ref, list): + # Add valid children if any + for child_id in ids_to_ref: + if child_id != "missing_child": + payload["components"].append({"id": child_id, "componentProperties": {}}) + + with pytest.raises( + ValueError, + match=( + "Component 'root' references missing ID 'missing_child' in field" + f" '{field_name}'" + ), + ): + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_self_reference(schema): + payload = { + "components": [ + {"id": "root", "componentProperties": {"Container": {"children": ["root"]}}} + ] + } + with pytest.raises( + ValueError, + match=( + "Self-reference detected: Component 'root' references itself in field" + " 'children'" + ), + ): + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_circular_reference(schema): + payload = { + "components": [ + { + "id": "root", + "componentProperties": {"Container": {"children": ["child1"]}}, + }, + { + "id": "child1", + "componentProperties": {"Container": {"children": ["root"]}}, + }, + ] + } + with pytest.raises( + ValueError, match="Circular reference detected involving component" + ): + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_orphaned_component(schema): + payload = { + "components": [ + {"id": "root", "componentProperties": {"Container": {"children": []}}}, + {"id": "orphan", "componentProperties": {}}, + ] + } + with pytest.raises( + ValueError, + match=r"Orphaned components detected \(not reachable from 'root'\): \['orphan'\]", + ): + validate_a2ui_json(payload, schema) + + +def test_validate_a2ui_json_valid_topology_complex(schema): + """Test a valid topology with multiple levels.""" + payload = { + "components": [ + { + "id": "root", + "componentProperties": {"Container": {"children": ["child1", "child2"]}}, + }, + {"id": "child1", "componentProperties": {"Text": {"text": "Hello"}}}, + { + "id": "child2", + "componentProperties": {"Container": {"children": ["child3"]}}, + }, + {"id": "child3", "componentProperties": {"Text": {"text": "World"}}}, + ] + } + validate_a2ui_json(payload, schema) + + +def test_validate_recursion_limit_exceeded(schema): + """Test that recursion depth > 5 raises ValueError.""" + # Construct deep function call + args = {} + current = args + for i in range(5): # Depth 0 to 5 (6 levels) + current["arg"] = {"call": f"fn{i}", "args": {}} + current = current["arg"]["args"] + + payload = { + "components": [{ + "id": "root", + "componentProperties": { + "Button": { + "label": "Click me", + "action": {"functionCall": {"call": "fn_top", "args": args}}, + } + }, + }] + } + with pytest.raises(ValueError, match="Recursion limit exceeded"): + validate_a2ui_json(payload, schema) + + +def test_validate_recursion_limit_valid(schema): + """Test that recursion depth <= 5 is allowed.""" + # Construct max depth function call (Depth 5) + args = {} + current = args + for i in range(4): # Depth 0 to 4 (5 levels) + current["arg"] = {"call": f"fn{i}", "args": {}} + current = current["arg"]["args"] + + payload = { + "components": [{ + "id": "root", + "componentProperties": { + "Button": { + "label": "Click me", + "action": {"functionCall": {"call": "fn_top", "args": args}}, + } + }, + }] + } + validate_a2ui_json(payload, schema) + + +@pytest.mark.parametrize( + "payload", + [ + { + "updateDataModel": { + "surfaceId": "surface1", + "path": "invalid//path", + "value": "data", + } + }, + { + "components": [{ + "id": "root", + "componentProperties": { + "Text": {"text": {"path": "invalid path with spaces"}} + }, + }] + }, + { + "updateDataModel": { + "surfaceId": "surface1", + "path": "/invalid/escape/~2", + "value": "data", + } + }, + ], +) +def test_validate_invalid_paths(schema, payload): + """Test various invalid paths (JSON Pointer syntax).""" + with pytest.raises(ValueError, match="Invalid JSON Pointer syntax"): + validate_a2ui_json(payload, schema) + + +def test_validate_global_recursion_limit_exceeded(schema): + """Test that global recursion depth > 50 raises ValueError.""" + # Create a deeply nested dictionary + deep_payload = {"level": 0} + current = deep_payload + for i in range(55): + current["next"] = {"level": i + 1} + current = current["next"] + + with pytest.raises(ValueError, match="Global recursion limit exceeded"): + validate_a2ui_json(deep_payload, schema) + + +def test_validate_custom_schema_reference(): + """Test validation with a custom schema where a component has a non-standard reference field.""" + # Custom schema extending the base one + custom_schema = { + "type": "object", + "$defs": { + "ComponentId": {"type": "string"}, + "ChildList": {"type": "array", "items": {"$ref": "#/$defs/ComponentId"}}, + }, + "properties": { + "components": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": {"$ref": "#/$defs/ComponentId"}, + "componentProperties": { + "type": "object", + "properties": { + "CustomLink": { + "type": "object", + "properties": { + "linkedComponentId": { + "$ref": "#/$defs/ComponentId" + } + }, + } + }, + }, + }, + "required": ["id"], + }, + } + }, + } + + payload = { + "components": [{ + "id": "root", + "componentProperties": { + "CustomLink": {"linkedComponentId": "missing_target"} + }, + }] + } + + with pytest.raises( + ValueError, + match=( + "Component 'root' references missing ID 'missing_target' in field" + " 'linkedComponentId'" + ), + ): + validate_a2ui_json(payload, custom_schema) From e1314fc42f499de669f95bae17a20dfb5765a9c8 Mon Sep 17 00:00:00 2001 From: Nan Yu Date: Fri, 13 Feb 2026 22:17:40 +0000 Subject: [PATCH 53/65] Update the restaurant finder sample (#570) It updates the sample to use the A2uiSchemaManager from the a2ui-agent python SDK. Tested: - [x] The `restaurant` angular client successfully connected to the `restaurant_finder` agent and rendered the response correctly. --- .../agent/adk/restaurant_finder/__main__.py | 32 +- .../adk/restaurant_finder/a2ui_examples.py | 186 ---- samples/agent/adk/restaurant_finder/agent.py | 97 +- .../adk/restaurant_finder/agent_executor.py | 6 +- .../examples/booking_form.json | 30 + .../examples/confirmation.json | 27 + .../examples/single_column_list.json | 45 + .../examples/two_column_list.json | 56 ++ .../adk/restaurant_finder/prompt_builder.py | 847 +----------------- 9 files changed, 254 insertions(+), 1072 deletions(-) delete mode 100644 samples/agent/adk/restaurant_finder/a2ui_examples.py create mode 100644 samples/agent/adk/restaurant_finder/examples/booking_form.json create mode 100644 samples/agent/adk/restaurant_finder/examples/confirmation.json create mode 100644 samples/agent/adk/restaurant_finder/examples/single_column_list.json create mode 100644 samples/agent/adk/restaurant_finder/examples/two_column_list.json diff --git a/samples/agent/adk/restaurant_finder/__main__.py b/samples/agent/adk/restaurant_finder/__main__.py index ee4e9115b..f816cf6d8 100644 --- a/samples/agent/adk/restaurant_finder/__main__.py +++ b/samples/agent/adk/restaurant_finder/__main__.py @@ -19,8 +19,6 @@ from a2a.server.apps import A2AStarletteApplication from a2a.server.request_handlers import DefaultRequestHandler from a2a.server.tasks import InMemoryTaskStore -from a2a.types import AgentCapabilities, AgentCard, AgentSkill -from a2ui.extension.a2ui_extension import get_a2ui_agent_extension from agent import RestaurantAgent from agent_executor import RestaurantAgentExecutor from dotenv import load_dotenv @@ -50,41 +48,19 @@ def main(host, port): " is not TRUE." ) - capabilities = AgentCapabilities( - streaming=True, - extensions=[get_a2ui_agent_extension()], - ) - skill = AgentSkill( - id="find_restaurants", - name="Find Restaurants Tool", - description=( - "Helps find restaurants based on user criteria (e.g., cuisine, location)." - ), - tags=["restaurant", "finder"], - examples=["Find me the top 10 chinese restaurants in the US"], - ) - base_url = f"http://{host}:{port}" - agent_card = AgentCard( - name="Restaurant Agent", - description="This agent helps find restaurants based on user criteria.", - url=base_url, # <-- Use base_url here - version="1.0.0", - default_input_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, - default_output_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, - capabilities=capabilities, - skills=[skill], - ) + ui_agent = RestaurantAgent(base_url=base_url, use_ui=True) + text_agent = RestaurantAgent(base_url=base_url, use_ui=False) - agent_executor = RestaurantAgentExecutor(base_url=base_url) + agent_executor = RestaurantAgentExecutor(ui_agent, text_agent) request_handler = DefaultRequestHandler( agent_executor=agent_executor, task_store=InMemoryTaskStore(), ) server = A2AStarletteApplication( - agent_card=agent_card, http_handler=request_handler + agent_card=ui_agent.get_agent_card(), http_handler=request_handler ) import uvicorn diff --git a/samples/agent/adk/restaurant_finder/a2ui_examples.py b/samples/agent/adk/restaurant_finder/a2ui_examples.py deleted file mode 100644 index b77a685ea..000000000 --- a/samples/agent/adk/restaurant_finder/a2ui_examples.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -RESTAURANT_UI_EXAMPLES = """ ----BEGIN SINGLE_COLUMN_LIST_EXAMPLE--- -[ - {{ "beginRendering": {{ "surfaceId": "default", "root": "root-column", "styles": {{ "primaryColor": "#FF0000", "font": "Roboto" }} }} }}, - {{ "surfaceUpdate": {{ - "surfaceId": "default", - "components": [ - {{ "id": "root-column", "component": {{ "Column": {{ "children": {{ "explicitList": ["title-heading", "item-list"] }} }} }} }}, - {{ "id": "title-heading", "component": {{ "Text": {{ "usageHint": "h1", "text": {{ "path": "title" }} }} }} }}, - {{ "id": "item-list", "component": {{ "List": {{ "direction": "vertical", "children": {{ "template": {{ "componentId": "item-card-template", "dataBinding": "/items" }} }} }} }} }}, - {{ "id": "item-card-template", "component": {{ "Card": {{ "child": "card-layout" }} }} }}, - {{ "id": "card-layout", "component": {{ "Row": {{ "children": {{ "explicitList": ["template-image", "card-details"] }} }} }} }}, - {{ "id": "template-image", weight: 1, "component": {{ "Image": {{ "url": {{ "path": "imageUrl" }} }} }} }}, - {{ "id": "card-details", weight: 2, "component": {{ "Column": {{ "children": {{ "explicitList": ["template-name", "template-rating", "template-detail", "template-link", "template-book-button"] }} }} }} }}, - {{ "id": "template-name", "component": {{ "Text": {{ "usageHint": "h3", "text": {{ "path": "name" }} }} }} }}, - {{ "id": "template-rating", "component": {{ "Text": {{ "text": {{ "path": "rating" }} }} }} }}, - {{ "id": "template-detail", "component": {{ "Text": {{ "text": {{ "path": "detail" }} }} }} }}, - {{ "id": "template-link", "component": {{ "Text": {{ "text": {{ "path": "infoLink" }} }} }} }}, - {{ "id": "template-book-button", "component": {{ "Button": {{ "child": "book-now-text", "primary": true, "action": {{ "name": "book_restaurant", "context": [ {{ "key": "restaurantName", "value": {{ "path": "name" }} }}, {{ "key": "imageUrl", "value": {{ "path": "imageUrl" }} }}, {{ "key": "address", "value": {{ "path": "address" }} }} ] }} }} }} }}, - {{ "id": "book-now-text", "component": {{ "Text": {{ "text": {{ "literalString": "Book Now" }} }} }} }} - ] - }} }}, - {{ "dataModelUpdate": {{ - "surfaceId": "default", - "path": "/", - "contents": [ - {{ "key": "items", "valueMap": [ - {{ "key": "item1", "valueMap": [ - {{ "key": "name", "valueString": "The Fancy Place" }}, - {{ "key": "rating", "valueNumber": 4.8 }}, - {{ "key": "detail", "valueString": "Fine dining experience" }}, - {{ "key": "infoLink", "valueString": "https://example.com/fancy" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/fancy.jpg" }}, - {{ "key": "address", "valueString": "123 Main St" }} - ] }}, - {{ "key": "item2", "valueMap": [ - {{ "key": "name", "valueString": "Quick Bites" }}, - {{ "key": "rating", "valueNumber": 4.2 }}, - {{ "key": "detail", "valueString": "Casual and fast" }}, - {{ "key": "infoLink", "valueString": "https://example.com/quick" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/quick.jpg" }}, - {{ "key": "address", "valueString": "456 Oak Ave" }} - ] }} - ] }} // Populate this with restaurant data - ] - }} }} -] ----END SINGLE_COLUMN_LIST_EXAMPLE--- - ----BEGIN TWO_COLUMN_LIST_EXAMPLE--- -[ - {{ "beginRendering": {{ "surfaceId": "default", "root": "root-column", "styles": {{ "primaryColor": "#FF0000", "font": "Roboto" }} }} }}, - {{ "surfaceUpdate": {{ - "surfaceId": "default", - "components": [ - {{ "id": "root-column", "component": {{ "Column": {{ "children": {{ "explicitList": ["title-heading", "restaurant-row-1"] }} }} }} }}, - {{ "id": "title-heading", "component": {{ "Text": {{ "usageHint": "h1", "text": {{ "path": "title" }} }} }} }}, - {{ "id": "restaurant-row-1", "component": {{ "Row": {{ "children": {{ "explicitList": ["item-card-1", "item-card-2"] }} }} }} }}, - {{ "id": "item-card-1", "weight": 1, "component": {{ "Card": {{ "child": "card-layout-1" }} }} }}, - {{ "id": "card-layout-1", "component": {{ "Column": {{ "children": {{ "explicitList": ["template-image-1", "card-details-1"] }} }} }} }}, - {{ "id": "template-image-1", "component": {{ "Image": {{ "url": {{ "path": "/items/0/imageUrl" }}, "width": "100%" }} }} }}, - {{ "id": "card-details-1", "component": {{ "Column": {{ "children": {{ "explicitList": ["template-name-1", "template-rating-1", "template-detail-1", "template-link-1", "template-book-button-1"] }} }} }} }}, - {{ "id": "template-name-1", "component": {{ "Text": {{ "usageHint": "h3", "text": {{ "path": "/items/0/name" }} }} }} }}, - {{ "id": "template-rating-1", "component": {{ "Text": {{ "text": {{ "path": "/items/0/rating" }} }} }} }}, - {{ "id": "template-detail-1", "component": {{ "Text": {{ "text": {{ "path": "/items/0/detail" }} }} }} }}, - {{ "id": "template-link-1", "component": {{ "Text": {{ "text": {{ "path": "/items/0/infoLink" }} }} }} }}, - {{ "id": "template-book-button-1", "component": {{ "Button": {{ "child": "book-now-text-1", "action": {{ "name": "book_restaurant", "context": [ {{ "key": "restaurantName", "value": {{ "path": "/items/0/name" }} }}, {{ "key": "imageUrl", "value": {{ "path": "/items/0/imageUrl" }} }}, {{ "key": "address", "value": {{ "path": "/items/0/address" }} }} ] }} }} }} }}, - {{ "id": "book-now-text-1", "component": {{ "Text": {{ "text": {{ "literalString": "Book Now" }} }} }} }}, - {{ "id": "item-card-2", "weight": 1, "component": {{ "Card": {{ "child": "card-layout-2" }} }} }}, - {{ "id": "card-layout-2", "component": {{ "Column": {{ "children": {{ "explicitList": ["template-image-2", "card-details-2"] }} }} }} }}, - {{ "id": "template-image-2", "component": {{ "Image": {{ "url": {{ "path": "/items/1/imageUrl" }}, "width": "100%" }} }} }}, - {{ "id": "card-details-2", "component": {{ "Column": {{ "children": {{ "explicitList": ["template-name-2", "template-rating-2", "template-detail-2", "template-link-2", "template-book-button-2"] }} }} }} }}, - {{ "id": "template-name-2", "component": {{ "Text": {{ "usageHint": "h3", "text": {{ "path": "/items/1/name" }} }} }} }}, - {{ "id": "template-rating-2", "component": {{ "Text": {{ "text": {{ "path": "/items/1/rating" }} }} }} }}, - {{ "id": "template-detail-2", "component": {{ "Text": {{ "text": {{ "path": "/items/1/detail" }} }} }} }}, - {{ "id": "template-link-2", "component": {{ "Text": {{ "text": {{ "path": "/items/1/infoLink" }} }} }} }}, - {{ "id": "template-book-button-2", "component": {{ "Button": {{ "child": "book-now-text-2", "action": {{ "name": "book_restaurant", "context": [ {{ "key": "restaurantName", "value": {{ "path": "/items/1/name" }} }}, {{ "key": "imageUrl", "value": {{ "path": "/items/1/imageUrl" }} }}, {{ "key": "address", "value": {{ "path": "/items/1/address" }} }} ] }} }} }} }}, - {{ "id": "book-now-text-2", "component": {{ "Text": {{ "text": {{ "literalString": "Book Now" }} }} }} }} - ] - }} }}, - {{ "dataModelUpdate": {{ - "surfaceId": "default", - "path": "/", - "contents": [ - {{ "key": "title", "valueString": "Top Restaurants" }}, - {{ "key": "items", "valueMap": [ - {{ "key": "item1", "valueMap": [ - {{ "key": "name", "valueString": "The Fancy Place" }}, - {{ "key": "rating", "valueNumber": 4.8 }}, - {{ "key": "detail", "valueString": "Fine dining experience" }}, - {{ "key": "infoLink", "valueString": "https://example.com/fancy" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/fancy.jpg" }}, - {{ "key": "address", "valueString": "123 Main St" }} - ] }}, - {{ "key": "item2", "valueMap": [ - {{ "key": "name", "valueString": "Quick Bites" }}, - {{ "key": "rating", "valueNumber": 4.2 }}, - {{ "key": "detail", "valueString": "Casual and fast" }}, - {{ "key": "infoLink", "valueString": "https://example.com/quick" }}, - {{ "key": "imageUrl", "valueString": "https://example.com/quick.jpg" }}, - {{ "key": "address", "valueString": "456 Oak Ave" }} - ] }} - ] }} // Populate this with restaurant data - ] - }} }} -] ----END TWO_COLUMN_LIST_EXAMPLE--- - ----BEGIN BOOKING_FORM_EXAMPLE--- -[ - {{ "beginRendering": {{ "surfaceId": "booking-form", "root": "booking-form-column", "styles": {{ "primaryColor": "#FF0000", "font": "Roboto" }} }} }}, - {{ "surfaceUpdate": {{ - "surfaceId": "booking-form", - "components": [ - {{ "id": "booking-form-column", "component": {{ "Column": {{ "children": {{ "explicitList": ["booking-title", "restaurant-image", "restaurant-address", "party-size-field", "datetime-field", "dietary-field", "submit-button"] }} }} }} }}, - {{ "id": "booking-title", "component": {{ "Text": {{ "usageHint": "h2", "text": {{ "path": "title" }} }} }} }}, - {{ "id": "restaurant-image", "component": {{ "Image": {{ "url": {{ "path": "imageUrl" }} }} }} }}, - {{ "id": "restaurant-address", "component": {{ "Text": {{ "text": {{ "path": "address" }} }} }} }}, - {{ "id": "party-size-field", "component": {{ "TextField": {{ "label": {{ "literalString": "Party Size" }}, "text": {{ "path": "partySize" }}, "type": "number" }} }} }}, - {{ "id": "datetime-field", "component": {{ "DateTimeInput": {{ "label": {{ "literalString": "Date & Time" }}, "value": {{ "path": "reservationTime" }}, "enableDate": true, "enableTime": true }} }} }}, - {{ "id": "dietary-field", "component": {{ "TextField": {{ "label": {{ "literalString": "Dietary Requirements" }}, "text": {{ "path": "dietary" }} }} }} }}, - {{ "id": "submit-button", "component": {{ "Button": {{ "child": "submit-reservation-text", "action": {{ "name": "submit_booking", "context": [ {{ "key": "restaurantName", "value": {{ "path": "restaurantName" }} }}, {{ "key": "partySize", "value": {{ "path": "partySize" }} }}, {{ "key": "reservationTime", "value": {{ "path": "reservationTime" }} }}, {{ "key": "dietary", "value": {{ "path": "dietary" }} }}, {{ "key": "imageUrl", "value": {{ "path": "imageUrl" }} }} ] }} }} }} }}, - {{ "id": "submit-reservation-text", "component": {{ "Text": {{ "text": {{ "literalString": "Submit Reservation" }} }} }} }} - ] - }} }}, - {{ "dataModelUpdate": {{ - "surfaceId": "booking-form", - "path": "/", - "contents": [ - {{ "key": "title", "valueString": "Book a Table at [RestaurantName]" }}, - {{ "key": "address", "valueString": "[Restaurant Address]" }}, - {{ "key": "restaurantName", "valueString": "[RestaurantName]" }}, - {{ "key": "partySize", "valueString": "2" }}, - {{ "key": "reservationTime", "valueString": "" }}, - {{ "key": "dietary", "valueString": "" }}, - {{ "key": "imageUrl", "valueString": "" }} - ] - }} }} -] ----END BOOKING_FORM_EXAMPLE--- - ----BEGIN CONFIRMATION_EXAMPLE--- -[ - {{ "beginRendering": {{ "surfaceId": "confirmation", "root": "confirmation-card", "styles": {{ "primaryColor": "#FF0000", "font": "Roboto" }} }} }}, - {{ "surfaceUpdate": {{ - "surfaceId": "confirmation", - "components": [ - {{ "id": "confirmation-card", "component": {{ "Card": {{ "child": "confirmation-column" }} }} }}, - {{ "id": "confirmation-column", "component": {{ "Column": {{ "children": {{ "explicitList": ["confirm-title", "confirm-image", "divider1", "confirm-details", "divider2", "confirm-dietary", "divider3", "confirm-text"] }} }} }} }}, - {{ "id": "confirm-title", "component": {{ "Text": {{ "usageHint": "h2", "text": {{ "path": "title" }} }} }} }}, - {{ "id": "confirm-image", "component": {{ "Image": {{ "url": {{ "path": "imageUrl" }} }} }} }}, - {{ "id": "confirm-details", "component": {{ "Text": {{ "text": {{ "path": "bookingDetails" }} }} }} }}, - {{ "id": "confirm-dietary", "component": {{ "Text": {{ "text": {{ "path": "dietaryRequirements" }} }} }} }}, - {{ "id": "confirm-text", "component": {{ "Text": {{ "usageHint": "h5", "text": {{ "literalString": "We look forward to seeing you!" }} }} }} }}, - {{ "id": "divider1", "component": {{ "Divider": {{}} }} }}, - {{ "id": "divider2", "component": {{ "Divider": {{}} }} }}, - {{ "id": "divider3", "component": {{ "Divider": {{}} }} }} - ] - }} }}, - {{ "dataModelUpdate": {{ - "surfaceId": "confirmation", - "path": "/", - "contents": [ - {{ "key": "title", "valueString": "Booking at [RestaurantName]" }}, - {{ "key": "bookingDetails", "valueString": "[PartySize] people at [Time]" }}, - {{ "key": "dietaryRequirements", "valueString": "Dietary Requirements: [Requirements]" }}, - {{ "key": "imageUrl", "valueString": "[ImageUrl]" }} - ] - }} }} -] ----END CONFIRMATION_EXAMPLE--- -""" diff --git a/samples/agent/adk/restaurant_finder/agent.py b/samples/agent/adk/restaurant_finder/agent.py index e4f9e3fef..1e776d1ee 100644 --- a/samples/agent/adk/restaurant_finder/agent.py +++ b/samples/agent/adk/restaurant_finder/agent.py @@ -19,6 +19,7 @@ from typing import Any import jsonschema +from a2a.types import AgentCapabilities, AgentCard, AgentSkill from google.adk.agents.llm_agent import LlmAgent from google.adk.artifacts import InMemoryArtifactService from google.adk.memory.in_memory_memory_service import InMemoryMemoryService @@ -27,31 +28,17 @@ from google.adk.sessions import InMemorySessionService from google.genai import types from prompt_builder import ( - A2UI_SCHEMA, - RESTAURANT_UI_EXAMPLES, get_text_prompt, - get_ui_prompt, + ROLE_DESCRIPTION, + WORKFLOW_DESCRIPTION, + UI_DESCRIPTION, ) from tools import get_restaurants +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.common_modifiers import remove_strict_validation logger = logging.getLogger(__name__) -AGENT_INSTRUCTION = """ - You are a helpful restaurant finding assistant. Your goal is to help users find and book restaurants using a rich UI. - - To achieve this, you MUST follow this logic: - - 1. **For finding restaurants:** - a. You MUST call the `get_restaurants` tool. Extract the cuisine, location, and a specific number (`count`) of restaurants from the user's query (e.g., for "top 5 chinese places", count is 5). - b. After receiving the data, you MUST follow the instructions precisely to generate the final a2ui UI JSON, using the appropriate UI example from the `prompt_builder.py` based on the number of restaurants. - - 2. **For booking a table (when you receive a query like 'USER_WANTS_TO_BOOK...'):** - a. You MUST use the appropriate UI example from `prompt_builder.py` to generate the UI, populating the `dataModelUpdate.contents` with the details from the user's query. - - 3. **For confirming a booking (when you receive a query like 'User submitted a booking...'):** - a. You MUST use the appropriate UI example from `prompt_builder.py` to generate the confirmation UI, populating the `dataModelUpdate.contents` with the final booking details. -""" - class RestaurantAgent: """An agent that finds restaurants based on user criteria.""" @@ -61,6 +48,15 @@ class RestaurantAgent: def __init__(self, base_url: str, use_ui: bool = False): self.base_url = base_url self.use_ui = use_ui + self._schema_manager = ( + A2uiSchemaManager( + "0.8", + basic_examples_path="examples/", + schema_modifiers=[remove_strict_validation], + ) + if use_ui + else None + ) self._agent = self._build_agent(use_ui) self._user_id = "remote_agent" self._runner = Runner( @@ -71,20 +67,31 @@ def __init__(self, base_url: str, use_ui: bool = False): memory_service=InMemoryMemoryService(), ) - # --- MODIFICATION: Wrap the schema --- - # Load the A2UI_SCHEMA string into a Python object for validation - try: - # First, load the schema for a *single message* - single_message_schema = json.loads(A2UI_SCHEMA) - - # The prompt instructs the LLM to return a *list* of messages. - # Therefore, our validation schema must be an *array* of the single message schema. - self.a2ui_schema_object = {"type": "array", "items": single_message_schema} - logger.info("A2UI_SCHEMA successfully loaded and wrapped in an array validator.") - except json.JSONDecodeError as e: - logger.error(f"CRITICAL: Failed to parse A2UI_SCHEMA: {e}") - self.a2ui_schema_object = None - # --- END MODIFICATION --- + def get_agent_card(self) -> AgentCard: + capabilities = AgentCapabilities( + streaming=True, + extensions=[self._schema_manager.get_agent_extension()], + ) + skill = AgentSkill( + id="find_restaurants", + name="Find Restaurants Tool", + description=( + "Helps find restaurants based on user criteria (e.g., cuisine, location)." + ), + tags=["restaurant", "finder"], + examples=["Find me the top 10 chinese restaurants in the US"], + ) + + return AgentCard( + name="Restaurant Agent", + description="This agent helps find restaurants based on user criteria.", + url=self.base_url, + version="1.0.0", + default_input_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, + default_output_modes=RestaurantAgent.SUPPORTED_CONTENT_TYPES, + capabilities=capabilities, + skills=[skill], + ) def get_processing_message(self) -> str: return "Finding restaurants that match your criteria..." @@ -93,13 +100,18 @@ def _build_agent(self, use_ui: bool) -> LlmAgent: """Builds the LLM agent for the restaurant agent.""" LITELLM_MODEL = os.getenv("LITELLM_MODEL", "gemini/gemini-2.5-flash") - if use_ui: - # Construct the full prompt with UI instructions, examples, and schema - instruction = AGENT_INSTRUCTION + get_ui_prompt( - self.base_url, RESTAURANT_UI_EXAMPLES - ) - else: - instruction = get_text_prompt() + instruction = ( + self._schema_manager.generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_schema=True, + include_examples=True, + validate_examples=True, + ) + if use_ui + else get_text_prompt() + ) return LlmAgent( model=LiteLlm(model=LITELLM_MODEL), @@ -133,7 +145,8 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: current_query_text = query # Ensure schema was loaded - if self.use_ui and self.a2ui_schema_object is None: + effective_catalog = self._schema_manager.get_effective_catalog() + if self.use_ui and not effective_catalog.catalog_schema: logger.error( "--- RestaurantAgent.stream: A2UI_SCHEMA is not loaded. " "Cannot perform UI validation. ---" @@ -230,7 +243,7 @@ async def stream(self, query, session_id) -> AsyncIterable[dict[str, Any]]: logger.info( "--- RestaurantAgent.stream: Validating against A2UI_SCHEMA... ---" ) - jsonschema.validate(instance=parsed_json_data, schema=self.a2ui_schema_object) + effective_catalog.validator.validate(parsed_json_data) # --- End New Validation Steps --- logger.info( diff --git a/samples/agent/adk/restaurant_finder/agent_executor.py b/samples/agent/adk/restaurant_finder/agent_executor.py index 9664d6071..c4bcecb6b 100644 --- a/samples/agent/adk/restaurant_finder/agent_executor.py +++ b/samples/agent/adk/restaurant_finder/agent_executor.py @@ -41,11 +41,11 @@ class RestaurantAgentExecutor(AgentExecutor): """Restaurant AgentExecutor Example.""" - def __init__(self, base_url: str): + def __init__(self, ui_agent: RestaurantAgent, text_agent: RestaurantAgent): # Instantiate two agents: one for UI and one for text-only. # The appropriate one will be chosen at execution time. - self.ui_agent = RestaurantAgent(base_url=base_url, use_ui=True) - self.text_agent = RestaurantAgent(base_url=base_url, use_ui=False) + self.ui_agent = ui_agent + self.text_agent = text_agent async def execute( self, diff --git a/samples/agent/adk/restaurant_finder/examples/booking_form.json b/samples/agent/adk/restaurant_finder/examples/booking_form.json new file mode 100644 index 000000000..e144b78b7 --- /dev/null +++ b/samples/agent/adk/restaurant_finder/examples/booking_form.json @@ -0,0 +1,30 @@ +[ + { "beginRendering": { "surfaceId": "booking-form", "root": "booking-form-column", "styles": { "primaryColor": "#FF0000", "font": "Roboto" } } }, + { "surfaceUpdate": { + "surfaceId": "booking-form", + "components": [ + { "id": "booking-form-column", "component": { "Column": { "children": { "explicitList": ["booking-title", "restaurant-image", "restaurant-address", "party-size-field", "datetime-field", "dietary-field", "submit-button"] } } } } , + { "id": "booking-title", "component": { "Text": { "usageHint": "h2", "text": { "path": "title" } } } }, + { "id": "restaurant-image", "component": { "Image": { "url": { "path": "imageUrl" } } } }, + { "id": "restaurant-address", "component": { "Text": { "text": { "path": "address" } } } }, + { "id": "party-size-field", "component": { "TextField": { "label": { "literalString": "Party Size" }, "text": { "path": "partySize" }, "type": "number" } } }, + { "id": "datetime-field", "component": { "DateTimeInput": { "label": { "literalString": "Date & Time" }, "value": { "path": "reservationTime" }, "enableDate": true, "enableTime": true } } }, + { "id": "dietary-field", "component": { "TextField": { "label": { "literalString": "Dietary Requirements" }, "text": { "path": "dietary" } } } }, + { "id": "submit-button", "component": { "Button": { "child": "submit-reservation-text", "action": { "name": "submit_booking", "context": [ { "key": "restaurantName", "value": { "path": "restaurantName" } }, { "key": "partySize", "value": { "path": "partySize" } }, { "key": "reservationTime", "value": { "path": "reservationTime" } }, { "key": "dietary", "value": { "path": "dietary" } }, { "key": "imageUrl", "value": { "path": "imageUrl" } } ] } } } }, + { "id": "submit-reservation-text", "component": { "Text": { "text": { "literalString": "Submit Reservation" } } } } + ] + }}, + { "dataModelUpdate": { + "surfaceId": "booking-form", + "path": "/", + "contents": [ + { "key": "title", "valueString": "Book a Table at [RestaurantName]" }, + { "key": "address", "valueString": "[Restaurant Address]" }, + { "key": "restaurantName", "valueString": "[RestaurantName]" }, + { "key": "partySize", "valueString": "2" }, + { "key": "reservationTime", "valueString": "" }, + { "key": "dietary", "valueString": "" }, + { "key": "imageUrl", "valueString": "" } + ] + }} +] \ No newline at end of file diff --git a/samples/agent/adk/restaurant_finder/examples/confirmation.json b/samples/agent/adk/restaurant_finder/examples/confirmation.json new file mode 100644 index 000000000..049e4b9c8 --- /dev/null +++ b/samples/agent/adk/restaurant_finder/examples/confirmation.json @@ -0,0 +1,27 @@ +[ + { "beginRendering": { "surfaceId": "confirmation", "root": "confirmation-card", "styles": { "primaryColor": "#FF0000", "font": "Roboto" } } }, + { "surfaceUpdate": { + "surfaceId": "confirmation", + "components": [ + { "id": "confirmation-card", "component": { "Card": { "child": "confirmation-column" } } }, + { "id": "confirm-title", "component": { "Text": { "usageHint": "h2", "text": { "path": "title" } } } }, + { "id": "confirm-image", "component": { "Image": { "url": { "path": "imageUrl" } } } }, + { "id": "confirm-details", "component": { "Text": { "text": { "path": "bookingDetails" } } } }, + { "id": "confirm-dietary", "component": { "Text": { "text": { "path": "dietaryRequirements" } } } }, + { "id": "confirm-text", "component": { "Text": { "usageHint": "h5", "text": { "literalString": "We look forward to seeing you!" } } } }, + { "id": "divider1", "component": { "Divider": {} } }, + { "id": "divider2", "component": { "Divider": {} } }, + { "id": "divider3", "component": { "Divider": {} } } + ] + }}, + { "dataModelUpdate": { + "surfaceId": "confirmation", + "path": "/", + "contents": [ + { "key": "title", "valueString": "Booking at [RestaurantName]" }, + { "key": "bookingDetails", "valueString": "[PartySize] people at [Time]" }, + { "key": "dietaryRequirements", "valueString": "Dietary Requirements: [Requirements]" }, + { "key": "imageUrl", "valueString": "[ImageUrl]" } + ] + }} +] \ No newline at end of file diff --git a/samples/agent/adk/restaurant_finder/examples/single_column_list.json b/samples/agent/adk/restaurant_finder/examples/single_column_list.json new file mode 100644 index 000000000..377d1b6dc --- /dev/null +++ b/samples/agent/adk/restaurant_finder/examples/single_column_list.json @@ -0,0 +1,45 @@ +[ + { "beginRendering": { "surfaceId": "default", "root": "root-column", "styles": { "primaryColor": "#FF0000", "font": "Roboto" } } }, + { "surfaceUpdate": { + "surfaceId": "default", + "components": [ + { "id": "root-column", "component": { "Column": { "children": { "explicitList": ["title-heading", "item-list"] } } } }, + { "id": "title-heading", "component": { "Text": { "usageHint": "h1", "text": { "path": "title" } } } }, + { "id": "item-list", "component": { "List": { "direction": "vertical", "children": { "template": { "componentId": "item-card-template", "dataBinding": "/items" } } } } }, + { "id": "item-card-template", "component": { "Card": { "child": "card-layout" } } }, + { "id": "card-layout", "component": { "Row": { "children": { "explicitList": ["template-image", "card-details"] } } } }, + { "id": "template-image", "weight": 1, "component": { "Image": { "url": { "path": "imageUrl" } } } }, + { "id": "card-details", "weight": 2, "component": { "Column": { "children": { "explicitList": ["template-name", "template-rating", "template-detail", "template-link", "template-book-button"] } } } }, + { "id": "template-name", "component": { "Text": { "usageHint": "h3", "text": { "path": "name" } } } }, + { "id": "template-rating", "component": { "Text": { "text": { "path": "rating" } } } }, + { "id": "template-detail", "component": { "Text": { "text": { "path": "detail" } } } }, + { "id": "template-link", "component": { "Text": { "text": { "path": "infoLink" } } } }, + { "id": "template-book-button", "component": { "Button": { "child": "book-now-text", "primary": true, "action": { "name": "book_restaurant", "context": [ { "key": "restaurantName", "value": { "path": "name" } }, { "key": "imageUrl", "value": { "path": "imageUrl" } }, { "key": "address", "value": { "path": "address" } } ] } } } }, + { "id": "book-now-text", "component": { "Text": { "text": { "literalString": "Book Now" } } } } + ] + }}, + {"dataModelUpdate": { + "surfaceId": "default", + "path": "/", + "contents": [ + { "key": "items", "valueMap": [ + { "key": "item1", "valueMap": [ + { "key": "name", "valueString": "The Fancy Place" }, + { "key": "rating", "valueNumber": 4.8 }, + { "key": "detail", "valueString": "Fine dining experience" }, + { "key": "infoLink", "valueString": "https://example.com/fancy" }, + { "key": "imageUrl", "valueString": "https://example.com/fancy.jpg" }, + { "key": "address", "valueString": "123 Main St" } + ] }, + { "key": "item2", "valueMap": [ + { "key": "name", "valueString": "Quick Bites" }, + { "key": "rating", "valueNumber": 4.2 }, + { "key": "detail", "valueString": "Casual and fast" }, + { "key": "infoLink", "valueString": "https://example.com/quick" }, + { "key": "imageUrl", "valueString": "https://example.com/quick.jpg" }, + { "key": "address", "valueString": "456 Oak Ave" } + ] } + ] } + ] + }} +] \ No newline at end of file diff --git a/samples/agent/adk/restaurant_finder/examples/two_column_list.json b/samples/agent/adk/restaurant_finder/examples/two_column_list.json new file mode 100644 index 000000000..51e479699 --- /dev/null +++ b/samples/agent/adk/restaurant_finder/examples/two_column_list.json @@ -0,0 +1,56 @@ +[ + { "beginRendering": { "surfaceId": "default", "root": "root-column", "styles": { "primaryColor": "#FF0000", "font": "Roboto" } } }, + { "surfaceUpdate": { + "surfaceId": "default", + "components": [ + { "id": "root-column", "component": { "Column": { "children": { "explicitList": ["title-heading", "restaurant-row-1"] } } } }, + { "id": "title-heading", "component": { "Text": { "usageHint": "h1", "text": { "path": "title" } } } }, + { "id": "restaurant-row-1", "component": { "Row": { "children": { "explicitList": ["item-card-1", "item-card-2"] } } } }, + { "id": "item-card-1", "weight": 1, "component": { "Card": { "child": "card-layout-1" } } }, + { "id": "card-layout-1", "component": { "Column": { "children": { "explicitList": ["template-image-1", "card-details-1"] } } } }, + { "id": "template-image-1", "component": { "Image": { "url": { "path": "/items/0/imageUrl" }, "width": "100%" } } }, + { "id": "card-details-1", "component": { "Column": { "children": { "explicitList": ["template-name-1", "template-rating-1", "template-detail-1", "template-link-1", "template-book-button-1"] } } } }, + { "id": "template-name-1", "component": { "Text": { "usageHint": "h3", "text": { "path": "/items/0/name" } } } }, + { "id": "template-rating-1", "component": { "Text": { "text": { "path": "/items/0/rating" } } } }, + { "id": "template-detail-1", "component": { "Text": { "text": { "path": "/items/0/detail" } } } }, + { "id": "template-link-1", "component": { "Text": { "text": { "path": "/items/0/infoLink" } } } }, + { "id": "template-book-button-1", "component": { "Button": { "child": "book-now-text-1", "action": { "name": "book_restaurant", "context": [ { "key": "restaurantName", "value": { "path": "/items/0/name" } }, { "key": "imageUrl", "value": { "path": "/items/0/imageUrl" } }, { "key": "address", "value": { "path": "/items/0/address" } } ] } } } }, + { "id": "book-now-text-1", "component": { "Text": { "text": { "literalString": "Book Now" } } } }, + { "id": "item-card-2", "weight": 1, "component": { "Card": { "child": "card-layout-2" } } }, + { "id": "card-layout-2", "component": { "Column": { "children": { "explicitList": ["template-image-2", "card-details-2"] } } } }, + { "id": "template-image-2", "component": { "Image": { "url": { "path": "/items/1/imageUrl" }, "width": "100%" } } }, + { "id": "card-details-2", "component": { "Column": { "children": { "explicitList": ["template-name-2", "template-rating-2", "template-detail-2", "template-link-2", "template-book-button-2"] } } } }, + { "id": "template-name-2", "component": { "Text": { "usageHint": "h3", "text": { "path": "/items/1/name" } } } }, + { "id": "template-rating-2", "component": { "Text": { "text": { "path": "/items/1/rating" } } } }, + { "id": "template-detail-2", "component": { "Text": { "text": { "path": "/items/1/detail" } } } }, + { "id": "template-link-2", "component": { "Text": { "text": { "path": "/items/1/infoLink" } } } }, + { "id": "template-book-button-2", "component": { "Button": { "child": "book-now-text-2", "action": { "name": "book_restaurant", "context": [ { "key": "restaurantName", "value": { "path": "/items/1/name" } }, { "key": "imageUrl", "value": { "path": "/items/1/imageUrl" } }, { "key": "address", "value": { "path": "/items/1/address" } } ] } } } }, + { "id": "book-now-text-2", "component": { "Text": { "text": { "literalString": "Book Now" } } } } + ] + }}, + {"dataModelUpdate": { + "surfaceId": "default", + "path": "/", + "contents": [ + {"key": "title", "valueString": "Top Restaurants" }, + {"key": "items", "valueMap": [ + {"key": "item1", "valueMap": [ + {"key": "name", "valueString": "The Fancy Place" }, + {"key": "rating", "valueNumber": 4.8 }, + {"key": "detail", "valueString": "Fine dining experience" }, + {"key": "infoLink", "valueString": "https://example.com/fancy" }, + {"key": "imageUrl", "valueString": "https://example.com/fancy.jpg" }, + {"key": "address", "valueString": "123 Main St" } + ]}, + {"key": "item2", "valueMap": [ + {"key": "name", "valueString": "Quick Bites" }, + {"key": "rating", "valueNumber": 4.2 }, + {"key": "detail", "valueString": "Casual and fast" }, + {"key": "infoLink", "valueString": "https://example.com/quick" }, + {"key": "imageUrl", "valueString": "https://example.com/quick.jpg" }, + {"key": "address", "valueString": "456 Oak Ave" } + ] } + ] } + ] + }} +] \ No newline at end of file diff --git a/samples/agent/adk/restaurant_finder/prompt_builder.py b/samples/agent/adk/restaurant_finder/prompt_builder.py index 0985df8a3..e6e64a10e 100644 --- a/samples/agent/adk/restaurant_finder/prompt_builder.py +++ b/samples/agent/adk/restaurant_finder/prompt_builder.py @@ -12,818 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. -# The A2UI schema remains constant for all A2UI responses. -A2UI_SCHEMA = r""" -{ - "title": "A2UI Message Schema", - "description": "Describes a JSON payload for an A2UI (Agent to UI) message, which is used to dynamically construct and update user interfaces. A message MUST contain exactly ONE of the action properties: 'beginRendering', 'surfaceUpdate', 'dataModelUpdate', or 'deleteSurface'.", - "type": "object", - "properties": { - "beginRendering": { - "type": "object", - "description": "Signals the client to begin rendering a surface with a root component and specific styles.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be rendered." - }, - "root": { - "type": "string", - "description": "The ID of the root component to render." - }, - "styles": { - "type": "object", - "description": "Styling information for the UI.", - "properties": { - "font": { - "type": "string", - "description": "The primary font for the UI." - }, - "primaryColor": { - "type": "string", - "description": "The primary UI color as a hexadecimal code (e.g., '#00BFFF').", - "pattern": "^#[0-9a-fA-F]{6}$" - } - } - } - }, - "required": ["root", "surfaceId"] - }, - "surfaceUpdate": { - "type": "object", - "description": "Updates a surface with a new set of components.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be updated. If you are adding a new surface this *must* be a new, unique identified that has never been used for any existing surfaces shown." - }, - "components": { - "type": "array", - "description": "A list containing all UI components for the surface.", - "minItems": 1, - "items": { - "type": "object", - "description": "Represents a *single* component in a UI widget tree. This component could be one of many supported types.", - "properties": { - "id": { - "type": "string", - "description": "The unique identifier for this component." - }, - "weight": { - "type": "number", - "description": "The relative weight of this component within a Row or Column. This corresponds to the CSS 'flex-grow' property. Note: this may ONLY be set when the component is a direct descendant of a Row or Column." - }, - "component": { - "type": "object", - "description": "A wrapper object that MUST contain exactly one key, which is the name of the component type (e.g., 'Heading'). The value is an object containing the properties for that specific component.", - "properties": { - "Text": { - "type": "object", - "properties": { - "text": { - "type": "object", - "description": "The text content to display. This can be a literal string or a reference to a value in the data model ('path', e.g., '/doc/title'). While simple Markdown formatting is supported (i.e. without HTML, images, or links), utilizing dedicated UI components is generally preferred for a richer and more structured presentation.", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "usageHint": { - "type": "string", - "description": "A hint for the base text style. One of:\n- `h1`: Largest heading.\n- `h2`: Second largest heading.\n- `h3`: Third largest heading.\n- `h4`: Fourth largest heading.\n- `h5`: Fifth largest heading.\n- `caption`: Small text for captions.\n- `body`: Standard body text.", - "enum": [ - "h1", - "h2", - "h3", - "h4", - "h5", - "caption", - "body" - ] - } - }, - "required": ["text"] - }, - "Image": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the image to display. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/thumbnail/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "fit": { - "type": "string", - "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": [ - "contain", - "cover", - "fill", - "none", - "scale-down" - ] - }, - "usageHint": { - "type": "string", - "description": "A hint for the image size and style. One of:\n- `icon`: Small square icon.\n- `avatar`: Circular avatar image.\n- `smallFeature`: Small feature image.\n- `mediumFeature`: Medium feature image.\n- `largeFeature`: Large feature image.\n- `header`: Full-width, full bleed, header image.", - "enum": [ - "icon", - "avatar", - "smallFeature", - "mediumFeature", - "largeFeature", - "header" - ] - } - }, - "required": ["url"] - }, - "Icon": { - "type": "object", - "properties": { - "name": { - "type": "object", - "description": "The name of the icon to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/form/submit').", - "properties": { - "literalString": { - "type": "string", - "enum": [ - "accountCircle", - "add", - "arrowBack", - "arrowForward", - "attachFile", - "calendarToday", - "call", - "camera", - "check", - "close", - "delete", - "download", - "edit", - "event", - "error", - "favorite", - "favoriteOff", - "folder", - "help", - "home", - "info", - "locationOn", - "lock", - "lockOpen", - "mail", - "menu", - "moreVert", - "moreHoriz", - "notificationsOff", - "notifications", - "payment", - "person", - "phone", - "photo", - "print", - "refresh", - "search", - "send", - "settings", - "share", - "shoppingCart", - "star", - "starHalf", - "starOff", - "upload", - "visibility", - "visibilityOff", - "warning" - ] - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["name"] - }, - "Video": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the video to display. This can be a literal string or a reference to a value in the data model ('path', e.g. '/video/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "AudioPlayer": { - "type": "object", - "properties": { - "url": { - "type": "object", - "description": "The URL of the audio to be played. This can be a literal string ('literal') or a reference to a value in the data model ('path', e.g. '/song/url').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "description": { - "type": "object", - "description": "A description of the audio, such as a title or summary. This can be a literal string or a reference to a value in the data model ('path', e.g. '/song/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["url"] - }, - "Row": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (horizontally). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "center", - "end", - "spaceAround", - "spaceBetween", - "spaceEvenly", - "start" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Column": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "distribution": { - "type": "string", - "description": "Defines the arrangement of children along the main axis (vertically). This corresponds to the CSS 'justify-content' property.", - "enum": [ - "start", - "center", - "end", - "spaceBetween", - "spaceAround", - "spaceEvenly" - ] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] - } - }, - "required": ["children"] - }, - "List": { - "type": "object", - "properties": { - "children": { - "type": "object", - "description": "Defines the children. Use 'explicitList' for a fixed set of children, or 'template' to generate children from a data list.", - "properties": { - "explicitList": { - "type": "array", - "items": { - "type": "string" - } - }, - "template": { - "type": "object", - "description": "A template for generating a dynamic list of children from a data model list. `componentId` is the component to use as a template, and `dataBinding` is the path to the map of components in the data model. Values in the map will define the list of children.", - "properties": { - "componentId": { - "type": "string" - }, - "dataBinding": { - "type": "string" - } - }, - "required": ["componentId", "dataBinding"] - } - } - }, - "direction": { - "type": "string", - "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] - }, - "alignment": { - "type": "string", - "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] - } - }, - "required": ["children"] - }, - "Card": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to be rendered inside the card." - } - }, - "required": ["child"] - }, - "Tabs": { - "type": "object", - "properties": { - "tabItems": { - "type": "array", - "description": "An array of objects, where each object defines a tab with a title and a child component.", - "items": { - "type": "object", - "properties": { - "title": { - "type": "object", - "description": "The tab title. Defines the value as either a literal value or a path to data model value (e.g. '/options/title').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "child": { - "type": "string" - } - }, - "required": ["title", "child"] - } - } - }, - "required": ["tabItems"] - }, - "Divider": { - "type": "object", - "properties": { - "axis": { - "type": "string", - "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"] - } - } - }, - "Modal": { - "type": "object", - "properties": { - "entryPointChild": { - "type": "string", - "description": "The ID of the component that opens the modal when interacted with (e.g., a button)." - }, - "contentChild": { - "type": "string", - "description": "The ID of the component to be displayed inside the modal." - } - }, - "required": ["entryPointChild", "contentChild"] - }, - "Button": { - "type": "object", - "properties": { - "child": { - "type": "string", - "description": "The ID of the component to display in the button, typically a Text component." - }, - "primary": { - "type": "boolean", - "description": "Indicates if this button should be styled as the primary action." - }, - "action": { - "type": "object", - "description": "The client-side action to be dispatched when the button is clicked. It includes the action's name and an optional context payload.", - "properties": { - "name": { - "type": "string" - }, - "context": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string" - }, - "value": { - "type": "object", - "description": "Defines the value to be included in the context as either a literal value or a path to a data model value (e.g. '/user/name').", - "properties": { - "path": { - "type": "string" - }, - "literalString": { - "type": "string" - }, - "literalNumber": { - "type": "number" - }, - "literalBoolean": { - "type": "boolean" - } - } - } - }, - "required": ["key", "value"] - } - } - }, - "required": ["name"] - } - }, - "required": ["child", "action"] - }, - "CheckBox": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display next to the checkbox. Defines the value as either a literal value or a path to data model ('path', e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "object", - "description": "The current state of the checkbox (true for checked, false for unchecked). This can be a literal boolean ('literalBoolean') or a reference to a value in the data model ('path', e.g. '/filter/open').", - "properties": { - "literalBoolean": { - "type": "boolean" - }, - "path": { - "type": "string" - } - } - } - }, - "required": ["label", "value"] - }, - "TextField": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text label for the input field. This can be a literal string or a reference to a value in the data model ('path, e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "text": { - "type": "object", - "description": "The value of the text field. This can be a literal string or a reference to a value in the data model ('path', e.g. '/user/name').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "textFieldType": { - "type": "string", - "description": "The type of input field to display.", - "enum": [ - "date", - "longText", - "number", - "shortText", - "obscured" - ] - }, - "validationRegexp": { - "type": "string", - "description": "A regular expression used for client-side validation of the input." - } - }, - "required": ["label"] - }, - "DateTimeInput": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The selected date and/or time value in ISO 8601 format. This can be a literal string ('literalString') or a reference to a value in the data model ('path', e.g. '/user/dob').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "enableDate": { - "type": "boolean", - "description": "If true, allows the user to select a date." - }, - "enableTime": { - "type": "boolean", - "description": "If true, allows the user to select a time." - } - }, - "required": ["value"] - }, - "MultipleChoice": { - "type": "object", - "properties": { - "selections": { - "type": "object", - "description": "The currently selected values for the component. This can be a literal array of strings or a path to an array in the data model('path', e.g. '/hotel/options').", - "properties": { - "literalArray": { - "type": "array", - "items": { - "type": "string" - } - }, - "path": { - "type": "string" - } - } - }, - "options": { - "type": "array", - "description": "An array of available options for the user to choose from.", - "items": { - "type": "object", - "properties": { - "label": { - "type": "object", - "description": "The text to display for this option. This can be a literal string or a reference to a value in the data model (e.g. '/option/label').", - "properties": { - "literalString": { - "type": "string" - }, - "path": { - "type": "string" - } - } - }, - "value": { - "type": "string", - "description": "The value to be associated with this option when selected." - } - }, - "required": ["label", "value"] - } - }, - "maxAllowedSelections": { - "type": "integer", - "description": "The maximum number of options that the user is allowed to select." - } - }, - "required": ["selections", "options"] - }, - "Slider": { - "type": "object", - "properties": { - "value": { - "type": "object", - "description": "The current value of the slider. This can be a literal number ('literalNumber') or a reference to a value in the data model ('path', e.g. '/restaurant/cost').", - "properties": { - "literalNumber": { - "type": "number" - }, - "path": { - "type": "string" - } - } - }, - "minValue": { - "type": "number", - "description": "The minimum value of the slider." - }, - "maxValue": { - "type": "number", - "description": "The maximum value of the slider." - } - }, - "required": ["value"] - } - } - } - }, - "required": ["id", "component"] - } - } - }, - "required": ["surfaceId", "components"] - }, - "dataModelUpdate": { - "type": "object", - "description": "Updates the data model for a surface.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface this data model update applies to." - }, - "path": { - "type": "string", - "description": "An optional path to a location within the data model (e.g., '/user/name'). If omitted, or set to '/', the entire data model will be replaced." - }, - "contents": { - "type": "array", - "description": "An array of data entries. Each entry must contain a 'key' and exactly one corresponding typed 'value*' property.", - "items": { - "type": "object", - "description": "A single data entry. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string", - "description": "The key for this data entry." - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - }, - "valueMap": { - "description": "Represents a map as an adjacency list.", - "type": "array", - "items": { - "type": "object", - "description": "One entry in the map. Exactly one 'value*' property should be provided alongside the key.", - "properties": { - "key": { - "type": "string" - }, - "valueString": { - "type": "string" - }, - "valueNumber": { - "type": "number" - }, - "valueBoolean": { - "type": "boolean" - } - }, - "required": ["key"] - } - } - }, - "required": ["key"] - } - } - }, - "required": ["contents", "surfaceId"] - }, - "deleteSurface": { - "type": "object", - "description": "Signals the client to delete the surface identified by 'surfaceId'.", - "properties": { - "surfaceId": { - "type": "string", - "description": "The unique identifier for the UI surface to be deleted." - } - }, - "required": ["surfaceId"] - } - } -} +from a2ui.inference.schema.manager import A2uiSchemaManager +from a2ui.inference.schema.common_modifiers import remove_strict_validation + +ROLE_DESCRIPTION = ( + "You are a helpful restaurant finding assistant. Your final output MUST be a a2ui" + " UI JSON response." +) + +WORKFLOW_DESCRIPTION = """ +To generate the response, you MUST follow these rules: +1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. +2. The first part is your conversational text response. +3. The second part is a single, raw JSON object which is a list of A2UI messages. +4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. """ -from a2ui_examples import RESTAURANT_UI_EXAMPLES - - -def get_ui_prompt(base_url: str, examples: str) -> str: - """ - Constructs the full prompt with UI instructions, rules, examples, and schema. - - Args: - base_url: The base URL for resolving static assets like logos. - examples: A string containing the specific UI examples for the agent's task. - - Returns: - A formatted string to be used as the system prompt for the LLM. - """ - # The f-string substitution for base_url happens here, at runtime. - formatted_examples = examples.format(base_url=base_url) - - return f""" - You are a helpful restaurant finding assistant. Your final output MUST be a a2ui UI JSON response. - - To generate the response, you MUST follow these rules: - 1. Your response MUST be in two parts, separated by the delimiter: `---a2ui_JSON---`. - 2. The first part is your conversational text response. - 3. The second part is a single, raw JSON object which is a list of A2UI messages. - 4. The JSON part MUST validate against the A2UI JSON SCHEMA provided below. - - --- UI TEMPLATE RULES --- - - If the query is for a list of restaurants, use the restaurant data you have already received from the `get_restaurants` tool to populate the `dataModelUpdate.contents` array (e.g., as a `valueMap` for the "items" key). - - If the number of restaurants is 5 or fewer, you MUST use the `SINGLE_COLUMN_LIST_EXAMPLE` template. - - If the number of restaurants is more than 5, you MUST use the `TWO_COLUMN_LIST_EXAMPLE` template. - - If the query is to book a restaurant (e.g., "USER_WANTS_TO_BOOK..."), you MUST use the `BOOKING_FORM_EXAMPLE` template. - - If the query is a booking submission (e.g., "User submitted a booking..."), you MUST use the `CONFIRMATION_EXAMPLE` template. - - {formatted_examples} - - ---BEGIN A2UI JSON SCHEMA--- - {A2UI_SCHEMA} - ---END A2UI JSON SCHEMA--- - """ +UI_DESCRIPTION = """ +- If the query is for a list of restaurants, use the restaurant data you have already received from the `get_restaurants` tool to populate the `dataModelUpdate.contents` array (e.g., as a `valueMap` for the "items" key). +- If the number of restaurants is 5 or fewer, you MUST use the `SINGLE_COLUMN_LIST_EXAMPLE` template. +- If the number of restaurants is more than 5, you MUST use the `TWO_COLUMN_LIST_EXAMPLE` template. +- If the query is to book a restaurant (e.g., "USER_WANTS_TO_BOOK..."), you MUST use the `BOOKING_FORM_EXAMPLE` template. +- If the query is a booking submission (e.g., "User submitted a booking..."), you MUST use the `CONFIRMATION_EXAMPLE` template. +""" def get_text_prompt() -> str: @@ -847,14 +58,24 @@ def get_text_prompt() -> str: if __name__ == "__main__": - # Example of how to use the prompt builder + # Example of how to use the A2UI Schema Manager to generate a system prompt # In your actual application, you would call this from your main agent logic. - my_base_url = "http://localhost:8000" # You can now easily construct a prompt with the relevant examples. # For a different agent (e.g., a flight booker), you would pass in # different examples but use the same `get_ui_prompt` function. - restaurant_prompt = get_ui_prompt(my_base_url, RESTAURANT_UI_EXAMPLES) + restaurant_prompt = A2uiSchemaManager( + "0.8", + basic_examples_path="examples/", + schema_modifiers=[remove_strict_validation], + ).generate_system_prompt( + role_description=ROLE_DESCRIPTION, + workflow_description=WORKFLOW_DESCRIPTION, + ui_description=UI_DESCRIPTION, + include_schema=True, + include_examples=True, + validate_examples=True, + ) print(restaurant_prompt) From 39866e65ad48a2e5c7e87aa8ba4f3a3a289283c5 Mon Sep 17 00:00:00 2001 From: Evelio Tarazona Date: Tue, 17 Feb 2026 11:31:26 -0500 Subject: [PATCH 54/65] Update repo link in specification README.md files (#628) --- specification/v0_10/README.md | 2 +- specification/v0_8/README.md | 2 +- specification/v0_9/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/specification/v0_10/README.md b/specification/v0_10/README.md index 346bfbdce..f7926d039 100644 --- a/specification/v0_10/README.md +++ b/specification/v0_10/README.md @@ -4,7 +4,7 @@ This directory contains the specification for version 0.10 of A2UI. **This specification is currently under development.** -If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/gspencergoog/A2UI). +If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/google/A2UI). ## Documentation diff --git a/specification/v0_8/README.md b/specification/v0_8/README.md index d151a72cf..96e0f865b 100644 --- a/specification/v0_8/README.md +++ b/specification/v0_8/README.md @@ -4,7 +4,7 @@ This directory contains the specification for version 0.8.2 of A2UI, a previous **This specification is closed.** -Please do not propose changes here. If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/gspencergoog/A2UI) for the specification currently in development. +Please do not propose changes here. If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/google/A2UI) for the specification currently in development. ## v0.8.2 Documentation diff --git a/specification/v0_9/README.md b/specification/v0_9/README.md index 0d0a84ebd..c5438ffae 100644 --- a/specification/v0_9/README.md +++ b/specification/v0_9/README.md @@ -4,7 +4,7 @@ This directory contains the specification for version 0.9 of A2UI, is the curren **This specification is closed.** -Please do not propose changes here. If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/gspencergoog/A2UI) for the [v0.10 specification](../v0_10). +Please do not propose changes here. If you have proposed changes or new features, please open an issue or submit a pull request to the [A2UI repository](https://github.com/google/A2UI) for the [v0.10 specification](../v0_10). ## v0.9 Documentation From 31f32a31256d382a89f338ef6956a4210c83c2b5 Mon Sep 17 00:00:00 2001 From: wrenj Date: Tue, 17 Feb 2026 22:28:08 +0000 Subject: [PATCH 55/65] add docs for catalogs (#626) --- docs/catalogs.md | 408 +++++++++++++++++++++++++++++++++++++++++++++++ mkdocs.yaml | 1 + 2 files changed, 409 insertions(+) create mode 100644 docs/catalogs.md diff --git a/docs/catalogs.md b/docs/catalogs.md new file mode 100644 index 000000000..c146d96c9 --- /dev/null +++ b/docs/catalogs.md @@ -0,0 +1,408 @@ +# A2UI Catalogs + +## Overview + +This guide defines the A2UI Catalog architecture and provides a roadmap for implementation. It explains the structure of catalog schemas, outlines strategies for using the pre-built "Basic Catalog” versus defining your own application-specific catalog, and details the technical protocols for catalog negotiation, versioning, and runtime validation. + +## Catalog Definition + +A catalog is a [JSON Schema file](../specification/v0_9/json/a2ui_client_capabilities.json#L62C5-L95C6) outlining the components, functions, and themes that agents can use to define A2UI surfaces using server-driven UI. All A2UI JSON sent from the agent is validated against the chosen catalog. + +[Catalog JSON Schema](../specification/v0_9/json/a2ui_client_capabilities.json#L62C5-L95C6) is below + +```json +{ + "Catalog": { + "type": "object", + "description": "A collection of component and function definitions.", + "properties": { + "catalogId": { + "type": "string", + "description": "Unique identifier for this catalog." + }, + "components": { + "type": "object", + "description": "Definitions for UI components supported by this catalog.", + "additionalProperties": { + "$ref": "https://json-schema.org/draft/2020-12/schema" + } + }, + "functions": { + "type": "array", + "description": "Definitions for functions supported by this catalog.", + "items": { + "$ref": "#/$defs/FunctionDefinition" + } + }, + "theme": { + "title": "A2UI Theme", + "description": "A schema that defines a catalog of A2UI theme properties.", + "type": "object", + "additionalProperties": { + "$ref": "https://json-schema.org/draft/2020-12/schema" + } + } + }, + "required": [ + "catalogId" + ], + "additionalProperties": false + } +} +``` + +## Catalog Strategy + +Every A2UI surface is driven by a Catalog. A catalog is simply a JSON Schema file that tells the agent which components, functions, and themes are available for it to use. + +Whether you are building a simple prototype or a complex production application, the requirement is the same: you must provide a catalog definition that the agent uses to express UI. + +### The Basic Catalog + +To help developers get started quickly, the A2UI team maintains the [Basic Catalog](../specification/v0_9/json/standard_catalog.json). + +This is a pre-defined catalog file that contains a standard set of general-purpose components (Buttons, Inputs, Cards) and functions. It is not a special "type" of catalog; it is simply a version of a catalog that we have already written and have open source renderers for. + +The basic catalog allows you to bootstrap an application or validate A2UI concepts without needing to write your own schema from scratch. It is intentionally sparse to remain easily implementable by different renderers. + +Since A2UI is designed for LLMs to generate the UI at either design time or runtime, we do not think portability requires a standardized catalog across multiple clients; the LLM can interpret the catalog for each individual frontend. + +[See the A2UI v0.9 basic catalog](../specification/v0_9/json/standard_catalog.json) + +### Defining Your Own Catalog + +While the Basic Catalog is useful for starting out, most production applications will define their own catalog to reflect their specific design system. + +By defining your own catalog, you restrict the agent to using exactly the components and visual language that exist in your application, rather than generic inputs or buttons. This catalog can be built entirely from scratch, or it can import definitions from the Basic Catalog to save time (e.g., using the Basic text definitions while defining your own unique Card component). + +For simplicity we recommend building catalogs that directly reflect a client's design system rather than trying to map the Basic Catalog to it through an adapter. Since A2UI is designed for GenUI, we expect the LLM can interpret different catalogs for different clients. + +[See an example Rizzcharts catalog](../samples/agent/adk/rizzcharts/rizzcharts_catalog_definition.json) + +### Recommendations + +| Usecase | Recommendation | Effort | +| :--- | :--- | :--- | +| Adding A2UI to a mature frontend | Define a catalog that mirrors your existing design system. | Medium | +| Adding A2UI to a new/greenfield app | Start with Basic Catalog, then evolve into your own catalog as the app evolves | Low (assuming renderer exists) | + +## Building a Catalog + +A catalog is a JSON Schema file that conforms to the [Catalog schema](../specification/v0_9/json/a2ui_client_capabilities.json#L62C5-L95C6) that defines the components, themes and functions an agent can use when building a surface. + +### Example: A Minimal Catalog + +Here is a simple catalog defining a single component. + +```json +{ + "$id": "https://github.com/.../hello_world/v1/catalog.json", + "components": { + "HelloWorldBanner": { + "type": "object", + "description": "A simple banner greeting.", + "properties": { + "message": { + "type": "string", + "description": "The banner text." + }, + "backgroundColor": { + "type": "string", + "default": "#f0f0f0" + } + }, + "required": [ + "message" + ] + } + } +} +``` + +When the agent uses that catalog, it generates a payload strictly conforming to that structure: + +```json +[ + { + "createSurface": { + "surfaceId": "hello-world-surface", + "catalogId": "https://github.com/.../hello_world/v1/catalog.json", + "root": "root-element" + } + }, + { + "surfaceUpdate": { + "surfaceId": "hello-world-surface", + "components": [ + { + "id": "root-element", + "component": { + "HelloWorldBanner": { + "message": "Hello, world! Welcome to your first catalog.", + "backgroundColor": "#4CAF50" + } + } + } + ] + } + } +] +``` + +### Freestanding Catalogs + +A2UI Catalogs must be standalone (no references to external files) to simplify LLM inference and dependency management. + +While the final catalog must be freestanding, you may still author your catalogs modularly using JSON Schema `$ref` pointing to external documents during local development. Run `scripts/build_catalog.py` before distributing your catalog to bundle all external file references into a single, independent JSON Schema file: + +```bash +uv run scripts/build_catalog.py +``` + +### Composition & Imports + +You do not have to define everything from scratch. You can define a catalog which uses existing components from the basic or other catalogs, and one that reusing the existing rendering logic. + +#### Example: Extending the Basic Catalog + +This catalog imports all elements from the Basic Catalog and adds a new `SuggestionChips` component. + +```json +{ + "$id": "https://github.com/.../hello_world_with_all_basic/v1/catalog.json", + "components": { + "allOf": [ + { "$ref": "standard_catalog_definition.json#/components" }, + { + "SuggestionChips": { + "type": "object", + "description": "A list of suggested prompts", + "properties": { + "suggestions": { + "type": "array", + "description": "The suggested prompts." + } + }, + "required": [ "suggestions" ] + } + } + ] + } +} +``` + +**Make sure to run `scripts/build_catalog.py` to resolve the external $ref before publishing.** + +#### Example: Cherry-picking Components + +This catalog imports only `Text` and `Icon` from the Basic Catalog to build a simple Popup surface. + +```json +{ + "$id": "https://github.com/.../hello_world_with_some_basic/v1/catalog.json", + "components": { + "allOf": [ + { "$ref": "standard_catalog_definition.json#/components/Text" }, + { "$ref": "standard_catalog_definition.json#/components/Icon" }, + { + "Popup": { + "type": "object", + "description": "A modal overlay that displays an icon and text.", + "properties": { + "text": { "$ref": "common_types.json#/$defs/ComponentId" }, + "icon": { "$ref": "common_types.json#/$defs/ComponentId" } + }, + "required": [ "text", "icon" ] + } + } + ] + } +} +``` + +**Make sure to run `scripts/build_catalog.py` to resolve the external $ref before publishing.** + +### Implementing Renderers + +Client renderers implement the catalog by mapping the schema definition to actual code. + +[Example Rizzcharts typescript renderer for the hello world catalog](../samples/client/angular/projects/rizzcharts/src/a2ui-catalog/catalog.ts). + +```typescript +import { Catalog, DEFAULT_CATALOG } from '@a2ui/angular'; +import { inputBinding } from '@angular/core'; + +export const RIZZ_CHARTS_CATALOG = { + ...DEFAULT_CATALOG, // Include the basic catalog + HelloWorldBanner: { + type: () => import('./hello_world_banner').then((r) => r.HelloWorldBanner), + bindings: ({ properties }) => [ + inputBinding('message', () => ('message' in properties && properties['message']) || undefined), + inputBinding('backgroundColor', () => ('backgroundColor' in properties && properties['backgroundColor']) || undefined), + ], + }, +} as Catalog; +``` + +## A2UI Catalog Negotiation + +Because clients and agents can support multiple catalogs, they must agree on which catalog to use through a catalog negotiation handshake. + +### Step 1: Agent advertises its support catalogs (optional) + +The agent may optionally advertise which catalogs it is capable of speaking (e.g., in the A2A Agent Card). This is informational; it helps the client know if the agent supports their specific features, but the client doesn’t have to use it. + +Example of an A2A AgentCard advertising that the agent supports the basic and rizzcharts catalogs + +```json +{ + "name": "Ecommerce Dashboard Agent", + "description": "This agent visualizes ecommerce data...", + "capabilities": { + "extensions": [ + { + "uri": "https://a2ui.org/a2a-extension/a2ui/v0.8", + "description": "Provides agent driven UI using the A2UI JSON format.", + "params": { + "supportedCatalogIds": [ + "https://a2ui.org/specification/v0_9/standard_catalog.json", + "https://github.com/.../rizzcharts_catalog_definition.json" + ] + } + } + ] + } +} +``` + +### Step 2: Client advertises its support catalogs (required) + +The client sends a list of supportedCatalogIds to the Agent, ordered by preference, in the metadata of every message. This tells the agent exactly what the client is prepared to render right now. + +Example of A2A message containing the supportedCatalogIds in metadata + +```json +{ + "parts": [ + { + "text": "What is the current status of my flight?" + } + ], + "metadata": { + "a2uiClientCapabilities": { + "supportedCatalogIds": [ + "https://a2ui.org/specification/v0_9/standard_catalog.json", + "https://github.com/.../rizzcharts_catalog_definition.json" + ] + } + } +} +``` + +### Step 3: Agent Selection + +When the agent creates a new surface, it selects the best match from the client's `supportedCatalogIds` list. This choice is locked for the lifetime of that surface. If no compatible catalog is found, the agent will not send a UI. + +Example A2UI Message from the agent defining the catalog_id used in a surface + +```json +{ + "createSurface": { + "surfaceId": "salesDashboard", + "catalogId": "https://a2ui.org/specification/v0_9/standard_catalog.json" + } +} +``` + +## Catalog Naming & Versioning + +A2UI component catalogs require versioning because catalog definitions are often built in at compile time, so any mismatch between what an agent generates and what a client can render will break the UI. + +### CatalogId Naming Convention + +The `catalogId` is a unique text identifier used for negotiation between the client and the agent. + +* **Format:** While the `catalogId` is technically a string, the A2UI convention is to use a **URI** (e.g., `https://example.com/catalogs/mysurface/v1/catalog.json`). +* **Purpose:** We use URIs to make the ID globally unique and easy for human developers to inspect in a browser. +* **No Runtime Fetching:** This URI does not imply that the agent or client downloads the catalog at runtime. **The catalog definition must be known to the agent and client beforehand (at compile/deploy time)**. The URI serves only as a stable identifier. + +### Versioning Guidelines + +Unlike standard JSON parsers where extra data is safely ignored, A2UI requires strict versioning to prevent semantic errors. If a client silently drops a new component (like a new "Itinerary" component) because it doesn't recognize it, the user misses critical information. + +To ensure the agent only generates UI the client can fully render, any structural change—even purely additive ones—requires a new catalog version. This is enforced by the A2UI JSON Schema which generally does not allow for unrecognized properties. + +* **Structural Changes (New Version Required)** Any change that alters the semantic meaning of the A2UI JSON payload requires a new catalog version. This ensures the Agent never sends a component the Client cannot render. A new catalog version is required for: + * **Adding a new component:** (e.g., adding `FacePile` or `Itinerary`). + * **Adding a new property:** Even if optional, if the Agent generates it, it expects it to be rendered. + * **Renaming/Removing fields:** These are standard breaking changes. + +* **Metadata Changes (Same Version Allowed)** You may keep the same catalog version only if the change has no impact on the generated JSON structure or the renderer's behavior. You can keep the version when + * Updating `description` fields (to help the LLM understand the component better). + * Fixing typos in comments or documentation. + +### Versioning with CatalogId + +We recommend including the version in the catalogId. This allows using A2UI catalog negotiation to support multiple versions simultaneously during a migration, ensuring zero downtime. + +**Recommended Pattern:** + +| Change Type | URI Example | Description | +| :--- | :--- | :--- | +| **Current** | .../rizzcharts/v1/catalog.json | The stable, production schema. | +| **Breaking** | .../rizzcharts/v2/catalog.json | A new schema introducing renamed components or structural changes. | + +### Handling Migrations + +To upgrade a catalog without breaking active agents, use A2UI Catalog Negotiation: + +1. **Client Update:** The client updates its list of supportedCatalogIds to include *both* the old and new versions (e.g., [".../v2/...", ".../v1/..."]). +2. **Agent Update:** Agents are rebuilt with the v2 schema. When they see the client supports v2, they prefer it. +3. **Legacy Support:** Older agents that have not yet been rebuilt will continue to match against v1 in the client's list, ensuring they remain functional. + +## A2UI Schema Validation & Fallback + +To ensure a stable user experience, A2UI employs a two-phase validation strategy. This "defense in depth" approach catches errors as early as possible while ensuring clients remain robust when facing unexpected payloads. + +### Two-Phase Validation + +1. **Agent-Side (Pre-Send):** Before transmitting any UI payload, the agent runtime validates the generated JSON against the catalog definition. + * Purpose: To catch hallucinated properties or malformed structures at the source. + * Outcome: If validation fails, the agent can attempt to fix or regenerate the A2UI JSON, or it can do graceful degradation such as falling back to text in a conversational app. +2. **Client-Side:** Upon receiving the payload, the client library validates the JSON against its local definition of the catalog. + * Purpose: Security and stability. This ensures that the code executing on the user's device strictly conforms to the expected contract, protecting against version mismatches or compromised agent outputs. + * Outcome: Failures here are reported back to the agent using the “error” client message + +### Graceful Degradation + +Even if a payload passes schema validation, the renderer may encounter runtime issues (e.g., a missing asset, a component implementation not yet loaded, or a platform-specific limitation). + +Clients should not crash when encountering these errors. Instead, they should employ Graceful Degradation: + +* **Unknown Components:** If a component is recognized in the schema but not implemented in the renderer, render a "safe" fallback (e.g., a generic card with the component's debug name) or skip rendering that specific node entirely. +* **Text Fallback:** If the entire surface fails to render, display the raw text description (if available) or a generic error message: *"This interface could not be displayed."* + +### Client-to-Server Error Reporting + +When the client detects a validation error or a runtime failure, it can report this back to the agent. This allows the agent system to log the failure for developers or adjust its future behavior. + +The client sends a `VALIDATION_FAILED` event using the standard A2UI Client-to-Server Event Schema. + +Example of client reporting a missing required field + +```json +{ + "version": "v0.9", + "error": { + "code": "VALIDATION_FAILED", + "surfaceId": "flight-status-card-123", + "path": "/components/FlightCard/flightNumber", + "message": "Missing required property 'flightNumber' in component 'FlightCard'." + } +} +``` + +## Inline Catalogs + +Inline catalogs sent by the client at runtime are supported but not recommended in production. More details about them can be found [here](../specification/v0_9/docs/a2ui_protocol.md#client-capabilities--metadata). + diff --git a/mkdocs.yaml b/mkdocs.yaml index 4031e954c..089de8a5c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -58,6 +58,7 @@ nav: - v0.9 (Draft): - A2UI Specification: specification/v0.9-a2ui.md - Evolution Guide: specification/v0.9-evolution-guide.md + - Catalogs: catalogs.md - Renderers (Clients): renderers.md - Transports (Message Passing): transports.md - Agents (Server-side): agents.md From f3f12e903806c6eec91120e9b56a566361c192a4 Mon Sep 17 00:00:00 2001 From: dmandar <11888634+dmandar@users.noreply.github.com> Date: Wed, 18 Feb 2026 11:09:55 -0800 Subject: [PATCH 56/65] feat(ui): dispatch validation events from TextField (#609) * feat(ui): dispatch validation events from TextField * Refactor a2ui-validation-input event for strict type safety and revert catalog formatting. This PR introduces a strictly typed A2UIValidationEvent in web_core using the BaseEventDetail pattern to ensure type safety across renderers and clients. The TextField and Component Gallery have been updated to utilize this new event structure, and formatting-only changes in standard_catalog_definition.json were reverted while preserving the new variant and filterable properties for MultipleChoice. --- renderers/lit/src/0.8/core.ts | 4 +- renderers/lit/src/0.8/ui/text-field.ts | 9 ++ renderers/web_core/src/v0_8/events/base.ts | 24 ++++ renderers/web_core/src/v0_8/events/index.ts | 18 +++ .../src/v0_8/events/validation-event.ts | 66 +++++++++ renderers/web_core/src/v0_8/index.ts | 1 + .../schemas/standard_catalog_definition.json | 134 ++++++++++++++---- .../component_gallery/component-gallery.ts | 25 ++++ 8 files changed, 250 insertions(+), 31 deletions(-) create mode 100644 renderers/web_core/src/v0_8/events/base.ts create mode 100644 renderers/web_core/src/v0_8/events/index.ts create mode 100644 renderers/web_core/src/v0_8/events/validation-event.ts diff --git a/renderers/lit/src/0.8/core.ts b/renderers/lit/src/0.8/core.ts index 2400c01c0..14b966204 100644 --- a/renderers/lit/src/0.8/core.ts +++ b/renderers/lit/src/0.8/core.ts @@ -22,8 +22,8 @@ import * as Styles from "@a2ui/web_core/styles/index"; import { A2uiMessageProcessor } from "@a2ui/web_core/data/model-processor"; import * as Primitives from "@a2ui/web_core/types/primitives"; import { create as createSignalA2uiMessageProcessor } from "./data/signal-model-processor.js"; - -export { Types, Guards, Schemas, Styles, A2uiMessageProcessor, Primitives }; +import { Events as WebEvents } from "@a2ui/web_core"; +export { Types, Guards, Schemas, Styles, A2uiMessageProcessor, Primitives, WebEvents }; export const Data = { createSignalA2uiMessageProcessor, diff --git a/renderers/lit/src/0.8/ui/text-field.ts b/renderers/lit/src/0.8/ui/text-field.ts index 08295e874..72749fc2c 100644 --- a/renderers/lit/src/0.8/ui/text-field.ts +++ b/renderers/lit/src/0.8/ui/text-field.ts @@ -20,6 +20,7 @@ import { Root } from "./root.js"; import { A2uiMessageProcessor } from "@a2ui/web_core/data/model-processor"; import * as Primitives from "@a2ui/web_core/types/primitives"; import * as Types from "@a2ui/web_core/types/types"; +import { Events } from "@a2ui/web_core"; import { classMap } from "lit/directives/class-map.js"; import { styleMap } from "lit/directives/style-map.js"; import { extractStringValue } from "./utils/utils.js"; @@ -115,6 +116,14 @@ export class TextField extends Root { return; } + this.dispatchEvent( + new Events.A2UIValidationEvent({ + componentId: this.id, + value: evt.target.value, + valid: evt.target.checkValidity(), + }) + ); + this.#setBoundValue(evt.target.value); }} name="data" diff --git a/renderers/web_core/src/v0_8/events/base.ts b/renderers/web_core/src/v0_8/events/base.ts new file mode 100644 index 000000000..f051cc0cf --- /dev/null +++ b/renderers/web_core/src/v0_8/events/base.ts @@ -0,0 +1,24 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A base interface for event details. + * All A2UI event payloads should extend this to ensure they have an eventType property + * that matches the event name. + */ +export interface BaseEventDetail { + readonly eventType: EventType; +} diff --git a/renderers/web_core/src/v0_8/events/index.ts b/renderers/web_core/src/v0_8/events/index.ts new file mode 100644 index 000000000..60a40c3f6 --- /dev/null +++ b/renderers/web_core/src/v0_8/events/index.ts @@ -0,0 +1,18 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from "./base.js"; +export * from "./validation-event.js"; diff --git a/renderers/web_core/src/v0_8/events/validation-event.ts b/renderers/web_core/src/v0_8/events/validation-event.ts new file mode 100644 index 000000000..9243be868 --- /dev/null +++ b/renderers/web_core/src/v0_8/events/validation-event.ts @@ -0,0 +1,66 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BaseEventDetail } from "./base.js"; + +/** + * Detailed payload for the `a2ui-validation-input` event. + */ +export interface ValidationEventDetail + extends BaseEventDetail<"a2ui-validation-input"> { + /** + * The ID of the component that is being validated. + */ + readonly componentId: string; + + /** + * The current value of the input component. + */ + readonly value: string; + + /** + * Whether the current value matches the validation constraints. + */ + readonly valid: boolean; +} + +/** + * Event dispatched when an input component's validation state is updated. + */ +export class A2UIValidationEvent extends CustomEvent { + static readonly EVENT_NAME = "a2ui-validation-input"; + + constructor( + detail: Omit, + eventInitDict?: EventInit + ) { + super(A2UIValidationEvent.EVENT_NAME, { + bubbles: true, + composed: true, + ...eventInitDict, + detail: { + ...detail, + eventType: A2UIValidationEvent.EVENT_NAME, + }, + }); + } +} + +declare global { + interface HTMLElementEventMap { + "a2ui-validation-input": A2UIValidationEvent; + } +} diff --git a/renderers/web_core/src/v0_8/index.ts b/renderers/web_core/src/v0_8/index.ts index b17a41ae4..87cbd274b 100644 --- a/renderers/web_core/src/v0_8/index.ts +++ b/renderers/web_core/src/v0_8/index.ts @@ -4,6 +4,7 @@ export * from "./types/primitives.js"; export * from "./types/types.js"; export * from "./types/colors.js"; export * from "./styles/index.js"; +export * as Events from "./events/index.js"; import A2UIClientEventMessage from "./schemas/server_to_client_with_standard_catalog.json" with { type: "json" }; export const Schemas = { diff --git a/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json b/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json index 5a662cf1d..fa6fc228f 100644 --- a/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json +++ b/renderers/web_core/src/v0_8/schemas/standard_catalog_definition.json @@ -31,7 +31,9 @@ ] } }, - "required": ["text"] + "required": [ + "text" + ] }, "Image": { "type": "object", @@ -74,7 +76,9 @@ ] } }, - "required": ["url"] + "required": [ + "url" + ] }, "Icon": { "type": "object", @@ -144,7 +148,9 @@ } } }, - "required": ["name"] + "required": [ + "name" + ] }, "Video": { "type": "object", @@ -164,7 +170,9 @@ } } }, - "required": ["url"] + "required": [ + "url" + ] }, "AudioPlayer": { "type": "object", @@ -197,7 +205,9 @@ } } }, - "required": ["url"] + "required": [ + "url" + ] }, "Row": { "type": "object", @@ -226,7 +236,10 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, @@ -245,10 +258,17 @@ "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis (vertically). This corresponds to the CSS 'align-items' property.", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "Column": { "type": "object", @@ -277,7 +297,10 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, @@ -296,10 +319,17 @@ "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis (horizontally). This corresponds to the CSS 'align-items' property.", - "enum": ["center", "end", "start", "stretch"] + "enum": [ + "center", + "end", + "start", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "List": { "type": "object", @@ -328,22 +358,35 @@ "type": "string" } }, - "required": ["componentId", "dataBinding"] + "required": [ + "componentId", + "dataBinding" + ] } } }, "direction": { "type": "string", "description": "The direction in which the list items are laid out.", - "enum": ["vertical", "horizontal"] + "enum": [ + "vertical", + "horizontal" + ] }, "alignment": { "type": "string", "description": "Defines the alignment of children along the cross axis.", - "enum": ["start", "center", "end", "stretch"] + "enum": [ + "start", + "center", + "end", + "stretch" + ] } }, - "required": ["children"] + "required": [ + "children" + ] }, "Card": { "type": "object", @@ -354,7 +397,9 @@ "description": "The ID of the component to be rendered inside the card." } }, - "required": ["child"] + "required": [ + "child" + ] }, "Tabs": { "type": "object", @@ -384,11 +429,16 @@ "type": "string" } }, - "required": ["title", "child"] + "required": [ + "title", + "child" + ] } } }, - "required": ["tabItems"] + "required": [ + "tabItems" + ] }, "Divider": { "type": "object", @@ -397,7 +447,10 @@ "axis": { "type": "string", "description": "The orientation of the divider.", - "enum": ["horizontal", "vertical"] + "enum": [ + "horizontal", + "vertical" + ] } } }, @@ -414,7 +467,10 @@ "description": "The ID of the component to be displayed inside the modal." } }, - "required": ["entryPointChild", "contentChild"] + "required": [ + "entryPointChild", + "contentChild" + ] }, "Button": { "type": "object", @@ -465,14 +521,22 @@ } } }, - "required": ["key", "value"] + "required": [ + "key", + "value" + ] } } }, - "required": ["name"] + "required": [ + "name" + ] } }, - "required": ["child", "action"] + "required": [ + "child", + "action" + ] }, "CheckBox": { "type": "object", @@ -505,7 +569,10 @@ } } }, - "required": ["label", "value"] + "required": [ + "label", + "value" + ] }, "TextField": { "type": "object", @@ -553,7 +620,9 @@ "description": "A regular expression used for client-side validation of the input." } }, - "required": ["label"] + "required": [ + "label" + ] }, "DateTimeInput": { "type": "object", @@ -581,7 +650,9 @@ "description": "If true, allows the user to select a time." } }, - "required": ["value"] + "required": [ + "value" + ] }, "MultipleChoice": { "type": "object", @@ -632,7 +703,10 @@ "description": "The value to be associated with this option when selected." } }, - "required": ["label", "value"] + "required": [ + "label", + "value" + ] } }, "maxAllowedSelections": { @@ -650,7 +724,7 @@ "filterable": { "type": "boolean", "description": "If true, displays a search input to filter the options." - }, + } } }, "Slider": { @@ -679,7 +753,9 @@ "description": "The maximum value of the slider." } }, - "required": ["value"] + "required": [ + "value" + ] } }, "styles": { diff --git a/samples/client/lit/component_gallery/component-gallery.ts b/samples/client/lit/component_gallery/component-gallery.ts index 773643ff0..021bd7ee8 100644 --- a/samples/client/lit/component_gallery/component-gallery.ts +++ b/samples/client/lit/component_gallery/component-gallery.ts @@ -186,9 +186,15 @@ export class A2UIComponentGallery extends SignalWatcher(LitElement) { async connectedCallback() { super.connectedCallback(); + this.addEventListener("a2ui-validation-input", this.#handleValidationInput); await this.#initiateSession(); } + override disconnectedCallback() { + super.disconnectedCallback(); + this.removeEventListener("a2ui-validation-input", this.#handleValidationInput); + } + async #initiateSession() { const message: v0_8.Types.A2UIClientEventMessage = { request: "START_GALLERY" @@ -196,6 +202,25 @@ export class A2UIComponentGallery extends SignalWatcher(LitElement) { await this.#sendAndProcessMessage(message); } + // Debug Validation Events + #handleValidationInput = (e: Event) => { + const detail = (e as v0_8.WebEvents.A2UIValidationEvent).detail; + if (!detail) return; + + // Log to Console + console.log( + `%c[Validation] Component: ${detail.componentId} | Valid: ${detail.valid} | Value: "${detail.value}"`, + detail.valid ? "color: green" : "color: red; font-weight: bold" + ); + + // Log to Debug Panel + this.#log( + "info", + `Validation: ${detail.componentId} is ${detail.valid ? "VALID" : "INVALID"}`, + detail + ); + }; + render() { return html`
From 27cd724742fab1a4bed685ef394e4021adda49a8 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Wed, 18 Feb 2026 11:10:30 -0800 Subject: [PATCH 57/65] Update gspencergoog in CODEOWNERS (#637) This fixes my github id in CODEOWNERS. --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 604847d48..0e39f50da 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,7 +12,7 @@ # - An email address (e.g., octocat@github.com) # Default ownership (is overriden by specfic rules below) -* @dmandar @gspencer @jacobsimionato +* @dmandar @gspencergoog @jacobsimionato # Agents /a2a_agents/ @nan-yu @dmandar From bd65922702231efe038ea6cf30409a9aaa91fc25 Mon Sep 17 00:00:00 2001 From: Greg Spencer Date: Wed, 18 Feb 2026 17:25:20 -0800 Subject: [PATCH 58/65] Fix enum cases to be lowerCamelCase consistently (#639) --- specification/v0_10/json/standard_catalog.json | 6 +++--- specification/v0_9/json/standard_catalog.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/specification/v0_10/json/standard_catalog.json b/specification/v0_10/json/standard_catalog.json index 7e297300a..789b7c3a5 100644 --- a/specification/v0_10/json/standard_catalog.json +++ b/specification/v0_10/json/standard_catalog.json @@ -45,7 +45,7 @@ "fit": { "type": "string", "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": ["contain", "cover", "fill", "none", "scale-down"] + "enum": ["contain", "cover", "fill", "none", "scaleDown"] }, "variant": { "type": "string", @@ -603,7 +603,7 @@ "format": "time" }, { - "format": "date-time" + "format": "dateTime" } ] } @@ -629,7 +629,7 @@ "format": "time" }, { - "format": "date-time" + "format": "dateTime" } ] } diff --git a/specification/v0_9/json/standard_catalog.json b/specification/v0_9/json/standard_catalog.json index 32c780dec..d20dbbd1c 100644 --- a/specification/v0_9/json/standard_catalog.json +++ b/specification/v0_9/json/standard_catalog.json @@ -57,7 +57,7 @@ "fit": { "type": "string", "description": "Specifies how the image should be resized to fit its container. This corresponds to the CSS 'object-fit' property.", - "enum": ["contain", "cover", "fill", "none", "scale-down"] + "enum": ["contain", "cover", "fill", "none", "scaleDown"] }, "variant": { "type": "string", @@ -738,7 +738,7 @@ "format": "time" }, { - "format": "date-time" + "format": "dateTime" } ] } @@ -764,7 +764,7 @@ "format": "time" }, { - "format": "date-time" + "format": "dateTime" } ] } From efb938e9d58d11215fed4e0c3c0ab5ff7ba2b8b3 Mon Sep 17 00:00:00 2001 From: jacobsimionato Date: Thu, 19 Feb 2026 14:34:48 +1030 Subject: [PATCH 59/65] Implement the data model for web renderers v0.9 (#606) --- renderers/lit/package-lock.json | 6 +- renderers/web_core/package-lock.json | 22 +- renderers/web_core/package.json | 5 + .../src/v0_9/state/data-model.test.ts | 263 ++++++++++++++++++ .../web_core/src/v0_9/state/data-model.ts | 245 ++++++++++++++++ specification/v0_9/docs/a2ui_protocol.md | 3 +- 6 files changed, 538 insertions(+), 6 deletions(-) create mode 100644 renderers/web_core/src/v0_9/state/data-model.test.ts create mode 100644 renderers/web_core/src/v0_9/state/data-model.ts diff --git a/renderers/lit/package-lock.json b/renderers/lit/package-lock.json index ced356e5f..d30dd34de 100644 --- a/renderers/lit/package-lock.json +++ b/renderers/lit/package-lock.json @@ -26,9 +26,10 @@ }, "../web_core": { "name": "@a2ui/web_core", - "version": "0.8.0", + "version": "0.8.2", "license": "Apache-2.0", "devDependencies": { + "@types/node": "^24.10.1", "typescript": "^5.8.3", "wireit": "^0.15.0-pre.2" } @@ -1007,8 +1008,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/signal-polyfill/-/signal-polyfill-0.2.2.tgz", "integrity": "sha512-p63Y4Er5/eMQ9RHg0M0Y64NlsQKpiu6MDdhBXpyywRuWiPywhJTpKJ1iB5K2hJEbFZ0BnDS7ZkJ+0AfTuL37Rg==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/signal-utils": { "version": "0.21.1", diff --git a/renderers/web_core/package-lock.json b/renderers/web_core/package-lock.json index fdcd63be0..71d363e62 100644 --- a/renderers/web_core/package-lock.json +++ b/renderers/web_core/package-lock.json @@ -1,14 +1,15 @@ { "name": "@a2ui/web_core", - "version": "0.8.0", + "version": "0.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2ui/web_core", - "version": "0.8.0", + "version": "0.8.2", "license": "Apache-2.0", "devDependencies": { + "@types/node": "^24.10.1", "typescript": "^5.8.3", "wireit": "^0.15.0-pre.2" } @@ -51,6 +52,16 @@ "node": ">= 8" } }, + "node_modules/@types/node": { + "version": "24.10.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.12.tgz", + "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -439,6 +450,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, "node_modules/wireit": { "version": "0.15.0-pre.2", "resolved": "https://registry.npmjs.org/wireit/-/wireit-0.15.0-pre.2.tgz", diff --git a/renderers/web_core/package.json b/renderers/web_core/package.json index c911bf297..1f3ed83da 100644 --- a/renderers/web_core/package.json +++ b/renderers/web_core/package.json @@ -9,6 +9,10 @@ "types": "./dist/src/v0_8/index.d.ts", "default": "./dist/src/v0_8/index.js" }, + "./v0_9": { + "types": "./dist/src/v0_9/index.d.ts", + "default": "./dist/src/v0_9/index.js" + }, "./types/*": { "types": "./dist/src/v0_8/types/*.d.ts", "default": "./dist/src/v0_8/types/*.js" @@ -69,6 +73,7 @@ "author": "Google", "license": "Apache-2.0", "devDependencies": { + "@types/node": "^24.10.1", "typescript": "^5.8.3", "wireit": "^0.15.0-pre.2" } diff --git a/renderers/web_core/src/v0_9/state/data-model.test.ts b/renderers/web_core/src/v0_9/state/data-model.test.ts new file mode 100644 index 000000000..cafe34897 --- /dev/null +++ b/renderers/web_core/src/v0_9/state/data-model.test.ts @@ -0,0 +1,263 @@ +import assert from 'node:assert'; +import { test, describe, it, beforeEach } from 'node:test'; +import { DataModel } from './data-model.js'; + +describe('DataModel', () => { + let model: DataModel; + + beforeEach(() => { + model = new DataModel({ + user: { + name: 'Alice', + settings: { + theme: 'dark' + } + }, + items: ['a', 'b', 'c'] + }); + }); + + // --- Basic Retrieval --- + + it('retrieves root data', () => { + assert.deepStrictEqual(model.get('/'), { user: { name: 'Alice', settings: { theme: 'dark' } }, items: ['a', 'b', 'c'] }); + }); + + it('retrieves nested path', () => { + assert.strictEqual(model.get('/user/name'), 'Alice'); + assert.strictEqual(model.get('/user/settings/theme'), 'dark'); + }); + + it('retrieves array items', () => { + assert.strictEqual(model.get('/items/0'), 'a'); + assert.strictEqual(model.get('/items/1'), 'b'); + }); + + it('returns undefined for non-existent paths', () => { + assert.strictEqual(model.get('/user/age'), undefined); + assert.strictEqual(model.get('/unknown/path'), undefined); + }); + + // --- Updates --- + + it('sets value at existing path', () => { + model.set('/user/name', 'Bob'); + assert.strictEqual(model.get('/user/name'), 'Bob'); + }); + + it('sets value at new path', () => { + model.set('/user/age', 30); + assert.strictEqual(model.get('/user/age'), 30); + }); + + it('creates intermediate objects', () => { + model.set('/a/b/c', 'foo'); + assert.strictEqual(model.get('/a/b/c'), 'foo'); + assert.notStrictEqual(model.get('/a/b'), undefined); + }); + + it('removes keys when value is undefined', () => { + model.set('/user/name', undefined); + assert.strictEqual(model.get('/user/name'), undefined); + assert.strictEqual(Object.keys(model.get('/user')).includes('name'), false); + }); + + it('replaces root object on root update', () => { + model.set('/', { newRoot: true }); + assert.deepStrictEqual(model.get('/'), { newRoot: true }); + }); + + // --- Array / List Handling (Flutter Parity) --- + + it('List: set and get', () => { + model.set('/list/0', 'hello'); + assert.strictEqual(model.get('/list/0'), 'hello'); + assert.ok(Array.isArray(model.get('/list'))); + }); + + it('List: append and get', () => { + model.set('/list/0', 'hello'); + model.set('/list/1', 'world'); + assert.strictEqual(model.get('/list/0'), 'hello'); + assert.strictEqual(model.get('/list/1'), 'world'); + assert.strictEqual(model.get('/list').length, 2); + }); + + it('List: update existing index', () => { + model.set('/items/1', 'updated'); + assert.strictEqual(model.get('/items/1'), 'updated'); + }); + + it('Nested structures are created automatically', () => { + // Should create nested map and list: { a: { b: [ { c: 123 } ] } } + model.set('/a/b/0/c', 123); + assert.strictEqual(model.get('/a/b/0/c'), 123); + assert.ok(Array.isArray(model.get('/a/b'))); + assert.ok(!Array.isArray(model.get('/a/b/0'))); + + // Should create nested maps + model.set('/x/y/z', 'hello'); + assert.strictEqual(model.get('/x/y/z'), 'hello'); + + // Should create nested lists + model.set('/nestedList/0/0', 'inner'); + assert.strictEqual(model.get('/nestedList/0/0'), 'inner'); + assert.ok(Array.isArray(model.get('/nestedList'))); + assert.ok(Array.isArray(model.get('/nestedList/0'))); + }); + + // --- Subscriptions --- + + it('returns a subscription object', () => { + model.set('/a', 1); + const sub = model.subscribe('/a'); + assert.strictEqual(sub.value, 1); + + let updatedValue: number | undefined; + sub.onChange = (val) => updatedValue = val; + + model.set('/a', 2); + assert.strictEqual(sub.value, 2); + assert.strictEqual(updatedValue, 2); + + sub.unsubscribe(); + // Verify listener removed + model.set('/a', 3); + assert.strictEqual(updatedValue, 2); + }); + + it('notifies subscribers on exact match', (_: any, done: (result?: any) => void) => { + const sub = model.subscribe('/user/name'); + sub.onChange = (val) => { + assert.strictEqual(val, 'Charlie'); + done(); + }; + model.set('/user/name', 'Charlie'); + }); + + it('notifies ancestor subscribers (Container Semantics)', (_: any, done: (result?: any) => void) => { + const sub = model.subscribe('/user'); + sub.onChange = (val: any) => { + assert.strictEqual(val.name, 'Dave'); + done(); + }; + model.set('/user/name', 'Dave'); + }); + + it('notifies descendant subscribers', (_: any, done: (result?: any) => void) => { + const sub = model.subscribe('/user/settings/theme'); + sub.onChange = (val) => { + assert.strictEqual(val, 'light'); + done(); + }; + + // We update the parent object + model.set('/user/settings', { theme: 'light' }); + }); + + it('notifies root subscriber', (_: any, done: (result?: any) => void) => { + const sub = model.subscribe('/'); + sub.onChange = (val: any) => { + assert.strictEqual(val.newProp, 'test'); + done(); + }; + model.set('/newProp', 'test'); + }); + + it('notifies parent when child updates', () => { + model.set('/parent', { child: 'initial' }); + + const sub = model.subscribe('/parent'); + let parentValue: any; + sub.onChange = (val) => parentValue = val; + + model.set('/parent/child', 'updated'); + assert.deepStrictEqual(parentValue, { child: 'updated' }); + }); + + it('stops notifying after dispose', () => { + let count = 0; + const sub = model.subscribe('/'); + sub.onChange = () => count++; + + model.dispose(); + model.set('/foo', 'bar'); + assert.strictEqual(count, 0); + }); + + it('supports multiple subscribers to the same path', () => { + let callCount1 = 0; + let callCount2 = 0; + + const sub1 = model.subscribe('/user/name'); + sub1.onChange = () => callCount1++; + + const sub2 = model.subscribe('/user/name'); + sub2.onChange = () => callCount2++; + + model.set('/user/name', 'Eve'); + + assert.strictEqual(callCount1, 1); + assert.strictEqual(callCount2, 1); + assert.strictEqual(sub1.value, 'Eve'); + assert.strictEqual(sub2.value, 'Eve'); + }); + + it('allows unsubscribing individual listeners', () => { + let callCount1 = 0; + let callCount2 = 0; + + const sub1 = model.subscribe('/user/name'); + sub1.onChange = () => callCount1++; + + const sub2 = model.subscribe('/user/name'); + sub2.onChange = () => callCount2++; + + sub1.unsubscribe(); + + model.set('/user/name', 'Frank'); + + assert.strictEqual(callCount1, 0); // sub1 was unsubscribed + assert.strictEqual(callCount2, 1); // sub2 still active + assert.strictEqual(sub2.value, 'Frank'); + }); + + it('handles subscription to non-existent path', () => { + const sub = model.subscribe('/non/existent'); + assert.strictEqual(sub.value, undefined); + + let val: any; + sub.onChange = (v) => val = v; + + model.set('/non/existent', 'exists now'); + assert.strictEqual(sub.value, 'exists now'); + assert.strictEqual(val, 'exists now'); + }); + + it('handles updates to undefined', () => { + model.set('/foo', 'bar'); + const sub = model.subscribe('/foo'); + + let val: any = 'initial'; + sub.onChange = (v) => val = v; + + model.set('/foo', undefined); + assert.strictEqual(sub.value, undefined); + assert.strictEqual(val, undefined); + }); + + it('throws when trying to set nested property through a primitive', () => { + model.set('/user/name', 'not an object'); + assert.strictEqual(model.get('/user/name'), 'not an object'); + + assert.throws(() => { + model.set('/user/name/first', 'Alice'); + }, /Cannot set path/); + }); + + it('throws when using non-numeric segment on an array', () => { + assert.throws(() => { + model.set('/items/foo', 'bar'); + }, /Cannot use non-numeric segment/); + }); +}); diff --git a/renderers/web_core/src/v0_9/state/data-model.ts b/renderers/web_core/src/v0_9/state/data-model.ts new file mode 100644 index 000000000..bd6d0ad8b --- /dev/null +++ b/renderers/web_core/src/v0_9/state/data-model.ts @@ -0,0 +1,245 @@ +/* + Copyright 2025 Google LLC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +/** + * Represents a reactive connection to a specific path in the data model. + */ +export interface Subscription { + /** + * The current value at the subscribed path. + */ + readonly value: T | undefined; + + /** + * A callback function to be invoked when the value changes. + */ + onChange?: (value: T | undefined) => void; + + /** + * Unsubscribes from the data model. + */ + unsubscribe(): void; +} + +class SubscriptionImpl implements Subscription { + private _value: T | undefined; + private readonly _unsubscribe: () => void; + public onChange?: (value: T | undefined) => void; + + constructor(initialValue: T | undefined, unsubscribe: () => void) { + this._value = initialValue; + this._unsubscribe = unsubscribe; + } + + get value(): T | undefined { + return this._value; + } + + setValue(value: T | undefined): void { + this._value = value; + this.onChange?.(value); + } + + unsubscribe(): void { + this._unsubscribe(); + } +} + +function isNumeric(value: string): boolean { + return /^\d+$/.test(value); +} + +/** + * A standalone, observable data store representing the client-side state. + * It handles JSON Pointer path resolution and subscription management. + */ +export class DataModel { + private data: Record = {}; + private readonly subscriptions: Map>> = new Map(); + + constructor(initialData: Record = {}) { + this.data = initialData; + } + + /** + * Updates the model at the specific path and notifies all relevant subscribers. + * If path is '/' or empty, replaces the entire root. + * + * Note on `undefined` values: + * - For objects: Setting a property to `undefined` removes the key from the object. + * - For arrays: Setting an index to `undefined` sets that index to `undefined` but preserves the array length (sparse array). + */ + set(path: string, value: any): this { + if (path === null || path === undefined) { + throw new Error("Path cannot be null or undefined."); + } + if (path === '/' || path === '') { + this.data = value; + this.notifyAllSubscribers(); + return this; + } + + const segments = this.parsePath(path); + const lastSegment = segments.pop()!; + + let current: any = this.data; + for (let i = 0; i < segments.length; i++) { + const segment = segments[i]; + + if (Array.isArray(current) && !isNumeric(segment)) { + throw new Error(`Cannot use non-numeric segment '${segment}' on an array in path '${path}'.`); + } + + // If we encounter a primitive where a container is expected, we cannot proceed. + // We allow undefined/null to be overwritten by a new container. + if (current[segment] !== undefined && current[segment] !== null && typeof current[segment] !== 'object') { + throw new Error(`Cannot set path '${path}': segment '${segment}' is a primitive value.`); + } + + if (current[segment] === undefined || current[segment] === null) { + const nextSegment = (i < segments.length - 1) ? segments[i + 1] : lastSegment; + current[segment] = isNumeric(nextSegment) ? [] : {}; + } + current = current[segment]; + } + + if (Array.isArray(current) && !isNumeric(lastSegment)) { + throw new Error(`Cannot use non-numeric segment '${lastSegment}' on an array in path '${path}'.`); + } + + if (value === undefined) { + if (Array.isArray(current)) { + current[parseInt(lastSegment, 10)] = undefined; + } else { + delete current[lastSegment]; + } + } else { + current[lastSegment] = value; + } + + this.notifySubscribers(path); + return this; + } + + /** + * Retrieves data at a specific path. + */ + get(path: string): any { + if (path === null || path === undefined) { + throw new Error("Path cannot be null or undefined."); + } + if (path === '/' || path === '') { + return this.data; + } + + const segments = this.parsePath(path); + let current: any = this.data; + for (const segment of segments) { + if (current === undefined || current === null) { + return undefined; + } + current = current[segment]; + } + return current; + } + + /** + * Subscribes to changes at a specific path. Returns a Subscription object. + */ + subscribe(path: string): Subscription { + const normalizedPath = this.normalizePath(path); + const initialValue = this.get(normalizedPath); + + const subscription = new SubscriptionImpl( + initialValue, + () => { + const set = this.subscriptions.get(normalizedPath); + if (set) { + set.delete(subscription); + if (set.size === 0) { + this.subscriptions.delete(normalizedPath); + } + } + } + ); + + if (!this.subscriptions.has(normalizedPath)) { + this.subscriptions.set(normalizedPath, new Set()); + } + this.subscriptions.get(normalizedPath)!.add(subscription); + + return subscription; + } + + /** + * Clears all internal subscriptions. + */ + dispose(): void { + this.subscriptions.clear(); + } + + private normalizePath(path: string): string { + if (path.length > 1 && path.endsWith('/')) { + return path.slice(0, -1); + } + return path || '/'; + } + + private parsePath(path: string): string[] { + return path.split('/').filter(p => p.length > 0); + } + + private notifySubscribers(path: string): void { + const normalizedPath = this.normalizePath(path); + this.notify(normalizedPath); + + // Notify Ancestors + let parentPath = normalizedPath; + while (parentPath !== '/' && parentPath !== '') { + parentPath = parentPath.substring(0, parentPath.lastIndexOf('/')) || '/'; + this.notify(parentPath); + } + + // Notify Descendants + for (const subPath of this.subscriptions.keys()) { + if (this.isDescendant(subPath, normalizedPath)) { + this.notify(subPath); + } + } + } + + private notify(path: string): void { + const set = this.subscriptions.get(path); + if (!set) { + return; + } + const value = this.get(path); + set.forEach(sub => sub.setValue(value)); + } + + private notifyAllSubscribers(): void { + for (const path of this.subscriptions.keys()) { + this.notify(path); + } + } + + private isDescendant(childPath: string, parentPath: string): boolean { + if (parentPath === '/' || parentPath === '') { + return childPath !== '/'; + } + return childPath.startsWith(parentPath + '/'); + } +} diff --git a/specification/v0_9/docs/a2ui_protocol.md b/specification/v0_9/docs/a2ui_protocol.md index fca2262ba..8065fb164 100644 --- a/specification/v0_9/docs/a2ui_protocol.md +++ b/specification/v0_9/docs/a2ui_protocol.md @@ -408,6 +408,7 @@ When a container component (such as `Column`, `Row`, or `List`) utilizes the **T - **Scope instantiation:** For every item in the array, the client instantiates the template component. - **Relative resolution:** Inside these instantiated components, any path that **does not** start with a forward slash `/` is treated as a **Relative Path**. - A relative path `firstName` inside a template iterating over `/users` resolves to `/users/0/firstName` for the first item, `/users/1/firstName` for the second, etc. + - It is an error to use a non-numeric index on a path segment that refers to an array. - **Mixing scopes:** Components inside a Child Scope can still access the Root Scope by using an Absolute Path. @@ -519,7 +520,7 @@ The server sends `updateDataModel` messages to modify the client's data model. T - If the path exists, the value is updated. - If the path does not exist, the value is created. -- If the value is `null`, the key at that path is removed. +- If the value is omitted (or set to `undefined`), the key is removed. For arrays, the value at the index is set to `undefined`, preserving length. The `updateDataModel` message replaces the value at the specified `path` with the new content. If `path` is omitted (or is `/`), the entire data model for the surface is replaced. From 83572bc4b64c64d28b9ec21b993fc349c5b9b06e Mon Sep 17 00:00:00 2001 From: Dijo Date: Thu, 19 Feb 2026 09:40:23 +0530 Subject: [PATCH 60/65] fix(angular): add missing license to package.json (#632) --- renderers/angular/package-lock.json | 33 +++++-------------------- renderers/angular/package.json | 3 ++- renderers/angular/postprocess-build.mjs | 6 +++-- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/renderers/angular/package-lock.json b/renderers/angular/package-lock.json index 97ad71119..9076a598b 100644 --- a/renderers/angular/package-lock.json +++ b/renderers/angular/package-lock.json @@ -1,12 +1,13 @@ { "name": "@a2ui/angular", - "version": "0.8.3", + "version": "0.8.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2ui/angular", - "version": "0.8.3", + "version": "0.8.4", + "license": "Apache-2.0", "dependencies": { "@a2ui/web_core": "file:../web_core", "markdown-it": "^14.1.0", @@ -49,7 +50,7 @@ }, "../web_core": { "name": "@a2ui/web_core", - "version": "0.8.0", + "version": "0.8.2", "license": "Apache-2.0", "devDependencies": { "typescript": "^5.8.3", @@ -566,7 +567,6 @@ "integrity": "sha512-UprCiJwEU1Ilw1dVk+yLgNiHlbH81obAuh92lRKozUQRgtSCpOfCQUM79q5r+VdmCPxDshr79U2Ke0fRaiJfAQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -580,7 +580,6 @@ "integrity": "sha512-//BTtxJovsF0LaOWQkOVxWX4EVyNJaPus+IlwWxzmdRHpojIl1Zdyy9BJMVJOifvj3XQ16sZwR1PDWDI5DIWrg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "7.28.5", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -613,7 +612,6 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.0.tgz", "integrity": "sha512-QTl9s8GYNN0pt1k3GE6UVlfe6zWtfdykhfchinKq2YJywQ6LBM4UcZgoc56YkgscmyrRFYrr4JYUJjlzTF57+A==", "license": "MIT", - "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -1103,7 +1101,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -1147,7 +1144,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1946,7 +1942,6 @@ "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", @@ -4277,7 +4272,6 @@ "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -5027,7 +5021,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5290,7 +5283,6 @@ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "readdirp": "^5.0.0" }, @@ -6522,7 +6514,6 @@ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -8327,8 +8318,7 @@ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", "integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/jose": { "version": "6.1.3", @@ -8589,7 +8579,6 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -8948,7 +8937,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -9047,7 +9035,6 @@ "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cli-truncate": "^5.0.0", "colorette": "^2.0.20", @@ -9887,7 +9874,6 @@ "integrity": "sha512-UlQOhH8DRlaYsBGQMjOYvg70J70hD4i/55NV9vAsYvsxEskmp86xjUtZgEeVKeoLq8tYMjMXDgaYjYde153sZQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.3.0", "@rollup/plugin-json": "^6.1.0", @@ -11210,7 +11196,6 @@ "integrity": "sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -11295,7 +11280,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -12343,8 +12327,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tuf-js": { "version": "4.1.0", @@ -12439,7 +12422,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12657,7 +12639,6 @@ "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -12733,7 +12714,6 @@ "integrity": "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.17", "@vitest/mocker": "4.0.17", @@ -13121,7 +13101,6 @@ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/renderers/angular/package.json b/renderers/angular/package.json index 2be6aef48..e565e1222 100644 --- a/renderers/angular/package.json +++ b/renderers/angular/package.json @@ -1,6 +1,7 @@ { "name": "@a2ui/angular", - "version": "0.8.3", + "version": "0.8.4", + "license": "Apache-2.0", "scripts": { "build": "ng build && node postprocess-build.mjs" }, diff --git a/renderers/angular/postprocess-build.mjs b/renderers/angular/postprocess-build.mjs index 2dda8924f..e31d44b69 100644 --- a/renderers/angular/postprocess-build.mjs +++ b/renderers/angular/postprocess-build.mjs @@ -14,7 +14,7 @@ limitations under the License. */ -import { readFileSync, writeFileSync } from 'fs'; +import { readFileSync, writeFileSync, copyFileSync } from 'fs'; import { join } from 'path'; // Locally we depend on the Core package via a relative path so we can test it from source. @@ -33,13 +33,15 @@ const packageJson = parsePackageJson(packageJsonPath); if (!packageJson.dependencies['@a2ui/web_core']) { throw new Error( 'Angular package does not depend on the Core library. ' + - 'Either update the package.json or remove this script.', + 'Either update the package.json or remove this script.', ); } packageJson.dependencies['@a2ui/web_core'] = '^' + coreVersion; writeFileSync(packageJsonPath, JSON.stringify(packageJson, undefined, 2)); +copyFileSync(join(dirname, '../../LICENSE'), join(dirname, './dist/LICENSE')); + function parsePackageJson(path) { const content = readFileSync(path, 'utf8'); return JSON.parse(content); From 45454fa3d1377fe2f20eb98981da2ecb49665921 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Wed, 25 Feb 2026 13:37:50 +0100 Subject: [PATCH 61/65] Use markdown-it renderer rules API for theme class injection in Text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace regex-based HTML string patching in applyMarkdownTheme with markdown-it's renderer.rules API. Sets token.attrJoin() on _open tokens before render, then cleans up rules after — same approach as the Lit renderer's markdown directive. --- .../react/src/components/content/Text.tsx | 80 +++++++++++++------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/renderers/react/src/components/content/Text.tsx b/renderers/react/src/components/content/Text.tsx index 15a2227a5..e172caf1f 100644 --- a/renderers/react/src/components/content/Text.tsx +++ b/renderers/react/src/components/content/Text.tsx @@ -36,34 +36,70 @@ function isHintedStyles(styles: unknown): styles is HintedStyles { const markdownRenderer = new MarkdownIt(); /** - * Apply theme classes to markdown HTML elements. - * Replaces default element tags with themed versions. + * Maps HTML tag names to their markdown-it token names. + * Mirrors the Lit renderer's markdown directive approach. */ -function applyMarkdownTheme(html: string, markdownTheme: Types.Theme['markdown']): string { - if (!markdownTheme) return html; - - // Map of element -> classes - const replacements: Array<[RegExp, string]> = []; - - for (const [element, classes] of Object.entries(markdownTheme)) { - if (!classes || (Array.isArray(classes) && classes.length === 0)) continue; - - const classString = Array.isArray(classes) ? classes.join(' ') : classMapToString(classes); - if (!classString) continue; +const TAG_TO_TOKEN: Record = { + p: 'paragraph', + h1: 'heading', h2: 'heading', h3: 'heading', + h4: 'heading', h5: 'heading', h6: 'heading', + ul: 'bullet_list', + ol: 'ordered_list', + li: 'list_item', + a: 'link', + strong: 'strong', + em: 'em', +}; + +function toClassArray(classes: string[] | Record): string[] { + if (Array.isArray(classes)) return classes; + return Object.entries(classes).filter(([, v]) => v).map(([k]) => k); +} - // Create regex to match opening tags (handles self-closing and regular) - const tagRegex = new RegExp(`<${element}(?=\\s|>|/>)`, 'gi'); - replacements.push([tagRegex, `<${element} class="${classString}"`]); +/** + * Render markdown to HTML, applying theme classes via markdown-it renderer rules. + * Uses token.attrJoin() on _open tokens — same approach as the Lit renderer. + * Safe to mutate the module-level renderer because MarkdownIt.render() is synchronous. + */ +function renderWithTheme(text: string, markdownTheme: Types.Theme['markdown']): string { + const appliedKeys: string[] = []; + // Cast to a generic record for dynamic token.tag lookups inside renderer rules + const themeMap = markdownTheme as Record> | undefined; + + if (themeMap) { + for (const [tag, classes] of Object.entries(themeMap)) { + if (!classes) continue; + const tokenName = TAG_TO_TOKEN[tag]; + if (!tokenName) continue; + + const key = `${tokenName}_open`; + if (!appliedKeys.includes(key)) appliedKeys.push(key); + + markdownRenderer.renderer.rules[key] = (tokens, idx, options, _env, self) => { + const token = tokens[idx]; + if (token) { + const tagClasses = themeMap[token.tag]; + if (tagClasses) { + for (const cls of toClassArray(tagClasses)) { + token.attrJoin('class', cls); + } + } + } + return self.renderToken(tokens, idx, options); + }; + } } - let result = html; - for (const [regex, replacement] of replacements) { - result = result.replace(regex, replacement); + const html = markdownRenderer.render(text); + + for (const key of appliedKeys) { + delete markdownRenderer.renderer.rules[key]; } - return result; + return html; } + /** * Text component - renders text content with markdown support. * @@ -143,9 +179,7 @@ export const Text = memo(function Text({ node, surfaceId }: A2UIComponentProps Date: Wed, 25 Feb 2026 13:52:38 +0100 Subject: [PATCH 62/65] Move CSS comments out of injected style output into JSDoc --- renderers/react/src/styles/index.ts | 168 ++-------------------------- 1 file changed, 10 insertions(+), 158 deletions(-) diff --git a/renderers/react/src/styles/index.ts b/renderers/react/src/styles/index.ts index 69b7666d6..e073a8948 100644 --- a/renderers/react/src/styles/index.ts +++ b/renderers/react/src/styles/index.ts @@ -19,70 +19,50 @@ export const structuralStyles: string = Styles.structuralStyles.replace( * * Transformation rules: * :host → .a2ui-surface .a2ui-{component} - * section → .a2ui-surface .a2ui-{component} section - * ::slotted(*) → .a2ui-surface .a2ui-{component} section > * + * section → .a2ui-surface .a2ui-{component} > section + * ::slotted(*) → .a2ui-surface .a2ui-{component} > section > * + * + * The `>` child combinator is used throughout to prevent selectors from matching + * elements inside nested components (e.g. a Column's section rule must not match + * a CheckBox's section that happens to be a descendant). + * + * Element selectors that should remain overridable by theme utility classes use + * `:where()` to keep specificity at zero (e.g. `:where(.a2ui-surface .a2ui-text) h1`), + * matching the low specificity of Lit's Shadow DOM element selectors. */ export const componentSpecificStyles: string = ` -/* ========================================================================= - * Card (from Lit card.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-card { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* section { height: 100%; width: 100%; min-height: 0; overflow: auto; } */ -/* Use > to target only Card's direct section, not nested sections (e.g., TextField's section) */ .a2ui-surface .a2ui-card > section { height: 100%; width: 100%; min-height: 0; overflow: auto; } - -/* section ::slotted(*) { height: 100%; width: 100%; } */ -/* Use > section > to only target Card's slotted children, not deeply nested elements */ .a2ui-surface .a2ui-card > section > * { height: 100%; width: 100%; } -/* ========================================================================= - * Divider (from Lit divider.ts static styles) - * ========================================================================= */ - -/* :host { display: block; min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-divider { display: block; min-height: 0; overflow: auto; } - -/* hr { height: 1px; background: #ccc; border: none; } */ -/* Use :where() for low specificity (0,0,1) so theme utility classes can override */ -/* Browser default margins apply (margin-block: 0.5em, margin-inline: auto) */ :where(.a2ui-surface .a2ui-divider) hr { height: 1px; background: #ccc; border: none; } -/* ========================================================================= - * Text (from Lit text.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); } */ .a2ui-surface .a2ui-text { display: block; flex: var(--weight); } - -/* h1, h2, h3, h4, h5 { line-height: inherit; font: inherit; } */ -/* Use :where() to match Lit's low specificity (0,0,0,1 - just element) */ :where(.a2ui-surface .a2ui-text) h1, :where(.a2ui-surface .a2ui-text) h2, :where(.a2ui-surface .a2ui-text) h3, @@ -91,90 +71,53 @@ export const componentSpecificStyles: string = ` line-height: inherit; font: inherit; } - -/* Ensure markdown paragraph margins are reset */ .a2ui-surface .a2ui-text p { margin: 0; } -/* ========================================================================= - * TextField (from Lit text-field.ts static styles) - * ========================================================================= */ - -/* :host { display: flex; flex: var(--weight); } */ .a2ui-surface .a2ui-textfield { display: flex; flex: var(--weight); } - -/* input { display: block; width: 100%; } */ :where(.a2ui-surface .a2ui-textfield) input { display: block; width: 100%; } - -/* label { display: block; margin-bottom: 4px; } */ :where(.a2ui-surface .a2ui-textfield) label { display: block; margin-bottom: 4px; } - -/* textarea - same styling as input for multiline text fields */ :where(.a2ui-surface .a2ui-textfield) textarea { display: block; width: 100%; } -/* ========================================================================= - * CheckBox (from Lit checkbox.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-checkbox { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* input { display: block; width: 100%; } */ :where(.a2ui-surface .a2ui-checkbox) input { display: block; width: 100%; } -/* ========================================================================= - * Slider (from Lit slider.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); } */ .a2ui-surface .a2ui-slider { display: block; flex: var(--weight); } - -/* input { display: block; width: 100%; } */ :where(.a2ui-surface .a2ui-slider) input { display: block; width: 100%; } -/* ========================================================================= - * Button (from Lit button.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; } */ .a2ui-surface .a2ui-button { display: block; flex: var(--weight); min-height: 0; } -/* ========================================================================= - * Icon (from Lit icon.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-icon { display: block; flex: var(--weight); @@ -182,41 +125,25 @@ export const componentSpecificStyles: string = ` overflow: auto; } -/* ========================================================================= - * Tabs (from Lit tabs.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); } */ .a2ui-surface .a2ui-tabs { display: block; flex: var(--weight); } -/* ========================================================================= - * Modal (from Lit modal.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); } */ .a2ui-surface .a2ui-modal { display: block; flex: var(--weight); } - -/* dialog { padding: 0; border: none; background: none; } */ :where(.a2ui-surface .a2ui-modal) dialog { padding: 0; border: none; background: none; } - -/* dialog section #controls { display: flex; justify-content: end; margin-bottom: 4px; } */ .a2ui-surface .a2ui-modal dialog section #controls { display: flex; justify-content: end; margin-bottom: 4px; } - -/* dialog section #controls button { padding: 0; background: none; ... } */ .a2ui-surface .a2ui-modal dialog section #controls button { padding: 0; background: none; @@ -226,19 +153,12 @@ export const componentSpecificStyles: string = ` border: none; } -/* ========================================================================= - * Image (from Lit image.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-image { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* img { display: block; width: 100%; height: 100%; object-fit: var(--object-fit, fill); } */ :where(.a2ui-surface .a2ui-image) img { display: block; width: 100%; @@ -246,85 +166,52 @@ export const componentSpecificStyles: string = ` object-fit: var(--object-fit, fill); } -/* ========================================================================= - * Video (from Lit video.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-video { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* video { display: block; width: 100%; } */ :where(.a2ui-surface .a2ui-video) video { display: block; width: 100%; } -/* ========================================================================= - * AudioPlayer (from Lit audio.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-audio { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* audio { display: block; width: 100%; } */ :where(.a2ui-surface .a2ui-audio) audio { display: block; width: 100%; } -/* ========================================================================= - * MultipleChoice (from Lit multiple-choice.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-multiplechoice { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* select { width: 100%; } */ :where(.a2ui-surface .a2ui-multiplechoice) select { width: 100%; } -/* ========================================================================= - * Column (from Lit column.ts static styles) - * ========================================================================= */ - -/* :host { display: flex; flex: var(--weight); } */ .a2ui-surface .a2ui-column { display: flex; flex: var(--weight); } - -/* section { display: flex; flex-direction: column; min-width: 100%; height: 100%; } */ .a2ui-surface .a2ui-column > section { display: flex; flex-direction: column; min-width: 100%; height: 100%; } - -/* :host([alignment="..."]) section { align-items: ...; } */ -/* Use > section to only target Column's direct section, not nested sections (e.g., CheckBox's section) */ .a2ui-surface .a2ui-column[data-alignment="start"] > section { align-items: start; } .a2ui-surface .a2ui-column[data-alignment="center"] > section { align-items: center; } .a2ui-surface .a2ui-column[data-alignment="end"] > section { align-items: end; } .a2ui-surface .a2ui-column[data-alignment="stretch"] > section { align-items: stretch; } - -/* :host([distribution="..."]) section { justify-content: ...; } */ .a2ui-surface .a2ui-column[data-distribution="start"] > section { justify-content: start; } .a2ui-surface .a2ui-column[data-distribution="center"] > section { justify-content: center; } .a2ui-surface .a2ui-column[data-distribution="end"] > section { justify-content: end; } @@ -332,32 +219,20 @@ export const componentSpecificStyles: string = ` .a2ui-surface .a2ui-column[data-distribution="spaceAround"] > section { justify-content: space-around; } .a2ui-surface .a2ui-column[data-distribution="spaceEvenly"] > section { justify-content: space-evenly; } -/* ========================================================================= - * Row (from Lit row.ts static styles) - * ========================================================================= */ - -/* :host { display: flex; flex: var(--weight); } */ .a2ui-surface .a2ui-row { display: flex; flex: var(--weight); } - -/* section { display: flex; flex-direction: row; width: 100%; min-height: 100%; } */ .a2ui-surface .a2ui-row > section { display: flex; flex-direction: row; width: 100%; min-height: 100%; } - -/* :host([alignment="..."]) section { align-items: ...; } */ -/* Use > section to only target Row's direct section, not nested sections */ .a2ui-surface .a2ui-row[data-alignment="start"] > section { align-items: start; } .a2ui-surface .a2ui-row[data-alignment="center"] > section { align-items: center; } .a2ui-surface .a2ui-row[data-alignment="end"] > section { align-items: end; } .a2ui-surface .a2ui-row[data-alignment="stretch"] > section { align-items: stretch; } - -/* :host([distribution="..."]) section { justify-content: ...; } */ .a2ui-surface .a2ui-row[data-distribution="start"] > section { justify-content: start; } .a2ui-surface .a2ui-row[data-distribution="center"] > section { justify-content: center; } .a2ui-surface .a2ui-row[data-distribution="end"] > section { justify-content: end; } @@ -365,24 +240,15 @@ export const componentSpecificStyles: string = ` .a2ui-surface .a2ui-row[data-distribution="spaceAround"] > section { justify-content: space-around; } .a2ui-surface .a2ui-row[data-distribution="spaceEvenly"] > section { justify-content: space-evenly; } -/* ========================================================================= - * List (from Lit list.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-list { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* :host([direction="vertical"]) section { display: grid; } */ .a2ui-surface .a2ui-list[data-direction="vertical"] > section { display: grid; } - -/* :host([direction="horizontal"]) section { display: flex; max-width: 100%; overflow-x: scroll; ... } */ .a2ui-surface .a2ui-list[data-direction="horizontal"] > section { display: flex; max-width: 100%; @@ -390,27 +256,17 @@ export const componentSpecificStyles: string = ` overflow-y: hidden; scrollbar-width: none; } - -/* :host([direction="horizontal"]) section > ::slotted(*) { flex: 1 0 fit-content; ... } */ .a2ui-surface .a2ui-list[data-direction="horizontal"] > section > * { flex: 1 0 fit-content; max-width: min(80%, 400px); } -/* ========================================================================= - * DateTimeInput (from Lit datetime-input.ts static styles) - * ========================================================================= */ - -/* :host { display: block; flex: var(--weight); min-height: 0; overflow: auto; } */ .a2ui-surface .a2ui-datetime-input { display: block; flex: var(--weight); min-height: 0; overflow: auto; } - -/* input { display: block; border-radius: 8px; padding: 8px; border: 1px solid #ccc; width: 100%; } */ -/* Use :where() to match Lit's low specificity (0,0,0,1) so theme utility classes can override */ :where(.a2ui-surface .a2ui-datetime-input) input { display: block; border-radius: 8px; @@ -419,10 +275,6 @@ export const componentSpecificStyles: string = ` width: 100%; } -/* ========================================================================= - * Global box-sizing (matches Lit's * { box-sizing: border-box; } in components) - * ========================================================================= */ - .a2ui-surface *, .a2ui-surface *::before, .a2ui-surface *::after { From c8b4cba54975e467eaee98cda2ea6fcbb2a9b186 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Wed, 25 Feb 2026 14:18:46 +0100 Subject: [PATCH 63/65] fix(visual-parity): exclude transitive deps from Vite optimizeDeps in both renderers Exclude markdown-it, clsx, and signal-utils/* from pre-bundling in both the React and Lit dev servers to avoid stale cache / duplicate module instances. Also update cache-clearing instructions in PARITY.md. --- renderers/react/visual-parity/PARITY.md | 2 +- renderers/react/visual-parity/lit/vite.config.ts | 12 ++++++++++-- renderers/react/visual-parity/react/vite.config.ts | 11 ++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/renderers/react/visual-parity/PARITY.md b/renderers/react/visual-parity/PARITY.md index c636ed621..1954704e9 100644 --- a/renderers/react/visual-parity/PARITY.md +++ b/renderers/react/visual-parity/PARITY.md @@ -165,7 +165,7 @@ This happens when Vite's dependency optimization cache becomes stale, typically **Fix:** Clear the Vite cache and restart: ```bash # From renderers/react/visual-parity/ -rm -rf node_modules/.vite react/node_modules/.vite lit/node_modules/.vite +rm -rf node_modules/.vite react/node_modules/.vite lit/node_modules/.vite ../node_modules/.vite npm run dev:react # or dev:lit ``` diff --git a/renderers/react/visual-parity/lit/vite.config.ts b/renderers/react/visual-parity/lit/vite.config.ts index 9becae578..5935a8011 100644 --- a/renderers/react/visual-parity/lit/vite.config.ts +++ b/renderers/react/visual-parity/lit/vite.config.ts @@ -7,8 +7,16 @@ export default defineConfig({ strictPort: true, }, optimizeDeps: { - // Don't pre-bundle @a2ui/lit to avoid duplicate module instances - exclude: ['@a2ui/lit'], + // Don't pre-bundle @a2ui/lit or its deps to avoid duplicate module instances + exclude: [ + '@a2ui/lit', + 'markdown-it', + 'clsx', + 'signal-utils/array', + 'signal-utils/map', + 'signal-utils/object', + 'signal-utils/set', + ], }, esbuild: { // Enable decorator support diff --git a/renderers/react/visual-parity/react/vite.config.ts b/renderers/react/visual-parity/react/vite.config.ts index 8d47b3f46..0674fcb92 100644 --- a/renderers/react/visual-parity/react/vite.config.ts +++ b/renderers/react/visual-parity/react/vite.config.ts @@ -10,7 +10,16 @@ export default defineConfig({ strictPort: true, }, optimizeDeps: { - exclude: ['@a2ui/react', '@a2ui/lit', 'markdown-it'], + exclude: [ + '@a2ui/react', + '@a2ui/lit', + 'markdown-it', + 'clsx', + 'signal-utils/array', + 'signal-utils/map', + 'signal-utils/object', + 'signal-utils/set', + ], }, resolve: { alias: { From 7a5cc7237fa48a6ed6d3ae37b9e508e444621f36 Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Wed, 25 Feb 2026 14:25:18 +0100 Subject: [PATCH 64/65] Remove deprecated useA2UIStore and useA2UIStoreSelector --- renderers/react/src/core/A2UIProvider.tsx | 18 ------------------ renderers/react/src/index.ts | 2 -- 2 files changed, 20 deletions(-) diff --git a/renderers/react/src/core/A2UIProvider.tsx b/renderers/react/src/core/A2UIProvider.tsx index 6d5812f53..31fb31bbc 100644 --- a/renderers/react/src/core/A2UIProvider.tsx +++ b/renderers/react/src/core/A2UIProvider.tsx @@ -190,21 +190,3 @@ export function useA2UIContext(): A2UIContextValue { [actions, state.version] ); } - -/** - * @deprecated Use useA2UIContext instead. This alias exists for backward compatibility only. - */ -export const useA2UIStore = useA2UIContext; - -/** - * @deprecated This selector pattern does not provide performance benefits with React Context. - * Components will re-render on any context change regardless of what you select. - * Use useA2UIContext() or useA2UI() directly instead. - * - * @param selector - Function to select a slice of state - * @returns The selected state - */ -export function useA2UIStoreSelector(selector: (state: A2UIContextValue) => T): T { - const context = useA2UIContext(); - return selector(context); -} diff --git a/renderers/react/src/index.ts b/renderers/react/src/index.ts index ce9a8be8e..1ef980b1c 100644 --- a/renderers/react/src/index.ts +++ b/renderers/react/src/index.ts @@ -4,8 +4,6 @@ export { useA2UIActions, useA2UIState, useA2UIContext, - useA2UIStore, // @deprecated - use useA2UIContext - useA2UIStoreSelector, // @deprecated - use useA2UIContext or useA2UI } from './core/A2UIProvider'; export type { A2UIProviderProps } from './core/A2UIProvider'; export { A2UIRenderer } from './core/A2UIRenderer'; From f806ccbc878cc3629dad5c05be3c305c790c272d Mon Sep 17 00:00:00 2001 From: Lukas Moschitz Date: Wed, 25 Feb 2026 14:32:08 +0100 Subject: [PATCH 65/65] Simplify hash algorithm in A2UIViewer --- renderers/react/src/core/A2UIViewer.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/renderers/react/src/core/A2UIViewer.tsx b/renderers/react/src/core/A2UIViewer.tsx index 34a624a27..0abf3b051 100644 --- a/renderers/react/src/core/A2UIViewer.tsx +++ b/renderers/react/src/core/A2UIViewer.tsx @@ -90,9 +90,7 @@ export function A2UIViewer({ const definitionKey = `${root}-${JSON.stringify(components)}`; let hash = 0; for (let i = 0; i < definitionKey.length; i++) { - const char = definitionKey.charCodeAt(i); - hash = (hash << 5) - hash + char; - hash = hash & hash; + hash = 31 * hash + definitionKey.charCodeAt(i); } return `surface${baseId.replace(/:/g, '-')}${hash}`; }, [baseId, root, components]);