@idealyst/mcp-server 1.2.115 → 1.2.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/definitions.ts","../src/data/component-metadata.ts","../src/data/cli-commands.ts","../src/data/translate-guides.ts","../src/data/storage-guides.ts","../src/data/audio-guides.ts","../src/data/camera-guides.ts","../src/data/files-guides.ts","../src/data/oauth-client-guides.ts","../src/data/animate-guides.ts","../src/data/datagrid-guides.ts","../src/data/datepicker-guides.ts","../src/data/lottie-guides.ts","../src/data/markdown-guides.ts","../src/data/config-guides.ts","../src/data/charts-guides.ts","../src/data/clipboard-guides.ts","../src/data/biometrics-guides.ts","../src/data/payments-guides.ts","../src/data/packages.ts","../src/data/recipes/auth.ts","../src/data/recipes/settings.ts","../src/data/recipes/navigation.ts","../src/data/recipes/data.ts","../src/data/recipes/layout.ts","../src/data/recipes/forms.ts","../src/data/recipes/media.ts","../src/data/recipes/index.ts","../src/data/install-guides.ts","../src/data/intro.ts","../src/data/icons.json","../src/tools/get-types.ts","../src/tools/handlers.ts"],"sourcesContent":["/**\n * Tool Definitions\n *\n * MCP tool schema definitions for all Idealyst tools.\n * These can be used to register tools with an MCP server or other systems.\n */\n\nimport type { ToolDefinition } from \"./types.js\";\n\n// ============================================================================\n// Component Tool Definitions\n// ============================================================================\n\nexport const listComponentsDefinition: ToolDefinition = {\n name: \"list_components\",\n description: \"List all available Idealyst components with brief descriptions\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\nexport const getComponentDocsDefinition: ToolDefinition = {\n name: \"get_component_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst component including props, usage, and examples\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input')\",\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExampleDefinition: ToolDefinition = {\n name: \"get_component_example\",\n description: \"Get a code example for a specific Idealyst component\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component\",\n },\n example_type: {\n type: \"string\",\n description:\n \"Type of example: 'basic', 'variants', 'with-icons', 'interactive'\",\n enum: [\"basic\", \"variants\", \"with-icons\", \"interactive\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const searchComponentsDefinition: ToolDefinition = {\n name: \"search_components\",\n description: \"Search for components by name, category, or feature\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n category: {\n type: \"string\",\n description:\n \"Filter by category: 'layout', 'form', 'display', 'navigation', 'overlay', 'data'\",\n enum: [\"layout\", \"form\", \"display\", \"navigation\", \"overlay\", \"data\"],\n },\n },\n },\n};\n\nexport const getComponentTypesDefinition: ToolDefinition = {\n name: \"get_component_types\",\n description:\n \"Get TypeScript type definitions for a specific component directly from the source. Returns the actual TypeScript interface and/or JSON schema.\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description:\n \"The name of the component (e.g., 'Button', 'Card', 'Input')\",\n },\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript' for raw TypeScript definitions, 'json' for parsed schema, 'both' for combined output (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n required: [\"component\"],\n },\n};\n\nexport const getComponentExamplesTsDefinition: ToolDefinition = {\n name: \"get_component_examples_ts\",\n description:\n \"Get validated TypeScript example code for a component. These examples are type-checked and guaranteed to compile.\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n description: \"The name of the component (e.g., 'Button', 'Card')\",\n },\n },\n required: [\"component\"],\n },\n};\n\n// ============================================================================\n// CLI Tool Definitions\n// ============================================================================\n\nexport const getCliUsageDefinition: ToolDefinition = {\n name: \"get_cli_usage\",\n description: \"Get information about Idealyst CLI commands and usage\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"Specific CLI command to get info about (optional)\",\n },\n },\n },\n};\n\n// ============================================================================\n// Icon Tool Definitions\n// ============================================================================\n\nexport const searchIconsDefinition: ToolDefinition = {\n name: \"search_icons\",\n description:\n \"Search for Material Design Icons by name or keyword. Returns matching icon names from 7,447 available icons.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"Search term to find icons (e.g., 'home', 'user', 'arrow')\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of results to return (default: 20)\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Theme Tool Definitions\n// ============================================================================\n\nexport const getThemeTypesDefinition: ToolDefinition = {\n name: \"get_theme_types\",\n description:\n \"Get TypeScript type definitions for theme types (Size, Intent, Color, etc.) directly from @idealyst/theme\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Navigation Tool Definitions\n// ============================================================================\n\nexport const getNavigationTypesDefinition: ToolDefinition = {\n name: \"get_navigation_types\",\n description:\n \"Get TypeScript type definitions for navigation types directly from @idealyst/navigation\",\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n description:\n \"Output format: 'typescript', 'json', or 'both' (default: 'both')\",\n enum: [\"typescript\", \"json\", \"both\"],\n },\n },\n },\n};\n\n// ============================================================================\n// Guide Tool Definitions\n// ============================================================================\n\nexport const getTranslateGuideDefinition: ToolDefinition = {\n name: \"get_translate_guide\",\n description:\n \"Get documentation for @idealyst/translate internationalization package. Covers runtime API, Babel plugin, translation files, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api' (or 'runtime-api'), 'babel-plugin', 'translation-files', 'examples'\",\n enum: [\n \"overview\",\n \"api\",\n \"runtime-api\",\n \"babel-plugin\",\n \"translation-files\",\n \"examples\",\n ],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getStorageGuideDefinition: ToolDefinition = {\n name: \"get_storage_guide\",\n description:\n \"Get documentation for @idealyst/storage cross-platform storage package. Covers API reference and usage examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"Topic to get docs for: 'overview', 'api', 'examples', 'secure'\",\n enum: [\"overview\", \"api\", \"examples\", \"secure\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getAudioGuideDefinition: ToolDefinition = {\n name: \"get_audio_guide\",\n description:\n \"Get documentation for @idealyst/audio PCM audio streaming package. Covers recorder, player, PCM data types, and examples. IMPORTANT: This is a PCM streaming library, NOT file-based recording.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getCameraGuideDefinition: ToolDefinition = {\n name: \"get_camera_guide\",\n description:\n \"Get documentation for @idealyst/camera photo and video capture package. Covers CameraPreview component, useCamera hook, permissions, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getFilesGuideDefinition: ToolDefinition = {\n name: \"get_files_guide\",\n description:\n \"Get documentation for @idealyst/files file picking and upload package. Covers useFilePicker, useFileUpload, DropZone, FilePickerButton, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getOauthClientGuideDefinition: ToolDefinition = {\n name: \"get_oauth_client_guide\",\n description:\n \"Get documentation for @idealyst/oauth-client OAuth2 authentication package. Covers createOAuthClient, configuration, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getAnimateGuideDefinition: ToolDefinition = {\n name: \"get_animate_guide\",\n description:\n \"Get documentation for @idealyst/animate cross-platform animation hooks. Covers useAnimatedStyle, useSequence, useKeyframes, usePresence, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getDatagridGuideDefinition: ToolDefinition = {\n name: \"get_datagrid_guide\",\n description:\n \"Get documentation for @idealyst/datagrid virtualized data grid package. Covers DataGrid component, Column configuration, sorting, selection, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getDatepickerGuideDefinition: ToolDefinition = {\n name: \"get_datepicker_guide\",\n description:\n \"Get documentation for @idealyst/datepicker date and time picker components. Covers DatePicker, TimePicker, DateInput, TimeInput, DateTimePicker, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getLottieGuideDefinition: ToolDefinition = {\n name: \"get_lottie_guide\",\n description:\n \"Get documentation for @idealyst/lottie Lottie animation component. Covers LottieProps, LottieRef imperative methods, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getMarkdownGuideDefinition: ToolDefinition = {\n name: \"get_markdown_guide\",\n description:\n \"Get documentation for @idealyst/markdown cross-platform Markdown renderer. Covers MarkdownProps, style overrides, link/image handling, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getConfigGuideDefinition: ToolDefinition = {\n name: \"get_config_guide\",\n description:\n \"Get documentation for @idealyst/config cross-platform environment variable management. Covers IConfig API, key naming, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getChartsGuideDefinition: ToolDefinition = {\n name: \"get_charts_guide\",\n description:\n \"Get documentation for @idealyst/charts animated charting library. Covers LineChart, BarChart, data types, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getClipboardGuideDefinition: ToolDefinition = {\n name: \"get_clipboard_guide\",\n description:\n \"Get documentation for @idealyst/clipboard cross-platform clipboard and OTP autofill package. Covers copy/paste API, useOTPAutoFill hook, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getBiometricsGuideDefinition: ToolDefinition = {\n name: \"get_biometrics_guide\",\n description:\n \"Get documentation for @idealyst/biometrics cross-platform biometric authentication and passkeys (WebAuthn/FIDO2) package. Covers local biometric auth, passkey registration/login, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\nexport const getPaymentsGuideDefinition: ToolDefinition = {\n name: \"get_payments_guide\",\n description:\n \"Get documentation for @idealyst/payments cross-platform payment provider package. Covers Apple Pay, Google Pay, Stripe Platform Pay, usePayments hook, and examples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description:\n \"Topic to get docs for: 'overview', 'api', 'examples'\",\n enum: [\"overview\", \"api\", \"examples\"],\n },\n },\n required: [\"topic\"],\n },\n};\n\n// ============================================================================\n// Package Tool Definitions\n// ============================================================================\n\nexport const listPackagesDefinition: ToolDefinition = {\n name: \"list_packages\",\n description:\n \"List all available Idealyst packages with descriptions, categories, and documentation status. Use this to discover what packages are available in the framework.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\"core\", \"ui\", \"media\", \"data\", \"auth\", \"utility\", \"tooling\"],\n },\n },\n },\n};\n\nexport const getPackageDocsDefinition: ToolDefinition = {\n name: \"get_package_docs\",\n description:\n \"Get detailed documentation for a specific Idealyst package including installation, features, quick start, and API highlights.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'oauth-client', 'datagrid')\",\n },\n section: {\n type: \"string\",\n description:\n \"Specific section to retrieve (optional, returns all if not specified)\",\n enum: [\"overview\", \"installation\", \"features\", \"quickstart\", \"api\"],\n },\n },\n required: [\"package\"],\n },\n};\n\nexport const searchPackagesDefinition: ToolDefinition = {\n name: \"search_packages\",\n description:\n \"Search across all Idealyst packages by name, description, or features.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Recipe Tool Definitions\n// ============================================================================\n\nexport const listRecipesDefinition: ToolDefinition = {\n name: \"list_recipes\",\n description:\n \"List all available Idealyst recipes (common UI patterns) with descriptions. Recipes provide ready-to-use code examples for building apps.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n description: \"Filter by category (optional)\",\n enum: [\n \"forms\",\n \"navigation\",\n \"data\",\n \"layout\",\n \"auth\",\n \"settings\",\n \"media\",\n ],\n },\n difficulty: {\n type: \"string\",\n description: \"Filter by difficulty (optional)\",\n enum: [\"beginner\", \"intermediate\", \"advanced\"],\n },\n },\n },\n};\n\nexport const getRecipeDefinition: ToolDefinition = {\n name: \"get_recipe\",\n description:\n \"Get a complete code recipe for a common UI pattern. Returns ready-to-use code with explanation and tips.\",\n inputSchema: {\n type: \"object\",\n properties: {\n recipe: {\n type: \"string\",\n description:\n \"Recipe ID (e.g., 'login-form', 'settings-screen', 'tab-navigation')\",\n },\n },\n required: [\"recipe\"],\n },\n};\n\nexport const searchRecipesDefinition: ToolDefinition = {\n name: \"search_recipes\",\n description:\n \"Search for recipes by name, description, category, or required packages.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (e.g., 'auth', 'form', 'navigation')\",\n },\n },\n required: [\"query\"],\n },\n};\n\n// ============================================================================\n// Install Guide Tool Definitions\n// ============================================================================\n\nexport const getInstallGuideDefinition: ToolDefinition = {\n name: \"get_install_guide\",\n description:\n \"Get detailed installation instructions for an Idealyst package, including iOS (Info.plist, CocoaPods), Android (AndroidManifest.xml, permissions, Gradle), and web configuration. Essential for packages with native dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n package: {\n type: \"string\",\n description:\n \"Package name (e.g., 'camera', 'audio', 'oauth-client', 'storage')\",\n },\n },\n required: [\"package\"],\n },\n};\n\n// ============================================================================\n// Intro Tool Definitions\n// ============================================================================\n\nexport const getIntroDefinition: ToolDefinition = {\n name: \"get_intro\",\n description:\n \"Get a comprehensive introduction to the Idealyst framework. Returns an overview of the component paradigm, correct prop conventions, available packages, and common mistakes to avoid. **Call this first** before writing any Idealyst code.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n};\n\n// ============================================================================\n// All Tool Definitions Array\n// ============================================================================\n\n/**\n * Array of all tool definitions.\n * Use this to register all tools with an MCP server.\n */\nexport const toolDefinitions: ToolDefinition[] = [\n // Component tools\n listComponentsDefinition,\n getComponentDocsDefinition,\n getComponentExampleDefinition,\n searchComponentsDefinition,\n getComponentTypesDefinition,\n getComponentExamplesTsDefinition,\n // CLI tools\n getCliUsageDefinition,\n // Icon tools\n searchIconsDefinition,\n // Theme tools\n getThemeTypesDefinition,\n // Navigation tools\n getNavigationTypesDefinition,\n // Guide tools\n getTranslateGuideDefinition,\n getStorageGuideDefinition,\n getAudioGuideDefinition,\n getCameraGuideDefinition,\n getFilesGuideDefinition,\n getOauthClientGuideDefinition,\n getAnimateGuideDefinition,\n getDatagridGuideDefinition,\n getDatepickerGuideDefinition,\n getLottieGuideDefinition,\n getMarkdownGuideDefinition,\n getConfigGuideDefinition,\n getChartsGuideDefinition,\n getClipboardGuideDefinition,\n getBiometricsGuideDefinition,\n getPaymentsGuideDefinition,\n // Package tools\n listPackagesDefinition,\n getPackageDocsDefinition,\n searchPackagesDefinition,\n // Recipe tools\n listRecipesDefinition,\n getRecipeDefinition,\n searchRecipesDefinition,\n // Install guide tools\n getInstallGuideDefinition,\n // Intro tool\n getIntroDefinition,\n];\n\n/**\n * Map of tool definitions by name.\n * Use this for quick lookup of a specific tool definition.\n */\nexport const toolDefinitionMap: Record<string, ToolDefinition> =\n Object.fromEntries(toolDefinitions.map((tool) => [tool.name, tool]));\n","/**\n * Component Metadata\n *\n * Minimal metadata for components that cannot be derived from TypeScript types\n * or example files. Types come from @idealyst/tooling, examples come from\n * the examples/components/*.examples.tsx files.\n */\n\nexport interface ComponentMetadata {\n /** Category for filtering/search */\n category: 'form' | 'feedback' | 'layout' | 'display' | 'navigation' | 'overlay' | 'data';\n /** Brief description of the component */\n description: string;\n /** Key features of the component */\n features: string[];\n /** Best practices for using the component */\n bestPractices: string[];\n}\n\nexport const componentMetadata: Record<string, ComponentMetadata> = {\n Accordion: {\n category: 'display',\n description: 'Expandable content sections that show/hide content on user interaction. Takes an `items` array of `AccordionItem` objects: `{ id: string; title: string; content: React.ReactNode; disabled?: boolean }`.',\n features: [\n 'Single or multiple expanded sections',\n 'Customizable icons',\n 'Disabled state support',\n 'Controlled and uncontrolled modes',\n 'items prop: AccordionItem[] — each item has { id: string, title: string, content: ReactNode, disabled?: boolean }',\n ],\n bestPractices: [\n 'Use for organizing related content into collapsible sections',\n 'Keep section titles concise and descriptive',\n 'Consider single-expand mode for sequential content',\n 'AccordionItem interface: { id: string; title: string; content: React.ReactNode; disabled?: boolean }',\n ],\n },\n\n ActivityIndicator: {\n category: 'feedback',\n description: 'Loading spinner (also known as loader or activity indicator) to indicate ongoing operations',\n features: [\n 'Multiple sizes',\n 'Intent colors',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use for short loading operations',\n 'For longer operations, consider Progress with determinate value',\n 'Place near the content being loaded',\n ],\n },\n\n Alert: {\n category: 'feedback',\n description: 'Message banner for displaying important information, warnings, errors, and success messages',\n features: [\n 'Five intent types with semantic meaning',\n 'Three visual variants (filled, outlined, soft)',\n 'Default icons for each intent',\n 'Custom icon support',\n 'Dismissible with close button',\n 'Action buttons support',\n ],\n bestPractices: [\n \"Use 'danger' intent for critical errors requiring immediate attention\",\n \"Use 'warning' intent for important but non-critical information\",\n \"Use 'success' intent for positive confirmations\",\n \"Use 'info' intent for general informational messages\",\n 'Keep alert messages concise and actionable',\n ],\n },\n\n Avatar: {\n category: 'display',\n description: 'User or entity representation with image, initials, or icon fallback',\n features: [\n 'Image, initials, or icon display',\n 'Multiple sizes (xs, sm, md, lg, xl)',\n 'Circle or square shapes',\n 'Automatic fallback to initials',\n 'Custom background colors',\n ],\n bestPractices: [\n 'Provide fallback initials for missing images',\n 'Use consistent sizes within lists',\n 'Consider accessibility with alt text',\n ],\n },\n\n Badge: {\n category: 'display',\n description: 'Small status indicator or count display',\n features: [\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Filled, outlined, and soft variants',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for status indicators or counts',\n 'Keep badge content minimal (numbers or short text)',\n 'Use semantic intent colors for meaning',\n ],\n },\n\n Breadcrumb: {\n category: 'navigation',\n description: 'Navigation trail showing the current page location within a hierarchy',\n features: [\n 'Customizable separators',\n 'Link and text items',\n 'Responsive truncation',\n ],\n bestPractices: [\n 'Use for deep navigation hierarchies',\n 'Keep breadcrumb labels short',\n 'Make all items except the last clickable',\n ],\n },\n\n Button: {\n category: 'form',\n description: 'Interactive button component with multiple variants, sizes, and icon support',\n features: [\n 'Three type variants: contained, outlined, text',\n 'Five intent colors: primary, neutral, success, danger, warning',\n 'Five sizes: xs, sm, md, lg, xl',\n 'Loading state with spinner',\n 'Gradient overlay effects',\n 'Left and right icon support',\n 'Disabled states',\n 'Cross-platform',\n ],\n bestPractices: [\n \"Use 'primary' intent for main actions\",\n \"Use 'contained' type for prominent actions\",\n 'Keep button labels concise and action-oriented',\n 'Use loading state for async operations',\n ],\n },\n\n Card: {\n category: 'layout',\n description: 'Container component for grouping related content with optional elevation and borders. Card does NOT have sub-components — there is no Card.Content, Card.Header, Card.Body, or Card.Footer. Just use children directly: <Card padding=\"md\"><Text>...</Text></Card>.',\n features: [\n 'Multiple type variants (outlined, elevated, filled)',\n 'Pressable when onPress is provided',\n 'Customizable border radius',\n 'Intent colors',\n 'NO compound sub-components — use children directly, NOT Card.Content/Card.Header',\n ],\n bestPractices: [\n 'Use for grouping related content',\n 'Keep card content focused on a single topic',\n \"Use 'elevated' type sparingly for emphasis\",\n 'Simply add onPress to make a card interactive',\n 'Do NOT use Card.Content, Card.Header, Card.Body, Card.Footer — they do not exist. Use <Card padding=\"md\"><View>...</View></Card> instead',\n ],\n },\n\n Checkbox: {\n category: 'form',\n description: 'Toggle control for binary choices with optional label',\n features: [\n 'Checked, unchecked, and indeterminate states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Error state with helper text',\n 'Custom children support',\n ],\n bestPractices: [\n 'Use for independent binary choices',\n 'Use RadioButton for mutually exclusive options',\n 'Provide clear, descriptive labels',\n ],\n },\n\n Chip: {\n category: 'display',\n description: 'Compact element for tags, filters, or selections',\n features: [\n 'Filled, outlined, and soft variants',\n 'Intent colors',\n 'Multiple sizes',\n 'Deletable with close icon',\n 'Selectable mode',\n 'Icon support',\n ],\n bestPractices: [\n 'Use for tags, filters, or compact selections',\n 'Keep chip labels concise',\n 'Use consistent styling within groups',\n ],\n },\n\n Dialog: {\n category: 'overlay',\n description: 'Modal overlay for important content requiring user attention or interaction',\n features: [\n 'Multiple sizes (sm, md, lg, fullscreen)',\n 'Standard, alert, and confirmation types',\n 'Title and close button',\n 'Backdrop click to close',\n 'Animation types (slide, fade)',\n ],\n bestPractices: [\n 'Use sparingly for important interactions',\n 'Provide clear actions for dismissal',\n 'Keep dialog content focused',\n 'Use confirmation dialogs for destructive actions',\n ],\n },\n\n Divider: {\n category: 'layout',\n description: 'Visual separator for content sections',\n features: [\n 'Horizontal and vertical orientations',\n 'Solid, dashed, and dotted types',\n 'Multiple sizes (thickness)',\n 'Intent colors',\n 'Text/content dividers',\n 'Configurable spacing',\n ],\n bestPractices: [\n 'Use to separate distinct content sections',\n 'Avoid overuse - whitespace is often sufficient',\n 'Use text dividers for labeled sections',\n ],\n },\n\n Grid: {\n category: 'layout',\n description: 'Cross-platform responsive grid layout for arranging items in columns',\n features: [\n 'Responsive column count based on breakpoints',\n 'Theme-aware gap spacing',\n 'CSS Grid on web for optimal performance',\n 'Flexbox wrapping on native with percentage-based widths',\n 'Inherits container style props (padding, margin)',\n ],\n bestPractices: [\n 'Use responsive columns for adaptive layouts: { xs: 1, sm: 2, lg: 4 }',\n 'Prefer theme gap sizes over custom spacing for consistency',\n 'Each direct child becomes a grid cell - wrap complex content in View if needed',\n 'Use alongside Card or View children for content containers',\n ],\n },\n\n Icon: {\n category: 'display',\n description: 'Material Design icon component with extensive icon library',\n features: [\n '7,447+ Material Design icons',\n 'Multiple sizes',\n 'Intent and custom colors',\n 'Accessibility support',\n ],\n bestPractices: [\n 'Use meaningful icons that match their purpose',\n 'Pair icons with text for clarity when needed',\n 'Maintain consistent icon sizing',\n ],\n },\n\n Image: {\n category: 'display',\n description: 'Cross-platform image component with loading and error states',\n features: [\n 'Multiple resize modes',\n 'Loading placeholder',\n 'Error fallback',\n 'Lazy loading',\n 'Border radius support',\n ],\n bestPractices: [\n 'Provide appropriate alt text',\n 'Use correct resize mode for layout',\n 'Consider placeholder for slow-loading images',\n ],\n },\n\n Link: {\n category: 'navigation',\n description: 'Navigation link component for routing and external URLs',\n features: [\n 'Internal and external link support',\n 'Intent colors',\n 'Underline variants',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for navigation, not actions (use Button for actions)',\n 'Make link text descriptive',\n 'Indicate external links when appropriate',\n ],\n },\n\n List: {\n category: 'data',\n description: 'Optimized list component for displaying scrollable data',\n features: [\n 'Virtualized rendering for performance',\n 'Pull-to-refresh',\n 'Infinite scroll',\n 'Section headers',\n 'Empty state support',\n ],\n bestPractices: [\n 'Use for displaying collections of similar items',\n 'Implement pull-to-refresh for refreshable content',\n 'Provide empty state feedback',\n ],\n },\n\n Menu: {\n category: 'overlay',\n description: 'Dropdown menu for displaying a list of actions or options',\n features: [\n 'Trigger-based display',\n 'Multiple placements',\n 'Icon and description support',\n 'Dividers between groups',\n 'Keyboard navigation',\n ],\n bestPractices: [\n 'Group related actions together',\n 'Use icons for quick recognition',\n 'Keep menu items to a reasonable number',\n ],\n },\n\n Popover: {\n category: 'overlay',\n description: 'Floating content container anchored to a trigger element',\n features: [\n 'Multiple placements',\n 'Customizable content',\n 'Controlled and uncontrolled modes',\n 'Click outside to close',\n ],\n bestPractices: [\n 'Use for supplementary content or controls',\n 'Keep popover content focused',\n 'Consider mobile touch interactions',\n ],\n },\n\n Pressable: {\n category: 'form',\n description: 'Low-level touchable component for custom interactive elements',\n features: [\n 'Press feedback',\n 'Long press support',\n 'Disabled state',\n 'Custom hit slop',\n ],\n bestPractices: [\n 'Use Button for standard button interactions',\n 'Use Pressable for custom interactive areas',\n 'Provide visual feedback on press',\n ],\n },\n\n Progress: {\n category: 'feedback',\n description: 'Visual indicator for task completion or loading progress',\n features: [\n 'Linear and circular variants',\n 'Determinate and indeterminate modes',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Rounded option',\n ],\n bestPractices: [\n 'Use determinate progress when percentage is known',\n 'Use indeterminate for unknown duration',\n 'Show percentage for long operations',\n ],\n },\n\n RadioButton: {\n category: 'form',\n description: 'Selection control for mutually exclusive options',\n features: [\n 'Single selection in a group',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Disabled state',\n ],\n bestPractices: [\n 'Use for mutually exclusive options',\n 'Group related options together',\n 'Provide a default selection when appropriate',\n ],\n },\n\n Screen: {\n category: 'layout',\n description: 'Full-screen container component for app screens',\n features: [\n 'Safe area handling',\n 'Keyboard avoiding behavior',\n 'Status bar configuration',\n 'Background color support',\n ],\n bestPractices: [\n 'Use as the root container for screens',\n 'Enable keyboard avoiding for form screens',\n 'Configure safe areas appropriately',\n ],\n },\n\n Select: {\n category: 'form',\n description: 'Dropdown selection component for choosing from a list of options',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Searchable (web)',\n 'Label and helper text',\n 'Error state',\n 'Disabled options',\n ],\n bestPractices: [\n 'Use for selecting from many options',\n 'Use RadioButton for 2-5 visible options',\n 'Provide a clear placeholder',\n ],\n },\n\n Skeleton: {\n category: 'feedback',\n description: 'Placeholder loading state for content. Uses `shape` prop (NOT `variant`).',\n features: [\n 'shape prop: \\'rectangle\\' | \\'circle\\' | \\'rounded\\' (NOT variant)',\n 'animation prop: \\'pulse\\' | \\'wave\\' | \\'none\\'',\n 'Customizable width/height dimensions',\n 'Built-in pulse and shimmer animations (no manual Animated API needed)',\n ],\n bestPractices: [\n 'Match skeleton dimensions to actual content for seamless transition',\n 'Use shape=\\'circle\\' for avatar placeholders, \\'rounded\\' for cards',\n 'Use animation=\\'wave\\' for shimmer effect, \\'pulse\\' for fade',\n 'Import Skeleton from @idealyst/components (do NOT build custom with react-native Animated)',\n ],\n },\n\n Slider: {\n category: 'form',\n description: 'Range input control for selecting numeric values',\n features: [\n 'Min/max/step configuration',\n 'Value display',\n 'Min/max labels',\n 'Custom marks',\n 'Intent colors',\n 'Multiple sizes',\n ],\n bestPractices: [\n 'Use for selecting from a continuous range',\n 'Show current value for precision',\n 'Use marks for discrete steps',\n ],\n },\n\n SVGImage: {\n category: 'display',\n description: 'SVG image component for vector graphics',\n features: [\n 'URL and inline SVG support',\n 'Color tinting',\n 'Responsive sizing',\n ],\n bestPractices: [\n 'Use for scalable graphics',\n 'Provide fallback for missing SVGs',\n 'Consider Icon for simple icons',\n ],\n },\n\n Switch: {\n category: 'form',\n description: 'Toggle control for binary on/off states',\n features: [\n 'On/off states',\n 'Multiple sizes',\n 'Intent colors',\n 'Label support',\n 'Custom on/off icons',\n ],\n bestPractices: [\n 'Use for immediate effect toggles',\n 'Use Checkbox when submission is required',\n 'Provide clear labels indicating the on state',\n ],\n },\n\n TabBar: {\n category: 'navigation',\n description: 'Bottom navigation bar for main app sections',\n features: [\n 'Icon and label tabs',\n 'Badge indicators',\n 'Custom styling',\n ],\n bestPractices: [\n 'Limit to 3-5 main destinations',\n 'Use clear, recognizable icons',\n 'Show badges for notifications',\n ],\n },\n\n Table: {\n category: 'data',\n description: 'Structured data display in rows and columns',\n features: [\n 'Sortable columns',\n 'Custom cell rendering',\n 'Header and footer',\n 'Striped rows',\n ],\n bestPractices: [\n 'Use for structured, comparable data',\n 'Align numbers to the right',\n 'Provide sorting for large datasets',\n ],\n },\n\n Tabs: {\n category: 'navigation',\n description: 'Horizontal tab navigation for switching between content panels',\n features: [\n 'Controlled and uncontrolled modes',\n 'Icon and label tabs',\n 'Scrollable for many tabs',\n 'Badge support',\n ],\n bestPractices: [\n 'Use for content at the same hierarchy level',\n 'Keep tab labels short',\n 'Limit visible tabs to avoid scrolling',\n ],\n },\n\n Text: {\n category: 'display',\n description: 'Typography component for displaying text with consistent styling',\n features: [\n 'Typography presets: h1-h6, subtitle1-2, body1-2, button, caption, overline',\n 'Font weight control: light, normal, medium, semibold, bold',\n 'Theme text colors: primary, secondary, tertiary, inverse',\n 'Text alignment: left, center, right',\n 'Cross-platform text rendering',\n ],\n bestPractices: [\n 'Use the `typography` prop for text sizing (NOT `variant` or `size`)',\n 'Valid typography values: h1, h2, h3, h4, h5, h6, subtitle1, subtitle2, body1, body2, button, caption, overline',\n 'Use the `weight` prop for font weight (light, normal, medium, semibold, bold)',\n 'Use the `color` prop for theme text colors (primary, secondary, tertiary, inverse)',\n 'For custom colors beyond theme text colors, use the `style` prop: style={{ color: \"#hex\" }}',\n 'Text does NOT have `variant`, `intent`, or `size` props — use `typography`, `weight`, `color`, and `style` instead',\n ],\n },\n\n TextArea: {\n category: 'form',\n description: 'Multi-line text input for longer content',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Character count',\n 'Auto-resize',\n 'Error state',\n ],\n bestPractices: [\n 'Use for multi-line input',\n 'Show character limits when applicable',\n 'Provide appropriate placeholder text',\n ],\n },\n\n TextInput: {\n category: 'form',\n description: 'Single-line text input field with various configurations',\n features: [\n 'Outlined and filled variants',\n 'Multiple sizes',\n 'Left and right icons',\n 'Password visibility toggle',\n \"Input modes: 'text' | 'email' | 'password' | 'number' (these 4 ONLY, NOT 'decimal' or 'tel')\",\n 'Error state with helper text',\n ],\n bestPractices: [\n 'Use appropriate input mode for content type',\n 'Provide clear labels and placeholders',\n 'Show validation errors inline',\n ],\n },\n\n Tooltip: {\n category: 'overlay',\n description: 'Contextual information popup on hover or focus',\n features: [\n 'Multiple placements',\n 'Customizable delay',\n 'Arrow indicator',\n 'Custom content support',\n ],\n bestPractices: [\n 'Use for supplementary information',\n 'Keep tooltip content brief',\n 'Ensure touch-friendly alternatives for mobile',\n ],\n },\n\n Video: {\n category: 'display',\n description: 'Video player component with playback controls',\n features: [\n 'Multiple source support',\n 'Playback controls',\n 'Poster image',\n 'Loop and autoplay',\n ],\n bestPractices: [\n 'Provide poster images for preview',\n 'Consider autoplay carefully (user experience)',\n 'Support multiple formats for compatibility',\n ],\n },\n\n View: {\n category: 'layout',\n description: 'Fundamental layout container with spacing and flex support',\n features: [\n 'Spacing presets',\n 'Flex layout shortcuts',\n 'Cross-platform',\n ],\n bestPractices: [\n 'Use spacing prop for consistent gaps',\n 'Prefer View over native div/View for consistency',\n 'Use for layout structure, not styling',\n ],\n },\n};\n\n/**\n * Aliases for deprecated or commonly confused component names.\n * Maps lowercase alias → canonical component name.\n */\nconst componentAliases: Record<string, string> = {\n input: \"TextInput\",\n spinner: \"ActivityIndicator\",\n loader: \"ActivityIndicator\",\n loading: \"ActivityIndicator\",\n toggle: \"Switch\",\n dropdown: \"Select\",\n touchable: \"Pressable\",\n touchableopacity: \"Pressable\",\n fab: \"IconButton\",\n modal: \"Dialog\",\n tooltip: \"Tooltip\",\n snackbar: \"Toast\",\n};\n\n/**\n * Find the canonical component name (case-insensitive lookup with alias support)\n */\nexport function findComponentName(componentName: string): string | undefined {\n // Direct match first (fast path)\n if (componentMetadata[componentName]) {\n return componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n const directMatch = Object.keys(componentMetadata).find(\n (name) => name.toLowerCase() === lowerName\n );\n if (directMatch) return directMatch;\n\n // Alias lookup (e.g. \"Input\" → \"TextInput\")\n return componentAliases[lowerName];\n}\n\n/**\n * Get metadata for a specific component (case-insensitive)\n */\nexport function getComponentMetadata(componentName: string): ComponentMetadata | undefined {\n const canonicalName = findComponentName(componentName);\n return canonicalName ? componentMetadata[canonicalName] : undefined;\n}\n\n/**\n * Get all component names\n */\nexport function getComponentNames(): string[] {\n return Object.keys(componentMetadata);\n}\n\n/**\n * Search components by name, description, or features\n */\nexport function searchComponents(query: string, category?: string): string[] {\n const lowerQuery = query.toLowerCase();\n const queryWords = lowerQuery.split(/\\s+/).filter(Boolean);\n\n // Check aliases first — if the query is a known alias, include that component\n const aliasMatch = componentAliases[lowerQuery];\n\n return Object.entries(componentMetadata)\n .filter(([name, meta]) => {\n if (category && meta.category !== category) {\n return false;\n }\n\n // Direct alias match\n if (aliasMatch && name === aliasMatch) return true;\n\n const searchText = `${name} ${meta.description} ${meta.features.join(' ')}`.toLowerCase();\n\n // Exact substring match\n if (searchText.includes(lowerQuery)) return true;\n\n // All words match (supports multi-word queries like \"spinner loading\")\n if (queryWords.length > 1 && queryWords.every(w => searchText.includes(w))) return true;\n\n return false;\n })\n .map(([name]) => name);\n}\n\n/**\n * Get components by category\n */\nexport function getComponentsByCategory(category: string): string[] {\n return Object.entries(componentMetadata)\n .filter(([_, meta]) => meta.category === category)\n .map(([name]) => name);\n}\n","export const cliCommands: Record<string, any> = {\n init: {\n description: \"Initialize a new Idealyst workspace with monorepo structure\",\n usage: \"idealyst init <workspace-name> [options]\",\n options: [\n {\n flag: \"workspace-name\",\n description: \"Name for the new workspace (required)\",\n },\n {\n flag: \"--git\",\n description: \"Initialize git repository (default: true)\",\n },\n {\n flag: \"--install\",\n description: \"Install dependencies after creation (default: true)\",\n },\n ],\n examples: [\n \"idealyst init my-app\",\n \"idealyst init my-company-workspace --no-git\",\n ],\n },\n\n create: {\n description: \"Create a new package within the Idealyst workspace\",\n usage: \"idealyst create <name> --type <type> [options]\",\n options: [\n {\n flag: \"name\",\n description: \"Name for the new package (required)\",\n },\n {\n flag: \"--type\",\n description: \"Package type: web | native | api | database | shared (required)\",\n },\n {\n flag: \"--app-name\",\n description: \"Display name for native app (required for native type)\",\n },\n {\n flag: \"--with-trpc\",\n description: \"Include tRPC setup (for web/native)\",\n },\n {\n flag: \"--no-trpc\",\n description: \"Exclude tRPC setup (for web/native)\",\n },\n ],\n examples: [\n \"idealyst create web --type web --with-trpc\",\n \"idealyst create mobile --type native --app-name \\\"My App\\\" --with-trpc\",\n \"idealyst create api --type api\",\n \"idealyst create database --type database\",\n \"idealyst create shared --type shared\",\n ],\n },\n\n dev: {\n description: \"Start development server for a package\",\n usage: \"cd packages/<name> && yarn dev\",\n options: [\n {\n flag: \"--port\",\n description: \"Port number for dev server (web only)\",\n },\n ],\n examples: [\n \"cd packages/web && yarn dev\",\n \"cd packages/native && yarn dev\",\n ],\n },\n\n build: {\n description: \"Build a package for production\",\n usage: \"cd packages/<name> && yarn build\",\n options: [],\n examples: [\n \"cd packages/web && yarn build\",\n \"cd packages/api && yarn build\",\n ],\n },\n\n test: {\n description: \"Run tests for packages\",\n usage: \"yarn test [options]\",\n options: [\n {\n flag: \"--watch\",\n description: \"Run tests in watch mode\",\n },\n {\n flag: \"--coverage\",\n description: \"Generate coverage report\",\n },\n ],\n examples: [\n \"yarn test\",\n \"yarn test:watch\",\n \"yarn test:coverage\",\n ],\n },\n};\n","export const translateGuides: Record<string, string> = {\n \"idealyst://translate/overview\": `# @idealyst/translate Overview\n\nCross-platform internationalization for the Idealyst Framework. Wraps \\`react-i18next\\` with a unified API and includes a Babel plugin for static translation key analysis.\n\n## Core Features\n\n- **Unified API** - Single API for React and React Native\n- **Babel Plugin** - Static extraction of translation keys at build time\n- **Missing Translation Detection** - Automatically detect keys missing translations\n- **Unused Translation Detection** - Find translations not used in code\n- **JSON Report** - Generate detailed reports for CI/CD integration\n- **Namespace Support** - Organize translations with nested namespaces\n- **Pluralization** - Full i18next pluralization support\n- **Interpolation** - Variable interpolation in translations\n- **Rich Text** - Component interpolation with the Trans component\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/translate react-i18next i18next\n\\`\\`\\`\n\n## Quick Start\n\n### 1. Create Translation Files\n\n\\`\\`\\`\nlocales/\n├── en/\n│ └── common.json\n└── es/\n └── common.json\n\\`\\`\\`\n\n**locales/en/common.json**\n\\`\\`\\`json\n{\n \"welcome\": {\n \"title\": \"Welcome to Our App\",\n \"greeting\": \"Hello, {{name}}!\"\n },\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\"\n }\n}\n\\`\\`\\`\n\n### 2. Set Up the Provider\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <MyApp />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n### 3. Use Translations\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction MyComponent() {\n const { t } = useTranslation('common');\n\n return (\n <div>\n <h1>{t('welcome.title')}</h1>\n <p>{t('welcome.greeting', { name: 'John' })}</p>\n <button>{t('buttons.submit')}</button>\n </div>\n );\n}\n\\`\\`\\`\n\n## Key Concepts\n\n### Key Formats\nThe package supports two key formats:\n\n\\`\\`\\`tsx\n// Namespace:key format (i18next standard)\nt('auth:login.title')\n\n// Namespace.key format (first segment is namespace)\nt('auth.login.title')\n\\`\\`\\`\n\n### Namespace Organization\nOrganize translations by domain:\n- \\`common.json\\` - Shared UI strings\n- \\`auth.json\\` - Authentication strings\n- \\`errors.json\\` - Error messages\n- \\`forms.json\\` - Form labels and validation\n`,\n\n \"idealyst://translate/runtime-api\": `# Runtime API Reference\n\nComplete reference for the @idealyst/translate runtime API.\n\n## TranslateProvider\n\nWrap your app with the provider to enable translations:\n\n\\`\\`\\`tsx\nimport { TranslateProvider } from '@idealyst/translate';\n\n<TranslateProvider\n config={{\n defaultLanguage: 'en',\n languages: ['en', 'es', 'fr'],\n resources: {\n en: { common: enCommon, auth: enAuth },\n es: { common: esCommon, auth: esAuth },\n },\n defaultNamespace: 'common',\n fallbackLanguage: 'en',\n debug: false,\n }}\n onInitialized={(i18n) => console.log('i18n ready')}\n onLanguageChanged={(lang) => console.log('Language:', lang)}\n>\n <App />\n</TranslateProvider>\n\\`\\`\\`\n\n### TranslateConfig Options\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| \\`defaultLanguage\\` | string | Yes | Default language code |\n| \\`languages\\` | string[] | Yes | Supported language codes |\n| \\`resources\\` | object | No | Pre-loaded translation resources |\n| \\`defaultNamespace\\` | string | No | Default namespace (default: 'translation') |\n| \\`fallbackLanguage\\` | string | No | Fallback when key missing |\n| \\`debug\\` | boolean | No | Enable debug logging |\n\n## useTranslation Hook\n\nThe main hook for accessing translations:\n\n\\`\\`\\`tsx\nimport { useTranslation } from '@idealyst/translate';\n\nfunction Component() {\n const { t, language, languages, ready, i18n } = useTranslation('common');\n\n // Simple translation\n const title = t('welcome.title');\n\n // With interpolation\n const greeting = t('welcome.greeting', { name: 'World' });\n\n // With default value\n const fallback = t('missing.key', { defaultValue: 'Fallback text' });\n\n // With pluralization\n const items = t('items', { count: 5 });\n\n // With context\n const gendered = t('liked', { context: 'male' });\n\n return <div>{title}</div>;\n}\n\\`\\`\\`\n\n### Return Values\n\n| Property | Type | Description |\n|----------|------|-------------|\n| \\`t\\` | function | Translation function |\n| \\`language\\` | string | Current language code |\n| \\`languages\\` | string[] | All available languages |\n| \\`ready\\` | boolean | Whether translations are loaded |\n| \\`i18n\\` | i18n | i18next instance for advanced usage |\n\n### Translation Options\n\n\\`\\`\\`tsx\nt('key', {\n // Default value if key not found\n defaultValue: 'Fallback',\n\n // Interpolation values\n name: 'John',\n count: 5,\n\n // Pluralization count\n count: 3,\n\n // Context for contextual translations\n context: 'male',\n});\n\\`\\`\\`\n\n## useLanguage Hook\n\nFor language management:\n\n\\`\\`\\`tsx\nimport { useLanguage } from '@idealyst/translate';\n\nfunction LanguageControls() {\n const {\n language, // Current: 'en'\n languages, // Available: ['en', 'es', 'fr']\n setLanguage, // Change language\n isSupported, // Check availability\n getDisplayName, // Get 'English', 'Español'\n } = useLanguage();\n\n return (\n <select value={language} onChange={(e) => setLanguage(e.target.value)}>\n {languages.map((lang) => (\n <option key={lang} value={lang}>\n {getDisplayName(lang)}\n </option>\n ))}\n </select>\n );\n}\n\\`\\`\\`\n\n## Trans Component\n\nFor rich text with embedded components:\n\n\\`\\`\\`tsx\nimport { Trans } from '@idealyst/translate';\n\nfunction RichText() {\n return (\n <Trans\n i18nKey=\"common.richText\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n bold: <strong />,\n }}\n values={{ name: 'User' }}\n />\n );\n}\n\n// Translation:\n// \"richText\": \"Read our <terms>Terms</terms> and <privacy>Privacy Policy</privacy>\"\n//\n// Renders:\n// Read our <a href=\"/terms\">Terms</a> and <a href=\"/privacy\">Privacy Policy</a>\n\\`\\`\\`\n\n### Trans Props\n\n| Prop | Type | Required | Description |\n|------|------|----------|-------------|\n| \\`i18nKey\\` | string | Yes | Translation key |\n| \\`ns\\` | string | No | Namespace |\n| \\`components\\` | object | No | Component interpolations |\n| \\`values\\` | object | No | Value interpolations |\n| \\`count\\` | number | No | Pluralization count |\n`,\n\n \"idealyst://translate/babel-plugin\": `# Babel Plugin Reference\n\nThe Babel plugin extracts translation keys at build time and generates reports of missing/unused translations.\n\n## Installation\n\nThe plugin is included with @idealyst/translate. Just configure it in your Babel config.\n\n## Configuration\n\n### babel.config.js\n\n\\`\\`\\`javascript\nmodule.exports = {\n presets: ['@babel/preset-react', '@babel/preset-typescript'],\n plugins: [\n ['@idealyst/translate/plugin', {\n // Required: paths to translation JSON files\n translationFiles: ['./locales/**/*.json'],\n\n // Optional: output path for the report\n reportPath: '.idealyst/translations-report.json',\n\n // Optional: default namespace\n defaultNamespace: 'common',\n\n // Optional: emit console warnings\n emitWarnings: true,\n\n // Optional: fail build on missing translations\n failOnMissing: false,\n\n // Optional: verbose logging\n verbose: false,\n }],\n ],\n};\n\\`\\`\\`\n\n### Vite Configuration\n\n\\`\\`\\`typescript\n// vite.config.ts\nimport { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\nexport default defineConfig({\n plugins: [\n react({\n babel: {\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n }],\n ],\n },\n }),\n ],\n});\n\\`\\`\\`\n\n### React Native Configuration\n\n\\`\\`\\`javascript\n// babel.config.js\nmodule.exports = {\n presets: ['module:@react-native/babel-preset'],\n plugins: [\n ['@idealyst/translate/plugin', {\n translationFiles: ['./locales/**/*.json'],\n reportPath: '.idealyst/translations-report.json',\n defaultNamespace: 'common',\n emitWarnings: true,\n }],\n ],\n};\n\\`\\`\\`\n\n## Plugin Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| \\`translationFiles\\` | string[] | Required | Glob patterns for translation files |\n| \\`reportPath\\` | string | '.idealyst/translations-report.json' | Output path for report |\n| \\`languages\\` | string[] | Auto-detected | Languages to check |\n| \\`defaultNamespace\\` | string | 'translation' | Default namespace |\n| \\`failOnMissing\\` | boolean | false | Fail build if missing |\n| \\`emitWarnings\\` | boolean | true | Console warnings |\n| \\`verbose\\` | boolean | false | Verbose logging |\n\n## What Gets Extracted\n\nThe plugin statically analyzes your code for:\n\n\\`\\`\\`tsx\n// t() function calls\nt('common.key')\nt('namespace:key')\nt('key', { defaultValue: 'Default' })\n\n// i18n.t() method calls\ni18n.t('common.key')\n\n// Trans component\n<Trans i18nKey=\"common.richText\" />\n<Trans i18nKey={\"common.richText\"} />\n\n// Dynamic keys (tracked but marked as dynamic)\nconst key = \\`common.\\${type}\\`;\nt(key); // Marked as isDynamic: true\n\\`\\`\\`\n\n## Report Structure\n\nThe plugin generates a JSON report:\n\n\\`\\`\\`json\n{\n \"timestamp\": \"2026-01-08T12:00:00.000Z\",\n \"totalKeys\": 45,\n \"dynamicKeys\": [\n {\n \"key\": \"<dynamic>\",\n \"file\": \"src/DynamicComponent.tsx\",\n \"line\": 15,\n \"isDynamic\": true\n }\n ],\n \"extractedKeys\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"localKey\": \"buttons.submit\",\n \"file\": \"src/Form.tsx\",\n \"line\": 42,\n \"column\": 12,\n \"defaultValue\": \"Submit\",\n \"isDynamic\": false\n }\n ],\n \"languages\": [\"en\", \"es\", \"fr\"],\n \"missing\": {\n \"en\": [],\n \"es\": [\n {\n \"key\": \"common.buttons.submit\",\n \"namespace\": \"common\",\n \"usedIn\": [\n { \"file\": \"src/Form.tsx\", \"line\": 42, \"column\": 12 }\n ],\n \"defaultValue\": \"Submit\"\n }\n ]\n },\n \"unused\": {\n \"en\": [\"common.legacy.oldFeature\"]\n },\n \"summary\": {\n \"totalMissing\": 1,\n \"totalUnused\": 1,\n \"coveragePercent\": {\n \"en\": 100,\n \"es\": 98,\n \"fr\": 100\n }\n }\n}\n\\`\\`\\`\n\n## CI/CD Integration\n\n### GitHub Actions\n\n\\`\\`\\`yaml\nname: Translation Check\n\non: [push, pull_request]\n\njobs:\n check-translations:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - uses: actions/setup-node@v3\n with:\n node-version: '20'\n - run: yarn install\n - run: yarn build\n - name: Check missing translations\n run: |\n MISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n if [ \"$MISSING\" -gt 0 ]; then\n echo \"Missing translations: $MISSING\"\n jq '.missing' .idealyst/translations-report.json\n exit 1\n fi\n\\`\\`\\`\n\n### Shell Script\n\n\\`\\`\\`bash\n#!/bin/bash\nyarn build\n\nMISSING=$(jq '.summary.totalMissing' .idealyst/translations-report.json)\n\nif [ \"$MISSING\" -gt 0 ]; then\n echo \"ERROR: $MISSING missing translation(s)\"\n jq -r '.missing | to_entries[] | select(.value | length > 0) | \"\\\\(.key): \\\\(.value | length) missing\"' \\\\\n .idealyst/translations-report.json\n exit 1\nfi\n\necho \"All translations present!\"\n\\`\\`\\`\n`,\n\n \"idealyst://translate/translation-files\": `# Translation File Format\n\nGuide to organizing and formatting translation files for @idealyst/translate.\n\n## Directory Structure\n\nOrganize translations by language and namespace:\n\n\\`\\`\\`\nlocales/\n├── en/\n│ ├── common.json # Common UI strings\n│ ├── auth.json # Authentication strings\n│ ├── errors.json # Error messages\n│ └── forms.json # Form labels\n├── es/\n│ ├── common.json\n│ ├── auth.json\n│ ├── errors.json\n│ └── forms.json\n└── fr/\n ├── common.json\n ├── auth.json\n ├── errors.json\n └── forms.json\n\\`\\`\\`\n\n## JSON Format\n\n### Basic Structure\n\n\\`\\`\\`json\n{\n \"simple\": \"Simple text\",\n\n \"nested\": {\n \"keys\": {\n \"work\": \"Like this\"\n }\n }\n}\n\\`\\`\\`\n\n### Interpolation\n\nUse \\`{{variable}}\\` for dynamic values:\n\n\\`\\`\\`json\n{\n \"greeting\": \"Hello, {{name}}!\",\n \"welcome\": \"Welcome back, {{user}}. You have {{count}} messages.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('greeting', { name: 'John' }) // \"Hello, John!\"\nt('welcome', { user: 'Alice', count: 5 }) // \"Welcome back, Alice. You have 5 messages.\"\n\\`\\`\\`\n\n### Pluralization\n\nAdd \\`_plural\\` suffix for plural forms:\n\n\\`\\`\\`json\n{\n \"item\": \"{{count}} item\",\n \"item_plural\": \"{{count}} items\",\n\n \"message\": \"You have {{count}} new message\",\n \"message_plural\": \"You have {{count}} new messages\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('item', { count: 1 }) // \"1 item\"\nt('item', { count: 5 }) // \"5 items\"\n\\`\\`\\`\n\n### Context\n\nAdd \\`_context\\` suffix for contextual variations:\n\n\\`\\`\\`json\n{\n \"friend\": \"A friend\",\n \"friend_male\": \"A boyfriend\",\n \"friend_female\": \"A girlfriend\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\nt('friend') // \"A friend\"\nt('friend', { context: 'male' }) // \"A boyfriend\"\nt('friend', { context: 'female' }) // \"A girlfriend\"\n\\`\\`\\`\n\n### Rich Text (Trans Component)\n\nUse HTML-like tags for component interpolation:\n\n\\`\\`\\`json\n{\n \"terms\": \"By signing up, you agree to our <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>.\",\n \"welcome\": \"Welcome, <bold>{{name}}</bold>! Click <link>here</link> to continue.\"\n}\n\\`\\`\\`\n\nUsage:\n\\`\\`\\`tsx\n<Trans\n i18nKey=\"common.terms\"\n components={{\n terms: <a href=\"/terms\" />,\n privacy: <a href=\"/privacy\" />,\n }}\n/>\n\\`\\`\\`\n\n## Namespace Organization\n\n### common.json - Shared UI\n\\`\\`\\`json\n{\n \"buttons\": {\n \"submit\": \"Submit\",\n \"cancel\": \"Cancel\",\n \"save\": \"Save\",\n \"delete\": \"Delete\",\n \"edit\": \"Edit\"\n },\n \"labels\": {\n \"loading\": \"Loading...\",\n \"danger\": \"An error occurred\",\n \"success\": \"Success!\"\n }\n}\n\\`\\`\\`\n\n### auth.json - Authentication\n\\`\\`\\`json\n{\n \"login\": {\n \"title\": \"Sign In\",\n \"email\": \"Email\",\n \"password\": \"Password\",\n \"submit\": \"Sign In\",\n \"forgotPassword\": \"Forgot password?\"\n },\n \"register\": {\n \"title\": \"Create Account\",\n \"submit\": \"Sign Up\"\n },\n \"errors\": {\n \"invalidCredentials\": \"Invalid email or password\",\n \"emailTaken\": \"Email is already registered\"\n }\n}\n\\`\\`\\`\n\n### errors.json - Error Messages\n\\`\\`\\`json\n{\n \"network\": {\n \"offline\": \"You are offline. Please check your connection.\",\n \"timeout\": \"Request timed out. Please try again.\"\n },\n \"validation\": {\n \"required\": \"This field is required\",\n \"email\": \"Please enter a valid email\",\n \"minLength\": \"Must be at least {{min}} characters\"\n },\n \"http\": {\n \"400\": \"Bad request\",\n \"401\": \"Unauthorized\",\n \"403\": \"Forbidden\",\n \"404\": \"Not found\",\n \"500\": \"Server error\"\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n### 1. Use Descriptive Keys\n\\`\\`\\`json\n// Good\n{\n \"userProfile\": {\n \"editButton\": \"Edit Profile\",\n \"saveSuccess\": \"Profile saved successfully\"\n }\n}\n\n// Avoid\n{\n \"btn1\": \"Edit Profile\",\n \"msg1\": \"Profile saved successfully\"\n}\n\\`\\`\\`\n\n### 2. Group Related Translations\n\\`\\`\\`json\n{\n \"checkout\": {\n \"title\": \"Checkout\",\n \"steps\": {\n \"shipping\": \"Shipping\",\n \"payment\": \"Payment\",\n \"review\": \"Review\"\n },\n \"buttons\": {\n \"next\": \"Continue\",\n \"back\": \"Go Back\",\n \"placeOrder\": \"Place Order\"\n }\n }\n}\n\\`\\`\\`\n\n### 3. Keep Keys Consistent Across Languages\nAll language files should have the same key structure:\n\n\\`\\`\\`json\n// en/common.json\n{ \"greeting\": \"Hello\" }\n\n// es/common.json\n{ \"greeting\": \"Hola\" }\n\n// fr/common.json\n{ \"greeting\": \"Bonjour\" }\n\\`\\`\\`\n\n### 4. Add Comments with Default Values\nThe Babel plugin extracts \\`defaultValue\\` for documentation:\n\n\\`\\`\\`tsx\nt('newFeature.title', { defaultValue: 'New Feature' })\n\\`\\`\\`\n\nThis appears in the report and helps translators understand context.\n`,\n\n \"idealyst://translate/examples\": `# Translation Examples\n\nComplete code examples for common @idealyst/translate patterns.\n\n## Basic App Setup\n\n\\`\\`\\`tsx\n// App.tsx\nimport { TranslateProvider } from '@idealyst/translate';\nimport en from './locales/en/common.json';\nimport es from './locales/es/common.json';\n\nconst config = {\n defaultLanguage: 'en',\n languages: ['en', 'es'],\n resources: {\n en: { common: en },\n es: { common: es },\n },\n defaultNamespace: 'common',\n};\n\nexport function App() {\n return (\n <TranslateProvider config={config}>\n <Navigation />\n </TranslateProvider>\n );\n}\n\\`\\`\\`\n\n## Component with Translations\n\n\\`\\`\\`tsx\n// components/WelcomeScreen.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\nexport function WelcomeScreen() {\n const { t } = useTranslation('common');\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h4\" weight=\"bold\">{t('welcome.title')}</Text>\n <Text typography=\"body1\">{t('welcome.subtitle')}</Text>\n <Button onPress={() => {}}>\n {t('buttons.getStarted')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Language Switcher Component\n\n\\`\\`\\`tsx\n// components/LanguageSwitcher.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useLanguage } from '@idealyst/translate';\n\nexport function LanguageSwitcher() {\n const { language, languages, setLanguage, getDisplayName } = useLanguage();\n\n return (\n <View style={{ flexDirection: 'row', gap: 8 }}>\n {languages.map((lang) => (\n <Button\n key={lang}\n type={language === lang ? 'contained' : 'outlined'}\n size=\"sm\"\n onPress={() => setLanguage(lang)}\n >\n {getDisplayName(lang)}\n </Button>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Form with Validation Messages\n\n\\`\\`\\`tsx\n// components/LoginForm.tsx\nimport { View, TextInput, Button, Text } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\nimport { useState } from 'react';\n\nexport function LoginForm() {\n const { t } = useTranslation('auth');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async () => {\n try {\n // ... login logic\n } catch (e) {\n setError(t('errors.invalidCredentials'));\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">{t('login.title')}</Text>\n\n <View gap=\"xs\">\n <Text typography=\"caption\" weight=\"medium\">{t('login.email')}</Text>\n <TextInput\n value={email}\n onChangeText={setEmail}\n placeholder={t('login.emailPlaceholder')}\n inputMode=\"email\"\n textContentType=\"emailAddress\"\n />\n </View>\n\n <View gap=\"xs\">\n <Text typography=\"caption\" weight=\"medium\">{t('login.password')}</Text>\n <TextInput\n value={password}\n onChangeText={setPassword}\n placeholder={t('login.passwordPlaceholder')}\n secureTextEntry\n textContentType=\"password\"\n />\n </View>\n\n {error && <Text color=\"red\">{error}</Text>}\n\n <Button onPress={handleSubmit}>\n {t('login.submit')}\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Pluralization Example\n\n\\`\\`\\`tsx\n// components/NotificationBadge.tsx\nimport { Badge } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\ninterface Props {\n count: number;\n}\n\nexport function NotificationBadge({ count }: Props) {\n const { t } = useTranslation('common');\n\n if (count === 0) return null;\n\n return (\n <Badge intent=\"primary\">\n {t('notifications.count', { count })}\n </Badge>\n );\n}\n\n// Translation file:\n// {\n// \"notifications\": {\n// \"count\": \"{{count}} notification\",\n// \"count_plural\": \"{{count}} notifications\"\n// }\n// }\n\\`\\`\\`\n\n## Rich Text with Trans Component\n\n\\`\\`\\`tsx\n// components/TermsAgreement.tsx\nimport { View, Text, Checkbox } from '@idealyst/components';\nimport { Trans, useTranslation } from '@idealyst/translate';\nimport { Link } from '@idealyst/navigation';\nimport { useState } from 'react';\n\nexport function TermsAgreement() {\n const { t } = useTranslation('auth');\n const [agreed, setAgreed] = useState(false);\n\n return (\n <View>\n <Checkbox\n checked={agreed}\n onChange={setAgreed}\n label={\n <Trans\n i18nKey=\"auth.termsAgreement\"\n components={{\n terms: <Link to=\"/terms\" />,\n privacy: <Link to=\"/privacy\" />,\n }}\n />\n }\n />\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"termsAgreement\": \"I agree to the <terms>Terms of Service</terms> and <privacy>Privacy Policy</privacy>\"\n// }\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\n// hooks/usePersistedLanguage.ts\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\nimport AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst LANGUAGE_KEY = '@app/language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n AsyncStorage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n AsyncStorage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## Multiple Namespaces\n\n\\`\\`\\`tsx\n// components/UserProfile.tsx\nimport { View, Text, Button } from '@idealyst/components';\nimport { useTranslation } from '@idealyst/translate';\n\nexport function UserProfile() {\n // Load multiple namespaces\n const { t } = useTranslation(['common', 'user']);\n\n return (\n <View padding=\"md\" gap=\"md\">\n {/* Use namespace prefix */}\n <Text typography=\"h5\" weight=\"bold\">{t('user:profile.title')}</Text>\n <Button>{t('common:buttons.edit')}</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Date and Number Formatting\n\n\\`\\`\\`tsx\n// components/OrderSummary.tsx\nimport { View, Text } from '@idealyst/components';\nimport { useTranslation, useLanguage } from '@idealyst/translate';\n\ninterface Props {\n total: number;\n orderDate: Date;\n}\n\nexport function OrderSummary({ total, orderDate }: Props) {\n const { t } = useTranslation('orders');\n const { language } = useLanguage();\n\n // Format based on current language\n const formattedTotal = new Intl.NumberFormat(language, {\n style: 'currency',\n currency: 'USD',\n }).format(total);\n\n const formattedDate = new Intl.DateTimeFormat(language, {\n dateStyle: 'long',\n }).format(orderDate);\n\n return (\n <View>\n <Text>{t('summary.total', { amount: formattedTotal })}</Text>\n <Text>{t('summary.date', { date: formattedDate })}</Text>\n </View>\n );\n}\n\n// Translation file:\n// {\n// \"summary\": {\n// \"total\": \"Total: {{amount}}\",\n// \"date\": \"Order placed on {{date}}\"\n// }\n// }\n\\`\\`\\`\n`,\n};\n","export const storageGuides: Record<string, string> = {\n \"idealyst://storage/overview\": `# @idealyst/storage Overview\n\nCross-platform storage solution for React and React Native applications. Provides a consistent async API for persistent data storage.\n\n## Features\n\n- **Cross-Platform** - Works seamlessly on React Native and Web\n- **Simple API** - Async/await based with consistent interface\n- **React Native** - Uses MMKV for high-performance storage\n- **Web** - Uses localStorage with proper error handling\n- **TypeScript** - Full type safety and IntelliSense support\n- **Secure Storage** - Optional encrypted storage via \\`createSecureStorage()\\` (Keychain on native, Web Crypto on web)\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/storage\n\n# React Native also needs:\nyarn add react-native-mmkv\ncd ios && pod install\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Store string data\nawait storage.setItem('token', 'abc123');\n\n// Store objects (use JSON.stringify)\nawait storage.setItem('user', JSON.stringify({ name: 'John', id: 123 }));\n\n// Retrieve string data\nconst token = await storage.getItem('token');\n\n// Retrieve and parse objects\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) : null;\n\n// Remove data\nawait storage.removeItem('token');\n\n// Clear all data\nawait storage.clear();\n\n// Get all keys\nconst keys = await storage.getAllKeys();\n\\`\\`\\`\n\n## Import Options\n\n\\`\\`\\`tsx\n// Named import (recommended)\nimport { storage } from '@idealyst/storage';\n\n// Default import\nimport storage from '@idealyst/storage';\n\\`\\`\\`\n\n## Platform Details\n\n- **React Native**: Uses \\`react-native-mmkv\\` for high-performance storage\n- **Web**: Uses browser \\`localStorage\\`\n`,\n\n \"idealyst://storage/api\": `# Storage API Reference\n\nComplete API reference for @idealyst/storage.\n\n## setItem\n\nStore a string value with the given key.\n\n\\`\\`\\`tsx\nawait storage.setItem(key: string, value: string): Promise<void>\n\n// Examples\nawait storage.setItem('token', 'abc123');\nawait storage.setItem('userId', '42');\n\n// For objects, use JSON.stringify\nawait storage.setItem('user', JSON.stringify({ name: 'John', age: 30 }));\nawait storage.setItem('tags', JSON.stringify(['react', 'native']));\nawait storage.setItem('settings', JSON.stringify({ theme: 'dark', notifications: true }));\n\\`\\`\\`\n\n## getItem\n\nRetrieve a string value by key. Returns \\`null\\` if the key doesn't exist.\n\n\\`\\`\\`tsx\nawait storage.getItem(key: string): Promise<string | null>\n\n// Examples\nconst token = await storage.getItem('token');\nconst userId = await storage.getItem('userId');\n\n// For objects, parse the JSON\nconst userData = await storage.getItem('user');\nconst user = userData ? JSON.parse(userData) as User : null;\n\nconst tagsData = await storage.getItem('tags');\nconst tags = tagsData ? JSON.parse(tagsData) as string[] : [];\n\nif (user) {\n console.log(user.name);\n}\n\\`\\`\\`\n\n## removeItem\n\nRemove a specific item from storage.\n\n\\`\\`\\`tsx\nawait storage.removeItem(key: string): Promise<void>\n\n// Examples\nawait storage.removeItem('user');\nawait storage.removeItem('temporaryData');\n\\`\\`\\`\n\n## clear\n\nRemove all items from storage.\n\n\\`\\`\\`tsx\nawait storage.clear(): Promise<void>\n\\`\\`\\`\n\n## getAllKeys\n\nReturns all keys currently in storage.\n\n\\`\\`\\`tsx\nawait storage.getAllKeys(): Promise<string[]>\n\n// Example\nconst keys = await storage.getAllKeys();\nconsole.log('Stored keys:', keys); // ['user', 'settings', 'token']\n\\`\\`\\`\n\n## Helper Pattern for Typed Storage\n\nCreate a typed wrapper for cleaner code:\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\n// Helper functions for typed storage\nasync function setObject<T>(key: string, value: T): Promise<void> {\n await storage.setItem(key, JSON.stringify(value));\n}\n\nasync function getObject<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(key);\n return data ? JSON.parse(data) as T : null;\n}\n\n// Usage\ninterface User {\n id: number;\n name: string;\n}\n\nawait setObject<User>('user', { id: 1, name: 'John' });\nconst user = await getObject<User>('user');\n\\`\\`\\`\n`,\n\n \"idealyst://storage/examples\": `# Storage Examples\n\nComplete code examples for common @idealyst/storage patterns.\n\n## User Session Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n}\n\nclass AuthService {\n static async saveUserSession(user: User, token: string) {\n await Promise.all([\n storage.setItem('currentUser', JSON.stringify(user)),\n storage.setItem('authToken', token),\n storage.setItem('loginTime', new Date().toISOString()),\n ]);\n }\n\n static async getUserSession() {\n const userData = await storage.getItem('currentUser');\n const token = await storage.getItem('authToken');\n\n const user = userData ? JSON.parse(userData) as User : null;\n return user && token ? { user, token } : null;\n }\n\n static async clearSession() {\n await Promise.all([\n storage.removeItem('currentUser'),\n storage.removeItem('authToken'),\n storage.removeItem('loginTime'),\n ]);\n }\n}\n\\`\\`\\`\n\n## Settings Management\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface AppSettings {\n theme: 'light' | 'dark';\n notifications: boolean;\n language: string;\n fontSize: number;\n}\n\nconst defaultSettings: AppSettings = {\n theme: 'light',\n notifications: true,\n language: 'en',\n fontSize: 16,\n};\n\nclass SettingsService {\n static async getSettings(): Promise<AppSettings> {\n const data = await storage.getItem('appSettings');\n const stored = data ? JSON.parse(data) as AppSettings : null;\n return stored ? { ...defaultSettings, ...stored } : defaultSettings;\n }\n\n static async updateSettings(newSettings: Partial<AppSettings>) {\n const current = await this.getSettings();\n const updated = { ...current, ...newSettings };\n await storage.setItem('appSettings', JSON.stringify(updated));\n return updated;\n }\n\n static async resetSettings() {\n await storage.setItem('appSettings', JSON.stringify(defaultSettings));\n return defaultSettings;\n }\n}\n\\`\\`\\`\n\n## Cache with Expiration\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\ninterface CacheItem<T> {\n data: T;\n timestamp: number;\n expiresIn: number; // milliseconds\n}\n\nclass CacheService {\n static async setCache<T>(key: string, data: T, expiresIn: number = 3600000) {\n const cacheItem: CacheItem<T> = {\n data,\n timestamp: Date.now(),\n expiresIn,\n };\n\n await storage.setItem(\\`cache_\\${key}\\`, JSON.stringify(cacheItem));\n }\n\n static async getCache<T>(key: string): Promise<T | null> {\n const data = await storage.getItem(\\`cache_\\${key}\\`);\n if (!data) return null;\n\n const cacheItem = JSON.parse(data) as CacheItem<T>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n\n if (isExpired) {\n await storage.removeItem(\\`cache_\\${key}\\`);\n return null;\n }\n\n return cacheItem.data;\n }\n\n static async clearExpiredCache() {\n const keys = await storage.getAllKeys();\n const cacheKeys = keys.filter(key => key.startsWith('cache_'));\n\n for (const key of cacheKeys) {\n const data = await storage.getItem(key);\n if (data) {\n const cacheItem = JSON.parse(data) as CacheItem<unknown>;\n const isExpired = Date.now() - cacheItem.timestamp > cacheItem.expiresIn;\n if (isExpired) {\n await storage.removeItem(key);\n }\n }\n }\n }\n}\n\\`\\`\\`\n\n## Persisting Language Preference\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useLanguage } from '@idealyst/translate';\nimport { useEffect } from 'react';\n\nconst LANGUAGE_KEY = 'app_language';\n\nexport function usePersistedLanguage() {\n const { language, setLanguage } = useLanguage();\n\n // Load saved language on mount\n useEffect(() => {\n storage.getItem(LANGUAGE_KEY).then((saved) => {\n if (saved) setLanguage(saved);\n });\n }, []);\n\n // Save language when changed\n useEffect(() => {\n storage.setItem(LANGUAGE_KEY, language);\n }, [language]);\n\n return { language, setLanguage };\n}\n\\`\\`\\`\n\n## React Hook for Storage\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\nimport { useState, useEffect, useCallback } from 'react';\n\nexport function useStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(initialValue);\n const [loading, setLoading] = useState(true);\n\n // Load value on mount\n useEffect(() => {\n storage.getItem(key).then((stored) => {\n if (stored !== null) {\n setValue(JSON.parse(stored) as T);\n }\n setLoading(false);\n });\n }, [key]);\n\n // Update storage when value changes\n const updateValue = useCallback(async (newValue: T) => {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n }, [key]);\n\n // Remove from storage\n const removeValue = useCallback(async () => {\n setValue(initialValue);\n await storage.removeItem(key);\n }, [key, initialValue]);\n\n return { value, setValue: updateValue, removeValue, loading };\n}\n\n// Usage\nfunction MyComponent() {\n const { value: theme, setValue: setTheme, loading } = useStorage('theme', 'light');\n\n if (loading) return <ActivityIndicator />;\n\n return (\n <Button onPress={() => setTheme(theme === 'light' ? 'dark' : 'light')}>\n Toggle Theme\n </Button>\n );\n}\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`tsx\nimport { storage } from '@idealyst/storage';\n\nasync function safeStorageOperation() {\n try {\n await storage.setItem('data', JSON.stringify(largeObject));\n } catch (error) {\n console.error('Storage failed:', error);\n // Handle storage quota exceeded or other errors\n }\n\n // Or with null checking\n const result = await storage.getItem('data');\n if (result === null) {\n // Key doesn't exist or retrieval failed\n console.log('No data found');\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Use JSON.stringify/parse** - Storage only accepts strings, so serialize objects\n2. **Handle Nulls** - Always check for null returns from \\`getItem\\`\n3. **Batch Operations** - Use \\`Promise.all\\` for multiple storage operations\n4. **Error Handling** - Wrap storage operations in try-catch blocks for critical data\n5. **Key Naming** - Use consistent, descriptive key names\n6. **Data Size** - Keep stored objects reasonably sized\n7. **Cleanup** - Periodically clean up unused data\n8. **Type Safety** - Create typed wrapper functions for better TypeScript support\n9. **Use Secure Storage for Secrets** - Use \\`createSecureStorage()\\` for auth tokens, API keys, and sensitive data\n`,\n\n \"idealyst://storage/secure\": `# Secure Storage\n\nEncrypted storage for sensitive data like auth tokens, API keys, and secrets. Uses the same \\`IStorage\\` interface as regular storage — drop-in replacement.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/storage\n\n# React Native also needs (for secure storage):\nyarn add react-native-keychain react-native-mmkv\ncd ios && pod install\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { createSecureStorage } from '@idealyst/storage';\n\n// Create a secure storage instance\nconst secureStorage = createSecureStorage();\n\n// Same API as regular storage\nawait secureStorage.setItem('authToken', 'eyJhbGciOiJIUzI1NiIs...');\nconst token = await secureStorage.getItem('authToken');\nawait secureStorage.removeItem('authToken');\nawait secureStorage.clear();\nconst keys = await secureStorage.getAllKeys();\n\n// Listeners work too\nconst unsubscribe = secureStorage.addListener((key, value) => {\n console.log('Secure storage changed:', key);\n});\n\\`\\`\\`\n\n## Options\n\n\\`\\`\\`tsx\nimport { createSecureStorage, SecureStorageOptions } from '@idealyst/storage';\n\nconst secureStorage = createSecureStorage({\n prefix: 'myapp', // Namespace for keys (default: 'secure')\n});\n\\`\\`\\`\n\nThe \\`prefix\\` option controls:\n- **Native**: Keychain service name and MMKV instance ID\n- **Web**: localStorage key prefix and IndexedDB key name\n\nUse different prefixes to create isolated secure storage instances.\n\n## How It Works\n\n### React Native\n1. A random 16-byte encryption key is generated on first use\n2. The key is stored in the **iOS Keychain** / **Android Keystore** (hardware-backed)\n3. An encrypted MMKV instance is created using that key\n4. All data is encrypted at rest by MMKV's native AES encryption\n5. Keychain accessibility is set to \\`WHEN_UNLOCKED_THIS_DEVICE_ONLY\\` (not backed up, only accessible when device is unlocked)\n\n### Web\n1. A non-extractable AES-256-GCM \\`CryptoKey\\` is generated on first use\n2. The key is stored in **IndexedDB** (non-extractable — cannot be read as raw bytes)\n3. Each value is encrypted with a unique random IV before storing in localStorage\n4. Requires a **secure context** (HTTPS) for \\`crypto.subtle\\` access\n\n## Usage Example: Secure Auth Service\n\n\\`\\`\\`tsx\nimport { createSecureStorage } from '@idealyst/storage';\n\nconst secureStorage = createSecureStorage({ prefix: 'auth' });\n\ninterface AuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n}\n\nclass SecureAuthService {\n static async saveTokens(tokens: AuthTokens) {\n await secureStorage.setItem('tokens', JSON.stringify(tokens));\n }\n\n static async getTokens(): Promise<AuthTokens | null> {\n const data = await secureStorage.getItem('tokens');\n return data ? JSON.parse(data) as AuthTokens : null;\n }\n\n static async clearTokens() {\n await secureStorage.removeItem('tokens');\n }\n\n static async saveApiKey(key: string) {\n await secureStorage.setItem('apiKey', key);\n }\n\n static async getApiKey(): Promise<string | null> {\n return secureStorage.getItem('apiKey');\n }\n}\n\\`\\`\\`\n\n## When to Use Secure vs Regular Storage\n\n| Data Type | Use |\n|-----------|-----|\n| Auth tokens, refresh tokens | \\`createSecureStorage()\\` |\n| API keys, client secrets | \\`createSecureStorage()\\` |\n| User preferences, theme | \\`storage\\` (regular) |\n| Cache data | \\`storage\\` (regular) |\n| Session IDs | \\`createSecureStorage()\\` |\n| Language preference | \\`storage\\` (regular) |\n\n## Platform Requirements\n\n- **React Native**: Requires \\`react-native-keychain\\` (>=9.0.0) and \\`react-native-mmkv\\` (>=4.0.0)\n- **Web**: Requires secure context (HTTPS) and IndexedDB support\n- **Web limitation**: IndexedDB may not be available in some private browsing modes\n`,\n};\n","/**\n * Audio Package Guides\n *\n * Comprehensive documentation for @idealyst/audio.\n * PCM audio streaming & playback — NOT file-based recording.\n */\n\nexport const audioGuides: Record<string, string> = {\n \"idealyst://audio/overview\": `# @idealyst/audio\n\nCross-platform **PCM audio streaming** package for React and React Native.\n\n> **Important:** This package provides real-time PCM streaming — it does NOT record to files.\n> \\`recorder.stop()\\` returns \\`void\\`. Audio data arrives via \\`subscribeToData()\\` callbacks as binary PCM chunks.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/audio\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ WebAudio API |\n| iOS | ✅ AVAudioEngine |\n| Android | ✅ AudioRecord |\n\n## Key Concepts\n\n1. **PCM Streaming** — Audio data is delivered as \\`PCMData\\` chunks via callbacks, not as files\n2. **Audio Session** — On iOS/Android, configure the audio session category before recording/playback\n3. **Audio Profiles** — Pre-configured \\`AudioConfig\\` presets: \\`speech\\`, \\`highQuality\\`, \\`studio\\`, \\`phone\\`\n4. **Session Presets** — Pre-configured \\`AudioSessionConfig\\` presets: \\`playback\\`, \\`record\\`, \\`voiceChat\\`, \\`ambient\\`, \\`default\\`, \\`backgroundRecord\\`\n5. **Background Recording** — \\`useBackgroundRecorder\\` hook for recording that continues when the app is backgrounded (iOS/Android). Requires app-level native entitlements.\n\n## Exports\n\n\\`\\`\\`typescript\nimport {\n useRecorder,\n usePlayer,\n useAudio,\n useBackgroundRecorder,\n AUDIO_PROFILES,\n SESSION_PRESETS,\n} from '@idealyst/audio';\nimport type {\n PCMData, AudioConfig, AudioLevel,\n BackgroundRecorderStatus, BackgroundLifecycleInfo,\n} from '@idealyst/audio';\n\\`\\`\\`\n`,\n\n \"idealyst://audio/api\": `# @idealyst/audio — API Reference\n\n## Hooks\n\n### useRecorder(options?)\n\nPCM streaming recorder hook.\n\n\\`\\`\\`typescript\ninterface UseRecorderOptions {\n config?: Partial<AudioConfig>; // Audio config (sample rate, channels, bit depth)\n autoRequestPermission?: boolean; // Auto-request mic permission on mount\n levelUpdateInterval?: number; // Level update interval in ms (default: 100)\n}\n\\`\\`\\`\n\n**Returns \\`UseRecorderResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | RecorderStatus | Full status object |\n| isRecording | boolean | Whether recording is active |\n| isPaused | boolean | Whether recording is paused |\n| permission | PermissionStatus | \\`'undetermined' \\\\| 'granted' \\\\| 'denied' \\\\| 'blocked'\\` |\n| duration | number | Recording duration in ms |\n| level | AudioLevel | Current audio level (\\`{ current, peak, rms, db }\\`) |\n| error | AudioError \\\\| null | Current error |\n| start | (config?) => Promise<void> | Start recording |\n| stop | () => Promise<void> | **Stop recording — returns void, NOT audio data** |\n| pause | () => Promise<void> | Pause recording |\n| resume | () => Promise<void> | Resume recording |\n| checkPermission | () => Promise<PermissionStatus> | Check mic permission |\n| requestPermission | () => Promise<PermissionStatus> | Request mic permission |\n| subscribeToData | (cb: RecorderDataCallback) => () => void | **Subscribe to PCM data chunks** |\n| resetPeakLevel | () => void | Reset peak level meter |\n\n> **Critical:** \\`stop()\\` returns \\`Promise<void>\\` — it does NOT return recorded audio.\n> You MUST use \\`subscribeToData()\\` to collect PCM data chunks during recording.\n\n---\n\n### usePlayer(options?)\n\nAudio playback hook supporting both file playback and PCM streaming.\n\n\\`\\`\\`typescript\ninterface UsePlayerOptions {\n autoPlay?: boolean; // Auto-play when source loaded\n volume?: number; // Initial volume (0.0 - 1.0)\n positionUpdateInterval?: number; // Position update interval in ms (default: 100)\n}\n\\`\\`\\`\n\n**Returns \\`UsePlayerResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | PlayerStatus | Full status object |\n| isPlaying | boolean | Whether playback is active |\n| isPaused | boolean | Whether playback is paused |\n| isLoading | boolean | Whether source is loading |\n| position | number | Current position in ms |\n| duration | number | Total duration in ms |\n| volume | number | Current volume (0.0 - 1.0) |\n| error | AudioError \\\\| null | Current error |\n| loadFile | (uri: string) => Promise<void> | Load audio file for playback |\n| unload | () => void | Unload current source |\n| loadPCMStream | (config: AudioConfig) => Promise<void> | **Start PCM streaming playback** |\n| feedPCMData | (data: ArrayBufferLike \\\\| Int16Array) => void | **Feed PCM data — NOT strings** |\n| flush | () => Promise<void> | Flush remaining buffered data |\n| clearBuffer | () => void | Clear playback buffer |\n| play | () => Promise<void> | Start/resume playback |\n| pause | () => void | Pause playback |\n| stop | () => void | Stop playback |\n| seek | (positionMs: number) => Promise<void> | Seek to position |\n| setVolume | (volume: number) => void | Set volume |\n| toggleMute | () => void | Toggle mute |\n\n> **Critical:** \\`feedPCMData()\\` accepts \\`ArrayBufferLike | Int16Array\\` — **NOT strings or base64**.\n\n---\n\n### useAudio(options?)\n\nAudio session management hook (primarily for iOS/Android).\n\n\\`\\`\\`typescript\ninterface UseAudioOptions {\n session?: Partial<AudioSessionConfig>; // Session config\n initializeOnMount?: boolean; // Initialize on mount (default: true)\n}\n\\`\\`\\`\n\n**Returns \\`UseAudioResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| isInitialized | boolean | Whether audio context is ready |\n| sessionState | AudioSessionState | Current session state |\n| outputs | string[] | Current audio outputs |\n| initialize | () => Promise<void> | Initialize audio context |\n| configureSession | (config) => Promise<void> | Configure audio session |\n| suspend | () => Promise<void> | Suspend audio context |\n| resume | () => Promise<void> | Resume audio context |\n\n---\n\n### useBackgroundRecorder(options?)\n\nBackground-aware recording hook. Wraps \\`useRecorder\\` with app lifecycle management for recording that continues when the app is backgrounded on iOS/Android. On web, works identically to \\`useRecorder\\` (background events never fire).\n\n> **Requires app-level native configuration** — see \"Background Recording Setup\" below.\n\n\\`\\`\\`typescript\ninterface UseBackgroundRecorderOptions {\n config?: Partial<AudioConfig>; // Audio config\n session?: Partial<AudioSessionConfig>; // Session config (default: SESSION_PRESETS.backgroundRecord)\n autoRequestPermission?: boolean; // Auto-request mic permission on mount\n levelUpdateInterval?: number; // Level update interval in ms (default: 100)\n maxBackgroundDuration?: number; // Max background recording time in ms (undefined = no limit)\n autoConfigureSession?: boolean; // Auto-configure session for background (default: true)\n onLifecycleEvent?: BackgroundLifecycleCallback; // Lifecycle event callback\n}\n\\`\\`\\`\n\n**Returns \\`UseBackgroundRecorderResult\\`:**\n\nAll properties from \\`useRecorder\\`, plus:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| isInBackground | boolean | Whether the app is currently backgrounded |\n| wasInterrupted | boolean | Whether recording was interrupted (phone call, Siri, etc.) |\n| backgroundDuration | number | Total time spent recording in background (ms) |\n| appState | AppStateStatus | Current app state (\\`'active' \\\\| 'background' \\\\| 'inactive'\\`) |\n\n**Lifecycle events** (via \\`onLifecycleEvent\\`):\n\n| Event | When | Extra fields |\n|-------|------|-------------|\n| \\`'backgrounded'\\` | App enters background while recording | — |\n| \\`'foregrounded'\\` | App returns to foreground while recording | \\`backgroundDuration\\` |\n| \\`'interrupted'\\` | OS interrupts recording (phone call, Siri) | — |\n| \\`'interruptionEnded'\\` | OS interruption ends | \\`shouldResume\\` |\n| \\`'maxDurationReached'\\` | Background recording hit \\`maxBackgroundDuration\\` | \\`backgroundDuration\\` |\n| \\`'stopped'\\` | Recording stopped while in background | \\`backgroundDuration\\` |\n\n> **Note:** Interruptions use notify-only — the hook does NOT auto-resume. The consumer decides via the \\`shouldResume\\` flag.\n\n#### Background Recording Setup\n\nThe OS will not allow background recording without app-level entitlements:\n\n**iOS** — \\`Info.plist\\`:\n\\`\\`\\`xml\n<key>UIBackgroundModes</key>\n<array><string>audio</string></array>\n\\`\\`\\`\n\n**Android** — \\`AndroidManifest.xml\\`:\n\\`\\`\\`xml\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n<service\n android:name=\"com.swmansion.audioapi.system.CentralizedForegroundService\"\n android:foregroundServiceType=\"microphone\" />\n\\`\\`\\`\n\n**Expo** — \\`app.json\\` plugin:\n\\`\\`\\`json\n[\"react-native-audio-api\", {\n \"iosBackgroundMode\": true,\n \"androidForegroundService\": true,\n \"androidFSTypes\": [\"microphone\"],\n \"androidPermissions\": [\n \"android.permission.FOREGROUND_SERVICE\",\n \"android.permission.FOREGROUND_SERVICE_MICROPHONE\",\n \"android.permission.RECORD_AUDIO\"\n ]\n}]\n\\`\\`\\`\n\n---\n\n## Types\n\n### AudioConfig\n\n\\`\\`\\`typescript\ntype SampleRate = 8000 | 16000 | 22050 | 24000 | 44100 | 48000;\ntype BitDepth = 8 | 16 | 32;\ntype ChannelCount = 1 | 2;\n\ninterface AudioConfig {\n sampleRate: SampleRate; // Default: 16000\n channels: ChannelCount; // Default: 1 (mono)\n bitDepth: BitDepth; // Default: 16\n}\n\\`\\`\\`\n\n### PCMData\n\n\\`\\`\\`typescript\ninterface PCMData {\n buffer: ArrayBufferLike; // Raw audio buffer\n samples: Int8Array | Int16Array | Float32Array; // Typed sample array\n timestamp: number; // Capture timestamp\n config: AudioConfig; // Audio config used\n toBase64(): string; // For external APIs (e.g., speech-to-text HTTP). Do NOT pass to feedPCMData().\n}\n\\`\\`\\`\n\n### AudioLevel\n\n\\`\\`\\`typescript\ninterface AudioLevel {\n current: number; // 0.0 - 1.0\n peak: number; // 0.0 - 1.0\n rms: number; // Root mean square\n db: number; // Decibel value (-Infinity to 0)\n}\n\\`\\`\\`\n\n### AudioSessionConfig (iOS/Android)\n\n\\`\\`\\`typescript\ntype AudioSessionCategory = 'ambient' | 'soloAmbient' | 'playback' | 'record' | 'playAndRecord' | 'multiRoute';\ntype AudioSessionMode = 'default' | 'voiceChat' | 'gameChat' | 'videoRecording' | 'measurement' | 'moviePlayback' | 'videoChat' | 'spokenAudio';\n\ninterface AudioSessionConfig {\n category: AudioSessionCategory;\n categoryOptions?: AudioSessionCategoryOption[];\n mode?: AudioSessionMode;\n active?: boolean;\n}\n\\`\\`\\`\n\n### Error Types\n\n\\`\\`\\`typescript\ntype AudioErrorCode =\n | 'PERMISSION_DENIED' | 'PERMISSION_BLOCKED'\n | 'DEVICE_NOT_FOUND' | 'DEVICE_IN_USE' | 'NOT_SUPPORTED'\n | 'SOURCE_NOT_FOUND' | 'FORMAT_NOT_SUPPORTED' | 'DECODE_ERROR' | 'PLAYBACK_ERROR' | 'BUFFER_UNDERRUN'\n | 'RECORDING_ERROR'\n | 'BACKGROUND_NOT_SUPPORTED' | 'BACKGROUND_MAX_DURATION'\n | 'INITIALIZATION_FAILED' | 'INVALID_STATE' | 'INVALID_CONFIG' | 'UNKNOWN';\n\ninterface AudioError {\n code: AudioErrorCode;\n message: string;\n originalError?: Error;\n}\n\\`\\`\\`\n\n---\n\n## Presets\n\n### AUDIO_PROFILES\n\n\\`\\`\\`typescript\nconst AUDIO_PROFILES: AudioProfiles = {\n speech: { sampleRate: 16000, channels: 1, bitDepth: 16 },\n highQuality: { sampleRate: 44100, channels: 2, bitDepth: 16 },\n studio: { sampleRate: 48000, channels: 2, bitDepth: 32 },\n phone: { sampleRate: 8000, channels: 1, bitDepth: 16 },\n};\n\\`\\`\\`\n\n### SESSION_PRESETS\n\n\\`\\`\\`typescript\nconst SESSION_PRESETS: SessionPresets = {\n playback: { category: 'playback', mode: 'default' },\n record: { category: 'record', mode: 'default' },\n voiceChat: { category: 'playAndRecord', mode: 'voiceChat', categoryOptions: ['allowBluetooth', 'defaultToSpeaker'] },\n ambient: { category: 'ambient', mode: 'default' },\n default: { category: 'soloAmbient', mode: 'default' },\n backgroundRecord: { category: 'playAndRecord', mode: 'spokenAudio', categoryOptions: ['defaultToSpeaker', 'allowBluetooth', 'allowBluetoothA2DP', 'mixWithOthers'] },\n};\n\\`\\`\\`\n`,\n\n \"idealyst://audio/examples\": `# @idealyst/audio — Examples\n\n## Basic Recording with Data Collection\n\n\\`\\`\\`tsx\nimport React, { useRef, useEffect } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useRecorder, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction VoiceRecorder() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n // Subscribe to PCM data\n useEffect(() => {\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleToggle = async () => {\n if (recorder.isRecording) {\n await recorder.stop(); // Returns void — data already collected via subscribeToData\n console.log(\\`Collected \\${chunksRef.current.length} chunks\\`);\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button\n onPress={handleToggle}\n intent={recorder.isRecording ? 'error' : 'primary'}\n >\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Text>Duration: {Math.round(recorder.duration / 1000)}s</Text>\n <Text>Level: {Math.round(recorder.level.current * 100)}%</Text>\n </View>\n );\n}\n\\`\\`\\`\n\n## PCM Streaming Playback\n\n\\`\\`\\`tsx\nimport React, { useRef, useEffect } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useRecorder, usePlayer, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction RecordAndPlayback() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const player = usePlayer();\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n useEffect(() => {\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleRecord = async () => {\n if (recorder.isRecording) {\n await recorder.stop();\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n const handlePlayback = async () => {\n // Initialize PCM streaming playback with the same config\n await player.loadPCMStream(AUDIO_PROFILES.speech);\n await player.play();\n\n // Feed all collected chunks\n for (const chunk of chunksRef.current) {\n player.feedPCMData(chunk); // Accepts ArrayBufferLike — NOT strings\n }\n\n await player.flush(); // Flush remaining buffer\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handleRecord} intent={recorder.isRecording ? 'error' : 'primary'}>\n {recorder.isRecording ? 'Stop Recording' : 'Record'}\n </Button>\n <Button\n onPress={handlePlayback}\n intent=\"secondary\"\n disabled={chunksRef.current.length === 0 || player.isPlaying}\n >\n Play Back\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## File Playback\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Progress } from '@idealyst/components';\nimport { usePlayer } from '@idealyst/audio';\n\nfunction AudioFilePlayer({ uri }: { uri: string }) {\n const player = usePlayer();\n\n const handleLoad = async () => {\n await player.loadFile(uri);\n await player.play();\n };\n\n const progress = player.duration > 0 ? player.position / player.duration : 0;\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handleLoad} disabled={player.isPlaying}>\n Play File\n </Button>\n <Progress value={progress * 100} />\n <Text>\n {Math.round(player.position / 1000)}s / {Math.round(player.duration / 1000)}s\n </Text>\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => player.pause()} disabled={!player.isPlaying} size=\"sm\">\n Pause\n </Button>\n <Button onPress={() => player.stop()} size=\"sm\">\n Stop\n </Button>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Audio Session Setup (iOS/Android)\n\n\\`\\`\\`tsx\nimport React, { useEffect } from 'react';\nimport { useAudio, useRecorder, SESSION_PRESETS, AUDIO_PROFILES } from '@idealyst/audio';\n\nfunction VoiceChatScreen() {\n const audio = useAudio({ session: SESSION_PRESETS.voiceChat });\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n\n useEffect(() => {\n // Audio session is automatically configured on mount\n // For manual configuration:\n audio.configureSession({\n category: 'playAndRecord',\n mode: 'voiceChat',\n categoryOptions: ['allowBluetooth', 'defaultToSpeaker'],\n });\n }, []);\n\n // ... recording/playback logic\n}\n\\`\\`\\`\n\n## Background Recording for Transcription\n\n\\`\\`\\`tsx\nimport React, { useEffect } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useBackgroundRecorder, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData, BackgroundLifecycleInfo } from '@idealyst/audio';\n\nfunction BackgroundTranscriber() {\n const recorder = useBackgroundRecorder({\n config: AUDIO_PROFILES.speech,\n maxBackgroundDuration: 5 * 60 * 1000, // 5 min max in background\n onLifecycleEvent: (info: BackgroundLifecycleInfo) => {\n switch (info.event) {\n case 'backgrounded':\n console.log('Recording continues in background');\n break;\n case 'foregrounded':\n console.log(\\`Back from background after \\${info.backgroundDuration}ms\\`);\n break;\n case 'interrupted':\n console.log('Recording interrupted (phone call?)');\n break;\n case 'interruptionEnded':\n if (info.shouldResume) {\n recorder.resume(); // Consumer decides whether to resume\n }\n break;\n case 'maxDurationReached':\n console.log('Max background duration reached');\n break;\n }\n },\n });\n\n // Stream PCM chunks to your speech-to-text service\n useEffect(() => {\n const unsub = recorder.subscribeToData((pcm: PCMData) => {\n // Send to STT API (e.g., Whisper, Deepgram)\n sendToTranscriptionService(pcm.toBase64());\n });\n return unsub;\n }, [recorder.subscribeToData]);\n\n const handleToggle = async () => {\n if (recorder.isRecording) {\n await recorder.stop();\n } else {\n await recorder.start();\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button\n onPress={handleToggle}\n intent={recorder.isRecording ? 'error' : 'primary'}\n >\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Text>Duration: {Math.round(recorder.duration / 1000)}s</Text>\n {recorder.isInBackground && <Text>Recording in background...</Text>}\n {recorder.wasInterrupted && <Text>Recording was interrupted</Text>}\n <Text>Background time: {Math.round(recorder.backgroundDuration / 1000)}s</Text>\n </View>\n );\n}\n\\`\\`\\`\n\n> **Important:** Background recording requires native entitlements. See the \\`useBackgroundRecorder\\` API docs for iOS, Android, and Expo setup instructions.\n\n## Audio Level Visualization\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { useRecorder, AUDIO_PROFILES } from '@idealyst/audio';\n\nfunction AudioLevelMeter() {\n const recorder = useRecorder({\n config: AUDIO_PROFILES.speech,\n autoRequestPermission: true,\n });\n\n return (\n <View padding=\"md\" gap=\"sm\">\n <Text>Level: {Math.round(recorder.level.current * 100)}%</Text>\n <Text>Peak: {Math.round(recorder.level.peak * 100)}%</Text>\n <Text>dB: {recorder.level.db.toFixed(1)}</Text>\n <View\n style={{\n height: 20,\n backgroundColor: '#e0e0e0',\n borderRadius: 10,\n overflow: 'hidden',\n }}\n >\n <View\n style={{\n width: \\`\\${recorder.level.current * 100}%\\`,\n height: '100%',\n backgroundColor: recorder.level.current > 0.8 ? 'red' : 'green',\n }}\n />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Camera Package Guides\n *\n * Comprehensive documentation for @idealyst/camera.\n */\n\nexport const cameraGuides: Record<string, string> = {\n \"idealyst://camera/overview\": `# @idealyst/camera\n\nCross-platform camera package for photo capture and video recording.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/camera\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ MediaDevices API |\n| iOS | ✅ AVFoundation |\n| Android | ✅ CameraX |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n CameraPreview, // Component — NOT \"Camera\"\n useCamera, // Hook — returns camera controls + cameraRef\n requestPermission, // Standalone function — NOT \"useCameraPermission\" or \"requestCameraPermission\"\n} from '@idealyst/camera';\n\\`\\`\\`\n\n> **Common mistakes:**\n> - The component is \\`CameraPreview\\`, NOT \\`Camera\\`\n> - Permission is requested via \\`requestPermission()\\` standalone function, NOT a hook or \\`requestCameraPermission\\`\n> - Pass \\`camera.cameraRef.current\\` to \\`CameraPreview\\`'s \\`camera\\` prop\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { View, Button } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\n\nfunction CameraScreen() {\n const camera = useCamera({ autoRequestPermission: true });\n\n const handleTakePhoto = async () => {\n const photo = await camera.takePhoto();\n console.log('Photo:', photo.uri, photo.width, photo.height);\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <Button onPress={handleTakePhoto} intent=\"primary\">Take Photo</Button>\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://camera/api\": `# @idealyst/camera — API Reference\n\n## Components\n\n### CameraPreview\n\nRenders the camera preview. Must receive a camera instance from \\`useCamera().cameraRef.current\\`.\n\n\\`\\`\\`typescript\ninterface CameraPreviewProps {\n camera: ICamera | null; // Camera instance from useCamera().cameraRef.current\n style?: StyleProp<ViewStyle>; // Preview container style\n aspectRatio?: number; // e.g., 16/9, 4/3 (default: auto)\n resizeMode?: 'cover' | 'contain'; // Default: 'cover'\n mirror?: boolean; // Mirror preview (default: auto based on position)\n enableTapToFocus?: boolean; // Default: true\n enablePinchToZoom?: boolean; // Default: true\n onReady?: () => void; // Called when preview is ready\n onFocus?: (point: FocusPoint) => void; // Called on tap-to-focus\n testID?: string;\n}\n\\`\\`\\`\n\n---\n\n## Hooks\n\n### useCamera(options?)\n\nMain camera hook. Returns camera state, controls, and a ref for CameraPreview.\n\n\\`\\`\\`typescript\ninterface UseCameraOptions {\n config?: Partial<CameraConfig>; // Initial camera configuration\n autoRequestPermission?: boolean; // Auto-request permission on mount (default: false)\n autoStart?: boolean; // Auto-start camera on mount (default: false)\n}\n\\`\\`\\`\n\n**Returns \\`UseCameraResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | CameraStatus | Full camera status |\n| isActive | boolean | Whether preview is active |\n| isRecording | boolean | Whether video recording is active |\n| recordingDuration | number | Video recording duration in ms |\n| activeDevice | CameraDevice \\\\| null | Currently active camera device |\n| availableDevices | CameraDevice[] | All available camera devices |\n| permission | PermissionResult \\\\| null | Permission status |\n| error | CameraError \\\\| null | Current error |\n| zoom | number | Current zoom level |\n| torchActive | boolean | Whether torch/flash is on |\n| start | (config?) => Promise<void> | Start camera preview |\n| stop | () => Promise<void> | Stop camera |\n| switchDevice | (deviceOrPosition) => Promise<void> | Switch camera (e.g., 'front' \\\\| 'back') |\n| takePhoto | (options?) => Promise<PhotoResult> | Take a photo |\n| startRecording | (options?) => Promise<void> | Start video recording |\n| stopRecording | () => Promise<VideoResult> | Stop video recording |\n| cancelRecording | () => Promise<void> | Cancel video recording |\n| setZoom | (level: number) => void | Set zoom level |\n| setTorch | (enabled: boolean) => void | Toggle torch/flash |\n| focusOnPoint | (x, y) => Promise<void> | Focus on point (0-1 normalized) |\n| requestPermission | () => Promise<PermissionResult> | Request camera permissions |\n| cameraRef | RefObject<ICamera \\\\| null> | **Ref to pass to CameraPreview** |\n\n---\n\n## Standalone Functions\n\n### requestPermission()\n\nRequest camera and microphone permissions. Returns a \\`PermissionResult\\`.\n\n> **Important:** The export is \\`requestPermission\\`, NOT \\`requestCameraPermission\\`.\n\n\\`\\`\\`typescript\nimport { requestPermission } from '@idealyst/camera';\n\nconst result = await requestPermission();\n// result: { camera: PermissionStatus, microphone: PermissionStatus, canAskAgain: boolean }\n\\`\\`\\`\n\n### checkPermission()\n\nCheck current permission status without prompting the user.\n\n\\`\\`\\`typescript\nimport { checkPermission } from '@idealyst/camera';\n\nconst result = await checkPermission();\nif (result.camera === 'granted') { /* ready */ }\n\\`\\`\\`\n\n---\n\n## Types\n\n### CameraStatus (interface, NOT an enum)\n\n\\`CameraStatus\\` is an **interface**, not an enum or string. Do NOT compare it directly to strings.\n\n\\`\\`\\`typescript\ninterface CameraStatus {\n state: CameraState; // Current camera state\n permission: PermissionStatus; // Current permission status\n isActive: boolean; // Whether preview is active\n isRecording: boolean; // Whether recording is in progress\n activeDevice: CameraDevice | null;\n error: CameraError | null;\n}\n\n// CameraState is a string union:\ntype CameraState = 'idle' | 'initializing' | 'ready' | 'recording' | 'capturing';\n\n// Check state like this:\nif (camera.status.state === 'ready') { /* ... */ }\nif (camera.status.permission === 'granted') { /* ... */ }\n\n// WRONG — do NOT compare CameraStatus directly to strings:\n// ❌ if (camera.status === 'not-determined')\n// ❌ if (camera.status === 'denied')\n\\`\\`\\`\n\n### PhotoResult\n\n\\`\\`\\`typescript\ninterface PhotoResult {\n uri: string; // File path (native) or Blob URL (web)\n width: number; // Image width in pixels\n height: number; // Image height in pixels\n size: number; // File size in bytes\n format: PhotoFormat; // 'jpeg' | 'png' | 'heic'\n metadata?: PhotoMetadata;\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n### VideoResult\n\n\\`\\`\\`typescript\ninterface VideoResult {\n uri: string; // File path or Blob URL\n duration: number; // Duration in ms\n width: number; // Video width in pixels\n height: number; // Video height in pixels\n size: number; // File size in bytes\n format: VideoFormat; // 'mp4' | 'mov'\n hasAudio: boolean;\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n### PhotoOptions\n\n\\`\\`\\`typescript\ninterface PhotoOptions {\n format?: PhotoFormat; // 'jpeg' | 'png' | 'heic' (default: 'jpeg')\n quality?: number; // 0-100 (default: 90)\n flash?: boolean; // Enable flash (default: false)\n skipSound?: boolean; // Skip shutter sound (native, default: false)\n}\n\\`\\`\\`\n\n### VideoOptions\n\n\\`\\`\\`typescript\ninterface VideoOptions {\n format?: VideoFormat; // 'mp4' | 'mov' (default: 'mp4')\n maxDuration?: number; // Max duration in seconds (0 = unlimited)\n audio?: boolean; // Enable audio (default: true)\n torch?: boolean; // Enable torch during recording (default: false)\n}\n\\`\\`\\`\n\n### CameraConfig\n\n\\`\\`\\`typescript\ntype CameraPosition = 'front' | 'back' | 'external';\ntype VideoQuality = 'low' | 'medium' | 'high' | '4k';\ntype PhotoQuality = 'low' | 'medium' | 'high' | 'maximum';\n\ninterface CameraConfig {\n position: CameraPosition; // Default: 'back'\n videoQuality: VideoQuality; // Default: 'high'\n photoQuality: PhotoQuality; // Default: 'high'\n resolution?: Resolution; // Target resolution (best effort)\n enableAudio: boolean; // Default: true\n torch: boolean; // Default: false\n zoom: number; // Default: 1.0\n autoFocus: boolean; // Default: true\n mirrorPreview?: boolean; // Default: auto based on position\n}\n\\`\\`\\`\n\n### PermissionResult\n\n\\`\\`\\`typescript\ntype PermissionStatus = 'granted' | 'denied' | 'undetermined' | 'blocked' | 'unavailable';\n\ninterface PermissionResult {\n camera: PermissionStatus;\n microphone: PermissionStatus;\n canAskAgain: boolean;\n}\n\\`\\`\\`\n\n### CameraError\n\n\\`\\`\\`typescript\ntype CameraErrorCode =\n | 'PERMISSION_DENIED' | 'PERMISSION_BLOCKED'\n | 'DEVICE_NOT_FOUND' | 'DEVICE_IN_USE' | 'NOT_SUPPORTED'\n | 'INITIALIZATION_FAILED' | 'CAPTURE_FAILED' | 'RECORDING_FAILED'\n | 'INVALID_CONFIG' | 'STORAGE_FULL' | 'UNKNOWN';\n\ninterface CameraError {\n code: CameraErrorCode;\n message: string;\n originalError?: Error;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://camera/examples\": `# @idealyst/camera — Examples\n\n## Photo Capture Screen\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Image, Text, IconButton } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\nimport type { PhotoResult } from '@idealyst/camera';\n\nfunction PhotoCaptureScreen() {\n const camera = useCamera({ autoRequestPermission: true, autoStart: true });\n const [photo, setPhoto] = useState<PhotoResult | null>(null);\n\n const handleCapture = async () => {\n const result = await camera.takePhoto({ format: 'jpeg', quality: 90 });\n setPhoto(result);\n };\n\n if (photo) {\n return (\n <View style={{ flex: 1 }}>\n <Image source={photo.uri} style={{ flex: 1 }} objectFit=\"contain\" />\n <View style={{ flexDirection: 'row', justifyContent: 'center' }} gap=\"md\" padding=\"md\">\n <Button onPress={() => setPhoto(null)} intent=\"secondary\">Retake</Button>\n <Button onPress={() => console.log('Save:', photo.uri)} intent=\"primary\">Use Photo</Button>\n </View>\n </View>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <View style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' }} padding=\"md\">\n <IconButton\n icon={camera.torchActive ? 'flash' : 'flash-off'}\n onPress={() => camera.setTorch(!camera.torchActive)}\n />\n <Button onPress={handleCapture} intent=\"primary\" size=\"lg\">\n Capture\n </Button>\n <IconButton\n icon=\"camera-flip\"\n onPress={() => camera.switchDevice(\n camera.activeDevice?.position === 'front' ? 'back' : 'front'\n )}\n />\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Video Recording\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { CameraPreview, useCamera } from '@idealyst/camera';\nimport type { VideoResult } from '@idealyst/camera';\n\nfunction VideoRecordingScreen() {\n const camera = useCamera({ autoRequestPermission: true, autoStart: true });\n const [video, setVideo] = useState<VideoResult | null>(null);\n\n const handleToggleRecording = async () => {\n if (camera.isRecording) {\n const result = await camera.stopRecording();\n setVideo(result);\n } else {\n await camera.startRecording({ format: 'mp4', audio: true });\n }\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n {camera.isRecording && (\n <Text style={{ position: 'absolute', top: 20, alignSelf: 'center', color: 'red' }}>\n REC {Math.round(camera.recordingDuration / 1000)}s\n </Text>\n )}\n <Button\n onPress={handleToggleRecording}\n intent={camera.isRecording ? 'danger' : 'primary'}\n >\n {camera.isRecording ? 'Stop Recording' : 'Record Video'}\n </Button>\n {video && <Text>Video saved: {video.uri} ({Math.round(video.duration / 1000)}s)</Text>}\n </View>\n );\n}\n\\`\\`\\`\n\n## Permission Handling\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useCamera, requestPermission } from '@idealyst/camera';\n\nfunction CameraWithPermissions() {\n const camera = useCamera();\n\n const handleRequestPermission = async () => {\n const result = await requestPermission();\n if (result.camera === 'granted') {\n await camera.start();\n }\n };\n\n if (camera.permission?.camera !== 'granted') {\n return (\n <View padding=\"lg\" gap=\"md\" style={{ alignItems: 'center' }}>\n <Text>Camera permission is required</Text>\n <Button onPress={handleRequestPermission} intent=\"primary\">\n Grant Permission\n </Button>\n </View>\n );\n }\n\n // ... render camera preview\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Files Package Guides\n *\n * Comprehensive documentation for @idealyst/files.\n * File picking, upload, and management.\n */\n\nexport const filesGuides: Record<string, string> = {\n \"idealyst://files/overview\": `# @idealyst/files\n\nCross-platform file picking and upload package.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/files\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ File API + Drag & Drop |\n| iOS | ✅ UIDocumentPicker + Photos |\n| Android | ✅ Storage Access Framework + MediaStore |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n useFilePicker, // Hook for file picking\n useFileUpload, // Hook for file upload queue\n FilePickerButton, // Pre-built picker button component\n DropZone, // Drag-and-drop zone component (web)\n UploadProgress, // Upload progress display component\n FILE_PICKER_PRESETS, // Pre-configured picker configs\n UPLOAD_PRESETS, // Pre-configured upload configs\n} from '@idealyst/files';\n\\`\\`\\`\n\n> **Common mistakes:**\n> - The method is \\`pick()\\`, NOT \\`pickFiles()\\`\n> - \\`FileType\\` values are: \\`'image' | 'video' | 'audio' | 'document' | 'archive' | 'any'\\` — NOT \\`'pdf'\\` or \\`'doc'\\`\n> - \\`PickedFile\\` has \\`uri\\`, \\`name\\`, \\`size\\`, \\`type\\`, \\`extension\\` — dimensions are in optional \\`dimensions?: { width, height }\\`, NOT top-level \\`width\\`/\\`height\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { View, Button, Text } from '@idealyst/components';\nimport { useFilePicker } from '@idealyst/files';\n\nfunction FilePicker() {\n const picker = useFilePicker({ config: { allowedTypes: ['image'], multiple: true } });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled) {\n console.log('Picked:', result.files.map(f => f.name));\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick}>Select Images</Button>\n {picker.files.map(file => (\n <Text key={file.id}>{file.name} ({Math.round(file.size / 1024)}KB)</Text>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://files/api\": `# @idealyst/files — API Reference\n\n## Hooks\n\n### useFilePicker(options?)\n\nFile picker hook.\n\n\\`\\`\\`typescript\ninterface UseFilePickerOptions {\n config?: Partial<FilePickerConfig>; // Default picker configuration\n autoRequestPermission?: boolean; // Auto-request permission on mount\n}\n\\`\\`\\`\n\n**Returns \\`UseFilePickerResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| status | FilePickerStatus | Current picker status |\n| isPicking | boolean | Whether picker is open |\n| permission | PermissionResult \\\\| null | Permission result |\n| error | FilePickerError \\\\| null | Current error |\n| files | PickedFile[] | Last picked files |\n| pick | (config?) => Promise<FilePickerResult> | **Open file picker** |\n| captureFromCamera | (options?) => Promise<FilePickerResult> | Open camera to capture |\n| clear | () => void | Clear picked files |\n| checkPermission | () => Promise<PermissionResult> | Check permission |\n| requestPermission | () => Promise<PermissionResult> | Request permission |\n| validateFiles | (files) => ValidationResult | Validate files against config |\n| pickerRef | RefObject<IFilePicker \\\\| null> | Picker instance ref |\n\n---\n\n### useFileUpload(options?)\n\nFile upload queue hook.\n\n\\`\\`\\`typescript\ninterface UseFileUploadOptions {\n config?: Partial<Omit<UploadConfig, 'url'>>; // Default upload config (url set per-upload)\n autoStart?: boolean; // Auto-start uploads when added\n concurrency?: number; // Max concurrent uploads\n}\n\\`\\`\\`\n\n**Returns \\`UseFileUploadResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| queueStatus | QueueStatus | Queue status (total, pending, uploading, completed, failed) |\n| uploads | UploadProgressInfo[] | All uploads as array |\n| isUploading | boolean | Whether any upload is in progress |\n| isPaused | boolean | Whether queue is paused |\n| hasFailedUploads | boolean | Whether there are failed uploads |\n| addFiles | (files, config: { url: string } & Partial\\<UploadConfig\\>) => string[] | Add files to queue. Only \\`url\\` is required — e.g., \\`addFiles(files, { url: 'https://...' })\\`. All other fields have defaults. |\n| start | () => void | Start processing queue |\n| pause | () => void | Pause all uploads |\n| resume | () => void | Resume paused uploads |\n| cancel | (uploadId) => void | Cancel specific upload |\n| cancelAll | () => void | Cancel all uploads |\n| retry | (uploadId) => void | Retry failed upload |\n| retryAll | () => void | Retry all failed uploads |\n| remove | (uploadId) => void | Remove upload from queue |\n| clearCompleted | () => void | Clear completed uploads |\n| getUpload | (uploadId) => UploadProgressInfo? | Get upload by ID |\n\n---\n\n## Components\n\n### FilePickerButton\n\nPre-built button that opens file picker on press.\n\n\\`\\`\\`typescript\ninterface FilePickerButtonProps {\n children?: ReactNode;\n pickerConfig?: Partial<FilePickerConfig>;\n onPick?: (result: FilePickerResult) => void;\n onError?: (error: FilePickerError) => void;\n disabled?: boolean;\n loading?: boolean;\n variant?: 'solid' | 'outline' | 'ghost';\n size?: Size;\n intent?: Intent;\n leftIcon?: string; // Material Design Icon name\n style?: StyleProp<ViewStyle>;\n}\n\\`\\`\\`\n\n### DropZone\n\nDrag-and-drop zone for file selection (web only, renders as pressable on native).\n\n\\`\\`\\`typescript\ninterface DropZoneProps {\n onDrop?: (files: PickedFile[]) => void;\n onReject?: (rejected: RejectedFile[]) => void;\n config?: Partial<FilePickerConfig>;\n children?: ReactNode | ((state: DropZoneState) => ReactNode);\n disabled?: boolean;\n style?: StyleProp<ViewStyle>;\n activeStyle?: StyleProp<ViewStyle>;\n rejectStyle?: StyleProp<ViewStyle>;\n}\n\\`\\`\\`\n\n### UploadProgress\n\nDisplays upload progress for a single file.\n\n\\`\\`\\`typescript\ninterface UploadProgressProps {\n upload: UploadProgressInfo;\n showFileName?: boolean;\n showFileSize?: boolean;\n showSpeed?: boolean;\n showETA?: boolean;\n showCancel?: boolean;\n showRetry?: boolean;\n onCancel?: () => void;\n onRetry?: () => void;\n variant?: 'linear' | 'circular';\n size?: Size;\n}\n\\`\\`\\`\n\n---\n\n## Types\n\n### FileType\n\n\\`\\`\\`typescript\ntype FileType = 'image' | 'video' | 'audio' | 'document' | 'archive' | 'any';\n\\`\\`\\`\n\n> **NOT** \\`'pdf'\\`, \\`'doc'\\`, \\`'xlsx'\\`, etc. Use \\`customMimeTypes\\` or \\`customExtensions\\` for specific formats.\n\n### PickedFile\n\n\\`\\`\\`typescript\ninterface PickedFile {\n id: string; // Unique identifier\n name: string; // Original file name\n size: number; // File size in bytes\n type: string; // MIME type\n uri: string; // File URI\n extension: string; // Extension without dot\n lastModified?: number; // Last modified timestamp\n dimensions?: { width: number; height: number }; // Image/video dimensions (optional)\n duration?: number; // Audio/video duration in ms (optional)\n thumbnailUri?: string; // Thumbnail URI (native only)\n getArrayBuffer(): Promise<ArrayBufferLike>;\n getData(): Promise<Blob | string>;\n}\n\\`\\`\\`\n\n> **Note:** \\`dimensions\\` is an optional nested object — NOT top-level \\`width\\`/\\`height\\` properties.\n\n### FilePickerConfig\n\n\\`\\`\\`typescript\ninterface FilePickerConfig {\n allowedTypes: FileType[]; // Default: ['any']\n customMimeTypes?: string[]; // Custom MIME types (overrides allowedTypes)\n customExtensions?: string[]; // Custom extensions (e.g., ['.json', '.csv'])\n multiple: boolean; // Allow multiple selection (default: false)\n maxFiles?: number; // Max files when multiple\n maxFileSize?: number; // Max file size in bytes\n maxTotalSize?: number; // Max total size for all files\n allowCamera?: boolean; // Allow camera capture (native, default: true)\n allowLibrary?: boolean; // Allow photo library (native, default: true)\n imageQuality?: number; // Camera image quality 0-100 (default: 80)\n maxImageDimensions?: { width: number; height: number };\n includeThumbnails?: boolean; // Include thumbnails (default: false)\n}\n\\`\\`\\`\n\n### UploadConfig\n\n\\`\\`\\`typescript\n// Only 'url' is required — all other fields have sensible defaults\ninterface UploadConfig {\n url: string; // Target URL (REQUIRED)\n method?: 'POST' | 'PUT' | 'PATCH'; // Default: 'POST'\n headers?: Record<string, string>;\n fieldName?: string; // Form field name (default: 'file')\n formData?: Record<string, string | number | boolean>;\n multipart?: boolean; // Default: true\n concurrency?: number; // Concurrent uploads (default: 3)\n timeout?: number; // Request timeout ms (default: 30000)\n retryEnabled?: boolean; // Default: true\n maxRetries?: number; // Default: 3\n retryDelay?: 'fixed' | 'exponential'; // Default: 'exponential'\n retryDelayMs?: number; // Default: 1000\n chunkedUpload?: boolean; // Default: false\n chunkSize?: number; // Default: 10MB\n chunkedUploadThreshold?: number; // Default: 50MB\n backgroundUpload?: boolean; // Native only (default: false)\n}\n\\`\\`\\`\n\n### UploadProgressInfo\n\n\\`\\`\\`typescript\ninterface UploadProgressInfo {\n id: string; // Upload ID\n file: PickedFile; // The file being uploaded\n state: UploadState; // 'pending' | 'uploading' | 'paused' | 'completed' | 'failed' | 'cancelled'\n bytesUploaded: number; // Bytes uploaded so far\n bytesTotal: number; // Total bytes to upload\n percentage: number; // Progress 0-100\n speed: number; // Upload speed in bytes/sec\n estimatedTimeRemaining: number; // ETA in ms (NOT 'eta')\n retryCount: number; // Number of retry attempts\n error?: UploadError; // Error if state is 'failed'\n config: UploadConfig; // Upload configuration used\n}\n\\`\\`\\`\n\n> **IMPORTANT:** The property is \\`state\\` (NOT \\`status\\`) and \\`percentage\\` (NOT \\`progress\\`).\n\n### FilePickerResult\n\n\\`\\`\\`typescript\ninterface FilePickerResult {\n cancelled: boolean;\n files: PickedFile[];\n rejected: RejectedFile[];\n error?: FilePickerError;\n}\n\\`\\`\\`\n\n### Presets\n\n\\`\\`\\`typescript\n// FILE_PICKER_PRESETS\nconst presets = {\n avatar: { allowedTypes: ['image'], multiple: false, maxFileSize: 5MB, ... },\n document: { allowedTypes: ['document'], multiple: false, ... },\n documents: { allowedTypes: ['document'], multiple: true, ... },\n image: { allowedTypes: ['image'], multiple: false, ... },\n images: { allowedTypes: ['image'], multiple: true, ... },\n video: { allowedTypes: ['video'], multiple: false, ... },\n files: { allowedTypes: ['any'], multiple: true, ... },\n};\n\n// UPLOAD_PRESETS\nconst uploadPresets = {\n simple: { concurrency: 1, ... },\n largeFile: { chunkedUpload: true, ... },\n background: { backgroundUpload: true, ... },\n reliable: { retryEnabled: true, maxRetries: 5, ... },\n};\n\\`\\`\\`\n`,\n\n \"idealyst://files/examples\": `# @idealyst/files — Examples\n\n## Basic File Picker\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, List } from '@idealyst/components';\nimport { useFilePicker } from '@idealyst/files';\n\nfunction DocumentPicker() {\n const picker = useFilePicker({\n config: { allowedTypes: ['document'], multiple: true, maxFiles: 5 },\n });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled) {\n console.log('Selected:', result.files.length, 'files');\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick} leftIcon=\"file-document-outline\">\n Select Documents\n </Button>\n <List>\n {picker.files.map(file => (\n <View key={file.id} style={{ flexDirection: 'row', justifyContent: 'space-between' }} padding=\"sm\">\n <Text>{file.name}</Text>\n <Text typography=\"caption\" color=\"secondary\">{Math.round(file.size / 1024)}KB</Text>\n </View>\n ))}\n </List>\n </View>\n );\n}\n\\`\\`\\`\n\n## Image Picker with Preview\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Image, Text } from '@idealyst/components';\nimport { useFilePicker, FILE_PICKER_PRESETS } from '@idealyst/files';\n\nfunction ImagePicker() {\n const picker = useFilePicker({ config: FILE_PICKER_PRESETS.images });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => picker.pick()} leftIcon=\"image-multiple\">\n Select Images\n </Button>\n <View style={{ flexDirection: 'row', flexWrap: 'wrap' }} gap=\"sm\">\n {picker.files.map(file => (\n <Image\n key={file.id}\n source={file.uri}\n style={{ width: 100, height: 100, borderRadius: 8 }}\n objectFit=\"cover\"\n />\n ))}\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## File Upload with UploadProgress (Recommended)\n\nUse the pre-built \\`UploadProgress\\` component for the best experience:\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Badge } from '@idealyst/components';\nimport { useFilePicker, useFileUpload, UploadProgress } from '@idealyst/files';\n\nfunction FileUploadScreen() {\n const picker = useFilePicker({ config: { allowedTypes: ['any'], multiple: true } });\n const uploader = useFileUpload({ concurrency: 2 });\n\n const handlePickAndUpload = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n uploader.addFiles(result.files, { url: 'https://api.example.com/upload' });\n uploader.start();\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePickAndUpload} leftIcon=\"upload\">\n Pick & Upload\n </Button>\n\n {/* Queue summary */}\n {uploader.uploads.length > 0 && (\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Badge intent=\"success\" type=\"filled\">{uploader.queueStatus.completed} done</Badge>\n <Badge intent=\"info\" type=\"filled\">{uploader.queueStatus.uploading} uploading</Badge>\n <Badge intent=\"neutral\" type=\"filled\">{uploader.queueStatus.pending} pending</Badge>\n </View>\n )}\n\n {/* Per-file progress — use the pre-built UploadProgress component */}\n {uploader.uploads.map(upload => (\n <UploadProgress\n key={upload.id}\n upload={upload}\n showFileName\n showFileSize\n showSpeed\n showCancel={upload.state === 'uploading'}\n showRetry={upload.state === 'failed'}\n onCancel={() => uploader.cancel(upload.id)}\n onRetry={() => uploader.retry(upload.id)}\n />\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Manual Upload Progress (Custom UI)\n\nIf you need custom upload UI, use the \\`upload.state\\` and \\`upload.percentage\\` properties:\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Button, Text, Progress } from '@idealyst/components';\nimport { useFilePicker, useFileUpload } from '@idealyst/files';\n\nfunction CustomUploadUI() {\n const picker = useFilePicker({ config: { allowedTypes: ['any'], multiple: true } });\n const uploader = useFileUpload({ autoStart: true, concurrency: 2 });\n\n const handlePick = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n uploader.addFiles(result.files, { url: 'https://api.example.com/upload' });\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={handlePick} leftIcon=\"upload\">Pick & Upload</Button>\n {uploader.uploads.map(upload => (\n <View key={upload.id} gap=\"xs\">\n <Text typography=\"body2\" weight=\"medium\">{upload.file.name}</Text>\n <Progress\n type=\"linear\"\n value={upload.percentage}\n intent={upload.state === 'completed' ? 'success' : upload.state === 'failed' ? 'danger' : 'info'}\n />\n <Text typography=\"caption\" color=\"secondary\">\n {upload.state} — {upload.percentage}%\n </Text>\n </View>\n ))}\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom MIME Types\n\n\\`\\`\\`tsx\n// Pick specific file types using customMimeTypes\nconst picker = useFilePicker({\n config: {\n allowedTypes: ['document'], // Base category\n customMimeTypes: [\n 'application/pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/csv',\n ],\n customExtensions: ['.pdf', '.docx', '.csv'],\n },\n});\n\\`\\`\\`\n\n## Drop Zone (Web)\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { DropZone } from '@idealyst/files';\n\nfunction FileDropArea() {\n return (\n <DropZone\n config={{ allowedTypes: ['image'], maxFileSize: 10 * 1024 * 1024 }}\n onDrop={(files) => console.log('Dropped:', files)}\n onReject={(rejected) => console.log('Rejected:', rejected)}\n >\n {(state) => (\n <View\n padding=\"xl\"\n style={{ alignItems: 'center' }}\n border={state.isDragActive ? 'thick' : 'thin'}\n >\n <Text>{state.isDragActive ? 'Drop files here' : 'Drag files here or click to browse'}</Text>\n </View>\n )}\n </DropZone>\n );\n}\n\\`\\`\\`\n\n## Pre-built FilePickerButton\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { FilePickerButton } from '@idealyst/files';\n\nfunction SimpleUpload() {\n return (\n <FilePickerButton\n pickerConfig={{ allowedTypes: ['image'], multiple: false }}\n onPick={(result) => {\n if (!result.cancelled) {\n console.log('File:', result.files[0]?.name);\n }\n }}\n onError={(error) => console.error('Picker error:', error)}\n intent=\"primary\"\n leftIcon=\"image\"\n >\n Upload Photo\n </FilePickerButton>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * OAuth Client Package Guides\n *\n * Comprehensive documentation for @idealyst/oauth-client.\n */\n\nexport const oauthClientGuides: Record<string, string> = {\n \"idealyst://oauth-client/overview\": `# @idealyst/oauth-client\n\nCross-platform OAuth2 client with a simple, generic API.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/oauth-client\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Popup/redirect flow |\n| iOS | ✅ ASWebAuthenticationSession |\n| Android | ✅ Custom Tabs |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { createOAuthClient } from '@idealyst/oauth-client';\nimport type { OAuthConfig, OAuthResult, OAuthCallbackParams } from '@idealyst/oauth-client';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: 'https://api.yourapp.com/auth/google',\n redirectUrl: 'com.yourapp://oauth/callback',\n});\n\n// In your component:\nconst handleLogin = async () => {\n try {\n const result = await googleAuth.authorize();\n console.log('Auth code:', result.code);\n } catch (error) {\n console.error('Auth failed:', error);\n }\n};\n\\`\\`\\`\n`,\n\n \"idealyst://oauth-client/api\": `# @idealyst/oauth-client — API Reference\n\n## createOAuthClient(config)\n\nFactory function to create an OAuth client.\n\n\\`\\`\\`typescript\nfunction createOAuthClient<T = OAuthResult>(config: OAuthConfig<T>): OAuthClient<T>;\n\\`\\`\\`\n\n### OAuthConfig<T>\n\n\\`\\`\\`typescript\ninterface OAuthConfig<T = OAuthResult> {\n /** OAuth endpoint URL (your server's OAuth initiation endpoint) */\n oauthUrl: string;\n\n /** Redirect URL for the client app (e.g., \"com.yourapp://oauth/callback\") */\n redirectUrl: string;\n\n /** Additional query parameters to send to OAuth endpoint */\n additionalParameters?: Record<string, string>;\n\n /**\n * Transform raw callback params to desired type.\n * If not provided, extracts code + state from callback params.\n */\n transformCallback?: (params: OAuthCallbackParams) => T;\n}\n\\`\\`\\`\n\n### OAuthClient<T>\n\n\\`\\`\\`typescript\ninterface OAuthClient<T = OAuthResult> {\n /** Initiate OAuth flow. Opens browser/webview, returns result on completion. */\n authorize(): Promise<T>;\n}\n\\`\\`\\`\n\n### OAuthResult (default)\n\n\\`\\`\\`typescript\ninterface OAuthResult {\n code: string; // Authorization code\n state?: string; // CSRF state token\n}\n\\`\\`\\`\n\n### OAuthCallbackParams\n\n\\`\\`\\`typescript\ntype OAuthCallbackParams = Record<string, string | undefined>;\n\\`\\`\\`\n\nAll query parameters from the OAuth redirect are available here.\n`,\n\n \"idealyst://oauth-client/examples\": `# @idealyst/oauth-client — Examples\n\n## Basic Google OAuth\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: 'https://api.yourapp.com/auth/google',\n redirectUrl: 'com.yourapp://oauth/callback',\n});\n\nfunction LoginScreen() {\n const [loading, setLoading] = useState(false);\n\n const handleGoogleLogin = async () => {\n setLoading(true);\n try {\n const result = await googleAuth.authorize();\n // Send result.code to your backend to exchange for tokens\n console.log('Authorization code:', result.code);\n } catch (error) {\n console.error('Login failed:', error);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <View padding=\"lg\" gap=\"md\">\n <Button\n onPress={handleGoogleLogin}\n intent=\"primary\"\n loading={loading}\n leftIcon=\"google\"\n >\n Sign in with Google\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Callback Transform\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\ninterface CustomAuthResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\n// Some OAuth servers return tokens directly in the callback\nconst auth = createOAuthClient<CustomAuthResult>({\n oauthUrl: 'https://api.yourapp.com/auth/provider',\n redirectUrl: 'com.yourapp://oauth/callback',\n additionalParameters: {\n response_type: 'token',\n scope: 'openid profile email',\n },\n transformCallback: (params) => ({\n accessToken: params.access_token || '',\n refreshToken: params.refresh_token || '',\n expiresIn: parseInt(params.expires_in || '3600', 10),\n }),\n});\n\\`\\`\\`\n\n## Multiple Providers\n\n\\`\\`\\`tsx\nimport { createOAuthClient } from '@idealyst/oauth-client';\nimport { config } from '@idealyst/config';\n\nconst REDIRECT_URL = config.getRequired('OAUTH_REDIRECT_URL');\n\nconst googleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/google',\n redirectUrl: REDIRECT_URL,\n});\n\nconst appleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/apple',\n redirectUrl: REDIRECT_URL,\n});\n\nconst githubAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/github',\n redirectUrl: REDIRECT_URL,\n});\n\n// Use in component:\nfunction SocialLogin() {\n return (\n <View gap=\"sm\">\n <Button onPress={() => googleAuth.authorize()} leftIcon=\"google\">Google</Button>\n <Button onPress={() => appleAuth.authorize()} leftIcon=\"apple\">Apple</Button>\n <Button onPress={() => githubAuth.authorize()} leftIcon=\"github\">GitHub</Button>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Animate Package Guides\n *\n * Comprehensive documentation for @idealyst/animate.\n */\n\nexport const animateGuides: Record<string, string> = {\n \"idealyst://animate/overview\": `# @idealyst/animate\n\nCross-platform animation hooks using CSS transitions (web) and Reanimated (native).\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/animate\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ CSS Transitions / Animations |\n| iOS | ✅ react-native-reanimated |\n| Android | ✅ react-native-reanimated |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n useAnimatedStyle, // Animate style changes\n useAnimatedValue, // Animated numeric value with interpolation\n usePresence, // Enter/exit animations\n useGradientBorder, // Animated gradient borders\n withAnimated, // HOC to wrap any component for animation\n} from '@idealyst/animate';\n\\`\\`\\`\n\n> **There is NO \\`useSequence\\` or \\`useKeyframes\\` export.** For multi-step animations, chain \\`useAnimatedStyle\\` calls with state changes. For looping animations, use \\`useAnimatedValue\\` with repeated \\`set()\\` calls.\n\n## Easing Values\n\nEasing values use **camelCase** (NOT CSS hyphenated format). Available values:\n\\`\\`\\`\n'ease' | 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' |\n'spring' | 'standard' | 'accelerate' | 'decelerate' |\n'springStiff' | 'springBouncy'\n\\`\\`\\`\n> **IMPORTANT:** Use \\`'easeOut'\\` — NOT \\`'ease-out'\\`. All easing values are camelCase.\n\n## Key Concepts\n\n1. **Theme integration** — Duration and easing values come from \\`@idealyst/theme/animation\\`\n2. **Transform syntax** — Simplified object syntax: \\`{ x: 10, y: 20, scale: 1.2 }\\` instead of arrays\n3. **Platform overrides** — Customize animation behavior per-platform\n4. **GPU-accelerated** — Prefers opacity + transform for best performance\n`,\n\n \"idealyst://animate/api\": `# @idealyst/animate — API Reference\n\n## Available Exports (COMPLETE LIST)\n\n\\`\\`\\`typescript\nimport {\n useAnimatedStyle, // Animate style changes\n useAnimatedValue, // Animated numeric value with interpolation\n usePresence, // Enter/exit animations\n useGradientBorder, // Animated gradient borders\n withAnimated, // HOC to wrap any component for animation\n} from '@idealyst/animate';\n\\`\\`\\`\n\n> **There are exactly 5 exports.** There is NO \\`useSequence\\`, \\`useKeyframes\\`, \\`useSpring\\`, or \\`useTransition\\`.\n> For multi-step animations, use \\`useAnimatedStyle\\` with state changes. For looping, use \\`useAnimatedValue\\` with repeated \\`set()\\` calls.\n\n## Easing Values (EXACT string literals)\n\nEasing values are **camelCase** — NOT CSS kebab-case. Using \\`'ease-out'\\` will cause a TypeScript error.\n\n| Valid (use these) | INVALID (do NOT use) |\n|---|---|\n| \\`'easeOut'\\` | ~~\\`'ease-out'\\`~~ |\n| \\`'easeIn'\\` | ~~\\`'ease-in'\\`~~ |\n| \\`'easeInOut'\\` | ~~\\`'ease-in-out'\\`~~ |\n\nAll valid easing values:\n\\`\\`\\`typescript\ntype EasingKey = 'ease' | 'linear' | 'easeIn' | 'easeOut' | 'easeInOut'\n | 'spring' | 'standard' | 'accelerate' | 'decelerate'\n | 'springStiff' | 'springBouncy';\n\\`\\`\\`\n\n---\n\n## Hooks\n\n### useAnimatedStyle(style, options?)\n\nAnimate any style property changes. Returns an animated style object.\n\n\\`\\`\\`typescript\ninterface AnimationOptions {\n duration?: Duration; // ms or theme token key\n easing?: EasingKey; // Theme easing key\n delay?: number; // Delay before animation (ms)\n}\n\ninterface UseAnimatedStyleOptions extends AnimationOptions {\n web?: AnimationOptions & { transition?: string }; // Web overrides\n native?: AnimationOptions & { useSpring?: boolean; springType?: SpringType }; // Native overrides\n}\n\\`\\`\\`\n\n**How it works:** The hook watches the style object for changes. When any value changes (e.g., opacity goes from 0 to 1), it animates the transition. On mount, the initial values are applied immediately without animation. To create entrance animations, use \\`usePresence\\` instead, or toggle state after mount with \\`useEffect\\`.\n\n**Usage:**\n\\`\\`\\`tsx\n// Reactive: style changes animate automatically\nconst style = useAnimatedStyle(\n { opacity: isVisible ? 1 : 0, transform: { y: isVisible ? 0 : 20 } },\n { duration: 300, easing: 'easeOut' }\n);\n// Apply: <View style={style} />\n\n// Entrance animation pattern: start hidden, toggle after mount\nconst [ready, setReady] = useState(false);\nuseEffect(() => { setReady(true); }, []);\nconst entranceStyle = useAnimatedStyle(\n { opacity: ready ? 1 : 0, transform: { y: ready ? 0 : 20 } },\n { duration: 400, easing: 'easeOut' }\n);\n\\`\\`\\`\n\n---\n\n### useAnimatedValue(initialValue: number)\n\nCreate an animated numeric value with interpolation support. Best for **continuous/looping** animations where you control timing with \\`set()\\` calls.\n\n> **REQUIRED:** The \\`initialValue\\` argument is mandatory. Calling \\`useAnimatedValue()\\` without an argument causes TS2554. Always pass an initial number: \\`useAnimatedValue(0)\\` or \\`useAnimatedValue(1)\\`.\n\n**Returns \\`AnimatedValue\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| value | number (readonly) | Current snapshot (NOT a live binding) |\n| set | (target, options?) => void | Animate to target value |\n| setImmediate | (target) => void | Set value without animation |\n| interpolate | (config) => T | Interpolate to another range |\n\n> **WARNING:** \\`animatedValue.value\\` is a plain number snapshot. Do NOT use it directly in inline styles — it will not update during animation. Instead, use \\`useAnimatedStyle\\` with state for reactive animations, or use \\`interpolate()\\` for derived animated values.\n\n\\`\\`\\`tsx\n// WRONG: pulse.value is a snapshot, not a live animated binding\n// <View style={{ transform: { scale: pulse.value } }} /> // Will NOT animate\n\n// CORRECT: Use useAnimatedStyle with state for pulsing animations\nconst [scale, setScale] = useState(1);\nconst style = useAnimatedStyle(\n { transform: { scale } },\n { duration: 600, easing: 'easeInOut' }\n);\n// Then toggle: setScale(1.3) / setScale(1) in setInterval\n\n// CORRECT: Use useAnimatedValue for interpolation\nconst progress = useAnimatedValue(0);\n// progress.set(1, { duration: 1000 }); // animate 0 -> 1\n// const opacity = progress.interpolate({ inputRange: [0, 1], outputRange: [0.5, 1] });\n\\`\\`\\`\n\n\\`\\`\\`typescript\ninterface InterpolationConfig<T> {\n inputRange: number[];\n outputRange: T[];\n extrapolate?: 'extend' | 'clamp' | 'identity';\n}\n\\`\\`\\`\n\n---\n\n### usePresence(isPresent, options)\n\nEnter/exit animations for conditional rendering.\n\n\\`\\`\\`typescript\ninterface UsePresenceOptions extends AnimationOptions {\n enter: AnimatableProperties; // Style when entering/visible\n exit: AnimatableProperties; // Style when exiting/hidden\n initial?: AnimatableProperties; // Initial style (defaults to exit)\n}\n\\`\\`\\`\n\n**Returns \\`UsePresenceResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| isPresent | boolean | Whether element should be rendered |\n| style | AnimatableStyle | Animated style |\n| exit | () => void | Trigger exit animation manually |\n\n---\n\n### useGradientBorder(options)\n\nAnimated gradient borders.\n\n\\`\\`\\`typescript\ninterface UseGradientBorderOptions {\n colors: string[]; // Gradient colors\n borderWidth?: number; // Border width in px\n borderRadius?: number; // Border radius in px\n duration?: Duration; // Animation duration\n animation?: 'spin' | 'pulse' | 'wave'; // Animation type\n active?: boolean; // Whether active\n}\n\\`\\`\\`\n\n**Returns \\`UseGradientBorderResult\\`:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| containerStyle | AnimatableStyle | Style for outer container |\n| contentStyle | AnimatableStyle | Style for inner content |\n| isReady | boolean | Whether gradient CSS injected (web) |\n\n---\n\n## Import Checklist (copy this pattern)\n\nWhen writing animation code, start with this import and ONLY use these hooks:\n\n\\`\\`\\`tsx\n// CORRECT — the ONLY available imports from @idealyst/animate\nimport { useAnimatedStyle, useAnimatedValue, usePresence, useGradientBorder, withAnimated } from '@idealyst/animate';\n\n// WRONG — these do NOT exist and will cause TS2305 errors:\n// import { useSequence } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useKeyframes } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useSpring } from '@idealyst/animate'; // DOES NOT EXIST\n// import { useTransition } from '@idealyst/animate'; // DOES NOT EXIST\n\\`\\`\\`\n\n**How to achieve common patterns WITHOUT the non-existent hooks:**\n- **Sequence/multi-step**: Use \\`useAnimatedStyle\\` + \\`setTimeout\\` to change state at each step\n- **Keyframes/looping**: Use \\`useAnimatedValue\\` + \\`setInterval\\` to call \\`.set()\\` repeatedly\n- **Spring**: Use \\`useAnimatedStyle\\` with \\`easing: 'spring'\\` or \\`easing: 'springBouncy'\\`\n\n---\n\n## Animatable Properties\n\nOnly certain CSS properties animate smoothly. Stick to these for best results:\n\n| Animatable | NOT animatable (avoid in useAnimatedStyle) |\n|---|---|\n| \\`opacity\\` | \\`overflow\\` |\n| \\`transform\\` (x, y, scale, rotate) | \\`display\\` |\n| \\`backgroundColor\\` | \\`position\\` |\n| \\`borderColor\\` | \\`zIndex\\` |\n| \\`maxHeight\\` (use for expand/collapse) | \\`pointerEvents\\` |\n| \\`width\\`, \\`height\\` | \\`justifyContent\\`, \\`alignItems\\` |\n| \\`borderRadius\\` | \\`flexDirection\\` |\n| \\`padding\\`, \\`margin\\` | |\n\nFor expand/collapse, animate \\`opacity\\` + \\`maxHeight\\` together. Do NOT include \\`overflow: 'hidden'\\` inside the animated style object — set it as a static style on the parent View instead.\n\n---\n\n## Transform Syntax\n\nUse simplified object syntax instead of React Native arrays:\n\n\\`\\`\\`typescript\n// Recommended: object syntax\ntransform: { x: 10, y: 20, scale: 1.2, rotate: 45 }\n\n// Legacy: array syntax (still supported)\ntransform: [{ translateX: 10 }, { translateY: 20 }, { scale: 1.2 }]\n\\`\\`\\`\n\n| Property | Type | Maps to |\n|----------|------|---------|\n| x | number | translateX |\n| y | number | translateY |\n| scale | number | scale |\n| scaleX | number | scaleX |\n| scaleY | number | scaleY |\n| rotate | number \\\\| string | rotate |\n| rotateX | string | rotateX |\n| rotateY | string | rotateY |\n| skewX | string | skewX |\n| skewY | string | skewY |\n| perspective | number | perspective |\n`,\n\n \"idealyst://animate/examples\": `# @idealyst/animate — Examples\n\n> **STOP — Before writing animation code, verify your imports and these critical rules.**\n> The ONLY hooks exported from \\`@idealyst/animate\\` are: \\`useAnimatedStyle\\`, \\`useAnimatedValue\\`, \\`usePresence\\`, \\`useGradientBorder\\`, \\`withAnimated\\`.\n> There is NO \\`useSequence\\`, \\`useKeyframes\\`, \\`useSpring\\`, or \\`useTransition\\`.\n> Easing values are camelCase: \\`'easeOut'\\`, NOT \\`'ease-out'\\`.\n> \\`useAnimatedValue\\` REQUIRES an initial number argument: \\`useAnimatedValue(0)\\` — calling \\`useAnimatedValue()\\` without arguments causes TS2554.\n> \\`useRef\\` REQUIRES an initial argument in React 19: \\`useRef<T | null>(null)\\` — writing \\`useRef<T>()\\` causes TS2554.\n> For expand/collapse: NEVER use \\`{condition && <View style={animStyle}>}\\` — this destroys the element before exit animations run. Always render the element and animate opacity/maxHeight.\n\n## Fade In/Out\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction FadeExample() {\n const [visible, setVisible] = useState(true);\n\n const style = useAnimatedStyle(\n { opacity: visible ? 1 : 0, transform: { y: visible ? 0 : -10 } },\n { duration: 300, easing: 'easeOut' }\n );\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => setVisible(!visible)}>Toggle</Button>\n <View style={style}>\n <Text>Hello, animated world!</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Animated Counter\n\n\\`\\`\\`tsx\nimport React, { useState, useCallback } from 'react';\nimport { View, Button, Text } from '@idealyst/components';\nimport { useAnimatedValue } from '@idealyst/animate';\n\nfunction AnimatedCounter() {\n const [count, setCount] = useState(0);\n const animValue = useAnimatedValue(0);\n\n const increment = useCallback(() => {\n const next = count + 1;\n setCount(next);\n animValue.set(next, { duration: 500, easing: 'easeOut' });\n }, [count]);\n\n const color = animValue.interpolate({\n inputRange: [0, 5, 10],\n outputRange: ['#4CAF50', '#FFC107', '#F44336'],\n extrapolate: 'clamp',\n });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Text style={{ fontSize: 48, color }}>\n {count}\n </Text>\n <Button onPress={increment}>Increment</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Bounce / Sequence Animation (NO useSequence — use state + setTimeout)\n\n> **There is no \\`useSequence\\` hook.** For multi-step animations, change state with \\`setTimeout\\` and let \\`useAnimatedStyle\\` animate each change.\n\n\\`\\`\\`tsx\nimport React, { useState, useCallback } from 'react';\nimport { View, Button } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction BounceExample() {\n const [scale, setScale] = useState(1);\n\n const style = useAnimatedStyle(\n { transform: { scale } },\n { duration: 200, easing: 'easeOut' }\n );\n\n // Sequence: scale up -> overshoot -> settle. Just change state at each step.\n const bounce = useCallback(() => {\n setScale(1.2);\n setTimeout(() => setScale(0.9), 200);\n setTimeout(() => setScale(1), 350);\n }, []);\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ alignItems: 'center' }}>\n <View style={[{ width: 100, height: 100, backgroundColor: '#4CAF50', borderRadius: 12 }, style]} />\n <Button onPress={bounce}>Bounce</Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Enter/Exit with usePresence\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Card, Text } from '@idealyst/components';\nimport { usePresence } from '@idealyst/animate';\n\nfunction PresenceExample() {\n const [show, setShow] = useState(false);\n const { isPresent, style } = usePresence(show, {\n enter: { opacity: 1, transform: { y: 0, scale: 1 } },\n exit: { opacity: 0, transform: { y: -20, scale: 0.95 } },\n duration: 250,\n easing: 'easeOut',\n });\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Button onPress={() => setShow(!show)}>\n {show ? 'Hide' : 'Show'} Card\n </Button>\n {isPresent && (\n <Card style={style} padding=\"md\">\n <Text>Animated card content</Text>\n </Card>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Pulsing / Looping / Keyframe-like Animation (NO useKeyframes — use useAnimatedValue + setInterval)\n\n> **There is no \\`useKeyframes\\` hook.** For continuous/looping animations, use \\`useAnimatedValue\\` with \\`setInterval\\` to repeatedly call \\`.set()\\`.\n\n\\`\\`\\`tsx\nimport React, { useState, useEffect, useRef } from 'react';\nimport { View } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction PulseAnimation() {\n const [scale, setScale] = useState(1);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const animStyle = useAnimatedStyle(\n { transform: { scale } },\n { duration: 500, easing: 'easeInOut' }\n );\n\n useEffect(() => {\n let growing = true;\n intervalRef.current = setInterval(() => {\n setScale(growing ? 1.1 : 1);\n growing = !growing;\n }, 500);\n return () => clearInterval(intervalRef.current!);\n }, []);\n\n return (\n <View padding=\"md\" style={{ alignItems: 'center' }}>\n <View\n style={[{\n width: 80,\n height: 80,\n borderRadius: 40,\n backgroundColor: '#2196F3',\n }, animStyle]}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Expand / Collapse (animate height + opacity — do NOT use conditional rendering)\n\n> **Do NOT use \\`{expanded && <View style={animStyle}>...}</View>}\\`** — conditional rendering removes the element before the exit animation runs. Instead, always render the content and animate its height/opacity.\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Button, Text, Card, Pressable, Icon } from '@idealyst/components';\nimport { useAnimatedStyle } from '@idealyst/animate';\n\nfunction ExpandableSection({ title, children }: { title: string; children: React.ReactNode }) {\n const [expanded, setExpanded] = useState(false);\n\n // Animate opacity + maxHeight. overflow is NOT animatable — set it as a static style.\n const contentStyle = useAnimatedStyle(\n {\n opacity: expanded ? 1 : 0,\n maxHeight: expanded ? 500 : 0,\n },\n { duration: 300, easing: 'easeOut' }\n );\n\n const iconStyle = useAnimatedStyle(\n { transform: { rotate: expanded ? 180 : 0 } },\n { duration: 200, easing: 'easeOut' }\n );\n\n return (\n <Card>\n <Pressable onPress={() => setExpanded(!expanded)}>\n <View padding=\"md\" style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>\n <Text typography=\"subtitle1\" weight=\"bold\">{title}</Text>\n <View style={iconStyle}>\n <Icon name=\"chevron-down\" />\n </View>\n </View>\n </Pressable>\n {/* Always render — animate opacity + maxHeight instead of conditional rendering */}\n <View style={[{ overflow: 'hidden' }, contentStyle]} padding=\"md\" paddingVertical=\"sm\">\n {children}\n </View>\n </Card>\n );\n}\n\\`\\`\\`\n\n## useRef in React 19\n\n> **React 19 requires an initial argument for useRef.** Writing \\`useRef<T>()\\` causes TS2554. Always pass an initial value.\n\n\\`\\`\\`typescript\n// CORRECT\nconst intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\nconst countRef = useRef<number>(0);\nconst lottieRef = useRef<LottieRef>(null);\n\n// WRONG — TS2554: Expected 1 arguments, but got 0\n// const intervalRef = useRef<ReturnType<typeof setInterval>>();\n// const countRef = useRef<number>();\n\\`\\`\\`\n\n## Gradient Border\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { useGradientBorder } from '@idealyst/animate';\n\nfunction GradientBorderCard() {\n const { containerStyle, contentStyle } = useGradientBorder({\n colors: ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96E6A1'],\n borderWidth: 2,\n borderRadius: 12,\n animation: 'spin',\n duration: 3000,\n active: true,\n });\n\n return (\n <View style={containerStyle}>\n <View style={[contentStyle, { padding: 20 }]}>\n <Text>Content with animated gradient border</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * DataGrid Package Guides\n *\n * Comprehensive documentation for @idealyst/datagrid.\n * Virtualized data grid for tabular data display.\n */\n\nexport const datagridGuides: Record<string, string> = {\n \"idealyst://datagrid/overview\": `# @idealyst/datagrid\n\nHigh-performance, virtualized data grid for displaying tabular data.\n\n> **Note:** DataGrid is for structured tabular data with columns. For general lists, use the \\`List\\` component from \\`@idealyst/components\\` with \\`children\\`.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/datagrid\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Virtualized scrolling |\n| iOS | ✅ Virtualized scrolling |\n| Android | ✅ Virtualized scrolling |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column, DataGridProps } from '@idealyst/datagrid';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface User {\n id: number;\n name: string;\n email: string;\n role: string;\n}\n\nconst columns: Column<User>[] = [\n { key: 'name', header: 'Name', width: 200 },\n { key: 'email', header: 'Email', width: 250 },\n { key: 'role', header: 'Role', width: 120 },\n];\n\nfunction UserTable({ users }: { users: User[] }) {\n return (\n <DataGrid\n data={users}\n columns={columns}\n rowHeight={48}\n headerHeight={52}\n virtualized\n stickyHeader\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datagrid/api\": `# @idealyst/datagrid — API Reference\n\n## DataGrid<T>\n\nThe main data grid component.\n\n### DataGridProps<T>\n\n\\`\\`\\`typescript\ninterface DataGridProps<T = any> {\n /** Array of data objects */\n data: T[];\n\n /** Column definitions */\n columns: Column<T>[];\n\n /** Row height in pixels (default varies by platform) */\n rowHeight?: number;\n\n /** Header row height in pixels */\n headerHeight?: number;\n\n /** Callback when a row is clicked/pressed */\n onRowClick?: (row: T, index: number) => void;\n\n /** Callback when a column header is clicked for sorting */\n onSort?: (column: Column<T>, direction: 'asc' | 'desc') => void;\n\n /** Callback when a column is resized */\n onColumnResize?: (columnKey: string, width: number) => void;\n\n /** Resize mode: 'indicator' (default) or 'live' */\n columnResizeMode?: 'indicator' | 'live';\n\n /** Enable virtualized scrolling for large datasets */\n virtualized?: boolean;\n\n /** Grid height (required for virtualization) */\n height?: number | string;\n\n /** Grid width */\n width?: number | string;\n\n /** Container style */\n style?: ViewStyle;\n\n /** Header row style */\n headerStyle?: ViewStyle;\n\n /** Default cell style */\n cellStyle?: ViewStyle;\n\n /** Row style — static or dynamic based on row data */\n rowStyle?: ViewStyle | ((row: T, index: number) => ViewStyle);\n\n /** Indices of selected rows */\n selectedRows?: number[];\n\n /** Callback when selection changes */\n onSelectionChange?: (selectedRows: number[]) => void;\n\n /** Enable multi-row selection */\n multiSelect?: boolean;\n\n /** Stick header to top when scrolling */\n stickyHeader?: boolean;\n}\n\\`\\`\\`\n\n### Column<T>\n\n\\`\\`\\`typescript\ninterface Column<T = any> {\n /** Unique column key (also used as data accessor if no accessor fn) */\n key: string;\n\n /** Column header text */\n header: string;\n\n /** Fixed column width in pixels */\n width?: number;\n\n /** Minimum column width */\n minWidth?: number;\n\n /** Maximum column width */\n maxWidth?: number;\n\n /** Allow column resizing */\n resizable?: boolean;\n\n /** Allow sorting by this column */\n sortable?: boolean;\n\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n\n /** Custom data accessor function */\n accessor?: (row: T) => any;\n\n /** Custom cell renderer */\n render?: (value: any, row: T, index: number) => React.ReactNode;\n\n /** Custom header renderer (overrides header string) */\n renderHeader?: () => React.ReactNode;\n\n /** Header cell style */\n headerStyle?: ViewStyle;\n\n /** Cell style — static or dynamic */\n cellStyle?: ViewStyle | ((value: any, row: T) => ViewStyle);\n}\n\\`\\`\\`\n\n### Sub-components\n\n\\`\\`\\`typescript\ninterface CellProps {\n children: React.ReactNode;\n style?: ViewStyle;\n width?: number;\n onPress?: () => void;\n}\n\ninterface RowProps {\n children: React.ReactNode;\n style?: ViewStyle;\n onPress?: () => void;\n selected?: boolean;\n}\n\ninterface HeaderCellProps {\n children: React.ReactNode;\n style?: ViewStyle;\n width?: number;\n sortable?: boolean;\n sortDirection?: 'asc' | 'desc' | null;\n onSort?: () => void;\n resizable?: boolean;\n onResize?: (width: number) => void;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datagrid/examples\": `# @idealyst/datagrid — Examples\n\n## Basic Table\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface Product {\n id: number;\n name: string;\n price: number;\n category: string;\n stock: number;\n}\n\nconst columns: Column<Product>[] = [\n { key: 'name', header: 'Product Name', width: 200 },\n { key: 'category', header: 'Category', width: 150 },\n {\n key: 'price',\n header: 'Price',\n width: 100,\n align: 'right',\n render: (value) => \\`$\\${value.toFixed(2)}\\`,\n },\n {\n key: 'stock',\n header: 'Stock',\n width: 80,\n align: 'center',\n cellStyle: (value) => ({\n color: value < 10 ? 'red' : 'green',\n }),\n },\n];\n\nfunction ProductTable({ products }: { products: Product[] }) {\n return <DataGrid data={products} columns={columns} />;\n}\n\\`\\`\\`\n\n## Sortable with Selection\n\n\\`\\`\\`tsx\nimport React, { useState, useMemo } from 'react';\nimport { View, Text, Button } from '@idealyst/components';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface Employee {\n id: number;\n name: string;\n department: string;\n salary: number;\n}\n\nfunction EmployeeGrid({ employees }: { employees: Employee[] }) {\n const [selectedRows, setSelectedRows] = useState<number[]>([]);\n const [sortColumn, setSortColumn] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc');\n\n const sortedData = useMemo(() => {\n if (!sortColumn) return employees;\n return [...employees].sort((a, b) => {\n const aVal = a[sortColumn as keyof Employee];\n const bVal = b[sortColumn as keyof Employee];\n const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n return sortDirection === 'asc' ? cmp : -cmp;\n });\n }, [employees, sortColumn, sortDirection]);\n\n const columns: Column<Employee>[] = [\n { key: 'name', header: 'Name', width: 200, sortable: true },\n { key: 'department', header: 'Department', width: 150, sortable: true },\n {\n key: 'salary',\n header: 'Salary',\n width: 120,\n align: 'right',\n sortable: true,\n render: (value) => \\`$\\${value.toLocaleString()}\\`,\n },\n ];\n\n return (\n <View gap=\"md\">\n <DataGrid\n data={sortedData}\n columns={columns}\n rowHeight={48}\n headerHeight={52}\n virtualized\n height={400}\n stickyHeader\n selectedRows={selectedRows}\n onSelectionChange={setSelectedRows}\n multiSelect\n onSort={(col, dir) => {\n setSortColumn(col.key);\n setSortDirection(dir);\n }}\n onRowClick={(row) => console.log('Clicked:', row.name)}\n />\n <Text>{selectedRows.length} rows selected</Text>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Cell Rendering\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text, Badge, Avatar } from '@idealyst/components';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\ninterface User {\n id: number;\n name: string;\n avatar: string;\n status: 'active' | 'inactive';\n lastSeen: string;\n}\n\nconst columns: Column<User>[] = [\n {\n key: 'name',\n header: 'User',\n width: 250,\n render: (_, row) => (\n <View style={{ flexDirection: 'row', alignItems: 'center' }} gap=\"sm\">\n <Avatar src={row.avatar} size=\"sm\" fallback={row.name.charAt(0)} />\n <Text>{row.name}</Text>\n </View>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n width: 120,\n render: (value) => (\n <Badge\n type={value === 'active' ? 'filled' : 'outlined'}\n intent={value === 'active' ? 'success' : 'secondary'}\n >\n {value}\n </Badge>\n ),\n },\n { key: 'lastSeen', header: 'Last Seen', width: 180 },\n];\n\\`\\`\\`\n\n## Resizable Columns\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { DataGrid } from '@idealyst/datagrid';\nimport type { Column } from '@idealyst/datagrid';\n\nfunction ResizableGrid({ data }: { data: any[] }) {\n const [columns, setColumns] = useState<Column[]>([\n { key: 'col1', header: 'Column 1', width: 200, resizable: true, minWidth: 100 },\n { key: 'col2', header: 'Column 2', width: 300, resizable: true, minWidth: 150 },\n { key: 'col3', header: 'Column 3', width: 200, resizable: true },\n ]);\n\n const handleResize = (columnKey: string, width: number) => {\n setColumns(prev =>\n prev.map(col => (col.key === columnKey ? { ...col, width } : col))\n );\n };\n\n return (\n <DataGrid\n data={data}\n columns={columns}\n onColumnResize={handleResize}\n columnResizeMode=\"live\"\n />\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * DatePicker Package Guides\n *\n * Comprehensive documentation for @idealyst/datepicker.\n */\n\nexport const datepickerGuides: Record<string, string> = {\n \"idealyst://datepicker/overview\": `# @idealyst/datepicker\n\nCross-platform date and time picker components.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/datepicker\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Custom calendar/time UI |\n| iOS | ✅ Native DatePicker |\n| Android | ✅ Material DatePicker |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n DatePicker, // Calendar date picker\n TimePicker, // Time picker\n DateInput, // Date text input with picker\n TimeInput, // Time text input with picker\n DateTimePicker, // Combined date + time picker\n} from '@idealyst/datepicker';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { DatePicker } from '@idealyst/datepicker';\n\nfunction DateSelection() {\n const [date, setDate] = useState<Date>(new Date());\n return (\n <View padding=\"md\">\n <DatePicker value={date} onChange={setDate} />\n </View>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datepicker/api\": `# @idealyst/datepicker — API Reference\n\n## Components\n\n### DatePicker\n\nCalendar-style date picker.\n\n\\`\\`\\`typescript\ninterface DatePickerProps {\n value?: Date;\n onChange: (date: Date) => void;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### TimePicker\n\nTime-only picker with 12h/24h support.\n\n\\`\\`\\`typescript\ninterface TimePickerProps {\n value?: Date;\n onChange: (date: Date) => void;\n mode?: '12h' | '24h'; // Default: '12h'\n minuteStep?: number; // Minute interval (default: 1)\n disabled?: boolean;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### DateInput\n\nText input that opens a date picker on focus/press.\n\n\\`\\`\\`typescript\ninterface DateInputProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n placeholder?: string;\n minDate?: Date;\n maxDate?: Date;\n disabled?: boolean;\n error?: string;\n size?: Size; // From @idealyst/theme\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### TimeInput\n\nText input that opens a time picker on focus/press.\n\n\\`\\`\\`typescript\ninterface TimeInputProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n placeholder?: string;\n mode?: '12h' | '24h';\n minuteStep?: number;\n disabled?: boolean;\n error?: string;\n size?: Size;\n style?: ViewStyle;\n}\n\\`\\`\\`\n\n---\n\n### DateTimePicker\n\nCombined date and time picker.\n\n\\`\\`\\`typescript\ninterface DateTimePickerProps {\n value?: Date;\n onChange: (date: Date | null) => void;\n label?: string;\n minDate?: Date;\n maxDate?: Date;\n timeMode?: '12h' | '24h';\n minuteStep?: number;\n disabled?: boolean;\n error?: string;\n size?: Size;\n style?: ViewStyle;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://datepicker/examples\": `# @idealyst/datepicker — Examples\n\n## Date Input with Validation\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text, Button } from '@idealyst/components';\nimport { DateInput } from '@idealyst/datepicker';\n\nfunction BirthdayForm() {\n const [birthday, setBirthday] = useState<Date | null>(null);\n const [error, setError] = useState<string | undefined>();\n\n const handleChange = (date: Date | null) => {\n setBirthday(date);\n if (date && date > new Date()) {\n setError('Birthday cannot be in the future');\n } else {\n setError(undefined);\n }\n };\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateInput\n value={birthday ?? undefined}\n onChange={handleChange}\n label=\"Birthday\"\n placeholder=\"Select your birthday\"\n maxDate={new Date()}\n error={error}\n size=\"md\"\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Time Picker (24h)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { TimePicker } from '@idealyst/datepicker';\n\nfunction MeetingTimePicker() {\n const [time, setTime] = useState(new Date());\n\n return (\n <View padding=\"md\">\n <TimePicker\n value={time}\n onChange={setTime}\n mode=\"24h\"\n minuteStep={15}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Date + Time Combined\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { DateTimePicker } from '@idealyst/datepicker';\n\nfunction EventScheduler() {\n const [eventDate, setEventDate] = useState<Date | null>(null);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateTimePicker\n value={eventDate ?? undefined}\n onChange={setEventDate}\n label=\"Event Date & Time\"\n minDate={new Date()}\n timeMode=\"12h\"\n minuteStep={15}\n size=\"md\"\n />\n {eventDate && (\n <Text>Scheduled for: {eventDate.toLocaleString()}</Text>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Date Range (Two Pickers)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View } from '@idealyst/components';\nimport { DateInput } from '@idealyst/datepicker';\n\nfunction DateRangePicker() {\n const [startDate, setStartDate] = useState<Date | null>(null);\n const [endDate, setEndDate] = useState<Date | null>(null);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <DateInput\n value={startDate ?? undefined}\n onChange={setStartDate}\n label=\"Start Date\"\n placeholder=\"Select start date\"\n />\n <DateInput\n value={endDate ?? undefined}\n onChange={setEndDate}\n label=\"End Date\"\n placeholder=\"Select end date\"\n minDate={startDate ?? undefined}\n error={endDate && startDate && endDate < startDate ? 'End must be after start' : undefined}\n />\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Lottie Package Guides\n *\n * Comprehensive documentation for @idealyst/lottie.\n */\n\nexport const lottieGuides: Record<string, string> = {\n \"idealyst://lottie/overview\": `# @idealyst/lottie\n\nCross-platform Lottie animation component for rendering After Effects animations.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/lottie\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ lottie-web |\n| iOS | ✅ lottie-ios |\n| Android | ✅ lottie-android |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { Lottie } from '@idealyst/lottie';\nimport type { LottieProps, LottieRef, LottieSource } from '@idealyst/lottie';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { Lottie } from '@idealyst/lottie';\n\nfunction LoadingAnimation() {\n return (\n <Lottie\n source=\"https://assets.lottiefiles.com/packages/lf20_loading.json\"\n autoPlay\n loop\n style={{ width: 200, height: 200 }}\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://lottie/api\": `# @idealyst/lottie — API Reference\n\n## Lottie Component\n\n### LottieProps\n\n\\`\\`\\`typescript\ninterface LottieProps {\n /**\n * Animation source:\n * - URL string to .json file\n * - Imported JSON object\n * - require() statement (native only)\n * - { uri: string } object\n */\n source: LottieSource;\n\n /** Auto-play on mount (default: true) */\n autoPlay?: boolean;\n\n /** Loop: true = infinite, false = once, number = N times (default: false) */\n loop?: boolean | number;\n\n /** Playback speed: 1 = normal, 2 = double, 0.5 = half (default: 1) */\n speed?: number;\n\n /** Container style */\n style?: ViewStyle;\n\n /** Resize mode (default: 'contain') */\n resizeMode?: 'cover' | 'contain' | 'center';\n\n /** Initial progress 0-1 */\n progress?: number;\n\n /** Callback when animation completes a loop or finishes */\n onComplete?: () => void;\n\n /** Callback when animation is loaded */\n onLoad?: () => void;\n\n /** Callback on load error */\n onError?: (error: Error) => void;\n\n /** Frame update callback */\n onAnimationUpdate?: (frame: number) => void;\n\n /** Conditional rendering (default: true) */\n visible?: boolean;\n\n testID?: string;\n}\n\\`\\`\\`\n\n### LottieSource Type\n\n\\`\\`\\`typescript\ntype LottieSource = string | LottieJSON | { uri: string };\n\\`\\`\\`\n\n---\n\n### LottieRef (imperative methods)\n\nAccess via \\`useRef<LottieRef>(null)\\` and \\`ref\\` prop. **Note:** In React 19, \\`useRef\\` requires an initial argument — always pass \\`null\\`.\n\n| Method | Description |\n|--------|-------------|\n| play() | Start playing from current position |\n| pause() | Pause at current position |\n| stop() | Stop and reset to beginning |\n| reset() | Reset to beginning without stopping |\n| setProgress(p) | Set progress (0-1) |\n| goToAndStop(frame, isFrame?) | Go to frame/time and stop |\n| goToAndPlay(frame, isFrame?) | Go to frame/time and play |\n| setSpeed(speed) | Set playback speed |\n| setDirection(dir) | Set direction: 1 (forward) or -1 (reverse) |\n| playSegments(start, end, force?) | Play specific frame range |\n| getCurrentFrame() | Get current frame number |\n| getTotalFrames() | Get total frames |\n| getDuration() | Get duration in seconds |\n| isPlaying() | Check if playing |\n| destroy() | Clean up resources |\n`,\n\n \"idealyst://lottie/examples\": `# @idealyst/lottie — Examples\n\n## Basic Animation\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\n\nfunction SuccessAnimation() {\n return (\n <View style={{ alignItems: 'center' }} padding=\"lg\">\n <Lottie\n source=\"https://assets.lottiefiles.com/packages/lf20_success.json\"\n autoPlay\n loop={false}\n style={{ width: 150, height: 150 }}\n onComplete={() => console.log('Animation done')}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Imported JSON\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Lottie } from '@idealyst/lottie';\nimport loadingAnimation from '../assets/loading.json';\n\nfunction LoadingSpinner() {\n return (\n <Lottie\n source={loadingAnimation}\n autoPlay\n loop\n speed={1.5}\n style={{ width: 100, height: 100 }}\n />\n );\n}\n\\`\\`\\`\n\n## Controlled with Ref\n\n\\`\\`\\`tsx\nimport React, { useRef } from 'react';\nimport { View, Button } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\nimport type { LottieRef } from '@idealyst/lottie';\n\nfunction ControlledAnimation() {\n const lottieRef = useRef<LottieRef>(null);\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ alignItems: 'center' }}>\n <Lottie\n ref={lottieRef}\n source=\"https://assets.lottiefiles.com/packages/lf20_animation.json\"\n autoPlay={false}\n loop\n style={{ width: 200, height: 200 }}\n />\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => lottieRef.current?.play()} size=\"sm\">Play</Button>\n <Button onPress={() => lottieRef.current?.pause()} size=\"sm\">Pause</Button>\n <Button onPress={() => lottieRef.current?.stop()} size=\"sm\">Stop</Button>\n </View>\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button\n onPress={() => lottieRef.current?.setSpeed(2)}\n size=\"sm\"\n intent=\"secondary\"\n >\n 2x Speed\n </Button>\n <Button\n onPress={() => lottieRef.current?.setDirection(-1)}\n size=\"sm\"\n intent=\"secondary\"\n >\n Reverse\n </Button>\n <Button\n onPress={() => lottieRef.current?.playSegments(0, 30)}\n size=\"sm\"\n intent=\"secondary\"\n >\n First 30 Frames\n </Button>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n\n## Progress-Based (Scroll-Linked)\n\n\\`\\`\\`tsx\nimport React, { useState } from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { Lottie } from '@idealyst/lottie';\n\nfunction ScrollLinkedAnimation() {\n const [progress, setProgress] = useState(0);\n\n return (\n <View padding=\"md\" gap=\"md\">\n <Lottie\n source=\"https://example.com/scroll-animation.json\"\n autoPlay={false}\n progress={progress}\n style={{ width: 300, height: 200 }}\n />\n {/* Slider to simulate scroll progress */}\n <View style={{ flexDirection: 'row', alignItems: 'center' }} gap=\"sm\">\n <Text>0%</Text>\n <input\n type=\"range\"\n min={0}\n max={100}\n value={progress * 100}\n onChange={(e) => setProgress(Number(e.target.value) / 100)}\n style={{ flex: 1 }}\n />\n <Text>100%</Text>\n </View>\n </View>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Markdown Package Guides\n *\n * Comprehensive documentation for @idealyst/markdown.\n */\n\nexport const markdownGuides: Record<string, string> = {\n \"idealyst://markdown/overview\": `# @idealyst/markdown\n\nCross-platform Markdown renderer with theme integration, syntax highlighting, and GFM support.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/markdown\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ react-markdown |\n| iOS | ✅ react-native-markdown-display |\n| Android | ✅ react-native-markdown-display |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { Markdown } from '@idealyst/markdown';\nimport type { MarkdownProps, MarkdownStyleOverrides } from '@idealyst/markdown';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { Markdown } from '@idealyst/markdown';\n\nfunction MarkdownContent() {\n return (\n <Markdown>\n {\\`# Hello World\n\nThis is **bold** and *italic* text.\n\n- List item 1\n- List item 2\n\n\\\\\\`\\\\\\`\\\\\\`javascript\nconst x = 42;\n\\\\\\`\\\\\\`\\\\\\`\n\\`}\n </Markdown>\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://markdown/api\": `# @idealyst/markdown — API Reference\n\n## Markdown Component\n\n### MarkdownProps\n\n\\`\\`\\`typescript\ninterface MarkdownProps {\n /** Markdown content string */\n children: string;\n\n /** Text size variant (default: 'md') */\n size?: Size;\n\n /** Link color intent (default: 'primary') */\n linkIntent?: Intent;\n\n /** Custom style overrides for specific elements */\n styleOverrides?: MarkdownStyleOverrides;\n\n /** Link handling configuration */\n linkHandler?: LinkHandler;\n\n /** Image handling configuration */\n imageHandler?: ImageHandler;\n\n /** Code block configuration */\n codeOptions?: CodeBlockOptions;\n\n /** Enable GFM extensions: tables, strikethrough, task lists, footnotes (default: true) */\n gfm?: boolean;\n\n /** Allow raw HTML in markdown (default: false) */\n allowHtml?: boolean;\n\n /** Custom component renderers (advanced) */\n components?: Partial<Record<MarkdownElementType, ComponentType<any>>>;\n\n /** Container style */\n style?: StyleProp<ViewStyle>;\n\n testID?: string;\n accessibilityLabel?: string;\n}\n\\`\\`\\`\n\n---\n\n### Style Types\n\n\\`\\`\\`typescript\ntype MarkdownElementType =\n | 'body' | 'heading1' | 'heading2' | 'heading3' | 'heading4' | 'heading5' | 'heading6'\n | 'paragraph' | 'strong' | 'em' | 'strikethrough'\n | 'link' | 'blockquote'\n | 'codeInline' | 'codeBlock'\n | 'listOrdered' | 'listUnordered' | 'listItem'\n | 'table' | 'tableHead' | 'tableRow' | 'tableCell'\n | 'image' | 'hr' | 'taskListItem' | 'footnote' | 'footnoteRef';\n\ntype MarkdownStyleOverrides = Partial<Record<MarkdownElementType, StyleProp<ViewStyle | TextStyle>>>;\n\\`\\`\\`\n\n---\n\n### LinkHandler\n\n\\`\\`\\`typescript\ninterface LinkHandler {\n /** Called when link is pressed. Return true to prevent default. */\n onLinkPress?: (url: string, title?: string) => boolean | void;\n\n /** Open external links in browser (default: true) */\n openExternalLinks?: boolean;\n}\n\\`\\`\\`\n\n### ImageHandler\n\n\\`\\`\\`typescript\ninterface ImageHandler {\n /** Custom image URL resolver for relative paths */\n resolveImageUrl?: (src: string) => string;\n\n /** Default image dimensions when not specified */\n defaultImageDimensions?: { width?: number; height?: number };\n\n /** Called when image is pressed */\n onImagePress?: (src: string, alt?: string) => void;\n}\n\\`\\`\\`\n\n### CodeBlockOptions\n\n\\`\\`\\`typescript\ninterface CodeBlockOptions {\n /** Enable syntax highlighting (default: false) */\n syntaxHighlighting?: boolean;\n\n /** Syntax theme: 'auto' | 'light' | 'dark' (default: 'auto') */\n syntaxTheme?: 'auto' | 'light' | 'dark';\n\n /** Show line numbers (default: false) */\n showLineNumbers?: boolean;\n\n /** Show copy button — web only (default: true) */\n copyButton?: boolean;\n}\n\\`\\`\\`\n`,\n\n \"idealyst://markdown/examples\": `# @idealyst/markdown — Examples\n\n## Basic Rendering\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View } from '@idealyst/components';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction ArticleView({ content }: { content: string }) {\n return (\n <View padding=\"md\">\n <Markdown size=\"md\" gfm>\n {content}\n </Markdown>\n </View>\n );\n}\n\\`\\`\\`\n\n## Custom Link Handling\n\n**IMPORTANT**: Do NOT import \\`Linking\\` from \\`react-native\\` for opening URLs. The Markdown component has built-in cross-platform link handling via \\`linkHandler\\`:\n- \\`openExternalLinks: true\\` — opens external URLs in the system browser (cross-platform, no imports needed)\n- \\`onLinkPress\\` — intercept link taps for internal navigation\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\nimport { useNavigator } from '@idealyst/navigation';\n\nfunction DocumentView({ markdown }: { markdown: string }) {\n const { navigate } = useNavigator();\n\n return (\n <Markdown\n linkHandler={{\n onLinkPress: (url) => {\n if (url.startsWith('/')) {\n navigate({ path: url });\n return true; // Handled — prevent default\n }\n return false; // Not handled — openExternalLinks takes over\n },\n openExternalLinks: true, // Opens external URLs cross-platform (no Linking import needed!)\n }}\n >\n {markdown}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## With Syntax Highlighting\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction CodeDocumentation({ content }: { content: string }) {\n return (\n <Markdown\n codeOptions={{\n syntaxHighlighting: true,\n syntaxTheme: 'auto',\n showLineNumbers: true,\n copyButton: true,\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## Custom Style Overrides\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction StyledMarkdown({ content }: { content: string }) {\n return (\n <Markdown\n styleOverrides={{\n heading1: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 },\n heading2: { fontSize: 22, fontWeight: '600', marginBottom: 12 },\n blockquote: {\n borderLeftWidth: 4,\n borderLeftColor: '#4CAF50',\n paddingLeft: 16,\n fontStyle: 'italic',\n },\n codeBlock: {\n backgroundColor: '#1e1e1e',\n borderRadius: 8,\n padding: 16,\n },\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n\n## Image Handling\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { Markdown } from '@idealyst/markdown';\n\nfunction WikiArticle({ content, baseUrl }: { content: string; baseUrl: string }) {\n return (\n <Markdown\n imageHandler={{\n resolveImageUrl: (src) => {\n if (src.startsWith('http')) return src;\n return baseUrl + '/images/' + src;\n },\n defaultImageDimensions: { width: 300 },\n onImagePress: (src, alt) => console.log('Image clicked:', src),\n }}\n >\n {content}\n </Markdown>\n );\n}\n\\`\\`\\`\n`,\n};\n","/**\n * Config Package Guides\n *\n * Comprehensive documentation for @idealyst/config.\n */\n\nexport const configGuides: Record<string, string> = {\n \"idealyst://config/overview\": `# @idealyst/config\n\nCross-platform environment variable management. Reads from \\`.env\\` files (native) and \\`import.meta.env\\` (web/Vite) with a unified API.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/config\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Status |\n|----------|--------|\n| Web | ✅ Vite import.meta.env (strips VITE_ prefix) |\n| iOS | ✅ react-native-config |\n| Android | ✅ react-native-config |\n| Node | ✅ dotenv |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport { config } from '@idealyst/config';\nimport type { IConfig, ConfigValidationError, ConfigKeys } from '@idealyst/config';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\n// Get a value (returns undefined if not set)\nconst apiUrl = config.get('API_URL');\n\n// Get a required value (throws if not set)\nconst secretKey = config.getRequired('SECRET_KEY');\n\n// Check existence\nif (config.has('FEATURE_FLAG')) {\n // ...\n}\n\n// Validate required keys on app startup\nconfig.validate(['API_URL', 'AUTH_URL', 'APP_NAME']);\n\\`\\`\\`\n`,\n\n \"idealyst://config/api\": `# @idealyst/config — API Reference\n\n## config (singleton)\n\nThe default \\`config\\` instance reads from the platform-appropriate source.\n\n### IConfig Interface\n\n\\`\\`\\`typescript\ninterface IConfig {\n /**\n * Get a configuration value by key.\n * Keys are canonical (without VITE_ prefix on web).\n * @returns The value, or defaultValue, or undefined\n */\n get(key: string, defaultValue?: string): string | undefined;\n\n /**\n * Get a required configuration value.\n * @throws Error if key is not defined\n */\n getRequired(key: string): string;\n\n /**\n * Check if a configuration key exists.\n */\n has(key: string): boolean;\n\n /**\n * Get all available configuration keys.\n */\n keys(): string[];\n\n /**\n * Validate that all required keys are present.\n * @throws ConfigValidationError if any keys are missing\n */\n validate(requiredKeys: string[]): void;\n}\n\\`\\`\\`\n\n### ConfigValidationError\n\n\\`\\`\\`typescript\nclass ConfigValidationError extends Error {\n readonly missingKeys: string[];\n}\n\\`\\`\\`\n\nThrown by \\`config.validate()\\` when required keys are missing.\n\n---\n\n## Key Naming\n\n| Platform | Env var | config.get() key |\n|----------|---------|------------------|\n| Web (Vite) | \\`VITE_API_URL\\` | \\`'API_URL'\\` |\n| Native | \\`API_URL\\` | \\`'API_URL'\\` |\n| Node | \\`API_URL\\` | \\`'API_URL'\\` |\n\nThe \\`VITE_\\` prefix is automatically stripped on web.\n\n---\n\n## Type Augmentation\n\nRun \\`idealyst-config generate\\` to augment the \\`ConfigKeys\\` interface with your actual env vars for autocomplete:\n\n\\`\\`\\`typescript\n// Generated by idealyst-config generate:\ndeclare module '@idealyst/config' {\n interface ConfigKeys {\n API_URL: string;\n AUTH_URL: string;\n APP_NAME: string;\n }\n}\n\\`\\`\\`\n`,\n\n \"idealyst://config/examples\": `# @idealyst/config — Examples\n\n## App Initialization\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\n// Validate required config at app startup\nfunction initializeApp() {\n try {\n config.validate(['API_URL', 'AUTH_URL', 'APP_NAME']);\n } catch (error) {\n if (error instanceof ConfigValidationError) {\n console.error('Missing config keys:', error.missingKeys);\n throw error;\n }\n }\n\n return {\n apiUrl: config.getRequired('API_URL'),\n authUrl: config.getRequired('AUTH_URL'),\n appName: config.getRequired('APP_NAME'),\n debugMode: config.get('DEBUG') === 'true',\n };\n}\n\\`\\`\\`\n\n## API Client Setup\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\nconst apiClient = {\n baseUrl: config.getRequired('API_URL'),\n timeout: parseInt(config.get('API_TIMEOUT', '30000') ?? '30000', 10),\n\n async fetch(path: string, options?: RequestInit) {\n const response = await fetch(\\`\\${this.baseUrl}\\${path}\\`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options?.headers,\n },\n });\n return response.json();\n },\n};\n\\`\\`\\`\n\n## Feature Flags\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\n\nconst features = {\n newDashboard: config.get('FEATURE_NEW_DASHBOARD') === 'true',\n darkMode: config.get('FEATURE_DARK_MODE', 'true') === 'true',\n analytics: config.has('ANALYTICS_KEY'),\n};\n\nfunction AppRouter() {\n return features.newDashboard ? <NewDashboard /> : <LegacyDashboard />;\n}\n\\`\\`\\`\n\n## OAuth Configuration\n\n\\`\\`\\`tsx\nimport { config } from '@idealyst/config';\nimport { createOAuthClient } from '@idealyst/oauth-client';\n\nconst googleAuth = createOAuthClient({\n oauthUrl: config.getRequired('API_URL') + '/auth/google',\n redirectUrl: config.getRequired('OAUTH_REDIRECT_URL'),\n});\n\\`\\`\\`\n`,\n};\n","/**\n * Charts Package Guides\n *\n * Comprehensive documentation for @idealyst/charts.\n */\n\nexport const chartsGuides: Record<string, string> = {\n \"idealyst://charts/overview\": `# @idealyst/charts\n\nCross-platform animated charting library with SVG and Skia renderers.\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/charts\n\\`\\`\\`\n\n## Platform Support\n\n| Platform | Renderer |\n|----------|----------|\n| Web | SVG |\n| iOS | Skia (via react-native-skia) or SVG |\n| Android | Skia (via react-native-skia) or SVG |\n\n## Key Exports\n\n\\`\\`\\`typescript\nimport {\n LineChart,\n BarChart,\n // More chart types available\n} from '@idealyst/charts';\nimport type {\n DataPoint,\n ChartDataSeries,\n Column,\n BaseChartProps,\n CartesianChartProps,\n LineChartProps,\n BarChartProps,\n} from '@idealyst/charts';\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { LineChart } from '@idealyst/charts';\n\nconst data = [\n { x: 'Jan', y: 30 },\n { x: 'Feb', y: 45 },\n { x: 'Mar', y: 28 },\n { x: 'Apr', y: 65 },\n { x: 'May', y: 42 },\n];\n\nfunction SalesChart() {\n return (\n <LineChart\n data={[{ id: 'sales', name: 'Sales', data }]}\n height={300}\n animate\n />\n );\n}\n\\`\\`\\`\n`,\n\n \"idealyst://charts/api\": `# @idealyst/charts — API Reference\n\n## Data Types\n\n### DataPoint\n\n\\`\\`\\`typescript\ninterface DataPoint {\n x: string | number | Date;\n y: number;\n label?: string; // Optional label for THIS individual point\n color?: string;\n metadata?: Record<string, unknown>;\n}\n\\`\\`\\`\n\n### ChartDataSeries\n\nA series is a named collection of data points. It has EXACTLY these properties:\n\n\\`\\`\\`typescript\ninterface ChartDataSeries {\n id: string; // REQUIRED — Unique identifier for this series\n name: string; // REQUIRED — Display name (shown in legend/tooltip)\n data: DataPoint[]; // REQUIRED — Array of data points\n color?: string; // Optional — Custom color for this series\n intent?: Intent; // Optional — Theme intent for automatic coloring\n visible?: boolean; // Optional — Whether this series is visible\n}\n\\`\\`\\`\n\n> **WARNING:** \\`ChartDataSeries\\` has NO \\`label\\` property. Use \\`name\\` for the series display name. Only \\`DataPoint\\` has \\`label\\` (for individual point labels). Adding \\`label\\` to a series object will cause a TypeScript error (TS2353: excess property check).\n\n### PieDataPoint\n\n\\`\\`\\`typescript\ninterface PieDataPoint {\n value: number;\n label: string;\n color?: string;\n}\n\\`\\`\\`\n\n---\n\n## Base Props (shared by all charts)\n\n### BaseChartProps\n\n\\`\\`\\`typescript\ninterface BaseChartProps {\n data: ChartDataSeries[] | ChartDataSeries;\n height?: number | string;\n width?: number | string;\n padding?: Partial<ChartPadding> | number;\n animate?: boolean; // NOTE: 'animate' — NOT 'animated'\n animationDuration?: number;\n animationDelay?: number;\n intent?: Intent;\n showLegend?: boolean;\n legendPosition?: 'top' | 'bottom' | 'left' | 'right';\n interactive?: boolean;\n showTooltip?: boolean;\n}\n\\`\\`\\`\n\n> **IMPORTANT:** The prop is \\`animate\\` — NOT \\`animated\\`. Using \\`animated\\` will cause a TS error.\n\n### CartesianChartProps (extends BaseChartProps)\n\nFor charts with X/Y axes (Line, Bar, etc.):\n\n\\`\\`\\`typescript\ninterface CartesianChartProps extends BaseChartProps {\n xAxis?: AxisConfig;\n yAxis?: AxisConfig;\n showXAxis?: boolean; // Shorthand for xAxis.show\n showYAxis?: boolean; // Shorthand for yAxis.show\n showGrid?: boolean; // Shorthand for grid lines\n}\n\\`\\`\\`\n\n### AxisConfig\n\n\\`\\`\\`typescript\ninterface AxisConfig {\n show?: boolean; // Use 'show' — NOT 'visible'\n label?: string; // Axis label text\n tickCount?: number; // Number of ticks to show\n tickFormat?: (value: number | string | Date) => string; // Custom tick formatter\n gridLines?: boolean; // Whether to show grid lines\n min?: number; // Minimum value (auto if not set)\n max?: number; // Maximum value (auto if not set)\n}\n\\`\\`\\`\n\n> **Common mistakes:**\n> - Use \\`show\\` — NOT \\`visible\\`. \\`{ visible: true }\\` will cause a TS error.\n> - \\`tickFormat\\` parameter is \\`number | string | Date\\` — NOT just \\`number\\`. Example:\n> \\`\\`\\`typescript\n> tickFormat: (value: number | string | Date) => \\`$\\${Number(value) / 1000}k\\`\n> \\`\\`\\`\n\n---\n\n## Chart Components\n\n### LineChart\n\n\\`\\`\\`typescript\ninterface LineChartProps extends CartesianChartProps {\n curve?: CurveType; // 'linear' | 'monotone' | 'cardinal' | 'step' | ...\n strokeWidth?: number;\n showDots?: boolean;\n dotRadius?: number; // NOTE: 'dotRadius' — NOT 'dotSize'\n showArea?: boolean; // NOTE: 'showArea' — NOT 'area'\n areaOpacity?: number;\n}\n\\`\\`\\`\n\n> **Common mistakes:** Use \\`showArea\\` (NOT \\`area\\`), \\`dotRadius\\` (NOT \\`dotSize\\`), \\`animate\\` (NOT \\`animated\\`).\n\n### BarChart\n\n\\`\\`\\`typescript\ninterface BarChartProps extends CartesianChartProps {\n orientation?: 'vertical' | 'horizontal';\n grouped?: boolean; // Side-by-side bars for multiple series\n stacked?: boolean; // Stacked bars for multiple series\n barRadius?: number; // NOTE: 'barRadius' — NOT 'borderRadius'\n barPadding?: number; // Padding between bars (0-1)\n groupPadding?: number; // Padding between bar groups (0-1)\n}\n\\`\\`\\`\n\n> **Common mistakes:** Use \\`barRadius\\` (NOT \\`borderRadius\\`), \\`barPadding\\` (NOT \\`gap\\` or \\`barWidth\\`).\n\n---\n\n## Scales\n\n\\`\\`\\`typescript\n// Linear scale for numeric data\ninterface LinearScaleConfig { domain?: [number, number]; nice?: boolean; }\n\n// Band scale for categorical data\ninterface BandScaleConfig { padding?: number; align?: number; }\n\n// Time scale for date data\ninterface TimeScaleConfig { domain?: [Date, Date]; }\n\\`\\`\\`\n\n## Curve Types\n\n\\`\\`\\`typescript\ntype CurveType =\n | 'linear' // Straight lines between points\n | 'monotone' // Smooth curve preserving monotonicity\n | 'cardinal' // Cardinal spline\n | 'step' // Step function\n | 'stepBefore' // Step before each point\n | 'stepAfter' // Step after each point\n | 'basis' // B-spline\n | 'natural'; // Natural cubic spline\n\\`\\`\\`\n`,\n\n \"idealyst://charts/examples\": `# @idealyst/charts — Examples\n\n> **Before writing chart code, remember these rules:**\n> - Series uses \\`name\\` (NOT \\`label\\`). Adding \\`label\\` to \\`ChartDataSeries\\` causes TS2353.\n> - Use \\`animate\\` (NOT \\`animated\\`), \\`showArea\\` (NOT \\`area\\`), \\`dotRadius\\` (NOT \\`dotSize\\`), \\`barRadius\\` (NOT \\`borderRadius\\`).\n> - \\`tickFormat\\` signature is \\`(value: number | string | Date) => string\\` — NOT \\`(v: number) => string\\`.\n> - \\`AxisConfig\\` uses \\`show\\` (NOT \\`visible\\`) to control axis visibility.\n\n## Line Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { LineChart } from '@idealyst/charts';\nimport type { ChartDataSeries } from '@idealyst/charts';\n\nconst monthlySales = [\n { x: 'Jan', y: 4200 },\n { x: 'Feb', y: 5100 },\n { x: 'Mar', y: 4800 },\n { x: 'Apr', y: 6200 },\n { x: 'May', y: 5900 },\n { x: 'Jun', y: 7100 },\n];\n\n// Series uses 'name' for display — NOT 'label'\nconst revenueData: ChartDataSeries[] = [\n { id: 'revenue', name: 'Revenue', data: monthlySales, color: '#4CAF50' },\n];\n\nfunction SalesOverview() {\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Monthly Sales</Text>\n <LineChart\n data={revenueData}\n height={300}\n curve=\"monotone\"\n showDots\n showArea\n areaOpacity={0.15}\n animate\n xAxis={{ label: 'Month' }}\n yAxis={{\n label: 'Revenue ($)',\n // tickFormat param type is (value: number | string | Date) => string\n tickFormat: (value: number | string | Date) => \\`$\\${Number(value) / 1000}k\\`,\n }}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Multi-Series Line Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { LineChart } from '@idealyst/charts';\nimport type { ChartDataSeries } from '@idealyst/charts';\n\n// Each series has: id, name, data, color? — NO 'label' property\nconst series: ChartDataSeries[] = [\n {\n id: 'product-a',\n name: 'Product A', // Use 'name' — NOT 'label'\n data: [\n { x: 'Q1', y: 120 },\n { x: 'Q2', y: 150 },\n { x: 'Q3', y: 180 },\n { x: 'Q4', y: 210 },\n ],\n color: '#2196F3',\n },\n {\n id: 'product-b',\n name: 'Product B', // Use 'name' — NOT 'label'\n data: [\n { x: 'Q1', y: 80 },\n { x: 'Q2', y: 110 },\n { x: 'Q3', y: 95 },\n { x: 'Q4', y: 140 },\n ],\n color: '#FF9800',\n },\n];\n\nfunction ComparisonChart() {\n return (\n <LineChart\n data={series}\n height={350}\n curve=\"monotone\"\n showDots\n animate\n />\n );\n}\n\\`\\`\\`\n\n## Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { BarChart } from '@idealyst/charts';\n\nconst categories = [\n { x: 'Electronics', y: 45 },\n { x: 'Clothing', y: 32 },\n { x: 'Books', y: 18 },\n { x: 'Food', y: 56 },\n { x: 'Sports', y: 28 },\n];\n\nfunction CategoryBreakdown() {\n return (\n <View padding=\"md\" gap=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Sales by Category</Text>\n <BarChart\n data={[{ id: 'units', name: 'Units Sold', data: categories }]}\n height={300}\n barRadius={4}\n animate\n yAxis={{ tickFormat: (value: number | string | Date) => \\`\\${value} units\\` }}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Stacked Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { BarChart } from '@idealyst/charts';\n\nfunction StackedBarExample() {\n return (\n <BarChart\n data={[\n {\n id: 'online',\n name: 'Online',\n data: [\n { x: 'Q1', y: 100 },\n { x: 'Q2', y: 120 },\n { x: 'Q3', y: 90 },\n ],\n color: '#4CAF50',\n },\n {\n id: 'in-store',\n name: 'In-Store',\n data: [\n { x: 'Q1', y: 60 },\n { x: 'Q2', y: 80 },\n { x: 'Q3', y: 70 },\n ],\n color: '#2196F3',\n },\n ]}\n height={300}\n stacked\n animate\n />\n );\n}\n\\`\\`\\`\n\n## Horizontal Bar Chart\n\n\\`\\`\\`tsx\nimport React from 'react';\nimport { BarChart } from '@idealyst/charts';\n\nfunction HorizontalBarExample() {\n const data = [\n { x: 'React', y: 85 },\n { x: 'Vue', y: 62 },\n { x: 'Angular', y: 45 },\n { x: 'Svelte', y: 38 },\n ];\n\n return (\n <BarChart\n data={[{ id: 'popularity', name: 'Popularity', data }]}\n height={250}\n orientation=\"horizontal\"\n animate\n />\n );\n}\n\\`\\`\\`\n`,\n};\n","export const clipboardGuides: Record<string, string> = {\n \"idealyst://clipboard/overview\": `# @idealyst/clipboard Overview\n\nCross-platform clipboard and OTP autofill for React and React Native applications. Provides a consistent async API for copy/paste operations, plus a mobile-only hook for automatic SMS OTP code detection.\n\n## Features\n\n- **Cross-Platform Clipboard** - Copy and paste text on React Native and Web\n- **Simple API** - Async/await based with consistent interface\n- **React Native** - Uses @react-native-clipboard/clipboard\n- **Web** - Uses navigator.clipboard API\n- **OTP Auto-Fill (Android)** - Automatically reads OTP codes from SMS via SMS Retriever API (no permissions needed)\n- **OTP Auto-Fill (iOS)** - Provides TextInput props for native iOS keyboard OTP suggestion\n- **TypeScript** - Full type safety and IntelliSense support\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/clipboard\n\n# React Native also needs:\nyarn add @react-native-clipboard/clipboard\ncd ios && pod install\n\n# For OTP autofill on Android (optional):\nyarn add react-native-otp-verify\n\\`\\`\\`\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\n\n// Copy text\nawait clipboard.copy('Hello, world!');\n\n// Paste text\nconst text = await clipboard.paste();\n\n// Check if clipboard has text\nconst hasText = await clipboard.hasText();\n\\`\\`\\`\n\n## OTP Auto-Fill Quick Start\n\n\\`\\`\\`tsx\nimport { useOTPAutoFill, OTP_INPUT_PROPS } from '@idealyst/clipboard';\nimport { TextInput } from 'react-native';\n\nfunction OTPScreen() {\n const { code, startListening, hash } = useOTPAutoFill({\n codeLength: 6,\n onCodeReceived: (otp) => verifyOTP(otp),\n });\n\n useEffect(() => {\n startListening();\n }, []);\n\n return (\n <TextInput\n value={code ?? ''}\n {...OTP_INPUT_PROPS}\n />\n );\n}\n\\`\\`\\`\n\n## Import Options\n\n\\`\\`\\`tsx\n// Named import (recommended)\nimport { clipboard } from '@idealyst/clipboard';\n\n// Default import\nimport clipboard from '@idealyst/clipboard';\n\n// OTP hook and helpers\nimport { useOTPAutoFill, OTP_INPUT_PROPS } from '@idealyst/clipboard';\n\\`\\`\\`\n\n## Platform Details\n\n- **React Native**: Uses \\`@react-native-clipboard/clipboard\\` for clipboard operations\n- **Web**: Uses \\`navigator.clipboard\\` API (requires secure context / HTTPS)\n- **OTP (Android)**: Uses SMS Retriever API via \\`react-native-otp-verify\\` — zero permissions\n- **OTP (iOS)**: Native keyboard autofill via \\`textContentType=\"oneTimeCode\"\\`\n- **OTP (Web)**: No-op — returns null values and noop functions\n`,\n\n \"idealyst://clipboard/api\": `# Clipboard API Reference\n\nComplete API reference for @idealyst/clipboard.\n\n## clipboard.copy\n\nCopy text to the system clipboard.\n\n\\`\\`\\`tsx\nawait clipboard.copy(text: string): Promise<void>\n\n// Examples\nawait clipboard.copy('Hello, world!');\nawait clipboard.copy(inviteCode);\nawait clipboard.copy(JSON.stringify(data));\n\\`\\`\\`\n\n## clipboard.paste\n\nRead text from the system clipboard.\n\n\\`\\`\\`tsx\nawait clipboard.paste(): Promise<string>\n\n// Examples\nconst text = await clipboard.paste();\nconst url = await clipboard.paste();\n\\`\\`\\`\n\n## clipboard.hasText\n\nCheck if the clipboard contains text content.\n\n\\`\\`\\`tsx\nawait clipboard.hasText(): Promise<boolean>\n\n// Example\nconst canPaste = await clipboard.hasText();\nif (canPaste) {\n const text = await clipboard.paste();\n}\n\\`\\`\\`\n\n## clipboard.addListener\n\nListen for copy events (triggered when \\`clipboard.copy()\\` is called).\n\n\\`\\`\\`tsx\nconst unsubscribe = clipboard.addListener((content: string) => {\n console.log('Copied:', content);\n});\n\n// Later, unsubscribe\nunsubscribe();\n\\`\\`\\`\n\n---\n\n## useOTPAutoFill\n\nReact hook for automatic OTP code detection from SMS on mobile.\n\n**Android**: Uses SMS Retriever API to auto-read OTP from incoming SMS (no permissions required). SMS must include your app hash.\n\n**iOS**: OTP is handled natively by the iOS keyboard. Use \\`OTP_INPUT_PROPS\\` on your TextInput to enable it.\n\n**Web**: Returns no-op values.\n\n\\`\\`\\`tsx\nconst {\n code, // string | null - received OTP code (Android only)\n startListening, // () => void - begin listening for SMS (Android only)\n stopListening, // () => void - stop listening (Android only)\n hash, // string | null - app hash for SMS body (Android only)\n} = useOTPAutoFill(options?: {\n codeLength?: number; // default: 6\n onCodeReceived?: (code: string) => void;\n});\n\\`\\`\\`\n\n### Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| codeLength | number | 6 | Expected digit count of OTP code |\n| onCodeReceived | (code: string) => void | — | Callback when OTP is detected |\n\n### Return Value\n\n| Property | Type | Description |\n|----------|------|-------------|\n| code | string \\\\| null | Detected OTP code (Android). Null on iOS/web. |\n| startListening | () => void | Start SMS listener (Android). No-op on iOS/web. |\n| stopListening | () => void | Stop SMS listener (Android). No-op on iOS/web. |\n| hash | string \\\\| null | App hash for SMS Retriever (Android). Null on iOS/web. |\n\n### Android SMS Format\n\nFor the SMS Retriever API to detect the message, the SMS must:\n1. Start with \\`<#>\\`\n2. Contain the OTP code as a sequence of digits\n3. End with your app's 11-character hash (available via \\`hash\\`)\n\nExample SMS:\n\\`\\`\\`\n<#> Your verification code is: 123456\nFA+9qCX9VSu\n\\`\\`\\`\n\n---\n\n## OTP_INPUT_PROPS\n\nConstant with TextInput props to enable native OTP keyboard autofill.\n\n\\`\\`\\`tsx\nimport { OTP_INPUT_PROPS } from '@idealyst/clipboard';\n\n// Value:\n// {\n// textContentType: 'oneTimeCode',\n// autoComplete: 'sms-otp',\n// }\n\n<TextInput\n {...OTP_INPUT_PROPS}\n value={code}\n onChangeText={setCode}\n/>\n\\`\\`\\`\n\n- **iOS**: Enables the keyboard to suggest OTP codes from received SMS (iOS 12+)\n- **Android**: Maps to the correct \\`autoComplete\\` value\n- **Web**: Harmless — ignored by web TextInput\n`,\n\n \"idealyst://clipboard/examples\": `# Clipboard Examples\n\nComplete code examples for common @idealyst/clipboard patterns.\n\n## Copy to Clipboard with Feedback\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\nimport { useState, useCallback } from 'react';\n\nfunction CopyButton({ text }: { text: string }) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n await clipboard.copy(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [text]);\n\n return (\n <Button\n label={copied ? 'Copied!' : 'Copy'}\n intent={copied ? 'positive' : 'neutral'}\n onPress={handleCopy}\n />\n );\n}\n\\`\\`\\`\n\n## Share / Copy Link\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\n\nasync function copyShareLink(itemId: string) {\n const url = \\`https://myapp.com/items/\\${itemId}\\`;\n await clipboard.copy(url);\n}\n\\`\\`\\`\n\n## Paste from Clipboard\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\n\nfunction PasteInput() {\n const [value, setValue] = useState('');\n\n const handlePaste = useCallback(async () => {\n const hasText = await clipboard.hasText();\n if (hasText) {\n const text = await clipboard.paste();\n setValue(text);\n }\n }, []);\n\n return (\n <View>\n <Input value={value} onChangeText={setValue} placeholder=\"Enter or paste text\" />\n <Button label=\"Paste\" onPress={handlePaste} iconName=\"content-paste\" />\n </View>\n );\n}\n\\`\\`\\`\n\n## useClipboard Hook\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\nimport { useState, useCallback } from 'react';\n\nexport function useClipboard() {\n const [copiedText, setCopiedText] = useState<string | null>(null);\n\n const copy = useCallback(async (text: string) => {\n await clipboard.copy(text);\n setCopiedText(text);\n }, []);\n\n const paste = useCallback(async () => {\n return clipboard.paste();\n }, []);\n\n const reset = useCallback(() => {\n setCopiedText(null);\n }, []);\n\n return { copy, paste, copiedText, reset };\n}\n\\`\\`\\`\n\n## OTP Verification Screen\n\n\\`\\`\\`tsx\nimport { useOTPAutoFill, OTP_INPUT_PROPS } from '@idealyst/clipboard';\nimport { useEffect, useState } from 'react';\nimport { TextInput, Platform } from 'react-native';\n\nfunction OTPVerificationScreen({ phoneNumber, onVerify }: {\n phoneNumber: string;\n onVerify: (code: string) => void;\n}) {\n const [code, setCode] = useState('');\n\n const otp = useOTPAutoFill({\n codeLength: 6,\n onCodeReceived: (receivedCode) => {\n setCode(receivedCode);\n onVerify(receivedCode);\n },\n });\n\n // Start listening when screen mounts\n useEffect(() => {\n otp.startListening();\n return () => otp.stopListening();\n }, []);\n\n // Auto-fill from hook on Android\n useEffect(() => {\n if (otp.code) {\n setCode(otp.code);\n }\n }, [otp.code]);\n\n return (\n <View>\n <Text>Enter the code sent to {phoneNumber}</Text>\n\n <TextInput\n value={code}\n onChangeText={(text) => {\n setCode(text);\n if (text.length === 6) onVerify(text);\n }}\n keyboardType=\"number-pad\"\n maxLength={6}\n {...OTP_INPUT_PROPS}\n />\n\n {Platform.OS === 'android' && otp.hash && (\n <Text style={{ fontSize: 10, color: '#999' }}>\n App hash (for SMS setup): {otp.hash}\n </Text>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Copy Invite Code\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\n\nfunction InviteCard({ code }: { code: string }) {\n const [copied, setCopied] = useState(false);\n\n return (\n <Card>\n <Text>Your invite code</Text>\n <Text variant=\"headline\">{code}</Text>\n <Button\n label={copied ? 'Copied!' : 'Copy Code'}\n iconName={copied ? 'check' : 'content-copy'}\n onPress={async () => {\n await clipboard.copy(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }}\n />\n </Card>\n );\n}\n\\`\\`\\`\n\n## Error Handling\n\n\\`\\`\\`tsx\nimport { clipboard } from '@idealyst/clipboard';\n\nasync function safeCopy(text: string): Promise<boolean> {\n try {\n await clipboard.copy(text);\n return true;\n } catch (error) {\n console.error('Clipboard copy failed:', error);\n // On web, this can fail if not in a secure context or without user gesture\n return false;\n }\n}\n\nasync function safePaste(): Promise<string | null> {\n try {\n const hasText = await clipboard.hasText();\n if (!hasText) return null;\n return await clipboard.paste();\n } catch (error) {\n console.error('Clipboard paste failed:', error);\n // Browser may deny permission\n return null;\n }\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Always use try-catch** — Clipboard operations can fail (permissions, secure context)\n2. **Provide visual feedback** — Show a \"Copied!\" confirmation after copying\n3. **Use OTP_INPUT_PROPS** — Always spread these on OTP text inputs for cross-platform autofill\n4. **Start OTP listener on mount** — Call \\`startListening()\\` in useEffect, clean up with \\`stopListening()\\`\n5. **Log the Android hash** — During development, log \\`hash\\` to configure your SMS gateway\n6. **Graceful degradation** — OTP features degrade gracefully if native modules aren't installed\n7. **Secure context (web)** — Clipboard API requires HTTPS on web\n`,\n};\n","export const biometricsGuides: Record<string, string> = {\n \"idealyst://biometrics/overview\": `# @idealyst/biometrics Overview\n\nCross-platform biometric authentication and passkeys (WebAuthn/FIDO2) for React and React Native applications.\n\n## Features\n\n- **Local Biometric Auth** — FaceID, TouchID, fingerprint, iris to gate access\n- **Passkeys (WebAuthn/FIDO2)** — Passwordless login with cryptographic credentials\n- **Cross-Platform** — Single API for React Native (iOS/Android) and Web\n- **React Native** — Uses expo-local-authentication for biometrics, react-native-passkeys for passkeys\n- **Web** — Uses WebAuthn API for both biometrics and passkeys\n- **Graceful Degradation** — Falls back cleanly when native modules aren't installed\n- **TypeScript** — Full type safety and IntelliSense support\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/biometrics\n\n# React Native — biometric auth:\nyarn add expo-local-authentication\ncd ios && pod install\n\n# React Native — passkeys (optional):\nyarn add react-native-passkeys\ncd ios && pod install\n\\`\\`\\`\n\n## Quick Start — Biometric Auth\n\n\\`\\`\\`tsx\nimport { isBiometricAvailable, authenticate } from '@idealyst/biometrics';\n\n// Check availability\nconst available = await isBiometricAvailable();\n\n// Prompt user\nif (available) {\n const result = await authenticate({\n promptMessage: 'Verify your identity',\n });\n\n if (result.success) {\n // Authenticated!\n } else {\n console.log(result.error, result.message);\n }\n}\n\\`\\`\\`\n\n## Quick Start — Passkeys\n\n\\`\\`\\`tsx\nimport { isPasskeySupported, createPasskey, getPasskey } from '@idealyst/biometrics';\n\n// Check support\nconst supported = await isPasskeySupported();\n\n// Register a new passkey\nconst credential = await createPasskey({\n challenge: serverChallenge,\n rp: { id: 'example.com', name: 'My App' },\n user: { id: userId, name: email, displayName: name },\n});\n// Send credential to server for verification\n\n// Sign in with passkey\nconst assertion = await getPasskey({\n challenge: serverChallenge,\n rpId: 'example.com',\n});\n// Send assertion to server for verification\n\\`\\`\\`\n\n## Platform Details\n\n- **React Native (biometrics)**: Uses \\`expo-local-authentication\\` — FaceID, TouchID, fingerprint, iris\n- **React Native (passkeys)**: Uses \\`react-native-passkeys\\` — system passkey UI on iOS 16+ and Android 9+\n- **Web (biometrics)**: Uses WebAuthn with \\`userVerification: 'required'\\` to trigger platform authenticator\n- **Web (passkeys)**: Uses \\`navigator.credentials.create/get\\` with the PublicKey API\n`,\n\n \"idealyst://biometrics/api\": `# Biometrics API Reference\n\nComplete API reference for @idealyst/biometrics.\n\n---\n\n## Biometric Authentication Functions\n\n### isBiometricAvailable\n\nCheck whether biometric auth hardware is available and enrolled.\n\n\\`\\`\\`tsx\nawait isBiometricAvailable(): Promise<boolean>\n\n// Native: checks hardware + enrollment via expo-local-authentication\n// Web: checks PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()\n\\`\\`\\`\n\n### getBiometricTypes\n\nReturn the biometric types available on this device.\n\n\\`\\`\\`tsx\nawait getBiometricTypes(): Promise<BiometricType[]>\n\ntype BiometricType = 'fingerprint' | 'facial_recognition' | 'iris';\n\n// Native: returns specific types (fingerprint, facial_recognition, iris)\n// Web: returns ['fingerprint'] as generic indicator, or [] if unavailable\n\\`\\`\\`\n\n### getSecurityLevel\n\nGet the security level of biometric authentication on the device.\n\n\\`\\`\\`tsx\nawait getSecurityLevel(): Promise<SecurityLevel>\n\ntype SecurityLevel = 'none' | 'device_credential' | 'biometric_weak' | 'biometric_strong';\n\n// Native: maps expo-local-authentication SecurityLevel enum\n// Web: returns 'biometric_strong' if platform authenticator available, else 'none'\n\\`\\`\\`\n\n### authenticate\n\nPrompt the user for biometric authentication.\n\n\\`\\`\\`tsx\nawait authenticate(options?: AuthenticateOptions): Promise<AuthResult>\n\\`\\`\\`\n\n**AuthenticateOptions:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| promptMessage | string | 'Authenticate' | Message shown alongside the biometric prompt |\n| cancelLabel | string | — | Label for the cancel button |\n| fallbackLabel | string | — | iOS: label for passcode fallback button |\n| disableDeviceFallback | boolean | false | Prevent PIN/passcode fallback after biometric failure |\n| requireStrongBiometric | boolean | false | Android: require Class 3 (strong) biometric |\n\n**AuthResult:**\n\n\\`\\`\\`tsx\ntype AuthResult =\n | { success: true }\n | { success: false; error: AuthError; message?: string };\n\ntype AuthError =\n | 'not_available'\n | 'not_enrolled'\n | 'user_cancel'\n | 'lockout'\n | 'system_cancel'\n | 'passcode_not_set'\n | 'authentication_failed'\n | 'unknown';\n\\`\\`\\`\n\n### cancelAuthentication\n\nCancel an in-progress authentication prompt (Android only). No-op on iOS and web.\n\n\\`\\`\\`tsx\nawait cancelAuthentication(): Promise<void>\n\\`\\`\\`\n\n---\n\n## Passkey Functions\n\n### isPasskeySupported\n\nCheck if passkeys (WebAuthn/FIDO2) are supported on this device/browser.\n\n\\`\\`\\`tsx\nawait isPasskeySupported(): Promise<boolean>\n\n// Web: checks PublicKeyCredential + isUserVerifyingPlatformAuthenticatorAvailable\n// Native: checks react-native-passkeys Passkey.isSupported()\n\\`\\`\\`\n\n### createPasskey\n\nCreate a new passkey credential (registration / attestation ceremony).\n\n\\`\\`\\`tsx\nawait createPasskey(options: PasskeyCreateOptions): Promise<PasskeyCreateResult>\n\\`\\`\\`\n\n**PasskeyCreateOptions:**\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| challenge | string | Yes | Base64url-encoded challenge from server |\n| rp | { id: string; name: string } | Yes | Relying party info |\n| user | { id: string; name: string; displayName: string } | Yes | User info (id is base64url) |\n| pubKeyCredParams | PublicKeyCredentialParam[] | No | Defaults to ES256 + RS256 |\n| timeout | number | No | Timeout in ms (default 60000) |\n| authenticatorSelection | object | No | Authenticator criteria |\n| excludeCredentials | CredentialDescriptor[] | No | Prevent re-registration |\n| attestation | string | No | 'none' \\\\| 'indirect' \\\\| 'direct' \\\\| 'enterprise' |\n\n**PasskeyCreateResult:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| id | string | Credential ID (base64url) |\n| rawId | string | Raw credential ID (base64url) |\n| type | 'public-key' | Always 'public-key' |\n| response.clientDataJSON | string | Client data (base64url) |\n| response.attestationObject | string | Attestation object (base64url) |\n\n### getPasskey\n\nAuthenticate with an existing passkey (assertion ceremony).\n\n\\`\\`\\`tsx\nawait getPasskey(options: PasskeyGetOptions): Promise<PasskeyGetResult>\n\\`\\`\\`\n\n**PasskeyGetOptions:**\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| challenge | string | Yes | Base64url-encoded challenge from server |\n| rpId | string | No | Relying party ID |\n| allowCredentials | CredentialDescriptor[] | No | Allowed credentials (empty = discoverable) |\n| timeout | number | No | Timeout in ms (default 60000) |\n| userVerification | string | No | 'required' \\\\| 'preferred' \\\\| 'discouraged' |\n\n**PasskeyGetResult:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| id | string | Credential ID (base64url) |\n| rawId | string | Raw credential ID (base64url) |\n| type | 'public-key' | Always 'public-key' |\n| response.clientDataJSON | string | Client data (base64url) |\n| response.authenticatorData | string | Authenticator data (base64url) |\n| response.signature | string | Signature (base64url) |\n| response.userHandle | string \\\\| undefined | User handle (base64url) |\n\n### PasskeyError\n\nBoth \\`createPasskey\\` and \\`getPasskey\\` throw a \\`PasskeyError\\` on failure:\n\n\\`\\`\\`tsx\ninterface PasskeyError {\n code: 'not_supported' | 'cancelled' | 'invalid_state' | 'not_allowed' | 'unknown';\n message: string;\n}\n\ntry {\n const result = await createPasskey(options);\n} catch (err) {\n const passkeyErr = err as PasskeyError;\n console.log(passkeyErr.code, passkeyErr.message);\n}\n\\`\\`\\`\n\n---\n\n## Base64url Helpers\n\nShared utilities for encoding/decoding WebAuthn binary data.\n\n\\`\\`\\`tsx\nimport { base64urlToBuffer, bufferToBase64url } from '@idealyst/biometrics';\n\n// Convert base64url string to ArrayBuffer\nconst buffer: ArrayBuffer = base64urlToBuffer(base64urlString);\n\n// Convert ArrayBuffer to base64url string\nconst str: string = bufferToBase64url(arrayBuffer);\n\\`\\`\\`\n`,\n\n \"idealyst://biometrics/examples\": `# Biometrics Examples\n\nComplete code examples for common @idealyst/biometrics patterns.\n\n## Gate Screen Access with Biometrics\n\n\\`\\`\\`tsx\nimport { isBiometricAvailable, authenticate } from '@idealyst/biometrics';\nimport { useEffect, useState } from 'react';\n\nfunction ProtectedScreen({ children }: { children: React.ReactNode }) {\n const [unlocked, setUnlocked] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const unlock = async () => {\n const available = await isBiometricAvailable();\n if (!available) {\n // No biometrics — fall back to PIN or allow access\n setUnlocked(true);\n return;\n }\n\n const result = await authenticate({\n promptMessage: 'Unlock to continue',\n cancelLabel: 'Cancel',\n });\n\n if (result.success) {\n setUnlocked(true);\n } else {\n setError(result.message ?? 'Authentication failed');\n }\n };\n\n useEffect(() => {\n unlock();\n }, []);\n\n if (!unlocked) {\n return (\n <View>\n <Text>Please authenticate to continue</Text>\n {error && <Text intent=\"negative\">{error}</Text>}\n <Button label=\"Try Again\" onPress={unlock} />\n </View>\n );\n }\n\n return <>{children}</>;\n}\n\\`\\`\\`\n\n## Confirm Sensitive Action\n\n\\`\\`\\`tsx\nimport { authenticate } from '@idealyst/biometrics';\n\nasync function confirmTransfer(amount: number, recipient: string) {\n const result = await authenticate({\n promptMessage: \\`Confirm transfer of $\\${amount} to \\${recipient}\\`,\n disableDeviceFallback: false,\n });\n\n if (!result.success) {\n throw new Error(result.message ?? 'Authentication required');\n }\n\n // Proceed with transfer\n await api.transfer({ amount, recipient });\n}\n\\`\\`\\`\n\n## Show Biometric Info\n\n\\`\\`\\`tsx\nimport {\n isBiometricAvailable,\n getBiometricTypes,\n getSecurityLevel,\n} from '@idealyst/biometrics';\n\nfunction BiometricSettings() {\n const [info, setInfo] = useState({\n available: false,\n types: [] as string[],\n level: 'none',\n });\n\n useEffect(() => {\n async function load() {\n const [available, types, level] = await Promise.all([\n isBiometricAvailable(),\n getBiometricTypes(),\n getSecurityLevel(),\n ]);\n setInfo({ available, types, level });\n }\n load();\n }, []);\n\n return (\n <Card>\n <Text>Biometric available: {info.available ? 'Yes' : 'No'}</Text>\n <Text>Types: {info.types.join(', ') || 'None'}</Text>\n <Text>Security level: {info.level}</Text>\n </Card>\n );\n}\n\\`\\`\\`\n\n## Passkey Registration Flow\n\n\\`\\`\\`tsx\nimport { isPasskeySupported, createPasskey } from '@idealyst/biometrics';\nimport type { PasskeyError } from '@idealyst/biometrics';\n\nasync function registerPasskey(user: { id: string; email: string; name: string }) {\n const supported = await isPasskeySupported();\n if (!supported) {\n alert('Passkeys are not supported on this device');\n return;\n }\n\n // 1. Get challenge from server\n const { challenge, rpId, rpName } = await api.getRegistrationChallenge();\n\n try {\n // 2. Create the passkey\n const credential = await createPasskey({\n challenge,\n rp: { id: rpId, name: rpName },\n user: {\n id: user.id,\n name: user.email,\n displayName: user.name,\n },\n authenticatorSelection: {\n residentKey: 'required',\n userVerification: 'required',\n },\n });\n\n // 3. Send to server for verification and storage\n await api.verifyRegistration({\n id: credential.id,\n rawId: credential.rawId,\n clientDataJSON: credential.response.clientDataJSON,\n attestationObject: credential.response.attestationObject,\n });\n\n alert('Passkey registered successfully!');\n } catch (err) {\n const passkeyErr = err as PasskeyError;\n if (passkeyErr.code === 'cancelled') {\n // User cancelled — do nothing\n return;\n }\n alert(\\`Failed to register passkey: \\${passkeyErr.message}\\`);\n }\n}\n\\`\\`\\`\n\n## Passkey Login Flow\n\n\\`\\`\\`tsx\nimport { getPasskey } from '@idealyst/biometrics';\nimport type { PasskeyError } from '@idealyst/biometrics';\n\nasync function loginWithPasskey() {\n // 1. Get challenge from server\n const { challenge, rpId } = await api.getAuthenticationChallenge();\n\n try {\n // 2. Authenticate with passkey\n const assertion = await getPasskey({\n challenge,\n rpId,\n userVerification: 'required',\n });\n\n // 3. Send to server for verification\n const session = await api.verifyAuthentication({\n id: assertion.id,\n rawId: assertion.rawId,\n clientDataJSON: assertion.response.clientDataJSON,\n authenticatorData: assertion.response.authenticatorData,\n signature: assertion.response.signature,\n userHandle: assertion.response.userHandle,\n });\n\n return session;\n } catch (err) {\n const passkeyErr = err as PasskeyError;\n if (passkeyErr.code === 'cancelled') return null;\n throw passkeyErr;\n }\n}\n\\`\\`\\`\n\n## Login Screen with Passkey + Fallback\n\n\\`\\`\\`tsx\nimport { isPasskeySupported, getPasskey } from '@idealyst/biometrics';\nimport type { PasskeyError } from '@idealyst/biometrics';\n\nfunction LoginScreen() {\n const [passkeyAvailable, setPasskeyAvailable] = useState(false);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n isPasskeySupported().then(setPasskeyAvailable);\n }, []);\n\n const handlePasskeyLogin = async () => {\n setLoading(true);\n try {\n const { challenge, rpId } = await api.getAuthenticationChallenge();\n const assertion = await getPasskey({ challenge, rpId });\n const session = await api.verifyAuthentication(assertion);\n navigateToHome(session);\n } catch (err) {\n const e = err as PasskeyError;\n if (e.code !== 'cancelled') {\n showError(e.message);\n }\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <View>\n <Text variant=\"headline\">Welcome Back</Text>\n\n {passkeyAvailable && (\n <Button\n label=\"Sign in with Passkey\"\n iconName=\"fingerprint\"\n onPress={handlePasskeyLogin}\n loading={loading}\n />\n )}\n\n <Button\n label=\"Sign in with Email\"\n intent=\"neutral\"\n onPress={navigateToEmailLogin}\n />\n </View>\n );\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Always check availability first** — Call \\`isBiometricAvailable()\\` or \\`isPasskeySupported()\\` before prompting\n2. **Provide fallbacks** — Not all devices support biometrics. Offer PIN/password alternatives\n3. **Handle cancellation gracefully** — Users may cancel the prompt. Don't show errors for \\`user_cancel\\` / \\`cancelled\\`\n4. **Use try/catch for passkeys** — Passkey functions throw \\`PasskeyError\\` on failure\n5. **Server-side validation** — Always verify passkey responses on your server. The client is untrusted\n6. **Base64url encoding** — All binary WebAuthn data is encoded as base64url strings for transport\n7. **Set rpId correctly** — The relying party ID must match your domain. On native, it's your associated domain\n8. **Lockout handling** — After too many failed biometric attempts, the device locks out. Handle the \\`lockout\\` error\n9. **iOS permissions** — FaceID requires \\`NSFaceIDUsageDescription\\` in Info.plist\n10. **Android associated domains** — Passkeys on Android require a Digital Asset Links file at \\`/.well-known/assetlinks.json\\`\n`,\n};\n","export const paymentsGuides: Record<string, string> = {\n \"idealyst://payments/overview\": `# @idealyst/payments Overview\n\nCross-platform payment provider abstractions for React and React Native. Wraps Stripe's Platform Pay API for Apple Pay and Google Pay on mobile.\n\n## Features\n\n- **Apple Pay** — Native iOS payment sheet via Stripe SDK\n- **Google Pay** — Native Android payment sheet via Stripe SDK\n- **Cross-Platform** — Single API for React Native and web (web is stub/noop)\n- **Flat Functions + Hook** — Use \\`initializePayments()\\`, \\`confirmPayment()\\` directly, or \\`usePayments()\\` hook\n- **Stripe Platform Pay** — Wraps \\`@stripe/stripe-react-native\\` Platform Pay API\n- **Graceful Degradation** — Falls back cleanly when Stripe SDK isn't installed\n- **TypeScript** — Full type safety\n\n## Installation\n\n\\`\\`\\`bash\nyarn add @idealyst/payments\n\n# React Native — required for mobile payments:\nyarn add @stripe/stripe-react-native\ncd ios && pod install\n\\`\\`\\`\n\n## Web Support\n\nWeb provides a functional stub — \\`initializePayments()\\` succeeds but all payment methods report as unavailable. Payment actions throw descriptive errors pointing to Stripe Elements (\\`@stripe/react-stripe-js\\`).\n\n## Quick Start\n\n\\`\\`\\`tsx\nimport { usePayments } from '@idealyst/payments';\n\nfunction CheckoutScreen() {\n const {\n isReady,\n isApplePayAvailable,\n isGooglePayAvailable,\n isProcessing,\n confirmPayment,\n } = usePayments({\n config: {\n publishableKey: 'pk_test_xxx',\n merchantIdentifier: 'merchant.com.myapp',\n merchantName: 'My App',\n merchantCountryCode: 'US',\n },\n });\n\n const handlePay = async () => {\n const result = await confirmPayment({\n clientSecret: 'pi_xxx_secret_xxx', // from server\n amount: { amount: 1099, currencyCode: 'usd' },\n });\n console.log('Paid:', result.paymentIntentId);\n };\n\n if (!isReady) return null;\n\n return (\n <Button\n onPress={handlePay}\n disabled={isProcessing}\n label={isApplePayAvailable ? 'Apple Pay' : 'Google Pay'}\n />\n );\n}\n\\`\\`\\`\n\n## Platform Support\n\n| Feature | iOS | Android | Web |\n|---------|-----|---------|-----|\n| Apple Pay | Yes | — | — |\n| Google Pay | — | Yes | — |\n| usePayments hook | Yes | Yes | Stub |\n| confirmPayment | Yes | Yes | Throws |\n| createPaymentMethod | Yes | Yes | Throws |\n`,\n\n \"idealyst://payments/api\": `# Payments API Reference\n\nComplete API reference for @idealyst/payments.\n\n---\n\n## Flat Functions\n\n### initializePayments\n\nInitialize the Stripe SDK for platform payments.\n\n\\`\\`\\`tsx\nimport { initializePayments } from '@idealyst/payments';\n\nawait initializePayments({\n publishableKey: 'pk_test_xxx',\n merchantIdentifier: 'merchant.com.myapp', // iOS Apple Pay\n merchantName: 'My App',\n merchantCountryCode: 'US',\n urlScheme: 'com.myapp', // for 3D Secure redirects\n testEnvironment: true, // Google Pay test mode\n});\n\\`\\`\\`\n\n**PaymentConfig:**\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| publishableKey | string | Yes | Stripe publishable key |\n| merchantIdentifier | string | No | Apple Pay merchant ID (iOS) |\n| merchantName | string | Yes | Display name on payment sheet |\n| merchantCountryCode | string | Yes | ISO 3166-1 alpha-2 country |\n| urlScheme | string | No | URL scheme for 3D Secure |\n| testEnvironment | boolean | No | Google Pay test mode (default: false) |\n\n### checkPaymentAvailability\n\nCheck which payment methods are available on the current device.\n\n\\`\\`\\`tsx\nimport { checkPaymentAvailability } from '@idealyst/payments';\n\nconst methods = await checkPaymentAvailability();\n// [\n// { type: 'apple_pay', isAvailable: true },\n// { type: 'google_pay', isAvailable: false, unavailableReason: '...' },\n// { type: 'card', isAvailable: true },\n// ]\n\\`\\`\\`\n\n### confirmPayment\n\nPresent the platform payment sheet and confirm a PaymentIntent. Requires a \\`clientSecret\\` from a server-created PaymentIntent.\n\n\\`\\`\\`tsx\nimport { confirmPayment } from '@idealyst/payments';\n\nconst result = await confirmPayment({\n clientSecret: 'pi_xxx_secret_xxx',\n amount: { amount: 1099, currencyCode: 'usd' },\n lineItems: [\n { label: 'Widget', amount: 999 },\n { label: 'Tax', amount: 100 },\n ],\n billingAddress: {\n isRequired: true,\n format: 'FULL',\n },\n});\n\nconsole.log(result.paymentIntentId); // 'pi_xxx'\nconsole.log(result.status); // 'succeeded'\n\\`\\`\\`\n\n### createPaymentMethod\n\nPresent the payment sheet and create a payment method without confirming. Returns a payment method ID for server-side processing.\n\n\\`\\`\\`tsx\nimport { createPaymentMethod } from '@idealyst/payments';\n\nconst result = await createPaymentMethod({\n amount: { amount: 1099, currencyCode: 'usd' },\n});\n\nconsole.log(result.paymentMethodId); // 'pm_xxx'\n// Send to your server for processing\n\\`\\`\\`\n\n### getPaymentStatus\n\nGet the current payment provider status.\n\n\\`\\`\\`tsx\nimport { getPaymentStatus } from '@idealyst/payments';\n\nconst status = getPaymentStatus();\n// { state: 'ready', availablePaymentMethods: [...], isPaymentAvailable: true }\n\\`\\`\\`\n\n---\n\n## usePayments Hook\n\nConvenience hook that wraps the flat functions with React state management.\n\n\\`\\`\\`tsx\nimport { usePayments } from '@idealyst/payments';\n\nconst {\n // State\n status, // PaymentProviderStatus\n isReady, // boolean\n isProcessing, // boolean\n availablePaymentMethods, // PaymentMethodAvailability[]\n isApplePayAvailable, // boolean\n isGooglePayAvailable,// boolean\n isPaymentAvailable, // boolean\n error, // PaymentError | null\n\n // Actions\n initialize, // (config: PaymentConfig) => Promise<void>\n checkAvailability, // () => Promise<PaymentMethodAvailability[]>\n confirmPayment, // (request: PaymentSheetRequest) => Promise<PaymentResult>\n createPaymentMethod, // (request: PaymentSheetRequest) => Promise<PaymentResult>\n clearError, // () => void\n} = usePayments(options?);\n\\`\\`\\`\n\n**UsePaymentsOptions:**\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| config | PaymentConfig | — | Auto-initialize with this config |\n| autoCheckAvailability | boolean | true | Check availability after init |\n\n---\n\n## Types\n\n### PaymentMethodType\n\n\\`\\`\\`tsx\ntype PaymentMethodType = 'apple_pay' | 'google_pay' | 'card';\n\\`\\`\\`\n\n### PaymentAmount\n\n\\`\\`\\`tsx\ninterface PaymentAmount {\n amount: number; // smallest currency unit (cents)\n currencyCode: string; // ISO 4217 (e.g., 'usd')\n}\n\\`\\`\\`\n\n### PaymentSheetRequest\n\n\\`\\`\\`tsx\ninterface PaymentSheetRequest {\n clientSecret?: string; // required for confirmPayment\n amount: PaymentAmount;\n lineItems?: PaymentLineItem[];\n billingAddress?: BillingAddressConfig;\n allowedPaymentMethods?: PaymentMethodType[];\n}\n\\`\\`\\`\n\n### PaymentResult\n\n\\`\\`\\`tsx\ninterface PaymentResult {\n paymentMethodType: PaymentMethodType;\n paymentMethodId?: string; // for createPaymentMethod\n paymentIntentId?: string; // for confirmPayment\n status?: string; // 'succeeded', 'requires_capture', etc.\n}\n\\`\\`\\`\n\n### PaymentError\n\n\\`\\`\\`tsx\ninterface PaymentError {\n code: PaymentErrorCode;\n message: string;\n originalError?: unknown;\n}\n\ntype PaymentErrorCode =\n | 'not_initialized'\n | 'not_available'\n | 'not_supported'\n | 'user_cancelled'\n | 'payment_failed'\n | 'network_error'\n | 'invalid_config'\n | 'invalid_request'\n | 'provider_error'\n | 'unknown';\n\\`\\`\\`\n`,\n\n \"idealyst://payments/examples\": `# Payments Examples\n\nComplete code examples for common @idealyst/payments patterns.\n\n## Basic Checkout with Hook\n\n\\`\\`\\`tsx\nimport { usePayments } from '@idealyst/payments';\nimport { Button, View, Text } from '@idealyst/components';\n\nfunction CheckoutScreen({ clientSecret }: { clientSecret: string }) {\n const {\n isReady,\n isApplePayAvailable,\n isGooglePayAvailable,\n isProcessing,\n error,\n confirmPayment,\n clearError,\n } = usePayments({\n config: {\n publishableKey: 'pk_test_xxx',\n merchantIdentifier: 'merchant.com.myapp',\n merchantName: 'My App',\n merchantCountryCode: 'US',\n testEnvironment: __DEV__,\n },\n });\n\n const handlePay = async () => {\n try {\n const result = await confirmPayment({\n clientSecret,\n amount: { amount: 1099, currencyCode: 'usd' },\n lineItems: [\n { label: 'Widget', amount: 999 },\n { label: 'Tax', amount: 100 },\n ],\n });\n\n // Payment succeeded\n console.log('Payment confirmed:', result.paymentIntentId);\n } catch (err) {\n // Error is automatically set in hook state\n console.error('Payment failed:', err);\n }\n };\n\n if (!isReady) {\n return <Text>Loading payment methods...</Text>;\n }\n\n const canPay = isApplePayAvailable || isGooglePayAvailable;\n\n return (\n <View>\n {canPay ? (\n <Button\n onPress={handlePay}\n disabled={isProcessing}\n intent=\"primary\"\n >\n {isApplePayAvailable ? 'Pay with Apple Pay' : 'Pay with Google Pay'}\n </Button>\n ) : (\n <Text>No payment methods available</Text>\n )}\n\n {error && (\n <View>\n <Text intent=\"danger\">{error.message}</Text>\n <Button onPress={clearError}>Dismiss</Button>\n </View>\n )}\n </View>\n );\n}\n\\`\\`\\`\n\n## Create Payment Method (Server-Side Confirm)\n\n\\`\\`\\`tsx\nimport { usePayments } from '@idealyst/payments';\n\nfunction DonateScreen() {\n const { isReady, isPaymentAvailable, createPaymentMethod } = usePayments({\n config: {\n publishableKey: 'pk_test_xxx',\n merchantName: 'Charity',\n merchantCountryCode: 'US',\n },\n });\n\n const handleDonate = async (amountCents: number) => {\n const result = await createPaymentMethod({\n amount: { amount: amountCents, currencyCode: 'usd' },\n });\n\n // Send payment method to your server\n await fetch('/api/donate', {\n method: 'POST',\n body: JSON.stringify({\n paymentMethodId: result.paymentMethodId,\n amount: amountCents,\n }),\n });\n };\n\n return (\n <View>\n <Button onPress={() => handleDonate(500)} disabled={!isPaymentAvailable}>\n Donate $5\n </Button>\n <Button onPress={() => handleDonate(1000)} disabled={!isPaymentAvailable}>\n Donate $10\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Flat Functions (No Hook)\n\n\\`\\`\\`tsx\nimport {\n initializePayments,\n checkPaymentAvailability,\n confirmPayment,\n getPaymentStatus,\n} from '@idealyst/payments';\nimport type { PaymentError } from '@idealyst/payments';\n\n// Initialize once at app startup\nasync function setupPayments() {\n await initializePayments({\n publishableKey: 'pk_test_xxx',\n merchantIdentifier: 'merchant.com.myapp',\n merchantName: 'My App',\n merchantCountryCode: 'US',\n });\n\n const status = getPaymentStatus();\n console.log('Payment ready:', status.state === 'ready');\n}\n\n// Check availability\nasync function canPay() {\n const methods = await checkPaymentAvailability();\n return methods.some(m => m.isAvailable);\n}\n\n// Process payment\nasync function processPayment(clientSecret: string, totalCents: number) {\n try {\n const result = await confirmPayment({\n clientSecret,\n amount: { amount: totalCents, currencyCode: 'usd' },\n });\n return result;\n } catch (err) {\n const paymentErr = err as PaymentError;\n if (paymentErr.code === 'user_cancelled') {\n return null; // User cancelled — not an error\n }\n throw paymentErr;\n }\n}\n\\`\\`\\`\n\n## Platform-Conditional UI\n\n\\`\\`\\`tsx\nimport { usePayments } from '@idealyst/payments';\nimport { Platform } from 'react-native';\n\nfunction PaymentButtons({ clientSecret }: { clientSecret: string }) {\n const {\n isApplePayAvailable,\n isGooglePayAvailable,\n confirmPayment,\n isProcessing,\n } = usePayments({\n config: {\n publishableKey: 'pk_test_xxx',\n merchantName: 'My Store',\n merchantCountryCode: 'US',\n },\n });\n\n const handlePlatformPay = () =>\n confirmPayment({\n clientSecret,\n amount: { amount: 2499, currencyCode: 'usd' },\n });\n\n return (\n <View>\n {isApplePayAvailable && (\n <Button\n onPress={handlePlatformPay}\n disabled={isProcessing}\n iconName=\"apple\"\n >\n Apple Pay\n </Button>\n )}\n\n {isGooglePayAvailable && (\n <Button\n onPress={handlePlatformPay}\n disabled={isProcessing}\n iconName=\"google\"\n >\n Google Pay\n </Button>\n )}\n\n {/* Always show a card fallback */}\n <Button\n onPress={() => navigateToCardForm()}\n intent=\"secondary\"\n >\n Pay with Card\n </Button>\n </View>\n );\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **Server-side PaymentIntent** — Always create PaymentIntents on your server, never on the client\n2. **Handle cancellation** — \\`user_cancelled\\` is not an error, don't show error UI for it\n3. **Test environment** — Set \\`testEnvironment: true\\` during development for Google Pay\n4. **Apple Pay merchant ID** — Requires Apple Developer Program and Xcode capability setup\n5. **Amounts in cents** — All amounts are in the smallest currency unit (1099 = $10.99)\n6. **Web fallback** — On web, use \\`@stripe/react-stripe-js\\` (Stripe Elements) directly\n7. **3D Secure** — Set \\`urlScheme\\` in config for 3D Secure / bank redirect flows on native\n8. **Error handling** — Always wrap \\`confirmPayment\\` / \\`createPaymentMethod\\` in try/catch\n`,\n};\n","/**\n * Idealyst Framework Package Registry\n * Central metadata for all @idealyst packages\n */\n\nexport interface PackageInfo {\n name: string;\n npmName: string;\n description: string;\n category: \"core\" | \"ui\" | \"media\" | \"data\" | \"auth\" | \"utility\" | \"tooling\";\n platforms: (\"web\" | \"native\" | \"node\")[];\n documentationStatus: \"full\" | \"partial\" | \"minimal\";\n installation: string;\n peerDependencies?: string[];\n features: string[];\n quickStart: string;\n apiHighlights?: string[];\n relatedPackages?: string[];\n}\n\nexport const packages: Record<string, PackageInfo> = {\n components: {\n name: \"Components\",\n npmName: \"@idealyst/components\",\n description:\n \"Cross-platform React UI components for web and React Native. Includes buttons, cards, inputs, dialogs, and 30+ more components with consistent styling.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/components @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\", \"react-native-unistyles\"],\n features: [\n \"36+ production-ready components\",\n \"Consistent API across web and native\",\n \"Theme-aware with automatic dark mode\",\n \"Accessible by default\",\n \"TypeScript-first with full type definitions\",\n \"Tree-shakeable exports\",\n ],\n quickStart: `import { Button, Card, Text } from '@idealyst/components';\n\n<Card>\n <Text typography=\"h5\" weight=\"bold\">Hello World</Text>\n <Button onPress={() => console.log('Pressed!')}>\n Click Me\n </Button>\n</Card>`,\n apiHighlights: [\n \"Button, IconButton, FAB\",\n \"Card, View, Screen\",\n \"TextInput, TextArea, Checkbox, Switch\",\n \"Dialog, Popover, Menu\",\n \"Text, Link, Badge, Chip\",\n ],\n relatedPackages: [\"theme\", \"navigation\"],\n },\n\n theme: {\n name: \"Theme\",\n npmName: \"@idealyst/theme\",\n description:\n \"Cross-platform theming system built on react-native-unistyles. Provides colors, typography, spacing, responsive breakpoints, shadow utilities, and style helpers with a fluent builder API.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/theme react-native-unistyles\",\n peerDependencies: [\"react-native-unistyles\"],\n features: [\n \"Light and dark theme variants\",\n \"Semantic color tokens (intent-based)\",\n \"Fluent builder API for theme creation\",\n \"Individual color modification (add/set surface, text, border, pallet)\",\n \"Intent management (addIntent, setIntent)\",\n \"Responsive breakpoints\",\n \"Typography scale\",\n \"Spacing and sizing utilities\",\n \"Platform-specific adaptations\",\n \"shadow() - Cross-platform shadow styles\",\n \"useStyleProps() - Unified Unistyles + inline style handling\",\n ],\n quickStart: `import { UnistylesProvider, shadow, useStyleProps } from '@idealyst/theme';\nimport { View } from '@idealyst/components';\n\n// Cross-platform shadows\n<View style={shadow({ radius: 10, y: 4, opacity: 0.15 })}>\n Shadowed content\n</View>\n\n// Unified style handling for custom components\nfunction MyComponent({ style }) {\n const styleProps = useStyleProps(\n (styles.container as any)({}), // Unistyles\n [style, { marginTop: 16 }] // Additional styles\n );\n return <View {...styleProps}>Content</View>;\n}`,\n apiHighlights: [\n \"createTheme() / fromTheme(base) - Theme builder\",\n \"addIntent() / setIntent() - Intent management\",\n \"addSurfaceColor() / setSurfaceColor() - Surface colors\",\n \"addTextColor() / setTextColor() - Text colors\",\n \"addBorderColor() / setBorderColor() - Border colors\",\n \"addPalletColor() / setPalletColor() - Pallet colors\",\n \"shadow({ radius, x, y, color, opacity }) - Cross-platform shadows\",\n \"useStyleProps(unistyles, inlineStyles) - Style prop unification\",\n \"Size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n \"Intent: 'primary' | 'secondary' | 'success' | 'warning' | 'danger'\",\n ],\n relatedPackages: [\"components\"],\n },\n\n navigation: {\n name: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description:\n \"Unified navigation system for web and React Native. Stack, tab, drawer, and modal navigators with type-safe routing.\",\n category: \"core\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/navigation\",\n peerDependencies: [\"@react-navigation/native (native only)\"],\n features: [\n \"Type-safe route definitions\",\n \"Stack, Tab, Drawer, Modal navigators\",\n \"Deep linking support\",\n \"Custom layouts for web (headers, sidebars)\",\n \"useNavigator hook for navigation actions\",\n \"Cross-platform URL handling\",\n ],\n quickStart: `import { Router, useNavigator } from '@idealyst/navigation';\n\nconst routes = {\n home: { path: '/', screen: HomeScreen },\n profile: { path: '/profile/:id', screen: ProfileScreen },\n};\n\n<Router routes={routes} />`,\n apiHighlights: [\n \"Router component\",\n \"useNavigator() hook\",\n \"Route configuration\",\n \"Navigator types (stack, tabs, drawer)\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n cli: {\n name: \"CLI\",\n npmName: \"@idealyst/cli\",\n description:\n \"Command-line tool for generating Idealyst projects. Creates monorepo workspaces with web, native, API, and database packages.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"npx @idealyst/cli init my-project\",\n features: [\n \"Monorepo workspace generation\",\n \"React Native app scaffolding\",\n \"Vite-based web app generation\",\n \"tRPC API server template\",\n \"Prisma database layer\",\n \"Shared library template\",\n ],\n quickStart: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Add a native app\ncd my-app\nnpx @idealyst/cli create mobile --type native --app-name \"My App\"\n\n# Add a web app\nnpx @idealyst/cli create web --type web --with-trpc`,\n apiHighlights: [\n \"idealyst init <name>\",\n \"idealyst create <name> --type native|web|api|database|shared\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n storage: {\n name: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with async API. Uses localStorage on web and AsyncStorage on React Native.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/storage\",\n peerDependencies: [\"@react-native-async-storage/async-storage (native)\"],\n features: [\n \"Unified API across platforms\",\n \"Async/await interface\",\n \"JSON serialization built-in\",\n \"TypeScript generics for type safety\",\n \"Prefix namespacing\",\n ],\n quickStart: `import { storage } from '@idealyst/storage';\n\n// Store a value\nawait storage.set('user', { name: 'Alice', id: 1 });\n\n// Retrieve a value\nconst user = await storage.get<User>('user');\n\n// Remove a value\nawait storage.remove('user');`,\n apiHighlights: [\n \"storage.get<T>(key)\",\n \"storage.set(key, value)\",\n \"storage.remove(key)\",\n \"storage.clear()\",\n ],\n relatedPackages: [\"oauth-client\", \"config\"],\n },\n\n translate: {\n name: \"Translate\",\n npmName: \"@idealyst/translate\",\n description:\n \"Internationalization (i18n) package with runtime API and Babel plugin for static key extraction.\",\n category: \"utility\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/translate\",\n features: [\n \"TranslateProvider for app-wide i18n\",\n \"useTranslation hook\",\n \"Interpolation support\",\n \"Pluralization\",\n \"Babel plugin for key extraction\",\n \"Missing translation detection\",\n ],\n quickStart: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\nfunction App() {\n return (\n <TranslateProvider translations={translations} defaultLanguage=\"en\">\n <MyComponent />\n </TranslateProvider>\n );\n}\n\nfunction MyComponent() {\n const { t } = useTranslation();\n return <Text>{t('greeting', { name: 'World' })}</Text>;\n}`,\n apiHighlights: [\n \"TranslateProvider\",\n \"useTranslation()\",\n \"useLanguage()\",\n \"Trans component\",\n ],\n relatedPackages: [\"components\"],\n },\n\n camera: {\n name: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture. Uses react-native-vision-camera on native and MediaDevices API on web.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/camera react-native-vision-camera\",\n peerDependencies: [\"react-native-vision-camera (native)\"],\n features: [\n \"Photo capture\",\n \"Video recording\",\n \"Camera switching (front/back)\",\n \"Flash control\",\n \"Zoom support\",\n \"Permission handling\",\n ],\n quickStart: `import { useCamera, CameraPreview, requestPermission } from '@idealyst/camera';\n\nfunction CameraScreen() {\n const camera = useCamera({ autoRequestPermission: true });\n\n const handleTakePhoto = async () => {\n const photo = await camera.takePhoto();\n console.log('Photo taken:', photo.uri);\n };\n\n return (\n <View style={{ flex: 1 }}>\n <CameraPreview camera={camera.cameraRef.current} style={{ flex: 1 }} />\n <Button onPress={handleTakePhoto} intent=\"primary\">Take Photo</Button>\n </View>\n );\n}`,\n apiHighlights: [\n \"CameraPreview component (NOT Camera)\",\n \"useCamera() hook — returns status, takePhoto, startRecording, stopRecording, cameraRef\",\n \"requestPermission() — standalone function (NOT useCameraPermission or requestCameraPermission)\",\n \"CameraStatus is an INTERFACE { state: CameraState, permission, isActive, error } — NOT a string enum\",\n \"CameraState = 'idle' | 'initializing' | 'ready' | 'recording' | 'capturing'\",\n \"PhotoResult { uri, width, height, metadata }\",\n \"VideoResult { uri, duration }\",\n ],\n relatedPackages: [\"components\", \"storage\"],\n },\n\n audio: {\n name: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for React and React Native. Provides recording with real-time PCM streaming, file playback, and session management for simultaneous recording and playback.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/audio react-native-audio-api\",\n peerDependencies: [\"react-native-audio-api (native)\"],\n features: [\n \"Recording with real-time PCM streaming\",\n \"File playback (mp3, wav, etc.)\",\n \"PCM streaming playback for TTS\",\n \"Audio session management (iOS/Android)\",\n \"Simultaneous recording and playback\",\n \"Audio level monitoring\",\n \"Configurable sample rates and bit depths\",\n \"Audio profiles (speech, music, phone)\",\n ],\n quickStart: `import { useRecorder, usePlayer, AUDIO_PROFILES } from '@idealyst/audio';\nimport type { PCMData } from '@idealyst/audio';\n\nfunction AudioApp() {\n const recorder = useRecorder({ config: AUDIO_PROFILES.speech });\n const player = usePlayer();\n const chunksRef = useRef<ArrayBuffer[]>([]);\n\n // Subscribe to PCM data chunks during recording\n useEffect(() => {\n // subscribeToData receives PCMData objects (NOT strings)\n // PCMData has: buffer (ArrayBufferLike), samples (Int16Array), timestamp, config, toBase64()\n const unsubscribe = recorder.subscribeToData((data: PCMData) => {\n chunksRef.current.push(data.buffer as ArrayBuffer);\n });\n return unsubscribe;\n }, [recorder.subscribeToData]);\n\n const handleRecord = async () => {\n if (recorder.isRecording) {\n await recorder.stop(); // stop() returns void — data comes via subscribeToData\n } else {\n chunksRef.current = [];\n await recorder.start();\n }\n };\n\n // Play back recorded PCM data\n const handlePlayback = async () => {\n await player.loadPCMStream(AUDIO_PROFILES.speech);\n await player.play();\n // feedPCMData accepts ArrayBufferLike | Int16Array (NOT strings)\n for (const chunk of chunksRef.current) {\n player.feedPCMData(chunk);\n }\n await player.flush();\n };\n\n // Play an audio file (mp3, wav, etc.)\n const handlePlayFile = async () => {\n await player.loadFile('/audio/music.mp3');\n await player.play();\n };\n\n return (\n <View>\n <Button onPress={handleRecord}>\n {recorder.isRecording ? 'Stop' : 'Record'}\n </Button>\n <Text typography=\"body2\">Duration: {recorder.duration}ms</Text>\n <Button onPress={handlePlayback} disabled={chunksRef.current.length === 0}>\n Play Recording\n </Button>\n </View>\n );\n}`,\n apiHighlights: [\n \"useRecorder() — PCM streaming recorder. stop() returns void. Use subscribeToData(cb) to receive PCMData chunks\",\n \"usePlayer() — File playback (loadFile) and PCM streaming (loadPCMStream + feedPCMData)\",\n \"PCMData type — { buffer: ArrayBufferLike, samples: Int16Array, timestamp, config, toBase64() }\",\n \"feedPCMData() accepts ArrayBufferLike | Int16Array — NOT strings\",\n \"useAudio() — Session management (iOS/Android)\",\n \"AUDIO_PROFILES — Pre-configured configs: speech, highQuality, studio, phone\",\n ],\n relatedPackages: [\"camera\", \"components\"],\n },\n\n datagrid: {\n name: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets. Supports sorting, filtering, and custom cell rendering.\",\n category: \"data\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/components\",\n \"@idealyst/theme\",\n \"react-window (web)\",\n ],\n features: [\n \"Virtualized rendering for large datasets\",\n \"Column sorting\",\n \"Row selection\",\n \"Custom cell renderers\",\n \"Fixed headers\",\n \"Responsive column sizing\",\n ],\n quickStart: `import { DataGrid } from '@idealyst/datagrid';\n\nconst columns = [\n { key: 'name', header: 'Name', width: 200 },\n { key: 'email', header: 'Email', width: 250 },\n { key: 'status', header: 'Status', width: 100 },\n];\n\n<DataGrid\n data={users}\n columns={columns}\n onRowClick={(row) => console.log('Selected:', row)}\n/>`,\n apiHighlights: [\n \"DataGrid component\",\n \"Column configuration\",\n \"Row selection callbacks\",\n \"Custom cell renderers\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n datepicker: {\n name: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description:\n \"Cross-platform date and time picker components. Includes calendar, time picker, and date range selection.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/datepicker @idealyst/theme\",\n peerDependencies: [\"@idealyst/theme\"],\n features: [\n \"Date picker with calendar\",\n \"Time picker\",\n \"Date range selection\",\n \"Min/max date constraints\",\n \"Locale support\",\n \"Customizable styling\",\n ],\n quickStart: `import { DatePicker, TimePicker } from '@idealyst/datepicker';\n\n<DatePicker\n value={selectedDate}\n onChange={setSelectedDate}\n minDate={new Date()}\n/>\n\n<TimePicker\n value={selectedTime}\n onChange={setSelectedTime}\n is24Hour={true}\n/>`,\n apiHighlights: [\n \"DatePicker component\",\n \"TimePicker component\",\n \"DateRangePicker component\",\n \"Calendar component\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n \"oauth-client\": {\n name: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description:\n \"Universal OAuth2 client for web and React Native. Supports authorization code flow with PKCE.\",\n category: \"auth\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n peerDependencies: [\"@idealyst/storage\"],\n features: [\n \"Authorization code flow with PKCE\",\n \"Token refresh handling\",\n \"Secure token storage\",\n \"Multiple provider support\",\n \"Silent token refresh\",\n \"Logout handling\",\n ],\n quickStart: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'myapp://callback',\n});\n\n// Start login flow\nawait oauth.login();\n\n// Get access token\nconst token = await oauth.getAccessToken();\n\n// Logout\nawait oauth.logout();`,\n apiHighlights: [\n \"OAuthClient class\",\n \"login() / logout()\",\n \"getAccessToken()\",\n \"Token refresh handling\",\n ],\n relatedPackages: [\"storage\", \"navigation\"],\n },\n\n config: {\n name: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support. Type-safe access to env vars on web and native.\",\n category: \"utility\",\n platforms: [\"web\", \"native\", \"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add @idealyst/config\",\n peerDependencies: [\"react-native-config (native)\"],\n features: [\n \"Type-safe environment variables\",\n \"Cross-platform API\",\n \"Build-time configuration\",\n \"Vite plugin for web\",\n \"React Native Config integration\",\n \"Default value support\",\n ],\n quickStart: `// config.ts\nimport { defineConfig } from '@idealyst/config';\n\nexport const config = defineConfig({\n API_URL: { required: true },\n DEBUG: { default: 'false' },\n APP_NAME: { default: 'My App' },\n});\n\n// Usage\nimport { config } from './config';\nconsole.log(config.API_URL);`,\n apiHighlights: [\n \"defineConfig()\",\n \"Type-safe config object\",\n \"Vite plugin\",\n \"CLI for generation\",\n ],\n relatedPackages: [\"storage\"],\n },\n\n tooling: {\n name: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description:\n \"Code analysis and validation utilities for Idealyst Framework. Includes Vite plugins and static analyzers.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"minimal\",\n installation: \"yarn add -D @idealyst/tooling\",\n features: [\n \"Component usage analysis\",\n \"Import validation\",\n \"Vite plugin for build-time checks\",\n \"Custom rule definitions\",\n \"Documentation generation\",\n ],\n quickStart: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [\n idealystPlugin({\n validateImports: true,\n analyzeUsage: true,\n }),\n ],\n};`,\n apiHighlights: [\n \"idealystPlugin() for Vite\",\n \"analyzeComponent()\",\n \"Custom rule API\",\n ],\n relatedPackages: [\"cli\"],\n },\n\n \"mcp-server\": {\n name: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server providing AI assistants with Idealyst framework documentation, types, and examples.\",\n category: \"tooling\",\n platforms: [\"node\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/mcp-server\",\n features: [\n \"Component documentation\",\n \"Type extraction from source\",\n \"Validated code examples\",\n \"Icon search (7,447 MDI icons)\",\n \"Navigation and theme guides\",\n \"CLI command reference\",\n ],\n quickStart: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n apiHighlights: [\n \"list_components\",\n \"get_component_docs\",\n \"search_icons\",\n \"get_*_types\",\n ],\n relatedPackages: [\"components\", \"theme\", \"navigation\"],\n },\n\n markdown: {\n name: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer for React and React Native. Supports GitHub Flavored Markdown with theme integration.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/markdown @idealyst/theme\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"react-markdown (web)\",\n \"remark-gfm (web)\",\n \"react-native-markdown-display (native)\",\n ],\n features: [\n \"GitHub Flavored Markdown support\",\n \"Tables, strikethrough, task lists\",\n \"Theme-integrated styling\",\n \"Custom link and image handlers\",\n \"Style overrides per element\",\n \"Cross-platform consistency\",\n ],\n quickStart: `import { Markdown } from '@idealyst/markdown';\n\n<Markdown\n size=\"md\"\n linkIntent=\"primary\"\n linkHandler={{\n onLinkPress: (url) => console.log('Link:', url),\n }}\n>\n{\\`# Hello World\n\nThis is **bold** and _italic_ text.\n\n| Column 1 | Column 2 |\n|----------|----------|\n| Data 1 | Data 2 |\n\\`}\n</Markdown>`,\n apiHighlights: [\n \"Markdown component\",\n \"size prop (xs-xl)\",\n \"linkIntent prop\",\n \"styleOverrides prop\",\n \"linkHandler / imageHandler\",\n ],\n relatedPackages: [\"components\", \"theme\"],\n },\n\n animate: {\n name: \"Animate\",\n npmName: \"@idealyst/animate\",\n description:\n \"Cross-platform animation hooks for React and React Native. Provides a unified API with CSS transitions on web and Reanimated on native for smooth, performant animations.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/animate react-native-reanimated\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"react-native-reanimated (native)\",\n ],\n features: [\n \"useAnimatedStyle - State-driven animations with transform object syntax\",\n \"usePresence - Mount/unmount animations with enter/exit states\",\n \"useAnimatedValue - Imperative animated values with interpolation\",\n \"useGradientBorder - Animated gradient border effects\",\n \"withAnimated HOC - Wrap components for Reanimated (native)\",\n \"Simplified transform syntax: { x, y, scale, rotate }\",\n \"Duration tokens: 'instant', 'fast', 'normal', 'slow', 'verySlow'\",\n \"Easing presets: 'linear', 'easeIn', 'easeOut', 'easeInOut', 'spring'\",\n \"Platform-specific overrides for fine-tuned control\",\n ],\n quickStart: `import { View } from '@idealyst/components';\nimport { withAnimated, useAnimatedStyle, usePresence } from '@idealyst/animate';\n\n// Wrap components for native animations\nconst AnimatedView = withAnimated(View);\n\nfunction FadeInComponent({ isVisible }: { isVisible: boolean }) {\n // State-driven animation with simplified transform syntax\n const style = useAnimatedStyle({\n opacity: isVisible ? 1 : 0,\n transform: { y: isVisible ? 0 : 20 },\n }, {\n duration: 'normal',\n easing: 'easeOut',\n });\n\n return <AnimatedView style={style}>Content</AnimatedView>;\n}\n\nfunction ModalContent({ isOpen }: { isOpen: boolean }) {\n // Mount/unmount animation\n const { isPresent, style } = usePresence(isOpen, {\n enter: { opacity: 1, transform: { y: 0, scale: 1 } },\n exit: { opacity: 0, transform: { y: -20, scale: 0.95 } },\n duration: 'fast',\n });\n\n return isPresent && <AnimatedView style={style}>Modal</AnimatedView>;\n}`,\n apiHighlights: [\n \"useAnimatedStyle(style, options) - Animate style changes\",\n \"usePresence(isVisible, { enter, exit }) - Mount/unmount animations\",\n \"useAnimatedValue(initial) - Imperative animated values\",\n \"useGradientBorder(options) - Animated gradient borders\",\n \"withAnimated(Component) - HOC for native (no-op on web)\",\n \"TransformObject: { x, y, scale, rotate, ... }\",\n \"Duration: 'instant' | 'fast' | 'normal' | 'slow' | 'verySlow'\",\n \"EasingKey: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'spring' | ...\",\n ],\n relatedPackages: [\"theme\", \"components\"],\n },\n\n lottie: {\n name: \"Lottie\",\n npmName: \"@idealyst/lottie\",\n description:\n \"Cross-platform Lottie animation component for React and React Native. Renders After Effects animations using lottie-web on web and lottie-react-native on native.\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/lottie lottie-web lottie-react-native\",\n peerDependencies: [\"lottie-web (web)\", \"lottie-react-native (native)\"],\n features: [\n \"Render After Effects animations from JSON\",\n \"URL, imported JSON, or require() sources\",\n \"Imperative ref API for playback control\",\n \"Autoplay, loop, and speed configuration\",\n \"Resize modes (cover, contain, center)\",\n \"Segment playback for partial animations\",\n \"Frame-level control and progress tracking\",\n \"Event callbacks (onComplete, onLoad, onError)\",\n \"Direction control (forward/reverse)\",\n ],\n quickStart: `import { Lottie, LottieRef } from '@idealyst/lottie';\nimport { useRef } from 'react';\n\n// Basic usage with URL\n<Lottie\n source=\"https://assets.example.com/animation.json\"\n autoPlay\n loop\n/>\n\n// With imported JSON\nimport animationData from './animation.json';\n<Lottie source={animationData} autoPlay />\n\n// With ref for imperative control\nfunction AnimatedComponent() {\n const lottieRef = useRef<LottieRef>(null);\n\n return (\n <>\n <Lottie\n ref={lottieRef}\n source={animationData}\n onComplete={() => console.log('Animation complete')}\n />\n <Button onPress={() => lottieRef.current?.play()}>Play</Button>\n <Button onPress={() => lottieRef.current?.pause()}>Pause</Button>\n <Button onPress={() => lottieRef.current?.setProgress(0.5)}>\n Go to 50%\n </Button>\n </>\n );\n}`,\n apiHighlights: [\n \"Lottie component\",\n \"LottieRef.play() / pause() / stop()\",\n \"LottieRef.setProgress(0-1)\",\n \"LottieRef.goToAndPlay(frame) / goToAndStop(frame)\",\n \"LottieRef.playSegments(start, end)\",\n \"LottieRef.setSpeed(speed) / setDirection(1 | -1)\",\n \"LottieRef.getCurrentFrame() / getTotalFrames()\",\n \"LottieSource: string | LottieJSON | { uri: string }\",\n \"ResizeMode: 'cover' | 'contain' | 'center'\",\n ],\n relatedPackages: [\"components\", \"animate\"],\n },\n\n charts: {\n name: \"Charts\",\n npmName: \"@idealyst/charts\",\n description:\n \"Cross-platform animated charting library for React and React Native. Supports line, bar, area, pie, scatter, and candlestick charts with dual-renderer architecture (SVG for web, Skia for native).\",\n category: \"ui\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/charts @idealyst/theme @idealyst/svg\",\n peerDependencies: [\n \"@idealyst/theme\",\n \"@idealyst/svg\",\n \"react-native-reanimated (native)\",\n \"react-native-gesture-handler (native)\",\n \"@shopify/react-native-skia (native, optional)\",\n ],\n features: [\n \"LineChart - Time series, trends with multiple curve types (linear, monotone, step)\",\n \"BarChart - Vertical/horizontal, grouped, stacked with staggered animations\",\n \"PieChart/DonutChart - Segment reveal animations (coming soon)\",\n \"AreaChart - Filled area with gradient support (coming soon)\",\n \"ScatterChart - Point clouds (coming soon)\",\n \"CandlestickChart - OHLC financial data (coming soon)\",\n \"Dual-renderer: SVG (web default) and Skia (native GPU-accelerated)\",\n \"Full animation support - entrance, transitions, interactions\",\n \"Theme integration - intent-based colors, dark mode\",\n \"Touch/mouse interactions - tooltips, selection\",\n \"Zoom/pan support (coming soon)\",\n \"Scale utilities - linear, band, time scales\",\n \"Responsive container sizing\",\n ],\n quickStart: `import { LineChart, BarChart, ChartProvider } from '@idealyst/charts';\n\n// Basic Line Chart with animation\n<LineChart\n data={[{\n id: 'revenue',\n name: 'Revenue',\n intent: 'primary',\n data: [\n { x: 'Jan', y: 100 },\n { x: 'Feb', y: 150 },\n { x: 'Mar', y: 120 },\n ],\n }]}\n height={300}\n curve=\"monotone\"\n showDots\n showArea\n animate\n/>\n\n// Animated Bar Chart with stagger effect\n<BarChart\n data={[{\n id: 'sales',\n name: 'Sales',\n intent: 'success',\n data: [\n { x: 'Q1', y: 120 },\n { x: 'Q2', y: 180 },\n { x: 'Q3', y: 150 },\n ],\n }]}\n height={300}\n animate\n barRadius={4}\n/>\n\n// App-wide chart defaults\n<ChartProvider renderer=\"svg\" defaultIntent=\"primary\">\n <App />\n</ChartProvider>`,\n apiHighlights: [\n \"LineChart - Line/area charts with curve interpolation\",\n \"BarChart - Bar charts with grouping/stacking\",\n \"ChartContainer - Responsive container with padding\",\n \"ChartProvider - App-wide renderer and defaults\",\n \"XAxis, YAxis, GridLines - Axis components\",\n \"useChartAnimation() - Custom animation hook\",\n \"useStaggeredAnimation() - Staggered entrance animations\",\n \"createLinearScale() - Numeric value scaling\",\n \"createBandScale() - Categorical scaling\",\n \"createTimeScale() - Date/time scaling\",\n \"generateLinePath() - SVG path generation\",\n \"CurveType: 'linear' | 'monotone' | 'step' | 'cardinal'\",\n \"Data: { id, name, intent?, color?, data: [{ x, y }] }\",\n ],\n relatedPackages: [\"theme\", \"svg\", \"animate\"],\n },\n\n \"files\": {\n name: \"Files\",\n npmName: \"@idealyst/files\",\n description:\n \"Cross-platform file picker, upload, and local file management for React and React Native. Supports chunked uploads for large files, background uploads on native, progress tracking, and retry logic.\",\n category: \"media\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation:\n \"yarn add @idealyst/files react-native-document-picker react-native-image-picker react-native-blob-util\",\n peerDependencies: [\n \"react-native-document-picker (native)\",\n \"react-native-image-picker (native)\",\n \"react-native-blob-util (native)\",\n ],\n features: [\n \"Cross-platform file picker with type filtering\",\n \"Camera capture support (native)\",\n \"Drag and drop support (web)\",\n \"Upload queue with concurrency control\",\n \"Progress tracking with speed and ETA\",\n \"Chunked uploads for large files (>50MB)\",\n \"Background uploads on native\",\n \"Automatic retry with exponential backoff\",\n \"Presets for common scenarios (avatar, documents, images)\",\n \"TypeScript-first with full type definitions\",\n ],\n quickStart: `import { useFilePicker, useFileUpload, FilePickerButton, UploadProgress } from '@idealyst/files';\n\nfunction UploadForm() {\n const { addFiles, uploads } = useFileUpload({ autoStart: true });\n\n return (\n <View>\n <FilePickerButton\n pickerConfig={{ allowedTypes: ['image'], multiple: true }}\n onPick={(result) => {\n if (!result.cancelled) {\n addFiles(result.files, {\n url: 'https://api.example.com/upload',\n fieldName: 'file',\n });\n }\n }}\n >\n Select Images\n </FilePickerButton>\n\n {uploads.map(upload => (\n <UploadProgress\n key={upload.id}\n upload={upload}\n showSpeed\n showETA\n />\n ))}\n </View>\n );\n}`,\n apiHighlights: [\n \"useFilePicker() - File selection hook. Returns { pick, files, isPicking }. Method is pick() — NOT pickFiles()\",\n \"useFileUpload() - Upload management hook\",\n \"FilePickerButton - Styled file picker button\",\n \"DropZone - Drag and drop area (web)\",\n \"UploadProgress - Progress indicator component\",\n \"FileType = 'image' | 'video' | 'audio' | 'document' | 'archive' | 'any' — NOT 'pdf', 'doc', 'xlsx'\",\n \"PickedFile has dimensions?: { width, height } — NOT top-level width/height\",\n \"FILE_PICKER_PRESETS - Common file type configs\",\n \"UPLOAD_PRESETS - Upload behavior presets\",\n \"Use customMimeTypes for specific formats like 'application/pdf'\",\n ],\n relatedPackages: [\"components\", \"camera\", \"storage\"],\n },\n\n clipboard: {\n name: \"Clipboard\",\n npmName: \"@idealyst/clipboard\",\n description:\n \"Cross-platform clipboard and OTP autofill for React and React Native. Copy/paste text and auto-detect SMS verification codes on mobile.\",\n category: \"utility\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/clipboard\",\n peerDependencies: [\n \"@react-native-clipboard/clipboard (native)\",\n \"react-native-otp-verify (Android OTP, optional)\",\n ],\n features: [\n \"Cross-platform copy/paste with async API\",\n \"Android SMS OTP auto-read via SMS Retriever API (no permissions)\",\n \"iOS OTP keyboard autofill via TextInput props\",\n \"Clipboard change listeners\",\n \"Graceful degradation when native modules missing\",\n ],\n quickStart: `import { clipboard } from '@idealyst/clipboard';\n\n// Copy text\nawait clipboard.copy('Hello, world!');\n\n// Paste text\nconst text = await clipboard.paste();\n\n// OTP auto-fill (mobile)\nimport { useOTPAutoFill, OTP_INPUT_PROPS } from '@idealyst/clipboard';\n\nfunction OTPScreen() {\n const { code, startListening } = useOTPAutoFill({\n codeLength: 6,\n onCodeReceived: (otp) => verifyOTP(otp),\n });\n\n useEffect(() => { startListening(); }, []);\n\n return <TextInput value={code ?? ''} {...OTP_INPUT_PROPS} />;\n}`,\n apiHighlights: [\n \"clipboard.copy(text) - Copy text to clipboard\",\n \"clipboard.paste() - Read text from clipboard\",\n \"clipboard.hasText() - Check if clipboard has text\",\n \"clipboard.addListener(fn) - Listen for copy events\",\n \"useOTPAutoFill({ codeLength, onCodeReceived }) - Auto-detect SMS OTP codes (Android)\",\n \"OTP_INPUT_PROPS - TextInput props for iOS OTP keyboard autofill\",\n ],\n relatedPackages: [\"storage\", \"components\"],\n },\n\n biometrics: {\n name: \"Biometrics\",\n npmName: \"@idealyst/biometrics\",\n description:\n \"Cross-platform biometric authentication and passkeys (WebAuthn/FIDO2) for React and React Native. FaceID, TouchID, fingerprint, iris, and passwordless login.\",\n category: \"auth\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/biometrics\",\n peerDependencies: [\n \"expo-local-authentication (native biometrics)\",\n \"react-native-passkeys (native passkeys, optional)\",\n ],\n features: [\n \"Local biometric auth — FaceID, TouchID, fingerprint, iris\",\n \"Passkeys (WebAuthn/FIDO2) — passwordless login with cryptographic credentials\",\n \"Cross-platform — single API for web and React Native\",\n \"Web biometrics via WebAuthn userVerification\",\n \"Web passkeys via navigator.credentials\",\n \"Graceful degradation when native modules missing\",\n \"Base64url encoding helpers for WebAuthn data\",\n ],\n quickStart: `import { isBiometricAvailable, authenticate } from '@idealyst/biometrics';\n\n// Check biometric availability\nconst available = await isBiometricAvailable();\n\n// Authenticate\nif (available) {\n const result = await authenticate({ promptMessage: 'Verify your identity' });\n if (result.success) {\n // Authenticated!\n }\n}\n\n// Passkeys\nimport { isPasskeySupported, createPasskey, getPasskey } from '@idealyst/biometrics';\n\nconst credential = await createPasskey({\n challenge: serverChallenge,\n rp: { id: 'example.com', name: 'My App' },\n user: { id: userId, name: email, displayName: name },\n});`,\n apiHighlights: [\n \"isBiometricAvailable() - Check biometric hardware and enrollment\",\n \"getBiometricTypes() - Get available biometric types\",\n \"getSecurityLevel() - Get device security level\",\n \"authenticate(options) - Prompt for biometric auth\",\n \"cancelAuthentication() - Cancel auth (Android)\",\n \"isPasskeySupported() - Check passkey support\",\n \"createPasskey(options) - Register a new passkey\",\n \"getPasskey(options) - Authenticate with passkey\",\n ],\n relatedPackages: [\"oauth-client\", \"storage\"],\n },\n\n payments: {\n name: \"Payments\",\n npmName: \"@idealyst/payments\",\n description:\n \"Cross-platform payment provider abstractions for React and React Native. Wraps Stripe Platform Pay API for Apple Pay and Google Pay on mobile. Web provides a stub directing to Stripe Elements.\",\n category: \"utility\",\n platforms: [\"web\", \"native\"],\n documentationStatus: \"full\",\n installation: \"yarn add @idealyst/payments @stripe/stripe-react-native\",\n peerDependencies: [\n \"@stripe/stripe-react-native (native)\",\n ],\n features: [\n \"Apple Pay via Stripe Platform Pay (iOS)\",\n \"Google Pay via Stripe Platform Pay (Android)\",\n \"Flat function API + usePayments convenience hook\",\n \"PaymentIntent confirmation flow\",\n \"Payment method creation flow\",\n \"Normalized error handling across platforms\",\n \"Graceful degradation when Stripe SDK missing\",\n \"Web stub with guidance to Stripe Elements\",\n ],\n quickStart: `import { usePayments } from '@idealyst/payments';\n\nconst { isReady, isApplePayAvailable, confirmPayment } = usePayments({\n config: {\n publishableKey: 'pk_test_xxx',\n merchantIdentifier: 'merchant.com.myapp',\n merchantName: 'My App',\n merchantCountryCode: 'US',\n },\n});\n\nconst result = await confirmPayment({\n clientSecret: 'pi_xxx_secret_xxx',\n amount: { amount: 1099, currencyCode: 'usd' },\n});`,\n apiHighlights: [\n \"initializePayments(config) - Initialize Stripe SDK\",\n \"checkPaymentAvailability() - Check Apple Pay / Google Pay / card\",\n \"confirmPayment(request) - Present sheet and confirm PaymentIntent\",\n \"createPaymentMethod(request) - Present sheet and create payment method\",\n \"getPaymentStatus() - Get current provider status\",\n \"usePayments(options?) - Convenience hook with state management\",\n ],\n relatedPackages: [\"biometrics\", \"oauth-client\"],\n },\n};\n\n/**\n * Get all packages grouped by category\n */\nexport function getPackagesByCategory(): Record<string, PackageInfo[]> {\n const grouped: Record<string, PackageInfo[]> = {};\n\n for (const pkg of Object.values(packages)) {\n if (!grouped[pkg.category]) {\n grouped[pkg.category] = [];\n }\n grouped[pkg.category].push(pkg);\n }\n\n return grouped;\n}\n\n/**\n * Get a summary list of all packages\n */\nexport function getPackageSummary(): Array<{\n name: string;\n npmName: string;\n category: string;\n description: string;\n platforms: string[];\n documentationStatus: string;\n}> {\n return Object.entries(packages).map(([key, pkg]) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n}\n\n/**\n * Search packages by query\n */\nexport function searchPackages(query: string): PackageInfo[] {\n const lowerQuery = query.toLowerCase();\n\n return Object.values(packages).filter(\n (pkg) =>\n pkg.name.toLowerCase().includes(lowerQuery) ||\n pkg.npmName.toLowerCase().includes(lowerQuery) ||\n pkg.description.toLowerCase().includes(lowerQuery) ||\n pkg.features.some((f) => f.toLowerCase().includes(lowerQuery)) ||\n pkg.category.toLowerCase().includes(lowerQuery)\n );\n}\n","/**\n * Auth Recipes - Login, signup, and authentication patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const authRecipes: Record<string, Recipe> = {\n \"login-form\": {\n name: \"Login Form\",\n description: \"A complete login form with email/password validation and error handling\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, TextInput, Card, Text, View } from '@idealyst/components';\n\ninterface LoginFormProps {\n onSubmit: (email: string, password: string) => Promise<void>;\n onForgotPassword?: () => void;\n}\n\nexport function LoginForm({ onSubmit, onForgotPassword }: LoginFormProps) {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [errors, setErrors] = useState<{ email?: string; password?: string }>({});\n const [isLoading, setIsLoading] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n\n const validate = () => {\n const newErrors: typeof errors = {};\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n setSubmitError(null);\n\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit(email, password);\n } catch (error) {\n setSubmitError(error instanceof Error ? error.message : 'Login failed');\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"h5\" weight=\"bold\" style={{ marginBottom: 24 }}>\n Sign In\n </Text>\n\n {submitError && (\n <View style={{ marginBottom: 16 }}>\n <Text typography=\"body2\" color=\"danger\">{submitError}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n inputMode=\"email\"\n autoCapitalize=\"none\"\n textContentType=\"emailAddress\"\n intent={errors.email ? 'danger' : undefined}\n />\n {errors.email && <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Password</Text>\n <TextInput\n placeholder=\"Enter your password\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n textContentType=\"password\"\n intent={errors.password ? 'danger' : undefined}\n />\n {errors.password && <Text typography=\"body2\" color=\"danger\">{errors.password}</Text>}\n </View>\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Sign In\n </Button>\n\n {onForgotPassword && (\n <Button type=\"text\" onPress={onForgotPassword}>\n Forgot Password?\n </Button>\n )}\n </View>\n </Card>\n );\n}`,\n explanation: `This login form demonstrates:\n- Controlled inputs with useState\n- Client-side validation with error messages\n- Loading state during submission\n- Error handling for failed login attempts\n- Proper keyboard types and autocomplete hints for better UX`,\n tips: [\n \"Add onBlur validation for immediate feedback\",\n \"Consider using react-hook-form for complex forms\",\n \"Store tokens securely using @idealyst/storage after successful login\",\n ],\n relatedRecipes: [\"signup-form\", \"forgot-password\", \"protected-route\"],\n },\n\n \"signup-form\": {\n name: \"Signup Form\",\n description: \"User registration form with password confirmation and terms acceptance\",\n category: \"auth\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React, { useState } from 'react';\nimport { Button, TextInput, Card, Text, View, Checkbox, Link } from '@idealyst/components';\n\ninterface SignupFormProps {\n onSubmit: (data: { name: string; email: string; password: string }) => Promise<void>;\n onTermsPress?: () => void;\n}\n\nexport function SignupForm({ onSubmit, onTermsPress }: SignupFormProps) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [acceptedTerms, setAcceptedTerms] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [isLoading, setIsLoading] = useState(false);\n\n const validate = () => {\n const newErrors: Record<string, string> = {};\n\n if (!name.trim()) {\n newErrors.name = 'Name is required';\n }\n\n if (!email) {\n newErrors.email = 'Email is required';\n } else if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(email)) {\n newErrors.email = 'Please enter a valid email';\n }\n\n if (!password) {\n newErrors.password = 'Password is required';\n } else if (password.length < 8) {\n newErrors.password = 'Password must be at least 8 characters';\n }\n\n if (password !== confirmPassword) {\n newErrors.confirmPassword = 'Passwords do not match';\n }\n\n if (!acceptedTerms) {\n newErrors.terms = 'You must accept the terms and conditions';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n const handleSubmit = async () => {\n if (!validate()) return;\n\n setIsLoading(true);\n try {\n await onSubmit({ name, email, password });\n } catch (error) {\n setErrors({ submit: error instanceof Error ? error.message : 'Signup failed' });\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"h5\" weight=\"bold\" style={{ marginBottom: 24 }}>\n Create Account\n </Text>\n\n {errors.submit && (\n <View style={{ marginBottom: 16 }}>\n <Text typography=\"body2\" color=\"danger\">{errors.submit}</Text>\n </View>\n )}\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Full Name</Text>\n <TextInput\n placeholder=\"John Doe\"\n value={name}\n onChangeText={setName}\n textContentType=\"name\"\n intent={errors.name ? 'danger' : undefined}\n />\n {errors.name && <Text typography=\"body2\" color=\"danger\">{errors.name}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n placeholder=\"you@example.com\"\n value={email}\n onChangeText={setEmail}\n inputMode=\"email\"\n autoCapitalize=\"none\"\n textContentType=\"emailAddress\"\n intent={errors.email ? 'danger' : undefined}\n />\n {errors.email && <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Password</Text>\n <TextInput\n placeholder=\"At least 8 characters\"\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n textContentType=\"newPassword\"\n intent={errors.password ? 'danger' : undefined}\n />\n {errors.password && <Text typography=\"body2\" color=\"danger\">{errors.password}</Text>}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Confirm Password</Text>\n <TextInput\n placeholder=\"Confirm your password\"\n value={confirmPassword}\n onChangeText={setConfirmPassword}\n secureTextEntry\n textContentType=\"newPassword\"\n intent={errors.confirmPassword ? 'danger' : undefined}\n />\n {errors.confirmPassword && <Text typography=\"body2\" color=\"danger\">{errors.confirmPassword}</Text>}\n </View>\n\n <Checkbox\n checked={acceptedTerms}\n onChange={setAcceptedTerms}\n error={errors.terms}\n >\n <Text typography=\"body2\">\n I agree to the{' '}\n <Link to=\"/terms\" onPress={onTermsPress}>Terms and Conditions</Link>\n </Text>\n </Checkbox>\n\n <Button\n onPress={handleSubmit}\n loading={isLoading}\n disabled={isLoading}\n >\n Create Account\n </Button>\n </View>\n </Card>\n );\n}`,\n explanation: `This signup form includes:\n- Multiple field validation including password matching\n- Terms and conditions checkbox with validation\n- Proper autocomplete hints for password managers\n- Loading and error states`,\n tips: [\n \"Add password strength indicator for better UX\",\n \"Consider email verification flow after signup\",\n \"Use secure password hashing on the backend\",\n ],\n relatedRecipes: [\"login-form\", \"email-verification\"],\n },\n\n \"protected-route\": {\n name: \"Protected Route\",\n description: \"Route guard that redirects unauthenticated users\",\n category: \"auth\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React, { useEffect } from 'react';\nimport { View, ActivityIndicator } from '@idealyst/components';\nimport { useNavigator } from '@idealyst/navigation';\n\ninterface ProtectedRouteProps {\n children: React.ReactNode;\n isAuthenticated: boolean;\n isLoading?: boolean;\n redirectTo?: string;\n}\n\nexport function ProtectedRoute({\n children,\n isAuthenticated,\n isLoading = false,\n redirectTo = '/login',\n}: ProtectedRouteProps) {\n const { navigate } = useNavigator();\n\n useEffect(() => {\n if (!isLoading && !isAuthenticated) {\n navigate({ path: redirectTo, replace: true });\n }\n }, [isAuthenticated, isLoading, navigate, redirectTo]);\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n if (!isAuthenticated) {\n return null;\n }\n\n return <>{children}</>;\n}\n\n// Usage with auth context\nimport { useAuth } from './AuthContext';\n\nfunction DashboardScreen() {\n const { isAuthenticated, isLoading } = useAuth();\n\n return (\n <ProtectedRoute isAuthenticated={isAuthenticated} isLoading={isLoading}>\n <DashboardContent />\n </ProtectedRoute>\n );\n}`,\n explanation: `Protected routes prevent unauthorized access:\n- Checks authentication state\n- Shows loading indicator while checking\n- Redirects to login if not authenticated\n- Renders children only when authenticated`,\n tips: [\n \"Store redirect URL to return after login\",\n \"Use React Context for global auth state\",\n \"Consider role-based access for admin routes\",\n ],\n relatedRecipes: [\"login-form\", \"auth-context\"],\n },\n};\n","/**\n * Settings Recipes - App settings and preferences\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const settingsRecipes: Record<string, Recipe> = {\n \"settings-screen\": {\n name: \"Settings Screen\",\n description: \"App settings screen with toggles, selections, and grouped options\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { useState, useEffect } from 'react';\nimport {\n Screen, View, Text, Switch, Select, Card, Divider, Icon,\n} from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { ThemeSettings } from '@idealyst/theme';\nimport { storage } from '@idealyst/storage';\n\ninterface Settings {\n notifications: boolean;\n emailUpdates: boolean;\n darkMode: boolean;\n language: string;\n fontSize: string;\n}\n\nconst defaultSettings: Settings = {\n notifications: true,\n emailUpdates: false,\n darkMode: false,\n language: 'en',\n fontSize: 'medium',\n};\n\nexport function SettingsScreen() {\n const [settings, setSettings] = useState<Settings>(defaultSettings);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n loadSettings();\n }, []);\n\n const loadSettings = async () => {\n try {\n const raw = await storage.getItem('user-settings');\n if (raw) {\n setSettings(JSON.parse(raw) as Settings);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n const updateSetting = async <K extends keyof Settings>(\n key: K,\n value: Settings[K]\n ) => {\n const newSettings = { ...settings, [key]: value };\n setSettings(newSettings);\n await storage.setItem('user-settings', JSON.stringify(newSettings));\n\n // Apply dark mode toggle immediately\n if (key === 'darkMode') {\n const isDark = value as boolean;\n ThemeSettings.setAdaptiveThemes(false);\n // setTheme(lightTheme, darkTheme) — pass same value for both to force a single mode\n ThemeSettings.setTheme(isDark ? 'dark' : 'light', isDark ? 'dark' : 'light');\n }\n };\n\n if (isLoading) {\n return (\n <Screen safeArea padding=\"md\">\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Text typography=\"body1\">Loading...</Text>\n </View>\n </Screen>\n );\n }\n\n return (\n <Screen scrollable safeArea padding=\"md\">\n <View gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">Settings</Text>\n\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"h6\" weight=\"semibold\">Notifications</Text>\n\n <SettingRow icon=\"bell\" label=\"Push Notifications\" description=\"Receive push notifications\">\n <Switch\n checked={settings.notifications}\n onChange={(v) => updateSetting('notifications', v)}\n />\n </SettingRow>\n\n <Divider spacing=\"xs\" />\n\n <SettingRow icon=\"email\" label=\"Email Updates\" description=\"Receive weekly email updates\">\n <Switch\n checked={settings.emailUpdates}\n onChange={(v) => updateSetting('emailUpdates', v)}\n />\n </SettingRow>\n </Card>\n\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"h6\" weight=\"semibold\">Appearance</Text>\n\n <SettingRow icon=\"theme-light-dark\" label=\"Dark Mode\" description=\"Use dark theme\">\n <Switch\n checked={settings.darkMode}\n onChange={(v) => updateSetting('darkMode', v)}\n />\n </SettingRow>\n\n <Divider spacing=\"xs\" />\n\n <SettingRow icon=\"format-size\" label=\"Font Size\">\n <Select\n value={settings.fontSize}\n onChange={(v) => updateSetting('fontSize', v)}\n options={[\n { label: 'Small', value: 'small' },\n { label: 'Medium', value: 'medium' },\n { label: 'Large', value: 'large' },\n ]}\n />\n </SettingRow>\n </Card>\n </View>\n </Screen>\n );\n}\n\nfunction SettingRow({ icon, label, description, children }: {\n icon: IconName;\n label: string;\n description?: string;\n children?: React.ReactNode;\n}) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12, flex: 1 }}>\n <Icon name={icon} size=\"sm\" />\n <View style={{ flex: 1 }}>\n <Text typography=\"body1\">{label}</Text>\n {description && <Text typography=\"caption\" color=\"tertiary\">{description}</Text>}\n </View>\n </View>\n {children}\n </View>\n );\n}`,\n explanation: `This settings screen demonstrates:\n- Loading and persisting settings with @idealyst/storage\n- Grouped settings sections with Cards\n- Switch toggles for boolean options\n- Select dropdowns for choices\n- Reusable SettingRow component with IconName typing\n- Theme switching via ThemeSettings (not direct Unistyles)`,\n tips: [\n \"Consider debouncing saves for rapid toggles\",\n \"Add a 'Reset to Defaults' option\",\n \"Use IconName type (not string) when passing icon names through props\",\n \"Use ThemeSettings.setTheme() for theme switching — never import from react-native-unistyles\",\n \"Button uses leftIcon/rightIcon — NOT icon. <Button leftIcon=\\\"check\\\">Save</Button>\",\n ],\n relatedRecipes: [\"theme-switcher\", \"profile-screen\"],\n },\n\n \"theme-switcher\": {\n name: \"Theme Switcher\",\n description: \"Toggle between light and dark mode with persistence\",\n category: \"settings\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\", \"@idealyst/storage\"],\n code: `import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { ThemeSettings, getColorScheme } from '@idealyst/theme';\nimport { storage } from '@idealyst/storage';\nimport { Switch, View, Text, Icon, Pressable } from '@idealyst/components';\n\ntype ThemeMode = 'light' | 'dark' | 'system';\n\ninterface ThemeContextType {\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n isDark: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextType | null>(null);\n\nexport function ThemeProvider({ children }: { children: React.ReactNode }) {\n const [mode, setModeState] = useState<ThemeMode>('system');\n const [isLoaded, setIsLoaded] = useState(false);\n\n useEffect(() => {\n loadTheme();\n }, []);\n\n useEffect(() => {\n if (!isLoaded) return;\n\n if (mode === 'system') {\n ThemeSettings.setAdaptiveThemes(true);\n } else {\n ThemeSettings.setAdaptiveThemes(false);\n // setTheme(lightTheme, darkTheme) — pass same value for both to force a single mode\n ThemeSettings.setTheme(mode, mode);\n }\n }, [mode, isLoaded]);\n\n const loadTheme = async () => {\n const saved = await storage.getItem('theme-mode');\n if (saved) setModeState(saved as ThemeMode);\n setIsLoaded(true);\n };\n\n const setMode = async (newMode: ThemeMode) => {\n setModeState(newMode);\n await storage.setItem('theme-mode', newMode);\n };\n\n const isDark = mode === 'dark' ||\n (mode === 'system' && getColorScheme() === 'dark');\n\n if (!isLoaded) return null;\n\n return (\n <ThemeContext.Provider value={{ mode, setMode, isDark }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeMode() {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useThemeMode must be used within ThemeProvider');\n return context;\n}\n\nexport function ThemeToggle() {\n const { isDark, setMode } = useThemeMode();\n\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Icon name={isDark ? 'weather-night' : 'weather-sunny'} size=\"sm\" />\n <Text typography=\"body1\">Dark Mode</Text>\n <Switch\n checked={isDark}\n onChange={(checked) => setMode(checked ? 'dark' : 'light')}\n />\n </View>\n );\n}\n\nexport function ThemeSelector() {\n const { mode, setMode } = useThemeMode();\n\n return (\n <View gap=\"sm\">\n {(['light', 'dark', 'system'] as const).map((m) => (\n <Pressable key={m} onPress={() => setMode(m)}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n padding: 12,\n borderRadius: 8,\n backgroundColor: mode === m ? 'rgba(0,0,0,0.1)' : 'transparent',\n }}\n >\n <Icon\n name={m === 'light' ? 'weather-sunny' : m === 'dark' ? 'weather-night' : 'cellphone'}\n size=\"sm\"\n />\n <Text typography=\"body1\" style={{ textTransform: 'capitalize' }}>{m}</Text>\n {mode === m && <Icon name=\"check\" size=\"sm\" intent=\"success\" />}\n </View>\n </Pressable>\n ))}\n </View>\n );\n}`,\n explanation: `This theme switcher provides:\n- ThemeProvider context for app-wide theme state\n- Persistence with @idealyst/storage\n- Support for light, dark, and system-follow modes\n- Uses ThemeSettings and getColorScheme from @idealyst/theme (not Unistyles directly)\n- Both simple toggle and full selector UI components`,\n tips: [\n \"Wrap your app root with ThemeProvider\",\n \"The system option follows device settings automatically via ThemeSettings.setAdaptiveThemes()\",\n \"Theme changes are instant with no reload required\",\n \"Never import from react-native-unistyles — use @idealyst/theme utilities instead\",\n ],\n relatedRecipes: [\"settings-screen\"],\n },\n\n \"profile-screen\": {\n name: \"Profile Screen\",\n description:\n \"User profile screen with avatar, info display, edit form, and skeleton loading state\",\n category: \"settings\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState } from 'react';\nimport {\n Screen, View, Text, TextInput, TextArea, Button, Card,\n Avatar, Icon, Skeleton, Divider, Pressable,\n} from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\n\ninterface UserProfile {\n name: string;\n email: string;\n bio: string;\n avatarUrl: string;\n}\n\nconst mockUser: UserProfile = {\n name: 'Jane Doe',\n email: 'jane@example.com',\n bio: 'Software engineer who loves building cross-platform apps.',\n avatarUrl: 'https://i.pravatar.cc/150?u=jane',\n};\n\nexport function ProfileScreen() {\n const [user, setUser] = useState<UserProfile | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [editData, setEditData] = useState<UserProfile>(mockUser);\n const [isLoading, setIsLoading] = useState(true);\n\n // Simulate data loading\n React.useEffect(() => {\n const timer = setTimeout(() => {\n setUser(mockUser);\n setIsLoading(false);\n }, 1500);\n return () => clearTimeout(timer);\n }, []);\n\n if (isLoading) {\n return (\n <Screen safeArea padding=\"md\">\n <ProfileSkeleton />\n </Screen>\n );\n }\n\n if (!user) return null;\n\n const handleSave = () => {\n setUser(editData);\n setIsEditing(false);\n };\n\n return (\n <Screen scrollable safeArea padding=\"md\">\n <View gap=\"md\">\n {/* Profile Header */}\n <Card padding=\"lg\">\n <View style={{ alignItems: 'center' }} gap=\"sm\">\n <Avatar src={user.avatarUrl} fallback={user.name.slice(0, 2)} size=\"xl\" />\n <Text typography=\"h5\" weight=\"bold\">{user.name}</Text>\n <Text typography=\"body2\" color=\"secondary\">{user.email}</Text>\n {user.bio ? (\n <Text typography=\"body2\" style={{ textAlign: 'center' }}>{user.bio}</Text>\n ) : null}\n </View>\n </Card>\n\n {/* Edit Profile Section */}\n {isEditing ? (\n <Card padding=\"md\">\n <Text typography=\"h6\" weight=\"semibold\" style={{ marginBottom: 16 }}>Edit Profile</Text>\n <View gap=\"md\">\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Name</Text>\n <TextInput\n value={editData.name}\n onChangeText={(v) => setEditData({ ...editData, name: v })}\n placeholder=\"Your name\"\n />\n </View>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n value={editData.email}\n onChangeText={(v) => setEditData({ ...editData, email: v })}\n placeholder=\"you@example.com\"\n inputMode=\"email\"\n autoCapitalize=\"none\"\n />\n </View>\n <TextArea\n label=\"Bio\"\n value={editData.bio}\n onChange={(v) => setEditData({ ...editData, bio: v })}\n placeholder=\"Tell us about yourself...\"\n rows={3}\n />\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button onPress={() => setIsEditing(false)} type=\"outlined\" style={{ flex: 1 }}>\n Cancel\n </Button>\n <Button onPress={handleSave} intent=\"primary\" style={{ flex: 1 }}>\n Save\n </Button>\n </View>\n </View>\n </Card>\n ) : (\n <Button\n onPress={() => { setEditData(user); setIsEditing(true); }}\n type=\"outlined\"\n leftIcon=\"account-edit\"\n >\n Edit Profile\n </Button>\n )}\n\n {/* Profile Menu */}\n <Card padding=\"md\" gap=\"xs\">\n <ProfileMenuItem icon=\"cog\" label=\"Settings\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"bell\" label=\"Notifications\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"shield-check\" label=\"Privacy\" onPress={() => {}} />\n <Divider spacing=\"xs\" />\n <ProfileMenuItem icon=\"help-circle\" label=\"Help & Support\" onPress={() => {}} />\n </Card>\n\n <Button onPress={() => {}} intent=\"danger\" type=\"text\" leftIcon=\"logout\">\n Log Out\n </Button>\n </View>\n </Screen>\n );\n}\n\nfunction ProfileMenuItem({ icon, label, onPress }: {\n icon: IconName;\n label: string;\n onPress: () => void;\n}) {\n return (\n <Pressable onPress={onPress}>\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingVertical: 12,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Icon name={icon} size=\"sm\" />\n <Text typography=\"body1\">{label}</Text>\n </View>\n <Icon name=\"chevron-right\" size=\"sm\" />\n </View>\n </Pressable>\n );\n}\n\nfunction ProfileSkeleton() {\n return (\n <View gap=\"md\">\n <Card padding=\"lg\">\n <View style={{ alignItems: 'center' }} gap=\"sm\">\n <Skeleton shape=\"circle\" width={80} height={80} />\n <Skeleton width={150} height={16} />\n <Skeleton width={200} height={14} />\n <Skeleton width={250} height={14} />\n </View>\n </Card>\n <Skeleton width=\"100%\" height={48} shape=\"rounded\" />\n <Card padding=\"md\" gap=\"sm\">\n <Skeleton width=\"100%\" height={48} />\n <Skeleton width=\"100%\" height={48} />\n <Skeleton width=\"100%\" height={48} />\n </Card>\n </View>\n );\n}`,\n explanation: `This profile screen demonstrates:\n- User info display with Avatar, name, email, and bio\n- Inline edit form toggling with TextInput and TextArea\n- Skeleton loading state while user data loads\n- Pressable menu items with icons (NOT View with onPress)\n- IconName typing for icon props (NOT string)\n- Button with leftIcon/rightIcon (NOT icon prop)\n- Card used as simple container (NO Card.Content/Card.Header)`,\n tips: [\n \"Use Pressable for interactive rows — View does NOT have onPress\",\n \"Avatar uses src for image URL and fallback for initials\",\n \"TextInput does NOT have label/error props — compose with Text + View\",\n \"TextArea DOES have label and error props\",\n \"Use leftIcon on Button, not icon: <Button leftIcon=\\\"edit\\\">Edit</Button>\",\n \"Skeleton uses 'shape' prop: 'rectangle' | 'circle' | 'rounded' (NOT 'variant')\",\n ],\n relatedRecipes: [\"settings-screen\", \"form-with-validation\", \"skeleton-loading\"],\n },\n};\n","/**\n * Navigation Recipes - Tab, drawer, stack, and responsive navigation patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const navigationRecipes: Record<string, Recipe> = {\n \"tab-navigation\": {\n name: \"Tab Navigation\",\n description: \"Bottom tab navigation with icons and badges\",\n category: \"navigation\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { NavigatorProvider } from '@idealyst/navigation';\nimport type { TabNavigatorParam } from '@idealyst/navigation';\nimport { Icon, View, Text, Card } from '@idealyst/components';\n\nfunction HomeScreen() {\n return (\n <View style={{ flex: 1, padding: 16 }} gap=\"md\">\n <Text typography=\"h5\" weight=\"bold\">Home</Text>\n {/* Card is a simple container — NO Card.Content, Card.Header, etc. Just put children inside */}\n <Card padding=\"md\" gap=\"sm\">\n <Text typography=\"subtitle1\" weight=\"semibold\">Welcome</Text>\n <Text typography=\"body2\" color=\"secondary\">This is the home screen</Text>\n </Card>\n </View>\n );\n}\n\nfunction SearchScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Search</Text></View>;\n}\n\nfunction NotificationsScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Notifications</Text></View>;\n}\n\nfunction ProfileScreen() {\n return <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text typography=\"h5\">Profile</Text></View>;\n}\n\nconst route: TabNavigatorParam = {\n type: 'navigator',\n path: '/',\n layout: 'tab',\n routes: [\n {\n type: 'screen',\n path: '/',\n component: HomeScreen,\n options: {\n title: 'Home',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'home' : 'home-outline'} size=\"sm\" />\n ),\n },\n },\n {\n type: 'screen',\n path: '/search',\n component: SearchScreen,\n options: {\n title: 'Search',\n tabBarIcon: ({ focused }) => (\n <Icon name=\"magnify\" size=\"sm\" />\n ),\n },\n },\n {\n type: 'screen',\n path: '/notifications',\n component: NotificationsScreen,\n options: {\n title: 'Notifications',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'bell' : 'bell-outline'} size=\"sm\" />\n ),\n tabBarBadge: 3,\n },\n },\n {\n type: 'screen',\n path: '/profile',\n component: ProfileScreen,\n options: {\n title: 'Profile',\n tabBarIcon: ({ focused }) => (\n <Icon name={focused ? 'account' : 'account-outline'} size=\"sm\" />\n ),\n },\n },\n ],\n};\n\nexport function App() {\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Tab navigation setup with:\n- NavigatorProvider wraps the app with a route configuration object\n- TabNavigatorParam defines the tab layout with routes array\n- Each route has type: 'screen', a path, component, and options\n- tabBarIcon renders icons that change when focused\n- tabBarBadge shows a badge count on the tab\n- Works on both web and native`,\n tips: [\n \"Use outline/filled icon variants to indicate focus state\",\n \"Keep tab count to 3-5 for best usability\",\n \"Use tabBarBadge for notification counts instead of manual Badge component\",\n \"Nest a StackNavigatorParam inside a tab route for detail screens\",\n \"Card is a plain container — put children directly inside <Card>. There are NO Card.Content, Card.Header, or Card.Body sub-components\",\n ],\n relatedRecipes: [\"drawer-navigation\", \"responsive-navigation\"],\n },\n\n \"drawer-navigation\": {\n name: \"Drawer Navigation\",\n description: \"Side drawer menu with navigation items and user profile\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `import React from 'react';\nimport { NavigatorProvider, useNavigator } from '@idealyst/navigation';\nimport type { DrawerNavigatorParam, DrawerSidebarProps } from '@idealyst/navigation';\nimport { View, Text, Icon, Avatar, Pressable, Divider } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\n\nfunction HomeScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Home</Text></View>;\n}\n\nfunction DashboardScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Dashboard</Text></View>;\n}\n\nfunction SettingsScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Settings</Text></View>;\n}\n\nfunction DrawerContent(props: DrawerSidebarProps) {\n const { navigate } = useNavigator();\n\n const menuItems: { path: string; icon: IconName; label: string }[] = [\n { path: '/', icon: 'home', label: 'Home' },\n { path: '/dashboard', icon: 'view-dashboard', label: 'Dashboard' },\n { path: '/settings', icon: 'cog', label: 'Settings' },\n ];\n\n return (\n <View style={{ flex: 1, padding: 16, paddingTop: (props.insets?.top ?? 0) + 16 }}>\n <View style={{ alignItems: 'center', paddingVertical: 24 }}>\n <Avatar src=\"https://example.com/avatar.jpg\" size=\"lg\" />\n <Text typography=\"h6\" weight=\"semibold\" style={{ marginTop: 12 }}>John Doe</Text>\n </View>\n\n <Divider style={{ marginVertical: 16 }} />\n\n <View style={{ gap: 4 }}>\n {menuItems.map((item) => (\n <Pressable key={item.path} onPress={() => navigate({ path: item.path })}>\n <View style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 16,\n padding: 12,\n borderRadius: 8,\n }}>\n <Icon name={item.icon} size=\"sm\" />\n <Text typography=\"body1\">{item.label}</Text>\n </View>\n </Pressable>\n ))}\n </View>\n </View>\n );\n}\n\nconst route: DrawerNavigatorParam = {\n type: 'navigator',\n path: '/',\n layout: 'drawer',\n sidebarComponent: DrawerContent,\n routes: [\n { type: 'screen', path: '/', component: HomeScreen, options: { title: 'Home' } },\n { type: 'screen', path: '/dashboard', component: DashboardScreen, options: { title: 'Dashboard' } },\n { type: 'screen', path: '/settings', component: SettingsScreen, options: { title: 'Settings' } },\n ],\n};\n\nexport function App() {\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Drawer navigation includes:\n- NavigatorProvider with a DrawerNavigatorParam configuration\n- Custom sidebarComponent for the drawer content\n- DrawerSidebarProps provides safe area insets on mobile\n- useNavigator() hook to navigate between screens\n- navigate() takes an object: { path: '/settings' }\n- Works on both web (sidebar) and native (slide-out drawer)`,\n tips: [\n \"Use DrawerSidebarProps insets to avoid notches and status bars\",\n \"Type icon props as IconName (from @idealyst/components) not string\",\n \"navigate() always takes an object with a 'path' key\",\n ],\n relatedRecipes: [\"tab-navigation\", \"responsive-navigation\"],\n },\n\n \"responsive-navigation\": {\n name: \"Responsive Navigation\",\n description: \"Adaptive navigation that switches between tabs and drawer based on screen size\",\n category: \"navigation\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\", \"@idealyst/theme\"],\n code: `import React, { useMemo } from 'react';\nimport { NavigatorProvider } from '@idealyst/navigation';\nimport type { TabNavigatorParam, DrawerNavigatorParam, ScreenParam, TabBarScreenOptions } from '@idealyst/navigation';\nimport { useResponsiveStyle } from '@idealyst/theme';\nimport { Icon, View, Text } from '@idealyst/components';\n\nfunction HomeScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Home</Text></View>;\n}\n\nfunction SearchScreen() {\n return <View style={{ flex: 1, padding: 16 }}><Text typography=\"h5\">Search</Text></View>;\n}\n\n// Shared screen definitions\nconst screens: ScreenParam<TabBarScreenOptions>[] = [\n {\n type: 'screen',\n path: '/',\n component: HomeScreen,\n options: {\n title: 'Home',\n tabBarIcon: ({ focused }) => <Icon name={focused ? 'home' : 'home-outline'} size=\"sm\" />,\n },\n },\n {\n type: 'screen',\n path: '/search',\n component: SearchScreen,\n options: {\n title: 'Search',\n tabBarIcon: ({ focused }) => <Icon name=\"magnify\" size=\"sm\" />,\n },\n },\n];\n\nexport function App() {\n // useResponsiveStyle returns different values based on breakpoint\n const isLargeScreen = useResponsiveStyle({ base: false, md: true });\n\n const route = useMemo(() => {\n if (isLargeScreen) {\n return {\n type: 'navigator' as const,\n path: '/',\n layout: 'drawer' as const,\n routes: screens,\n } satisfies DrawerNavigatorParam;\n }\n return {\n type: 'navigator' as const,\n path: '/',\n layout: 'tab' as const,\n routes: screens,\n } satisfies TabNavigatorParam;\n }, [isLargeScreen]);\n\n return <NavigatorProvider route={route} />;\n}`,\n explanation: `Responsive navigation that:\n- Uses tabs on mobile/small screens\n- Switches to drawer on tablet/desktop\n- Shares screen definitions between layouts\n- Adapts automatically based on breakpoints`,\n tips: [\n \"Test on various screen sizes\",\n \"Consider tablet portrait vs landscape\",\n \"Use consistent navigation patterns within each mode\",\n ],\n relatedRecipes: [\"tab-navigation\", \"drawer-navigation\"],\n },\n};\n","/**\n * Data Recipes - Lists, filtering, and data display patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const dataRecipes: Record<string, Recipe> = {\n \"data-list\": {\n name: \"Data List\",\n description: \"Scrollable list with loading states and pull-to-refresh\",\n category: \"data\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useEffect, useCallback } from 'react';\nimport { View, Text, Card, List, ActivityIndicator } from '@idealyst/components';\n\ninterface Item {\n id: string;\n title: string;\n description: string;\n}\n\nexport function DataList() {\n const [items, setItems] = useState<Item[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const fetchData = async () => {\n // Simulated API call\n const response = await fetch('/api/items');\n const data = await response.json();\n return data;\n };\n\n useEffect(() => {\n loadData();\n }, []);\n\n const loadData = async () => {\n setIsLoading(true);\n try {\n const data = await fetchData();\n setItems(data);\n } finally {\n setIsLoading(false);\n }\n };\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n return (\n <View style={{ flex: 1 }}>\n {items.length === 0 ? (\n <View style={{ padding: 32, alignItems: 'center' }}>\n <Text typography=\"body1\" color=\"tertiary\">No items found</Text>\n </View>\n ) : (\n items.map((item) => (\n <Card key={item.id} style={{ margin: 8 }}>\n <Text typography=\"subtitle1\" weight=\"semibold\">{item.title}</Text>\n <Text typography=\"body2\" color=\"secondary\">{item.description}</Text>\n </Card>\n ))\n )}\n </View>\n );\n}`,\n explanation: `Data list with:\n- Loading state with ActivityIndicator\n- Empty state handling\n- Card-based list items with proper typography\n- Uses only @idealyst/components (no react-native imports)`,\n tips: [\n \"Use the List component for virtualized rendering of large datasets\",\n \"Consider pagination for large datasets\",\n \"Add error state handling for failed requests\",\n ],\n relatedRecipes: [\"search-filter\"],\n },\n\n \"search-filter\": {\n name: \"Search & Filter\",\n description: \"Search input with real-time filtering and category filters\",\n category: \"data\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState, useMemo } from 'react';\nimport { View, TextInput, Chip, Text, Card, Icon } from '@idealyst/components';\n\ninterface Item {\n id: string;\n title: string;\n category: string;\n}\n\nconst categories = ['All', 'Electronics', 'Clothing', 'Books', 'Home'];\n\nexport function SearchFilter({ items }: { items: Item[] }) {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState('All');\n\n const filteredItems = useMemo(() => {\n return items.filter((item) => {\n const matchesSearch = item.title\n .toLowerCase()\n .includes(searchQuery.toLowerCase());\n const matchesCategory =\n selectedCategory === 'All' || item.category === selectedCategory;\n return matchesSearch && matchesCategory;\n });\n }, [items, searchQuery, selectedCategory]);\n\n return (\n <View style={{ flex: 1 }}>\n <View style={{ padding: 16, gap: 12 }}>\n <TextInput\n placeholder=\"Search...\"\n value={searchQuery}\n onChangeText={setSearchQuery}\n />\n\n <View style={{ flexDirection: 'row', gap: 8, flexWrap: 'wrap' }}>\n {categories.map((category) => (\n <Chip\n key={category}\n label={category}\n selected={selectedCategory === category}\n onPress={() => setSelectedCategory(category)}\n />\n ))}\n </View>\n </View>\n\n <View style={{ padding: 16, gap: 8 }}>\n <Text typography=\"caption\" color=\"tertiary\">\n {filteredItems.length} results\n </Text>\n\n {filteredItems.map((item) => (\n <Card key={item.id}>\n <Text typography=\"body1\">{item.title}</Text>\n <Chip label={item.category} size=\"sm\" />\n </Card>\n ))}\n </View>\n </View>\n );\n}`,\n explanation: `Search and filter functionality:\n- Real-time search with TextInput\n- Category filter chips\n- Combined filtering with useMemo for performance\n- Results count display`,\n tips: [\n \"Debounce search input for API calls\",\n \"Consider fuzzy matching for better search results\",\n \"Save filter state for persistence across navigation\",\n ],\n relatedRecipes: [\"data-list\"],\n },\n\n \"trpc-feature\": {\n name: \"tRPC Feature with Prisma (Backend + Frontend)\",\n description: \"Complete pattern for adding a new tRPC API router with Prisma model, Zod validation, and UI screen to a scaffolded Idealyst monorepo workspace. Covers project structure, backend API file locations, and integration steps.\",\n category: \"data\",\n difficulty: \"advanced\",\n packages: [\"@idealyst/components\", \"@idealyst/navigation\"],\n code: `// ============================================================\n// SCAFFOLDED PROJECT STRUCTURE (generated by \\`idealyst init\\`)\n// ============================================================\n// Understanding where files go is CRITICAL. The CLI generates this layout:\n//\n// <workspace>/\n// ├── packages/\n// │ ├── api/ <-- tRPC API server\n// │ │ ├── src/\n// │ │ │ ├── index.ts <-- exports { appRouter, AppRouter }\n// │ │ │ ├── server.ts <-- Express server, mounts tRPC at /trpc\n// │ │ │ └── trpc/\n// │ │ │ ├── trpc.ts <-- initTRPC, createContext, router, publicProcedure exports\n// │ │ │ ├── router.ts <-- re-exports appRouter from routers/index.ts\n// │ │ │ └── routers/\n// │ │ │ └── index.ts <-- appRouter = router({ ... }) definition\n// │ ├── database/ <-- Prisma database layer\n// │ │ ├── prisma/\n// │ │ │ └── schema.prisma <-- Prisma models go here\n// │ │ └── src/\n// │ │ ├── index.ts <-- exports { prisma, PrismaClient }\n// │ │ └── schemas.ts <-- Zod validation schemas\n// │ ├── shared/ <-- Shared code (types, utils)\n// │ ├── web/ <-- Web app (Vite + React)\n// │ │ └── src/utils/trpc.ts <-- tRPC client for web\n// │ └── mobile/ <-- React Native app\n// │ └── src/utils/trpc.ts <-- tRPC client for mobile\n//\n// KEY RULE: New routers go in packages/api/src/trpc/routers/\n// KEY RULE: Prisma models go in packages/database/prisma/schema.prisma\n// KEY RULE: New screens go in packages/web/src/ or packages/mobile/src/\n\n// ============================================================\n// STEP 1: Add Prisma model (packages/database/prisma/schema.prisma)\n// ============================================================\n// Append to existing schema.prisma (keep existing models):\n//\n// model Todo {\n// id String @id @default(cuid())\n// title String\n// completed Boolean @default(false)\n// createdAt DateTime @default(now())\n// updatedAt DateTime @updatedAt\n// }\n\n// ============================================================\n// STEP 2: Add Zod schema (packages/database/src/schemas.ts)\n// ============================================================\n// Append to existing schemas.ts:\n//\n// export const createTodoSchema = z.object({\n// title: z.string().min(1).max(200),\n// });\n\n// ============================================================\n// STEP 3: Create router (packages/api/src/trpc/routers/todo.ts)\n// ============================================================\n// IMPORTANT: File MUST be in packages/api/src/trpc/routers/\n// Import router and publicProcedure from '../trpc' (one level up)\nimport { z } from 'zod';\nimport { router, publicProcedure } from '../trpc';\n\nexport const todoRouter = router({\n list: publicProcedure.query(async ({ ctx }) => {\n return ctx.prisma.todo.findMany({ orderBy: { createdAt: 'desc' } });\n }),\n create: publicProcedure\n .input(z.object({ title: z.string().min(1) }))\n .mutation(async ({ ctx, input }) => {\n return ctx.prisma.todo.create({ data: input });\n }),\n toggle: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ ctx, input }) => {\n const todo = await ctx.prisma.todo.findUnique({ where: { id: input.id } });\n if (!todo) throw new Error('Todo not found');\n return ctx.prisma.todo.update({\n where: { id: input.id },\n data: { completed: !todo.completed },\n });\n }),\n delete: publicProcedure\n .input(z.object({ id: z.string() }))\n .mutation(async ({ ctx, input }) => {\n return ctx.prisma.todo.delete({ where: { id: input.id } });\n }),\n});\n\n// ============================================================\n// STEP 4: Register in main router\n// ============================================================\n// Open packages/api/src/trpc/routers/index.ts (the existing appRouter)\n// Add your new router to the appRouter:\n//\n// import { todoRouter } from './todo';\n//\n// export const appRouter = router({\n// ...existingRoutes, // keep all existing routes\n// todo: todoRouter, // ADD THIS LINE\n// });\n\n// ============================================================\n// STEP 5: Frontend screen\n// ============================================================\nimport React, { useState } from 'react';\nimport { View, Text, TextInput, Button, Card, Checkbox, Pressable, Icon, ActivityIndicator } from '@idealyst/components';\n// import { trpc } from '../utils/trpc'; // from packages/web/src/utils/trpc.ts\n\ninterface Todo {\n id: string;\n title: string;\n completed: boolean;\n createdAt: string;\n}\n\nexport function TodoScreen() {\n const [newTitle, setNewTitle] = useState('');\n // Real app would use tRPC hooks:\n // const { data: todos, isLoading, refetch } = trpc.todo.list.useQuery();\n // const createMutation = trpc.todo.create.useMutation({ onSuccess: () => refetch() });\n // const toggleMutation = trpc.todo.toggle.useMutation({ onSuccess: () => refetch() });\n // const deleteMutation = trpc.todo.delete.useMutation({ onSuccess: () => refetch() });\n\n // Placeholder data for demonstration\n const todos: Todo[] = [];\n const isLoading = false;\n\n if (isLoading) {\n return (\n <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <ActivityIndicator size=\"lg\" />\n </View>\n );\n }\n\n return (\n <View padding=\"md\" gap=\"md\" style={{ flex: 1 }}>\n <Text typography=\"h5\" weight=\"bold\">Todos</Text>\n\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <View style={{ flex: 1 }}>\n <TextInput\n placeholder=\"What needs to be done?\"\n value={newTitle}\n onChangeText={setNewTitle}\n />\n </View>\n <Button\n leftIcon=\"plus\"\n onPress={() => {\n if (!newTitle.trim()) return;\n // createMutation.mutate({ title: newTitle });\n setNewTitle('');\n }}\n >\n Add\n </Button>\n </View>\n\n {todos.length === 0 ? (\n <View style={{ padding: 32, alignItems: 'center' }}>\n <Icon name=\"check-all\" size=\"lg\" color=\"secondary\" />\n <Text typography=\"body1\" color=\"secondary\" style={{ marginTop: 8 }}>\n No todos yet\n </Text>\n </View>\n ) : (\n todos.map((todo) => (\n <Card key={todo.id} padding=\"md\">\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Checkbox\n checked={todo.completed}\n onChange={() => {\n // toggleMutation.mutate({ id: todo.id });\n }}\n />\n <View style={{ flex: 1 }}>\n <Text\n typography=\"body1\"\n style={{\n textDecorationLine: todo.completed ? 'line-through' : 'none',\n opacity: todo.completed ? 0.6 : 1,\n }}\n >\n {todo.title}\n </Text>\n </View>\n <Pressable onPress={() => { /* deleteMutation.mutate({ id: todo.id }) */ }}>\n <Icon name=\"delete-outline\" color=\"red\" />\n </Pressable>\n </View>\n </Card>\n ))\n )}\n </View>\n );\n}`,\n explanation: `Complete tRPC feature integration in a scaffolded Idealyst monorepo:\n\n**Project structure** (generated by \\`idealyst init --with-api --with-prisma --with-trpc\\`):\n- \\`packages/api/src/trpc/routers/\\` -- where ALL tRPC routers live\n- \\`packages/api/src/trpc/trpc.ts\\` -- exports \\`router\\`, \\`publicProcedure\\`, \\`createContext\\`\n- \\`packages/api/src/trpc/routers/index.ts\\` -- the main \\`appRouter\\` that merges all routers\n- \\`packages/database/prisma/schema.prisma\\` -- all Prisma models\n- \\`packages/database/src/schemas.ts\\` -- Zod validation schemas\n- \\`packages/web/src/utils/trpc.ts\\` -- tRPC client hooks\n\n**Integration steps:**\n1. Add Prisma model to schema.prisma\n2. Add Zod validation schema\n3. Create feature router in packages/api/src/trpc/routers/\n4. Register router in the main appRouter (packages/api/src/trpc/routers/index.ts)\n5. Build UI screen using @idealyst/components\n6. Register screen in navigation config`,\n tips: [\n \"EXPLORE the project first: use Glob/Read to find existing files before writing new ones\",\n \"Router files MUST go in packages/api/src/trpc/routers/ -- never at the project root or src/\",\n \"Always merge new routers into the appRouter in packages/api/src/trpc/routers/index.ts\",\n \"Import router/publicProcedure from '../trpc' (relative to the routers directory)\",\n \"The tRPC client is already set up at packages/web/src/utils/trpc.ts and packages/mobile/src/utils/trpc.ts\",\n \"Card is a simple container -- put children directly inside, no Card.Content or Card.Header\",\n \"Use Pressable from @idealyst/components for touch handling (View has no onPress prop)\",\n ],\n relatedRecipes: [\"data-list\", \"search-filter\"],\n },\n};\n","/**\n * Layout Recipes - Modals, animations, toasts, and visual patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const layoutRecipes: Record<string, Recipe> = {\n \"modal-animation\": {\n name: \"Animated Modal\",\n description: \"Modal with fade and scale animation using usePresence\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React, { useState } from 'react';\nimport { View, Text, Button, Pressable } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\n\nconst AnimatedView = withAnimated(View);\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function AnimatedModal({ isOpen, onClose, children }: ModalProps) {\n const backdrop = usePresence(isOpen, {\n enter: { opacity: 1 },\n exit: { opacity: 0 },\n duration: 'fast',\n });\n\n const content = usePresence(isOpen, {\n enter: { opacity: 1, transform: { scale: 1, y: 0 } },\n exit: { opacity: 0, transform: { scale: 0.95, y: -20 } },\n duration: 'normal',\n easing: 'easeOut',\n });\n\n if (!backdrop.isPresent) return null;\n\n return (\n <View style={{\n position: 'absolute',\n top: 0, left: 0, right: 0, bottom: 0,\n justifyContent: 'center',\n alignItems: 'center',\n }}>\n <Pressable onPress={onClose} style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <AnimatedView style={[{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)' }, backdrop.style]} />\n </Pressable>\n\n <AnimatedView style={[{\n backgroundColor: '#fff',\n borderRadius: 16,\n padding: 24,\n width: '90%',\n maxWidth: 400,\n }, content.style]}>\n {children}\n </AnimatedView>\n </View>\n );\n}\n\n// Usage\nfunction App() {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <View>\n <Button onPress={() => setIsOpen(true)}>Open Modal</Button>\n\n <AnimatedModal isOpen={isOpen} onClose={() => setIsOpen(false)}>\n <Text typography=\"h5\" weight=\"bold\">Modal Title</Text>\n <Text typography=\"body1\" style={{ marginTop: 8 }}>Modal content goes here.</Text>\n <Button onPress={() => setIsOpen(false)} style={{ marginTop: 16 }}>Close</Button>\n </AnimatedModal>\n </View>\n );\n}`,\n explanation: `Animated modal with:\n- Fade backdrop animation\n- Scale and slide content animation\n- usePresence handles mount/unmount\n- Tap backdrop to dismiss`,\n tips: [\n \"Use 'fast' duration for backdrop, 'normal' for content\",\n \"Add keyboard dismiss for mobile\",\n \"Consider focus trap for accessibility\",\n ],\n relatedRecipes: [\"slide-up-sheet\", \"toast-notification\"],\n },\n\n \"slide-up-sheet\": {\n name: \"Slide-up Sheet\",\n description: \"Bottom sheet that slides up with gesture support\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React from 'react';\nimport { View, Text, Pressable } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\n\nconst AnimatedView = withAnimated(View);\n\ninterface SheetProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nexport function SlideUpSheet({ isOpen, onClose, children }: SheetProps) {\n const backdrop = usePresence(isOpen, {\n enter: { opacity: 1 },\n exit: { opacity: 0 },\n duration: 'fast',\n });\n\n const sheet = usePresence(isOpen, {\n enter: { transform: { y: 0 } },\n exit: { transform: { y: 400 } },\n duration: 'normal',\n easing: 'easeOut',\n });\n\n if (!backdrop.isPresent) return null;\n\n return (\n <View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <Pressable onPress={onClose} style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>\n <AnimatedView style={[{ flex: 1, backgroundColor: 'rgba(0,0,0,0.5)' }, backdrop.style]} />\n </Pressable>\n\n <AnimatedView style={[{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n backgroundColor: '#fff',\n borderTopLeftRadius: 20,\n borderTopRightRadius: 20,\n padding: 24,\n maxHeight: '60%',\n }, sheet.style]}>\n <View style={{ width: 40, height: 4, backgroundColor: '#ccc', borderRadius: 2, alignSelf: 'center', marginBottom: 16 }} />\n {children}\n </AnimatedView>\n </View>\n );\n}`,\n explanation: `Bottom sheet with:\n- Slide-up animation from bottom\n- Backdrop fade\n- Drag handle indicator\n- Tap backdrop to dismiss`,\n tips: [\n \"Add pan gesture for drag-to-dismiss\",\n \"Use different sheet heights for different content\",\n \"Consider snap points for multi-height sheets\",\n ],\n relatedRecipes: [\"modal-animation\", \"toast-notification\"],\n },\n\n \"skeleton-loading\": {\n name: \"Skeleton Loading\",\n description: \"Placeholder skeleton UI while content loads\",\n category: \"layout\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\"],\n code: `import React from 'react';\nimport { View, Skeleton } from '@idealyst/components';\n\n// Card-shaped skeleton placeholder\nexport function CardSkeleton() {\n return (\n <View style={{ padding: 16, gap: 12, backgroundColor: '#fff', borderRadius: 8 }}>\n <Skeleton width=\"60%\" height={20} animation=\"pulse\" />\n <Skeleton width=\"100%\" height={14} animation=\"pulse\" />\n <Skeleton width=\"80%\" height={14} animation=\"pulse\" />\n </View>\n );\n}\n\n// List of skeleton cards\nexport function ListSkeleton({ count = 3 }: { count?: number }) {\n return (\n <View style={{ gap: 12 }}>\n {Array.from({ length: count }).map((_, i) => (\n <CardSkeleton key={i} />\n ))}\n </View>\n );\n}\n\n// Profile-style skeleton with avatar\nexport function ProfileSkeleton() {\n return (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 12 }}>\n <Skeleton width={48} height={48} shape=\"circle\" />\n <View style={{ flex: 1, gap: 8 }}>\n <Skeleton width=\"50%\" height={16} />\n <Skeleton width=\"30%\" height={12} />\n </View>\n </View>\n );\n}\n\n// Usage\nfunction DataScreen() {\n const { data, isLoading } = useData();\n\n if (isLoading) {\n return <ListSkeleton count={3} />;\n }\n\n return <ActualContent data={data} />;\n}`,\n explanation: `Skeleton loading using @idealyst/components Skeleton:\n- Built-in pulse/wave animations (no manual Animated API needed)\n- shape: 'rectangle' | 'circle' | 'rounded'\n- animation: 'pulse' | 'wave' | 'none'\n- Composable for any layout pattern`,\n tips: [\n \"Match skeleton dimensions to actual content for seamless transition\",\n \"Use shape='circle' for avatar placeholders\",\n \"Use animation='wave' for a shimmer effect, 'pulse' for fade\",\n \"Wrap multiple skeletons in a View with gap for consistent spacing\",\n ],\n relatedRecipes: [\"data-list\"],\n },\n\n \"shadow-card\": {\n name: \"Shadow Card\",\n description: \"Cross-platform card with consistent shadows on web, iOS, and Android\",\n category: \"layout\",\n difficulty: \"beginner\",\n packages: [\"@idealyst/components\", \"@idealyst/theme\"],\n code: `import React from 'react';\nimport { View, Text } from '@idealyst/components';\nimport { shadow } from '@idealyst/theme';\n\n// Basic shadowed card\nexport function ShadowCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#ffffff', borderRadius: 12, padding: 16 },\n shadow({ radius: 10, y: 4, opacity: 0.15 }),\n ]}>\n {children}\n </View>\n );\n}\n\n// Elevated card with larger shadow\nexport function ElevatedCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#ffffff', borderRadius: 16, padding: 20 },\n shadow({ radius: 20, y: 8, opacity: 0.2 }),\n ]}>\n {children}\n </View>\n );\n}\n\n// Colored shadow (brand accent)\nexport function AccentCard({ children }: { children: React.ReactNode }) {\n return (\n <View style={[\n { backgroundColor: '#3b82f6', borderRadius: 12, padding: 16 },\n shadow({ radius: 16, y: 6, color: '#3b82f6', opacity: 0.4 }),\n ]}>\n <Text color=\"inverse\">{children}</Text>\n </View>\n );\n}`,\n explanation: `The shadow() utility creates consistent shadows across all platforms:\n\n**Parameters:**\n- radius - Shadow size/blur (default: 10)\n- x - Horizontal offset (default: 0)\n- y - Vertical offset (default: 4)\n- color - Shadow color (default: '#000000')\n- opacity - Shadow opacity 0-1 (default: 0.15)\n\n**Platform handling:**\n- Web: CSS boxShadow with blur and spread\n- iOS: shadowColor, shadowOffset, shadowOpacity, shadowRadius\n- Android: elevation + shadowColor with alpha`,\n tips: [\n \"Use subtle shadows (opacity 0.1-0.2) for most UI elements\",\n \"Increase radius and y offset together for more 'elevation'\",\n \"Colored shadows work great for accent/brand elements\",\n \"Android elevation is approximated from radius (elevation = radius / 3)\",\n ],\n relatedRecipes: [\"modal-animation\"],\n },\n\n \"toast-notification\": {\n name: \"Toast Notification\",\n description: \"Auto-dismissing toast messages with animations\",\n category: \"layout\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/animate\"],\n code: `import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { View, Text, Icon, Pressable } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { withAnimated, usePresence } from '@idealyst/animate';\nimport { shadow } from '@idealyst/theme';\n\nconst AnimatedView = withAnimated(View);\n\ntype ToastType = 'success' | 'error' | 'info' | 'warning';\n\ninterface Toast {\n id: string;\n message: string;\n type: ToastType;\n}\n\nconst toastConfig: Record<ToastType, { icon: IconName; color: string }> = {\n success: { icon: 'check-circle', color: '#22c55e' },\n error: { icon: 'alert-circle', color: '#ef4444' },\n info: { icon: 'information', color: '#3b82f6' },\n warning: { icon: 'alert', color: '#f59e0b' },\n};\n\nconst ToastContext = createContext<{\n showToast: (message: string, type?: ToastType) => void;\n} | null>(null);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const showToast = useCallback((message: string, type: ToastType = 'info') => {\n const id = Date.now().toString();\n setToasts((prev) => [...prev, { id, message, type }]);\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, 3000);\n }, []);\n\n return (\n <ToastContext.Provider value={{ showToast }}>\n {children}\n <View style={{ position: 'absolute', top: 50, left: 16, right: 16, gap: 8 }}>\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={() => setToasts((prev) => prev.filter((t) => t.id !== toast.id))} />\n ))}\n </View>\n </ToastContext.Provider>\n );\n}\n\nfunction ToastItem({ toast, onDismiss }: { toast: Toast; onDismiss: () => void }) {\n const { style, isPresent } = usePresence(true, {\n enter: { opacity: 1, transform: { y: 0 } },\n exit: { opacity: 0, transform: { y: -20 } },\n duration: 'fast',\n });\n\n const config = toastConfig[toast.type];\n\n return (\n <AnimatedView style={[{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#fff',\n padding: 12,\n borderRadius: 8,\n borderLeftWidth: 4,\n borderLeftColor: config.color,\n }, shadow({ radius: 8, y: 2, opacity: 0.1 }), style]}>\n <Icon name={config.icon} size=\"sm\" />\n <Text typography=\"body2\" style={{ flex: 1, marginLeft: 12 }}>{toast.message}</Text>\n <Pressable onPress={onDismiss}>\n <Icon name=\"close\" size=\"xs\" />\n </Pressable>\n </AnimatedView>\n );\n}\n\nexport function useToast() {\n const context = useContext(ToastContext);\n if (!context) throw new Error('useToast must be used within ToastProvider');\n return context;\n}`,\n explanation: `Toast notification system with:\n- Context-based toast management\n- Auto-dismiss after 3 seconds\n- Multiple toast types with colors and icons\n- Slide-in animation\n- Uses IconName type for type-safe icon references`,\n tips: [\n \"Position at top for mobile, bottom-right for desktop\",\n \"Limit to 3-5 visible toasts\",\n \"Allow manual dismiss\",\n \"Type icon props as IconName, never as string\",\n ],\n relatedRecipes: [\"modal-animation\", \"slide-up-sheet\"],\n },\n};\n","/**\n * Forms Recipes - Form validation and input patterns\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const formsRecipes: Record<string, Recipe> = {\n \"form-with-validation\": {\n name: \"Form with Validation\",\n description: \"Comprehensive form with field validation and error display\",\n category: \"forms\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\"],\n code: `import React, { useState } from 'react';\nimport { View, Text, TextInput, TextArea, Select, Button, Card } from '@idealyst/components';\n\ninterface FormData {\n name: string;\n email: string;\n phone: string;\n country: string;\n message: string;\n}\n\ninterface FormErrors {\n [key: string]: string | undefined;\n}\n\nconst initialData: FormData = {\n name: '',\n email: '',\n phone: '',\n country: '',\n message: '',\n};\n\nexport function ContactForm({ onSubmit }: { onSubmit: (data: FormData) => Promise<void> }) {\n const [data, setData] = useState<FormData>(initialData);\n const [errors, setErrors] = useState<FormErrors>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n\n const validateField = (name: keyof FormData, value: string): string | undefined => {\n switch (name) {\n case 'name':\n if (!value.trim()) return 'Name is required';\n if (value.length < 2) return 'Name must be at least 2 characters';\n break;\n case 'email':\n if (!value) return 'Email is required';\n if (!/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/.test(value)) return 'Invalid email address';\n break;\n case 'phone':\n if (value && !/^\\\\+?[0-9]{10,15}$/.test(value.replace(/\\\\s/g, ''))) return 'Invalid phone number';\n break;\n case 'country':\n if (!value) return 'Please select a country';\n break;\n case 'message':\n if (!value.trim()) return 'Message is required';\n if (value.length < 10) return 'Message must be at least 10 characters';\n break;\n }\n return undefined;\n };\n\n const handleChange = (name: keyof FormData, value: string) => {\n setData((prev) => ({ ...prev, [name]: value }));\n if (touched.has(name)) {\n setErrors((prev) => ({ ...prev, [name]: validateField(name, value) }));\n }\n };\n\n const handleBlur = (name: keyof FormData) => {\n setTouched((prev) => new Set(prev).add(name));\n setErrors((prev) => ({ ...prev, [name]: validateField(name, data[name]) }));\n };\n\n const validateAll = (): boolean => {\n const newErrors: FormErrors = {};\n (Object.keys(data) as (keyof FormData)[]).forEach((key) => {\n newErrors[key] = validateField(key, data[key]);\n });\n setErrors(newErrors);\n setTouched(new Set(Object.keys(data)));\n return !Object.values(newErrors).some(Boolean);\n };\n\n const handleSubmit = async () => {\n if (!validateAll()) return;\n\n setIsSubmitting(true);\n try {\n await onSubmit(data);\n setData(initialData);\n setTouched(new Set());\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <Card padding=\"lg\">\n <Text typography=\"subtitle1\" weight=\"bold\" style={{ marginBottom: 24 }}>Contact Us</Text>\n\n <View style={{ gap: 16 }}>\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Name</Text>\n <TextInput\n value={data.name}\n onChangeText={(v) => handleChange('name', v)}\n onBlur={() => handleBlur('name')}\n placeholder=\"Your name\"\n intent={touched.has('name') && errors.name ? 'danger' : undefined}\n />\n {touched.has('name') && errors.name && (\n <Text typography=\"body2\" color=\"danger\">{errors.name}</Text>\n )}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Email</Text>\n <TextInput\n value={data.email}\n onChangeText={(v) => handleChange('email', v)}\n onBlur={() => handleBlur('email')}\n placeholder=\"you@example.com\"\n inputMode=\"email\"\n autoCapitalize=\"none\"\n intent={touched.has('email') && errors.email ? 'danger' : undefined}\n />\n {touched.has('email') && errors.email && (\n <Text typography=\"body2\" color=\"danger\">{errors.email}</Text>\n )}\n </View>\n\n <View>\n <Text typography=\"body2\" weight=\"semibold\" style={{ marginBottom: 4 }}>Phone (optional)</Text>\n <TextInput\n value={data.phone}\n onChangeText={(v) => handleChange('phone', v)}\n onBlur={() => handleBlur('phone')}\n placeholder=\"+1 234 567 8900\"\n inputMode=\"number\"\n intent={touched.has('phone') && errors.phone ? 'danger' : undefined}\n />\n {touched.has('phone') && errors.phone && (\n <Text typography=\"body2\" color=\"danger\">{errors.phone}</Text>\n )}\n </View>\n\n <Select\n label=\"Country\"\n value={data.country}\n onChange={(v) => handleChange('country', v)}\n placeholder=\"Select a country\"\n options={[\n { label: 'United States', value: 'us' },\n { label: 'Canada', value: 'ca' },\n { label: 'United Kingdom', value: 'uk' },\n { label: 'Australia', value: 'au' },\n ]}\n error={touched.has('country') && !!errors.country}\n helperText={touched.has('country') ? errors.country : undefined}\n />\n\n <TextArea\n label=\"Message\"\n value={data.message}\n onChange={(v) => handleChange('message', v)}\n placeholder=\"Tell us what you need...\"\n rows={4}\n error={touched.has('message') ? errors.message : undefined}\n />\n\n <Button onPress={handleSubmit} loading={isSubmitting} disabled={isSubmitting}>\n Send Message\n </Button>\n </View>\n </Card>\n );\n}`,\n explanation: `Comprehensive form with:\n- Per-field validation with custom rules\n- Touched state tracking (only show errors after blur)\n- Real-time validation after first touch\n- Submit validation\n- Loading state during submission\n- Form reset after success`,\n tips: [\n \"Consider using react-hook-form for complex forms\",\n \"Add async validation for unique fields (email, username)\",\n \"Show success message after submission\",\n \"Persist form data for long forms\",\n ],\n relatedRecipes: [\"login-form\", \"signup-form\"],\n },\n};\n","/**\n * Media Recipes - Image upload, camera, and media handling\n */\n\nimport { Recipe } from \"./types.js\";\n\nexport const mediaRecipes: Record<string, Recipe> = {\n \"image-upload\": {\n name: \"Image Upload\",\n description: \"Image picker with preview and upload progress using @idealyst/files\",\n category: \"media\",\n difficulty: \"intermediate\",\n packages: [\"@idealyst/components\", \"@idealyst/files\"],\n code: `import React from 'react';\nimport { View, Text, Button, Image, Pressable, Icon, Progress } from '@idealyst/components';\nimport type { IconName } from '@idealyst/components';\nimport { useFilePicker, useFileUpload, FILE_PICKER_PRESETS } from '@idealyst/files';\n\nconst closeIcon: IconName = 'close';\nconst imagePlusIcon: IconName = 'image-plus';\n\nexport function ImageUpload({ uploadUrl }: { uploadUrl: string }) {\n const picker = useFilePicker({ config: FILE_PICKER_PRESETS.images });\n const uploader = useFileUpload({ autoStart: false, concurrency: 1 });\n\n const handlePickImages = async () => {\n const result = await picker.pick();\n if (!result.cancelled && result.files.length > 0) {\n // Images are now in picker.files\n }\n };\n\n const handleUpload = () => {\n if (picker.files.length === 0) return;\n uploader.addFiles(picker.files, {\n url: uploadUrl,\n method: 'POST',\n fieldName: 'file',\n multipart: true,\n concurrency: 1,\n timeout: 30000,\n retryEnabled: true,\n maxRetries: 3,\n retryDelay: 'exponential',\n retryDelayMs: 1000,\n chunkedUpload: false,\n chunkSize: 10 * 1024 * 1024,\n chunkedUploadThreshold: 50 * 1024 * 1024,\n backgroundUpload: false,\n });\n uploader.start();\n };\n\n return (\n <View gap=\"md\" padding=\"md\">\n {picker.files.length > 0 ? (\n <View style={{ alignItems: 'center' }} gap=\"md\">\n <View style={{ flexDirection: 'row', flexWrap: 'wrap' }} gap=\"sm\">\n {picker.files.map((file) => (\n <View key={file.id} style={{ position: 'relative' }}>\n <Image\n source={file.uri}\n width={120}\n height={120}\n objectFit=\"cover\"\n borderRadius={8}\n />\n <Pressable\n onPress={() => picker.clear()}\n style={{\n position: 'absolute',\n top: -8,\n right: -8,\n backgroundColor: '#ef4444',\n borderRadius: 12,\n padding: 4,\n }}\n >\n <Icon name={closeIcon} size=\"xs\" />\n </Pressable>\n </View>\n ))}\n </View>\n\n {uploader.uploads.map((upload) => (\n <View key={upload.id} gap=\"xs\" style={{ width: '100%' }}>\n <Text typography=\"caption\">{upload.file.name}</Text>\n <Progress value={upload.percentage} />\n <Text typography=\"caption\" color=\"secondary\">\n {upload.state} — {upload.percentage}%\n </Text>\n </View>\n ))}\n\n <View style={{ flexDirection: 'row' }} gap=\"sm\">\n <Button\n onPress={() => picker.clear()}\n type=\"outlined\"\n intent=\"secondary\"\n >\n Clear\n </Button>\n <Button\n onPress={handleUpload}\n disabled={uploader.isUploading}\n loading={uploader.isUploading}\n leftIcon=\"upload\"\n >\n Upload\n </Button>\n </View>\n </View>\n ) : (\n <View gap=\"sm\">\n <Pressable\n onPress={handlePickImages}\n style={{\n borderWidth: 2,\n borderStyle: 'dashed',\n borderColor: '#ccc',\n borderRadius: 8,\n padding: 32,\n alignItems: 'center',\n }}\n >\n <Icon name={imagePlusIcon} size=\"lg\" />\n <Text typography=\"body2\" color=\"secondary\" style={{ marginTop: 8 }}>\n Tap to select images\n </Text>\n </Pressable>\n </View>\n )}\n </View>\n );\n}`,\n explanation: `Image upload with @idealyst/files:\n- useFilePicker with FILE_PICKER_PRESETS.images for image selection\n- useFileUpload for upload queue with progress tracking\n- Image previews using Image component with source prop\n- Icon uses size=\"xs\"/\"sm\"/\"md\"/\"lg\" — NOT numeric values\n- Pressable for interactive areas (NOT View with onPress)`,\n tips: [\n \"Use FILE_PICKER_PRESETS for common configs (images, documents, etc.)\",\n \"useFilePicker.pick() returns { cancelled, files, rejected }\",\n \"Image uses 'source' prop (string or { uri }) — NOT 'src'\",\n \"Image uses 'objectFit' — NOT 'contentFit'\",\n \"Icon size is always a Size string: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n ],\n relatedRecipes: [\"profile-screen\", \"form-with-validation\"],\n },\n};\n","/**\n * Idealyst Recipes - Common UI Patterns\n * Ready-to-use code examples for building apps with Idealyst\n *\n * Recipes are organized by category for maintainability.\n */\n\nexport { Recipe } from \"./types.js\";\nexport { authRecipes } from \"./auth.js\";\nexport { settingsRecipes } from \"./settings.js\";\nexport { navigationRecipes } from \"./navigation.js\";\nexport { dataRecipes } from \"./data.js\";\nexport { layoutRecipes } from \"./layout.js\";\nexport { formsRecipes } from \"./forms.js\";\nexport { mediaRecipes } from \"./media.js\";\n\nimport { Recipe } from \"./types.js\";\nimport { authRecipes } from \"./auth.js\";\nimport { settingsRecipes } from \"./settings.js\";\nimport { navigationRecipes } from \"./navigation.js\";\nimport { dataRecipes } from \"./data.js\";\nimport { layoutRecipes } from \"./layout.js\";\nimport { formsRecipes } from \"./forms.js\";\nimport { mediaRecipes } from \"./media.js\";\n\n/**\n * All recipes combined into a single record\n */\nexport const recipes: Record<string, Recipe> = {\n ...authRecipes,\n ...settingsRecipes,\n ...navigationRecipes,\n ...dataRecipes,\n ...layoutRecipes,\n ...formsRecipes,\n ...mediaRecipes,\n};\n\n/**\n * Get all recipes grouped by category\n */\nexport function getRecipesByCategory(): Record<string, Recipe[]> {\n const grouped: Record<string, Recipe[]> = {};\n\n for (const recipe of Object.values(recipes)) {\n if (!grouped[recipe.category]) {\n grouped[recipe.category] = [];\n }\n grouped[recipe.category].push(recipe);\n }\n\n return grouped;\n}\n\n/**\n * Get all recipes for a specific category\n */\nexport function getRecipesForCategory(category: string): Recipe[] {\n return Object.values(recipes).filter((r) => r.category === category);\n}\n\n/**\n * Keyword synonyms for recipe search.\n * When a user searches for a term on the left, also match terms on the right.\n */\nconst searchSynonyms: Record<string, string[]> = {\n profile: ['settings', 'account', 'user', 'avatar', 'edit'],\n account: ['profile', 'settings', 'user'],\n user: ['profile', 'account', 'avatar'],\n preferences: ['settings'],\n dark: ['theme', 'appearance'],\n light: ['theme', 'appearance'],\n appearance: ['theme'],\n register: ['signup', 'sign-up'],\n signin: ['login', 'sign-in'],\n 'sign-in': ['login'],\n 'sign-up': ['signup'],\n modal: ['overlay', 'dialog', 'sheet'],\n popup: ['modal', 'dialog', 'overlay'],\n table: ['datagrid', 'data', 'list'],\n grid: ['datagrid', 'data', 'list'],\n upload: ['file', 'image', 'media'],\n picker: ['file', 'image', 'select'],\n loading: ['skeleton'],\n spinner: ['loading', 'skeleton'],\n api: ['trpc', 'backend', 'router', 'server'],\n backend: ['trpc', 'api', 'router', 'server'],\n server: ['api', 'backend', 'trpc'],\n router: ['trpc', 'api'],\n database: ['prisma', 'trpc', 'data'],\n prisma: ['database', 'trpc'],\n crud: ['trpc', 'data', 'list'],\n todo: ['trpc', 'data'],\n};\n\n/**\n * Search recipes by query.\n * Matches against recipe ID (slug), name, description, packages, and category.\n * Also supports multi-word queries and synonym expansion.\n */\nexport function searchRecipes(query: string): Recipe[] {\n const lowerQuery = query.toLowerCase();\n const queryWords = lowerQuery.split(/\\s+/).filter(Boolean);\n\n // Expand query with synonyms\n const expandedWords = new Set(queryWords);\n for (const word of queryWords) {\n const syns = searchSynonyms[word];\n if (syns) {\n for (const syn of syns) expandedWords.add(syn);\n }\n }\n\n return Object.entries(recipes)\n .filter(([id, r]) => {\n const searchText = `${id} ${r.name} ${r.description} ${r.packages.join(' ')} ${r.category} ${(r.relatedRecipes || []).join(' ')}`.toLowerCase();\n\n // Exact substring match\n if (searchText.includes(lowerQuery)) return true;\n\n // All words match (supports \"navigation tabs\" matching \"tab-navigation\")\n if (queryWords.length > 1 && queryWords.every(w => searchText.includes(w))) return true;\n\n // Synonym-expanded match: any expanded word matches\n for (const word of expandedWords) {\n if (searchText.includes(word)) return true;\n }\n\n return false;\n })\n .map(([_, r]) => r);\n}\n\n/**\n * Get a summary list of all recipes\n */\nexport function getRecipeSummary(): Array<{\n id: string;\n name: string;\n description: string;\n category: string;\n difficulty: string;\n packages: string[];\n}> {\n return Object.entries(recipes).map(([id, recipe]) => ({\n id,\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n}\n","/**\n * Installation Guides for Idealyst Packages\n *\n * Provides detailed installation instructions including:\n * - npm/yarn installation commands\n * - iOS configuration (Info.plist, CocoaPods)\n * - Android configuration (AndroidManifest.xml, Gradle)\n * - Additional dependencies and peer dependencies\n */\n\nexport interface InstallGuide {\n packageName: string;\n npmName: string;\n description: string;\n platforms: (\"web\" | \"native\" | \"node\")[];\n complexity: \"simple\" | \"moderate\" | \"complex\";\n\n // Basic installation\n installation: {\n yarn: string;\n npm: string;\n };\n\n // Peer dependencies to install\n peerDependencies?: {\n name: string;\n required: boolean;\n platforms: (\"web\" | \"native\")[];\n note?: string;\n }[];\n\n // iOS-specific configuration\n ios?: {\n podInstallRequired: boolean;\n infoPlistEntries?: {\n key: string;\n value: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Android-specific configuration\n android?: {\n permissions?: {\n permission: string;\n description: string;\n }[];\n manifestEntries?: {\n location: string;\n xml: string;\n description: string;\n }[];\n gradleChanges?: {\n file: string;\n changes: string;\n description: string;\n }[];\n additionalSteps?: string[];\n };\n\n // Web-specific configuration\n web?: {\n additionalDependencies?: string[];\n bundlerConfig?: string;\n notes?: string[];\n };\n\n // Post-installation verification\n verification?: string;\n\n // Common issues and solutions\n troubleshooting?: {\n issue: string;\n solution: string;\n }[];\n}\n\nexport const installGuides: Record<string, InstallGuide> = {\n // ============================================================================\n // CORE PACKAGES\n // ============================================================================\n\n theme: {\n packageName: \"Theme\",\n npmName: \"@idealyst/theme\",\n description: \"Cross-platform theming system built on react-native-unistyles\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/theme react-native-unistyles\",\n npm: \"npm install @idealyst/theme react-native-unistyles\",\n },\n peerDependencies: [\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for styling system\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required - auto-linked by React Native\",\n ],\n },\n verification: `import { UnistylesProvider } from '@idealyst/theme';\n// Wrap your app with UnistylesProvider`,\n },\n\n components: {\n packageName: \"Components\",\n npmName: \"@idealyst/components\",\n description: \"Cross-platform React UI components for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-unistyles\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-reanimated\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated components\",\n },\n {\n name: \"react-native-safe-area-context\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for Screen component\",\n },\n {\n name: \"react-native-vector-icons\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for icons on native\",\n },\n {\n name: \"@mdi/react @mdi/js\",\n required: false,\n platforms: [\"web\"],\n note: \"Required for icons on web\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"If using vector icons, add fonts to Info.plist\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required for base components\",\n \"If using vector icons, follow react-native-vector-icons setup\",\n ],\n },\n web: {\n additionalDependencies: [\"@mdi/react\", \"@mdi/js\"],\n notes: [\n \"Icons use @mdi/react on web instead of vector-icons\",\n \"Ensure your bundler supports .web.tsx and .native.tsx extensions\",\n ],\n },\n },\n\n navigation: {\n packageName: \"Navigation\",\n npmName: \"@idealyst/navigation\",\n description: \"Unified navigation system for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/navigation\",\n npm: \"npm install @idealyst/navigation\",\n },\n peerDependencies: [\n {\n name: \"@react-navigation/native @react-navigation/stack @react-navigation/bottom-tabs\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native navigation\",\n },\n {\n name: \"react-native-screens react-native-safe-area-context\",\n required: true,\n platforms: [\"native\"],\n note: \"Required dependencies for React Navigation\",\n },\n {\n name: \"react-native-gesture-handler\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for gesture-based navigation\",\n },\n {\n name: \"react-router react-router-dom\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web routing\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n android: {\n additionalSteps: [\n \"Ensure react-native-screens is configured in MainActivity\",\n \"Add to the top of index.js or App.tsx: import 'react-native-gesture-handler';\",\n ],\n },\n web: {\n additionalDependencies: [\"react-router\", \"react-router-dom\"],\n },\n },\n\n // ============================================================================\n // MEDIA PACKAGES (Complex Native Setup)\n // ============================================================================\n\n camera: {\n packageName: \"Camera\",\n npmName: \"@idealyst/camera\",\n description:\n \"Cross-platform camera component for photo and video capture using Vision Camera\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/camera react-native-vision-camera\",\n npm: \"npm install @idealyst/camera react-native-vision-camera\",\n },\n peerDependencies: [\n {\n name: \"react-native-vision-camera\",\n required: true,\n platforms: [\"native\"],\n note: \"Core camera functionality for React Native\",\n },\n {\n name: \"react-native-worklets-core\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for frame processors\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSCameraUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your camera\",\n description: \"Required: Camera permission description\",\n },\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone for video recording\",\n description: \"Required for video recording with audio\",\n },\n {\n key: \"NSPhotoLibraryUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your photo library to save photos\",\n description: \"Optional: Only if saving to photo library\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For advanced features, see: https://react-native-vision-camera.com/docs/guides/\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.CAMERA\",\n description: \"Required: Camera access\",\n },\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for video recording with audio\",\n },\n {\n permission: \"android.permission.WRITE_EXTERNAL_STORAGE\",\n description: \"Optional: Only if saving to external storage (API < 29)\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.CAMERA\" />\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />\n\n<!-- Required for camera features -->\n<uses-feature android:name=\"android.hardware.camera\" android:required=\"false\" />\n<uses-feature android:name=\"android.hardware.camera.autofocus\" android:required=\"false\" />`,\n description: \"Camera and audio permissions\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher in android/build.gradle\",\n \"Enable Kotlin if not already enabled\",\n \"For CameraX features, ensure you have the latest camera libraries\",\n ],\n },\n web: {\n notes: [\n \"Uses native MediaDevices API (WebRTC)\",\n \"Requires HTTPS in production for camera access\",\n \"User must grant camera permission in browser\",\n ],\n },\n verification: `import { useCamera, CameraPreview, requestPermission } from '@idealyst/camera';\n\n// Request permission\nconst result = await requestPermission();\n// result.granted === true if permission was given\n\n// In a component:\nconst camera = useCamera({ autoRequestPermission: true });\n// camera.permission?.granted, camera.takePhoto(), camera.cameraRef`,\n troubleshooting: [\n {\n issue: \"Camera not showing on iOS\",\n solution:\n \"Ensure NSCameraUsageDescription is in Info.plist and rebuild the app\",\n },\n {\n issue: \"Permission denied on Android\",\n solution:\n \"Check AndroidManifest.xml has CAMERA permission and user granted it at runtime\",\n },\n {\n issue: \"Build fails with Vision Camera\",\n solution:\n \"Ensure you have the latest CocoaPods (iOS) or Gradle (Android) and clean build\",\n },\n ],\n },\n\n audio: {\n packageName: \"Audio\",\n npmName: \"@idealyst/audio\",\n description:\n \"Unified cross-platform audio for recording, playback, and PCM streaming using React Native Audio API\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/audio react-native-audio-api\",\n npm: \"npm install @idealyst/audio react-native-audio-api\",\n },\n peerDependencies: [\n {\n name: \"react-native-audio-api\",\n required: true,\n platforms: [\"native\"],\n note: \"Core audio API for React Native (Web Audio API polyfill)\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone to record audio\",\n description: \"Required for recording: Microphone permission description\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Ensure minimum iOS deployment target is 13.0 or higher\",\n \"For background audio, add audio background mode to Info.plist\",\n \"Audio session is auto-configured for playAndRecord mode\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.RECORD_AUDIO\",\n description: \"Required for recording: Microphone access\",\n },\n ],\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <manifest>)\",\n xml: `<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />`,\n description: \"Microphone permission for recording\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is 21 or higher\",\n \"Permission must be requested at runtime on Android 6.0+\",\n \"No additional permissions required for playback only\",\n ],\n },\n web: {\n notes: [\n \"Uses Web Audio API for recording and playback\",\n \"Requires HTTPS in production for microphone access\",\n \"User must grant microphone permission in browser for recording\",\n \"No permissions required for playback only\",\n \"Supports PCM streaming for real-time TTS playback\",\n ],\n },\n verification: `import { useRecorder, usePlayer, useAudio, AUDIO_PROFILES } from '@idealyst/audio';\n\n// Initialize audio session (recommended)\nconst audio = useAudio();\n\n// Recording\nconst recorder = useRecorder({ config: AUDIO_PROFILES.speech });\nawait recorder.start();\n// ... later\nawait recorder.stop();\n\n// File playback\nconst player = usePlayer();\nawait player.loadFile('/audio/music.mp3');\nawait player.play();\n\n// PCM streaming (for TTS)\nawait player.loadPCMStream(AUDIO_PROFILES.speech);\nawait player.play();\nplayer.feedPCMData(pcmData);`,\n troubleshooting: [\n {\n issue: \"No audio data received during recording\",\n solution:\n \"Ensure microphone permission is granted and check subscribeToData callback\",\n },\n {\n issue: \"Build fails on iOS\",\n solution:\n \"Run pod install and ensure NSMicrophoneUsageDescription is set in Info.plist\",\n },\n {\n issue: \"Permission prompt not appearing on web\",\n solution: \"Ensure page is served over HTTPS (required for getUserMedia)\",\n },\n {\n issue: \"Recording and playback conflict on iOS\",\n solution:\n \"Use useAudio() hook to initialize session with playAndRecord category, or use SESSION_PRESETS.voiceChat\",\n },\n {\n issue: \"Audio cuts out when switching between recording and playback\",\n solution:\n \"Ensure audio session is configured with SESSION_PRESETS.default which enables simultaneous recording and playback\",\n },\n ],\n },\n\n // ============================================================================\n // DATA & STORAGE PACKAGES\n // ============================================================================\n\n storage: {\n packageName: \"Storage\",\n npmName: \"@idealyst/storage\",\n description:\n \"Cross-platform key-value storage with MMKV on native and localStorage on web\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/storage react-native-mmkv\",\n npm: \"npm install @idealyst/storage react-native-mmkv\",\n },\n peerDependencies: [\n {\n name: \"react-native-mmkv\",\n required: true,\n platforms: [\"native\"],\n note: \"High-performance storage for React Native\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"MMKV requires iOS 11.0 or higher\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration required\",\n \"MMKV auto-links with React Native\",\n \"Ensure minSdkVersion is 21 or higher\",\n ],\n },\n web: {\n notes: [\n \"Uses localStorage as the storage backend\",\n \"Falls back gracefully if localStorage is unavailable\",\n \"API is identical across platforms\",\n ],\n },\n verification: `import { storage } from '@idealyst/storage';\n\nawait storage.set('key', { data: 'value' });\nconst data = await storage.get('key');`,\n },\n\n datagrid: {\n packageName: \"DataGrid\",\n npmName: \"@idealyst/datagrid\",\n description:\n \"High-performance virtualized data grid for large datasets\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datagrid @idealyst/components @idealyst/theme\",\n npm: \"npm install @idealyst/datagrid @idealyst/components @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/components\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-window\",\n required: true,\n platforms: [\"web\"],\n note: \"Virtualization library for web\",\n },\n ],\n web: {\n additionalDependencies: [\"react-window\"],\n notes: [\"Uses react-window for virtualized rendering on web\"],\n },\n },\n\n // ============================================================================\n // AUTH PACKAGES\n // ============================================================================\n\n \"oauth-client\": {\n packageName: \"OAuth Client\",\n npmName: \"@idealyst/oauth-client\",\n description: \"Universal OAuth2 client with PKCE support for web and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"complex\",\n installation: {\n yarn: \"yarn add @idealyst/oauth-client @idealyst/storage\",\n npm: \"npm install @idealyst/oauth-client @idealyst/storage\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/storage\",\n required: true,\n platforms: [\"web\", \"native\"],\n note: \"Required for secure token storage\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"CFBundleURLTypes\",\n value: `<array>\n <dict>\n <key>CFBundleURLSchemes</key>\n <array>\n <string>com.yourapp</string>\n </array>\n </dict>\n</array>`,\n description: \"URL scheme for OAuth callback deep links\",\n },\n ],\n additionalSteps: [\n \"cd ios && pod install\",\n \"Replace 'com.yourapp' with your app's bundle identifier or custom scheme\",\n \"Handle the URL in your AppDelegate or SceneDelegate\",\n ],\n },\n android: {\n manifestEntries: [\n {\n location: \"AndroidManifest.xml (inside <activity> for MainActivity)\",\n xml: `<intent-filter android:label=\"oauth_callback\">\n <action android:name=\"android.intent.action.VIEW\" />\n <category android:name=\"android.intent.category.DEFAULT\" />\n <category android:name=\"android.intent.category.BROWSABLE\" />\n <data android:scheme=\"com.yourapp\" />\n</intent-filter>`,\n description:\n \"Deep link handler for OAuth callback. Replace 'com.yourapp' with your scheme.\",\n },\n ],\n additionalSteps: [\n \"Replace 'com.yourapp' with your app's package name or custom scheme\",\n \"Ensure the scheme matches your OAuth provider's redirect URI configuration\",\n ],\n },\n web: {\n notes: [\n \"Uses standard browser redirect for OAuth flow\",\n \"Tokens are stored in localStorage via @idealyst/storage\",\n \"Configure your OAuth provider to allow your web app's origin\",\n ],\n },\n verification: `import { OAuthClient } from '@idealyst/oauth-client';\n\nconst oauth = new OAuthClient({\n clientId: 'your-client-id',\n authorizationEndpoint: 'https://auth.example.com/authorize',\n tokenEndpoint: 'https://auth.example.com/token',\n redirectUri: 'com.yourapp://callback',\n});\n\nawait oauth.login();`,\n troubleshooting: [\n {\n issue: \"OAuth redirect not returning to app (iOS)\",\n solution:\n \"Ensure CFBundleURLSchemes in Info.plist matches your redirectUri scheme\",\n },\n {\n issue: \"OAuth redirect not returning to app (Android)\",\n solution:\n \"Ensure intent-filter scheme in AndroidManifest matches your redirectUri\",\n },\n {\n issue: \"CORS errors on token exchange (web)\",\n solution:\n \"Token exchange must be done server-side or ensure provider supports CORS\",\n },\n ],\n },\n\n // ============================================================================\n // UI PACKAGES\n // ============================================================================\n\n datepicker: {\n packageName: \"DatePicker\",\n npmName: \"@idealyst/datepicker\",\n description: \"Cross-platform date and time picker components\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/datepicker @idealyst/theme\",\n npm: \"npm install @idealyst/datepicker @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for calendar icons\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install (if using react-native-svg)\"],\n },\n },\n\n markdown: {\n packageName: \"Markdown\",\n npmName: \"@idealyst/markdown\",\n description:\n \"Cross-platform markdown renderer with GitHub Flavored Markdown support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/markdown @idealyst/theme\",\n npm: \"npm install @idealyst/markdown @idealyst/theme\",\n },\n peerDependencies: [\n {\n name: \"@idealyst/theme\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-markdown remark-gfm\",\n required: true,\n platforms: [\"web\"],\n note: \"Required for web markdown rendering\",\n },\n {\n name: \"react-native-markdown-display react-native-webview\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native markdown rendering\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"WebView requires additional iOS configuration for some features\",\n ],\n },\n android: {\n additionalSteps: [\n \"No additional configuration for basic markdown\",\n \"WebView is included in React Native by default\",\n ],\n },\n web: {\n additionalDependencies: [\"react-markdown\", \"remark-gfm\"],\n },\n },\n\n blur: {\n packageName: \"Blur\",\n npmName: \"@idealyst/blur\",\n description: \"Cross-platform blur component\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/blur @react-native-community/blur\",\n npm: \"npm install @idealyst/blur @react-native-community/blur\",\n },\n peerDependencies: [\n {\n name: \"@react-native-community/blur\",\n required: true,\n platforms: [\"native\"],\n note: \"Native blur implementation\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Blur uses RenderScript which is included in Android SDK\",\n \"Ensure compileSdkVersion is 31 or higher\",\n ],\n },\n web: {\n notes: [\"Uses CSS backdrop-filter for blur effect on web\"],\n },\n },\n\n lottie: {\n packageName: \"Lottie\",\n npmName: \"@idealyst/lottie\",\n description: \"Cross-platform Lottie animation support\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/lottie lottie-react-native lottie-web\",\n npm: \"npm install @idealyst/lottie lottie-react-native lottie-web\",\n },\n peerDependencies: [\n {\n name: \"lottie-react-native\",\n required: true,\n platforms: [\"native\"],\n note: \"Native Lottie player\",\n },\n {\n name: \"lottie-web\",\n required: true,\n platforms: [\"web\"],\n note: \"Web Lottie player\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\"No additional configuration required\"],\n },\n },\n\n animate: {\n packageName: \"Animate\",\n npmName: \"@idealyst/animate\",\n description: \"Cross-platform animation utilities\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/animate react-native-reanimated\",\n npm: \"npm install @idealyst/animate react-native-reanimated\",\n },\n peerDependencies: [\n {\n name: \"react-native-reanimated\",\n required: true,\n platforms: [\"native\"],\n note: \"Core animation library\",\n },\n {\n name: \"react-native-svg\",\n required: false,\n platforms: [\"native\"],\n note: \"Required for animated SVGs\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\"cd ios && pod install\"],\n },\n android: {\n additionalSteps: [\n \"Add Reanimated Babel plugin to babel.config.js:\",\n \"plugins: ['react-native-reanimated/plugin']\",\n \"Ensure Hermes is enabled for best performance\",\n ],\n },\n },\n\n // ============================================================================\n // UTILITY PACKAGES\n // ============================================================================\n\n translate: {\n packageName: \"Translate\",\n npmName: \"@idealyst/translate\",\n description: \"Internationalization (i18n) package with Babel plugin support\",\n platforms: [\"web\", \"native\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/translate i18next react-i18next\",\n npm: \"npm install @idealyst/translate i18next react-i18next\",\n },\n peerDependencies: [\n {\n name: \"i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n {\n name: \"react-i18next\",\n required: true,\n platforms: [\"web\", \"native\"],\n },\n ],\n verification: `import { TranslateProvider, useTranslation } from '@idealyst/translate';\n\n<TranslateProvider translations={translations} defaultLanguage=\"en\">\n <App />\n</TranslateProvider>`,\n },\n\n config: {\n packageName: \"Config\",\n npmName: \"@idealyst/config\",\n description:\n \"Cross-platform configuration and environment variable support\",\n platforms: [\"web\", \"native\", \"node\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/config react-native-config\",\n npm: \"npm install @idealyst/config react-native-config\",\n },\n peerDependencies: [\n {\n name: \"react-native-config\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for native environment variables\",\n },\n ],\n ios: {\n podInstallRequired: true,\n additionalSteps: [\n \"cd ios && pod install\",\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n android: {\n gradleChanges: [\n {\n file: \"android/app/build.gradle\",\n changes: `apply from: project(':react-native-config').projectDir.getPath() + \"/dotenv.gradle\"`,\n description: \"Add dotenv gradle plugin for environment variables\",\n },\n ],\n additionalSteps: [\n \"Create .env file in project root\",\n \"Add .env to .gitignore\",\n ],\n },\n web: {\n notes: [\n \"Uses Vite's import.meta.env or process.env depending on bundler\",\n \"Configure environment variables in your bundler (Vite, Webpack, etc.)\",\n ],\n },\n },\n\n // ============================================================================\n // TOOLING PACKAGES\n // ============================================================================\n\n cli: {\n packageName: \"CLI\",\n npmName: \"@idealyst/cli\",\n description: \"Command-line tool for generating Idealyst projects\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn global add @idealyst/cli\",\n npm: \"npm install -g @idealyst/cli\",\n },\n verification: `# Create a new workspace\nnpx @idealyst/cli init my-app\n\n# Or use directly without installing\nnpx @idealyst/cli create mobile --type native`,\n },\n\n tooling: {\n packageName: \"Tooling\",\n npmName: \"@idealyst/tooling\",\n description: \"Code analysis and validation utilities for Idealyst Framework\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add -D @idealyst/tooling\",\n npm: \"npm install -D @idealyst/tooling\",\n },\n verification: `// vite.config.ts\nimport { idealystPlugin } from '@idealyst/tooling/vite';\n\nexport default {\n plugins: [idealystPlugin()],\n};`,\n },\n\n \"mcp-server\": {\n packageName: \"MCP Server\",\n npmName: \"@idealyst/mcp-server\",\n description:\n \"Model Context Protocol server for AI assistant integration\",\n platforms: [\"node\"],\n complexity: \"simple\",\n installation: {\n yarn: \"yarn add @idealyst/mcp-server\",\n npm: \"npm install @idealyst/mcp-server\",\n },\n verification: `// .mcp.json (Claude Code)\n{\n \"mcpServers\": {\n \"idealyst\": {\n \"command\": \"node\",\n \"args\": [\"node_modules/@idealyst/mcp-server/dist/index.js\"]\n }\n }\n}`,\n },\n\n // ============================================================================\n // FILES PACKAGE\n // ============================================================================\n\n \"files\": {\n packageName: \"Files\",\n npmName: \"@idealyst/files\",\n description:\n \"Cross-platform file picker, upload, and local file management for React and React Native\",\n platforms: [\"web\", \"native\"],\n complexity: \"moderate\",\n installation: {\n yarn: \"yarn add @idealyst/files\",\n npm: \"npm install @idealyst/files\",\n },\n peerDependencies: [\n {\n name: \"react-native-document-picker\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for document selection on native\",\n },\n {\n name: \"react-native-image-picker\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for image/video selection and camera capture\",\n },\n {\n name: \"react-native-blob-util\",\n required: true,\n platforms: [\"native\"],\n note: \"Required for file uploads with progress tracking and background support\",\n },\n ],\n ios: {\n podInstallRequired: true,\n infoPlistEntries: [\n {\n key: \"NSPhotoLibraryUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your photo library to select images\",\n description: \"Required for photo library access\",\n },\n {\n key: \"NSCameraUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your camera to take photos\",\n description: \"Required for camera capture\",\n },\n {\n key: \"NSMicrophoneUsageDescription\",\n value: \"$(PRODUCT_NAME) needs access to your microphone to record video\",\n description: \"Required for video recording with audio\",\n },\n {\n key: \"UIBackgroundModes\",\n value: \"<array><string>fetch</string></array>\",\n description: \"Required for background uploads (optional)\",\n },\n ],\n additionalSteps: [\n \"Run 'cd ios && pod install' after installing dependencies\",\n \"For background uploads, add 'fetch' to UIBackgroundModes in Info.plist\",\n ],\n },\n android: {\n permissions: [\n {\n permission: \"android.permission.READ_EXTERNAL_STORAGE\",\n description: \"Required for file access on Android 12 and below\",\n },\n {\n permission: \"android.permission.READ_MEDIA_IMAGES\",\n description: \"Required for image access on Android 13+\",\n },\n {\n permission: \"android.permission.READ_MEDIA_VIDEO\",\n description: \"Required for video access on Android 13+\",\n },\n {\n permission: \"android.permission.CAMERA\",\n description: \"Required for camera capture\",\n },\n ],\n additionalSteps: [\n \"Ensure minSdkVersion is at least 21 in android/build.gradle\",\n \"For Android 13+, use granular media permissions\",\n ],\n },\n web: {\n notes: [\n \"No additional configuration required for web\",\n \"Drag and drop works automatically in the DropZone component\",\n \"File picker uses native browser file input\",\n ],\n },\n verification: `import { useFilePicker, useFileUpload } from '@idealyst/files';\n\nfunction Test() {\n const { pick, files } = useFilePicker();\n const { addFiles, uploads } = useFileUpload();\n\n const handleUpload = async () => {\n const result = await pick({ allowedTypes: ['image'] });\n if (!result.cancelled) {\n addFiles(result.files, { url: '/api/upload' });\n }\n };\n\n return <Button onPress={handleUpload}>Upload</Button>;\n}`,\n troubleshooting: [\n {\n issue: \"File picker doesn't open on iOS\",\n solution:\n \"Ensure NSPhotoLibraryUsageDescription is set in Info.plist and permissions are granted\",\n },\n {\n issue: \"File picker doesn't open on Android\",\n solution:\n \"Check that storage permissions are requested at runtime for Android 13+\",\n },\n {\n issue: \"Upload progress not updating\",\n solution:\n \"Verify react-native-blob-util is installed and linked correctly\",\n },\n {\n issue: \"Background uploads fail on iOS\",\n solution:\n \"Add 'fetch' to UIBackgroundModes array in Info.plist\",\n },\n ],\n },\n};\n\n/**\n * Get installation guide for a package\n */\nexport function getInstallGuide(packageName: string): InstallGuide | undefined {\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n return installGuides[normalizedName];\n}\n\n/**\n * Get all packages that require complex native setup\n */\nexport function getComplexPackages(): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === \"complex\");\n}\n\n/**\n * Get all packages by complexity level\n */\nexport function getPackagesByComplexity(\n complexity: \"simple\" | \"moderate\" | \"complex\"\n): InstallGuide[] {\n return Object.values(installGuides).filter((g) => g.complexity === complexity);\n}\n\n/**\n * Format installation guide as markdown\n */\nexport function formatInstallGuideMarkdown(guide: InstallGuide): string {\n let md = `# ${guide.packageName} Installation Guide\n\n**Package:** \\`${guide.npmName}\\`\n**Platforms:** ${guide.platforms.join(\", \")}\n**Complexity:** ${guide.complexity}\n\n${guide.description}\n\n## Installation\n\n\\`\\`\\`bash\n# Using Yarn\n${guide.installation.yarn}\n\n# Using npm\n${guide.installation.npm}\n\\`\\`\\`\n`;\n\n // Peer Dependencies\n if (guide.peerDependencies && guide.peerDependencies.length > 0) {\n md += `\\n## Peer Dependencies\\n\\n`;\n for (const dep of guide.peerDependencies) {\n const required = dep.required ? \"**Required**\" : \"Optional\";\n const platforms = dep.platforms.join(\", \");\n md += `- \\`${dep.name}\\` - ${required} (${platforms})`;\n if (dep.note) {\n md += ` - ${dep.note}`;\n }\n md += \"\\n\";\n }\n }\n\n // iOS Configuration\n if (guide.ios && guide.platforms.includes(\"native\")) {\n md += `\\n## iOS Configuration\\n\\n`;\n\n if (guide.ios.podInstallRequired) {\n md += `\\`\\`\\`bash\ncd ios && pod install\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.ios.infoPlistEntries && guide.ios.infoPlistEntries.length > 0) {\n md += `### Info.plist Entries\\n\\nAdd the following to your \\`ios/YourApp/Info.plist\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const entry of guide.ios.infoPlistEntries) {\n md += `<!-- ${entry.description} -->\\n`;\n md += `<key>${entry.key}</key>\\n`;\n if (entry.value.includes(\"<\")) {\n md += `${entry.value}\\n`;\n } else {\n md += `<string>${entry.value}</string>\\n`;\n }\n md += \"\\n\";\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.ios.additionalSteps && guide.ios.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.ios.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Android Configuration\n if (guide.android && guide.platforms.includes(\"native\")) {\n md += `\\n## Android Configuration\\n\\n`;\n\n if (guide.android.permissions && guide.android.permissions.length > 0) {\n md += `### Permissions\\n\\nAdd to \\`android/app/src/main/AndroidManifest.xml\\`:\\n\\n\\`\\`\\`xml\\n`;\n for (const perm of guide.android.permissions) {\n md += `<!-- ${perm.description} -->\\n`;\n md += `<uses-permission android:name=\"${perm.permission}\" />\\n`;\n }\n md += `\\`\\`\\`\\n`;\n }\n\n if (guide.android.manifestEntries && guide.android.manifestEntries.length > 0) {\n md += `### Manifest Entries\\n\\n`;\n for (const entry of guide.android.manifestEntries) {\n md += `**${entry.location}:**\\n`;\n md += `\\n\\`\\`\\`xml\\n${entry.xml}\\n\\`\\`\\`\\n\\n`;\n md += `_${entry.description}_\\n\\n`;\n }\n }\n\n if (guide.android.gradleChanges && guide.android.gradleChanges.length > 0) {\n md += `### Gradle Changes\\n\\n`;\n for (const change of guide.android.gradleChanges) {\n md += `**${change.file}:**\\n`;\n md += `\\n\\`\\`\\`groovy\\n${change.changes}\\n\\`\\`\\`\\n\\n`;\n md += `_${change.description}_\\n\\n`;\n }\n }\n\n if (guide.android.additionalSteps && guide.android.additionalSteps.length > 0) {\n md += `### Additional Steps\\n\\n`;\n for (const step of guide.android.additionalSteps) {\n md += `- ${step}\\n`;\n }\n }\n }\n\n // Web Configuration\n if (guide.web && guide.platforms.includes(\"web\")) {\n md += `\\n## Web Configuration\\n\\n`;\n\n if (guide.web.additionalDependencies && guide.web.additionalDependencies.length > 0) {\n md += `### Additional Dependencies\\n\\n\\`\\`\\`bash\\nyarn add ${guide.web.additionalDependencies.join(\" \")}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.bundlerConfig) {\n md += `### Bundler Configuration\\n\\n\\`\\`\\`js\\n${guide.web.bundlerConfig}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (guide.web.notes && guide.web.notes.length > 0) {\n md += `### Notes\\n\\n`;\n for (const note of guide.web.notes) {\n md += `- ${note}\\n`;\n }\n }\n }\n\n // Verification\n if (guide.verification) {\n md += `\\n## Verification\\n\\nTest your installation:\\n\\n\\`\\`\\`tsx\\n${guide.verification}\\n\\`\\`\\`\\n`;\n }\n\n // Troubleshooting\n if (guide.troubleshooting && guide.troubleshooting.length > 0) {\n md += `\\n## Troubleshooting\\n\\n`;\n for (const item of guide.troubleshooting) {\n md += `### ${item.issue}\\n\\n${item.solution}\\n\\n`;\n }\n }\n\n return md;\n}\n","/**\n * Idealyst Framework Introduction\n *\n * A wayfinding document that orients LLM agents before they start building.\n * Covers the framework paradigm, directs agents to the right tools for details,\n * and lists only the critical gotchas that agents consistently get wrong.\n *\n * Design principle: guide agents to use MCP tools for API details rather than\n * duplicating documentation here. Only include information that:\n * 1. Establishes the framework paradigm (what Idealyst IS)\n * 2. Cannot be discovered via other tools (cross-cutting conventions)\n * 3. Addresses mistakes that agents make repeatedly despite tool access\n */\n\nexport const idealystIntro = `# Idealyst Framework — Quick Reference\n\n## What is Idealyst?\n\nIdealyst is a **cross-platform React component framework** for building apps that run on iOS, Android, and Web from a single codebase. All UI comes from \\`@idealyst/components\\` — never use React Native primitives (\\`View\\`, \\`Text\\`, \\`TouchableOpacity\\`, \\`FlatList\\`, etc.) from \\`react-native\\` directly.\n\n\\`\\`\\`tsx\nimport { View, Text, Button, TextInput, Card, Icon, ... } from '@idealyst/components';\n\\`\\`\\`\n\n---\n\n## How to Use This MCP Server\n\nThis server has tools for every aspect of the framework. **Always look up the API before writing code.**\n\n### Workflow (be efficient — minimize tool calls)\n\n1. **Start here** — this intro covers conventions and gotchas\n2. **Look up components** — call \\`get_component_types\\` for EVERY component you plan to use. Call it for each component you need. (Card has NO compound components — no Card.Content/Card.Header)\n3. **Look up packages** — call the dedicated \\`get_*_guide\\` tool with topic \\`api\\` for each \\`@idealyst/*\\` package\n4. **Check recipes** — call \\`search_recipes\\` to find ready-made patterns for common screens\n5. **Search icons ONCE** — combine all needed icon terms into ONE \\`search_icons\\` call (e.g., \\`\"home settings check timer calendar\"\\`)\n6. **Then write code** — only after reading the types and guides. Do NOT make additional icon searches — pick from what you found\n\n### Component Tools\n- \\`list_components\\` / \\`search_components\\` — Discover available components\n- \\`get_component_docs\\` — Component features and best practices\n- \\`get_component_types\\` — **TypeScript prop interfaces** for a component\n- \\`get_component_examples_ts\\` — Type-checked code examples\n- \\`search_icons\\` — Find Material Design icon names (7,447 available). **Batch your needs**: search once with multiple terms like \\`\"home settings user check\"\\` rather than making separate calls per icon\n\n### Package Guide Tools\n**For any \\`@idealyst/*\\` package, call its dedicated guide tool with topic \\`api\\` BEFORE writing code.** These return complete TypeScript interfaces, return types, and correct usage. The generic \\`get_package_docs\\` tool only has summaries.\n\n| Package | Guide Tool |\n|---------|-----------|\n| \\`@idealyst/audio\\` | \\`get_audio_guide\\` |\n| \\`@idealyst/camera\\` | \\`get_camera_guide\\` |\n| \\`@idealyst/files\\` | \\`get_files_guide\\` |\n| \\`@idealyst/animate\\` | \\`get_animate_guide\\` |\n| \\`@idealyst/charts\\` | \\`get_charts_guide\\` |\n| \\`@idealyst/datagrid\\` | \\`get_datagrid_guide\\` |\n| \\`@idealyst/datepicker\\` | \\`get_datepicker_guide\\` |\n| \\`@idealyst/markdown\\` | \\`get_markdown_guide\\` |\n| \\`@idealyst/oauth-client\\` | \\`get_oauth_client_guide\\` |\n| \\`@idealyst/config\\` | \\`get_config_guide\\` |\n| \\`@idealyst/lottie\\` | \\`get_lottie_guide\\` |\n| \\`@idealyst/storage\\` | \\`get_storage_guide\\` |\n| \\`@idealyst/translate\\` | \\`get_translate_guide\\` |\n\n### Other Tools\n- \\`get_theme_types\\` — Theme type definitions (Size, Intent, Color)\n- \\`get_navigation_types\\` — Navigation API type definitions\n- \\`list_packages\\` / \\`get_package_docs\\` — Package summaries (use guide tools for full API)\n- \\`list_recipes\\` / \\`get_recipe\\` / \\`search_recipes\\` — Ready-to-use code patterns\n- \\`get_install_guide\\` — Native setup instructions (iOS/Android permissions, config)\n\n---\n\n## Cross-Cutting Conventions\n\nThese conventions apply across all components. Call \\`get_component_types\\` for specific props.\n\n### Intent & Size\nMost interactive components accept:\n- **intent:** \\`primary\\`, \\`secondary\\`, \\`success\\`, \\`warning\\`, \\`danger\\`, \\`info\\`, \\`neutral\\`\n- **size:** \\`xs\\`, \\`sm\\`, \\`md\\`, \\`lg\\`, \\`xl\\`\n\n### Icon Names\nIcons use Material Design names, typed as \\`IconName\\` (NOT \\`string\\`). Use \\`search_icons\\` to find names.\n\\`\\`\\`tsx\nimport type { IconName } from '@idealyst/components';\n\n// ALWAYS type icon variables as IconName — never as string\nconst deleteIcon: IconName = 'delete';\n\n// WRONG: do NOT use 'mdi:' prefix in variables typed as IconName\n// const icon: IconName = 'mdi:delete'; // ❌ TS error — IconName is 'delete', not 'mdi:delete'\n\n// WRONG: do NOT use plain string type\n// const icon: string = 'delete'; // ❌ won't match IconName prop type\n\n// Use IconName in ALL interfaces, arrays, and data structures\ninterface MyProps { icon: IconName; }\ninterface NavItem { label: string; icon: IconName; path: string; } // NOT icon: string\nconst tabs: { icon: IconName }[] = [{ icon: 'home' }, { icon: 'search' }]; // NOT icon: string\n\n// Icon-accepting props (leftIcon, rightIcon, icon) accept BOTH IconName and ReactNode:\n<Button leftIcon=\"check\">OK</Button> // ✅ string — simplest\n<Button leftIcon={myIcon}>OK</Button> // ✅ IconName variable\n// Do NOT wrap in <Icon>: <Button leftIcon={<Icon name=\"check\" />}> // ❌ unnecessary\n// Do NOT cast: <Button leftIcon={'check' as IconName}> // ❌ unnecessary — just use the string\n\\`\\`\\`\n\n> **CRITICAL:** Icon names do NOT have an \\`mdi:\\` prefix. Use bare names like \\`'delete'\\`, \\`'home'\\`, \\`'check-circle'\\` — NOT \\`'mdi:delete'\\`, \\`'mdi:home'\\`, etc.\n> **CRITICAL:** When defining arrays or objects with icon fields, type them as \\`IconName\\` — never \\`string\\`. Using \\`string\\` will cause TS2322 when passed to component props.\n\n---\n\n## Common Mistakes\n\nThese are mistakes agents make repeatedly. Each one causes TypeScript compilation failures.\n\n### Component Props\n1. **Text** does NOT have \\`variant\\`, \\`intent\\`, \\`size\\`, \\`fontSize\\`, \\`numberOfLines\\`, \\`ellipsizeMode\\`, \\`selectable\\`, \\`textColor\\`, or \\`onPress\\`. Use \\`typography\\` (\\`h1\\`–\\`h6\\`, \\`subtitle1\\`, \\`subtitle2\\`, \\`body1\\`, \\`body2\\`, \\`caption\\`), \\`weight\\` (\\`light\\`, \\`normal\\`, \\`medium\\`, \\`semibold\\`, \\`bold\\`), and \\`color\\` (\\`primary\\`, \\`secondary\\`, \\`tertiary\\`, \\`inverse\\`). **\\`textColor\\` is an Icon-only prop** — Text uses \\`color\\`. For pressable text, wrap in \\`Pressable\\` or use \\`Button type=\"text\"\\`.\n2. **TextInput** does NOT have \\`label\\`, \\`error\\`, \\`editable\\`, \\`autoComplete\\`, \\`keyboardType\\`, or \\`onChange\\`. Compose labels/errors with \\`Text\\` + \\`View\\`. Use \\`onChangeText\\`, \\`inputMode\\` (\\`text\\`, \\`email\\`, \\`password\\`, \\`number\\`), and \\`textContentType\\`. TextArea is different — it DOES support \\`label\\`, \\`error\\`, \\`rows\\`, \\`onChange\\`.\n3. **Button/IconButton** \\`type\\` is \\`'contained' | 'outlined' | 'text'\\` — NOT \\`'ghost'\\`, \\`'solid'\\`, \\`'default'\\`. Button has \\`leftIcon\\` and \\`rightIcon\\` — NOT \\`icon\\`.\n4. **View** does NOT have \\`direction\\`, \\`align\\`, or \\`onPress\\` props. For touch handling, wrap content in \\`Pressable\\` from \\`@idealyst/components\\` (NOT from \\`react-native\\`): \\`<Pressable onPress={handlePress}><View>...</View></Pressable>\\`. For horizontal layout use \\`style={{ flexDirection: 'row' }}\\`. View DOES have shorthand props: \\`gap\\`/\\`spacing\\`, \\`padding\\`, \\`paddingVertical\\`, \\`paddingHorizontal\\`, \\`margin\\`, \\`marginVertical\\`, \\`marginHorizontal\\` (all accept Size: \\`xs\\`|\\`sm\\`|\\`md\\`|\\`lg\\`|\\`xl\\`), plus \\`background\\`, \\`radius\\`, \\`border\\`, \\`scrollable\\`. \\`border\\` is \\`'none' | 'thin' | 'thick'\\` — NOT \\`'outline'\\`, \\`'solid'\\`.\n5. **Badge** \\`type\\` is \\`'filled' | 'outlined' | 'dot'\\` — NOT \\`'soft'\\`, \\`'subtle'\\`, \\`'solid'\\`.\n6. **Avatar** uses \\`src\\` for image URL, \\`fallback\\` for initials — NOT \\`name\\`, \\`initials\\`, \\`label\\`. Shape: \\`'circle' | 'square'\\`.\n7. **Link** requires a \\`to\\` prop (path string) — it's a navigation link, NOT pressable text.\n8. **List** takes \\`children\\` — NOT \\`data\\`, \\`renderItem\\`, or \\`keyExtractor\\`. Map your data: \\`<List>{items.map(item => <View key={item.id}>...</View>)}</List>\\`\n9. **Skeleton** uses \\`shape\\` prop (\\`'rectangle' | 'circle' | 'rounded'\\`) — NOT \\`variant\\`. Props: \\`width\\`, \\`height\\`, \\`shape\\`, \\`animation\\` (\\`'pulse' | 'wave' | 'none'\\`). Do NOT build custom skeletons with react-native \\`Animated\\`.\n10. The component is **TextInput**, NOT \\`Input\\`.\n11. **Card** is a simple container — there are NO compound components like \\`Card.Content\\`, \\`Card.Header\\`, \\`Card.Body\\`, \\`Card.Footer\\`, \\`Card.Title\\`. Just put children directly inside \\`<Card>...</Card>\\`.\n\n### Navigation\n11. Use \\`NavigatorProvider\\` — there is NO \\`Router\\` export.\n12. Use \\`useNavigator()\\` — NOT \\`useNavigate()\\`.\n13. \\`navigate()\\` takes an **object**: \\`navigate({ path: '/settings' })\\` — NOT \\`navigate('/settings')\\` or \\`navigate('routeName', params)\\`.\n14. \\`useNavigationState\\` returns \\`Record<string, unknown>\\` by default. Always provide a type parameter: \\`useNavigationState<{ title?: string }>()\\`.\n15. \\`useParams()\\` does NOT accept generic type arguments. It returns \\`Record<string, string>\\`. Do NOT write \\`useParams<{ id: string }>()\\` — that causes TS2558.\n\n### Imports & Styling\n16. **Never** import from \\`react-native\\` — no \\`TouchableOpacity\\`, \\`FlatList\\`, \\`ScrollView\\`, \\`Animated\\`, \\`Dimensions\\`, \\`Linking\\`, \\`Platform\\`. Idealyst provides cross-platform alternatives for all of these (e.g., \\`openExternalLinks\\` on Markdown, \\`Pressable\\` from \\`@idealyst/components\\`).\n17. **Never** import from \\`react-native-unistyles\\` — use \\`@idealyst/theme\\` (\\`configureThemes\\`, \\`ThemeSettings\\`, \\`useTheme\\`).\n18. **useTheme()** returns the Theme object **directly** (NOT wrapped): \\`const theme = useTheme();\\`. Do NOT destructure: \\`const { theme } = useTheme()\\` — causes TS2339.\n19. **Spacing & Layout**: Use component shorthand props for spacing — NOT \\`theme.spacing\\` (which does NOT exist). The correct patterns:\n - \\`<View padding=\"md\" gap=\"md\">\\` — shorthand props on View/Card\n - \\`<View paddingHorizontal=\"lg\" marginVertical=\"sm\">\\` — directional shorthands\n - \\`style={{ backgroundColor: theme.colors.surface.primary }}\\` — inline styles for colors only\n - \\`theme.radii.md\\` — border radius values (this DOES exist)\n - **WRONG**: \\`theme.spacing.md\\` — does NOT exist, causes TS2339\n - **WRONG**: \\`theme.colors.intent.danger\\` — does NOT exist; intents are at \\`theme.intents.danger\\`\n\n### Cross-Platform (CRITICAL)\n20. **Never use raw HTML/SVG elements** (\\`<svg>\\`, \\`<circle>\\`, \\`<canvas>\\`, \\`<div>\\`, \\`<span>\\`, \\`<input>\\`) — they are web-only and will crash on React Native, just like react-native primitives crash on web. Also never use CSS \\`transition\\` or \\`animation\\` properties in styles — they don't exist on native. If you need custom drawing or circular progress, use \\`@idealyst/animate\\` hooks or \\`@idealyst/charts\\` — never raw SVG.\n21. **Avoid web-only CSS** like \\`cursor: 'pointer'\\` in shared styles — not valid on native. Use \\`Pressable\\` or \\`Button\\` for interactive elements (they handle cursor automatically on web).\n\n### React 19 TypeScript\n- **useRef** requires an initial argument: \\`useRef<T>(null)\\` — NOT \\`useRef<T>()\\`. Omitting the argument causes TS2554. For non-null refs use: \\`useRef<number>(0)\\`, \\`useRef<string[]>([])\\`.\n\n### Scaffolded Project Layout\nWhen working in a CLI-scaffolded workspace (created with \\`idealyst init\\` + \\`idealyst create\\`), files go in specific locations:\n- \\`packages/api/src/trpc/routers/\\` — **Feature router files** (e.g., \\`todo.ts\\`, \\`user.ts\\`) — ALWAYS put new routers here\n- \\`packages/api/src/trpc/routers/index.ts\\` — Main appRouter definition (merge new routers here)\n- \\`packages/api/src/trpc/trpc.ts\\` — \\`router\\` and \\`publicProcedure\\` exports\n- \\`packages/database/prisma/schema.prisma\\` — Prisma models\n- \\`packages/database/src/schemas.ts\\` — Zod validation schemas\n- \\`packages/shared/src/screens/\\` — Screen components (shared across platforms)\n- \\`packages/shared/src/navigation/AppRouter.ts\\` — Route configuration\n\n**Critical:** New tRPC routers MUST go in \\`packages/api/src/trpc/routers/\\` — NEVER at the project root or \\`src/\\`. They must be merged into the main \\`appRouter\\` in \\`packages/api/src/trpc/routers/index.ts\\`.\n\n> **TIP:** Before writing backend code, call \\`search_recipes({ query: \"trpc\" })\\` to get the \\`trpc-feature\\` recipe — it has the complete step-by-step pattern with correct file paths.\n\n### Package-Specific (call guide tools for full API)\n18. **Audio** (\\`@idealyst/audio\\`) is **PCM streaming**, NOT file-based. \\`recorder.stop()\\` returns \\`void\\`. Data is \\`ArrayBufferLike\\`, NOT strings. Call \\`get_audio_guide\\` topic \\`api\\`.\n19. **Camera** (\\`@idealyst/camera\\`): Component is \\`CameraPreview\\`, NOT \\`Camera\\`. Permission is \\`requestPermission()\\`, NOT \\`requestCameraPermission\\`. \\`CameraStatus\\` is an interface (\\`.state\\`, \\`.permission\\`), NOT a string. Call \\`get_camera_guide\\` topic \\`api\\`.\n20. **Files** (\\`@idealyst/files\\`): Method is \\`pick()\\`, NOT \\`pickFiles()\\`. \\`FileType\\` is \\`'image' | 'video' | 'audio' | 'document' | 'archive' | 'any'\\` — NOT \\`'pdf'\\` or \\`'doc'\\`. Call \\`get_files_guide\\` topic \\`api\\`.\n21. **Storage** (\\`@idealyst/storage\\`): Methods are \\`getItem()\\`/\\`setItem()\\`, NOT \\`get()\\`/\\`set()\\`. Values are string-only. Call \\`get_storage_guide\\` topic \\`api\\`.\n22. **Animate** (\\`@idealyst/animate\\`): There is NO \\`useSequence\\` or \\`useKeyframes\\` — only \\`useAnimatedStyle\\`, \\`useAnimatedValue\\`, \\`usePresence\\`, \\`useGradientBorder\\`. Easing values are **camelCase**: \\`'easeOut'\\` NOT \\`'ease-out'\\`. \\`useAnimatedValue\\` REQUIRES an initial number: \\`useAnimatedValue(0)\\` — NOT \\`useAnimatedValue()\\`. Call \\`get_animate_guide\\` topic \\`api\\`.\n23. **Charts** (\\`@idealyst/charts\\`): \\`ChartDataSeries\\` requires \\`id\\` and \\`name\\` (NOT \\`label\\`). \\`AxisConfig\\` uses \\`show\\` (NOT \\`visible\\`). \\`tickFormat\\` type is \\`(value: number | string | Date) => string\\`. Call \\`get_charts_guide\\` topic \\`api\\`.\n`;\n","{\n \"total\": 7447,\n \"icons\": [\n \"ab-testing\",\n \"abacus\",\n \"abjad-arabic\",\n \"abjad-hebrew\",\n \"abugida-devanagari\",\n \"abugida-thai\",\n \"access-point\",\n \"access-point-check\",\n \"access-point-minus\",\n \"access-point-network\",\n \"access-point-network-off\",\n \"access-point-off\",\n \"access-point-plus\",\n \"access-point-remove\",\n \"account\",\n \"account-alert\",\n \"account-alert-outline\",\n \"account-arrow-down\",\n \"account-arrow-down-outline\",\n \"account-arrow-left\",\n \"account-arrow-left-outline\",\n \"account-arrow-right\",\n \"account-arrow-right-outline\",\n \"account-arrow-up\",\n \"account-arrow-up-outline\",\n \"account-badge\",\n \"account-badge-outline\",\n \"account-box\",\n \"account-box-edit-outline\",\n \"account-box-minus-outline\",\n \"account-box-multiple\",\n \"account-box-multiple-outline\",\n \"account-box-outline\",\n \"account-box-plus-outline\",\n \"account-cancel\",\n \"account-cancel-outline\",\n \"account-card\",\n \"account-card-outline\",\n \"account-cash\",\n \"account-cash-outline\",\n \"account-check\",\n \"account-check-outline\",\n \"account-child\",\n \"account-child-circle\",\n \"account-child-outline\",\n \"account-circle\",\n \"account-circle-outline\",\n \"account-clock\",\n \"account-clock-outline\",\n \"account-cog\",\n \"account-cog-outline\",\n \"account-convert\",\n \"account-convert-outline\",\n \"account-cowboy-hat\",\n \"account-cowboy-hat-outline\",\n \"account-credit-card\",\n \"account-credit-card-outline\",\n \"account-details\",\n \"account-details-outline\",\n \"account-edit\",\n \"account-edit-outline\",\n \"account-eye\",\n \"account-eye-outline\",\n \"account-file\",\n \"account-file-outline\",\n \"account-file-text\",\n \"account-file-text-outline\",\n \"account-filter\",\n \"account-filter-outline\",\n \"account-group\",\n \"account-group-outline\",\n \"account-hard-hat\",\n \"account-hard-hat-outline\",\n \"account-heart\",\n \"account-heart-outline\",\n \"account-injury\",\n \"account-injury-outline\",\n \"account-key\",\n \"account-key-outline\",\n \"account-lock\",\n \"account-lock-open\",\n \"account-lock-open-outline\",\n \"account-lock-outline\",\n \"account-minus\",\n \"account-minus-outline\",\n \"account-multiple\",\n \"account-multiple-check\",\n \"account-multiple-check-outline\",\n \"account-multiple-minus\",\n \"account-multiple-minus-outline\",\n \"account-multiple-outline\",\n \"account-multiple-plus\",\n \"account-multiple-plus-outline\",\n \"account-multiple-remove\",\n \"account-multiple-remove-outline\",\n \"account-music\",\n \"account-music-outline\",\n \"account-network\",\n \"account-network-off\",\n \"account-network-off-outline\",\n \"account-network-outline\",\n \"account-off\",\n \"account-off-outline\",\n \"account-outline\",\n \"account-plus\",\n \"account-plus-outline\",\n \"account-question\",\n \"account-question-outline\",\n \"account-reactivate\",\n \"account-reactivate-outline\",\n \"account-remove\",\n \"account-remove-outline\",\n \"account-school\",\n \"account-school-outline\",\n \"account-search\",\n \"account-search-outline\",\n \"account-settings\",\n \"account-settings-outline\",\n \"account-star\",\n \"account-star-outline\",\n \"account-supervisor\",\n \"account-supervisor-circle\",\n \"account-supervisor-circle-outline\",\n \"account-supervisor-outline\",\n \"account-switch\",\n \"account-switch-outline\",\n \"account-sync\",\n \"account-sync-outline\",\n \"account-tag\",\n \"account-tag-outline\",\n \"account-tie\",\n \"account-tie-hat\",\n \"account-tie-hat-outline\",\n \"account-tie-outline\",\n \"account-tie-voice\",\n \"account-tie-voice-off\",\n \"account-tie-voice-off-outline\",\n \"account-tie-voice-outline\",\n \"account-tie-woman\",\n \"account-voice\",\n \"account-voice-off\",\n \"account-wrench\",\n \"account-wrench-outline\",\n \"adjust\",\n \"advertisements\",\n \"advertisements-off\",\n \"air-conditioner\",\n \"air-filter\",\n \"air-horn\",\n \"air-humidifier\",\n \"air-humidifier-off\",\n \"air-purifier\",\n \"air-purifier-off\",\n \"airbag\",\n \"airballoon\",\n \"airballoon-outline\",\n \"airplane\",\n \"airplane-alert\",\n \"airplane-check\",\n \"airplane-clock\",\n \"airplane-cog\",\n \"airplane-edit\",\n \"airplane-landing\",\n \"airplane-marker\",\n \"airplane-minus\",\n \"airplane-off\",\n \"airplane-plus\",\n \"airplane-remove\",\n \"airplane-search\",\n \"airplane-settings\",\n \"airplane-takeoff\",\n \"airport\",\n \"alarm\",\n \"alarm-bell\",\n \"alarm-check\",\n \"alarm-light\",\n \"alarm-light-off\",\n \"alarm-light-off-outline\",\n \"alarm-light-outline\",\n \"alarm-multiple\",\n \"alarm-note\",\n \"alarm-note-off\",\n \"alarm-off\",\n \"alarm-panel\",\n \"alarm-panel-outline\",\n \"alarm-plus\",\n \"alarm-snooze\",\n \"album\",\n \"alert\",\n \"alert-box\",\n \"alert-box-outline\",\n \"alert-circle\",\n \"alert-circle-check\",\n \"alert-circle-check-outline\",\n \"alert-circle-outline\",\n \"alert-decagram\",\n \"alert-decagram-outline\",\n \"alert-minus\",\n \"alert-minus-outline\",\n \"alert-octagon\",\n \"alert-octagon-outline\",\n \"alert-octagram\",\n \"alert-octagram-outline\",\n \"alert-outline\",\n \"alert-plus\",\n \"alert-plus-outline\",\n \"alert-remove\",\n \"alert-remove-outline\",\n \"alert-rhombus\",\n \"alert-rhombus-outline\",\n \"alien\",\n \"alien-outline\",\n \"align-horizontal-center\",\n \"align-horizontal-distribute\",\n \"align-horizontal-left\",\n \"align-horizontal-right\",\n \"align-vertical-bottom\",\n \"align-vertical-center\",\n \"align-vertical-distribute\",\n \"align-vertical-top\",\n \"all-inclusive\",\n \"all-inclusive-box\",\n \"all-inclusive-box-outline\",\n \"allergy\",\n \"alpha\",\n \"alpha-a\",\n \"alpha-a-box\",\n \"alpha-a-box-outline\",\n \"alpha-a-circle\",\n \"alpha-a-circle-outline\",\n \"alpha-b\",\n \"alpha-b-box\",\n \"alpha-b-box-outline\",\n \"alpha-b-circle\",\n \"alpha-b-circle-outline\",\n \"alpha-c\",\n \"alpha-c-box\",\n \"alpha-c-box-outline\",\n \"alpha-c-circle\",\n \"alpha-c-circle-outline\",\n \"alpha-d\",\n \"alpha-d-box\",\n \"alpha-d-box-outline\",\n \"alpha-d-circle\",\n \"alpha-d-circle-outline\",\n \"alpha-e\",\n \"alpha-e-box\",\n \"alpha-e-box-outline\",\n \"alpha-e-circle\",\n \"alpha-e-circle-outline\",\n \"alpha-f\",\n \"alpha-f-box\",\n \"alpha-f-box-outline\",\n \"alpha-f-circle\",\n \"alpha-f-circle-outline\",\n \"alpha-g\",\n \"alpha-g-box\",\n \"alpha-g-box-outline\",\n \"alpha-g-circle\",\n \"alpha-g-circle-outline\",\n \"alpha-h\",\n \"alpha-h-box\",\n \"alpha-h-box-outline\",\n \"alpha-h-circle\",\n \"alpha-h-circle-outline\",\n \"alpha-i\",\n \"alpha-i-box\",\n \"alpha-i-box-outline\",\n \"alpha-i-circle\",\n \"alpha-i-circle-outline\",\n \"alpha-j\",\n \"alpha-j-box\",\n \"alpha-j-box-outline\",\n \"alpha-j-circle\",\n \"alpha-j-circle-outline\",\n \"alpha-k\",\n \"alpha-k-box\",\n \"alpha-k-box-outline\",\n \"alpha-k-circle\",\n \"alpha-k-circle-outline\",\n \"alpha-l\",\n \"alpha-l-box\",\n \"alpha-l-box-outline\",\n \"alpha-l-circle\",\n \"alpha-l-circle-outline\",\n \"alpha-m\",\n \"alpha-m-box\",\n \"alpha-m-box-outline\",\n \"alpha-m-circle\",\n \"alpha-m-circle-outline\",\n \"alpha-n\",\n \"alpha-n-box\",\n \"alpha-n-box-outline\",\n \"alpha-n-circle\",\n \"alpha-n-circle-outline\",\n \"alpha-o\",\n \"alpha-o-box\",\n \"alpha-o-box-outline\",\n \"alpha-o-circle\",\n \"alpha-o-circle-outline\",\n \"alpha-p\",\n \"alpha-p-box\",\n \"alpha-p-box-outline\",\n \"alpha-p-circle\",\n \"alpha-p-circle-outline\",\n \"alpha-q\",\n \"alpha-q-box\",\n \"alpha-q-box-outline\",\n \"alpha-q-circle\",\n \"alpha-q-circle-outline\",\n \"alpha-r\",\n \"alpha-r-box\",\n \"alpha-r-box-outline\",\n \"alpha-r-circle\",\n \"alpha-r-circle-outline\",\n \"alpha-s\",\n \"alpha-s-box\",\n \"alpha-s-box-outline\",\n \"alpha-s-circle\",\n \"alpha-s-circle-outline\",\n \"alpha-t\",\n \"alpha-t-box\",\n \"alpha-t-box-outline\",\n \"alpha-t-circle\",\n \"alpha-t-circle-outline\",\n \"alpha-u\",\n \"alpha-u-box\",\n \"alpha-u-box-outline\",\n \"alpha-u-circle\",\n \"alpha-u-circle-outline\",\n \"alpha-v\",\n \"alpha-v-box\",\n \"alpha-v-box-outline\",\n \"alpha-v-circle\",\n \"alpha-v-circle-outline\",\n \"alpha-w\",\n \"alpha-w-box\",\n \"alpha-w-box-outline\",\n \"alpha-w-circle\",\n \"alpha-w-circle-outline\",\n \"alpha-x\",\n \"alpha-x-box\",\n \"alpha-x-box-outline\",\n \"alpha-x-circle\",\n \"alpha-x-circle-outline\",\n \"alpha-y\",\n \"alpha-y-box\",\n \"alpha-y-box-outline\",\n \"alpha-y-circle\",\n \"alpha-y-circle-outline\",\n \"alpha-z\",\n \"alpha-z-box\",\n \"alpha-z-box-outline\",\n \"alpha-z-circle\",\n \"alpha-z-circle-outline\",\n \"alphabet-aurebesh\",\n \"alphabet-cyrillic\",\n \"alphabet-greek\",\n \"alphabet-latin\",\n \"alphabet-piqad\",\n \"alphabet-tengwar\",\n \"alphabetical\",\n \"alphabetical-off\",\n \"alphabetical-variant\",\n \"alphabetical-variant-off\",\n \"altimeter\",\n \"ambulance\",\n \"ammunition\",\n \"ampersand\",\n \"amplifier\",\n \"amplifier-off\",\n \"anchor\",\n \"android\",\n \"android-studio\",\n \"angle-acute\",\n \"angle-obtuse\",\n \"angle-right\",\n \"angular\",\n \"angularjs\",\n \"animation\",\n \"animation-outline\",\n \"animation-play\",\n \"animation-play-outline\",\n \"ansible\",\n \"antenna\",\n \"anvil\",\n \"apache-kafka\",\n \"api\",\n \"api-off\",\n \"apple\",\n \"apple-finder\",\n \"apple-icloud\",\n \"apple-ios\",\n \"apple-keyboard-caps\",\n \"apple-keyboard-command\",\n \"apple-keyboard-control\",\n \"apple-keyboard-option\",\n \"apple-keyboard-shift\",\n \"apple-safari\",\n \"application\",\n \"application-array\",\n \"application-array-outline\",\n \"application-braces\",\n \"application-braces-outline\",\n \"application-brackets\",\n \"application-brackets-outline\",\n \"application-cog\",\n \"application-cog-outline\",\n \"application-edit\",\n \"application-edit-outline\",\n \"application-export\",\n \"application-import\",\n \"application-outline\",\n \"application-parentheses\",\n \"application-parentheses-outline\",\n \"application-settings\",\n \"application-settings-outline\",\n \"application-variable\",\n \"application-variable-outline\",\n \"approximately-equal\",\n \"approximately-equal-box\",\n \"apps\",\n \"apps-box\",\n \"arch\",\n \"archive\",\n \"archive-alert\",\n \"archive-alert-outline\",\n \"archive-arrow-down\",\n \"archive-arrow-down-outline\",\n \"archive-arrow-up\",\n \"archive-arrow-up-outline\",\n \"archive-cancel\",\n \"archive-cancel-outline\",\n \"archive-check\",\n \"archive-check-outline\",\n \"archive-clock\",\n \"archive-clock-outline\",\n \"archive-cog\",\n \"archive-cog-outline\",\n \"archive-edit\",\n \"archive-edit-outline\",\n \"archive-eye\",\n \"archive-eye-outline\",\n \"archive-lock\",\n \"archive-lock-open\",\n \"archive-lock-open-outline\",\n \"archive-lock-outline\",\n \"archive-marker\",\n \"archive-marker-outline\",\n \"archive-minus\",\n \"archive-minus-outline\",\n \"archive-music\",\n \"archive-music-outline\",\n \"archive-off\",\n \"archive-off-outline\",\n \"archive-outline\",\n \"archive-plus\",\n \"archive-plus-outline\",\n \"archive-refresh\",\n \"archive-refresh-outline\",\n \"archive-remove\",\n \"archive-remove-outline\",\n \"archive-search\",\n \"archive-search-outline\",\n \"archive-settings\",\n \"archive-settings-outline\",\n \"archive-star\",\n \"archive-star-outline\",\n \"archive-sync\",\n \"archive-sync-outline\",\n \"arm-flex\",\n \"arm-flex-outline\",\n \"arrange-bring-forward\",\n \"arrange-bring-to-front\",\n \"arrange-send-backward\",\n \"arrange-send-to-back\",\n \"arrow-all\",\n \"arrow-bottom-left\",\n \"arrow-bottom-left-bold-box\",\n \"arrow-bottom-left-bold-box-outline\",\n \"arrow-bottom-left-bold-outline\",\n \"arrow-bottom-left-thick\",\n \"arrow-bottom-left-thin\",\n \"arrow-bottom-left-thin-circle-outline\",\n \"arrow-bottom-right\",\n \"arrow-bottom-right-bold-box\",\n \"arrow-bottom-right-bold-box-outline\",\n \"arrow-bottom-right-bold-outline\",\n \"arrow-bottom-right-thick\",\n \"arrow-bottom-right-thin\",\n \"arrow-bottom-right-thin-circle-outline\",\n \"arrow-collapse\",\n \"arrow-collapse-all\",\n \"arrow-collapse-down\",\n \"arrow-collapse-horizontal\",\n \"arrow-collapse-left\",\n \"arrow-collapse-right\",\n \"arrow-collapse-up\",\n \"arrow-collapse-vertical\",\n \"arrow-decision\",\n \"arrow-decision-auto\",\n \"arrow-decision-auto-outline\",\n \"arrow-decision-outline\",\n \"arrow-down\",\n \"arrow-down-bold\",\n \"arrow-down-bold-box\",\n \"arrow-down-bold-box-outline\",\n \"arrow-down-bold-circle\",\n \"arrow-down-bold-circle-outline\",\n \"arrow-down-bold-hexagon-outline\",\n \"arrow-down-bold-outline\",\n \"arrow-down-box\",\n \"arrow-down-circle\",\n \"arrow-down-circle-outline\",\n \"arrow-down-drop-circle\",\n \"arrow-down-drop-circle-outline\",\n \"arrow-down-left\",\n \"arrow-down-left-bold\",\n \"arrow-down-right\",\n \"arrow-down-right-bold\",\n \"arrow-down-thick\",\n \"arrow-down-thin\",\n \"arrow-down-thin-circle-outline\",\n \"arrow-expand\",\n \"arrow-expand-all\",\n \"arrow-expand-down\",\n \"arrow-expand-horizontal\",\n \"arrow-expand-left\",\n \"arrow-expand-right\",\n \"arrow-expand-up\",\n \"arrow-expand-vertical\",\n \"arrow-horizontal-lock\",\n \"arrow-left\",\n \"arrow-left-bold\",\n \"arrow-left-bold-box\",\n \"arrow-left-bold-box-outline\",\n \"arrow-left-bold-circle\",\n \"arrow-left-bold-circle-outline\",\n \"arrow-left-bold-hexagon-outline\",\n \"arrow-left-bold-outline\",\n \"arrow-left-bottom\",\n \"arrow-left-bottom-bold\",\n \"arrow-left-box\",\n \"arrow-left-circle\",\n \"arrow-left-circle-outline\",\n \"arrow-left-drop-circle\",\n \"arrow-left-drop-circle-outline\",\n \"arrow-left-right\",\n \"arrow-left-right-bold\",\n \"arrow-left-right-bold-outline\",\n \"arrow-left-thick\",\n \"arrow-left-thin\",\n \"arrow-left-thin-circle-outline\",\n \"arrow-left-top\",\n \"arrow-left-top-bold\",\n \"arrow-oscillating\",\n \"arrow-oscillating-off\",\n \"arrow-projectile\",\n \"arrow-projectile-multiple\",\n \"arrow-right\",\n \"arrow-right-bold\",\n \"arrow-right-bold-box\",\n \"arrow-right-bold-box-outline\",\n \"arrow-right-bold-circle\",\n \"arrow-right-bold-circle-outline\",\n \"arrow-right-bold-hexagon-outline\",\n \"arrow-right-bold-outline\",\n \"arrow-right-bottom\",\n \"arrow-right-bottom-bold\",\n \"arrow-right-box\",\n \"arrow-right-circle\",\n \"arrow-right-circle-outline\",\n \"arrow-right-drop-circle\",\n \"arrow-right-drop-circle-outline\",\n \"arrow-right-thick\",\n \"arrow-right-thin\",\n \"arrow-right-thin-circle-outline\",\n \"arrow-right-top\",\n \"arrow-right-top-bold\",\n \"arrow-split-horizontal\",\n \"arrow-split-vertical\",\n \"arrow-top-left\",\n \"arrow-top-left-bold-box\",\n \"arrow-top-left-bold-box-outline\",\n \"arrow-top-left-bold-outline\",\n \"arrow-top-left-bottom-right\",\n \"arrow-top-left-bottom-right-bold\",\n \"arrow-top-left-thick\",\n \"arrow-top-left-thin\",\n \"arrow-top-left-thin-circle-outline\",\n \"arrow-top-right\",\n \"arrow-top-right-bold-box\",\n \"arrow-top-right-bold-box-outline\",\n \"arrow-top-right-bold-outline\",\n \"arrow-top-right-bottom-left\",\n \"arrow-top-right-bottom-left-bold\",\n \"arrow-top-right-thick\",\n \"arrow-top-right-thin\",\n \"arrow-top-right-thin-circle-outline\",\n \"arrow-u-down-left\",\n \"arrow-u-down-left-bold\",\n \"arrow-u-down-right\",\n \"arrow-u-down-right-bold\",\n \"arrow-u-left-bottom\",\n \"arrow-u-left-bottom-bold\",\n \"arrow-u-left-top\",\n \"arrow-u-left-top-bold\",\n \"arrow-u-right-bottom\",\n \"arrow-u-right-bottom-bold\",\n \"arrow-u-right-top\",\n \"arrow-u-right-top-bold\",\n \"arrow-u-up-left\",\n \"arrow-u-up-left-bold\",\n \"arrow-u-up-right\",\n \"arrow-u-up-right-bold\",\n \"arrow-up\",\n \"arrow-up-bold\",\n \"arrow-up-bold-box\",\n \"arrow-up-bold-box-outline\",\n \"arrow-up-bold-circle\",\n \"arrow-up-bold-circle-outline\",\n \"arrow-up-bold-hexagon-outline\",\n \"arrow-up-bold-outline\",\n \"arrow-up-box\",\n \"arrow-up-circle\",\n \"arrow-up-circle-outline\",\n \"arrow-up-down\",\n \"arrow-up-down-bold\",\n \"arrow-up-down-bold-outline\",\n \"arrow-up-drop-circle\",\n \"arrow-up-drop-circle-outline\",\n \"arrow-up-left\",\n \"arrow-up-left-bold\",\n \"arrow-up-right\",\n \"arrow-up-right-bold\",\n \"arrow-up-thick\",\n \"arrow-up-thin\",\n \"arrow-up-thin-circle-outline\",\n \"arrow-vertical-lock\",\n \"artboard\",\n \"artstation\",\n \"aspect-ratio\",\n \"assistant\",\n \"asterisk\",\n \"asterisk-circle-outline\",\n \"at\",\n \"atlassian\",\n \"atm\",\n \"atom\",\n \"atom-variant\",\n \"attachment\",\n \"attachment-check\",\n \"attachment-lock\",\n \"attachment-minus\",\n \"attachment-off\",\n \"attachment-plus\",\n \"attachment-remove\",\n \"atv\",\n \"audio-input-rca\",\n \"audio-input-stereo-minijack\",\n \"audio-input-xlr\",\n \"audio-video\",\n \"audio-video-off\",\n \"augmented-reality\",\n \"aurora\",\n \"auto-download\",\n \"auto-fix\",\n \"auto-mode\",\n \"auto-upload\",\n \"autorenew\",\n \"autorenew-off\",\n \"av-timer\",\n \"awning\",\n \"awning-outline\",\n \"aws\",\n \"axe\",\n \"axe-battle\",\n \"axis\",\n \"axis-arrow\",\n \"axis-arrow-info\",\n \"axis-arrow-lock\",\n \"axis-lock\",\n \"axis-x-arrow\",\n \"axis-x-arrow-lock\",\n \"axis-x-rotate-clockwise\",\n \"axis-x-rotate-counterclockwise\",\n \"axis-x-y-arrow-lock\",\n \"axis-y-arrow\",\n \"axis-y-arrow-lock\",\n \"axis-y-rotate-clockwise\",\n \"axis-y-rotate-counterclockwise\",\n \"axis-z-arrow\",\n \"axis-z-arrow-lock\",\n \"axis-z-rotate-clockwise\",\n \"axis-z-rotate-counterclockwise\",\n \"babel\",\n \"baby\",\n \"baby-bottle\",\n \"baby-bottle-outline\",\n \"baby-buggy\",\n \"baby-buggy-off\",\n \"baby-carriage\",\n \"baby-carriage-off\",\n \"baby-face\",\n \"baby-face-outline\",\n \"backburger\",\n \"backspace\",\n \"backspace-outline\",\n \"backspace-reverse\",\n \"backspace-reverse-outline\",\n \"backup-restore\",\n \"bacteria\",\n \"bacteria-outline\",\n \"badge-account\",\n \"badge-account-alert\",\n \"badge-account-alert-outline\",\n \"badge-account-horizontal\",\n \"badge-account-horizontal-outline\",\n \"badge-account-outline\",\n \"badminton\",\n \"bag-carry-on\",\n \"bag-carry-on-check\",\n \"bag-carry-on-off\",\n \"bag-checked\",\n \"bag-personal\",\n \"bag-personal-off\",\n \"bag-personal-off-outline\",\n \"bag-personal-outline\",\n \"bag-personal-plus\",\n \"bag-personal-plus-outline\",\n \"bag-personal-tag\",\n \"bag-personal-tag-outline\",\n \"bag-suitcase\",\n \"bag-suitcase-off\",\n \"bag-suitcase-off-outline\",\n \"bag-suitcase-outline\",\n \"baguette\",\n \"balcony\",\n \"balloon\",\n \"ballot\",\n \"ballot-outline\",\n \"ballot-recount\",\n \"ballot-recount-outline\",\n \"bandage\",\n \"bank\",\n \"bank-check\",\n \"bank-circle\",\n \"bank-circle-outline\",\n \"bank-minus\",\n \"bank-off\",\n \"bank-off-outline\",\n \"bank-outline\",\n \"bank-plus\",\n \"bank-remove\",\n \"bank-transfer\",\n \"bank-transfer-in\",\n \"bank-transfer-out\",\n \"barcode\",\n \"barcode-off\",\n \"barcode-scan\",\n \"barley\",\n \"barley-off\",\n \"barn\",\n \"barrel\",\n \"barrel-outline\",\n \"baseball\",\n \"baseball-bat\",\n \"baseball-diamond\",\n \"baseball-diamond-outline\",\n \"baseball-outline\",\n \"bash\",\n \"basket\",\n \"basket-check\",\n \"basket-check-outline\",\n \"basket-fill\",\n \"basket-minus\",\n \"basket-minus-outline\",\n \"basket-off\",\n \"basket-off-outline\",\n \"basket-outline\",\n \"basket-plus\",\n \"basket-plus-outline\",\n \"basket-remove\",\n \"basket-remove-outline\",\n \"basket-unfill\",\n \"basketball\",\n \"basketball-hoop\",\n \"basketball-hoop-outline\",\n \"bat\",\n \"bathtub\",\n \"bathtub-outline\",\n \"battery\",\n \"battery-10\",\n \"battery-10-bluetooth\",\n \"battery-20\",\n \"battery-20-bluetooth\",\n \"battery-30\",\n \"battery-30-bluetooth\",\n \"battery-40\",\n \"battery-40-bluetooth\",\n \"battery-50\",\n \"battery-50-bluetooth\",\n \"battery-60\",\n \"battery-60-bluetooth\",\n \"battery-70\",\n \"battery-70-bluetooth\",\n \"battery-80\",\n \"battery-80-bluetooth\",\n \"battery-90\",\n \"battery-90-bluetooth\",\n \"battery-alert\",\n \"battery-alert-bluetooth\",\n \"battery-alert-variant\",\n \"battery-alert-variant-outline\",\n \"battery-arrow-down\",\n \"battery-arrow-down-outline\",\n \"battery-arrow-up\",\n \"battery-arrow-up-outline\",\n \"battery-bluetooth\",\n \"battery-bluetooth-variant\",\n \"battery-charging\",\n \"battery-charging-10\",\n \"battery-charging-100\",\n \"battery-charging-20\",\n \"battery-charging-30\",\n \"battery-charging-40\",\n \"battery-charging-50\",\n \"battery-charging-60\",\n \"battery-charging-70\",\n \"battery-charging-80\",\n \"battery-charging-90\",\n \"battery-charging-high\",\n \"battery-charging-low\",\n \"battery-charging-medium\",\n \"battery-charging-outline\",\n \"battery-charging-wireless\",\n \"battery-charging-wireless-10\",\n \"battery-charging-wireless-20\",\n \"battery-charging-wireless-30\",\n \"battery-charging-wireless-40\",\n \"battery-charging-wireless-50\",\n \"battery-charging-wireless-60\",\n \"battery-charging-wireless-70\",\n \"battery-charging-wireless-80\",\n \"battery-charging-wireless-90\",\n \"battery-charging-wireless-alert\",\n \"battery-charging-wireless-outline\",\n \"battery-check\",\n \"battery-check-outline\",\n \"battery-clock\",\n \"battery-clock-outline\",\n \"battery-heart\",\n \"battery-heart-outline\",\n \"battery-heart-variant\",\n \"battery-high\",\n \"battery-lock\",\n \"battery-lock-open\",\n \"battery-low\",\n \"battery-medium\",\n \"battery-minus\",\n \"battery-minus-outline\",\n \"battery-minus-variant\",\n \"battery-negative\",\n \"battery-off\",\n \"battery-off-outline\",\n \"battery-outline\",\n \"battery-plus\",\n \"battery-plus-outline\",\n \"battery-plus-variant\",\n \"battery-positive\",\n \"battery-remove\",\n \"battery-remove-outline\",\n \"battery-sync\",\n \"battery-sync-outline\",\n \"battery-unknown\",\n \"battery-unknown-bluetooth\",\n \"beach\",\n \"beaker\",\n \"beaker-alert\",\n \"beaker-alert-outline\",\n \"beaker-check\",\n \"beaker-check-outline\",\n \"beaker-minus\",\n \"beaker-minus-outline\",\n \"beaker-outline\",\n \"beaker-plus\",\n \"beaker-plus-outline\",\n \"beaker-question\",\n \"beaker-question-outline\",\n \"beaker-remove\",\n \"beaker-remove-outline\",\n \"bed\",\n \"bed-clock\",\n \"bed-double\",\n \"bed-double-outline\",\n \"bed-empty\",\n \"bed-king\",\n \"bed-king-outline\",\n \"bed-outline\",\n \"bed-queen\",\n \"bed-queen-outline\",\n \"bed-single\",\n \"bed-single-outline\",\n \"bee\",\n \"bee-flower\",\n \"beehive-off-outline\",\n \"beehive-outline\",\n \"beekeeper\",\n \"beer\",\n \"beer-outline\",\n \"bell\",\n \"bell-alert\",\n \"bell-alert-outline\",\n \"bell-badge\",\n \"bell-badge-outline\",\n \"bell-cancel\",\n \"bell-cancel-outline\",\n \"bell-check\",\n \"bell-check-outline\",\n \"bell-circle\",\n \"bell-circle-outline\",\n \"bell-cog\",\n \"bell-cog-outline\",\n \"bell-minus\",\n \"bell-minus-outline\",\n \"bell-off\",\n \"bell-off-outline\",\n \"bell-outline\",\n \"bell-plus\",\n \"bell-plus-outline\",\n \"bell-remove\",\n \"bell-remove-outline\",\n \"bell-ring\",\n \"bell-ring-outline\",\n \"bell-sleep\",\n \"bell-sleep-outline\",\n \"bench\",\n \"bench-back\",\n \"beta\",\n \"betamax\",\n \"biathlon\",\n \"bicycle\",\n \"bicycle-basket\",\n \"bicycle-cargo\",\n \"bicycle-electric\",\n \"bicycle-penny-farthing\",\n \"bike\",\n \"bike-fast\",\n \"bike-pedal\",\n \"bike-pedal-clipless\",\n \"bike-pedal-mountain\",\n \"billboard\",\n \"billiards\",\n \"billiards-rack\",\n \"binoculars\",\n \"bio\",\n \"biohazard\",\n \"bird\",\n \"bitbucket\",\n \"bitcoin\",\n \"black-mesa\",\n \"blender\",\n \"blender-outline\",\n \"blender-software\",\n \"blinds\",\n \"blinds-horizontal\",\n \"blinds-horizontal-closed\",\n \"blinds-open\",\n \"blinds-vertical\",\n \"blinds-vertical-closed\",\n \"block-helper\",\n \"blood-bag\",\n \"bluetooth\",\n \"bluetooth-audio\",\n \"bluetooth-connect\",\n \"bluetooth-off\",\n \"bluetooth-settings\",\n \"bluetooth-transfer\",\n \"blur\",\n \"blur-linear\",\n \"blur-off\",\n \"blur-radial\",\n \"bolt\",\n \"bomb\",\n \"bomb-off\",\n \"bone\",\n \"bone-off\",\n \"book\",\n \"book-account\",\n \"book-account-outline\",\n \"book-alert\",\n \"book-alert-outline\",\n \"book-alphabet\",\n \"book-arrow-down\",\n \"book-arrow-down-outline\",\n \"book-arrow-left\",\n \"book-arrow-left-outline\",\n \"book-arrow-right\",\n \"book-arrow-right-outline\",\n \"book-arrow-up\",\n \"book-arrow-up-outline\",\n \"book-cancel\",\n \"book-cancel-outline\",\n \"book-check\",\n \"book-check-outline\",\n \"book-clock\",\n \"book-clock-outline\",\n \"book-cog\",\n \"book-cog-outline\",\n \"book-cross\",\n \"book-edit\",\n \"book-edit-outline\",\n \"book-education\",\n \"book-education-outline\",\n \"book-heart\",\n \"book-heart-outline\",\n \"book-information-variant\",\n \"book-lock\",\n \"book-lock-open\",\n \"book-lock-open-outline\",\n \"book-lock-outline\",\n \"book-marker\",\n \"book-marker-outline\",\n \"book-minus\",\n \"book-minus-multiple\",\n \"book-minus-multiple-outline\",\n \"book-minus-outline\",\n \"book-multiple\",\n \"book-multiple-outline\",\n \"book-music\",\n \"book-music-outline\",\n \"book-off\",\n \"book-off-outline\",\n \"book-open\",\n \"book-open-blank-variant\",\n \"book-open-blank-variant-outline\",\n \"book-open-outline\",\n \"book-open-page-variant\",\n \"book-open-page-variant-outline\",\n \"book-open-variant\",\n \"book-open-variant-outline\",\n \"book-outline\",\n \"book-play\",\n \"book-play-outline\",\n \"book-plus\",\n \"book-plus-multiple\",\n \"book-plus-multiple-outline\",\n \"book-plus-outline\",\n \"book-refresh\",\n \"book-refresh-outline\",\n \"book-remove\",\n \"book-remove-multiple\",\n \"book-remove-multiple-outline\",\n \"book-remove-outline\",\n \"book-search\",\n \"book-search-outline\",\n \"book-settings\",\n \"book-settings-outline\",\n \"book-sync\",\n \"book-sync-outline\",\n \"book-variant\",\n \"bookmark\",\n \"bookmark-box\",\n \"bookmark-box-multiple\",\n \"bookmark-box-multiple-outline\",\n \"bookmark-box-outline\",\n \"bookmark-check\",\n \"bookmark-check-outline\",\n \"bookmark-minus\",\n \"bookmark-minus-outline\",\n \"bookmark-multiple\",\n \"bookmark-multiple-outline\",\n \"bookmark-music\",\n \"bookmark-music-outline\",\n \"bookmark-off\",\n \"bookmark-off-outline\",\n \"bookmark-outline\",\n \"bookmark-plus\",\n \"bookmark-plus-outline\",\n \"bookmark-remove\",\n \"bookmark-remove-outline\",\n \"bookshelf\",\n \"boom-gate\",\n \"boom-gate-alert\",\n \"boom-gate-alert-outline\",\n \"boom-gate-arrow-down\",\n \"boom-gate-arrow-down-outline\",\n \"boom-gate-arrow-up\",\n \"boom-gate-arrow-up-outline\",\n \"boom-gate-outline\",\n \"boom-gate-up\",\n \"boom-gate-up-outline\",\n \"boombox\",\n \"boomerang\",\n \"bootstrap\",\n \"border-all\",\n \"border-all-variant\",\n \"border-bottom\",\n \"border-bottom-variant\",\n \"border-color\",\n \"border-horizontal\",\n \"border-inside\",\n \"border-left\",\n \"border-left-variant\",\n \"border-none\",\n \"border-none-variant\",\n \"border-outside\",\n \"border-radius\",\n \"border-right\",\n \"border-right-variant\",\n \"border-style\",\n \"border-top\",\n \"border-top-variant\",\n \"border-vertical\",\n \"bottle-soda\",\n \"bottle-soda-classic\",\n \"bottle-soda-classic-outline\",\n \"bottle-soda-outline\",\n \"bottle-tonic\",\n \"bottle-tonic-outline\",\n \"bottle-tonic-plus\",\n \"bottle-tonic-plus-outline\",\n \"bottle-tonic-skull\",\n \"bottle-tonic-skull-outline\",\n \"bottle-wine\",\n \"bottle-wine-outline\",\n \"bow-arrow\",\n \"bow-tie\",\n \"bowl\",\n \"bowl-mix\",\n \"bowl-mix-outline\",\n \"bowl-outline\",\n \"bowling\",\n \"box\",\n \"box-cutter\",\n \"box-cutter-off\",\n \"box-shadow\",\n \"boxing-glove\",\n \"braille\",\n \"brain\",\n \"bread-slice\",\n \"bread-slice-outline\",\n \"bridge\",\n \"briefcase\",\n \"briefcase-account\",\n \"briefcase-account-outline\",\n \"briefcase-arrow-left-right\",\n \"briefcase-arrow-left-right-outline\",\n \"briefcase-arrow-up-down\",\n \"briefcase-arrow-up-down-outline\",\n \"briefcase-check\",\n \"briefcase-check-outline\",\n \"briefcase-clock\",\n \"briefcase-clock-outline\",\n \"briefcase-download\",\n \"briefcase-download-outline\",\n \"briefcase-edit\",\n \"briefcase-edit-outline\",\n \"briefcase-eye\",\n \"briefcase-eye-outline\",\n \"briefcase-minus\",\n \"briefcase-minus-outline\",\n \"briefcase-off\",\n \"briefcase-off-outline\",\n \"briefcase-outline\",\n \"briefcase-plus\",\n \"briefcase-plus-outline\",\n \"briefcase-remove\",\n \"briefcase-remove-outline\",\n \"briefcase-search\",\n \"briefcase-search-outline\",\n \"briefcase-upload\",\n \"briefcase-upload-outline\",\n \"briefcase-variant\",\n \"briefcase-variant-off\",\n \"briefcase-variant-off-outline\",\n \"briefcase-variant-outline\",\n \"brightness-1\",\n \"brightness-2\",\n \"brightness-3\",\n \"brightness-4\",\n \"brightness-5\",\n \"brightness-6\",\n \"brightness-7\",\n \"brightness-auto\",\n \"brightness-percent\",\n \"broadcast\",\n \"broadcast-off\",\n \"broom\",\n \"brush\",\n \"brush-off\",\n \"brush-outline\",\n \"brush-variant\",\n \"bucket\",\n \"bucket-outline\",\n \"buffet\",\n \"bug\",\n \"bug-check\",\n \"bug-check-outline\",\n \"bug-outline\",\n \"bug-pause\",\n \"bug-pause-outline\",\n \"bug-play\",\n \"bug-play-outline\",\n \"bug-stop\",\n \"bug-stop-outline\",\n \"bugle\",\n \"bulkhead-light\",\n \"bulldozer\",\n \"bullet\",\n \"bulletin-board\",\n \"bullhorn\",\n \"bullhorn-outline\",\n \"bullhorn-variant\",\n \"bullhorn-variant-outline\",\n \"bullseye\",\n \"bullseye-arrow\",\n \"bulma\",\n \"bunk-bed\",\n \"bunk-bed-outline\",\n \"bus\",\n \"bus-alert\",\n \"bus-articulated-end\",\n \"bus-articulated-front\",\n \"bus-clock\",\n \"bus-double-decker\",\n \"bus-electric\",\n \"bus-marker\",\n \"bus-multiple\",\n \"bus-school\",\n \"bus-side\",\n \"bus-sign\",\n \"bus-stop\",\n \"bus-stop-covered\",\n \"bus-stop-uncovered\",\n \"bus-wrench\",\n \"butterfly\",\n \"butterfly-outline\",\n \"button-cursor\",\n \"button-pointer\",\n \"cabin-a-frame\",\n \"cable-data\",\n \"cached\",\n \"cactus\",\n \"cake\",\n \"cake-layered\",\n \"cake-variant\",\n \"cake-variant-outline\",\n \"calculator\",\n \"calculator-variant\",\n \"calculator-variant-outline\",\n \"calendar\",\n \"calendar-account\",\n \"calendar-account-outline\",\n \"calendar-alert\",\n \"calendar-alert-outline\",\n \"calendar-arrow-left\",\n \"calendar-arrow-right\",\n \"calendar-badge\",\n \"calendar-badge-outline\",\n \"calendar-blank\",\n \"calendar-blank-multiple\",\n \"calendar-blank-outline\",\n \"calendar-check\",\n \"calendar-check-outline\",\n \"calendar-clock\",\n \"calendar-clock-outline\",\n \"calendar-collapse-horizontal\",\n \"calendar-collapse-horizontal-outline\",\n \"calendar-cursor\",\n \"calendar-cursor-outline\",\n \"calendar-edit\",\n \"calendar-edit-outline\",\n \"calendar-end\",\n \"calendar-end-outline\",\n \"calendar-expand-horizontal\",\n \"calendar-expand-horizontal-outline\",\n \"calendar-export\",\n \"calendar-export-outline\",\n \"calendar-filter\",\n \"calendar-filter-outline\",\n \"calendar-heart\",\n \"calendar-heart-outline\",\n \"calendar-import\",\n \"calendar-import-outline\",\n \"calendar-lock\",\n \"calendar-lock-open\",\n \"calendar-lock-open-outline\",\n \"calendar-lock-outline\",\n \"calendar-minus\",\n \"calendar-minus-outline\",\n \"calendar-month\",\n \"calendar-month-outline\",\n \"calendar-multiple\",\n \"calendar-multiple-check\",\n \"calendar-multiselect\",\n \"calendar-multiselect-outline\",\n \"calendar-outline\",\n \"calendar-plus\",\n \"calendar-plus-outline\",\n \"calendar-question\",\n \"calendar-question-outline\",\n \"calendar-range\",\n \"calendar-range-outline\",\n \"calendar-refresh\",\n \"calendar-refresh-outline\",\n \"calendar-remove\",\n \"calendar-remove-outline\",\n \"calendar-search\",\n \"calendar-search-outline\",\n \"calendar-star\",\n \"calendar-star-four-points\",\n \"calendar-star-outline\",\n \"calendar-start\",\n \"calendar-start-outline\",\n \"calendar-sync\",\n \"calendar-sync-outline\",\n \"calendar-text\",\n \"calendar-text-outline\",\n \"calendar-today\",\n \"calendar-today-outline\",\n \"calendar-week\",\n \"calendar-week-begin\",\n \"calendar-week-begin-outline\",\n \"calendar-week-outline\",\n \"calendar-weekend\",\n \"calendar-weekend-outline\",\n \"call-made\",\n \"call-merge\",\n \"call-missed\",\n \"call-received\",\n \"call-split\",\n \"camcorder\",\n \"camcorder-off\",\n \"camera\",\n \"camera-account\",\n \"camera-burst\",\n \"camera-control\",\n \"camera-document\",\n \"camera-document-off\",\n \"camera-enhance\",\n \"camera-enhance-outline\",\n \"camera-flip\",\n \"camera-flip-outline\",\n \"camera-front\",\n \"camera-front-variant\",\n \"camera-gopro\",\n \"camera-image\",\n \"camera-iris\",\n \"camera-lock\",\n \"camera-lock-open\",\n \"camera-lock-open-outline\",\n \"camera-lock-outline\",\n \"camera-marker\",\n \"camera-marker-outline\",\n \"camera-metering-center\",\n \"camera-metering-matrix\",\n \"camera-metering-partial\",\n \"camera-metering-spot\",\n \"camera-off\",\n \"camera-off-outline\",\n \"camera-outline\",\n \"camera-party-mode\",\n \"camera-plus\",\n \"camera-plus-outline\",\n \"camera-rear\",\n \"camera-rear-variant\",\n \"camera-retake\",\n \"camera-retake-outline\",\n \"camera-switch\",\n \"camera-switch-outline\",\n \"camera-timer\",\n \"camera-wireless\",\n \"camera-wireless-outline\",\n \"campfire\",\n \"cancel\",\n \"candelabra\",\n \"candelabra-fire\",\n \"candle\",\n \"candy\",\n \"candy-off\",\n \"candy-off-outline\",\n \"candy-outline\",\n \"candycane\",\n \"cannabis\",\n \"cannabis-off\",\n \"caps-lock\",\n \"car\",\n \"car-2-plus\",\n \"car-3-plus\",\n \"car-arrow-left\",\n \"car-arrow-right\",\n \"car-back\",\n \"car-battery\",\n \"car-brake-abs\",\n \"car-brake-alert\",\n \"car-brake-fluid-level\",\n \"car-brake-hold\",\n \"car-brake-low-pressure\",\n \"car-brake-parking\",\n \"car-brake-retarder\",\n \"car-brake-temperature\",\n \"car-brake-worn-linings\",\n \"car-child-seat\",\n \"car-clock\",\n \"car-clutch\",\n \"car-cog\",\n \"car-connected\",\n \"car-convertible\",\n \"car-coolant-level\",\n \"car-cruise-control\",\n \"car-defrost-front\",\n \"car-defrost-rear\",\n \"car-door\",\n \"car-door-lock\",\n \"car-door-lock-open\",\n \"car-electric\",\n \"car-electric-outline\",\n \"car-emergency\",\n \"car-esp\",\n \"car-estate\",\n \"car-hatchback\",\n \"car-info\",\n \"car-key\",\n \"car-lifted-pickup\",\n \"car-light-alert\",\n \"car-light-dimmed\",\n \"car-light-fog\",\n \"car-light-high\",\n \"car-limousine\",\n \"car-multiple\",\n \"car-off\",\n \"car-outline\",\n \"car-parking-lights\",\n \"car-pickup\",\n \"car-search\",\n \"car-search-outline\",\n \"car-seat\",\n \"car-seat-cooler\",\n \"car-seat-heater\",\n \"car-select\",\n \"car-settings\",\n \"car-shift-pattern\",\n \"car-side\",\n \"car-speed-limiter\",\n \"car-sports\",\n \"car-tire-alert\",\n \"car-traction-control\",\n \"car-turbocharger\",\n \"car-wash\",\n \"car-windshield\",\n \"car-windshield-outline\",\n \"car-wireless\",\n \"car-wrench\",\n \"carabiner\",\n \"caravan\",\n \"card\",\n \"card-account-details\",\n \"card-account-details-outline\",\n \"card-account-details-star\",\n \"card-account-details-star-outline\",\n \"card-account-mail\",\n \"card-account-mail-outline\",\n \"card-account-phone\",\n \"card-account-phone-outline\",\n \"card-bulleted\",\n \"card-bulleted-off\",\n \"card-bulleted-off-outline\",\n \"card-bulleted-outline\",\n \"card-bulleted-settings\",\n \"card-bulleted-settings-outline\",\n \"card-minus\",\n \"card-minus-outline\",\n \"card-multiple\",\n \"card-multiple-outline\",\n \"card-off\",\n \"card-off-outline\",\n \"card-outline\",\n \"card-plus\",\n \"card-plus-outline\",\n \"card-remove\",\n \"card-remove-outline\",\n \"card-search\",\n \"card-search-outline\",\n \"card-text\",\n \"card-text-outline\",\n \"cards\",\n \"cards-club\",\n \"cards-club-outline\",\n \"cards-diamond\",\n \"cards-diamond-outline\",\n \"cards-heart\",\n \"cards-heart-outline\",\n \"cards-outline\",\n \"cards-playing\",\n \"cards-playing-club\",\n \"cards-playing-club-multiple\",\n \"cards-playing-club-multiple-outline\",\n \"cards-playing-club-outline\",\n \"cards-playing-diamond\",\n \"cards-playing-diamond-multiple\",\n \"cards-playing-diamond-multiple-outline\",\n \"cards-playing-diamond-outline\",\n \"cards-playing-heart\",\n \"cards-playing-heart-multiple\",\n \"cards-playing-heart-multiple-outline\",\n \"cards-playing-heart-outline\",\n \"cards-playing-outline\",\n \"cards-playing-spade\",\n \"cards-playing-spade-multiple\",\n \"cards-playing-spade-multiple-outline\",\n \"cards-playing-spade-outline\",\n \"cards-spade\",\n \"cards-spade-outline\",\n \"cards-variant\",\n \"carrot\",\n \"cart\",\n \"cart-arrow-down\",\n \"cart-arrow-right\",\n \"cart-arrow-up\",\n \"cart-check\",\n \"cart-heart\",\n \"cart-minus\",\n \"cart-off\",\n \"cart-outline\",\n \"cart-percent\",\n \"cart-plus\",\n \"cart-remove\",\n \"cart-variant\",\n \"case-sensitive-alt\",\n \"cash\",\n \"cash-100\",\n \"cash-check\",\n \"cash-clock\",\n \"cash-edit\",\n \"cash-fast\",\n \"cash-lock\",\n \"cash-lock-open\",\n \"cash-marker\",\n \"cash-minus\",\n \"cash-multiple\",\n \"cash-off\",\n \"cash-plus\",\n \"cash-refund\",\n \"cash-register\",\n \"cash-remove\",\n \"cash-sync\",\n \"cassette\",\n \"cast\",\n \"cast-audio\",\n \"cast-audio-variant\",\n \"cast-connected\",\n \"cast-education\",\n \"cast-off\",\n \"cast-variant\",\n \"castle\",\n \"cat\",\n \"cctv\",\n \"cctv-off\",\n \"ceiling-fan\",\n \"ceiling-fan-light\",\n \"ceiling-light\",\n \"ceiling-light-multiple\",\n \"ceiling-light-multiple-outline\",\n \"ceiling-light-outline\",\n \"cellphone\",\n \"cellphone-arrow-down\",\n \"cellphone-arrow-down-variant\",\n \"cellphone-basic\",\n \"cellphone-charging\",\n \"cellphone-check\",\n \"cellphone-cog\",\n \"cellphone-dock\",\n \"cellphone-information\",\n \"cellphone-key\",\n \"cellphone-link\",\n \"cellphone-link-off\",\n \"cellphone-lock\",\n \"cellphone-marker\",\n \"cellphone-message\",\n \"cellphone-message-off\",\n \"cellphone-nfc\",\n \"cellphone-nfc-off\",\n \"cellphone-off\",\n \"cellphone-play\",\n \"cellphone-remove\",\n \"cellphone-screenshot\",\n \"cellphone-settings\",\n \"cellphone-sound\",\n \"cellphone-text\",\n \"cellphone-wireless\",\n \"centos\",\n \"certificate\",\n \"certificate-outline\",\n \"chair-rolling\",\n \"chair-school\",\n \"chandelier\",\n \"charity\",\n \"charity-search\",\n \"chart-arc\",\n \"chart-areaspline\",\n \"chart-areaspline-variant\",\n \"chart-bar\",\n \"chart-bar-stacked\",\n \"chart-bell-curve\",\n \"chart-bell-curve-cumulative\",\n \"chart-box\",\n \"chart-box-multiple\",\n \"chart-box-multiple-outline\",\n \"chart-box-outline\",\n \"chart-box-plus-outline\",\n \"chart-bubble\",\n \"chart-donut\",\n \"chart-donut-variant\",\n \"chart-gantt\",\n \"chart-histogram\",\n \"chart-line\",\n \"chart-line-stacked\",\n \"chart-line-variant\",\n \"chart-multiline\",\n \"chart-multiple\",\n \"chart-pie\",\n \"chart-pie-outline\",\n \"chart-ppf\",\n \"chart-sankey\",\n \"chart-sankey-variant\",\n \"chart-scatter-plot\",\n \"chart-scatter-plot-hexbin\",\n \"chart-timeline\",\n \"chart-timeline-variant\",\n \"chart-timeline-variant-shimmer\",\n \"chart-tree\",\n \"chart-waterfall\",\n \"chat\",\n \"chat-alert\",\n \"chat-alert-outline\",\n \"chat-minus\",\n \"chat-minus-outline\",\n \"chat-outline\",\n \"chat-plus\",\n \"chat-plus-outline\",\n \"chat-processing\",\n \"chat-processing-outline\",\n \"chat-question\",\n \"chat-question-outline\",\n \"chat-remove\",\n \"chat-remove-outline\",\n \"chat-sleep\",\n \"chat-sleep-outline\",\n \"check\",\n \"check-all\",\n \"check-bold\",\n \"check-circle\",\n \"check-circle-outline\",\n \"check-decagram\",\n \"check-decagram-outline\",\n \"check-network\",\n \"check-network-outline\",\n \"check-outline\",\n \"check-underline\",\n \"check-underline-circle\",\n \"check-underline-circle-outline\",\n \"checkbook\",\n \"checkbook-arrow-left\",\n \"checkbook-arrow-right\",\n \"checkbox-blank\",\n \"checkbox-blank-badge\",\n \"checkbox-blank-badge-outline\",\n \"checkbox-blank-circle\",\n \"checkbox-blank-circle-outline\",\n \"checkbox-blank-off\",\n \"checkbox-blank-off-outline\",\n \"checkbox-blank-outline\",\n \"checkbox-intermediate\",\n \"checkbox-intermediate-variant\",\n \"checkbox-marked\",\n \"checkbox-marked-circle\",\n \"checkbox-marked-circle-auto-outline\",\n \"checkbox-marked-circle-minus-outline\",\n \"checkbox-marked-circle-outline\",\n \"checkbox-marked-circle-plus-outline\",\n \"checkbox-marked-outline\",\n \"checkbox-multiple-blank\",\n \"checkbox-multiple-blank-circle\",\n \"checkbox-multiple-blank-circle-outline\",\n \"checkbox-multiple-blank-outline\",\n \"checkbox-multiple-marked\",\n \"checkbox-multiple-marked-circle\",\n \"checkbox-multiple-marked-circle-outline\",\n \"checkbox-multiple-marked-outline\",\n \"checkbox-multiple-outline\",\n \"checkbox-outline\",\n \"checkerboard\",\n \"checkerboard-minus\",\n \"checkerboard-plus\",\n \"checkerboard-remove\",\n \"cheese\",\n \"cheese-off\",\n \"chef-hat\",\n \"chemical-weapon\",\n \"chess-bishop\",\n \"chess-king\",\n \"chess-knight\",\n \"chess-pawn\",\n \"chess-queen\",\n \"chess-rook\",\n \"chevron-double-down\",\n \"chevron-double-left\",\n \"chevron-double-right\",\n \"chevron-double-up\",\n \"chevron-down\",\n \"chevron-down-box\",\n \"chevron-down-box-outline\",\n \"chevron-down-circle\",\n \"chevron-down-circle-outline\",\n \"chevron-left\",\n \"chevron-left-box\",\n \"chevron-left-box-outline\",\n \"chevron-left-circle\",\n \"chevron-left-circle-outline\",\n \"chevron-right\",\n \"chevron-right-box\",\n \"chevron-right-box-outline\",\n \"chevron-right-circle\",\n \"chevron-right-circle-outline\",\n \"chevron-triple-down\",\n \"chevron-triple-left\",\n \"chevron-triple-right\",\n \"chevron-triple-up\",\n \"chevron-up\",\n \"chevron-up-box\",\n \"chevron-up-box-outline\",\n \"chevron-up-circle\",\n \"chevron-up-circle-outline\",\n \"chili-alert\",\n \"chili-alert-outline\",\n \"chili-hot\",\n \"chili-hot-outline\",\n \"chili-medium\",\n \"chili-medium-outline\",\n \"chili-mild\",\n \"chili-mild-outline\",\n \"chili-off\",\n \"chili-off-outline\",\n \"chip\",\n \"church\",\n \"church-outline\",\n \"cigar\",\n \"cigar-off\",\n \"circle\",\n \"circle-box\",\n \"circle-box-outline\",\n \"circle-double\",\n \"circle-edit-outline\",\n \"circle-expand\",\n \"circle-half\",\n \"circle-half-full\",\n \"circle-medium\",\n \"circle-multiple\",\n \"circle-multiple-outline\",\n \"circle-off-outline\",\n \"circle-opacity\",\n \"circle-outline\",\n \"circle-slice-1\",\n \"circle-slice-2\",\n \"circle-slice-3\",\n \"circle-slice-4\",\n \"circle-slice-5\",\n \"circle-slice-6\",\n \"circle-slice-7\",\n \"circle-slice-8\",\n \"circle-small\",\n \"circular-saw\",\n \"city\",\n \"city-switch\",\n \"city-variant\",\n \"city-variant-outline\",\n \"clipboard\",\n \"clipboard-account\",\n \"clipboard-account-outline\",\n \"clipboard-alert\",\n \"clipboard-alert-outline\",\n \"clipboard-arrow-down\",\n \"clipboard-arrow-down-outline\",\n \"clipboard-arrow-left\",\n \"clipboard-arrow-left-outline\",\n \"clipboard-arrow-right\",\n \"clipboard-arrow-right-outline\",\n \"clipboard-arrow-up\",\n \"clipboard-arrow-up-outline\",\n \"clipboard-check\",\n \"clipboard-check-multiple\",\n \"clipboard-check-multiple-outline\",\n \"clipboard-check-outline\",\n \"clipboard-clock\",\n \"clipboard-clock-outline\",\n \"clipboard-edit\",\n \"clipboard-edit-outline\",\n \"clipboard-file\",\n \"clipboard-file-outline\",\n \"clipboard-flow\",\n \"clipboard-flow-outline\",\n \"clipboard-list\",\n \"clipboard-list-outline\",\n \"clipboard-minus\",\n \"clipboard-minus-outline\",\n \"clipboard-multiple\",\n \"clipboard-multiple-outline\",\n \"clipboard-off\",\n \"clipboard-off-outline\",\n \"clipboard-outline\",\n \"clipboard-play\",\n \"clipboard-play-multiple\",\n \"clipboard-play-multiple-outline\",\n \"clipboard-play-outline\",\n \"clipboard-plus\",\n \"clipboard-plus-outline\",\n \"clipboard-pulse\",\n \"clipboard-pulse-outline\",\n \"clipboard-remove\",\n \"clipboard-remove-outline\",\n \"clipboard-search\",\n \"clipboard-search-outline\",\n \"clipboard-text\",\n \"clipboard-text-clock\",\n \"clipboard-text-clock-outline\",\n \"clipboard-text-multiple\",\n \"clipboard-text-multiple-outline\",\n \"clipboard-text-off\",\n \"clipboard-text-off-outline\",\n \"clipboard-text-outline\",\n \"clipboard-text-play\",\n \"clipboard-text-play-outline\",\n \"clipboard-text-search\",\n \"clipboard-text-search-outline\",\n \"clippy\",\n \"clock\",\n \"clock-alert\",\n \"clock-alert-outline\",\n \"clock-check\",\n \"clock-check-outline\",\n \"clock-digital\",\n \"clock-edit\",\n \"clock-edit-outline\",\n \"clock-end\",\n \"clock-fast\",\n \"clock-in\",\n \"clock-minus\",\n \"clock-minus-outline\",\n \"clock-out\",\n \"clock-outline\",\n \"clock-plus\",\n \"clock-plus-outline\",\n \"clock-remove\",\n \"clock-remove-outline\",\n \"clock-star-four-points\",\n \"clock-star-four-points-outline\",\n \"clock-start\",\n \"clock-time-eight\",\n \"clock-time-eight-outline\",\n \"clock-time-eleven\",\n \"clock-time-eleven-outline\",\n \"clock-time-five\",\n \"clock-time-five-outline\",\n \"clock-time-four\",\n \"clock-time-four-outline\",\n \"clock-time-nine\",\n \"clock-time-nine-outline\",\n \"clock-time-one\",\n \"clock-time-one-outline\",\n \"clock-time-seven\",\n \"clock-time-seven-outline\",\n \"clock-time-six\",\n \"clock-time-six-outline\",\n \"clock-time-ten\",\n \"clock-time-ten-outline\",\n \"clock-time-three\",\n \"clock-time-three-outline\",\n \"clock-time-twelve\",\n \"clock-time-twelve-outline\",\n \"clock-time-two\",\n \"clock-time-two-outline\",\n \"close\",\n \"close-box\",\n \"close-box-multiple\",\n \"close-box-multiple-outline\",\n \"close-box-outline\",\n \"close-circle\",\n \"close-circle-multiple\",\n \"close-circle-multiple-outline\",\n \"close-circle-outline\",\n \"close-network\",\n \"close-network-outline\",\n \"close-octagon\",\n \"close-octagon-outline\",\n \"close-outline\",\n \"close-thick\",\n \"closed-caption\",\n \"closed-caption-outline\",\n \"cloud\",\n \"cloud-alert\",\n \"cloud-alert-outline\",\n \"cloud-arrow-down\",\n \"cloud-arrow-down-outline\",\n \"cloud-arrow-left\",\n \"cloud-arrow-left-outline\",\n \"cloud-arrow-right\",\n \"cloud-arrow-right-outline\",\n \"cloud-arrow-up\",\n \"cloud-arrow-up-outline\",\n \"cloud-braces\",\n \"cloud-cancel\",\n \"cloud-cancel-outline\",\n \"cloud-check\",\n \"cloud-check-outline\",\n \"cloud-check-variant\",\n \"cloud-check-variant-outline\",\n \"cloud-circle\",\n \"cloud-circle-outline\",\n \"cloud-clock\",\n \"cloud-clock-outline\",\n \"cloud-cog\",\n \"cloud-cog-outline\",\n \"cloud-download\",\n \"cloud-download-outline\",\n \"cloud-key\",\n \"cloud-key-outline\",\n \"cloud-lock\",\n \"cloud-lock-open\",\n \"cloud-lock-open-outline\",\n \"cloud-lock-outline\",\n \"cloud-minus\",\n \"cloud-minus-outline\",\n \"cloud-off\",\n \"cloud-off-outline\",\n \"cloud-outline\",\n \"cloud-percent\",\n \"cloud-percent-outline\",\n \"cloud-plus\",\n \"cloud-plus-outline\",\n \"cloud-print\",\n \"cloud-print-outline\",\n \"cloud-question\",\n \"cloud-question-outline\",\n \"cloud-refresh\",\n \"cloud-refresh-outline\",\n \"cloud-refresh-variant\",\n \"cloud-refresh-variant-outline\",\n \"cloud-remove\",\n \"cloud-remove-outline\",\n \"cloud-search\",\n \"cloud-search-outline\",\n \"cloud-sync\",\n \"cloud-sync-outline\",\n \"cloud-tags\",\n \"cloud-upload\",\n \"cloud-upload-outline\",\n \"clouds\",\n \"clover\",\n \"clover-outline\",\n \"coach-lamp\",\n \"coach-lamp-variant\",\n \"coat-rack\",\n \"code-array\",\n \"code-block-braces\",\n \"code-block-brackets\",\n \"code-block-parentheses\",\n \"code-block-tags\",\n \"code-braces\",\n \"code-braces-box\",\n \"code-brackets\",\n \"code-equal\",\n \"code-greater-than\",\n \"code-greater-than-or-equal\",\n \"code-json\",\n \"code-less-than\",\n \"code-less-than-or-equal\",\n \"code-not-equal\",\n \"code-not-equal-variant\",\n \"code-parentheses\",\n \"code-parentheses-box\",\n \"code-string\",\n \"code-tags\",\n \"code-tags-check\",\n \"codepen\",\n \"coffee\",\n \"coffee-maker\",\n \"coffee-maker-check\",\n \"coffee-maker-check-outline\",\n \"coffee-maker-outline\",\n \"coffee-off\",\n \"coffee-off-outline\",\n \"coffee-outline\",\n \"coffee-to-go\",\n \"coffee-to-go-outline\",\n \"coffin\",\n \"cog\",\n \"cog-box\",\n \"cog-clockwise\",\n \"cog-counterclockwise\",\n \"cog-off\",\n \"cog-off-outline\",\n \"cog-outline\",\n \"cog-pause\",\n \"cog-pause-outline\",\n \"cog-play\",\n \"cog-play-outline\",\n \"cog-refresh\",\n \"cog-refresh-outline\",\n \"cog-stop\",\n \"cog-stop-outline\",\n \"cog-sync\",\n \"cog-sync-outline\",\n \"cog-transfer\",\n \"cog-transfer-outline\",\n \"cogs\",\n \"collage\",\n \"collapse-all\",\n \"collapse-all-outline\",\n \"color-helper\",\n \"comma\",\n \"comma-box\",\n \"comma-box-outline\",\n \"comma-circle\",\n \"comma-circle-outline\",\n \"comment\",\n \"comment-account\",\n \"comment-account-outline\",\n \"comment-alert\",\n \"comment-alert-outline\",\n \"comment-arrow-left\",\n \"comment-arrow-left-outline\",\n \"comment-arrow-right\",\n \"comment-arrow-right-outline\",\n \"comment-bookmark\",\n \"comment-bookmark-outline\",\n \"comment-check\",\n \"comment-check-outline\",\n \"comment-edit\",\n \"comment-edit-outline\",\n \"comment-eye\",\n \"comment-eye-outline\",\n \"comment-flash\",\n \"comment-flash-outline\",\n \"comment-minus\",\n \"comment-minus-outline\",\n \"comment-multiple\",\n \"comment-multiple-outline\",\n \"comment-off\",\n \"comment-off-outline\",\n \"comment-outline\",\n \"comment-plus\",\n \"comment-plus-outline\",\n \"comment-processing\",\n \"comment-processing-outline\",\n \"comment-question\",\n \"comment-question-outline\",\n \"comment-quote\",\n \"comment-quote-outline\",\n \"comment-remove\",\n \"comment-remove-outline\",\n \"comment-search\",\n \"comment-search-outline\",\n \"comment-text\",\n \"comment-text-multiple\",\n \"comment-text-multiple-outline\",\n \"comment-text-outline\",\n \"compare\",\n \"compare-horizontal\",\n \"compare-remove\",\n \"compare-vertical\",\n \"compass\",\n \"compass-off\",\n \"compass-off-outline\",\n \"compass-outline\",\n \"compass-rose\",\n \"compost\",\n \"cone\",\n \"cone-off\",\n \"connection\",\n \"console\",\n \"console-line\",\n \"console-network\",\n \"console-network-outline\",\n \"consolidate\",\n \"contactless-payment\",\n \"contactless-payment-circle\",\n \"contactless-payment-circle-outline\",\n \"contacts\",\n \"contacts-outline\",\n \"contain\",\n \"contain-end\",\n \"contain-start\",\n \"content-copy\",\n \"content-cut\",\n \"content-duplicate\",\n \"content-paste\",\n \"content-save\",\n \"content-save-alert\",\n \"content-save-alert-outline\",\n \"content-save-all\",\n \"content-save-all-outline\",\n \"content-save-check\",\n \"content-save-check-outline\",\n \"content-save-cog\",\n \"content-save-cog-outline\",\n \"content-save-edit\",\n \"content-save-edit-outline\",\n \"content-save-minus\",\n \"content-save-minus-outline\",\n \"content-save-move\",\n \"content-save-move-outline\",\n \"content-save-off\",\n \"content-save-off-outline\",\n \"content-save-outline\",\n \"content-save-plus\",\n \"content-save-plus-outline\",\n \"content-save-settings\",\n \"content-save-settings-outline\",\n \"contrast\",\n \"contrast-box\",\n \"contrast-circle\",\n \"controller\",\n \"controller-classic\",\n \"controller-classic-outline\",\n \"controller-off\",\n \"cookie\",\n \"cookie-alert\",\n \"cookie-alert-outline\",\n \"cookie-check\",\n \"cookie-check-outline\",\n \"cookie-clock\",\n \"cookie-clock-outline\",\n \"cookie-cog\",\n \"cookie-cog-outline\",\n \"cookie-edit\",\n \"cookie-edit-outline\",\n \"cookie-lock\",\n \"cookie-lock-outline\",\n \"cookie-minus\",\n \"cookie-minus-outline\",\n \"cookie-off\",\n \"cookie-off-outline\",\n \"cookie-outline\",\n \"cookie-plus\",\n \"cookie-plus-outline\",\n \"cookie-refresh\",\n \"cookie-refresh-outline\",\n \"cookie-remove\",\n \"cookie-remove-outline\",\n \"cookie-settings\",\n \"cookie-settings-outline\",\n \"coolant-temperature\",\n \"copyleft\",\n \"copyright\",\n \"cordova\",\n \"corn\",\n \"corn-off\",\n \"cosine-wave\",\n \"counter\",\n \"countertop\",\n \"countertop-outline\",\n \"cow\",\n \"cow-off\",\n \"cpu-32-bit\",\n \"cpu-64-bit\",\n \"cradle\",\n \"cradle-outline\",\n \"crane\",\n \"creation\",\n \"creation-outline\",\n \"creative-commons\",\n \"credit-card\",\n \"credit-card-check\",\n \"credit-card-check-outline\",\n \"credit-card-chip\",\n \"credit-card-chip-outline\",\n \"credit-card-clock\",\n \"credit-card-clock-outline\",\n \"credit-card-edit\",\n \"credit-card-edit-outline\",\n \"credit-card-fast\",\n \"credit-card-fast-outline\",\n \"credit-card-lock\",\n \"credit-card-lock-outline\",\n \"credit-card-marker\",\n \"credit-card-marker-outline\",\n \"credit-card-minus\",\n \"credit-card-minus-outline\",\n \"credit-card-multiple\",\n \"credit-card-multiple-outline\",\n \"credit-card-off\",\n \"credit-card-off-outline\",\n \"credit-card-outline\",\n \"credit-card-plus\",\n \"credit-card-plus-outline\",\n \"credit-card-refresh\",\n \"credit-card-refresh-outline\",\n \"credit-card-refund\",\n \"credit-card-refund-outline\",\n \"credit-card-remove\",\n \"credit-card-remove-outline\",\n \"credit-card-scan\",\n \"credit-card-scan-outline\",\n \"credit-card-search\",\n \"credit-card-search-outline\",\n \"credit-card-settings\",\n \"credit-card-settings-outline\",\n \"credit-card-sync\",\n \"credit-card-sync-outline\",\n \"credit-card-wireless\",\n \"credit-card-wireless-off\",\n \"credit-card-wireless-off-outline\",\n \"credit-card-wireless-outline\",\n \"cricket\",\n \"crop\",\n \"crop-free\",\n \"crop-landscape\",\n \"crop-portrait\",\n \"crop-rotate\",\n \"crop-square\",\n \"cross\",\n \"cross-bolnisi\",\n \"cross-celtic\",\n \"cross-outline\",\n \"crosshairs\",\n \"crosshairs-gps\",\n \"crosshairs-off\",\n \"crosshairs-question\",\n \"crowd\",\n \"crown\",\n \"crown-circle\",\n \"crown-circle-outline\",\n \"crown-outline\",\n \"cryengine\",\n \"crystal-ball\",\n \"cube\",\n \"cube-off\",\n \"cube-off-outline\",\n \"cube-outline\",\n \"cube-scan\",\n \"cube-send\",\n \"cube-unfolded\",\n \"cup\",\n \"cup-off\",\n \"cup-off-outline\",\n \"cup-outline\",\n \"cup-water\",\n \"cupboard\",\n \"cupboard-outline\",\n \"cupcake\",\n \"curling\",\n \"currency-bdt\",\n \"currency-brl\",\n \"currency-btc\",\n \"currency-cny\",\n \"currency-eth\",\n \"currency-eur\",\n \"currency-eur-off\",\n \"currency-fra\",\n \"currency-gbp\",\n \"currency-ils\",\n \"currency-inr\",\n \"currency-jpy\",\n \"currency-krw\",\n \"currency-kzt\",\n \"currency-mnt\",\n \"currency-ngn\",\n \"currency-php\",\n \"currency-rial\",\n \"currency-rub\",\n \"currency-rupee\",\n \"currency-sign\",\n \"currency-thb\",\n \"currency-try\",\n \"currency-twd\",\n \"currency-uah\",\n \"currency-usd\",\n \"currency-usd-off\",\n \"current-ac\",\n \"current-dc\",\n \"cursor-default\",\n \"cursor-default-click\",\n \"cursor-default-click-outline\",\n \"cursor-default-gesture\",\n \"cursor-default-gesture-outline\",\n \"cursor-default-outline\",\n \"cursor-move\",\n \"cursor-pointer\",\n \"cursor-text\",\n \"curtains\",\n \"curtains-closed\",\n \"cylinder\",\n \"cylinder-off\",\n \"dance-ballroom\",\n \"dance-pole\",\n \"data-matrix\",\n \"data-matrix-edit\",\n \"data-matrix-minus\",\n \"data-matrix-plus\",\n \"data-matrix-remove\",\n \"data-matrix-scan\",\n \"database\",\n \"database-alert\",\n \"database-alert-outline\",\n \"database-arrow-down\",\n \"database-arrow-down-outline\",\n \"database-arrow-left\",\n \"database-arrow-left-outline\",\n \"database-arrow-right\",\n \"database-arrow-right-outline\",\n \"database-arrow-up\",\n \"database-arrow-up-outline\",\n \"database-check\",\n \"database-check-outline\",\n \"database-clock\",\n \"database-clock-outline\",\n \"database-cog\",\n \"database-cog-outline\",\n \"database-edit\",\n \"database-edit-outline\",\n \"database-export\",\n \"database-export-outline\",\n \"database-eye\",\n \"database-eye-off\",\n \"database-eye-off-outline\",\n \"database-eye-outline\",\n \"database-import\",\n \"database-import-outline\",\n \"database-lock\",\n \"database-lock-outline\",\n \"database-marker\",\n \"database-marker-outline\",\n \"database-minus\",\n \"database-minus-outline\",\n \"database-off\",\n \"database-off-outline\",\n \"database-outline\",\n \"database-plus\",\n \"database-plus-outline\",\n \"database-refresh\",\n \"database-refresh-outline\",\n \"database-remove\",\n \"database-remove-outline\",\n \"database-search\",\n \"database-search-outline\",\n \"database-settings\",\n \"database-settings-outline\",\n \"database-sync\",\n \"database-sync-outline\",\n \"death-star\",\n \"death-star-variant\",\n \"deathly-hallows\",\n \"debian\",\n \"debug-step-into\",\n \"debug-step-out\",\n \"debug-step-over\",\n \"decagram\",\n \"decagram-outline\",\n \"decimal\",\n \"decimal-comma\",\n \"decimal-comma-decrease\",\n \"decimal-comma-increase\",\n \"decimal-decrease\",\n \"decimal-increase\",\n \"delete\",\n \"delete-alert\",\n \"delete-alert-outline\",\n \"delete-circle\",\n \"delete-circle-outline\",\n \"delete-clock\",\n \"delete-clock-outline\",\n \"delete-empty\",\n \"delete-empty-outline\",\n \"delete-forever\",\n \"delete-forever-outline\",\n \"delete-off\",\n \"delete-off-outline\",\n \"delete-outline\",\n \"delete-restore\",\n \"delete-sweep\",\n \"delete-sweep-outline\",\n \"delete-variant\",\n \"delta\",\n \"desk\",\n \"desk-lamp\",\n \"desk-lamp-off\",\n \"desk-lamp-on\",\n \"deskphone\",\n \"desktop-classic\",\n \"desktop-tower\",\n \"desktop-tower-monitor\",\n \"details\",\n \"dev-to\",\n \"developer-board\",\n \"deviantart\",\n \"devices\",\n \"dharmachakra\",\n \"diabetes\",\n \"dialpad\",\n \"diameter\",\n \"diameter-outline\",\n \"diameter-variant\",\n \"diamond\",\n \"diamond-outline\",\n \"diamond-stone\",\n \"diaper-outline\",\n \"dice-1\",\n \"dice-1-outline\",\n \"dice-2\",\n \"dice-2-outline\",\n \"dice-3\",\n \"dice-3-outline\",\n \"dice-4\",\n \"dice-4-outline\",\n \"dice-5\",\n \"dice-5-outline\",\n \"dice-6\",\n \"dice-6-outline\",\n \"dice-d10\",\n \"dice-d10-outline\",\n \"dice-d12\",\n \"dice-d12-outline\",\n \"dice-d20\",\n \"dice-d20-outline\",\n \"dice-d4\",\n \"dice-d4-outline\",\n \"dice-d6\",\n \"dice-d6-outline\",\n \"dice-d8\",\n \"dice-d8-outline\",\n \"dice-multiple\",\n \"dice-multiple-outline\",\n \"digital-ocean\",\n \"dip-switch\",\n \"directions\",\n \"directions-fork\",\n \"disc\",\n \"disc-alert\",\n \"disc-player\",\n \"dishwasher\",\n \"dishwasher-alert\",\n \"dishwasher-off\",\n \"disqus\",\n \"distribute-horizontal-center\",\n \"distribute-horizontal-left\",\n \"distribute-horizontal-right\",\n \"distribute-vertical-bottom\",\n \"distribute-vertical-center\",\n \"distribute-vertical-top\",\n \"diversify\",\n \"diving\",\n \"diving-flippers\",\n \"diving-helmet\",\n \"diving-scuba\",\n \"diving-scuba-flag\",\n \"diving-scuba-mask\",\n \"diving-scuba-tank\",\n \"diving-scuba-tank-multiple\",\n \"diving-snorkel\",\n \"division\",\n \"division-box\",\n \"dlna\",\n \"dna\",\n \"dns\",\n \"dns-outline\",\n \"dock-bottom\",\n \"dock-left\",\n \"dock-right\",\n \"dock-top\",\n \"dock-window\",\n \"docker\",\n \"doctor\",\n \"dog\",\n \"dog-service\",\n \"dog-side\",\n \"dog-side-off\",\n \"dolby\",\n \"dolly\",\n \"dolphin\",\n \"domain\",\n \"domain-off\",\n \"domain-plus\",\n \"domain-remove\",\n \"domain-switch\",\n \"dome-light\",\n \"domino-mask\",\n \"donkey\",\n \"door\",\n \"door-closed\",\n \"door-closed-cancel\",\n \"door-closed-lock\",\n \"door-open\",\n \"door-sliding\",\n \"door-sliding-lock\",\n \"door-sliding-open\",\n \"doorbell\",\n \"doorbell-video\",\n \"dot-net\",\n \"dots-circle\",\n \"dots-grid\",\n \"dots-hexagon\",\n \"dots-horizontal\",\n \"dots-horizontal-circle\",\n \"dots-horizontal-circle-outline\",\n \"dots-square\",\n \"dots-triangle\",\n \"dots-vertical\",\n \"dots-vertical-circle\",\n \"dots-vertical-circle-outline\",\n \"download\",\n \"download-box\",\n \"download-box-outline\",\n \"download-circle\",\n \"download-circle-outline\",\n \"download-lock\",\n \"download-lock-outline\",\n \"download-multiple\",\n \"download-multiple-outline\",\n \"download-network\",\n \"download-network-outline\",\n \"download-off\",\n \"download-off-outline\",\n \"download-outline\",\n \"drag\",\n \"drag-horizontal\",\n \"drag-horizontal-variant\",\n \"drag-variant\",\n \"drag-vertical\",\n \"drag-vertical-variant\",\n \"drama-masks\",\n \"draw\",\n \"draw-pen\",\n \"drawing\",\n \"drawing-box\",\n \"dresser\",\n \"dresser-outline\",\n \"drone\",\n \"dropbox\",\n \"drupal\",\n \"duck\",\n \"dumbbell\",\n \"dump-truck\",\n \"ear-hearing\",\n \"ear-hearing-loop\",\n \"ear-hearing-off\",\n \"earbuds\",\n \"earbuds-off\",\n \"earbuds-off-outline\",\n \"earbuds-outline\",\n \"earth\",\n \"earth-arrow-down\",\n \"earth-arrow-left\",\n \"earth-arrow-right\",\n \"earth-arrow-up\",\n \"earth-box\",\n \"earth-box-minus\",\n \"earth-box-off\",\n \"earth-box-plus\",\n \"earth-box-remove\",\n \"earth-minus\",\n \"earth-off\",\n \"earth-plus\",\n \"earth-remove\",\n \"egg\",\n \"egg-easter\",\n \"egg-fried\",\n \"egg-off\",\n \"egg-off-outline\",\n \"egg-outline\",\n \"eiffel-tower\",\n \"eight-track\",\n \"eject\",\n \"eject-circle\",\n \"eject-circle-outline\",\n \"eject-outline\",\n \"electric-switch\",\n \"electric-switch-closed\",\n \"electron-framework\",\n \"elephant\",\n \"elevation-decline\",\n \"elevation-rise\",\n \"elevator\",\n \"elevator-down\",\n \"elevator-passenger\",\n \"elevator-passenger-off\",\n \"elevator-passenger-off-outline\",\n \"elevator-passenger-outline\",\n \"elevator-up\",\n \"ellipse\",\n \"ellipse-outline\",\n \"email\",\n \"email-alert\",\n \"email-alert-outline\",\n \"email-arrow-left\",\n \"email-arrow-left-outline\",\n \"email-arrow-right\",\n \"email-arrow-right-outline\",\n \"email-box\",\n \"email-check\",\n \"email-check-outline\",\n \"email-edit\",\n \"email-edit-outline\",\n \"email-fast\",\n \"email-fast-outline\",\n \"email-heart-outline\",\n \"email-lock\",\n \"email-lock-outline\",\n \"email-mark-as-unread\",\n \"email-minus\",\n \"email-minus-outline\",\n \"email-multiple\",\n \"email-multiple-outline\",\n \"email-newsletter\",\n \"email-off\",\n \"email-off-outline\",\n \"email-open\",\n \"email-open-heart-outline\",\n \"email-open-multiple\",\n \"email-open-multiple-outline\",\n \"email-open-outline\",\n \"email-outline\",\n \"email-plus\",\n \"email-plus-outline\",\n \"email-remove\",\n \"email-remove-outline\",\n \"email-seal\",\n \"email-seal-outline\",\n \"email-search\",\n \"email-search-outline\",\n \"email-sync\",\n \"email-sync-outline\",\n \"email-variant\",\n \"ember\",\n \"emby\",\n \"emoticon\",\n \"emoticon-angry\",\n \"emoticon-angry-outline\",\n \"emoticon-confused\",\n \"emoticon-confused-outline\",\n \"emoticon-cool\",\n \"emoticon-cool-outline\",\n \"emoticon-cry\",\n \"emoticon-cry-outline\",\n \"emoticon-dead\",\n \"emoticon-dead-outline\",\n \"emoticon-devil\",\n \"emoticon-devil-outline\",\n \"emoticon-excited\",\n \"emoticon-excited-outline\",\n \"emoticon-frown\",\n \"emoticon-frown-outline\",\n \"emoticon-happy\",\n \"emoticon-happy-outline\",\n \"emoticon-kiss\",\n \"emoticon-kiss-outline\",\n \"emoticon-lol\",\n \"emoticon-lol-outline\",\n \"emoticon-minus\",\n \"emoticon-minus-outline\",\n \"emoticon-neutral\",\n \"emoticon-neutral-outline\",\n \"emoticon-outline\",\n \"emoticon-plus\",\n \"emoticon-plus-outline\",\n \"emoticon-poop\",\n \"emoticon-poop-outline\",\n \"emoticon-remove\",\n \"emoticon-remove-outline\",\n \"emoticon-sad\",\n \"emoticon-sad-outline\",\n \"emoticon-sick\",\n \"emoticon-sick-outline\",\n \"emoticon-tongue\",\n \"emoticon-tongue-outline\",\n \"emoticon-wink\",\n \"emoticon-wink-outline\",\n \"engine\",\n \"engine-off\",\n \"engine-off-outline\",\n \"engine-outline\",\n \"epsilon\",\n \"equal\",\n \"equal-box\",\n \"equalizer\",\n \"equalizer-outline\",\n \"eraser\",\n \"eraser-variant\",\n \"escalator\",\n \"escalator-box\",\n \"escalator-down\",\n \"escalator-up\",\n \"eslint\",\n \"et\",\n \"ethereum\",\n \"ethernet\",\n \"ethernet-cable\",\n \"ethernet-cable-off\",\n \"ethernet-off\",\n \"ev-plug-ccs1\",\n \"ev-plug-ccs2\",\n \"ev-plug-chademo\",\n \"ev-plug-tesla\",\n \"ev-plug-type1\",\n \"ev-plug-type2\",\n \"ev-station\",\n \"evernote\",\n \"excavator\",\n \"exclamation\",\n \"exclamation-thick\",\n \"exit-run\",\n \"exit-to-app\",\n \"expand-all\",\n \"expand-all-outline\",\n \"expansion-card\",\n \"expansion-card-variant\",\n \"exponent\",\n \"exponent-box\",\n \"export\",\n \"export-variant\",\n \"eye\",\n \"eye-arrow-left\",\n \"eye-arrow-left-outline\",\n \"eye-arrow-right\",\n \"eye-arrow-right-outline\",\n \"eye-check\",\n \"eye-check-outline\",\n \"eye-circle\",\n \"eye-circle-outline\",\n \"eye-closed\",\n \"eye-lock\",\n \"eye-lock-open\",\n \"eye-lock-open-outline\",\n \"eye-lock-outline\",\n \"eye-minus\",\n \"eye-minus-outline\",\n \"eye-off\",\n \"eye-off-outline\",\n \"eye-outline\",\n \"eye-plus\",\n \"eye-plus-outline\",\n \"eye-refresh\",\n \"eye-refresh-outline\",\n \"eye-remove\",\n \"eye-remove-outline\",\n \"eye-settings\",\n \"eye-settings-outline\",\n \"eyedropper\",\n \"eyedropper-minus\",\n \"eyedropper-off\",\n \"eyedropper-plus\",\n \"eyedropper-remove\",\n \"eyedropper-variant\",\n \"face-agent\",\n \"face-man\",\n \"face-man-outline\",\n \"face-man-profile\",\n \"face-man-shimmer\",\n \"face-man-shimmer-outline\",\n \"face-mask\",\n \"face-mask-outline\",\n \"face-recognition\",\n \"face-woman\",\n \"face-woman-outline\",\n \"face-woman-profile\",\n \"face-woman-shimmer\",\n \"face-woman-shimmer-outline\",\n \"facebook\",\n \"facebook-gaming\",\n \"facebook-messenger\",\n \"facebook-workplace\",\n \"factory\",\n \"family-tree\",\n \"fan\",\n \"fan-alert\",\n \"fan-auto\",\n \"fan-chevron-down\",\n \"fan-chevron-up\",\n \"fan-clock\",\n \"fan-minus\",\n \"fan-off\",\n \"fan-plus\",\n \"fan-remove\",\n \"fan-speed-1\",\n \"fan-speed-2\",\n \"fan-speed-3\",\n \"fast-forward\",\n \"fast-forward-10\",\n \"fast-forward-15\",\n \"fast-forward-30\",\n \"fast-forward-45\",\n \"fast-forward-5\",\n \"fast-forward-60\",\n \"fast-forward-outline\",\n \"faucet\",\n \"faucet-variant\",\n \"fax\",\n \"feather\",\n \"feature-search\",\n \"feature-search-outline\",\n \"fedora\",\n \"fence\",\n \"fence-electric\",\n \"fencing\",\n \"ferris-wheel\",\n \"ferry\",\n \"file\",\n \"file-account\",\n \"file-account-outline\",\n \"file-alert\",\n \"file-alert-outline\",\n \"file-arrow-left-right\",\n \"file-arrow-left-right-outline\",\n \"file-arrow-up-down\",\n \"file-arrow-up-down-outline\",\n \"file-cabinet\",\n \"file-cad\",\n \"file-cad-box\",\n \"file-cancel\",\n \"file-cancel-outline\",\n \"file-certificate\",\n \"file-certificate-outline\",\n \"file-chart\",\n \"file-chart-check\",\n \"file-chart-check-outline\",\n \"file-chart-outline\",\n \"file-check\",\n \"file-check-outline\",\n \"file-clock\",\n \"file-clock-outline\",\n \"file-cloud\",\n \"file-cloud-outline\",\n \"file-code\",\n \"file-code-outline\",\n \"file-cog\",\n \"file-cog-outline\",\n \"file-compare\",\n \"file-delimited\",\n \"file-delimited-outline\",\n \"file-document\",\n \"file-document-alert\",\n \"file-document-alert-outline\",\n \"file-document-arrow-right\",\n \"file-document-arrow-right-outline\",\n \"file-document-check\",\n \"file-document-check-outline\",\n \"file-document-edit\",\n \"file-document-edit-outline\",\n \"file-document-minus\",\n \"file-document-minus-outline\",\n \"file-document-multiple\",\n \"file-document-multiple-outline\",\n \"file-document-outline\",\n \"file-document-plus\",\n \"file-document-plus-outline\",\n \"file-document-refresh\",\n \"file-document-refresh-outline\",\n \"file-document-remove\",\n \"file-document-remove-outline\",\n \"file-download\",\n \"file-download-outline\",\n \"file-edit\",\n \"file-edit-outline\",\n \"file-excel\",\n \"file-excel-box\",\n \"file-excel-box-outline\",\n \"file-excel-outline\",\n \"file-export\",\n \"file-export-outline\",\n \"file-eye\",\n \"file-eye-outline\",\n \"file-find\",\n \"file-find-outline\",\n \"file-gif-box\",\n \"file-hidden\",\n \"file-image\",\n \"file-image-marker\",\n \"file-image-marker-outline\",\n \"file-image-minus\",\n \"file-image-minus-outline\",\n \"file-image-outline\",\n \"file-image-plus\",\n \"file-image-plus-outline\",\n \"file-image-remove\",\n \"file-image-remove-outline\",\n \"file-import\",\n \"file-import-outline\",\n \"file-jpg-box\",\n \"file-key\",\n \"file-key-outline\",\n \"file-link\",\n \"file-link-outline\",\n \"file-lock\",\n \"file-lock-open\",\n \"file-lock-open-outline\",\n \"file-lock-outline\",\n \"file-marker\",\n \"file-marker-outline\",\n \"file-minus\",\n \"file-minus-outline\",\n \"file-move\",\n \"file-move-outline\",\n \"file-multiple\",\n \"file-multiple-outline\",\n \"file-music\",\n \"file-music-outline\",\n \"file-outline\",\n \"file-pdf-box\",\n \"file-percent\",\n \"file-percent-outline\",\n \"file-phone\",\n \"file-phone-outline\",\n \"file-plus\",\n \"file-plus-outline\",\n \"file-png-box\",\n \"file-powerpoint\",\n \"file-powerpoint-box\",\n \"file-powerpoint-box-outline\",\n \"file-powerpoint-outline\",\n \"file-presentation-box\",\n \"file-question\",\n \"file-question-outline\",\n \"file-refresh\",\n \"file-refresh-outline\",\n \"file-remove\",\n \"file-remove-outline\",\n \"file-replace\",\n \"file-replace-outline\",\n \"file-restore\",\n \"file-restore-outline\",\n \"file-rotate-left\",\n \"file-rotate-left-outline\",\n \"file-rotate-right\",\n \"file-rotate-right-outline\",\n \"file-search\",\n \"file-search-outline\",\n \"file-send\",\n \"file-send-outline\",\n \"file-settings\",\n \"file-settings-outline\",\n \"file-sign\",\n \"file-star\",\n \"file-star-four-points\",\n \"file-star-four-points-outline\",\n \"file-star-outline\",\n \"file-swap\",\n \"file-swap-outline\",\n \"file-sync\",\n \"file-sync-outline\",\n \"file-table\",\n \"file-table-box\",\n \"file-table-box-multiple\",\n \"file-table-box-multiple-outline\",\n \"file-table-box-outline\",\n \"file-table-outline\",\n \"file-tree\",\n \"file-tree-outline\",\n \"file-undo\",\n \"file-undo-outline\",\n \"file-upload\",\n \"file-upload-outline\",\n \"file-video\",\n \"file-video-outline\",\n \"file-word\",\n \"file-word-box\",\n \"file-word-box-outline\",\n \"file-word-outline\",\n \"file-xml-box\",\n \"film\",\n \"filmstrip\",\n \"filmstrip-box\",\n \"filmstrip-box-multiple\",\n \"filmstrip-off\",\n \"filter\",\n \"filter-check\",\n \"filter-check-outline\",\n \"filter-cog\",\n \"filter-cog-outline\",\n \"filter-menu\",\n \"filter-menu-outline\",\n \"filter-minus\",\n \"filter-minus-outline\",\n \"filter-multiple\",\n \"filter-multiple-outline\",\n \"filter-off\",\n \"filter-off-outline\",\n \"filter-outline\",\n \"filter-plus\",\n \"filter-plus-outline\",\n \"filter-remove\",\n \"filter-remove-outline\",\n \"filter-settings\",\n \"filter-settings-outline\",\n \"filter-variant\",\n \"filter-variant-minus\",\n \"filter-variant-plus\",\n \"filter-variant-remove\",\n \"finance\",\n \"find-replace\",\n \"fingerprint\",\n \"fingerprint-off\",\n \"fire\",\n \"fire-alert\",\n \"fire-circle\",\n \"fire-extinguisher\",\n \"fire-hydrant\",\n \"fire-hydrant-alert\",\n \"fire-hydrant-off\",\n \"fire-off\",\n \"fire-station\",\n \"fire-truck\",\n \"firebase\",\n \"firefox\",\n \"fireplace\",\n \"fireplace-off\",\n \"firewire\",\n \"firework\",\n \"firework-off\",\n \"fish\",\n \"fish-off\",\n \"fishbowl\",\n \"fishbowl-outline\",\n \"fit-to-page\",\n \"fit-to-page-outline\",\n \"fit-to-screen\",\n \"fit-to-screen-outline\",\n \"flag\",\n \"flag-checkered\",\n \"flag-minus\",\n \"flag-minus-outline\",\n \"flag-off\",\n \"flag-off-outline\",\n \"flag-outline\",\n \"flag-plus\",\n \"flag-plus-outline\",\n \"flag-remove\",\n \"flag-remove-outline\",\n \"flag-triangle\",\n \"flag-variant\",\n \"flag-variant-minus\",\n \"flag-variant-minus-outline\",\n \"flag-variant-off\",\n \"flag-variant-off-outline\",\n \"flag-variant-outline\",\n \"flag-variant-plus\",\n \"flag-variant-plus-outline\",\n \"flag-variant-remove\",\n \"flag-variant-remove-outline\",\n \"flare\",\n \"flash\",\n \"flash-alert\",\n \"flash-alert-outline\",\n \"flash-auto\",\n \"flash-off\",\n \"flash-off-outline\",\n \"flash-outline\",\n \"flash-red-eye\",\n \"flash-triangle\",\n \"flash-triangle-outline\",\n \"flashlight\",\n \"flashlight-off\",\n \"flask\",\n \"flask-empty\",\n \"flask-empty-minus\",\n \"flask-empty-minus-outline\",\n \"flask-empty-off\",\n \"flask-empty-off-outline\",\n \"flask-empty-outline\",\n \"flask-empty-plus\",\n \"flask-empty-plus-outline\",\n \"flask-empty-remove\",\n \"flask-empty-remove-outline\",\n \"flask-minus\",\n \"flask-minus-outline\",\n \"flask-off\",\n \"flask-off-outline\",\n \"flask-outline\",\n \"flask-plus\",\n \"flask-plus-outline\",\n \"flask-remove\",\n \"flask-remove-outline\",\n \"flask-round-bottom\",\n \"flask-round-bottom-empty\",\n \"flask-round-bottom-empty-outline\",\n \"flask-round-bottom-outline\",\n \"fleur-de-lis\",\n \"flip-horizontal\",\n \"flip-to-back\",\n \"flip-to-front\",\n \"flip-vertical\",\n \"floor-lamp\",\n \"floor-lamp-dual\",\n \"floor-lamp-dual-outline\",\n \"floor-lamp-outline\",\n \"floor-lamp-torchiere\",\n \"floor-lamp-torchiere-outline\",\n \"floor-lamp-torchiere-variant\",\n \"floor-lamp-torchiere-variant-outline\",\n \"floor-plan\",\n \"floppy\",\n \"floppy-variant\",\n \"flower\",\n \"flower-outline\",\n \"flower-pollen\",\n \"flower-pollen-outline\",\n \"flower-poppy\",\n \"flower-tulip\",\n \"flower-tulip-outline\",\n \"focus-auto\",\n \"focus-field\",\n \"focus-field-horizontal\",\n \"focus-field-vertical\",\n \"folder\",\n \"folder-account\",\n \"folder-account-outline\",\n \"folder-alert\",\n \"folder-alert-outline\",\n \"folder-arrow-down\",\n \"folder-arrow-down-outline\",\n \"folder-arrow-left\",\n \"folder-arrow-left-outline\",\n \"folder-arrow-left-right\",\n \"folder-arrow-left-right-outline\",\n \"folder-arrow-right\",\n \"folder-arrow-right-outline\",\n \"folder-arrow-up\",\n \"folder-arrow-up-down\",\n \"folder-arrow-up-down-outline\",\n \"folder-arrow-up-outline\",\n \"folder-cancel\",\n \"folder-cancel-outline\",\n \"folder-check\",\n \"folder-check-outline\",\n \"folder-clock\",\n \"folder-clock-outline\",\n \"folder-cog\",\n \"folder-cog-outline\",\n \"folder-download\",\n \"folder-download-outline\",\n \"folder-edit\",\n \"folder-edit-outline\",\n \"folder-eye\",\n \"folder-eye-outline\",\n \"folder-file\",\n \"folder-file-outline\",\n \"folder-google-drive\",\n \"folder-heart\",\n \"folder-heart-outline\",\n \"folder-hidden\",\n \"folder-home\",\n \"folder-home-outline\",\n \"folder-image\",\n \"folder-information\",\n \"folder-information-outline\",\n \"folder-key\",\n \"folder-key-network\",\n \"folder-key-network-outline\",\n \"folder-key-outline\",\n \"folder-lock\",\n \"folder-lock-open\",\n \"folder-lock-open-outline\",\n \"folder-lock-outline\",\n \"folder-marker\",\n \"folder-marker-outline\",\n \"folder-minus\",\n \"folder-minus-outline\",\n \"folder-move\",\n \"folder-move-outline\",\n \"folder-multiple\",\n \"folder-multiple-image\",\n \"folder-multiple-outline\",\n \"folder-multiple-plus\",\n \"folder-multiple-plus-outline\",\n \"folder-music\",\n \"folder-music-outline\",\n \"folder-network\",\n \"folder-network-outline\",\n \"folder-off\",\n \"folder-off-outline\",\n \"folder-open\",\n \"folder-open-outline\",\n \"folder-outline\",\n \"folder-play\",\n \"folder-play-outline\",\n \"folder-plus\",\n \"folder-plus-outline\",\n \"folder-pound\",\n \"folder-pound-outline\",\n \"folder-question\",\n \"folder-question-outline\",\n \"folder-refresh\",\n \"folder-refresh-outline\",\n \"folder-remove\",\n \"folder-remove-outline\",\n \"folder-search\",\n \"folder-search-outline\",\n \"folder-settings\",\n \"folder-settings-outline\",\n \"folder-star\",\n \"folder-star-multiple\",\n \"folder-star-multiple-outline\",\n \"folder-star-outline\",\n \"folder-swap\",\n \"folder-swap-outline\",\n \"folder-sync\",\n \"folder-sync-outline\",\n \"folder-table\",\n \"folder-table-outline\",\n \"folder-text\",\n \"folder-text-outline\",\n \"folder-upload\",\n \"folder-upload-outline\",\n \"folder-wrench\",\n \"folder-wrench-outline\",\n \"folder-zip\",\n \"folder-zip-outline\",\n \"font-awesome\",\n \"food\",\n \"food-apple\",\n \"food-apple-outline\",\n \"food-croissant\",\n \"food-drumstick\",\n \"food-drumstick-off\",\n \"food-drumstick-off-outline\",\n \"food-drumstick-outline\",\n \"food-fork-drink\",\n \"food-halal\",\n \"food-hot-dog\",\n \"food-kosher\",\n \"food-off\",\n \"food-off-outline\",\n \"food-outline\",\n \"food-steak\",\n \"food-steak-off\",\n \"food-takeout-box\",\n \"food-takeout-box-outline\",\n \"food-turkey\",\n \"food-variant\",\n \"food-variant-off\",\n \"foot-print\",\n \"football\",\n \"football-australian\",\n \"football-helmet\",\n \"forest\",\n \"forest-outline\",\n \"forklift\",\n \"form-dropdown\",\n \"form-select\",\n \"form-textarea\",\n \"form-textbox\",\n \"form-textbox-lock\",\n \"form-textbox-password\",\n \"format-align-bottom\",\n \"format-align-center\",\n \"format-align-justify\",\n \"format-align-left\",\n \"format-align-middle\",\n \"format-align-right\",\n \"format-align-top\",\n \"format-annotation-minus\",\n \"format-annotation-plus\",\n \"format-bold\",\n \"format-clear\",\n \"format-color-fill\",\n \"format-color-highlight\",\n \"format-color-marker-cancel\",\n \"format-color-text\",\n \"format-columns\",\n \"format-float-center\",\n \"format-float-left\",\n \"format-float-none\",\n \"format-float-right\",\n \"format-font\",\n \"format-font-size-decrease\",\n \"format-font-size-increase\",\n \"format-header-1\",\n \"format-header-2\",\n \"format-header-3\",\n \"format-header-4\",\n \"format-header-5\",\n \"format-header-6\",\n \"format-header-decrease\",\n \"format-header-equal\",\n \"format-header-increase\",\n \"format-header-pound\",\n \"format-horizontal-align-center\",\n \"format-horizontal-align-left\",\n \"format-horizontal-align-right\",\n \"format-indent-decrease\",\n \"format-indent-increase\",\n \"format-italic\",\n \"format-letter-case\",\n \"format-letter-case-lower\",\n \"format-letter-case-upper\",\n \"format-letter-ends-with\",\n \"format-letter-matches\",\n \"format-letter-spacing\",\n \"format-letter-spacing-variant\",\n \"format-letter-starts-with\",\n \"format-line-height\",\n \"format-line-spacing\",\n \"format-line-style\",\n \"format-line-weight\",\n \"format-list-bulleted\",\n \"format-list-bulleted-square\",\n \"format-list-bulleted-triangle\",\n \"format-list-bulleted-type\",\n \"format-list-checkbox\",\n \"format-list-checks\",\n \"format-list-group\",\n \"format-list-group-plus\",\n \"format-list-numbered\",\n \"format-list-numbered-rtl\",\n \"format-list-text\",\n \"format-overline\",\n \"format-page-break\",\n \"format-page-split\",\n \"format-paint\",\n \"format-paragraph\",\n \"format-paragraph-spacing\",\n \"format-pilcrow\",\n \"format-pilcrow-arrow-left\",\n \"format-pilcrow-arrow-right\",\n \"format-quote-close\",\n \"format-quote-close-outline\",\n \"format-quote-open\",\n \"format-quote-open-outline\",\n \"format-rotate-90\",\n \"format-section\",\n \"format-size\",\n \"format-strikethrough\",\n \"format-strikethrough-variant\",\n \"format-subscript\",\n \"format-superscript\",\n \"format-text\",\n \"format-text-rotation-angle-down\",\n \"format-text-rotation-angle-up\",\n \"format-text-rotation-down\",\n \"format-text-rotation-down-vertical\",\n \"format-text-rotation-none\",\n \"format-text-rotation-up\",\n \"format-text-rotation-vertical\",\n \"format-text-variant\",\n \"format-text-variant-outline\",\n \"format-text-wrapping-clip\",\n \"format-text-wrapping-overflow\",\n \"format-text-wrapping-wrap\",\n \"format-textbox\",\n \"format-title\",\n \"format-underline\",\n \"format-underline-wavy\",\n \"format-vertical-align-bottom\",\n \"format-vertical-align-center\",\n \"format-vertical-align-top\",\n \"format-wrap-inline\",\n \"format-wrap-square\",\n \"format-wrap-tight\",\n \"format-wrap-top-bottom\",\n \"forum\",\n \"forum-minus\",\n \"forum-minus-outline\",\n \"forum-outline\",\n \"forum-plus\",\n \"forum-plus-outline\",\n \"forum-remove\",\n \"forum-remove-outline\",\n \"forward\",\n \"forwardburger\",\n \"fountain\",\n \"fountain-pen\",\n \"fountain-pen-tip\",\n \"fraction-one-half\",\n \"freebsd\",\n \"french-fries\",\n \"frequently-asked-questions\",\n \"fridge\",\n \"fridge-alert\",\n \"fridge-alert-outline\",\n \"fridge-bottom\",\n \"fridge-industrial\",\n \"fridge-industrial-alert\",\n \"fridge-industrial-alert-outline\",\n \"fridge-industrial-off\",\n \"fridge-industrial-off-outline\",\n \"fridge-industrial-outline\",\n \"fridge-off\",\n \"fridge-off-outline\",\n \"fridge-outline\",\n \"fridge-top\",\n \"fridge-variant\",\n \"fridge-variant-alert\",\n \"fridge-variant-alert-outline\",\n \"fridge-variant-off\",\n \"fridge-variant-off-outline\",\n \"fridge-variant-outline\",\n \"fruit-cherries\",\n \"fruit-cherries-off\",\n \"fruit-citrus\",\n \"fruit-citrus-off\",\n \"fruit-grapes\",\n \"fruit-grapes-outline\",\n \"fruit-pear\",\n \"fruit-pineapple\",\n \"fruit-watermelon\",\n \"fuel\",\n \"fuel-cell\",\n \"fullscreen\",\n \"fullscreen-exit\",\n \"function\",\n \"function-variant\",\n \"furigana-horizontal\",\n \"furigana-vertical\",\n \"fuse\",\n \"fuse-alert\",\n \"fuse-blade\",\n \"fuse-off\",\n \"gamepad\",\n \"gamepad-circle\",\n \"gamepad-circle-down\",\n \"gamepad-circle-left\",\n \"gamepad-circle-outline\",\n \"gamepad-circle-right\",\n \"gamepad-circle-up\",\n \"gamepad-down\",\n \"gamepad-left\",\n \"gamepad-outline\",\n \"gamepad-right\",\n \"gamepad-round\",\n \"gamepad-round-down\",\n \"gamepad-round-left\",\n \"gamepad-round-outline\",\n \"gamepad-round-right\",\n \"gamepad-round-up\",\n \"gamepad-square\",\n \"gamepad-square-outline\",\n \"gamepad-up\",\n \"gamepad-variant\",\n \"gamepad-variant-outline\",\n \"gamma\",\n \"gantry-crane\",\n \"garage\",\n \"garage-alert\",\n \"garage-alert-variant\",\n \"garage-lock\",\n \"garage-open\",\n \"garage-open-variant\",\n \"garage-variant\",\n \"garage-variant-lock\",\n \"gas-burner\",\n \"gas-cylinder\",\n \"gas-station\",\n \"gas-station-in-use\",\n \"gas-station-in-use-outline\",\n \"gas-station-off\",\n \"gas-station-off-outline\",\n \"gas-station-outline\",\n \"gate\",\n \"gate-alert\",\n \"gate-and\",\n \"gate-arrow-left\",\n \"gate-arrow-right\",\n \"gate-buffer\",\n \"gate-nand\",\n \"gate-nor\",\n \"gate-not\",\n \"gate-open\",\n \"gate-or\",\n \"gate-xnor\",\n \"gate-xor\",\n \"gatsby\",\n \"gauge\",\n \"gauge-empty\",\n \"gauge-full\",\n \"gauge-low\",\n \"gavel\",\n \"gender-female\",\n \"gender-male\",\n \"gender-male-female\",\n \"gender-male-female-variant\",\n \"gender-non-binary\",\n \"gender-transgender\",\n \"generator-mobile\",\n \"generator-portable\",\n \"generator-stationary\",\n \"gentoo\",\n \"gesture\",\n \"gesture-double-tap\",\n \"gesture-pinch\",\n \"gesture-spread\",\n \"gesture-swipe\",\n \"gesture-swipe-down\",\n \"gesture-swipe-horizontal\",\n \"gesture-swipe-left\",\n \"gesture-swipe-right\",\n \"gesture-swipe-up\",\n \"gesture-swipe-vertical\",\n \"gesture-tap\",\n \"gesture-tap-box\",\n \"gesture-tap-button\",\n \"gesture-tap-hold\",\n \"gesture-two-double-tap\",\n \"gesture-two-tap\",\n \"ghost\",\n \"ghost-off\",\n \"ghost-off-outline\",\n \"ghost-outline\",\n \"gift\",\n \"gift-off\",\n \"gift-off-outline\",\n \"gift-open\",\n \"gift-open-outline\",\n \"gift-outline\",\n \"git\",\n \"github\",\n \"gitlab\",\n \"glass-cocktail\",\n \"glass-cocktail-off\",\n \"glass-flute\",\n \"glass-fragile\",\n \"glass-mug\",\n \"glass-mug-off\",\n \"glass-mug-variant\",\n \"glass-mug-variant-off\",\n \"glass-pint-outline\",\n \"glass-stange\",\n \"glass-tulip\",\n \"glass-wine\",\n \"glasses\",\n \"globe-light\",\n \"globe-light-outline\",\n \"globe-model\",\n \"gmail\",\n \"gnome\",\n \"go-kart\",\n \"go-kart-track\",\n \"gog\",\n \"gold\",\n \"golf\",\n \"golf-cart\",\n \"golf-tee\",\n \"gondola\",\n \"goodreads\",\n \"google\",\n \"google-ads\",\n \"google-analytics\",\n \"google-assistant\",\n \"google-cardboard\",\n \"google-chrome\",\n \"google-circles\",\n \"google-circles-communities\",\n \"google-circles-extended\",\n \"google-circles-group\",\n \"google-classroom\",\n \"google-cloud\",\n \"google-downasaur\",\n \"google-drive\",\n \"google-earth\",\n \"google-fit\",\n \"google-glass\",\n \"google-hangouts\",\n \"google-keep\",\n \"google-lens\",\n \"google-maps\",\n \"google-my-business\",\n \"google-nearby\",\n \"google-play\",\n \"google-plus\",\n \"google-podcast\",\n \"google-spreadsheet\",\n \"google-street-view\",\n \"google-translate\",\n \"gradient-horizontal\",\n \"gradient-vertical\",\n \"grain\",\n \"graph\",\n \"graph-outline\",\n \"graphql\",\n \"grass\",\n \"grave-stone\",\n \"grease-pencil\",\n \"greater-than\",\n \"greater-than-or-equal\",\n \"greenhouse\",\n \"grid\",\n \"grid-large\",\n \"grid-off\",\n \"grill\",\n \"grill-outline\",\n \"group\",\n \"guitar-acoustic\",\n \"guitar-electric\",\n \"guitar-pick\",\n \"guitar-pick-outline\",\n \"guy-fawkes-mask\",\n \"gymnastics\",\n \"hail\",\n \"hair-dryer\",\n \"hair-dryer-outline\",\n \"halloween\",\n \"hamburger\",\n \"hamburger-check\",\n \"hamburger-minus\",\n \"hamburger-off\",\n \"hamburger-plus\",\n \"hamburger-remove\",\n \"hammer\",\n \"hammer-screwdriver\",\n \"hammer-sickle\",\n \"hammer-wrench\",\n \"hand-back-left\",\n \"hand-back-left-off\",\n \"hand-back-left-off-outline\",\n \"hand-back-left-outline\",\n \"hand-back-right\",\n \"hand-back-right-off\",\n \"hand-back-right-off-outline\",\n \"hand-back-right-outline\",\n \"hand-clap\",\n \"hand-clap-off\",\n \"hand-coin\",\n \"hand-coin-outline\",\n \"hand-cycle\",\n \"hand-extended\",\n \"hand-extended-outline\",\n \"hand-front-left\",\n \"hand-front-left-outline\",\n \"hand-front-right\",\n \"hand-front-right-outline\",\n \"hand-heart\",\n \"hand-heart-outline\",\n \"hand-okay\",\n \"hand-peace\",\n \"hand-peace-variant\",\n \"hand-pointing-down\",\n \"hand-pointing-left\",\n \"hand-pointing-right\",\n \"hand-pointing-up\",\n \"hand-saw\",\n \"hand-wash\",\n \"hand-wash-outline\",\n \"hand-water\",\n \"hand-wave\",\n \"hand-wave-outline\",\n \"handball\",\n \"handcuffs\",\n \"hands-pray\",\n \"handshake\",\n \"handshake-outline\",\n \"hanger\",\n \"hard-hat\",\n \"harddisk\",\n \"harddisk-plus\",\n \"harddisk-remove\",\n \"hat-fedora\",\n \"hazard-lights\",\n \"hdmi-port\",\n \"hdr\",\n \"hdr-off\",\n \"head\",\n \"head-alert\",\n \"head-alert-outline\",\n \"head-check\",\n \"head-check-outline\",\n \"head-cog\",\n \"head-cog-outline\",\n \"head-dots-horizontal\",\n \"head-dots-horizontal-outline\",\n \"head-flash\",\n \"head-flash-outline\",\n \"head-heart\",\n \"head-heart-outline\",\n \"head-lightbulb\",\n \"head-lightbulb-outline\",\n \"head-minus\",\n \"head-minus-outline\",\n \"head-outline\",\n \"head-plus\",\n \"head-plus-outline\",\n \"head-question\",\n \"head-question-outline\",\n \"head-remove\",\n \"head-remove-outline\",\n \"head-snowflake\",\n \"head-snowflake-outline\",\n \"head-sync\",\n \"head-sync-outline\",\n \"headphones\",\n \"headphones-bluetooth\",\n \"headphones-box\",\n \"headphones-off\",\n \"headphones-settings\",\n \"headset\",\n \"headset-dock\",\n \"headset-off\",\n \"heart\",\n \"heart-box\",\n \"heart-box-outline\",\n \"heart-broken\",\n \"heart-broken-outline\",\n \"heart-circle\",\n \"heart-circle-outline\",\n \"heart-cog\",\n \"heart-cog-outline\",\n \"heart-flash\",\n \"heart-half\",\n \"heart-half-full\",\n \"heart-half-outline\",\n \"heart-minus\",\n \"heart-minus-outline\",\n \"heart-multiple\",\n \"heart-multiple-outline\",\n \"heart-off\",\n \"heart-off-outline\",\n \"heart-outline\",\n \"heart-plus\",\n \"heart-plus-outline\",\n \"heart-pulse\",\n \"heart-remove\",\n \"heart-remove-outline\",\n \"heart-search\",\n \"heart-settings\",\n \"heart-settings-outline\",\n \"heat-pump\",\n \"heat-pump-outline\",\n \"heat-wave\",\n \"heating-coil\",\n \"helicopter\",\n \"help\",\n \"help-box\",\n \"help-box-multiple\",\n \"help-box-multiple-outline\",\n \"help-box-outline\",\n \"help-circle\",\n \"help-circle-outline\",\n \"help-network\",\n \"help-network-outline\",\n \"help-rhombus\",\n \"help-rhombus-outline\",\n \"hexadecimal\",\n \"hexagon\",\n \"hexagon-multiple\",\n \"hexagon-multiple-outline\",\n \"hexagon-outline\",\n \"hexagon-slice-1\",\n \"hexagon-slice-2\",\n \"hexagon-slice-3\",\n \"hexagon-slice-4\",\n \"hexagon-slice-5\",\n \"hexagon-slice-6\",\n \"hexagram\",\n \"hexagram-outline\",\n \"high-definition\",\n \"high-definition-box\",\n \"highway\",\n \"hiking\",\n \"history\",\n \"hockey-puck\",\n \"hockey-sticks\",\n \"hololens\",\n \"home\",\n \"home-account\",\n \"home-alert\",\n \"home-alert-outline\",\n \"home-analytics\",\n \"home-assistant\",\n \"home-automation\",\n \"home-battery\",\n \"home-battery-outline\",\n \"home-circle\",\n \"home-circle-outline\",\n \"home-city\",\n \"home-city-outline\",\n \"home-clock\",\n \"home-clock-outline\",\n \"home-edit\",\n \"home-edit-outline\",\n \"home-export-outline\",\n \"home-flood\",\n \"home-floor-0\",\n \"home-floor-1\",\n \"home-floor-2\",\n \"home-floor-3\",\n \"home-floor-a\",\n \"home-floor-b\",\n \"home-floor-g\",\n \"home-floor-l\",\n \"home-floor-negative-1\",\n \"home-group\",\n \"home-group-minus\",\n \"home-group-plus\",\n \"home-group-remove\",\n \"home-heart\",\n \"home-import-outline\",\n \"home-lightbulb\",\n \"home-lightbulb-outline\",\n \"home-lightning-bolt\",\n \"home-lightning-bolt-outline\",\n \"home-lock\",\n \"home-lock-open\",\n \"home-map-marker\",\n \"home-minus\",\n \"home-minus-outline\",\n \"home-modern\",\n \"home-off\",\n \"home-off-outline\",\n \"home-outline\",\n \"home-percent\",\n \"home-percent-outline\",\n \"home-plus\",\n \"home-plus-outline\",\n \"home-remove\",\n \"home-remove-outline\",\n \"home-roof\",\n \"home-search\",\n \"home-search-outline\",\n \"home-silo\",\n \"home-silo-outline\",\n \"home-sound-in\",\n \"home-sound-in-outline\",\n \"home-sound-out\",\n \"home-sound-out-outline\",\n \"home-switch\",\n \"home-switch-outline\",\n \"home-thermometer\",\n \"home-thermometer-outline\",\n \"home-variant\",\n \"home-variant-outline\",\n \"hook\",\n \"hook-off\",\n \"hoop-house\",\n \"hops\",\n \"horizontal-rotate-clockwise\",\n \"horizontal-rotate-counterclockwise\",\n \"horse\",\n \"horse-human\",\n \"horse-variant\",\n \"horse-variant-fast\",\n \"horseshoe\",\n \"hospital\",\n \"hospital-box\",\n \"hospital-box-outline\",\n \"hospital-building\",\n \"hospital-marker\",\n \"hot-tub\",\n \"hours-12\",\n \"hours-24\",\n \"hub\",\n \"hub-outline\",\n \"hubspot\",\n \"hulu\",\n \"human\",\n \"human-baby-changing-table\",\n \"human-cane\",\n \"human-capacity-decrease\",\n \"human-capacity-increase\",\n \"human-child\",\n \"human-dolly\",\n \"human-edit\",\n \"human-female\",\n \"human-female-boy\",\n \"human-female-dance\",\n \"human-female-female\",\n \"human-female-female-child\",\n \"human-female-girl\",\n \"human-greeting\",\n \"human-greeting-proximity\",\n \"human-greeting-variant\",\n \"human-handsdown\",\n \"human-handsup\",\n \"human-male\",\n \"human-male-board\",\n \"human-male-board-poll\",\n \"human-male-boy\",\n \"human-male-child\",\n \"human-male-female\",\n \"human-male-female-child\",\n \"human-male-girl\",\n \"human-male-height\",\n \"human-male-height-variant\",\n \"human-male-male\",\n \"human-male-male-child\",\n \"human-non-binary\",\n \"human-pregnant\",\n \"human-queue\",\n \"human-scooter\",\n \"human-walker\",\n \"human-wheelchair\",\n \"human-white-cane\",\n \"humble-bundle\",\n \"hvac\",\n \"hvac-off\",\n \"hydraulic-oil-level\",\n \"hydraulic-oil-temperature\",\n \"hydro-power\",\n \"hydrogen-station\",\n \"ice-cream\",\n \"ice-cream-off\",\n \"ice-pop\",\n \"id-card\",\n \"identifier\",\n \"ideogram-cjk\",\n \"ideogram-cjk-variant\",\n \"image\",\n \"image-album\",\n \"image-area\",\n \"image-area-close\",\n \"image-auto-adjust\",\n \"image-broken\",\n \"image-broken-variant\",\n \"image-check\",\n \"image-check-outline\",\n \"image-edit\",\n \"image-edit-outline\",\n \"image-filter-black-white\",\n \"image-filter-center-focus\",\n \"image-filter-center-focus-strong\",\n \"image-filter-center-focus-strong-outline\",\n \"image-filter-center-focus-weak\",\n \"image-filter-drama\",\n \"image-filter-drama-outline\",\n \"image-filter-frames\",\n \"image-filter-hdr\",\n \"image-filter-hdr-outline\",\n \"image-filter-none\",\n \"image-filter-tilt-shift\",\n \"image-filter-vintage\",\n \"image-frame\",\n \"image-lock\",\n \"image-lock-outline\",\n \"image-marker\",\n \"image-marker-outline\",\n \"image-minus\",\n \"image-minus-outline\",\n \"image-move\",\n \"image-multiple\",\n \"image-multiple-outline\",\n \"image-off\",\n \"image-off-outline\",\n \"image-outline\",\n \"image-plus\",\n \"image-plus-outline\",\n \"image-refresh\",\n \"image-refresh-outline\",\n \"image-remove\",\n \"image-remove-outline\",\n \"image-search\",\n \"image-search-outline\",\n \"image-size-select-actual\",\n \"image-size-select-large\",\n \"image-size-select-small\",\n \"image-sync\",\n \"image-sync-outline\",\n \"image-text\",\n \"import\",\n \"inbox\",\n \"inbox-arrow-down\",\n \"inbox-arrow-down-outline\",\n \"inbox-arrow-up\",\n \"inbox-arrow-up-outline\",\n \"inbox-full\",\n \"inbox-full-outline\",\n \"inbox-multiple\",\n \"inbox-multiple-outline\",\n \"inbox-outline\",\n \"inbox-remove\",\n \"inbox-remove-outline\",\n \"incognito\",\n \"incognito-circle\",\n \"incognito-circle-off\",\n \"incognito-off\",\n \"induction\",\n \"infinity\",\n \"information\",\n \"information-box\",\n \"information-box-outline\",\n \"information-off\",\n \"information-off-outline\",\n \"information-outline\",\n \"information-slab-box\",\n \"information-slab-box-outline\",\n \"information-slab-circle\",\n \"information-slab-circle-outline\",\n \"information-slab-symbol\",\n \"information-symbol\",\n \"information-variant\",\n \"information-variant-box\",\n \"information-variant-box-outline\",\n \"information-variant-circle\",\n \"information-variant-circle-outline\",\n \"instagram\",\n \"instrument-triangle\",\n \"integrated-circuit-chip\",\n \"invert-colors\",\n \"invert-colors-off\",\n \"invoice\",\n \"invoice-arrow-left\",\n \"invoice-arrow-left-outline\",\n \"invoice-arrow-right\",\n \"invoice-arrow-right-outline\",\n \"invoice-check\",\n \"invoice-check-outline\",\n \"invoice-clock\",\n \"invoice-clock-outline\",\n \"invoice-edit\",\n \"invoice-edit-outline\",\n \"invoice-export-outline\",\n \"invoice-fast\",\n \"invoice-fast-outline\",\n \"invoice-import\",\n \"invoice-import-outline\",\n \"invoice-list\",\n \"invoice-list-outline\",\n \"invoice-minus\",\n \"invoice-minus-outline\",\n \"invoice-multiple\",\n \"invoice-multiple-outline\",\n \"invoice-outline\",\n \"invoice-plus\",\n \"invoice-plus-outline\",\n \"invoice-remove\",\n \"invoice-remove-outline\",\n \"invoice-send\",\n \"invoice-send-outline\",\n \"invoice-text\",\n \"invoice-text-arrow-left\",\n \"invoice-text-arrow-left-outline\",\n \"invoice-text-arrow-right\",\n \"invoice-text-arrow-right-outline\",\n \"invoice-text-check\",\n \"invoice-text-check-outline\",\n \"invoice-text-clock\",\n \"invoice-text-clock-outline\",\n \"invoice-text-edit\",\n \"invoice-text-edit-outline\",\n \"invoice-text-fast\",\n \"invoice-text-fast-outline\",\n \"invoice-text-minus\",\n \"invoice-text-minus-outline\",\n \"invoice-text-multiple\",\n \"invoice-text-multiple-outline\",\n \"invoice-text-outline\",\n \"invoice-text-plus\",\n \"invoice-text-plus-outline\",\n \"invoice-text-remove\",\n \"invoice-text-remove-outline\",\n \"invoice-text-send\",\n \"invoice-text-send-outline\",\n \"iobroker\",\n \"ip\",\n \"ip-network\",\n \"ip-network-outline\",\n \"ip-outline\",\n \"ipod\",\n \"iron\",\n \"iron-board\",\n \"iron-outline\",\n \"island\",\n \"island-variant\",\n \"iv-bag\",\n \"jabber\",\n \"jeepney\",\n \"jellyfish\",\n \"jellyfish-outline\",\n \"jira\",\n \"jquery\",\n \"jsfiddle\",\n \"jump-rope\",\n \"kabaddi\",\n \"kangaroo\",\n \"karate\",\n \"kayaking\",\n \"keg\",\n \"kettle\",\n \"kettle-alert\",\n \"kettle-alert-outline\",\n \"kettle-off\",\n \"kettle-off-outline\",\n \"kettle-outline\",\n \"kettle-pour-over\",\n \"kettle-steam\",\n \"kettle-steam-outline\",\n \"kettlebell\",\n \"key\",\n \"key-alert\",\n \"key-alert-outline\",\n \"key-arrow-right\",\n \"key-chain\",\n \"key-chain-variant\",\n \"key-change\",\n \"key-link\",\n \"key-minus\",\n \"key-outline\",\n \"key-plus\",\n \"key-remove\",\n \"key-star\",\n \"key-variant\",\n \"key-wireless\",\n \"keyboard\",\n \"keyboard-backspace\",\n \"keyboard-caps\",\n \"keyboard-close\",\n \"keyboard-close-outline\",\n \"keyboard-esc\",\n \"keyboard-f1\",\n \"keyboard-f10\",\n \"keyboard-f11\",\n \"keyboard-f12\",\n \"keyboard-f2\",\n \"keyboard-f3\",\n \"keyboard-f4\",\n \"keyboard-f5\",\n \"keyboard-f6\",\n \"keyboard-f7\",\n \"keyboard-f8\",\n \"keyboard-f9\",\n \"keyboard-off\",\n \"keyboard-off-outline\",\n \"keyboard-outline\",\n \"keyboard-return\",\n \"keyboard-settings\",\n \"keyboard-settings-outline\",\n \"keyboard-space\",\n \"keyboard-tab\",\n \"keyboard-tab-reverse\",\n \"keyboard-variant\",\n \"khanda\",\n \"kickstarter\",\n \"kite\",\n \"kite-outline\",\n \"kitesurfing\",\n \"klingon\",\n \"knife\",\n \"knife-military\",\n \"knob\",\n \"koala\",\n \"kodi\",\n \"kubernetes\",\n \"label\",\n \"label-multiple\",\n \"label-multiple-outline\",\n \"label-off\",\n \"label-off-outline\",\n \"label-outline\",\n \"label-percent\",\n \"label-percent-outline\",\n \"label-variant\",\n \"label-variant-outline\",\n \"ladder\",\n \"ladybug\",\n \"lambda\",\n \"lamp\",\n \"lamp-outline\",\n \"lamps\",\n \"lamps-outline\",\n \"lan\",\n \"lan-check\",\n \"lan-connect\",\n \"lan-disconnect\",\n \"lan-pending\",\n \"land-fields\",\n \"land-plots\",\n \"land-plots-circle\",\n \"land-plots-circle-variant\",\n \"land-plots-marker\",\n \"land-rows-horizontal\",\n \"land-rows-vertical\",\n \"landslide\",\n \"landslide-outline\",\n \"language-c\",\n \"language-cpp\",\n \"language-csharp\",\n \"language-css3\",\n \"language-fortran\",\n \"language-go\",\n \"language-haskell\",\n \"language-html5\",\n \"language-java\",\n \"language-javascript\",\n \"language-kotlin\",\n \"language-lua\",\n \"language-markdown\",\n \"language-markdown-outline\",\n \"language-php\",\n \"language-python\",\n \"language-r\",\n \"language-ruby\",\n \"language-ruby-on-rails\",\n \"language-rust\",\n \"language-swift\",\n \"language-typescript\",\n \"language-xaml\",\n \"laptop\",\n \"laptop-account\",\n \"laptop-off\",\n \"laravel\",\n \"laser-pointer\",\n \"lasso\",\n \"lastpass\",\n \"latitude\",\n \"launch\",\n \"lava-lamp\",\n \"layers\",\n \"layers-edit\",\n \"layers-minus\",\n \"layers-off\",\n \"layers-off-outline\",\n \"layers-outline\",\n \"layers-plus\",\n \"layers-remove\",\n \"layers-search\",\n \"layers-search-outline\",\n \"layers-triple\",\n \"layers-triple-outline\",\n \"lead-pencil\",\n \"leaf\",\n \"leaf-circle\",\n \"leaf-circle-outline\",\n \"leaf-maple\",\n \"leaf-maple-off\",\n \"leaf-off\",\n \"leak\",\n \"leak-off\",\n \"lectern\",\n \"led-off\",\n \"led-on\",\n \"led-outline\",\n \"led-strip\",\n \"led-strip-variant\",\n \"led-strip-variant-off\",\n \"led-variant-off\",\n \"led-variant-on\",\n \"led-variant-outline\",\n \"leek\",\n \"less-than\",\n \"less-than-or-equal\",\n \"library\",\n \"library-outline\",\n \"library-shelves\",\n \"license\",\n \"lifebuoy\",\n \"light-flood-down\",\n \"light-flood-up\",\n \"light-recessed\",\n \"light-switch\",\n \"light-switch-off\",\n \"lightbulb\",\n \"lightbulb-alert\",\n \"lightbulb-alert-outline\",\n \"lightbulb-auto\",\n \"lightbulb-auto-outline\",\n \"lightbulb-cfl\",\n \"lightbulb-cfl-off\",\n \"lightbulb-cfl-spiral\",\n \"lightbulb-cfl-spiral-off\",\n \"lightbulb-fluorescent-tube\",\n \"lightbulb-fluorescent-tube-outline\",\n \"lightbulb-group\",\n \"lightbulb-group-off\",\n \"lightbulb-group-off-outline\",\n \"lightbulb-group-outline\",\n \"lightbulb-multiple\",\n \"lightbulb-multiple-off\",\n \"lightbulb-multiple-off-outline\",\n \"lightbulb-multiple-outline\",\n \"lightbulb-night\",\n \"lightbulb-night-outline\",\n \"lightbulb-off\",\n \"lightbulb-off-outline\",\n \"lightbulb-on\",\n \"lightbulb-on-10\",\n \"lightbulb-on-20\",\n \"lightbulb-on-30\",\n \"lightbulb-on-40\",\n \"lightbulb-on-50\",\n \"lightbulb-on-60\",\n \"lightbulb-on-70\",\n \"lightbulb-on-80\",\n \"lightbulb-on-90\",\n \"lightbulb-on-outline\",\n \"lightbulb-outline\",\n \"lightbulb-question\",\n \"lightbulb-question-outline\",\n \"lightbulb-spot\",\n \"lightbulb-spot-off\",\n \"lightbulb-variant\",\n \"lightbulb-variant-outline\",\n \"lighthouse\",\n \"lighthouse-on\",\n \"lightning-bolt\",\n \"lightning-bolt-circle\",\n \"lightning-bolt-outline\",\n \"line-scan\",\n \"lingerie\",\n \"link\",\n \"link-box\",\n \"link-box-outline\",\n \"link-box-variant\",\n \"link-box-variant-outline\",\n \"link-circle\",\n \"link-circle-outline\",\n \"link-edit\",\n \"link-lock\",\n \"link-off\",\n \"link-plus\",\n \"link-variant\",\n \"link-variant-minus\",\n \"link-variant-off\",\n \"link-variant-plus\",\n \"link-variant-remove\",\n \"linkedin\",\n \"linux\",\n \"linux-mint\",\n \"lipstick\",\n \"liquid-spot\",\n \"liquor\",\n \"list-box\",\n \"list-box-outline\",\n \"list-status\",\n \"litecoin\",\n \"loading\",\n \"location-enter\",\n \"location-exit\",\n \"lock\",\n \"lock-alert\",\n \"lock-alert-outline\",\n \"lock-check\",\n \"lock-check-outline\",\n \"lock-clock\",\n \"lock-minus\",\n \"lock-minus-outline\",\n \"lock-off\",\n \"lock-off-outline\",\n \"lock-open\",\n \"lock-open-alert\",\n \"lock-open-alert-outline\",\n \"lock-open-check\",\n \"lock-open-check-outline\",\n \"lock-open-minus\",\n \"lock-open-minus-outline\",\n \"lock-open-outline\",\n \"lock-open-plus\",\n \"lock-open-plus-outline\",\n \"lock-open-remove\",\n \"lock-open-remove-outline\",\n \"lock-open-variant\",\n \"lock-open-variant-outline\",\n \"lock-outline\",\n \"lock-pattern\",\n \"lock-percent\",\n \"lock-percent-open\",\n \"lock-percent-open-outline\",\n \"lock-percent-open-variant\",\n \"lock-percent-open-variant-outline\",\n \"lock-percent-outline\",\n \"lock-plus\",\n \"lock-plus-outline\",\n \"lock-question\",\n \"lock-remove\",\n \"lock-remove-outline\",\n \"lock-reset\",\n \"lock-smart\",\n \"locker\",\n \"locker-multiple\",\n \"login\",\n \"login-variant\",\n \"logout\",\n \"logout-variant\",\n \"longitude\",\n \"looks\",\n \"lotion\",\n \"lotion-outline\",\n \"lotion-plus\",\n \"lotion-plus-outline\",\n \"loupe\",\n \"lumx\",\n \"lungs\",\n \"mace\",\n \"magazine-pistol\",\n \"magazine-rifle\",\n \"magic-staff\",\n \"magnet\",\n \"magnet-on\",\n \"magnify\",\n \"magnify-close\",\n \"magnify-expand\",\n \"magnify-minus\",\n \"magnify-minus-cursor\",\n \"magnify-minus-outline\",\n \"magnify-plus\",\n \"magnify-plus-cursor\",\n \"magnify-plus-outline\",\n \"magnify-remove-cursor\",\n \"magnify-remove-outline\",\n \"magnify-scan\",\n \"mail\",\n \"mailbox\",\n \"mailbox-open\",\n \"mailbox-open-outline\",\n \"mailbox-open-up\",\n \"mailbox-open-up-outline\",\n \"mailbox-outline\",\n \"mailbox-up\",\n \"mailbox-up-outline\",\n \"manjaro\",\n \"map\",\n \"map-check\",\n \"map-check-outline\",\n \"map-clock\",\n \"map-clock-outline\",\n \"map-legend\",\n \"map-marker\",\n \"map-marker-account\",\n \"map-marker-account-outline\",\n \"map-marker-alert\",\n \"map-marker-alert-outline\",\n \"map-marker-check\",\n \"map-marker-check-outline\",\n \"map-marker-circle\",\n \"map-marker-distance\",\n \"map-marker-down\",\n \"map-marker-left\",\n \"map-marker-left-outline\",\n \"map-marker-minus\",\n \"map-marker-minus-outline\",\n \"map-marker-multiple\",\n \"map-marker-multiple-outline\",\n \"map-marker-off\",\n \"map-marker-off-outline\",\n \"map-marker-outline\",\n \"map-marker-path\",\n \"map-marker-plus\",\n \"map-marker-plus-outline\",\n \"map-marker-question\",\n \"map-marker-question-outline\",\n \"map-marker-radius\",\n \"map-marker-radius-outline\",\n \"map-marker-remove\",\n \"map-marker-remove-outline\",\n \"map-marker-remove-variant\",\n \"map-marker-right\",\n \"map-marker-right-outline\",\n \"map-marker-star\",\n \"map-marker-star-outline\",\n \"map-marker-up\",\n \"map-minus\",\n \"map-outline\",\n \"map-plus\",\n \"map-search\",\n \"map-search-outline\",\n \"mapbox\",\n \"margin\",\n \"marker\",\n \"marker-cancel\",\n \"marker-check\",\n \"mastodon\",\n \"material-design\",\n \"material-ui\",\n \"math-compass\",\n \"math-cos\",\n \"math-integral\",\n \"math-integral-box\",\n \"math-log\",\n \"math-norm\",\n \"math-norm-box\",\n \"math-sin\",\n \"math-tan\",\n \"matrix\",\n \"medal\",\n \"medal-outline\",\n \"medical-bag\",\n \"medical-cotton-swab\",\n \"medication\",\n \"medication-outline\",\n \"meditation\",\n \"memory\",\n \"memory-arrow-down\",\n \"menorah\",\n \"menorah-fire\",\n \"menu\",\n \"menu-close\",\n \"menu-down\",\n \"menu-down-outline\",\n \"menu-left\",\n \"menu-left-outline\",\n \"menu-open\",\n \"menu-right\",\n \"menu-right-outline\",\n \"menu-swap\",\n \"menu-swap-outline\",\n \"menu-up\",\n \"menu-up-outline\",\n \"merge\",\n \"message\",\n \"message-alert\",\n \"message-alert-outline\",\n \"message-arrow-left\",\n \"message-arrow-left-outline\",\n \"message-arrow-right\",\n \"message-arrow-right-outline\",\n \"message-badge\",\n \"message-badge-outline\",\n \"message-bookmark\",\n \"message-bookmark-outline\",\n \"message-bulleted\",\n \"message-bulleted-off\",\n \"message-check\",\n \"message-check-outline\",\n \"message-cog\",\n \"message-cog-outline\",\n \"message-draw\",\n \"message-fast\",\n \"message-fast-outline\",\n \"message-flash\",\n \"message-flash-outline\",\n \"message-image\",\n \"message-image-outline\",\n \"message-lock\",\n \"message-lock-outline\",\n \"message-minus\",\n \"message-minus-outline\",\n \"message-off\",\n \"message-off-outline\",\n \"message-outline\",\n \"message-plus\",\n \"message-plus-outline\",\n \"message-processing\",\n \"message-processing-outline\",\n \"message-question\",\n \"message-question-outline\",\n \"message-reply\",\n \"message-reply-outline\",\n \"message-reply-text\",\n \"message-reply-text-outline\",\n \"message-settings\",\n \"message-settings-outline\",\n \"message-star\",\n \"message-star-outline\",\n \"message-text\",\n \"message-text-clock\",\n \"message-text-clock-outline\",\n \"message-text-fast\",\n \"message-text-fast-outline\",\n \"message-text-lock\",\n \"message-text-lock-outline\",\n \"message-text-outline\",\n \"message-video\",\n \"meteor\",\n \"meter-electric\",\n \"meter-electric-outline\",\n \"meter-gas\",\n \"meter-gas-outline\",\n \"metronome\",\n \"metronome-tick\",\n \"micro-sd\",\n \"microphone\",\n \"microphone-message\",\n \"microphone-message-off\",\n \"microphone-minus\",\n \"microphone-off\",\n \"microphone-outline\",\n \"microphone-plus\",\n \"microphone-question\",\n \"microphone-question-outline\",\n \"microphone-settings\",\n \"microphone-variant\",\n \"microphone-variant-off\",\n \"microscope\",\n \"microsoft\",\n \"microsoft-access\",\n \"microsoft-azure\",\n \"microsoft-azure-devops\",\n \"microsoft-bing\",\n \"microsoft-dynamics-365\",\n \"microsoft-edge\",\n \"microsoft-excel\",\n \"microsoft-internet-explorer\",\n \"microsoft-office\",\n \"microsoft-onedrive\",\n \"microsoft-onenote\",\n \"microsoft-outlook\",\n \"microsoft-powerpoint\",\n \"microsoft-sharepoint\",\n \"microsoft-teams\",\n \"microsoft-visual-studio\",\n \"microsoft-visual-studio-code\",\n \"microsoft-windows\",\n \"microsoft-windows-classic\",\n \"microsoft-word\",\n \"microsoft-xbox\",\n \"microsoft-xbox-controller\",\n \"microsoft-xbox-controller-battery-alert\",\n \"microsoft-xbox-controller-battery-charging\",\n \"microsoft-xbox-controller-battery-empty\",\n \"microsoft-xbox-controller-battery-full\",\n \"microsoft-xbox-controller-battery-low\",\n \"microsoft-xbox-controller-battery-medium\",\n \"microsoft-xbox-controller-battery-unknown\",\n \"microsoft-xbox-controller-menu\",\n \"microsoft-xbox-controller-off\",\n \"microsoft-xbox-controller-view\",\n \"microwave\",\n \"microwave-off\",\n \"middleware\",\n \"middleware-outline\",\n \"midi\",\n \"midi-port\",\n \"mine\",\n \"minecraft\",\n \"mini-sd\",\n \"minidisc\",\n \"minus\",\n \"minus-box\",\n \"minus-box-multiple\",\n \"minus-box-multiple-outline\",\n \"minus-box-outline\",\n \"minus-circle\",\n \"minus-circle-multiple\",\n \"minus-circle-multiple-outline\",\n \"minus-circle-off\",\n \"minus-circle-off-outline\",\n \"minus-circle-outline\",\n \"minus-network\",\n \"minus-network-outline\",\n \"minus-thick\",\n \"mirror\",\n \"mirror-rectangle\",\n \"mirror-variant\",\n \"mixed-martial-arts\",\n \"mixed-reality\",\n \"molecule\",\n \"molecule-co\",\n \"molecule-co2\",\n \"monitor\",\n \"monitor-account\",\n \"monitor-arrow-down\",\n \"monitor-arrow-down-variant\",\n \"monitor-cellphone\",\n \"monitor-cellphone-star\",\n \"monitor-dashboard\",\n \"monitor-edit\",\n \"monitor-eye\",\n \"monitor-lock\",\n \"monitor-multiple\",\n \"monitor-off\",\n \"monitor-screenshot\",\n \"monitor-share\",\n \"monitor-shimmer\",\n \"monitor-small\",\n \"monitor-speaker\",\n \"monitor-speaker-off\",\n \"monitor-star\",\n \"monitor-vertical\",\n \"moon-first-quarter\",\n \"moon-full\",\n \"moon-last-quarter\",\n \"moon-new\",\n \"moon-waning-crescent\",\n \"moon-waning-gibbous\",\n \"moon-waxing-crescent\",\n \"moon-waxing-gibbous\",\n \"moped\",\n \"moped-electric\",\n \"moped-electric-outline\",\n \"moped-outline\",\n \"more\",\n \"mortar-pestle\",\n \"mortar-pestle-plus\",\n \"mosque\",\n \"mosque-outline\",\n \"mother-heart\",\n \"mother-nurse\",\n \"motion\",\n \"motion-outline\",\n \"motion-pause\",\n \"motion-pause-outline\",\n \"motion-play\",\n \"motion-play-outline\",\n \"motion-sensor\",\n \"motion-sensor-off\",\n \"motorbike\",\n \"motorbike-electric\",\n \"motorbike-off\",\n \"mouse\",\n \"mouse-bluetooth\",\n \"mouse-left-click\",\n \"mouse-left-click-outline\",\n \"mouse-move-down\",\n \"mouse-move-up\",\n \"mouse-move-vertical\",\n \"mouse-off\",\n \"mouse-outline\",\n \"mouse-right-click\",\n \"mouse-right-click-outline\",\n \"mouse-scroll-wheel\",\n \"mouse-variant\",\n \"mouse-variant-off\",\n \"move-resize\",\n \"move-resize-variant\",\n \"movie\",\n \"movie-check\",\n \"movie-check-outline\",\n \"movie-cog\",\n \"movie-cog-outline\",\n \"movie-edit\",\n \"movie-edit-outline\",\n \"movie-filter\",\n \"movie-filter-outline\",\n \"movie-minus\",\n \"movie-minus-outline\",\n \"movie-off\",\n \"movie-off-outline\",\n \"movie-open\",\n \"movie-open-check\",\n \"movie-open-check-outline\",\n \"movie-open-cog\",\n \"movie-open-cog-outline\",\n \"movie-open-edit\",\n \"movie-open-edit-outline\",\n \"movie-open-minus\",\n \"movie-open-minus-outline\",\n \"movie-open-off\",\n \"movie-open-off-outline\",\n \"movie-open-outline\",\n \"movie-open-play\",\n \"movie-open-play-outline\",\n \"movie-open-plus\",\n \"movie-open-plus-outline\",\n \"movie-open-remove\",\n \"movie-open-remove-outline\",\n \"movie-open-settings\",\n \"movie-open-settings-outline\",\n \"movie-open-star\",\n \"movie-open-star-outline\",\n \"movie-outline\",\n \"movie-play\",\n \"movie-play-outline\",\n \"movie-plus\",\n \"movie-plus-outline\",\n \"movie-remove\",\n \"movie-remove-outline\",\n \"movie-roll\",\n \"movie-search\",\n \"movie-search-outline\",\n \"movie-settings\",\n \"movie-settings-outline\",\n \"movie-star\",\n \"movie-star-outline\",\n \"mower\",\n \"mower-bag\",\n \"mower-bag-on\",\n \"mower-on\",\n \"muffin\",\n \"multicast\",\n \"multimedia\",\n \"multiplication\",\n \"multiplication-box\",\n \"mushroom\",\n \"mushroom-off\",\n \"mushroom-off-outline\",\n \"mushroom-outline\",\n \"music\",\n \"music-accidental-double-flat\",\n \"music-accidental-double-sharp\",\n \"music-accidental-flat\",\n \"music-accidental-natural\",\n \"music-accidental-sharp\",\n \"music-box\",\n \"music-box-multiple\",\n \"music-box-multiple-outline\",\n \"music-box-outline\",\n \"music-circle\",\n \"music-circle-outline\",\n \"music-clef-alto\",\n \"music-clef-bass\",\n \"music-clef-treble\",\n \"music-note\",\n \"music-note-bluetooth\",\n \"music-note-bluetooth-off\",\n \"music-note-eighth\",\n \"music-note-eighth-dotted\",\n \"music-note-half\",\n \"music-note-half-dotted\",\n \"music-note-minus\",\n \"music-note-off\",\n \"music-note-off-outline\",\n \"music-note-outline\",\n \"music-note-plus\",\n \"music-note-quarter\",\n \"music-note-quarter-dotted\",\n \"music-note-sixteenth\",\n \"music-note-sixteenth-dotted\",\n \"music-note-whole\",\n \"music-note-whole-dotted\",\n \"music-off\",\n \"music-rest-eighth\",\n \"music-rest-half\",\n \"music-rest-quarter\",\n \"music-rest-sixteenth\",\n \"music-rest-whole\",\n \"mustache\",\n \"nail\",\n \"nas\",\n \"nativescript\",\n \"nature\",\n \"nature-outline\",\n \"nature-people\",\n \"nature-people-outline\",\n \"navigation\",\n \"navigation-outline\",\n \"navigation-variant\",\n \"navigation-variant-outline\",\n \"near-me\",\n \"necklace\",\n \"needle\",\n \"needle-off\",\n \"netflix\",\n \"network\",\n \"network-off\",\n \"network-off-outline\",\n \"network-outline\",\n \"network-pos\",\n \"network-strength-1\",\n \"network-strength-1-alert\",\n \"network-strength-2\",\n \"network-strength-2-alert\",\n \"network-strength-3\",\n \"network-strength-3-alert\",\n \"network-strength-4\",\n \"network-strength-4-alert\",\n \"network-strength-4-cog\",\n \"network-strength-off\",\n \"network-strength-off-outline\",\n \"network-strength-outline\",\n \"new-box\",\n \"newspaper\",\n \"newspaper-check\",\n \"newspaper-minus\",\n \"newspaper-plus\",\n \"newspaper-remove\",\n \"newspaper-variant\",\n \"newspaper-variant-multiple\",\n \"newspaper-variant-multiple-outline\",\n \"newspaper-variant-outline\",\n \"nfc\",\n \"nfc-search-variant\",\n \"nfc-tap\",\n \"nfc-variant\",\n \"nfc-variant-off\",\n \"ninja\",\n \"nintendo-game-boy\",\n \"nintendo-switch\",\n \"nintendo-wii\",\n \"nintendo-wiiu\",\n \"nix\",\n \"nodejs\",\n \"noodles\",\n \"not-equal\",\n \"not-equal-variant\",\n \"note\",\n \"note-alert\",\n \"note-alert-outline\",\n \"note-check\",\n \"note-check-outline\",\n \"note-edit\",\n \"note-edit-outline\",\n \"note-minus\",\n \"note-minus-outline\",\n \"note-multiple\",\n \"note-multiple-outline\",\n \"note-off\",\n \"note-off-outline\",\n \"note-outline\",\n \"note-plus\",\n \"note-plus-outline\",\n \"note-remove\",\n \"note-remove-outline\",\n \"note-search\",\n \"note-search-outline\",\n \"note-text\",\n \"note-text-outline\",\n \"notebook\",\n \"notebook-check\",\n \"notebook-check-outline\",\n \"notebook-edit\",\n \"notebook-edit-outline\",\n \"notebook-heart\",\n \"notebook-heart-outline\",\n \"notebook-minus\",\n \"notebook-minus-outline\",\n \"notebook-multiple\",\n \"notebook-outline\",\n \"notebook-plus\",\n \"notebook-plus-outline\",\n \"notebook-remove\",\n \"notebook-remove-outline\",\n \"notification-clear-all\",\n \"npm\",\n \"nuke\",\n \"null\",\n \"numeric\",\n \"numeric-0\",\n \"numeric-0-box\",\n \"numeric-0-box-multiple\",\n \"numeric-0-box-multiple-outline\",\n \"numeric-0-box-outline\",\n \"numeric-0-circle\",\n \"numeric-0-circle-outline\",\n \"numeric-1\",\n \"numeric-1-box\",\n \"numeric-1-box-multiple\",\n \"numeric-1-box-multiple-outline\",\n \"numeric-1-box-outline\",\n \"numeric-1-circle\",\n \"numeric-1-circle-outline\",\n \"numeric-10\",\n \"numeric-10-box\",\n \"numeric-10-box-multiple\",\n \"numeric-10-box-multiple-outline\",\n \"numeric-10-box-outline\",\n \"numeric-10-circle\",\n \"numeric-10-circle-outline\",\n \"numeric-2\",\n \"numeric-2-box\",\n \"numeric-2-box-multiple\",\n \"numeric-2-box-multiple-outline\",\n \"numeric-2-box-outline\",\n \"numeric-2-circle\",\n \"numeric-2-circle-outline\",\n \"numeric-3\",\n \"numeric-3-box\",\n \"numeric-3-box-multiple\",\n \"numeric-3-box-multiple-outline\",\n \"numeric-3-box-outline\",\n \"numeric-3-circle\",\n \"numeric-3-circle-outline\",\n \"numeric-4\",\n \"numeric-4-box\",\n \"numeric-4-box-multiple\",\n \"numeric-4-box-multiple-outline\",\n \"numeric-4-box-outline\",\n \"numeric-4-circle\",\n \"numeric-4-circle-outline\",\n \"numeric-5\",\n \"numeric-5-box\",\n \"numeric-5-box-multiple\",\n \"numeric-5-box-multiple-outline\",\n \"numeric-5-box-outline\",\n \"numeric-5-circle\",\n \"numeric-5-circle-outline\",\n \"numeric-6\",\n \"numeric-6-box\",\n \"numeric-6-box-multiple\",\n \"numeric-6-box-multiple-outline\",\n \"numeric-6-box-outline\",\n \"numeric-6-circle\",\n \"numeric-6-circle-outline\",\n \"numeric-7\",\n \"numeric-7-box\",\n \"numeric-7-box-multiple\",\n \"numeric-7-box-multiple-outline\",\n \"numeric-7-box-outline\",\n \"numeric-7-circle\",\n \"numeric-7-circle-outline\",\n \"numeric-8\",\n \"numeric-8-box\",\n \"numeric-8-box-multiple\",\n \"numeric-8-box-multiple-outline\",\n \"numeric-8-box-outline\",\n \"numeric-8-circle\",\n \"numeric-8-circle-outline\",\n \"numeric-9\",\n \"numeric-9-box\",\n \"numeric-9-box-multiple\",\n \"numeric-9-box-multiple-outline\",\n \"numeric-9-box-outline\",\n \"numeric-9-circle\",\n \"numeric-9-circle-outline\",\n \"numeric-9-plus\",\n \"numeric-9-plus-box\",\n \"numeric-9-plus-box-multiple\",\n \"numeric-9-plus-box-multiple-outline\",\n \"numeric-9-plus-box-outline\",\n \"numeric-9-plus-circle\",\n \"numeric-9-plus-circle-outline\",\n \"numeric-negative-1\",\n \"numeric-off\",\n \"numeric-positive-1\",\n \"nut\",\n \"nutrition\",\n \"nuxt\",\n \"oar\",\n \"ocarina\",\n \"oci\",\n \"ocr\",\n \"octagon\",\n \"octagon-outline\",\n \"octagram\",\n \"octagram-edit\",\n \"octagram-edit-outline\",\n \"octagram-minus\",\n \"octagram-minus-outline\",\n \"octagram-outline\",\n \"octagram-plus\",\n \"octagram-plus-outline\",\n \"octahedron\",\n \"octahedron-off\",\n \"odnoklassniki\",\n \"offer\",\n \"office-building\",\n \"office-building-cog\",\n \"office-building-cog-outline\",\n \"office-building-marker\",\n \"office-building-marker-outline\",\n \"office-building-minus\",\n \"office-building-minus-outline\",\n \"office-building-outline\",\n \"office-building-plus\",\n \"office-building-plus-outline\",\n \"office-building-remove\",\n \"office-building-remove-outline\",\n \"oil\",\n \"oil-lamp\",\n \"oil-level\",\n \"oil-temperature\",\n \"om\",\n \"omega\",\n \"one-up\",\n \"onepassword\",\n \"opacity\",\n \"open-in-app\",\n \"open-in-new\",\n \"open-source-initiative\",\n \"openid\",\n \"opera\",\n \"orbit\",\n \"orbit-variant\",\n \"order-alphabetical-ascending\",\n \"order-alphabetical-descending\",\n \"order-bool-ascending\",\n \"order-bool-ascending-variant\",\n \"order-bool-descending\",\n \"order-bool-descending-variant\",\n \"order-numeric-ascending\",\n \"order-numeric-descending\",\n \"origin\",\n \"ornament\",\n \"ornament-variant\",\n \"outdoor-lamp\",\n \"overscan\",\n \"owl\",\n \"pac-man\",\n \"package\",\n \"package-check\",\n \"package-down\",\n \"package-up\",\n \"package-variant\",\n \"package-variant-closed\",\n \"package-variant-closed-check\",\n \"package-variant-closed-minus\",\n \"package-variant-closed-plus\",\n \"package-variant-closed-remove\",\n \"package-variant-minus\",\n \"package-variant-plus\",\n \"package-variant-remove\",\n \"page-first\",\n \"page-last\",\n \"page-layout-body\",\n \"page-layout-footer\",\n \"page-layout-header\",\n \"page-layout-header-footer\",\n \"page-layout-sidebar-left\",\n \"page-layout-sidebar-right\",\n \"page-next\",\n \"page-next-outline\",\n \"page-previous\",\n \"page-previous-outline\",\n \"pail\",\n \"pail-minus\",\n \"pail-minus-outline\",\n \"pail-off\",\n \"pail-off-outline\",\n \"pail-outline\",\n \"pail-plus\",\n \"pail-plus-outline\",\n \"pail-remove\",\n \"pail-remove-outline\",\n \"palette\",\n \"palette-advanced\",\n \"palette-outline\",\n \"palette-swatch\",\n \"palette-swatch-outline\",\n \"palette-swatch-variant\",\n \"palm-tree\",\n \"pan\",\n \"pan-bottom-left\",\n \"pan-bottom-right\",\n \"pan-down\",\n \"pan-horizontal\",\n \"pan-left\",\n \"pan-right\",\n \"pan-top-left\",\n \"pan-top-right\",\n \"pan-up\",\n \"pan-vertical\",\n \"panda\",\n \"pandora\",\n \"panorama\",\n \"panorama-fisheye\",\n \"panorama-horizontal\",\n \"panorama-horizontal-outline\",\n \"panorama-outline\",\n \"panorama-sphere\",\n \"panorama-sphere-outline\",\n \"panorama-variant\",\n \"panorama-variant-outline\",\n \"panorama-vertical\",\n \"panorama-vertical-outline\",\n \"panorama-wide-angle\",\n \"panorama-wide-angle-outline\",\n \"paper-cut-vertical\",\n \"paper-roll\",\n \"paper-roll-outline\",\n \"paperclip\",\n \"paperclip-check\",\n \"paperclip-lock\",\n \"paperclip-minus\",\n \"paperclip-off\",\n \"paperclip-plus\",\n \"paperclip-remove\",\n \"parachute\",\n \"parachute-outline\",\n \"paragliding\",\n \"parking\",\n \"party-popper\",\n \"passport\",\n \"passport-alert\",\n \"passport-biometric\",\n \"passport-cancel\",\n \"passport-check\",\n \"passport-minus\",\n \"passport-plus\",\n \"passport-remove\",\n \"pasta\",\n \"patio-heater\",\n \"patreon\",\n \"pause\",\n \"pause-box\",\n \"pause-box-outline\",\n \"pause-circle\",\n \"pause-circle-outline\",\n \"pause-octagon\",\n \"pause-octagon-outline\",\n \"paw\",\n \"paw-off\",\n \"paw-off-outline\",\n \"paw-outline\",\n \"peace\",\n \"peanut\",\n \"peanut-off\",\n \"peanut-off-outline\",\n \"peanut-outline\",\n \"pen\",\n \"pen-lock\",\n \"pen-minus\",\n \"pen-off\",\n \"pen-plus\",\n \"pen-remove\",\n \"pencil\",\n \"pencil-box\",\n \"pencil-box-multiple\",\n \"pencil-box-multiple-outline\",\n \"pencil-box-outline\",\n \"pencil-circle\",\n \"pencil-circle-outline\",\n \"pencil-lock\",\n \"pencil-lock-outline\",\n \"pencil-minus\",\n \"pencil-minus-outline\",\n \"pencil-off\",\n \"pencil-off-outline\",\n \"pencil-outline\",\n \"pencil-plus\",\n \"pencil-plus-outline\",\n \"pencil-remove\",\n \"pencil-remove-outline\",\n \"pencil-ruler\",\n \"pencil-ruler-outline\",\n \"penguin\",\n \"pentagon\",\n \"pentagon-outline\",\n \"pentagram\",\n \"percent\",\n \"percent-box\",\n \"percent-box-outline\",\n \"percent-circle\",\n \"percent-circle-outline\",\n \"percent-outline\",\n \"periodic-table\",\n \"perspective-less\",\n \"perspective-more\",\n \"ph\",\n \"phone\",\n \"phone-alert\",\n \"phone-alert-outline\",\n \"phone-bluetooth\",\n \"phone-bluetooth-outline\",\n \"phone-cancel\",\n \"phone-cancel-outline\",\n \"phone-check\",\n \"phone-check-outline\",\n \"phone-classic\",\n \"phone-classic-off\",\n \"phone-clock\",\n \"phone-dial\",\n \"phone-dial-outline\",\n \"phone-forward\",\n \"phone-forward-outline\",\n \"phone-hangup\",\n \"phone-hangup-outline\",\n \"phone-in-talk\",\n \"phone-in-talk-outline\",\n \"phone-incoming\",\n \"phone-incoming-outgoing\",\n \"phone-incoming-outgoing-outline\",\n \"phone-incoming-outline\",\n \"phone-lock\",\n \"phone-lock-outline\",\n \"phone-log\",\n \"phone-log-outline\",\n \"phone-message\",\n \"phone-message-outline\",\n \"phone-minus\",\n \"phone-minus-outline\",\n \"phone-missed\",\n \"phone-missed-outline\",\n \"phone-off\",\n \"phone-off-outline\",\n \"phone-outgoing\",\n \"phone-outgoing-outline\",\n \"phone-outline\",\n \"phone-paused\",\n \"phone-paused-outline\",\n \"phone-plus\",\n \"phone-plus-outline\",\n \"phone-refresh\",\n \"phone-refresh-outline\",\n \"phone-remove\",\n \"phone-remove-outline\",\n \"phone-return\",\n \"phone-return-outline\",\n \"phone-ring\",\n \"phone-ring-outline\",\n \"phone-rotate-landscape\",\n \"phone-rotate-portrait\",\n \"phone-settings\",\n \"phone-settings-outline\",\n \"phone-sync\",\n \"phone-sync-outline\",\n \"phone-voip\",\n \"pi\",\n \"pi-box\",\n \"pi-hole\",\n \"piano\",\n \"piano-off\",\n \"pickaxe\",\n \"picture-in-picture-bottom-right\",\n \"picture-in-picture-bottom-right-outline\",\n \"picture-in-picture-top-right\",\n \"picture-in-picture-top-right-outline\",\n \"pier\",\n \"pier-crane\",\n \"pig\",\n \"pig-variant\",\n \"pig-variant-outline\",\n \"piggy-bank\",\n \"piggy-bank-outline\",\n \"pill\",\n \"pill-multiple\",\n \"pill-off\",\n \"pillar\",\n \"pin\",\n \"pin-off\",\n \"pin-off-outline\",\n \"pin-outline\",\n \"pine-tree\",\n \"pine-tree-box\",\n \"pine-tree-fire\",\n \"pine-tree-variant\",\n \"pine-tree-variant-outline\",\n \"pinterest\",\n \"pinwheel\",\n \"pinwheel-outline\",\n \"pipe\",\n \"pipe-disconnected\",\n \"pipe-leak\",\n \"pipe-valve\",\n \"pipe-wrench\",\n \"pirate\",\n \"pistol\",\n \"piston\",\n \"pitchfork\",\n \"pizza\",\n \"plane-car\",\n \"plane-train\",\n \"play\",\n \"play-box\",\n \"play-box-edit-outline\",\n \"play-box-lock\",\n \"play-box-lock-open\",\n \"play-box-lock-open-outline\",\n \"play-box-lock-outline\",\n \"play-box-multiple\",\n \"play-box-multiple-outline\",\n \"play-box-outline\",\n \"play-circle\",\n \"play-circle-outline\",\n \"play-network\",\n \"play-network-outline\",\n \"play-outline\",\n \"play-pause\",\n \"play-protected-content\",\n \"play-speed\",\n \"playlist-check\",\n \"playlist-edit\",\n \"playlist-minus\",\n \"playlist-music\",\n \"playlist-music-outline\",\n \"playlist-play\",\n \"playlist-plus\",\n \"playlist-remove\",\n \"playlist-star\",\n \"plex\",\n \"pliers\",\n \"plus\",\n \"plus-box\",\n \"plus-box-multiple\",\n \"plus-box-multiple-outline\",\n \"plus-box-outline\",\n \"plus-circle\",\n \"plus-circle-multiple\",\n \"plus-circle-multiple-outline\",\n \"plus-circle-outline\",\n \"plus-lock\",\n \"plus-lock-open\",\n \"plus-minus\",\n \"plus-minus-box\",\n \"plus-minus-variant\",\n \"plus-network\",\n \"plus-network-outline\",\n \"plus-outline\",\n \"plus-thick\",\n \"pocket\",\n \"podcast\",\n \"podium\",\n \"podium-bronze\",\n \"podium-gold\",\n \"podium-silver\",\n \"point-of-sale\",\n \"pokeball\",\n \"pokemon-go\",\n \"poker-chip\",\n \"polaroid\",\n \"police-badge\",\n \"police-badge-outline\",\n \"police-station\",\n \"poll\",\n \"polo\",\n \"polymer\",\n \"pool\",\n \"pool-thermometer\",\n \"popcorn\",\n \"post\",\n \"post-lamp\",\n \"post-outline\",\n \"postage-stamp\",\n \"pot\",\n \"pot-mix\",\n \"pot-mix-outline\",\n \"pot-outline\",\n \"pot-steam\",\n \"pot-steam-outline\",\n \"pound\",\n \"pound-box\",\n \"pound-box-outline\",\n \"power\",\n \"power-cycle\",\n \"power-off\",\n \"power-on\",\n \"power-plug\",\n \"power-plug-battery\",\n \"power-plug-battery-outline\",\n \"power-plug-off\",\n \"power-plug-off-outline\",\n \"power-plug-outline\",\n \"power-settings\",\n \"power-sleep\",\n \"power-socket\",\n \"power-socket-au\",\n \"power-socket-ch\",\n \"power-socket-de\",\n \"power-socket-eu\",\n \"power-socket-fr\",\n \"power-socket-it\",\n \"power-socket-jp\",\n \"power-socket-uk\",\n \"power-socket-us\",\n \"power-standby\",\n \"powershell\",\n \"prescription\",\n \"presentation\",\n \"presentation-play\",\n \"pretzel\",\n \"printer\",\n \"printer-3d\",\n \"printer-3d-nozzle\",\n \"printer-3d-nozzle-alert\",\n \"printer-3d-nozzle-alert-outline\",\n \"printer-3d-nozzle-heat\",\n \"printer-3d-nozzle-heat-outline\",\n \"printer-3d-nozzle-off\",\n \"printer-3d-nozzle-off-outline\",\n \"printer-3d-nozzle-outline\",\n \"printer-3d-off\",\n \"printer-alert\",\n \"printer-check\",\n \"printer-eye\",\n \"printer-off\",\n \"printer-off-outline\",\n \"printer-outline\",\n \"printer-pos\",\n \"printer-pos-alert\",\n \"printer-pos-alert-outline\",\n \"printer-pos-cancel\",\n \"printer-pos-cancel-outline\",\n \"printer-pos-check\",\n \"printer-pos-check-outline\",\n \"printer-pos-cog\",\n \"printer-pos-cog-outline\",\n \"printer-pos-edit\",\n \"printer-pos-edit-outline\",\n \"printer-pos-minus\",\n \"printer-pos-minus-outline\",\n \"printer-pos-network\",\n \"printer-pos-network-outline\",\n \"printer-pos-off\",\n \"printer-pos-off-outline\",\n \"printer-pos-outline\",\n \"printer-pos-pause\",\n \"printer-pos-pause-outline\",\n \"printer-pos-play\",\n \"printer-pos-play-outline\",\n \"printer-pos-plus\",\n \"printer-pos-plus-outline\",\n \"printer-pos-refresh\",\n \"printer-pos-refresh-outline\",\n \"printer-pos-remove\",\n \"printer-pos-remove-outline\",\n \"printer-pos-star\",\n \"printer-pos-star-outline\",\n \"printer-pos-stop\",\n \"printer-pos-stop-outline\",\n \"printer-pos-sync\",\n \"printer-pos-sync-outline\",\n \"printer-pos-wrench\",\n \"printer-pos-wrench-outline\",\n \"printer-search\",\n \"printer-settings\",\n \"printer-wireless\",\n \"priority-high\",\n \"priority-low\",\n \"professional-hexagon\",\n \"progress-alert\",\n \"progress-check\",\n \"progress-clock\",\n \"progress-close\",\n \"progress-download\",\n \"progress-helper\",\n \"progress-pencil\",\n \"progress-question\",\n \"progress-star\",\n \"progress-star-four-points\",\n \"progress-tag\",\n \"progress-upload\",\n \"progress-wrench\",\n \"projector\",\n \"projector-off\",\n \"projector-screen\",\n \"projector-screen-off\",\n \"projector-screen-off-outline\",\n \"projector-screen-outline\",\n \"projector-screen-variant\",\n \"projector-screen-variant-off\",\n \"projector-screen-variant-off-outline\",\n \"projector-screen-variant-outline\",\n \"propane-tank\",\n \"propane-tank-outline\",\n \"protocol\",\n \"publish\",\n \"publish-off\",\n \"pulse\",\n \"pump\",\n \"pump-off\",\n \"pumpkin\",\n \"purse\",\n \"purse-outline\",\n \"puzzle\",\n \"puzzle-check\",\n \"puzzle-check-outline\",\n \"puzzle-edit\",\n \"puzzle-edit-outline\",\n \"puzzle-heart\",\n \"puzzle-heart-outline\",\n \"puzzle-minus\",\n \"puzzle-minus-outline\",\n \"puzzle-outline\",\n \"puzzle-plus\",\n \"puzzle-plus-outline\",\n \"puzzle-remove\",\n \"puzzle-remove-outline\",\n \"puzzle-star\",\n \"puzzle-star-outline\",\n \"pyramid\",\n \"pyramid-off\",\n \"qi\",\n \"qqchat\",\n \"qrcode\",\n \"qrcode-edit\",\n \"qrcode-minus\",\n \"qrcode-plus\",\n \"qrcode-remove\",\n \"qrcode-scan\",\n \"quadcopter\",\n \"quality-high\",\n \"quality-low\",\n \"quality-medium\",\n \"queue-first-in-last-out\",\n \"quora\",\n \"rabbit\",\n \"rabbit-variant\",\n \"rabbit-variant-outline\",\n \"racing-helmet\",\n \"racquetball\",\n \"radar\",\n \"radiator\",\n \"radiator-disabled\",\n \"radiator-off\",\n \"radio\",\n \"radio-am\",\n \"radio-fm\",\n \"radio-handheld\",\n \"radio-off\",\n \"radio-tower\",\n \"radioactive\",\n \"radioactive-circle\",\n \"radioactive-circle-outline\",\n \"radioactive-off\",\n \"radiobox-blank\",\n \"radiobox-indeterminate-variant\",\n \"radiobox-marked\",\n \"radiology-box\",\n \"radiology-box-outline\",\n \"radius\",\n \"radius-outline\",\n \"railroad-light\",\n \"rake\",\n \"raspberry-pi\",\n \"raw\",\n \"raw-off\",\n \"ray-end\",\n \"ray-end-arrow\",\n \"ray-start\",\n \"ray-start-arrow\",\n \"ray-start-end\",\n \"ray-start-vertex-end\",\n \"ray-vertex\",\n \"razor-double-edge\",\n \"razor-single-edge\",\n \"react\",\n \"read\",\n \"receipt\",\n \"receipt-clock\",\n \"receipt-clock-outline\",\n \"receipt-outline\",\n \"receipt-send\",\n \"receipt-send-outline\",\n \"receipt-text\",\n \"receipt-text-arrow-left\",\n \"receipt-text-arrow-left-outline\",\n \"receipt-text-arrow-right\",\n \"receipt-text-arrow-right-outline\",\n \"receipt-text-check\",\n \"receipt-text-check-outline\",\n \"receipt-text-clock\",\n \"receipt-text-clock-outline\",\n \"receipt-text-edit\",\n \"receipt-text-edit-outline\",\n \"receipt-text-minus\",\n \"receipt-text-minus-outline\",\n \"receipt-text-outline\",\n \"receipt-text-plus\",\n \"receipt-text-plus-outline\",\n \"receipt-text-remove\",\n \"receipt-text-remove-outline\",\n \"receipt-text-send\",\n \"receipt-text-send-outline\",\n \"record\",\n \"record-circle\",\n \"record-circle-outline\",\n \"record-player\",\n \"record-rec\",\n \"rectangle\",\n \"rectangle-outline\",\n \"recycle\",\n \"recycle-variant\",\n \"reddit\",\n \"redhat\",\n \"redo\",\n \"redo-variant\",\n \"reflect-horizontal\",\n \"reflect-vertical\",\n \"refresh\",\n \"refresh-auto\",\n \"refresh-circle\",\n \"regex\",\n \"registered-trademark\",\n \"reiterate\",\n \"relation-many-to-many\",\n \"relation-many-to-one\",\n \"relation-many-to-one-or-many\",\n \"relation-many-to-only-one\",\n \"relation-many-to-zero-or-many\",\n \"relation-many-to-zero-or-one\",\n \"relation-one-or-many-to-many\",\n \"relation-one-or-many-to-one\",\n \"relation-one-or-many-to-one-or-many\",\n \"relation-one-or-many-to-only-one\",\n \"relation-one-or-many-to-zero-or-many\",\n \"relation-one-or-many-to-zero-or-one\",\n \"relation-one-to-many\",\n \"relation-one-to-one\",\n \"relation-one-to-one-or-many\",\n \"relation-one-to-only-one\",\n \"relation-one-to-zero-or-many\",\n \"relation-one-to-zero-or-one\",\n \"relation-only-one-to-many\",\n \"relation-only-one-to-one\",\n \"relation-only-one-to-one-or-many\",\n \"relation-only-one-to-only-one\",\n \"relation-only-one-to-zero-or-many\",\n \"relation-only-one-to-zero-or-one\",\n \"relation-zero-or-many-to-many\",\n \"relation-zero-or-many-to-one\",\n \"relation-zero-or-many-to-one-or-many\",\n \"relation-zero-or-many-to-only-one\",\n \"relation-zero-or-many-to-zero-or-many\",\n \"relation-zero-or-many-to-zero-or-one\",\n \"relation-zero-or-one-to-many\",\n \"relation-zero-or-one-to-one\",\n \"relation-zero-or-one-to-one-or-many\",\n \"relation-zero-or-one-to-only-one\",\n \"relation-zero-or-one-to-zero-or-many\",\n \"relation-zero-or-one-to-zero-or-one\",\n \"relative-scale\",\n \"reload\",\n \"reload-alert\",\n \"reminder\",\n \"remote\",\n \"remote-desktop\",\n \"remote-off\",\n \"remote-tv\",\n \"remote-tv-off\",\n \"rename\",\n \"rename-box\",\n \"rename-box-outline\",\n \"rename-outline\",\n \"reorder-horizontal\",\n \"reorder-vertical\",\n \"repeat\",\n \"repeat-off\",\n \"repeat-once\",\n \"repeat-variant\",\n \"replay\",\n \"reply\",\n \"reply-all\",\n \"reply-all-outline\",\n \"reply-circle\",\n \"reply-outline\",\n \"reproduction\",\n \"resistor\",\n \"resistor-nodes\",\n \"resize\",\n \"resize-bottom-right\",\n \"responsive\",\n \"restart\",\n \"restart-alert\",\n \"restart-off\",\n \"restore\",\n \"restore-alert\",\n \"rewind\",\n \"rewind-10\",\n \"rewind-15\",\n \"rewind-30\",\n \"rewind-45\",\n \"rewind-5\",\n \"rewind-60\",\n \"rewind-outline\",\n \"rhombus\",\n \"rhombus-medium\",\n \"rhombus-medium-outline\",\n \"rhombus-outline\",\n \"rhombus-split\",\n \"rhombus-split-outline\",\n \"ribbon\",\n \"rice\",\n \"rickshaw\",\n \"rickshaw-electric\",\n \"ring\",\n \"rivet\",\n \"road\",\n \"road-variant\",\n \"robber\",\n \"robot\",\n \"robot-angry\",\n \"robot-angry-outline\",\n \"robot-confused\",\n \"robot-confused-outline\",\n \"robot-dead\",\n \"robot-dead-outline\",\n \"robot-excited\",\n \"robot-excited-outline\",\n \"robot-happy\",\n \"robot-happy-outline\",\n \"robot-industrial\",\n \"robot-industrial-outline\",\n \"robot-love\",\n \"robot-love-outline\",\n \"robot-mower\",\n \"robot-mower-outline\",\n \"robot-off\",\n \"robot-off-outline\",\n \"robot-outline\",\n \"robot-vacuum\",\n \"robot-vacuum-alert\",\n \"robot-vacuum-off\",\n \"robot-vacuum-variant\",\n \"robot-vacuum-variant-alert\",\n \"robot-vacuum-variant-off\",\n \"rocket\",\n \"rocket-launch\",\n \"rocket-launch-outline\",\n \"rocket-outline\",\n \"rodent\",\n \"roller-shade\",\n \"roller-shade-closed\",\n \"roller-skate\",\n \"roller-skate-off\",\n \"rollerblade\",\n \"rollerblade-off\",\n \"rollupjs\",\n \"rolodex\",\n \"rolodex-outline\",\n \"roman-numeral-1\",\n \"roman-numeral-10\",\n \"roman-numeral-2\",\n \"roman-numeral-3\",\n \"roman-numeral-4\",\n \"roman-numeral-5\",\n \"roman-numeral-6\",\n \"roman-numeral-7\",\n \"roman-numeral-8\",\n \"roman-numeral-9\",\n \"room-service\",\n \"room-service-outline\",\n \"rotate-360\",\n \"rotate-3d\",\n \"rotate-3d-variant\",\n \"rotate-left\",\n \"rotate-left-variant\",\n \"rotate-orbit\",\n \"rotate-right\",\n \"rotate-right-variant\",\n \"rounded-corner\",\n \"router\",\n \"router-network\",\n \"router-network-wireless\",\n \"router-wireless\",\n \"router-wireless-off\",\n \"router-wireless-settings\",\n \"routes\",\n \"routes-clock\",\n \"rowing\",\n \"rss\",\n \"rss-box\",\n \"rss-off\",\n \"rug\",\n \"rugby\",\n \"ruler\",\n \"ruler-square\",\n \"ruler-square-compass\",\n \"run\",\n \"run-fast\",\n \"rv-truck\",\n \"sack\",\n \"sack-outline\",\n \"sack-percent\",\n \"safe\",\n \"safe-square\",\n \"safe-square-outline\",\n \"safety-goggles\",\n \"sail-boat\",\n \"sail-boat-sink\",\n \"sale\",\n \"sale-outline\",\n \"salesforce\",\n \"sass\",\n \"satellite\",\n \"satellite-uplink\",\n \"satellite-variant\",\n \"sausage\",\n \"sausage-off\",\n \"saw-blade\",\n \"sawtooth-wave\",\n \"saxophone\",\n \"scale\",\n \"scale-balance\",\n \"scale-bathroom\",\n \"scale-off\",\n \"scale-unbalanced\",\n \"scan-helper\",\n \"scanner\",\n \"scanner-off\",\n \"scatter-plot\",\n \"scatter-plot-outline\",\n \"scent\",\n \"scent-off\",\n \"school\",\n \"school-outline\",\n \"scissors-cutting\",\n \"scooter\",\n \"scooter-electric\",\n \"scoreboard\",\n \"scoreboard-outline\",\n \"screen-rotation\",\n \"screen-rotation-lock\",\n \"screw-flat-top\",\n \"screw-lag\",\n \"screw-machine-flat-top\",\n \"screw-machine-round-top\",\n \"screw-round-top\",\n \"screwdriver\",\n \"script\",\n \"script-outline\",\n \"script-text\",\n \"script-text-key\",\n \"script-text-key-outline\",\n \"script-text-outline\",\n \"script-text-play\",\n \"script-text-play-outline\",\n \"sd\",\n \"seal\",\n \"seal-variant\",\n \"search-web\",\n \"seat\",\n \"seat-flat\",\n \"seat-flat-angled\",\n \"seat-individual-suite\",\n \"seat-legroom-extra\",\n \"seat-legroom-normal\",\n \"seat-legroom-reduced\",\n \"seat-outline\",\n \"seat-passenger\",\n \"seat-recline-extra\",\n \"seat-recline-normal\",\n \"seatbelt\",\n \"security\",\n \"security-network\",\n \"seed\",\n \"seed-off\",\n \"seed-off-outline\",\n \"seed-outline\",\n \"seed-plus\",\n \"seed-plus-outline\",\n \"seesaw\",\n \"segment\",\n \"select\",\n \"select-all\",\n \"select-arrow-down\",\n \"select-arrow-up\",\n \"select-color\",\n \"select-compare\",\n \"select-drag\",\n \"select-group\",\n \"select-inverse\",\n \"select-marker\",\n \"select-multiple\",\n \"select-multiple-marker\",\n \"select-off\",\n \"select-place\",\n \"select-remove\",\n \"select-search\",\n \"selection\",\n \"selection-drag\",\n \"selection-ellipse\",\n \"selection-ellipse-arrow-inside\",\n \"selection-ellipse-remove\",\n \"selection-marker\",\n \"selection-multiple\",\n \"selection-multiple-marker\",\n \"selection-off\",\n \"selection-remove\",\n \"selection-search\",\n \"semantic-web\",\n \"send\",\n \"send-check\",\n \"send-check-outline\",\n \"send-circle\",\n \"send-circle-outline\",\n \"send-clock\",\n \"send-clock-outline\",\n \"send-lock\",\n \"send-lock-outline\",\n \"send-outline\",\n \"send-variant\",\n \"send-variant-clock\",\n \"send-variant-clock-outline\",\n \"send-variant-outline\",\n \"serial-port\",\n \"server\",\n \"server-minus\",\n \"server-minus-outline\",\n \"server-network\",\n \"server-network-off\",\n \"server-network-outline\",\n \"server-off\",\n \"server-outline\",\n \"server-plus\",\n \"server-plus-outline\",\n \"server-remove\",\n \"server-security\",\n \"set-all\",\n \"set-center\",\n \"set-center-right\",\n \"set-left\",\n \"set-left-center\",\n \"set-left-right\",\n \"set-merge\",\n \"set-none\",\n \"set-right\",\n \"set-split\",\n \"set-square\",\n \"set-top-box\",\n \"settings-helper\",\n \"shaker\",\n \"shaker-outline\",\n \"shape\",\n \"shape-circle-plus\",\n \"shape-outline\",\n \"shape-oval-plus\",\n \"shape-plus\",\n \"shape-plus-outline\",\n \"shape-polygon-plus\",\n \"shape-rectangle-plus\",\n \"shape-square-plus\",\n \"shape-square-rounded-plus\",\n \"share\",\n \"share-all\",\n \"share-all-outline\",\n \"share-circle\",\n \"share-off\",\n \"share-off-outline\",\n \"share-outline\",\n \"share-variant\",\n \"share-variant-outline\",\n \"shark\",\n \"shark-fin\",\n \"shark-fin-outline\",\n \"shark-off\",\n \"sheep\",\n \"shield\",\n \"shield-account\",\n \"shield-account-outline\",\n \"shield-account-variant\",\n \"shield-account-variant-outline\",\n \"shield-airplane\",\n \"shield-airplane-outline\",\n \"shield-alert\",\n \"shield-alert-outline\",\n \"shield-bug\",\n \"shield-bug-outline\",\n \"shield-car\",\n \"shield-check\",\n \"shield-check-outline\",\n \"shield-cross\",\n \"shield-cross-outline\",\n \"shield-crown\",\n \"shield-crown-outline\",\n \"shield-edit\",\n \"shield-edit-outline\",\n \"shield-half\",\n \"shield-half-full\",\n \"shield-home\",\n \"shield-home-outline\",\n \"shield-key\",\n \"shield-key-outline\",\n \"shield-link-variant\",\n \"shield-link-variant-outline\",\n \"shield-lock\",\n \"shield-lock-open\",\n \"shield-lock-open-outline\",\n \"shield-lock-outline\",\n \"shield-moon\",\n \"shield-moon-outline\",\n \"shield-off\",\n \"shield-off-outline\",\n \"shield-outline\",\n \"shield-plus\",\n \"shield-plus-outline\",\n \"shield-refresh\",\n \"shield-refresh-outline\",\n \"shield-remove\",\n \"shield-remove-outline\",\n \"shield-search\",\n \"shield-star\",\n \"shield-star-outline\",\n \"shield-sun\",\n \"shield-sun-outline\",\n \"shield-sword\",\n \"shield-sword-outline\",\n \"shield-sync\",\n \"shield-sync-outline\",\n \"shimmer\",\n \"ship-wheel\",\n \"shipping-pallet\",\n \"shoe-ballet\",\n \"shoe-cleat\",\n \"shoe-formal\",\n \"shoe-heel\",\n \"shoe-print\",\n \"shoe-sneaker\",\n \"shopping\",\n \"shopping-music\",\n \"shopping-outline\",\n \"shopping-search\",\n \"shopping-search-outline\",\n \"shore\",\n \"shovel\",\n \"shovel-off\",\n \"shower\",\n \"shower-head\",\n \"shredder\",\n \"shuffle\",\n \"shuffle-disabled\",\n \"shuffle-variant\",\n \"shuriken\",\n \"sickle\",\n \"sigma\",\n \"sigma-lower\",\n \"sign-caution\",\n \"sign-direction\",\n \"sign-direction-minus\",\n \"sign-direction-plus\",\n \"sign-direction-remove\",\n \"sign-language\",\n \"sign-language-outline\",\n \"sign-pole\",\n \"sign-real-estate\",\n \"sign-text\",\n \"sign-yield\",\n \"signal\",\n \"signal-2g\",\n \"signal-3g\",\n \"signal-4g\",\n \"signal-5g\",\n \"signal-cellular-1\",\n \"signal-cellular-2\",\n \"signal-cellular-3\",\n \"signal-cellular-outline\",\n \"signal-distance-variant\",\n \"signal-hspa\",\n \"signal-hspa-plus\",\n \"signal-off\",\n \"signal-variant\",\n \"signature\",\n \"signature-freehand\",\n \"signature-image\",\n \"signature-text\",\n \"silo\",\n \"silo-outline\",\n \"silverware\",\n \"silverware-clean\",\n \"silverware-fork\",\n \"silverware-fork-knife\",\n \"silverware-spoon\",\n \"silverware-variant\",\n \"sim\",\n \"sim-alert\",\n \"sim-alert-outline\",\n \"sim-off\",\n \"sim-off-outline\",\n \"sim-outline\",\n \"simple-icons\",\n \"sina-weibo\",\n \"sine-wave\",\n \"sitemap\",\n \"sitemap-outline\",\n \"size-l\",\n \"size-m\",\n \"size-s\",\n \"size-xl\",\n \"size-xs\",\n \"size-xxl\",\n \"size-xxs\",\n \"size-xxxl\",\n \"skate\",\n \"skate-off\",\n \"skateboard\",\n \"skateboarding\",\n \"skew-less\",\n \"skew-more\",\n \"ski\",\n \"ski-cross-country\",\n \"ski-water\",\n \"skip-backward\",\n \"skip-backward-outline\",\n \"skip-forward\",\n \"skip-forward-outline\",\n \"skip-next\",\n \"skip-next-circle\",\n \"skip-next-circle-outline\",\n \"skip-next-outline\",\n \"skip-previous\",\n \"skip-previous-circle\",\n \"skip-previous-circle-outline\",\n \"skip-previous-outline\",\n \"skull\",\n \"skull-crossbones\",\n \"skull-crossbones-outline\",\n \"skull-outline\",\n \"skull-scan\",\n \"skull-scan-outline\",\n \"skype\",\n \"skype-business\",\n \"slack\",\n \"slash-forward\",\n \"slash-forward-box\",\n \"sledding\",\n \"sleep\",\n \"sleep-off\",\n \"slide\",\n \"slope-downhill\",\n \"slope-uphill\",\n \"slot-machine\",\n \"slot-machine-outline\",\n \"smart-card\",\n \"smart-card-off\",\n \"smart-card-off-outline\",\n \"smart-card-outline\",\n \"smart-card-reader\",\n \"smart-card-reader-outline\",\n \"smog\",\n \"smoke\",\n \"smoke-detector\",\n \"smoke-detector-alert\",\n \"smoke-detector-alert-outline\",\n \"smoke-detector-off\",\n \"smoke-detector-off-outline\",\n \"smoke-detector-outline\",\n \"smoke-detector-variant\",\n \"smoke-detector-variant-alert\",\n \"smoke-detector-variant-off\",\n \"smoking\",\n \"smoking-off\",\n \"smoking-pipe\",\n \"smoking-pipe-off\",\n \"snail\",\n \"snake\",\n \"snapchat\",\n \"snowboard\",\n \"snowflake\",\n \"snowflake-alert\",\n \"snowflake-check\",\n \"snowflake-melt\",\n \"snowflake-off\",\n \"snowflake-thermometer\",\n \"snowflake-variant\",\n \"snowman\",\n \"snowmobile\",\n \"snowshoeing\",\n \"soccer\",\n \"soccer-field\",\n \"social-distance-2-meters\",\n \"social-distance-6-feet\",\n \"sofa\",\n \"sofa-outline\",\n \"sofa-single\",\n \"sofa-single-outline\",\n \"solar-panel\",\n \"solar-panel-large\",\n \"solar-power\",\n \"solar-power-variant\",\n \"solar-power-variant-outline\",\n \"soldering-iron\",\n \"solid\",\n \"sony-playstation\",\n \"sort\",\n \"sort-alphabetical-ascending\",\n \"sort-alphabetical-ascending-variant\",\n \"sort-alphabetical-descending\",\n \"sort-alphabetical-descending-variant\",\n \"sort-alphabetical-variant\",\n \"sort-ascending\",\n \"sort-bool-ascending\",\n \"sort-bool-ascending-variant\",\n \"sort-bool-descending\",\n \"sort-bool-descending-variant\",\n \"sort-calendar-ascending\",\n \"sort-calendar-descending\",\n \"sort-clock-ascending\",\n \"sort-clock-ascending-outline\",\n \"sort-clock-descending\",\n \"sort-clock-descending-outline\",\n \"sort-descending\",\n \"sort-numeric-ascending\",\n \"sort-numeric-ascending-variant\",\n \"sort-numeric-descending\",\n \"sort-numeric-descending-variant\",\n \"sort-numeric-variant\",\n \"sort-reverse-variant\",\n \"sort-variant\",\n \"sort-variant-lock\",\n \"sort-variant-lock-open\",\n \"sort-variant-off\",\n \"sort-variant-remove\",\n \"soundbar\",\n \"soundcloud\",\n \"source-branch\",\n \"source-branch-check\",\n \"source-branch-minus\",\n \"source-branch-plus\",\n \"source-branch-refresh\",\n \"source-branch-remove\",\n \"source-branch-sync\",\n \"source-commit\",\n \"source-commit-end\",\n \"source-commit-end-local\",\n \"source-commit-local\",\n \"source-commit-next-local\",\n \"source-commit-start\",\n \"source-commit-start-next-local\",\n \"source-fork\",\n \"source-merge\",\n \"source-pull\",\n \"source-repository\",\n \"source-repository-multiple\",\n \"soy-sauce\",\n \"soy-sauce-off\",\n \"spa\",\n \"spa-outline\",\n \"space-invaders\",\n \"space-station\",\n \"spade\",\n \"speaker\",\n \"speaker-bluetooth\",\n \"speaker-message\",\n \"speaker-multiple\",\n \"speaker-off\",\n \"speaker-pause\",\n \"speaker-play\",\n \"speaker-stop\",\n \"speaker-wireless\",\n \"spear\",\n \"speedometer\",\n \"speedometer-medium\",\n \"speedometer-slow\",\n \"spellcheck\",\n \"sphere\",\n \"sphere-off\",\n \"spider\",\n \"spider-outline\",\n \"spider-thread\",\n \"spider-web\",\n \"spirit-level\",\n \"spoon-sugar\",\n \"spotify\",\n \"spotlight\",\n \"spotlight-beam\",\n \"spray\",\n \"spray-bottle\",\n \"sprinkler\",\n \"sprinkler-fire\",\n \"sprinkler-variant\",\n \"sprout\",\n \"sprout-outline\",\n \"square\",\n \"square-circle\",\n \"square-circle-outline\",\n \"square-edit-outline\",\n \"square-medium\",\n \"square-medium-outline\",\n \"square-off\",\n \"square-off-outline\",\n \"square-opacity\",\n \"square-outline\",\n \"square-root\",\n \"square-root-box\",\n \"square-rounded\",\n \"square-rounded-badge\",\n \"square-rounded-badge-outline\",\n \"square-rounded-outline\",\n \"square-small\",\n \"square-wave\",\n \"squeegee\",\n \"ssh\",\n \"stack-exchange\",\n \"stack-overflow\",\n \"stackpath\",\n \"stadium\",\n \"stadium-outline\",\n \"stadium-variant\",\n \"stairs\",\n \"stairs-box\",\n \"stairs-down\",\n \"stairs-up\",\n \"stamper\",\n \"standard-definition\",\n \"star\",\n \"star-box\",\n \"star-box-multiple\",\n \"star-box-multiple-outline\",\n \"star-box-outline\",\n \"star-check\",\n \"star-check-outline\",\n \"star-circle\",\n \"star-circle-outline\",\n \"star-cog\",\n \"star-cog-outline\",\n \"star-crescent\",\n \"star-david\",\n \"star-face\",\n \"star-four-points\",\n \"star-four-points-box\",\n \"star-four-points-box-outline\",\n \"star-four-points-circle\",\n \"star-four-points-circle-outline\",\n \"star-four-points-outline\",\n \"star-four-points-small\",\n \"star-half\",\n \"star-half-full\",\n \"star-minus\",\n \"star-minus-outline\",\n \"star-off\",\n \"star-off-outline\",\n \"star-outline\",\n \"star-plus\",\n \"star-plus-outline\",\n \"star-remove\",\n \"star-remove-outline\",\n \"star-settings\",\n \"star-settings-outline\",\n \"star-shooting\",\n \"star-shooting-outline\",\n \"star-three-points\",\n \"star-three-points-outline\",\n \"state-machine\",\n \"steam\",\n \"steering\",\n \"steering-off\",\n \"step-backward\",\n \"step-backward-2\",\n \"step-forward\",\n \"step-forward-2\",\n \"stethoscope\",\n \"sticker\",\n \"sticker-alert\",\n \"sticker-alert-outline\",\n \"sticker-check\",\n \"sticker-check-outline\",\n \"sticker-circle-outline\",\n \"sticker-emoji\",\n \"sticker-minus\",\n \"sticker-minus-outline\",\n \"sticker-outline\",\n \"sticker-plus\",\n \"sticker-plus-outline\",\n \"sticker-remove\",\n \"sticker-remove-outline\",\n \"sticker-text\",\n \"sticker-text-outline\",\n \"stocking\",\n \"stomach\",\n \"stool\",\n \"stool-outline\",\n \"stop\",\n \"stop-circle\",\n \"stop-circle-outline\",\n \"storage-tank\",\n \"storage-tank-outline\",\n \"store\",\n \"store-24-hour\",\n \"store-alert\",\n \"store-alert-outline\",\n \"store-check\",\n \"store-check-outline\",\n \"store-clock\",\n \"store-clock-outline\",\n \"store-cog\",\n \"store-cog-outline\",\n \"store-edit\",\n \"store-edit-outline\",\n \"store-marker\",\n \"store-marker-outline\",\n \"store-minus\",\n \"store-minus-outline\",\n \"store-off\",\n \"store-off-outline\",\n \"store-outline\",\n \"store-plus\",\n \"store-plus-outline\",\n \"store-remove\",\n \"store-remove-outline\",\n \"store-search\",\n \"store-search-outline\",\n \"store-settings\",\n \"store-settings-outline\",\n \"storefront\",\n \"storefront-check\",\n \"storefront-check-outline\",\n \"storefront-edit\",\n \"storefront-edit-outline\",\n \"storefront-minus\",\n \"storefront-minus-outline\",\n \"storefront-outline\",\n \"storefront-plus\",\n \"storefront-plus-outline\",\n \"storefront-remove\",\n \"storefront-remove-outline\",\n \"stove\",\n \"strategy\",\n \"stretch-to-page\",\n \"stretch-to-page-outline\",\n \"string-lights\",\n \"string-lights-off\",\n \"subdirectory-arrow-left\",\n \"subdirectory-arrow-right\",\n \"submarine\",\n \"subtitles\",\n \"subtitles-outline\",\n \"subway\",\n \"subway-alert-variant\",\n \"subway-variant\",\n \"summit\",\n \"sun-angle\",\n \"sun-angle-outline\",\n \"sun-clock\",\n \"sun-clock-outline\",\n \"sun-compass\",\n \"sun-snowflake\",\n \"sun-snowflake-variant\",\n \"sun-thermometer\",\n \"sun-thermometer-outline\",\n \"sun-wireless\",\n \"sun-wireless-outline\",\n \"sunglasses\",\n \"surfing\",\n \"surround-sound\",\n \"surround-sound-2-0\",\n \"surround-sound-2-1\",\n \"surround-sound-3-1\",\n \"surround-sound-5-1\",\n \"surround-sound-5-1-2\",\n \"surround-sound-7-1\",\n \"svg\",\n \"swap-horizontal\",\n \"swap-horizontal-bold\",\n \"swap-horizontal-circle\",\n \"swap-horizontal-circle-outline\",\n \"swap-horizontal-hidden\",\n \"swap-horizontal-variant\",\n \"swap-vertical\",\n \"swap-vertical-bold\",\n \"swap-vertical-circle\",\n \"swap-vertical-circle-outline\",\n \"swap-vertical-variant\",\n \"swim\",\n \"switch\",\n \"sword\",\n \"sword-cross\",\n \"syllabary-hangul\",\n \"syllabary-hiragana\",\n \"syllabary-katakana\",\n \"syllabary-katakana-halfwidth\",\n \"symbol\",\n \"symfony\",\n \"synagogue\",\n \"synagogue-outline\",\n \"sync\",\n \"sync-alert\",\n \"sync-circle\",\n \"sync-off\",\n \"tab\",\n \"tab-minus\",\n \"tab-plus\",\n \"tab-remove\",\n \"tab-search\",\n \"tab-unselected\",\n \"table\",\n \"table-account\",\n \"table-alert\",\n \"table-arrow-down\",\n \"table-arrow-left\",\n \"table-arrow-right\",\n \"table-arrow-up\",\n \"table-border\",\n \"table-cancel\",\n \"table-chair\",\n \"table-check\",\n \"table-clock\",\n \"table-cog\",\n \"table-column\",\n \"table-column-plus-after\",\n \"table-column-plus-before\",\n \"table-column-remove\",\n \"table-column-width\",\n \"table-edit\",\n \"table-eye\",\n \"table-eye-off\",\n \"table-filter\",\n \"table-furniture\",\n \"table-headers-eye\",\n \"table-headers-eye-off\",\n \"table-heart\",\n \"table-key\",\n \"table-large\",\n \"table-large-plus\",\n \"table-large-remove\",\n \"table-lock\",\n \"table-merge-cells\",\n \"table-minus\",\n \"table-multiple\",\n \"table-network\",\n \"table-of-contents\",\n \"table-off\",\n \"table-picnic\",\n \"table-pivot\",\n \"table-plus\",\n \"table-question\",\n \"table-refresh\",\n \"table-remove\",\n \"table-row\",\n \"table-row-height\",\n \"table-row-plus-after\",\n \"table-row-plus-before\",\n \"table-row-remove\",\n \"table-search\",\n \"table-settings\",\n \"table-split-cell\",\n \"table-star\",\n \"table-sync\",\n \"table-tennis\",\n \"tablet\",\n \"tablet-cellphone\",\n \"tablet-dashboard\",\n \"taco\",\n \"tag\",\n \"tag-arrow-down\",\n \"tag-arrow-down-outline\",\n \"tag-arrow-left\",\n \"tag-arrow-left-outline\",\n \"tag-arrow-right\",\n \"tag-arrow-right-outline\",\n \"tag-arrow-up\",\n \"tag-arrow-up-outline\",\n \"tag-check\",\n \"tag-check-outline\",\n \"tag-edit\",\n \"tag-edit-outline\",\n \"tag-faces\",\n \"tag-heart\",\n \"tag-heart-outline\",\n \"tag-hidden\",\n \"tag-minus\",\n \"tag-minus-outline\",\n \"tag-multiple\",\n \"tag-multiple-outline\",\n \"tag-off\",\n \"tag-off-outline\",\n \"tag-outline\",\n \"tag-plus\",\n \"tag-plus-outline\",\n \"tag-remove\",\n \"tag-remove-outline\",\n \"tag-search\",\n \"tag-search-outline\",\n \"tag-text\",\n \"tag-text-outline\",\n \"tailwind\",\n \"tally-mark-1\",\n \"tally-mark-2\",\n \"tally-mark-3\",\n \"tally-mark-4\",\n \"tally-mark-5\",\n \"tangram\",\n \"tank\",\n \"tanker-truck\",\n \"tape-drive\",\n \"tape-measure\",\n \"target\",\n \"target-account\",\n \"target-variant\",\n \"taxi\",\n \"tea\",\n \"tea-outline\",\n \"teamviewer\",\n \"teddy-bear\",\n \"telescope\",\n \"television\",\n \"television-ambient-light\",\n \"television-box\",\n \"television-classic\",\n \"television-classic-off\",\n \"television-guide\",\n \"television-off\",\n \"television-pause\",\n \"television-play\",\n \"television-shimmer\",\n \"television-speaker\",\n \"television-speaker-off\",\n \"television-stop\",\n \"temperature-celsius\",\n \"temperature-fahrenheit\",\n \"temperature-kelvin\",\n \"temple-buddhist\",\n \"temple-buddhist-outline\",\n \"temple-hindu\",\n \"temple-hindu-outline\",\n \"tennis\",\n \"tennis-ball\",\n \"tennis-ball-outline\",\n \"tent\",\n \"terraform\",\n \"terrain\",\n \"test-tube\",\n \"test-tube-empty\",\n \"test-tube-off\",\n \"text\",\n \"text-account\",\n \"text-box\",\n \"text-box-check\",\n \"text-box-check-outline\",\n \"text-box-edit\",\n \"text-box-edit-outline\",\n \"text-box-minus\",\n \"text-box-minus-outline\",\n \"text-box-multiple\",\n \"text-box-multiple-outline\",\n \"text-box-outline\",\n \"text-box-plus\",\n \"text-box-plus-outline\",\n \"text-box-remove\",\n \"text-box-remove-outline\",\n \"text-box-search\",\n \"text-box-search-outline\",\n \"text-long\",\n \"text-recognition\",\n \"text-search\",\n \"text-search-variant\",\n \"text-shadow\",\n \"text-short\",\n \"texture\",\n \"texture-box\",\n \"theater\",\n \"theme-light-dark\",\n \"thermometer\",\n \"thermometer-alert\",\n \"thermometer-auto\",\n \"thermometer-bluetooth\",\n \"thermometer-check\",\n \"thermometer-chevron-down\",\n \"thermometer-chevron-up\",\n \"thermometer-high\",\n \"thermometer-lines\",\n \"thermometer-low\",\n \"thermometer-minus\",\n \"thermometer-off\",\n \"thermometer-plus\",\n \"thermometer-probe\",\n \"thermometer-probe-off\",\n \"thermometer-water\",\n \"thermostat\",\n \"thermostat-auto\",\n \"thermostat-box\",\n \"thermostat-box-auto\",\n \"thermostat-cog\",\n \"thought-bubble\",\n \"thought-bubble-outline\",\n \"thumb-down\",\n \"thumb-down-outline\",\n \"thumb-up\",\n \"thumb-up-outline\",\n \"thumbs-up-down\",\n \"thumbs-up-down-outline\",\n \"ticket\",\n \"ticket-account\",\n \"ticket-confirmation\",\n \"ticket-confirmation-outline\",\n \"ticket-outline\",\n \"ticket-percent\",\n \"ticket-percent-outline\",\n \"tie\",\n \"tilde\",\n \"tilde-off\",\n \"timelapse\",\n \"timeline\",\n \"timeline-alert\",\n \"timeline-alert-outline\",\n \"timeline-check\",\n \"timeline-check-outline\",\n \"timeline-clock\",\n \"timeline-clock-outline\",\n \"timeline-minus\",\n \"timeline-minus-outline\",\n \"timeline-outline\",\n \"timeline-plus\",\n \"timeline-plus-outline\",\n \"timeline-question\",\n \"timeline-question-outline\",\n \"timeline-remove\",\n \"timeline-remove-outline\",\n \"timeline-text\",\n \"timeline-text-outline\",\n \"timer\",\n \"timer-10\",\n \"timer-3\",\n \"timer-alert\",\n \"timer-alert-outline\",\n \"timer-cancel\",\n \"timer-cancel-outline\",\n \"timer-check\",\n \"timer-check-outline\",\n \"timer-cog\",\n \"timer-cog-outline\",\n \"timer-edit\",\n \"timer-edit-outline\",\n \"timer-lock\",\n \"timer-lock-open\",\n \"timer-lock-open-outline\",\n \"timer-lock-outline\",\n \"timer-marker\",\n \"timer-marker-outline\",\n \"timer-minus\",\n \"timer-minus-outline\",\n \"timer-music\",\n \"timer-music-outline\",\n \"timer-off\",\n \"timer-off-outline\",\n \"timer-outline\",\n \"timer-pause\",\n \"timer-pause-outline\",\n \"timer-play\",\n \"timer-play-outline\",\n \"timer-plus\",\n \"timer-plus-outline\",\n \"timer-refresh\",\n \"timer-refresh-outline\",\n \"timer-remove\",\n \"timer-remove-outline\",\n \"timer-sand\",\n \"timer-sand-complete\",\n \"timer-sand-empty\",\n \"timer-sand-full\",\n \"timer-sand-paused\",\n \"timer-settings\",\n \"timer-settings-outline\",\n \"timer-star\",\n \"timer-star-outline\",\n \"timer-stop\",\n \"timer-stop-outline\",\n \"timer-sync\",\n \"timer-sync-outline\",\n \"timetable\",\n \"tire\",\n \"toaster\",\n \"toaster-off\",\n \"toaster-oven\",\n \"toggle-switch\",\n \"toggle-switch-off\",\n \"toggle-switch-off-outline\",\n \"toggle-switch-outline\",\n \"toggle-switch-variant\",\n \"toggle-switch-variant-off\",\n \"toilet\",\n \"toolbox\",\n \"toolbox-outline\",\n \"tools\",\n \"tooltip\",\n \"tooltip-account\",\n \"tooltip-cellphone\",\n \"tooltip-check\",\n \"tooltip-check-outline\",\n \"tooltip-edit\",\n \"tooltip-edit-outline\",\n \"tooltip-image\",\n \"tooltip-image-outline\",\n \"tooltip-minus\",\n \"tooltip-minus-outline\",\n \"tooltip-outline\",\n \"tooltip-plus\",\n \"tooltip-plus-outline\",\n \"tooltip-question\",\n \"tooltip-question-outline\",\n \"tooltip-remove\",\n \"tooltip-remove-outline\",\n \"tooltip-text\",\n \"tooltip-text-outline\",\n \"tooth\",\n \"tooth-outline\",\n \"toothbrush\",\n \"toothbrush-electric\",\n \"toothbrush-paste\",\n \"torch\",\n \"tortoise\",\n \"toslink\",\n \"touch-text-outline\",\n \"tournament\",\n \"tow-truck\",\n \"tower-beach\",\n \"tower-fire\",\n \"town-hall\",\n \"toy-brick\",\n \"toy-brick-marker\",\n \"toy-brick-marker-outline\",\n \"toy-brick-minus\",\n \"toy-brick-minus-outline\",\n \"toy-brick-outline\",\n \"toy-brick-plus\",\n \"toy-brick-plus-outline\",\n \"toy-brick-remove\",\n \"toy-brick-remove-outline\",\n \"toy-brick-search\",\n \"toy-brick-search-outline\",\n \"track-light\",\n \"track-light-off\",\n \"trackpad\",\n \"trackpad-lock\",\n \"tractor\",\n \"tractor-variant\",\n \"trademark\",\n \"traffic-cone\",\n \"traffic-light\",\n \"traffic-light-outline\",\n \"train\",\n \"train-bus\",\n \"train-car\",\n \"train-car-autorack\",\n \"train-car-box\",\n \"train-car-box-full\",\n \"train-car-box-open\",\n \"train-car-caboose\",\n \"train-car-centerbeam\",\n \"train-car-centerbeam-full\",\n \"train-car-container\",\n \"train-car-flatbed\",\n \"train-car-flatbed-car\",\n \"train-car-flatbed-tank\",\n \"train-car-gondola\",\n \"train-car-gondola-full\",\n \"train-car-hopper\",\n \"train-car-hopper-covered\",\n \"train-car-hopper-full\",\n \"train-car-intermodal\",\n \"train-car-passenger\",\n \"train-car-passenger-door\",\n \"train-car-passenger-door-open\",\n \"train-car-passenger-variant\",\n \"train-car-tank\",\n \"train-variant\",\n \"tram\",\n \"tram-side\",\n \"transcribe\",\n \"transcribe-close\",\n \"transfer\",\n \"transfer-down\",\n \"transfer-left\",\n \"transfer-right\",\n \"transfer-up\",\n \"transit-connection\",\n \"transit-connection-horizontal\",\n \"transit-connection-variant\",\n \"transit-detour\",\n \"transit-skip\",\n \"transit-transfer\",\n \"transition\",\n \"transition-masked\",\n \"translate\",\n \"translate-off\",\n \"translate-variant\",\n \"transmission-tower\",\n \"transmission-tower-export\",\n \"transmission-tower-import\",\n \"transmission-tower-off\",\n \"trash-can\",\n \"trash-can-outline\",\n \"tray\",\n \"tray-alert\",\n \"tray-arrow-down\",\n \"tray-arrow-up\",\n \"tray-full\",\n \"tray-minus\",\n \"tray-plus\",\n \"tray-remove\",\n \"treasure-chest\",\n \"treasure-chest-outline\",\n \"tree\",\n \"tree-outline\",\n \"trello\",\n \"trending-down\",\n \"trending-neutral\",\n \"trending-up\",\n \"triangle\",\n \"triangle-down\",\n \"triangle-down-outline\",\n \"triangle-outline\",\n \"triangle-small-down\",\n \"triangle-small-up\",\n \"triangle-wave\",\n \"triforce\",\n \"trophy\",\n \"trophy-award\",\n \"trophy-broken\",\n \"trophy-outline\",\n \"trophy-variant\",\n \"trophy-variant-outline\",\n \"truck\",\n \"truck-alert\",\n \"truck-alert-outline\",\n \"truck-cargo-container\",\n \"truck-check\",\n \"truck-check-outline\",\n \"truck-delivery\",\n \"truck-delivery-outline\",\n \"truck-fast\",\n \"truck-fast-outline\",\n \"truck-flatbed\",\n \"truck-minus\",\n \"truck-minus-outline\",\n \"truck-off-road\",\n \"truck-off-road-off\",\n \"truck-outline\",\n \"truck-plus\",\n \"truck-plus-outline\",\n \"truck-remove\",\n \"truck-remove-outline\",\n \"truck-snowflake\",\n \"truck-trailer\",\n \"trumpet\",\n \"tshirt-crew\",\n \"tshirt-crew-outline\",\n \"tshirt-v\",\n \"tshirt-v-outline\",\n \"tsunami\",\n \"tumble-dryer\",\n \"tumble-dryer-alert\",\n \"tumble-dryer-off\",\n \"tune\",\n \"tune-variant\",\n \"tune-vertical\",\n \"tune-vertical-variant\",\n \"tunnel\",\n \"tunnel-outline\",\n \"turbine\",\n \"turkey\",\n \"turnstile\",\n \"turnstile-outline\",\n \"turtle\",\n \"twitch\",\n \"twitter\",\n \"two-factor-authentication\",\n \"typewriter\",\n \"ubisoft\",\n \"ubuntu\",\n \"ufo\",\n \"ufo-outline\",\n \"ultra-high-definition\",\n \"umbraco\",\n \"umbrella\",\n \"umbrella-beach\",\n \"umbrella-beach-outline\",\n \"umbrella-closed\",\n \"umbrella-closed-outline\",\n \"umbrella-closed-variant\",\n \"umbrella-outline\",\n \"underwear-outline\",\n \"undo\",\n \"undo-variant\",\n \"unfold-less-horizontal\",\n \"unfold-less-vertical\",\n \"unfold-more-horizontal\",\n \"unfold-more-vertical\",\n \"ungroup\",\n \"unicode\",\n \"unicorn\",\n \"unicorn-variant\",\n \"unicycle\",\n \"unity\",\n \"unreal\",\n \"update\",\n \"upload\",\n \"upload-box\",\n \"upload-box-outline\",\n \"upload-circle\",\n \"upload-circle-outline\",\n \"upload-lock\",\n \"upload-lock-outline\",\n \"upload-multiple\",\n \"upload-multiple-outline\",\n \"upload-network\",\n \"upload-network-outline\",\n \"upload-off\",\n \"upload-off-outline\",\n \"upload-outline\",\n \"usb\",\n \"usb-c-port\",\n \"usb-flash-drive\",\n \"usb-flash-drive-outline\",\n \"usb-port\",\n \"vacuum\",\n \"vacuum-outline\",\n \"valve\",\n \"valve-closed\",\n \"valve-open\",\n \"van-passenger\",\n \"van-utility\",\n \"vanish\",\n \"vanish-quarter\",\n \"vanity-light\",\n \"variable\",\n \"variable-box\",\n \"vector-arrange-above\",\n \"vector-arrange-below\",\n \"vector-bezier\",\n \"vector-circle\",\n \"vector-circle-variant\",\n \"vector-combine\",\n \"vector-curve\",\n \"vector-difference\",\n \"vector-difference-ab\",\n \"vector-difference-ba\",\n \"vector-ellipse\",\n \"vector-intersection\",\n \"vector-line\",\n \"vector-link\",\n \"vector-point\",\n \"vector-point-edit\",\n \"vector-point-minus\",\n \"vector-point-plus\",\n \"vector-point-select\",\n \"vector-polygon\",\n \"vector-polygon-variant\",\n \"vector-polyline\",\n \"vector-polyline-edit\",\n \"vector-polyline-minus\",\n \"vector-polyline-plus\",\n \"vector-polyline-remove\",\n \"vector-radius\",\n \"vector-rectangle\",\n \"vector-selection\",\n \"vector-square\",\n \"vector-square-close\",\n \"vector-square-edit\",\n \"vector-square-minus\",\n \"vector-square-open\",\n \"vector-square-plus\",\n \"vector-square-remove\",\n \"vector-triangle\",\n \"vector-union\",\n \"vhs\",\n \"vibrate\",\n \"vibrate-off\",\n \"video\",\n \"video-2d\",\n \"video-3d\",\n \"video-3d-off\",\n \"video-3d-variant\",\n \"video-4k-box\",\n \"video-account\",\n \"video-box\",\n \"video-box-off\",\n \"video-check\",\n \"video-check-outline\",\n \"video-high-definition\",\n \"video-image\",\n \"video-input-antenna\",\n \"video-input-component\",\n \"video-input-hdmi\",\n \"video-input-scart\",\n \"video-input-svideo\",\n \"video-marker\",\n \"video-marker-outline\",\n \"video-minus\",\n \"video-minus-outline\",\n \"video-off\",\n \"video-off-outline\",\n \"video-outline\",\n \"video-plus\",\n \"video-plus-outline\",\n \"video-stabilization\",\n \"video-standard-definition\",\n \"video-switch\",\n \"video-switch-outline\",\n \"video-vintage\",\n \"video-wireless\",\n \"video-wireless-outline\",\n \"view-agenda\",\n \"view-agenda-outline\",\n \"view-array\",\n \"view-array-outline\",\n \"view-carousel\",\n \"view-carousel-outline\",\n \"view-column\",\n \"view-column-outline\",\n \"view-comfy\",\n \"view-comfy-outline\",\n \"view-compact\",\n \"view-compact-outline\",\n \"view-dashboard\",\n \"view-dashboard-edit\",\n \"view-dashboard-edit-outline\",\n \"view-dashboard-outline\",\n \"view-dashboard-variant\",\n \"view-dashboard-variant-outline\",\n \"view-day\",\n \"view-day-outline\",\n \"view-gallery\",\n \"view-gallery-outline\",\n \"view-grid\",\n \"view-grid-compact\",\n \"view-grid-outline\",\n \"view-grid-plus\",\n \"view-grid-plus-outline\",\n \"view-headline\",\n \"view-list\",\n \"view-list-outline\",\n \"view-module\",\n \"view-module-outline\",\n \"view-parallel\",\n \"view-parallel-outline\",\n \"view-quilt\",\n \"view-quilt-outline\",\n \"view-sequential\",\n \"view-sequential-outline\",\n \"view-split-horizontal\",\n \"view-split-vertical\",\n \"view-stream\",\n \"view-stream-outline\",\n \"view-week\",\n \"view-week-outline\",\n \"vimeo\",\n \"violin\",\n \"virtual-reality\",\n \"virus\",\n \"virus-off\",\n \"virus-off-outline\",\n \"virus-outline\",\n \"vlc\",\n \"voicemail\",\n \"volcano\",\n \"volcano-outline\",\n \"volleyball\",\n \"volume-equal\",\n \"volume-high\",\n \"volume-low\",\n \"volume-medium\",\n \"volume-minus\",\n \"volume-mute\",\n \"volume-off\",\n \"volume-plus\",\n \"volume-source\",\n \"volume-variant-off\",\n \"volume-vibrate\",\n \"vote\",\n \"vote-outline\",\n \"vpn\",\n \"vuejs\",\n \"vuetify\",\n \"walk\",\n \"wall\",\n \"wall-fire\",\n \"wall-sconce\",\n \"wall-sconce-flat\",\n \"wall-sconce-flat-outline\",\n \"wall-sconce-flat-variant\",\n \"wall-sconce-flat-variant-outline\",\n \"wall-sconce-outline\",\n \"wall-sconce-round\",\n \"wall-sconce-round-outline\",\n \"wall-sconce-round-variant\",\n \"wall-sconce-round-variant-outline\",\n \"wallet\",\n \"wallet-bifold\",\n \"wallet-bifold-outline\",\n \"wallet-giftcard\",\n \"wallet-membership\",\n \"wallet-outline\",\n \"wallet-plus\",\n \"wallet-plus-outline\",\n \"wallet-travel\",\n \"wallpaper\",\n \"wan\",\n \"wardrobe\",\n \"wardrobe-outline\",\n \"warehouse\",\n \"washing-machine\",\n \"washing-machine-alert\",\n \"washing-machine-off\",\n \"watch\",\n \"watch-export\",\n \"watch-export-variant\",\n \"watch-import\",\n \"watch-import-variant\",\n \"watch-variant\",\n \"watch-vibrate\",\n \"watch-vibrate-off\",\n \"water\",\n \"water-alert\",\n \"water-alert-outline\",\n \"water-boiler\",\n \"water-boiler-alert\",\n \"water-boiler-auto\",\n \"water-boiler-off\",\n \"water-check\",\n \"water-check-outline\",\n \"water-circle\",\n \"water-minus\",\n \"water-minus-outline\",\n \"water-off\",\n \"water-off-outline\",\n \"water-opacity\",\n \"water-outline\",\n \"water-percent\",\n \"water-percent-alert\",\n \"water-plus\",\n \"water-plus-outline\",\n \"water-polo\",\n \"water-pump\",\n \"water-pump-off\",\n \"water-remove\",\n \"water-remove-outline\",\n \"water-sync\",\n \"water-thermometer\",\n \"water-thermometer-outline\",\n \"water-well\",\n \"water-well-outline\",\n \"waterfall\",\n \"watering-can\",\n \"watering-can-outline\",\n \"watermark\",\n \"wave\",\n \"wave-arrow-down\",\n \"wave-arrow-up\",\n \"wave-undercurrent\",\n \"waveform\",\n \"waves\",\n \"waves-arrow-left\",\n \"waves-arrow-right\",\n \"waves-arrow-up\",\n \"waze\",\n \"weather-cloudy\",\n \"weather-cloudy-alert\",\n \"weather-cloudy-arrow-right\",\n \"weather-cloudy-clock\",\n \"weather-dust\",\n \"weather-fog\",\n \"weather-hail\",\n \"weather-hazy\",\n \"weather-hurricane\",\n \"weather-hurricane-outline\",\n \"weather-lightning\",\n \"weather-lightning-rainy\",\n \"weather-moonset\",\n \"weather-moonset-down\",\n \"weather-moonset-up\",\n \"weather-night\",\n \"weather-night-partly-cloudy\",\n \"weather-partly-cloudy\",\n \"weather-partly-lightning\",\n \"weather-partly-rainy\",\n \"weather-partly-snowy\",\n \"weather-partly-snowy-rainy\",\n \"weather-pouring\",\n \"weather-rainy\",\n \"weather-snowy\",\n \"weather-snowy-heavy\",\n \"weather-snowy-rainy\",\n \"weather-sunny\",\n \"weather-sunny-alert\",\n \"weather-sunny-off\",\n \"weather-sunset\",\n \"weather-sunset-down\",\n \"weather-sunset-up\",\n \"weather-tornado\",\n \"weather-windy\",\n \"weather-windy-variant\",\n \"web\",\n \"web-box\",\n \"web-cancel\",\n \"web-check\",\n \"web-clock\",\n \"web-minus\",\n \"web-off\",\n \"web-plus\",\n \"web-refresh\",\n \"web-remove\",\n \"web-sync\",\n \"webcam\",\n \"webcam-off\",\n \"webhook\",\n \"webpack\",\n \"webrtc\",\n \"wechat\",\n \"weight\",\n \"weight-gram\",\n \"weight-kilogram\",\n \"weight-lifter\",\n \"weight-pound\",\n \"whatsapp\",\n \"wheel-barrow\",\n \"wheelchair\",\n \"wheelchair-accessibility\",\n \"whistle\",\n \"whistle-outline\",\n \"white-balance-auto\",\n \"white-balance-incandescent\",\n \"white-balance-iridescent\",\n \"white-balance-sunny\",\n \"widgets\",\n \"widgets-outline\",\n \"wifi\",\n \"wifi-alert\",\n \"wifi-arrow-down\",\n \"wifi-arrow-left\",\n \"wifi-arrow-left-right\",\n \"wifi-arrow-right\",\n \"wifi-arrow-up\",\n \"wifi-arrow-up-down\",\n \"wifi-cancel\",\n \"wifi-check\",\n \"wifi-cog\",\n \"wifi-lock\",\n \"wifi-lock-open\",\n \"wifi-marker\",\n \"wifi-minus\",\n \"wifi-off\",\n \"wifi-plus\",\n \"wifi-refresh\",\n \"wifi-remove\",\n \"wifi-settings\",\n \"wifi-star\",\n \"wifi-strength-1\",\n \"wifi-strength-1-alert\",\n \"wifi-strength-1-lock\",\n \"wifi-strength-1-lock-open\",\n \"wifi-strength-2\",\n \"wifi-strength-2-alert\",\n \"wifi-strength-2-lock\",\n \"wifi-strength-2-lock-open\",\n \"wifi-strength-3\",\n \"wifi-strength-3-alert\",\n \"wifi-strength-3-lock\",\n \"wifi-strength-3-lock-open\",\n \"wifi-strength-4\",\n \"wifi-strength-4-alert\",\n \"wifi-strength-4-lock\",\n \"wifi-strength-4-lock-open\",\n \"wifi-strength-alert-outline\",\n \"wifi-strength-lock-open-outline\",\n \"wifi-strength-lock-outline\",\n \"wifi-strength-off\",\n \"wifi-strength-off-outline\",\n \"wifi-strength-outline\",\n \"wifi-sync\",\n \"wikipedia\",\n \"wind-power\",\n \"wind-power-outline\",\n \"wind-turbine\",\n \"wind-turbine-alert\",\n \"wind-turbine-check\",\n \"window-close\",\n \"window-closed\",\n \"window-closed-variant\",\n \"window-maximize\",\n \"window-minimize\",\n \"window-open\",\n \"window-open-variant\",\n \"window-restore\",\n \"window-shutter\",\n \"window-shutter-alert\",\n \"window-shutter-auto\",\n \"window-shutter-cog\",\n \"window-shutter-open\",\n \"window-shutter-settings\",\n \"windsock\",\n \"wiper\",\n \"wiper-wash\",\n \"wiper-wash-alert\",\n \"wizard-hat\",\n \"wordpress\",\n \"wrap\",\n \"wrap-disabled\",\n \"wrench\",\n \"wrench-check\",\n \"wrench-check-outline\",\n \"wrench-clock\",\n \"wrench-clock-outline\",\n \"wrench-cog\",\n \"wrench-cog-outline\",\n \"wrench-outline\",\n \"xamarin\",\n \"xml\",\n \"xmpp\",\n \"yahoo\",\n \"yeast\",\n \"yin-yang\",\n \"yoga\",\n \"youtube\",\n \"youtube-gaming\",\n \"youtube-studio\",\n \"youtube-subscription\",\n \"youtube-tv\",\n \"yurt\",\n \"z-wave\",\n \"zend\",\n \"zigbee\",\n \"zip-box\",\n \"zip-box-outline\",\n \"zip-disk\",\n \"zodiac-aquarius\",\n \"zodiac-aries\",\n \"zodiac-cancer\",\n \"zodiac-capricorn\",\n \"zodiac-gemini\",\n \"zodiac-leo\",\n \"zodiac-libra\",\n \"zodiac-pisces\",\n \"zodiac-sagittarius\",\n \"zodiac-scorpio\",\n \"zodiac-taurus\",\n \"zodiac-virgo\"\n ]\n}","/**\n * Get Types Tool\n *\n * Returns TypeScript type definitions for Idealyst components, theme, and navigation.\n * Enhanced with @idealyst/tooling registry data for authoritative prop values.\n *\n * Types are generated dynamically at runtime using @idealyst/tooling if the\n * pre-generated types.json file is not found.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'url';\nimport { analyzeComponents, analyzeTheme } from '@idealyst/tooling';\nimport type { ComponentRegistry, ThemeValues } from '@idealyst/tooling';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ninterface TypesData {\n version: string;\n extractedAt: string;\n components: Record<string, any>;\n theme: Record<string, any>;\n navigation: Record<string, any>;\n // Registry data from @idealyst/tooling (single source of truth)\n registry?: {\n components: Record<string, any>;\n themeValues: any;\n };\n}\n\nlet cachedTypes: TypesData | null = null;\n\n/**\n * Find the monorepo root by looking for package.json with workspaces\n */\nfunction findMonorepoRoot(): string | null {\n // Start from the mcp-server package location\n let currentDir = path.resolve(__dirname, '../..');\n\n // Walk up looking for the monorepo root (has workspaces in package.json)\n for (let i = 0; i < 10; i++) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkg.workspaces) {\n return currentDir;\n }\n } catch {\n // Continue searching\n }\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n\n return null;\n}\n\n/**\n * Find package paths - works with both symlinked monorepo and installed packages\n */\nfunction findPackagePaths(): { componentsPath: string; themePath: string } | null {\n // First try: resolve via node_modules (works for symlinked monorepo)\n try {\n const componentsEntry = require.resolve('@idealyst/components');\n const themeEntry = require.resolve('@idealyst/theme');\n\n // Get the src directories\n const componentsPath = path.join(path.dirname(componentsEntry), '..', 'src');\n const themePath = path.join(path.dirname(themeEntry), '..', 'src', 'lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n } catch {\n // Not found via require.resolve\n }\n\n // Second try: look for monorepo structure\n const monorepoRoot = findMonorepoRoot();\n if (monorepoRoot) {\n const componentsPath = path.join(monorepoRoot, 'packages/components/src');\n const themePath = path.join(monorepoRoot, 'packages/theme/src/lightTheme.ts');\n\n if (fs.existsSync(componentsPath) && fs.existsSync(themePath)) {\n return { componentsPath, themePath };\n }\n }\n\n return null;\n}\n\n/**\n * Static navigation types - hardcoded since dynamic extraction requires ts-morph.\n * These map to the actual exports from @idealyst/navigation.\n */\nfunction getStaticNavigationTypes(): Record<string, string> {\n return {\n NavigatorProvider: `// NavigatorProvider — Root navigation component\nimport type { NavigatorParam } from '@idealyst/navigation';\n\ntype NavigatorProviderProps = {\n route: NavigatorParam;\n floatingComponent?: React.ReactNode;\n};\n\n// Usage: <NavigatorProvider route={routeConfig} />`,\n\n NavigateParams: `// NavigateParams — Used with navigate() and replace()\ntype NavigateParams = {\n path: string;\n vars?: Record<string, string>;\n replace?: boolean;\n state?: Record<string, string | number | boolean>;\n};`,\n\n useNavigator: `// useNavigator() — Navigation hook\n// Returns: { navigate, replace, canGoBack, goBack }\ntype NavigatorContextValue = {\n navigate: (params: NavigateParams) => void;\n replace: (params: Omit<NavigateParams, 'replace'>) => void;\n canGoBack: () => boolean;\n goBack: () => void;\n};\n\n// Usage:\n// const { navigate, goBack, canGoBack } = useNavigator();\n// navigate({ path: '/detail', vars: { id: '123' } });\n// navigate({ path: '/home', state: { tab: 'recent' } });`,\n\n useParams: `// useParams() — Get route parameters\n// Returns Record<string, string | undefined>\n// NOTE: Does NOT accept type parameters. Use type assertion if needed.\n// const params = useParams();\n// const id = params.id; // string | undefined`,\n\n useNavigationState: `// useNavigationState<T>() — Get navigation state data\n// Returns T (defaults to Record<string, unknown>)\n// Always provide a type parameter:\n// const state = useNavigationState<{ autostart?: boolean }>();`,\n\n useCurrentPath: `// useCurrentPath() — Get current route path as string\n// const path = useCurrentPath(); // '/users/123'`,\n\n RouteConfig: `// Route Configuration Types\ntype ScreenParam = {\n path: string;\n type: 'screen';\n component: React.ComponentType;\n options?: ScreenOptions;\n};\n\ntype ScreenOptions = {\n title?: string;\n headerShown?: boolean;\n fullScreen?: boolean;\n headerTitle?: React.ComponentType | React.ReactElement | string;\n headerLeft?: React.ComponentType | React.ReactElement;\n headerRight?: React.ComponentType | React.ReactElement;\n headerBackVisible?: boolean;\n};\n\ntype TabBarScreenOptions = ScreenOptions & {\n tabBarIcon?: (props: { focused: boolean; color: string; size: string | number }) => React.ReactElement;\n tabBarLabel?: string;\n tabBarBadge?: string | number;\n tabBarVisible?: boolean;\n};\n\ntype TabNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'tab';\n routes: RouteParam[];\n options?: TabBarScreenOptions;\n};\n\ntype StackNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'stack';\n routes: RouteParam[];\n options?: ScreenOptions;\n};\n\ntype DrawerNavigatorParam = {\n path: string;\n type: 'navigator';\n layout: 'drawer';\n routes: RouteParam[];\n options?: TabBarScreenOptions;\n sidebarComponent?: React.ComponentType;\n};\n\ntype NavigatorParam = TabNavigatorParam | StackNavigatorParam | DrawerNavigatorParam;\ntype RouteParam = NavigatorParam | ScreenParam;`,\n };\n}\n\n/**\n * Generate types dynamically using @idealyst/tooling\n */\nfunction generateTypes(): TypesData {\n const paths = findPackagePaths();\n\n if (!paths) {\n throw new Error(\n 'Could not find @idealyst/components and @idealyst/theme packages. ' +\n 'Ensure you are running in the Idealyst monorepo or have the packages installed.'\n );\n }\n\n const { componentsPath, themePath } = paths;\n\n // Analyze components using @idealyst/tooling\n let componentRegistry: ComponentRegistry = {};\n let themeValues: ThemeValues | null = null;\n\n try {\n componentRegistry = analyzeComponents({\n componentPaths: [componentsPath],\n themePath,\n });\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze components:', error);\n }\n\n try {\n themeValues = analyzeTheme(themePath, false);\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not analyze theme:', error);\n }\n\n // Convert component registry to the expected format\n const components: Record<string, any> = {};\n for (const [name, def] of Object.entries(componentRegistry)) {\n components[name] = {\n propsInterface: `${name}Props`,\n props: Object.entries(def.props).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n description: prop.description,\n values: prop.values,\n default: prop.default,\n })),\n typeDefinition: '', // Not available without ts-morph\n relatedTypes: {},\n registry: def,\n };\n }\n\n // Build theme types from themeValues\n const theme: Record<string, any> = {};\n if (themeValues) {\n theme.Intent = {\n name: 'Intent',\n definition: `type Intent = ${themeValues.intents.map((i) => `'${i}'`).join(' | ')};`,\n values: themeValues.intents,\n };\n\n // Extract size keys from the first size group\n // themeValues.sizes is Record<string, string[]> — the values are string arrays, not objects\n const firstSizeGroup = Object.keys(themeValues.sizes)[0];\n const sizeKeys = firstSizeGroup\n ? (themeValues.sizes as Record<string, string[]>)[firstSizeGroup]\n : ['xs', 'sm', 'md', 'lg', 'xl'];\n theme.Size = {\n name: 'Size',\n definition: `type Size = ${sizeKeys.map((s) => `'${s}'`).join(' | ')};`,\n values: sizeKeys,\n };\n }\n\n return {\n version: 'dynamic',\n extractedAt: new Date().toISOString(),\n components,\n theme,\n navigation: getStaticNavigationTypes(),\n registry: {\n components: componentRegistry,\n themeValues,\n },\n };\n}\n\n/**\n * Load types from JSON file or generate dynamically\n */\nfunction loadTypes(): TypesData {\n if (cachedTypes) {\n return cachedTypes;\n }\n\n // Try to load pre-generated types first (works for both bundled and source)\n const pkgRoot = findPackageRoot();\n const typesPath = path.join(pkgRoot, 'src/generated/types.json');\n\n if (fs.existsSync(typesPath)) {\n try {\n const content = fs.readFileSync(typesPath, 'utf-8');\n cachedTypes = JSON.parse(content);\n return cachedTypes!;\n } catch (error) {\n console.warn('[mcp-server] Warning: Could not parse types.json, generating dynamically');\n }\n }\n\n // Generate types dynamically\n cachedTypes = generateTypes();\n return cachedTypes;\n}\n\n/**\n * Find the canonical component name from types data (case-insensitive)\n */\n/** Deprecated component names that should redirect to their replacements */\nconst deprecatedAliases: Record<string, string> = {\n Input: \"TextInput\",\n};\n\nfunction findComponentNameInTypes(types: TypesData, componentName: string): string | undefined {\n // Direct match first (fast path)\n if (types.components[componentName]) {\n // Redirect deprecated components to their replacements\n return deprecatedAliases[componentName] ?? componentName;\n }\n\n // Case-insensitive lookup\n const lowerName = componentName.toLowerCase();\n const match = Object.keys(types.components).find(\n (name) => name.toLowerCase() === lowerName\n );\n\n if (match) {\n // Redirect deprecated components to their replacements\n return deprecatedAliases[match] ?? match;\n }\n\n return undefined;\n}\n\n/**\n * Get component types by name (case-insensitive)\n */\nexport function getComponentTypes(componentName: string, format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n const canonicalName = findComponentNameInTypes(types, componentName);\n\n if (!canonicalName) {\n throw new Error(\n `Component \"${componentName}\" not found. Available components: ${Object.keys(types.components).join(', ')}`\n );\n }\n\n const component = types.components[canonicalName];\n\n const result: any = {\n component: canonicalName,\n };\n\n if (format === 'typescript' || format === 'both') {\n result.typescript = formatTypeScriptOutput(component);\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = {\n propsInterface: component.propsInterface,\n props: component.props,\n relatedTypes: component.relatedTypes,\n };\n\n // Include registry data if available (authoritative prop values)\n if (component.registry) {\n result.registry = component.registry;\n }\n }\n\n return result;\n}\n\n/**\n * Get theme types\n */\nexport function getThemeTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Theme Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.theme)\n .map(([_, info]: [string, any]) => info.definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.theme;\n\n // Include authoritative theme values from registry if available\n if (types.registry?.themeValues) {\n result.themeValues = types.registry.themeValues;\n }\n }\n\n return result;\n}\n\n/**\n * Get navigation types\n */\nexport function getNavigationTypes(format: 'typescript' | 'json' | 'both' = 'both') {\n const types = loadTypes();\n\n const result: any = {\n name: 'Navigation Types',\n };\n\n if (format === 'typescript' || format === 'both') {\n const tsOutput = Object.entries(types.navigation)\n .map(([_, definition]) => definition)\n .join('\\n\\n');\n result.typescript = tsOutput;\n }\n\n if (format === 'json' || format === 'both') {\n result.schema = types.navigation;\n }\n\n return result;\n}\n\n/**\n * Known type resolutions for props that the @idealyst/tooling analyzer reports as `any`.\n * The analyzer cannot resolve types imported from @idealyst/theme, so we map them here.\n * Key format: \"ComponentName.propName\" or just \"propName\" for global matches.\n */\nconst KNOWN_PROP_TYPES: Record<string, string> = {\n // Icon-specific\n 'Icon.size': \"'xs' | 'sm' | 'md' | 'lg' | 'xl' | number\",\n 'Icon.intent': \"'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\",\n 'Icon.color': \"Color /* e.g. 'blue.500', 'red.300' — use intent for semantic coloring */\",\n 'Icon.textColor': \"'primary' | 'secondary' | 'tertiary' | 'inverse'\",\n // Global fallbacks for common prop names when type is 'any'\n 'size': \"'xs' | 'sm' | 'md' | 'lg' | 'xl'\",\n 'intent': \"'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\",\n};\n\n/**\n * Resolve a prop's type, replacing 'any' with known concrete types where possible.\n */\nfunction resolveAnyType(componentName: string, propName: string, rawType: string): string {\n if (rawType !== 'any') return rawType;\n return KNOWN_PROP_TYPES[`${componentName}.${propName}`]\n ?? KNOWN_PROP_TYPES[propName]\n ?? rawType;\n}\n\n/**\n * Synthesize a TypeScript interface string from a component's properties array.\n * Used as a fallback when typeDefinition is not available (e.g. dynamic generation\n * without ts-morph).\n */\nfunction synthesizeTypeDefinition(component: any): string {\n const interfaceName = component.propsInterface || 'Props';\n const componentName = interfaceName.replace(/Props$/, '');\n const props: any[] = component.props || [];\n\n if (props.length === 0) {\n return `interface ${interfaceName} {}`;\n }\n\n const lines: string[] = [];\n lines.push(`interface ${interfaceName} {`);\n\n for (const prop of props) {\n // Add JSDoc comment with description and default value\n const docParts: string[] = [];\n if (prop.description) {\n docParts.push(prop.description);\n }\n if (prop.defaultValue !== undefined && prop.defaultValue !== null) {\n docParts.push(`@default ${prop.defaultValue}`);\n } else if (prop.default !== undefined && prop.default !== null) {\n docParts.push(`@default ${prop.default}`);\n }\n\n if (docParts.length > 0) {\n if (docParts.length === 1) {\n lines.push(` /** ${docParts[0]} */`);\n } else {\n lines.push(' /**');\n for (const part of docParts) {\n lines.push(` * ${part}`);\n }\n lines.push(' */');\n }\n }\n\n const optional = prop.required ? '' : '?';\n const propType = resolveAnyType(componentName, prop.name, prop.type || 'unknown');\n lines.push(` ${prop.name}${optional}: ${propType};`);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/**\n * Format TypeScript output for better readability\n */\nfunction formatTypeScriptOutput(component: any): string {\n const sections: string[] = [];\n\n // Main props interface\n sections.push(`// ${component.propsInterface}`);\n\n if (component.typeDefinition) {\n sections.push(component.typeDefinition);\n } else {\n // typeDefinition is empty — synthesize from properties data\n sections.push(synthesizeTypeDefinition(component));\n }\n\n // Related types\n if (Object.keys(component.relatedTypes).length > 0) {\n sections.push('\\n// Related Types');\n for (const [_, definition] of Object.entries(component.relatedTypes)) {\n sections.push(definition as string);\n }\n }\n\n return sections.join('\\n\\n');\n}\n\n/**\n * Get list of all available components\n */\nexport function getAvailableComponents() {\n const types = loadTypes();\n return Object.keys(types.components);\n}\n\n/**\n * Find the mcp-server package root directory.\n * After bundling, __dirname points to dist/ (one level deep), but the source\n * code assumes dist/tools/ (two levels deep). This helper finds the package\n * root reliably regardless of bundling by walking up from __dirname.\n */\nfunction findPackageRoot(): string {\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const pkgPath = path.join(dir, 'package.json');\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n if (pkg.name === '@idealyst/mcp-server') {\n return dir;\n }\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback: assume __dirname is dist/ or src/tools/\n return path.resolve(__dirname, '../..');\n}\n\n/**\n * Find the correct example file name (case-insensitive)\n */\nfunction findExampleFile(componentName: string): string | null {\n const examplesDir = path.join(findPackageRoot(), 'examples/components');\n\n // Direct match first (fast path)\n const directPath = path.join(examplesDir, `${componentName}.examples.tsx`);\n if (fs.existsSync(directPath)) {\n return directPath;\n }\n\n // Case-insensitive lookup\n if (!fs.existsSync(examplesDir)) {\n return null;\n }\n\n const lowerName = componentName.toLowerCase();\n const files = fs.readdirSync(examplesDir);\n const match = files.find(\n (file) => file.toLowerCase() === `${lowerName}.examples.tsx`\n );\n\n return match ? path.join(examplesDir, match) : null;\n}\n\n/**\n * Get examples for a component (case-insensitive)\n */\nexport function getComponentExamples(componentName: string): string | null {\n const examplesPath = findExampleFile(componentName);\n\n if (!examplesPath) {\n return null;\n }\n\n return fs.readFileSync(examplesPath, 'utf-8');\n}\n\n/**\n * Get the full component registry from @idealyst/tooling\n * This is the single source of truth for component props and values\n */\nexport function getComponentRegistry() {\n const types = loadTypes();\n return types.registry?.components || {};\n}\n\n/**\n * Get theme values from the registry\n * This is the single source of truth for available intents, sizes, etc.\n */\nexport function getRegistryThemeValues() {\n const types = loadTypes();\n return types.registry?.themeValues || null;\n}\n","/**\n * Tool Handlers\n *\n * Implementation functions for all MCP tools.\n * These handlers can be used directly or through an MCP server.\n *\n * Component documentation now uses:\n * - Types: Dynamically loaded from @idealyst/tooling via generated/types.json\n * - Examples: Type-checked .examples.tsx files in examples/components/\n * - Metadata: Minimal static metadata (category, description, features, best practices)\n */\n\nimport {\n componentMetadata,\n getComponentMetadata,\n getComponentNames,\n searchComponents as searchComponentsData,\n getComponentsByCategory,\n findComponentName,\n} from \"../data/component-metadata.js\";\nimport { cliCommands } from \"../data/cli-commands.js\";\nimport { translateGuides } from \"../data/translate-guides.js\";\nimport { storageGuides } from \"../data/storage-guides.js\";\nimport { audioGuides } from \"../data/audio-guides.js\";\nimport { cameraGuides } from \"../data/camera-guides.js\";\nimport { filesGuides } from \"../data/files-guides.js\";\nimport { oauthClientGuides } from \"../data/oauth-client-guides.js\";\nimport { animateGuides } from \"../data/animate-guides.js\";\nimport { datagridGuides } from \"../data/datagrid-guides.js\";\nimport { datepickerGuides } from \"../data/datepicker-guides.js\";\nimport { lottieGuides } from \"../data/lottie-guides.js\";\nimport { markdownGuides } from \"../data/markdown-guides.js\";\nimport { configGuides } from \"../data/config-guides.js\";\nimport { chartsGuides } from \"../data/charts-guides.js\";\nimport { clipboardGuides } from \"../data/clipboard-guides.js\";\nimport { biometricsGuides } from \"../data/biometrics-guides.js\";\nimport { paymentsGuides } from \"../data/payments-guides.js\";\nimport {\n packages,\n getPackageSummary,\n getPackagesByCategory as getPackagesByCat,\n searchPackages as searchPackagesData,\n} from \"../data/packages.js\";\nimport {\n recipes,\n getRecipeSummary,\n getRecipesByCategory,\n searchRecipes as searchRecipesData,\n} from \"../data/recipes/index.js\";\nimport {\n installGuides,\n getInstallGuide as getInstallGuideData,\n formatInstallGuideMarkdown,\n} from \"../data/install-guides.js\";\nimport { idealystIntro } from \"../data/intro.js\";\nimport iconsData from \"../data/icons.json\" with { type: \"json\" };\nimport {\n getComponentTypes as getTypesFromFile,\n getThemeTypes as getThemeTypesFromFile,\n getNavigationTypes as getNavigationTypesFromFile,\n getAvailableComponents,\n getComponentExamples as getComponentExamplesFromFile,\n} from \"./get-types.js\";\nimport type {\n ToolResponse,\n ListComponentsArgs,\n GetComponentDocsArgs,\n GetComponentExampleArgs,\n SearchComponentsArgs,\n GetComponentTypesArgs,\n GetComponentExamplesTsArgs,\n GetCliUsageArgs,\n SearchIconsArgs,\n GetThemeTypesArgs,\n GetNavigationTypesArgs,\n GetTranslateGuideArgs,\n GetStorageGuideArgs,\n GetAudioGuideArgs,\n GetCameraGuideArgs,\n GetFilesGuideArgs,\n GetOauthClientGuideArgs,\n GetAnimateGuideArgs,\n GetDatagridGuideArgs,\n GetDatepickerGuideArgs,\n GetLottieGuideArgs,\n GetMarkdownGuideArgs,\n GetConfigGuideArgs,\n GetChartsGuideArgs,\n GetClipboardGuideArgs,\n GetBiometricsGuideArgs,\n GetPaymentsGuideArgs,\n ListPackagesArgs,\n GetPackageDocsArgs,\n SearchPackagesArgs,\n ListRecipesArgs,\n GetRecipeArgs,\n SearchRecipesArgs,\n GetInstallGuideArgs,\n GetIntroArgs,\n} from \"./types.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a standard tool response with text content\n */\nfunction textResponse(text: string): ToolResponse {\n return {\n content: [{ type: \"text\", text }],\n };\n}\n\n/**\n * Create a JSON response\n */\nfunction jsonResponse(data: unknown): ToolResponse {\n return textResponse(JSON.stringify(data, null, 2));\n}\n\n// ============================================================================\n// Component Tool Handlers\n// ============================================================================\n\n/**\n * List all available Idealyst components with brief descriptions\n */\nexport function listComponents(_args: ListComponentsArgs = {}): ToolResponse {\n const componentList = getComponentNames().map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(componentList);\n}\n\n/**\n * Get detailed documentation for a specific component\n *\n * Returns:\n * - Description and category from metadata\n * - TypeScript props from dynamic types\n * - Features and best practices from metadata\n * - Type-checked examples from .examples.tsx files\n */\nexport function getComponentDocs(args: GetComponentDocsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(\n `Component \"${inputName}\" not found. Available components: ${getComponentNames().join(\", \")}`\n );\n }\n\n const meta = getComponentMetadata(canonicalName)!;\n\n // Get TypeScript types for props documentation\n let propsSection = \"\";\n try {\n const types = getTypesFromFile(canonicalName, \"typescript\");\n propsSection = `## Props (TypeScript)\n\n\\`\\`\\`typescript\n${types.typescript}\n\\`\\`\\``;\n } catch {\n propsSection = \"## Props\\n\\n_Types not available. Run `yarn extract-types` to generate._\";\n }\n\n // Get type-checked examples\n let examplesSection = \"\";\n const examples = getComponentExamplesFromFile(canonicalName);\n if (examples) {\n examplesSection = `## Examples\n\n\\`\\`\\`tsx\n${examples}\n\\`\\`\\``;\n }\n\n // Add component-specific warnings\n let warningSection = \"\";\n if (canonicalName === \"Card\") {\n warningSection = `\n## WARNING: No Compound Components\n\nCard is a **simple container** component. There are NO sub-components like \\`Card.Content\\`, \\`Card.Header\\`, \\`Card.Body\\`, \\`Card.Footer\\`, or \\`Card.Title\\`. Using these will cause TS2339 errors.\n\n**Correct usage:** Put children directly inside \\`<Card>...</Card>\\`:\n\\`\\`\\`tsx\n<Card padding=\"md\">\n <Text typography=\"h6\" weight=\"bold\">Title</Text>\n <Text typography=\"body2\">Body content</Text>\n <Button onPress={handler}>Action</Button>\n</Card>\n\\`\\`\\`\n`;\n }\n\n const docs = `# ${canonicalName}\n\n${meta.description}\n${warningSection}\n## Category\n${meta.category}\n\n${propsSection}\n\n## Features\n${meta.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n## Best Practices\n${meta.bestPractices.map((bp) => `- ${bp}`).join(\"\\n\")}\n\n${examplesSection}\n`;\n\n return textResponse(docs);\n}\n\n/**\n * Get a code example for a specific component\n *\n * Returns the type-checked example file content.\n * The example_type parameter is kept for API compatibility but all examples\n * are now in a single .examples.tsx file.\n */\nexport function getComponentExample(args: GetComponentExampleArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n if (!canonicalName) {\n return textResponse(`Component \"${inputName}\" not found.`);\n }\n\n const examples = getComponentExamplesFromFile(canonicalName);\n if (!examples) {\n return textResponse(\n `No examples found for \"${canonicalName}\". Examples are in packages/mcp-server/examples/components/${canonicalName}.examples.tsx`\n );\n }\n\n return textResponse(examples);\n}\n\n/**\n * Search for components by name, category, or feature\n */\nexport function searchComponents(args: SearchComponentsArgs = {}): ToolResponse {\n const query = args.query || \"\";\n const category = args.category;\n\n let results: string[];\n\n if (query) {\n results = searchComponentsData(query, category);\n } else if (category) {\n results = getComponentsByCategory(category);\n } else {\n results = getComponentNames();\n }\n\n const resultList = results.map((name) => {\n const meta = getComponentMetadata(name);\n return {\n name,\n category: meta?.category || \"unknown\",\n description: meta?.description || \"\",\n };\n });\n\n return jsonResponse(resultList);\n}\n\n/**\n * Get TypeScript type definitions for a component\n */\nexport function getComponentTypes(args: GetComponentTypesArgs): ToolResponse {\n const componentInput = args.component;\n const format = args.format || \"both\";\n\n // Support comma-separated batch lookups: \"Button,Card,Text\"\n const names = componentInput.split(\",\").map(s => s.trim()).filter(Boolean);\n\n if (names.length > 1) {\n // Batch mode: return all requested component types in one response\n const batchResult: Record<string, unknown> = {};\n const errors: string[] = [];\n\n for (const name of names) {\n try {\n const result = getTypesFromFile(name, format);\n const processed = postProcessComponentTypes(name, result);\n batchResult[name] = processed;\n } catch (error) {\n errors.push(`${name}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n if (errors.length > 0) {\n (batchResult as any)._errors = errors;\n }\n\n return jsonResponse(batchResult);\n }\n\n // Single component mode (original behavior)\n const componentName = names[0] || componentInput;\n\n try {\n const result = getTypesFromFile(componentName, format);\n const processed = postProcessComponentTypes(componentName, result);\n return jsonResponse(processed);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Post-process component types to add guidance notes and truncate large payloads\n */\nfunction postProcessComponentTypes(componentName: string, result: unknown): unknown {\n // Truncate Icon's massive IconName values list (7,447 entries → ~10 examples + note)\n if (componentName.toLowerCase() === 'icon' && typeof result === 'object' && result !== null) {\n const r = result as any;\n if (r.registry?.props?.name?.values && Array.isArray(r.registry.props.name.values)) {\n const total = r.registry.props.name.values.length;\n r.registry.props.name.values = [\n ...r.registry.props.name.values.slice(0, 10),\n `... and ${total - 10} more. Use search_icons to find specific icon names.`,\n ];\n }\n if (r.schema?.props && Array.isArray(r.schema.props)) {\n for (const prop of r.schema.props) {\n if (prop.name === 'name' && Array.isArray(prop.values) && prop.values.length > 20) {\n const total = prop.values.length;\n prop.values = [\n ...prop.values.slice(0, 10),\n `... and ${total - 10} more. Use search_icons to find specific icon names.`,\n ];\n }\n }\n }\n }\n\n // Add Card-specific guidance to prevent compound component hallucination\n if (componentName.toLowerCase() === 'card') {\n if (typeof result === 'object' && result !== null) {\n (result as any).usageNote = \"Card is a SIMPLE CONTAINER — there are NO compound components. \" +\n \"Do NOT use Card.Content, Card.Header, Card.Body, Card.Footer, Card.Title — they do NOT exist and will cause TS2339. \" +\n \"Just put children directly inside <Card>...</Card>. Example: <Card padding=\\\"md\\\"><Text>Title</Text><Text>Body</Text></Card>\";\n }\n }\n\n // Note: IconName guidance is covered in get_intro and search_icons responses.\n // Avoid adding verbose notes to every component — it creates noise in batch responses.\n\n return result;\n}\n\n/**\n * Get validated TypeScript examples for a component\n *\n * These examples are type-checked against the actual component props\n * to ensure they compile and are correct.\n */\nexport function getComponentExamplesTs(args: GetComponentExamplesTsArgs): ToolResponse {\n const inputName = args.component;\n const canonicalName = findComponentName(inputName);\n\n try {\n // If component name is not recognized in metadata, still try to find examples\n const lookupName = canonicalName || inputName;\n const examples = getComponentExamplesFromFile(lookupName);\n if (!examples) {\n const availableComponents = getAvailableComponents();\n return textResponse(\n `No TypeScript examples found for component \"${inputName}\". Available components with examples: ${availableComponents.join(\", \")}`\n );\n }\n\n return textResponse(examples);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// CLI Tool Handlers\n// ============================================================================\n\n/**\n * Get information about CLI commands and usage\n */\nexport function getCliUsage(args: GetCliUsageArgs = {}): ToolResponse {\n const commandName = args.command;\n\n if (commandName) {\n const command = cliCommands[commandName];\n if (!command) {\n return textResponse(\n `Command \"${commandName}\" not found. Available commands: ${Object.keys(cliCommands).join(\", \")}`\n );\n }\n\n return textResponse(`# ${commandName}\n\n${command.description}\n\n## Usage\n\\`\\`\\`bash\n${command.usage}\n\\`\\`\\`\n\n## Options\n${command.options.map((opt: any) => `- \\`${opt.flag}\\`: ${opt.description}`).join(\"\\n\")}\n\n## Examples\n${command.examples.map((ex: string) => `\\`\\`\\`bash\\n${ex}\\n\\`\\`\\``).join(\"\\n\\n\")}\n`);\n }\n\n // Return all commands\n const allCommands = Object.entries(cliCommands).map(([name, data]) => ({\n name,\n description: data.description,\n usage: data.usage,\n }));\n\n return jsonResponse(allCommands);\n}\n\n// ============================================================================\n// Icon Tool Handlers\n// ============================================================================\n\n/**\n * Search for Material Design Icons\n */\n/**\n * Icon search term aliases — maps common search terms to their MDI equivalents.\n * Agents often search for generic terms; this maps them to actual icon names.\n */\nconst iconSearchAliases: Record<string, string[]> = {\n back: ['arrow-left', 'chevron-left'],\n forward: ['arrow-right', 'chevron-right'],\n next: ['arrow-right', 'chevron-right', 'skip-next'],\n previous: ['arrow-left', 'chevron-left', 'skip-previous'],\n user: ['account'],\n profile: ['account', 'account-circle'],\n search: ['magnify'],\n settings: ['cog'],\n password: ['lock', 'key'],\n mail: ['email'],\n notification: ['bell'],\n notifications: ['bell'],\n spinner: ['loading'],\n send: ['send'],\n save: ['content-save'],\n edit: ['pencil'],\n copy: ['content-copy'],\n paste: ['content-paste'],\n trash: ['delete'],\n remove: ['delete', 'close'],\n add: ['plus'],\n create: ['plus'],\n photo: ['camera', 'image'],\n picture: ['image'],\n like: ['heart', 'thumb-up'],\n favorite: ['heart', 'star'],\n error: ['alert-circle', 'close-circle'],\n warning: ['alert'],\n success: ['check-circle'],\n info: ['information'],\n expand: ['chevron-down'],\n collapse: ['chevron-up'],\n more: ['dots-vertical', 'dots-horizontal'],\n options: ['dots-vertical'],\n refresh: ['refresh'],\n reload: ['refresh'],\n dark: ['weather-night'],\n light: ['weather-sunny', 'white-balance-sunny'],\n theme: ['theme-light-dark', 'palette'],\n phone: ['phone', 'cellphone'],\n call: ['phone', 'phone-outline'],\n check: ['check', 'check-circle', 'check-bold'],\n tick: ['check', 'check-circle'],\n close: ['close', 'close-circle'],\n dismiss: ['close', 'close-circle'],\n x: ['close'],\n lock: ['lock', 'lock-outline'],\n security: ['lock', 'shield'],\n eye: ['eye', 'eye-off', 'eye-outline'],\n visibility: ['eye', 'eye-off'],\n sort: ['sort', 'sort-ascending', 'sort-descending'],\n filter: ['filter', 'filter-outline'],\n calendar: ['calendar', 'calendar-month'],\n date: ['calendar', 'calendar-month'],\n location: ['map-marker', 'map-marker-outline'],\n pin: ['map-marker', 'pin'],\n share: ['share', 'share-variant'],\n download: ['download', 'cloud-download'],\n upload: ['upload', 'cloud-upload'],\n play: ['play', 'play-circle'],\n pause: ['pause', 'pause-circle'],\n stop: ['stop', 'stop-circle'],\n record: ['record', 'microphone'],\n microphone: ['microphone', 'microphone-outline'],\n mic: ['microphone', 'microphone-outline'],\n menu: ['menu', 'hamburger'],\n list: ['format-list-bulleted', 'view-list'],\n grid: ['view-grid', 'grid'],\n time: ['clock', 'clock-outline'],\n clock: ['clock', 'clock-outline'],\n link: ['link', 'link-variant'],\n attach: ['paperclip', 'attachment'],\n logout: ['logout', 'exit-to-app'],\n login: ['login', 'account-arrow-right'],\n flash: ['flash', 'flash-off', 'flash-auto'],\n home: ['home', 'home-outline', 'home-variant'],\n house: ['home', 'home-outline', 'home-variant'],\n money: ['currency-usd', 'cash', 'cash-multiple', 'wallet'],\n currency: ['currency-usd', 'currency-eur', 'currency-gbp'],\n dollar: ['currency-usd'],\n trending: ['trending-up', 'trending-down', 'chart-line'],\n chart: ['chart-line', 'chart-bar', 'chart-pie', 'chart-donut'],\n graph: ['chart-line', 'chart-bar', 'chart-areaspline'],\n gallery: ['image-multiple', 'view-gallery'],\n image: ['image', 'image-outline', 'image-multiple'],\n cart: ['cart', 'cart-outline', 'cart-plus', 'cart-check'],\n shopping: ['cart', 'shopping', 'basket'],\n wifi: ['wifi', 'wifi-off'],\n bluetooth: ['bluetooth', 'bluetooth-off'],\n volume: ['volume-high', 'volume-medium', 'volume-low', 'volume-off'],\n sound: ['volume-high', 'volume-off', 'music'],\n music: ['music', 'music-note'],\n video: ['video', 'video-outline', 'video-off'],\n file: ['file', 'file-outline', 'file-document'],\n folder: ['folder', 'folder-outline', 'folder-open'],\n document: ['file-document', 'file-document-outline'],\n print: ['printer', 'printer-outline'],\n help: ['help-circle', 'help-circle-outline'],\n question: ['help-circle', 'help-circle-outline'],\n swap: ['swap-horizontal', 'swap-vertical'],\n sync: ['sync', 'cloud-sync'],\n crop: ['crop', 'crop-free'],\n rotate: ['rotate-left', 'rotate-right', 'screen-rotation'],\n fullscreen: ['fullscreen', 'fullscreen-exit'],\n minus: ['minus', 'minus-circle'],\n plus: ['plus', 'plus-circle'],\n brightness: ['brightness-5', 'brightness-6', 'brightness-7'],\n language: ['translate', 'web'],\n globe: ['earth', 'web'],\n world: ['earth', 'web'],\n};\n\nexport function searchIcons(args: SearchIconsArgs): ToolResponse {\n const query = args.query?.toLowerCase() || \"\";\n const limit = args.limit || 40;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n // Resolve aliases: if the query is a known alias, include those icons directly\n const aliasMatches: string[] = [];\n const queryWords = query.split(/\\s+/).filter(Boolean);\n for (const word of queryWords) {\n const aliases = iconSearchAliases[word];\n if (aliases) {\n for (const alias of aliases) {\n // Find all icons that match the alias using boundary matching\n for (const icon of iconsData.icons) {\n const lower = (icon as string).toLowerCase();\n if (lower === alias || lower.startsWith(alias + '-')) {\n if (!aliasMatches.includes(icon as string)) {\n aliasMatches.push(icon as string);\n }\n }\n }\n }\n }\n }\n\n // Filter icons that match the query\n // Use word-boundary matching: split icon names on hyphens, match query words against segments.\n // This prevents \"lock\" from matching \"clock\", \"ash\" from matching \"flash\", etc.\n const hyphenatedQuery = queryWords.join(\"-\");\n\n // Helper: check if an icon matches a single word on segment boundaries\n const matchesWord = (segments: string[], word: string) =>\n segments.some((seg) => seg === word || seg.startsWith(word));\n\n // Helper: check if an icon matches the full hyphenated query on boundaries\n const matchesHyphenated = (lower: string) => {\n if (!lower.includes(hyphenatedQuery)) return false;\n const idx = lower.indexOf(hyphenatedQuery);\n const before = idx === 0 || lower[idx - 1] === \"-\";\n const after =\n idx + hyphenatedQuery.length === lower.length ||\n lower[idx + hyphenatedQuery.length] === \"-\";\n return before && after;\n };\n\n // First pass: AND match (all words must match)\n const andMatches: string[] = [];\n // Second pass: OR match (any word matches) — used as fallback for multi-word queries\n const orOnlyMatches: string[] = [];\n\n for (const icon of iconsData.icons) {\n const lower = (icon as string).toLowerCase();\n const segments = lower.split(\"-\");\n\n if (matchesHyphenated(lower)) {\n andMatches.push(icon as string);\n } else if (queryWords.every((word) => matchesWord(segments, word))) {\n andMatches.push(icon as string);\n } else if (queryWords.length > 1 && queryWords.some((word) => matchesWord(segments, word))) {\n orOnlyMatches.push(icon as string);\n }\n }\n\n // Combine: alias matches first, then AND matches, then OR matches (deduplicated)\n const seen = new Set<string>();\n const matchingIcons: string[] = [];\n for (const list of [aliasMatches, andMatches, orOnlyMatches]) {\n for (const icon of list) {\n if (!seen.has(icon)) {\n seen.add(icon);\n matchingIcons.push(icon);\n }\n }\n }\n\n // Sort by relevance: alias matches first, then AND matches, then OR matches.\n // Within each tier, shorter names (more specific) first, then alphabetical.\n const aliasMatchSet = new Set(aliasMatches);\n const andMatchSet = new Set(andMatches);\n matchingIcons.sort((a: string, b: string) => {\n // Tier: alias (0) > AND (1) > OR (2)\n const aTier = aliasMatchSet.has(a) ? 0 : andMatchSet.has(a) ? 1 : 2;\n const bTier = aliasMatchSet.has(b) ? 0 : andMatchSet.has(b) ? 1 : 2;\n if (aTier !== bTier) return aTier - bTier;\n\n // Icons that START with the query get highest priority\n const aStarts = a.startsWith(hyphenatedQuery) ? 0 : 1;\n const bStarts = b.startsWith(hyphenatedQuery) ? 0 : 1;\n if (aStarts !== bStarts) return aStarts - bStarts;\n // Then sort by number of segments (fewer = more specific)\n const aSegments = a.split(\"-\").length;\n const bSegments = b.split(\"-\").length;\n if (aSegments !== bSegments) return aSegments - bSegments;\n // Then alphabetical\n return a.localeCompare(b);\n });\n\n // Limit results\n const limitedResults = matchingIcons.slice(0, limit);\n\n const result = {\n query,\n total: iconsData.total,\n matches: matchingIcons.length,\n returned: limitedResults.length,\n icons: limitedResults,\n import: \"import { Icon } from '@idealyst/components'; import type { IconName } from '@idealyst/components';\",\n usage: \"IMPORTANT: These icon names are of type `IconName` from '@idealyst/components'. Use them WITHOUT any 'mdi:' prefix — just use the bare name (e.g., 'home', not 'mdi:home'). When building helper functions that return icon names, always type the return as `IconName` — never as `string`. Example: `const icon: IconName = 'home'; function getIcon(status: string): IconName { return 'check'; }`. Using `string` as the return type or adding an 'mdi:' prefix will cause TypeScript compilation errors.\",\n };\n\n return jsonResponse(result);\n}\n\n// ============================================================================\n// Theme Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for theme types\n */\nexport function getThemeTypes(args: GetThemeTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getThemeTypesFromFile(format);\n // Add useTheme usage note to prevent common destructuring mistake\n if (typeof result === 'object' && result !== null) {\n (result as Record<string, unknown>).useThemeNote =\n \"IMPORTANT: useTheme() returns Theme directly — NOT wrapped in an object. \" +\n \"Correct: `const theme = useTheme();` \" +\n \"WRONG: `const { theme } = useTheme();` (causes TS2339). \" +\n \"Theme top-level keys: intents, radii, shadows, colors, sizes, interaction, breakpoints. \" +\n \"For spacing, use component props (padding=\\\"md\\\", gap=\\\"md\\\") — NOT theme.spacing (does NOT exist). \" +\n \"For colors: `style={{ backgroundColor: theme.colors.surface.primary }}`. \" +\n \"For radii: `style={{ borderRadius: theme.radii.md }}`. \" +\n \"For intents: `theme.intents.primary` (NOT theme.colors.intent).\";\n }\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Navigation Tool Handlers\n// ============================================================================\n\n/**\n * Get TypeScript type definitions for navigation types\n */\nexport function getNavigationTypes(args: GetNavigationTypesArgs = {}): ToolResponse {\n const format = args.format || \"both\";\n\n try {\n const result = getNavigationTypesFromFile(format);\n return jsonResponse(result);\n } catch (error) {\n return textResponse(\n `Error: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n// ============================================================================\n// Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get documentation for the translate package\n */\nexport function getTranslateGuide(args: GetTranslateGuideArgs): ToolResponse {\n let topic = args.topic;\n\n // Allow 'api' as alias for 'runtime-api' (consistent with other guide tools)\n if (topic === 'api') {\n topic = 'runtime-api';\n }\n\n const uri = `idealyst://translate/${topic}`;\n const guide = translateGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, runtime-api (or 'api'), babel-plugin, translation-files, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the storage package\n */\nexport function getStorageGuide(args: GetStorageGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://storage/${topic}`;\n const guide = storageGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples, secure`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the audio package\n */\nexport function getAudioGuide(args: GetAudioGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://audio/${topic}`;\n const guide = audioGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the camera package\n */\nexport function getCameraGuide(args: GetCameraGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://camera/${topic}`;\n const guide = cameraGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the files package\n */\nexport function getFilesGuide(args: GetFilesGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://files/${topic}`;\n const guide = filesGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the oauth-client package\n */\nexport function getOauthClientGuide(args: GetOauthClientGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://oauth-client/${topic}`;\n const guide = oauthClientGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the animate package\n */\nexport function getAnimateGuide(args: GetAnimateGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://animate/${topic}`;\n const guide = animateGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the datagrid package\n */\nexport function getDatagridGuide(args: GetDatagridGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://datagrid/${topic}`;\n const guide = datagridGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the datepicker package\n */\nexport function getDatepickerGuide(args: GetDatepickerGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://datepicker/${topic}`;\n const guide = datepickerGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the lottie package\n */\nexport function getLottieGuide(args: GetLottieGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://lottie/${topic}`;\n const guide = lottieGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the markdown package\n */\nexport function getMarkdownGuide(args: GetMarkdownGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://markdown/${topic}`;\n const guide = markdownGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the config package\n */\nexport function getConfigGuide(args: GetConfigGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://config/${topic}`;\n const guide = configGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the charts package\n */\nexport function getChartsGuide(args: GetChartsGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://charts/${topic}`;\n const guide = chartsGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the clipboard package\n */\nexport function getClipboardGuide(args: GetClipboardGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://clipboard/${topic}`;\n const guide = clipboardGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the biometrics package\n */\nexport function getBiometricsGuide(args: GetBiometricsGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://biometrics/${topic}`;\n const guide = biometricsGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n/**\n * Get documentation for the payments package\n */\nexport function getPaymentsGuide(args: GetPaymentsGuideArgs): ToolResponse {\n const topic = args.topic;\n const uri = `idealyst://payments/${topic}`;\n const guide = paymentsGuides[uri];\n\n if (!guide) {\n return textResponse(\n `Topic \"${topic}\" not found. Available topics: overview, api, examples`\n );\n }\n\n return textResponse(guide);\n}\n\n// ============================================================================\n// Package Tool Handlers\n// ============================================================================\n\n/**\n * List all available packages\n */\nexport function listPackages(args: ListPackagesArgs = {}): ToolResponse {\n const category = args.category;\n\n if (category) {\n // Filter by specific category\n const byCategory = getPackagesByCat();\n const packageList = (byCategory[category] || []).map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n description: pkg.description,\n platforms: pkg.platforms,\n documentationStatus: pkg.documentationStatus,\n }));\n\n return jsonResponse(packageList);\n }\n\n // Return all packages grouped by category\n const allPackages = getPackageSummary();\n const grouped = allPackages.reduce(\n (acc, pkg) => {\n const cat = pkg.category;\n if (!acc[cat]) acc[cat] = [];\n acc[cat].push(pkg);\n return acc;\n },\n {} as Record<string, typeof allPackages>\n );\n\n return jsonResponse(grouped);\n}\n\n/**\n * Get detailed documentation for a package\n */\nexport function getPackageDocs(args: GetPackageDocsArgs): ToolResponse {\n const packageName = args.package;\n const section = args.section;\n\n // Handle both formats: \"camera\" and \"@idealyst/camera\"\n const normalizedName = packageName.replace(\"@idealyst/\", \"\").toLowerCase();\n const pkg = packages[normalizedName];\n\n if (!pkg) {\n const availablePackages = Object.keys(packages).join(\", \");\n return textResponse(\n `Package \"${packageName}\" not found. Available packages: ${availablePackages}`\n );\n }\n\n // Build documentation based on section or return all\n let docs = \"\";\n\n if (!section || section === \"overview\") {\n docs += `# ${pkg.name} (${pkg.npmName})\n\n${pkg.description}\n\n**Category:** ${pkg.category}\n**Platforms:** ${pkg.platforms.join(\", \")}\n**Documentation Status:** ${pkg.documentationStatus}\n\n`;\n }\n\n if (!section || section === \"installation\") {\n docs += `## Installation\n\n\\`\\`\\`bash\n${pkg.installation}\n\\`\\`\\`\n\n`;\n if (pkg.peerDependencies && pkg.peerDependencies.length > 0) {\n docs += `### Peer Dependencies\n${pkg.peerDependencies.map((dep) => `- ${dep}`).join(\"\\n\")}\n\n`;\n }\n }\n\n if (!section || section === \"features\") {\n docs += `## Features\n\n${pkg.features.map((f) => `- ${f}`).join(\"\\n\")}\n\n`;\n }\n\n if (!section || section === \"quickstart\") {\n docs += `## Quick Start\n\n\\`\\`\\`tsx\n${pkg.quickStart}\n\\`\\`\\`\n\n`;\n }\n\n if (!section || section === \"api\") {\n if (pkg.apiHighlights && pkg.apiHighlights.length > 0) {\n docs += `## API Highlights\n\n${pkg.apiHighlights.map((api) => `- \\`${api}\\``).join(\"\\n\")}\n\n`;\n }\n }\n\n if (pkg.relatedPackages && pkg.relatedPackages.length > 0) {\n docs += `## Related Packages\n\n${pkg.relatedPackages.map((rp) => `- @idealyst/${rp}`).join(\"\\n\")}\n`;\n }\n\n return textResponse(docs.trim());\n}\n\n/**\n * Search across all packages\n */\nexport function searchPackages(args: SearchPackagesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchPackagesData(query);\n\n if (results.length === 0) {\n return textResponse(\n `No packages found matching \"${query}\". Try searching for: camera, oauth, storage, translate, datagrid, datepicker, navigation, etc.`\n );\n }\n\n const resultList = results.map((pkg) => ({\n name: pkg.name,\n npmName: pkg.npmName,\n category: pkg.category,\n description: pkg.description,\n platforms: pkg.platforms,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Recipe Tool Handlers\n// ============================================================================\n\n/**\n * List all available recipes\n */\nexport function listRecipes(args: ListRecipesArgs = {}): ToolResponse {\n const category = args.category;\n const difficulty = args.difficulty;\n\n let recipeList = getRecipeSummary();\n\n // Filter by category\n if (category) {\n recipeList = recipeList.filter((r) => r.category === category);\n }\n\n // Filter by difficulty\n if (difficulty) {\n recipeList = recipeList.filter((r) => r.difficulty === difficulty);\n }\n\n // Group by category for readability\n if (!category) {\n const grouped = recipeList.reduce(\n (acc, recipe) => {\n if (!acc[recipe.category]) acc[recipe.category] = [];\n acc[recipe.category].push(recipe);\n return acc;\n },\n {} as Record<string, typeof recipeList>\n );\n\n return jsonResponse(grouped);\n }\n\n return jsonResponse(recipeList);\n}\n\n/**\n * Get a complete code recipe\n */\nexport function getRecipe(args: GetRecipeArgs): ToolResponse {\n const recipeId = args.recipe;\n\n // Normalize the recipe ID (handle both \"login-form\" and \"loginForm\" etc)\n const normalizedId = recipeId.toLowerCase().replace(/\\s+/g, \"-\");\n const recipe = recipes[normalizedId];\n\n if (!recipe) {\n const availableRecipes = Object.keys(recipes).join(\", \");\n return textResponse(\n `Recipe \"${recipeId}\" not found.\\n\\nAvailable recipes: ${availableRecipes}`\n );\n }\n\n // Format the recipe as markdown\n const output = `# ${recipe.name}\n\n${recipe.description}\n\n**Category:** ${recipe.category}\n**Difficulty:** ${recipe.difficulty}\n**Required packages:** ${recipe.packages.join(\", \")}\n\n## Code\n\n\\`\\`\\`tsx\n${recipe.code}\n\\`\\`\\`\n\n## Explanation\n\n${recipe.explanation}\n\n${\n recipe.tips && recipe.tips.length > 0\n ? `## Tips\n\n${recipe.tips.map((tip) => `- ${tip}`).join(\"\\n\")}`\n : \"\"\n}\n\n${\n recipe.relatedRecipes && recipe.relatedRecipes.length > 0\n ? `## Related Recipes\n\n${recipe.relatedRecipes.map((r) => `- ${r}`).join(\"\\n\")}`\n : \"\"\n}\n`;\n\n return textResponse(output.trim());\n}\n\n/**\n * Search for recipes\n */\nexport function searchRecipes(args: SearchRecipesArgs): ToolResponse {\n const query = args.query;\n\n if (!query) {\n return textResponse(\"Please provide a search query.\");\n }\n\n const results = searchRecipesData(query);\n\n if (results.length === 0) {\n const allRecipeIds = Object.keys(recipes);\n return textResponse(\n `No recipes found matching \"${query}\". Available recipes: ${allRecipeIds.join(', ')}. Try searching by category (auth, forms, navigation, settings, layout, data, media) or use list_recipes to see all.`\n );\n }\n\n const resultList = results.map((recipe) => ({\n id: Object.entries(recipes).find(([_, r]) => r === recipe)?.[0],\n name: recipe.name,\n description: recipe.description,\n category: recipe.category,\n difficulty: recipe.difficulty,\n packages: recipe.packages,\n }));\n\n return jsonResponse(resultList);\n}\n\n// ============================================================================\n// Install Guide Tool Handlers\n// ============================================================================\n\n/**\n * Get detailed installation guide for a package\n */\nexport function getInstallGuide(args: GetInstallGuideArgs): ToolResponse {\n const packageName = args.package;\n\n if (!packageName) {\n return textResponse(\"Please provide a package name.\");\n }\n\n const guide = getInstallGuideData(packageName);\n\n if (!guide) {\n const availablePackages = Object.keys(installGuides).join(\", \");\n return textResponse(\n `No installation guide found for \"${packageName}\".\\n\\nAvailable packages: ${availablePackages}`\n );\n }\n\n // Format as detailed markdown\n const markdown = formatInstallGuideMarkdown(guide);\n return textResponse(markdown);\n}\n\n// ============================================================================\n// Intro Tool Handlers\n// ============================================================================\n\n/**\n * Get a comprehensive introduction to the Idealyst framework\n */\nexport function getIntro(_args: GetIntroArgs = {}): ToolResponse {\n return textResponse(idealystIntro);\n}\n\n// ============================================================================\n// Handler Registry\n// ============================================================================\n\n/**\n * Map of all tool handlers by name.\n * Use this for dynamic tool dispatch.\n */\nexport const toolHandlers: Record<string, (args: any) => ToolResponse> = {\n list_components: listComponents,\n get_component_docs: getComponentDocs,\n get_component_example: getComponentExample,\n search_components: searchComponents,\n get_component_types: getComponentTypes,\n get_component_examples_ts: getComponentExamplesTs,\n get_cli_usage: getCliUsage,\n search_icons: searchIcons,\n get_theme_types: getThemeTypes,\n get_navigation_types: getNavigationTypes,\n get_translate_guide: getTranslateGuide,\n get_storage_guide: getStorageGuide,\n get_audio_guide: getAudioGuide,\n get_camera_guide: getCameraGuide,\n get_files_guide: getFilesGuide,\n get_oauth_client_guide: getOauthClientGuide,\n get_animate_guide: getAnimateGuide,\n get_datagrid_guide: getDatagridGuide,\n get_datepicker_guide: getDatepickerGuide,\n get_lottie_guide: getLottieGuide,\n get_markdown_guide: getMarkdownGuide,\n get_config_guide: getConfigGuide,\n get_charts_guide: getChartsGuide,\n get_clipboard_guide: getClipboardGuide,\n get_biometrics_guide: getBiometricsGuide,\n get_payments_guide: getPaymentsGuide,\n list_packages: listPackages,\n get_package_docs: getPackageDocs,\n search_packages: searchPackages,\n list_recipes: listRecipes,\n get_recipe: getRecipe,\n search_recipes: searchRecipes,\n get_install_guide: getInstallGuide,\n get_intro: getIntro,\n};\n\n/**\n * Call a tool by name with arguments.\n * Returns a tool response or throws if the tool is not found.\n */\nexport function callTool(name: string, args: Record<string, unknown> = {}): ToolResponse {\n const handler = toolHandlers[name];\n\n if (!handler) {\n return textResponse(`Unknown tool: ${name}`);\n }\n\n return handler(args);\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiHjC,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsKpC,qCAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2NrC,0CAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsP1C,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6SnC;;;ACthCO,IAAM,gBAAwC;AAAA,EACnD,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmE/B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwG1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyP/B,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwH/B;;;ACthBO,IAAM,cAAsC;AAAA,EACjD,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+C7B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6RxB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuR/B;;;ACrmBO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyD9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkOzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HhC;;;AC1ZO,IAAM,cAAsC;AAAA,EACjD,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiE7B,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmQxB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2O/B;;;ACjjBO,IAAM,oBAA4C;AAAA,EACvD,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+CpC,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0D/B,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2GtC;;;ACrNO,IAAM,gBAAwC;AAAA,EACnD,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkD/B,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6O1B,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuQjC;;;ACtiBO,IAAM,iBAAyC;AAAA,EACpD,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6DhC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgJ3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2LlC;;;AC1YO,IAAM,mBAA2C;AAAA,EACtD,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDlC,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqG7B,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0HpC;;;AChRO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2C9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqFzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqIhC;;;ACtQO,IAAM,iBAAyC;AAAA,EACpD,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkDhC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+G3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkIlC;;;ACpSO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+C9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiFzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EhC;;;AC9MO,IAAM,eAAuC;AAAA,EAClD,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8D9B,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuKzB,8BAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmMhC;;;AC/aO,IAAM,kBAA0C;AAAA,EACrD,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyFjC,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwI5B,iCAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuNnC;;;ACzbO,IAAM,mBAA2C;AAAA,EACtD,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkFlC,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwM7B,kCAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0QpC;;;ACriBO,IAAM,iBAAyC;AAAA,EACpD,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgFhC,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0M3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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A,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAC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","names":["__filename","__dirname","searchComponents","getComponentTypes","getThemeTypes","getNavigationTypes","searchPackages","searchRecipes","getInstallGuide"]}