From c70ff528691bd56f5407026c65db4ca90a088ee0 Mon Sep 17 00:00:00 2001 From: liaibo Date: Sun, 23 Nov 2025 10:55:04 +0800 Subject: [PATCH] chore: init monorepo snapshot --- .agent/rules/mnote.md | 5 + .codex/.gitignore | 1 + .gitignore | 25 + CLAUDE.md | 383 + LightRAG/.clinerules/01-basic.md | 232 + LightRAG/.dockerignore | 69 + LightRAG/.gitattributes | 2 + .../.github/ISSUE_TEMPLATE/bug_report.yml | 61 + LightRAG/.github/ISSUE_TEMPLATE/config.yml | 1 + .../ISSUE_TEMPLATE/feature_request.yml | 26 + LightRAG/.github/ISSUE_TEMPLATE/question.yml | 26 + LightRAG/.github/dependabot.yml | 11 + LightRAG/.github/pull_request_template.md | 32 + .../.github/workflows/docker-build-lite.yml | 84 + .../.github/workflows/docker-build-manual.yml | 80 + LightRAG/.github/workflows/docker-publish.yml | 75 + LightRAG/.github/workflows/linting.yaml | 30 + LightRAG/.github/workflows/pypi-publish.yml | 92 + LightRAG/.github/workflows/stale.yaml | 27 + LightRAG/.gitignore | 74 + LightRAG/.pre-commit-config.yaml | 28 + LightRAG/AGENTS.md | 39 + LightRAG/Dockerfile | 107 + LightRAG/Dockerfile.lite | 108 + LightRAG/LICENSE | 21 + LightRAG/MANIFEST.in | 4 + LightRAG/README-zh.md | 1824 ++ .../b2aaf634151b4706892693ffb43d9093.png | Bin 0 -> 482231 bytes .../iShot_2025-03-23_12.40.08.png | Bin 0 -> 410412 bytes LightRAG/README.md | 1978 ++ LightRAG/SECURITY.md | 18 + LightRAG/assets/logo.png | Bin 0 -> 182929 bytes LightRAG/config.ini.example | 37 + LightRAG/docker-build-push.sh | 77 + LightRAG/docker-compose.yml | 21 + LightRAG/docs/Algorithm.md | 4 + LightRAG/docs/DockerDeployment.md | 135 + LightRAG/docs/FrontendBuildGuide.md | 207 + LightRAG/docs/LightRAG_concurrent_explain.md | 114 + LightRAG/docs/OfflineDeployment.md | 317 + LightRAG/docs/UV_LOCK_GUIDE.md | 170 + LightRAG/env.example | 464 + LightRAG/env.ollama-binding-options.example | 195 + LightRAG/examples/generate_query.py | 55 + LightRAG/examples/graph_visual_with_html.py | 34 + LightRAG/examples/graph_visual_with_neo4j.py | 186 + LightRAG/examples/insert_custom_kg.py | 115 + .../examples/lightrag_azure_openai_demo.py | 126 + LightRAG/examples/lightrag_ollama_demo.py | 217 + .../lightrag_openai_compatible_demo.py | 227 + LightRAG/examples/lightrag_openai_demo.py | 189 + .../lightrag_openai_mongodb_graph_demo.py | 107 + LightRAG/examples/modalprocessors_example.py | 229 + LightRAG/examples/raganything_example.py | 286 + LightRAG/examples/rerank_example.py | 232 + .../copy_llm_cache_to_another_storage.py | 114 + .../lightrag_bedrock_demo.py | 59 + .../lightrag_cloudflare_demo.py | 357 + .../unofficial-sample/lightrag_hf_demo.py | 82 + .../lightrag_llamaindex_direct_demo.py | 143 + .../lightrag_llamaindex_litellm_demo.py | 145 + .../lightrag_llamaindex_litellm_opik_demo.py | 156 + .../lightrag_lmdeploy_demo.py | 110 + .../unofficial-sample/lightrag_nvidia_demo.py | 171 + ...lightrag_openai_neo4j_milvus_redis_demo.py | 112 + LightRAG/k8s-deploy/README-zh.md | 191 + LightRAG/k8s-deploy/README.md | 191 + LightRAG/k8s-deploy/databases/00-config.sh | 21 + LightRAG/k8s-deploy/databases/01-prepare.sh | 33 + .../databases/02-install-database.sh | 62 + .../databases/03-uninstall-database.sh | 20 + LightRAG/k8s-deploy/databases/04-cleanup.sh | 26 + LightRAG/k8s-deploy/databases/README.md | 170 + .../databases/elasticsearch/values.yaml | 36 + .../databases/install-kubeblocks.sh | 52 + .../k8s-deploy/databases/mongodb/values.yaml | 34 + .../k8s-deploy/databases/neo4j/values.yaml | 46 + .../databases/postgresql/values.yaml | 33 + .../k8s-deploy/databases/qdrant/values.yaml | 31 + .../k8s-deploy/databases/redis/values.yaml | 34 + .../k8s-deploy/databases/scripts/common.sh | 43 + .../databases/uninstall-kubeblocks.sh | 51 + LightRAG/k8s-deploy/install_lightrag.sh | 95 + LightRAG/k8s-deploy/install_lightrag_dev.sh | 81 + LightRAG/k8s-deploy/lightrag/.helmignore | 23 + LightRAG/k8s-deploy/lightrag/Chart.yaml | 10 + .../k8s-deploy/lightrag/templates/NOTES.txt | 38 + .../lightrag/templates/_helpers.tpl | 42 + .../lightrag/templates/deployment.yaml | 81 + .../k8s-deploy/lightrag/templates/pvc.yaml | 28 + .../k8s-deploy/lightrag/templates/secret.yaml | 10 + .../lightrag/templates/service.yaml | 15 + LightRAG/k8s-deploy/lightrag/values.yaml | 82 + LightRAG/k8s-deploy/uninstall_lightrag.sh | 4 + LightRAG/k8s-deploy/uninstall_lightrag_dev.sh | 4 + LightRAG/lightrag.service.example | 30 + LightRAG/lightrag/__init__.py | 5 + LightRAG/lightrag/api/.gitignore | 2 + LightRAG/lightrag/api/README-zh.md | 626 + .../README.assets/image-20250323122538997.png | Bin 0 -> 383459 bytes .../README.assets/image-20250323122754387.png | Bin 0 -> 365491 bytes .../README.assets/image-20250323123011220.png | Bin 0 -> 543237 bytes .../README.assets/image-20250323194750379.png | Bin 0 -> 390472 bytes LightRAG/lightrag/api/README.md | 623 + LightRAG/lightrag/api/__init__.py | 1 + LightRAG/lightrag/api/auth.py | 109 + LightRAG/lightrag/api/config.py | 549 + LightRAG/lightrag/api/gunicorn_config.py | 162 + LightRAG/lightrag/api/lightrag_server.py | 1398 ++ LightRAG/lightrag/api/routers/__init__.py | 10 + .../lightrag/api/routers/document_routes.py | 2977 +++ LightRAG/lightrag/api/routers/graph_routes.py | 688 + LightRAG/lightrag/api/routers/ollama_api.py | 734 + LightRAG/lightrag/api/routers/query_routes.py | 1162 + LightRAG/lightrag/api/run_with_gunicorn.py | 282 + .../api/static/swagger-ui/favicon-32x32.png | Bin 0 -> 628 bytes .../static/swagger-ui/swagger-ui-bundle.js | 2 + .../api/static/swagger-ui/swagger-ui.css | 3 + LightRAG/lightrag/api/utils_api.py | 342 + LightRAG/lightrag/base.py | 869 + LightRAG/lightrag/constants.py | 111 + .../evaluation/README_EVALUASTION_RAGAS.md | 487 + LightRAG/lightrag/evaluation/__init__.py | 25 + .../lightrag/evaluation/eval_rag_quality.py | 1016 + .../lightrag/evaluation/sample_dataset.json | 34 + .../sample_documents/01_lightrag_overview.md | 17 + .../sample_documents/02_rag_architecture.md | 21 + .../03_lightrag_improvements.md | 25 + .../04_supported_databases.md | 37 + .../05_evaluation_and_deployment.md | 41 + .../evaluation/sample_documents/README.md | 21 + LightRAG/lightrag/exceptions.py | 114 + LightRAG/lightrag/kg/__init__.py | 140 + .../lightrag/kg/deprecated/chroma_impl.py | 342 + LightRAG/lightrag/kg/faiss_impl.py | 541 + LightRAG/lightrag/kg/json_doc_status_impl.py | 401 + LightRAG/lightrag/kg/json_kv_impl.py | 296 + LightRAG/lightrag/kg/memgraph_impl.py | 1140 + LightRAG/lightrag/kg/milvus_impl.py | 1371 ++ LightRAG/lightrag/kg/mongo_impl.py | 2487 +++ LightRAG/lightrag/kg/nano_vector_db_impl.py | 423 + LightRAG/lightrag/kg/neo4j_impl.py | 1796 ++ LightRAG/lightrag/kg/networkx_impl.py | 567 + LightRAG/lightrag/kg/postgres_impl.py | 5116 +++++ LightRAG/lightrag/kg/qdrant_impl.py | 722 + LightRAG/lightrag/kg/redis_impl.py | 1125 + LightRAG/lightrag/kg/shared_storage.py | 1536 ++ LightRAG/lightrag/lightrag.py | 3931 ++++ LightRAG/lightrag/llm/__init__.py | 0 LightRAG/lightrag/llm/anthropic.py | 333 + LightRAG/lightrag/llm/azure_openai.py | 177 + LightRAG/lightrag/llm/bedrock.py | 483 + LightRAG/lightrag/llm/binding_options.py | 740 + .../lightrag/llm/deprecated/siliconcloud.py | 69 + LightRAG/lightrag/llm/gemini.py | 595 + LightRAG/lightrag/llm/hf.py | 175 + LightRAG/lightrag/llm/jina.py | 152 + LightRAG/lightrag/llm/llama_index_impl.py | 208 + LightRAG/lightrag/llm/lmdeploy.py | 154 + LightRAG/lightrag/llm/lollms.py | 175 + LightRAG/lightrag/llm/nvidia_openai.py | 66 + LightRAG/lightrag/llm/ollama.py | 214 + LightRAG/lightrag/llm/openai.py | 686 + LightRAG/lightrag/llm/zhipu.py | 217 + LightRAG/lightrag/namespace.py | 28 + LightRAG/lightrag/operate.py | 4985 +++++ LightRAG/lightrag/prompt.py | 421 + LightRAG/lightrag/rerank.py | 354 + .../tools/README_CLEAN_LLM_QUERY_CACHE.md | 661 + .../tools/README_MIGRATE_LLM_CACHE.md | 471 + LightRAG/lightrag/tools/__init__.py | 0 .../lightrag/tools/check_initialization.py | 180 + .../lightrag/tools/clean_llm_query_cache.py | 1137 + LightRAG/lightrag/tools/download_cache.py | 179 + .../tools/lightrag_visualizer/README-zh.md | 95 + .../tools/lightrag_visualizer/README.md | 136 + .../tools/lightrag_visualizer/__init__.py | 0 .../assets/Geist-Regular.ttf | Bin 0 -> 111644 bytes .../assets/LICENSE - Geist.txt | 92 + .../assets/LICENSE - SmileySans.txt | 93 + .../assets/SmileySans-Oblique.ttf | Bin 0 -> 2629764 bytes .../assets/place_font_here | 0 .../lightrag_visualizer/graph_visualizer.py | 1221 + .../lightrag_visualizer/requirements.txt | 8 + LightRAG/lightrag/tools/migrate_llm_cache.py | 1472 ++ LightRAG/lightrag/types.py | 29 + LightRAG/lightrag/utils.py | 3159 +++ LightRAG/lightrag/utils_graph.py | 1733 ++ LightRAG/lightrag_webui/.gitignore | 24 + LightRAG/lightrag_webui/.prettierrc.json | 10 + LightRAG/lightrag_webui/README.md | 46 + LightRAG/lightrag_webui/bun.lock | 1837 ++ LightRAG/lightrag_webui/components.json | 21 + .../lightrag_webui/env.development.smaple | 4 + LightRAG/lightrag_webui/env.local.sample | 3 + LightRAG/lightrag_webui/eslint.config.js | 36 + LightRAG/lightrag_webui/index.html | 16 + LightRAG/lightrag_webui/package-lock.json | 12019 ++++++++++ LightRAG/lightrag_webui/package.json | 112 + LightRAG/lightrag_webui/public/favicon.png | Bin 0 -> 15675 bytes LightRAG/lightrag_webui/public/logo.svg | 1 + LightRAG/lightrag_webui/src/App.tsx | 230 + LightRAG/lightrag_webui/src/AppRouter.tsx | 95 + LightRAG/lightrag_webui/src/api/lightrag.ts | 817 + .../src/components/ApiKeyAlert.tsx | 86 + .../src/components/AppSettings.tsx | 74 + .../src/components/LanguageToggle.tsx | 49 + .../lightrag_webui/src/components/Root.tsx | 9 + .../src/components/ThemeProvider.tsx | 59 + .../src/components/ThemeToggle.tsx | 41 + .../documents/ClearDocumentsDialog.tsx | 211 + .../documents/DeleteDocumentsDialog.tsx | 191 + .../documents/PipelineStatusDialog.tsx | 269 + .../documents/UploadDocumentsDialog.tsx | 220 + .../components/graph/EditablePropertyRow.tsx | 288 + .../src/components/graph/FocusOnNode.tsx | 54 + .../components/graph/FullScreenControl.tsx | 29 + .../src/components/graph/GraphControl.tsx | 362 + .../src/components/graph/GraphLabels.tsx | 316 + .../src/components/graph/GraphSearch.tsx | 232 + .../src/components/graph/LayoutsControl.tsx | 345 + .../src/components/graph/Legend.tsx | 41 + .../src/components/graph/LegendButton.tsx | 32 + .../src/components/graph/MergeDialog.tsx | 70 + .../src/components/graph/PropertiesView.tsx | 408 + .../components/graph/PropertyEditDialog.tsx | 196 + .../graph/PropertyRowComponents.tsx | 55 + .../src/components/graph/Settings.tsx | 426 + .../src/components/graph/SettingsDisplay.tsx | 21 + .../src/components/graph/ZoomControl.tsx | 109 + .../src/components/retrieval/ChatMessage.tsx | 508 + .../components/retrieval/QuerySettings.tsx | 457 + .../src/components/status/StatusCard.tsx | 91 + .../src/components/status/StatusDialog.tsx | 36 + .../src/components/status/StatusIndicator.tsx | 52 + .../src/components/ui/Alert.tsx | 49 + .../src/components/ui/AlertDialog.tsx | 115 + .../src/components/ui/AsyncSearch.tsx | 242 + .../src/components/ui/AsyncSelect.tsx | 315 + .../src/components/ui/Badge.tsx | 33 + .../src/components/ui/Button.tsx | 78 + .../lightrag_webui/src/components/ui/Card.tsx | 55 + .../src/components/ui/Checkbox.tsx | 26 + .../src/components/ui/Command.tsx | 143 + .../src/components/ui/DataTable.tsx | 64 + .../src/components/ui/Dialog.tsx | 102 + .../src/components/ui/EmptyCard.tsx | 38 + .../src/components/ui/FileUploader.tsx | 454 + .../src/components/ui/Input.tsx | 21 + .../src/components/ui/NumberInput.tsx | 131 + .../src/components/ui/PaginationControls.tsx | 259 + .../src/components/ui/Popover.tsx | 39 + .../src/components/ui/Progress.tsx | 23 + .../src/components/ui/ScrollArea.tsx | 44 + .../src/components/ui/Select.tsx | 151 + .../src/components/ui/Separator.tsx | 24 + .../src/components/ui/TabContent.tsx | 37 + .../src/components/ui/Table.tsx | 96 + .../lightrag_webui/src/components/ui/Tabs.tsx | 57 + .../lightrag_webui/src/components/ui/Text.tsx | 49 + .../src/components/ui/Textarea.tsx | 25 + .../src/components/ui/Tooltip.tsx | 52 + .../ui/UserPromptInputWithHistory.tsx | 203 + .../src/contexts/TabVisibilityProvider.tsx | 59 + .../lightrag_webui/src/contexts/context.ts | 12 + LightRAG/lightrag_webui/src/contexts/types.ts | 5 + .../src/contexts/useTabVisibility.ts | 17 + .../lightrag_webui/src/features/ApiSite.tsx | 40 + .../src/features/DocumentManager.tsx | 1480 ++ .../src/features/GraphViewer.tsx | 260 + .../lightrag_webui/src/features/LoginPage.tsx | 210 + .../src/features/RetrievalTesting.tsx | 824 + .../src/features/SiteHeader.tsx | 149 + .../lightrag_webui/src/hooks/useDebounce.tsx | 17 + .../src/hooks/useLightragGraph.tsx | 961 + .../src/hooks/useRandomGraph.tsx | 75 + .../lightrag_webui/src/hooks/useTheme.tsx | 12 + LightRAG/lightrag_webui/src/i18n.ts | 52 + LightRAG/lightrag_webui/src/index.css | 214 + LightRAG/lightrag_webui/src/lib/constants.ts | 89 + LightRAG/lightrag_webui/src/lib/extensions.ts | 4 + LightRAG/lightrag_webui/src/lib/utils.ts | 67 + LightRAG/lightrag_webui/src/locales/ar.json | 465 + LightRAG/lightrag_webui/src/locales/en.json | 465 + LightRAG/lightrag_webui/src/locales/fr.json | 465 + LightRAG/lightrag_webui/src/locales/zh.json | 465 + .../lightrag_webui/src/locales/zh_TW.json | 465 + LightRAG/lightrag_webui/src/main.tsx | 14 + .../lightrag_webui/src/services/navigation.ts | 85 + LightRAG/lightrag_webui/src/stores/graph.ts | 382 + .../lightrag_webui/src/stores/settings.ts | 352 + LightRAG/lightrag_webui/src/stores/state.ts | 316 + LightRAG/lightrag_webui/src/types/katex.d.ts | 1 + .../src/utils/SearchHistoryManager.ts | 259 + .../lightrag_webui/src/utils/clipboard.ts | 198 + .../lightrag_webui/src/utils/graphColor.ts | 228 + .../src/utils/remarkFootnotes.ts | 65 + LightRAG/lightrag_webui/src/vite-env.d.ts | 11 + LightRAG/lightrag_webui/tailwind.config.js | 269 + LightRAG/lightrag_webui/tsconfig.json | 30 + LightRAG/lightrag_webui/vite.config.ts | 49 + LightRAG/paging.md | 251 + LightRAG/pyproject.toml | 163 + LightRAG/reproduce/Step_0.py | 69 + LightRAG/reproduce/Step_1.py | 51 + .../reproduce/Step_1_openai_compatible.py | 86 + LightRAG/reproduce/Step_2.py | 78 + LightRAG/reproduce/Step_3.py | 66 + .../reproduce/Step_3_openai_compatible.py | 103 + LightRAG/reproduce/batch_eval.py | 112 + LightRAG/requirements-offline-llm.txt | 19 + LightRAG/requirements-offline-storage.txt | 16 + LightRAG/requirements-offline.txt | 33 + LightRAG/setup.py | 6 + LightRAG/tests/test_aquery_data_endpoint.py | 768 + LightRAG/tests/test_curl_aquery_data.sh | 271 + LightRAG/tests/test_graph_storage.py | 1301 ++ LightRAG/tests/test_lightrag_ollama_chat.py | 855 + .../tests/test_postgres_retry_integration.py | 338 + .../tests/test_write_json_optimization.py | 387 + LightRAG/uv.lock | 7350 ++++++ design/PHASE_1.5_TURN_TO_PAGE_EXACT_CLONE.md | 217 + design/design.md | 130 + design/design3.0.md | 185 + design/grok的思维导图方案.md | 192 + design/stage0-2.0.md | 304 + design/stage0.md | 169 + design/stage1.md | 323 + design/ui_react.md | 164 + design/思维导图方案.md | 207 + design/表格方案.md | 179 + package-lock.json | 71 + package.json | 8 + scrape_wolai.js | 44 + scraped_docs/todolist.md | 96 + scraped_docs/功能概览.md | 120 + scraped_docs/图片.md | 123 + scraped_docs/块引用.md | 94 + scraped_docs/垃圾桶.md | 16 + scraped_docs/基本编辑.md | 147 + scraped_docs/搜索选项.md | 53 + scraped_docs/数字列表.md | 61 + scraped_docs/斜杠菜单.md | 153 + scraped_docs/标题.md | 116 + scraped_docs/页面定义.md | 74 + scraped_docs/页面引用.md | 138 + scraped_docs/页面选项.md | 205 + scripts/desktop-hot.js | 169 + scripts/wolai_scraper.py | 346 + services/ingest_service/app/api/routes.py | 38 + services/ingest_service/app/core/config.py | 28 + services/ingest_service/app/core/logging.py | 27 + services/ingest_service/app/main.py | 26 + services/ingest_service/app/models/job.py | 32 + services/ingest_service/app/schemas/job.py | 24 + .../ingest_service/app/services/embeddings.py | 35 + .../ingest_service/app/services/job_store.py | 24 + .../ingest_service/app/services/runtime.py | 42 + .../ingest_service/app/services/scheduler.py | 41 + services/ingest_service/app/services/tasks.py | 125 + .../ingest_service/app/services/webhooks.py | 26 + services/mineru/README.md | 53 + services/mineru/requirements.txt | 5 + services/mineru/setup.ps1 | 67 + services/mineru/src/.gitattributes | 5 + .../src/.github/ISSUE_TEMPLATE/bug_report.yml | 155 + .../src/.github/ISSUE_TEMPLATE/config.yml | 11 + .../src/.github/pull_request_template.md | 32 + services/mineru/src/.github/workflows/cla.yml | 43 + services/mineru/src/.github/workflows/cli.yml | 48 + .../mineru/src/.github/workflows/mkdocs.yml | 22 + .../src/.github/workflows/python-package.yml | 144 + .../mineru/src/.github/workflows/rerun.yml | 23 + services/mineru/src/.gitignore | 53 + services/mineru/src/LICENSE.md | 662 + services/mineru/src/MinerU_CLA.md | 14 + services/mineru/src/README.md | 844 + services/mineru/src/README_zh-CN.md | 834 + services/mineru/src/SECURITY.md | 31 + services/mineru/src/demo/demo.py | 240 + services/mineru/src/demo/pdfs/demo1.pdf | Bin 0 -> 336919 bytes services/mineru/src/demo/pdfs/demo2.pdf | Bin 0 -> 1808096 bytes services/mineru/src/demo/pdfs/demo3.pdf | Bin 0 -> 433192 bytes services/mineru/src/demo/pdfs/small_ocr.pdf | Bin 0 -> 453816 bytes services/mineru/src/docker/china/Dockerfile | 33 + services/mineru/src/docker/compose.yaml | 88 + services/mineru/src/docker/global/Dockerfile | 27 + .../src/docs/assets/images/BISHENG_01.png | Bin 0 -> 97979 bytes .../docs/assets/images/Cherry_Studio_1.png | Bin 0 -> 34832 bytes .../docs/assets/images/Cherry_Studio_2.png | Bin 0 -> 52399 bytes .../docs/assets/images/Cherry_Studio_3.png | Bin 0 -> 74234 bytes .../docs/assets/images/Cherry_Studio_4.png | Bin 0 -> 56600 bytes .../docs/assets/images/Cherry_Studio_5.png | Bin 0 -> 65315 bytes .../docs/assets/images/Cherry_Studio_6.png | Bin 0 -> 76682 bytes .../docs/assets/images/Cherry_Studio_7.png | Bin 0 -> 57840 bytes .../docs/assets/images/Cherry_Studio_8.png | Bin 0 -> 28293 bytes .../mineru/src/docs/assets/images/Coze_1.png | Bin 0 -> 65397 bytes .../mineru/src/docs/assets/images/Coze_10.png | Bin 0 -> 90087 bytes .../mineru/src/docs/assets/images/Coze_11.png | Bin 0 -> 77793 bytes .../mineru/src/docs/assets/images/Coze_12.png | Bin 0 -> 112095 bytes .../mineru/src/docs/assets/images/Coze_13.png | Bin 0 -> 80918 bytes .../mineru/src/docs/assets/images/Coze_14.png | Bin 0 -> 106849 bytes .../mineru/src/docs/assets/images/Coze_15.png | Bin 0 -> 73860 bytes .../mineru/src/docs/assets/images/Coze_16.png | Bin 0 -> 88736 bytes .../mineru/src/docs/assets/images/Coze_17.png | Bin 0 -> 206224 bytes .../mineru/src/docs/assets/images/Coze_18.png | Bin 0 -> 267118 bytes .../mineru/src/docs/assets/images/Coze_19.png | Bin 0 -> 267444 bytes .../mineru/src/docs/assets/images/Coze_2.png | Bin 0 -> 54223 bytes .../mineru/src/docs/assets/images/Coze_20.png | Bin 0 -> 148124 bytes .../mineru/src/docs/assets/images/Coze_21.png | Bin 0 -> 133467 bytes .../mineru/src/docs/assets/images/Coze_3.png | Bin 0 -> 96932 bytes .../mineru/src/docs/assets/images/Coze_4.png | Bin 0 -> 113065 bytes .../mineru/src/docs/assets/images/Coze_5.png | Bin 0 -> 104661 bytes .../mineru/src/docs/assets/images/Coze_6.png | Bin 0 -> 103488 bytes .../mineru/src/docs/assets/images/Coze_7.png | Bin 0 -> 218685 bytes .../mineru/src/docs/assets/images/Coze_8.png | Bin 0 -> 154740 bytes .../mineru/src/docs/assets/images/Coze_9.png | Bin 0 -> 85381 bytes .../src/docs/assets/images/DataFLow_01.png | Bin 0 -> 90767 bytes .../src/docs/assets/images/DataFlow_02.png | Bin 0 -> 150583 bytes .../mineru/src/docs/assets/images/Dify_1.png | Bin 0 -> 110270 bytes .../mineru/src/docs/assets/images/Dify_10.png | Bin 0 -> 82641 bytes .../mineru/src/docs/assets/images/Dify_11.png | Bin 0 -> 87072 bytes .../mineru/src/docs/assets/images/Dify_12.png | Bin 0 -> 131759 bytes .../mineru/src/docs/assets/images/Dify_13.png | Bin 0 -> 35605 bytes .../mineru/src/docs/assets/images/Dify_14.png | Bin 0 -> 255288 bytes .../mineru/src/docs/assets/images/Dify_15.png | Bin 0 -> 260866 bytes .../mineru/src/docs/assets/images/Dify_16.png | Bin 0 -> 109375 bytes .../mineru/src/docs/assets/images/Dify_17.png | Bin 0 -> 127890 bytes .../mineru/src/docs/assets/images/Dify_18.png | Bin 0 -> 183978 bytes .../mineru/src/docs/assets/images/Dify_19.png | Bin 0 -> 107977 bytes .../mineru/src/docs/assets/images/Dify_2.png | Bin 0 -> 242142 bytes .../mineru/src/docs/assets/images/Dify_20.png | Bin 0 -> 180900 bytes .../mineru/src/docs/assets/images/Dify_21.png | Bin 0 -> 78895 bytes .../mineru/src/docs/assets/images/Dify_22.png | Bin 0 -> 121013 bytes .../mineru/src/docs/assets/images/Dify_23.png | Bin 0 -> 96518 bytes .../mineru/src/docs/assets/images/Dify_24.png | Bin 0 -> 136008 bytes .../mineru/src/docs/assets/images/Dify_25.png | Bin 0 -> 164431 bytes .../mineru/src/docs/assets/images/Dify_26.png | Bin 0 -> 194725 bytes .../mineru/src/docs/assets/images/Dify_3.png | Bin 0 -> 269523 bytes .../mineru/src/docs/assets/images/Dify_4.png | Bin 0 -> 270066 bytes .../mineru/src/docs/assets/images/Dify_5.png | Bin 0 -> 267514 bytes .../mineru/src/docs/assets/images/Dify_6.png | Bin 0 -> 293418 bytes .../mineru/src/docs/assets/images/Dify_7.png | Bin 0 -> 51231 bytes .../mineru/src/docs/assets/images/Dify_8.png | Bin 0 -> 139492 bytes .../mineru/src/docs/assets/images/Dify_9.png | Bin 0 -> 112347 bytes .../src/docs/assets/images/DingTalk_01.png | Bin 0 -> 135808 bytes .../src/docs/assets/images/FastGPT_01.png | Bin 0 -> 189775 bytes .../src/docs/assets/images/FastGPT_02.png | Bin 0 -> 94325 bytes .../src/docs/assets/images/ModelWhale_01.png | Bin 0 -> 252396 bytes .../src/docs/assets/images/ModelWhale_02.png | Bin 0 -> 72382 bytes .../src/docs/assets/images/ModelWhale_1.png | Bin 0 -> 74017 bytes .../src/docs/assets/images/RagFlow_01.png | Bin 0 -> 512259 bytes .../mineru/src/docs/assets/images/Sider_1.png | Bin 0 -> 63624 bytes .../mineru/src/docs/assets/images/coze_0.png | Bin 0 -> 94649 bytes .../mineru/src/docs/assets/images/n8n_0.png | Bin 0 -> 282715 bytes .../mineru/src/docs/assets/images/n8n_1.png | Bin 0 -> 68289 bytes .../mineru/src/docs/assets/images/n8n_10.png | Bin 0 -> 14708 bytes .../mineru/src/docs/assets/images/n8n_2.png | Bin 0 -> 75840 bytes .../mineru/src/docs/assets/images/n8n_3.png | Bin 0 -> 73065 bytes .../mineru/src/docs/assets/images/n8n_4.png | Bin 0 -> 74175 bytes .../mineru/src/docs/assets/images/n8n_5.png | Bin 0 -> 72128 bytes .../mineru/src/docs/assets/images/n8n_6.png | Bin 0 -> 64616 bytes .../mineru/src/docs/assets/images/n8n_7.png | Bin 0 -> 23958 bytes .../mineru/src/docs/assets/images/n8n_8.png | Bin 0 -> 33541 bytes .../mineru/src/docs/assets/images/n8n_9.png | Bin 0 -> 91448 bytes .../introduction.pdf | Bin 0 -> 558221 bytes .../introduction.xmind | Bin 0 -> 715155 bytes services/mineru/src/docs/en/demo/index.md | 2 + services/mineru/src/docs/en/faq/index.md | 30 + services/mineru/src/docs/en/index.md | 70 + .../docs/en/quick_start/docker_deployment.md | 87 + .../docs/en/quick_start/extension_modules.md | 29 + .../mineru/src/docs/en/quick_start/index.md | 129 + .../src/docs/en/reference/output_files.md | 712 + .../docs/en/usage/advanced_cli_parameters.md | 52 + .../mineru/src/docs/en/usage/cli_tools.md | 113 + services/mineru/src/docs/en/usage/index.md | 16 + .../mineru/src/docs/en/usage/model_source.md | 55 + .../mineru/src/docs/en/usage/quick_usage.md | 112 + .../mineru/src/docs/images/MinerU-logo.png | Bin 0 -> 18077 bytes .../mineru/src/docs/images/datalab_logo.png | Bin 0 -> 98379 bytes .../mineru/src/docs/images/flowchart_en.png | Bin 0 -> 107478 bytes .../src/docs/images/flowchart_zh_cn.png | Bin 0 -> 108154 bytes .../mineru/src/docs/images/layout_example.png | Bin 0 -> 641054 bytes services/mineru/src/docs/images/logo.png | Bin 0 -> 8722 bytes services/mineru/src/docs/images/logo.svg | 22 + services/mineru/src/docs/images/poly.png | Bin 0 -> 13205 bytes .../src/docs/images/project_panorama_en.png | Bin 0 -> 268435 bytes .../docs/images/project_panorama_zh_cn.png | Bin 0 -> 253127 bytes .../mineru/src/docs/images/spans_example.png | Bin 0 -> 563296 bytes services/mineru/src/docs/requirements.txt | 4 + services/mineru/src/docs/zh/demo/index.md | 1 + services/mineru/src/docs/zh/faq/index.md | 29 + services/mineru/src/docs/zh/index.md | 69 + .../docs/zh/quick_start/docker_deployment.md | 86 + .../docs/zh/quick_start/extension_modules.md | 29 + .../mineru/src/docs/zh/quick_start/index.md | 134 + .../src/docs/zh/reference/output_files.md | 827 + .../docs/zh/usage/acceleration_cards/AMD.md | 365 + .../zh/usage/acceleration_cards/Ascend.md | 64 + .../docs/zh/usage/acceleration_cards/METAX.md | 117 + .../zh/usage/acceleration_cards/Tecorigin.md | 73 + .../docs/zh/usage/advanced_cli_parameters.md | 53 + .../mineru/src/docs/zh/usage/cli_tools.md | 108 + services/mineru/src/docs/zh/usage/index.md | 33 + .../mineru/src/docs/zh/usage/model_source.md | 56 + .../src/docs/zh/usage/plugin/BISHENG.md | 11 + .../src/docs/zh/usage/plugin/Cherry_Studio.md | 238 + .../mineru/src/docs/zh/usage/plugin/Coze.md | 92 + .../src/docs/zh/usage/plugin/DataFlow.md | 11 + .../mineru/src/docs/zh/usage/plugin/Dify.md | 171 + .../src/docs/zh/usage/plugin/DingTalk.md | 12 + .../src/docs/zh/usage/plugin/FastGPT.md | 13 + .../src/docs/zh/usage/plugin/ModelWhale.md | 18 + .../src/docs/zh/usage/plugin/RagFlow.md | 9 + .../mineru/src/docs/zh/usage/plugin/Sider.md | 10 + .../mineru/src/docs/zh/usage/plugin/n8n.md | 54 + .../mineru/src/docs/zh/usage/quick_usage.md | 110 + services/mineru/src/mineru.egg-info/PKG-INFO | 925 + .../mineru/src/mineru.egg-info/SOURCES.txt | 190 + .../src/mineru.egg-info/dependency_links.txt | 1 + .../src/mineru.egg-info/entry_points.txt | 6 + .../mineru/src/mineru.egg-info/not-zip-safe | 1 + .../mineru/src/mineru.egg-info/requires.txt | 73 + .../mineru/src/mineru.egg-info/top_level.txt | 1 + services/mineru/src/mineru.template.json | 30 + services/mineru/src/mineru/__init__.py | 1 + .../mineru/src/mineru/backend/__init__.py | 1 + .../src/mineru/backend/pipeline/__init__.py | 1 + .../mineru/backend/pipeline/batch_analyze.py | 428 + .../src/mineru/backend/pipeline/model_init.py | 270 + .../pipeline/model_json_to_middle_json.py | 263 + .../src/mineru/backend/pipeline/model_list.py | 9 + .../src/mineru/backend/pipeline/para_split.py | 381 + .../backend/pipeline/pipeline_analyze.py | 209 + .../backend/pipeline/pipeline_magic_model.py | 373 + .../pipeline_middle_json_mkcontent.py | 323 + services/mineru/src/mineru/backend/utils.py | 24 + .../mineru/src/mineru/backend/vlm/__init__.py | 1 + .../vlm/model_output_to_middle_json.py | 123 + .../mineru/src/mineru/backend/vlm/utils.py | 75 + .../src/mineru/backend/vlm/vlm_analyze.py | 187 + .../src/mineru/backend/vlm/vlm_magic_model.py | 600 + .../backend/vlm/vlm_middle_json_mkcontent.py | 277 + services/mineru/src/mineru/cli/__init__.py | 1 + services/mineru/src/mineru/cli/client.py | 223 + services/mineru/src/mineru/cli/common.py | 404 + services/mineru/src/mineru/cli/fast_api.py | 282 + services/mineru/src/mineru/cli/gradio_app.py | 456 + .../mineru/src/mineru/cli/models_download.py | 154 + .../mineru/src/mineru/cli/vlm_vllm_server.py | 4 + services/mineru/src/mineru/data/__init__.py | 1 + .../data/data_reader_writer/__init__.py | 17 + .../mineru/data/data_reader_writer/base.py | 63 + .../mineru/data/data_reader_writer/dummy.py | 11 + .../data/data_reader_writer/filebase.py | 62 + .../data_reader_writer/multi_bucket_s3.py | 144 + .../src/mineru/data/data_reader_writer/s3.py | 72 + .../mineru/src/mineru/data/io/__init__.py | 6 + services/mineru/src/mineru/data/io/base.py | 42 + services/mineru/src/mineru/data/io/http.py | 37 + services/mineru/src/mineru/data/io/s3.py | 114 + .../mineru/src/mineru/data/utils/__init__.py | 1 + .../src/mineru/data/utils/exceptions.py | 40 + .../src/mineru/data/utils/path_utils.py | 33 + .../mineru/src/mineru/data/utils/schemas.py | 20 + services/mineru/src/mineru/model/__init__.py | 1 + .../src/mineru/model/layout/__init__.py | 1 + .../src/mineru/model/layout/doclayoutyolo.py | 119 + .../mineru/src/mineru/model/mfd/__init__.py | 1 + .../mineru/src/mineru/model/mfd/yolo_v8.py | 106 + .../mineru/src/mineru/model/mfr/__init__.py | 1 + .../mfr/pp_formulanet_plus_m/__init__.py | 0 .../pp_formulanet_plus_m/predict_formula.py | 152 + .../mfr/pp_formulanet_plus_m/processors.py | 657 + .../mineru/model/mfr/unimernet/Unimernet.py | 139 + .../mineru/model/mfr/unimernet/__init__.py | 0 .../mfr/unimernet/unimernet_hf/__init__.py | 13 + .../unimernet_hf/modeling_unimernet.py | 176 + .../unimernet_hf/unimer_mbart/__init__.py | 8 + .../configuration_unimer_mbart.py | 163 + .../unimer_mbart/modeling_unimer_mbart.py | 2361 ++ .../unimer_mbart/tokenization_unimer_mbart.py | 0 .../unimernet_hf/unimer_swin/__init__.py | 9 + .../unimer_swin/configuration_unimer_swin.py | 132 + .../image_processing_unimer_swin.py | 174 + .../unimer_swin/modeling_unimer_swin.py | 1084 + services/mineru/src/mineru/model/mfr/utils.py | 338 + .../mineru/src/mineru/model/ocr/__init__.py | 1 + .../src/mineru/model/ocr/pytorch_paddle.py | 300 + .../src/mineru/model/ori_cls/__init__.py | 1 + .../mineru/model/ori_cls/paddle_ori_cls.py | 282 + .../mineru/model/reading_order/__init__.py | 1 + .../model/reading_order/layout_reader.py | 125 + .../src/mineru/model/reading_order/xycut.py | 242 + .../mineru/src/mineru/model/table/__init__.py | 1 + .../src/mineru/model/table/cls/__init__.py | 1 + .../model/table/cls/paddle_table_cls.py | 148 + .../src/mineru/model/table/rec/RapidTable.py | 154 + .../src/mineru/model/table/rec/__init__.py | 1 + .../model/table/rec/slanet_plus/__init__.py | 0 .../model/table/rec/slanet_plus/main.py | 212 + .../model/table/rec/slanet_plus/matcher.py | 198 + .../table/rec/slanet_plus/matcher_utils.py | 246 + .../table/rec/slanet_plus/table_structure.py | 113 + .../rec/slanet_plus/table_structure_utils.py | 570 + .../model/table/rec/unet_table/__init__.py | 0 .../mineru/model/table/rec/unet_table/main.py | 349 + .../table/rec/unet_table/table_recover.py | 214 + .../rec/unet_table/table_structure_unet.py | 211 + .../model/table/rec/unet_table/utils.py | 492 + .../rec/unet_table/utils_table_line_rec.py | 347 + .../rec/unet_table/utils_table_recover.py | 311 + .../mineru/src/mineru/model/utils/__init__.py | 1 + .../mineru/model/utils/pytorchocr/__init__.py | 0 .../model/utils/pytorchocr/base_ocr_v20.py | 39 + .../model/utils/pytorchocr/data/__init__.py | 8 + .../utils/pytorchocr/data/imaug/__init__.py | 48 + .../utils/pytorchocr/data/imaug/operators.py | 418 + .../utils/pytorchocr/modeling/__init__.py | 0 .../modeling/architectures/__init__.py | 25 + .../modeling/architectures/base_model.py | 105 + .../pytorchocr/modeling/backbones/__init__.py | 66 + .../modeling/backbones/det_mobilenet_v3.py | 269 + .../modeling/backbones/rec_donut_swin.py | 1277 ++ .../modeling/backbones/rec_hgnet.py | 290 + .../modeling/backbones/rec_lcnetv3.py | 516 + .../modeling/backbones/rec_mobilenet_v3.py | 136 + .../modeling/backbones/rec_mv1_enhance.py | 234 + .../modeling/backbones/rec_pphgnetv2.py | 1642 ++ .../modeling/backbones/rec_svtrnet.py | 638 + .../model/utils/pytorchocr/modeling/common.py | 76 + .../pytorchocr/modeling/heads/__init__.py | 45 + .../pytorchocr/modeling/heads/cls_head.py | 23 + .../pytorchocr/modeling/heads/det_db_head.py | 109 + .../pytorchocr/modeling/heads/rec_ctc_head.py | 54 + .../modeling/heads/rec_multi_head.py | 58 + .../modeling/heads/rec_ppformulanet_head.py | 1383 ++ .../modeling/heads/rec_unimernet_head.py | 2631 +++ .../pytorchocr/modeling/necks/__init__.py | 29 + .../utils/pytorchocr/modeling/necks/db_fpn.py | 456 + .../pytorchocr/modeling/necks/intracl.py | 117 + .../utils/pytorchocr/modeling/necks/rnn.py | 241 + .../utils/pytorchocr/postprocess/__init__.py | 33 + .../pytorchocr/postprocess/cls_postprocess.py | 20 + .../pytorchocr/postprocess/db_postprocess.py | 179 + .../pytorchocr/postprocess/rec_postprocess.py | 789 + .../model/utils/pytorchocr/utils/__init__.py | 0 .../utils/resources/arch_config.yaml | 461 + .../utils/resources/dict/ka_dict.txt | 153 + .../utils/resources/dict/ppocrv4_doc_dict.txt | 15629 +++++++++++++ .../resources/dict/ppocrv5_arabic_dict.txt | 747 + .../resources/dict/ppocrv5_cyrillic_dict.txt | 850 + .../dict/ppocrv5_devanagari_dict.txt | 568 + .../utils/resources/dict/ppocrv5_dict.txt | 18383 ++++++++++++++++ .../utils/resources/dict/ppocrv5_el_dict.txt | 354 + .../utils/resources/dict/ppocrv5_en_dict.txt | 436 + .../resources/dict/ppocrv5_eslav_dict.txt | 517 + .../resources/dict/ppocrv5_korean_dict.txt | 11945 ++++++++++ .../resources/dict/ppocrv5_latin_dict.txt | 836 + .../utils/resources/dict/ppocrv5_ta_dict.txt | 513 + .../utils/resources/dict/ppocrv5_te_dict.txt | 540 + .../utils/resources/dict/ppocrv5_th_dict.txt | 524 + .../utils/resources/models_config.yml | 69 + .../resources/pp_formulanet_arch_config.yaml | 24 + .../src/mineru/model/utils/tools/__init__.py | 1 + .../model/utils/tools/infer/__init__.py | 1 + .../model/utils/tools/infer/predict_cls.py | 106 + .../model/utils/tools/infer/predict_det.py | 342 + .../model/utils/tools/infer/predict_rec.py | 437 + .../model/utils/tools/infer/predict_system.py | 104 + .../utils/tools/infer/pytorchocr_utility.py | 227 + .../mineru/model/vlm_vllm_model/__init__.py | 0 .../src/mineru/model/vlm_vllm_model/server.py | 65 + .../resources/fasttext-langdetect/lid.176.ftz | Bin 0 -> 938013 bytes .../mineru/src/mineru/resources/header.html | 137 + services/mineru/src/mineru/utils/__init__.py | 1 + .../mineru/src/mineru/utils/block_pre_proc.py | 251 + .../mineru/src/mineru/utils/block_sort.py | 340 + services/mineru/src/mineru/utils/boxbase.py | 203 + .../mineru/src/mineru/utils/check_sys_env.py | 34 + .../mineru/src/mineru/utils/cli_parser.py | 38 + .../mineru/src/mineru/utils/config_reader.py | 136 + services/mineru/src/mineru/utils/cut_image.py | 27 + services/mineru/src/mineru/utils/draw_bbox.py | 489 + .../mineru/src/mineru/utils/enum_class.py | 89 + .../mineru/src/mineru/utils/format_utils.py | 342 + .../src/mineru/utils/guess_suffix_or_lang.py | 28 + .../mineru/src/mineru/utils/hash_utils.py | 30 + services/mineru/src/mineru/utils/language.py | 57 + services/mineru/src/mineru/utils/llm_aided.py | 128 + .../src/mineru/utils/magic_model_utils.py | 168 + .../mineru/src/mineru/utils/model_utils.py | 449 + .../src/mineru/utils/models_download_utils.py | 75 + services/mineru/src/mineru/utils/ocr_utils.py | 459 + .../mineru/src/mineru/utils/os_env_config.py | 30 + .../mineru/src/mineru/utils/pdf_classify.py | 266 + .../src/mineru/utils/pdf_image_tools.py | 230 + .../mineru/src/mineru/utils/pdf_page_id.py | 10 + .../mineru/src/mineru/utils/pdf_reader.py | 112 + .../mineru/src/mineru/utils/pdf_text_tool.py | 40 + services/mineru/src/mineru/utils/run_async.py | 52 + .../mineru/src/mineru/utils/span_block_fix.py | 244 + .../mineru/src/mineru/utils/span_pre_proc.py | 340 + .../mineru/src/mineru/utils/table_merge.py | 427 + services/mineru/src/mineru/version.py | 1 + services/mineru/src/mkdocs.yml | 143 + services/mineru/src/projects/README.md | 10 + services/mineru/src/projects/README_zh-CN.md | 10 + services/mineru/src/projects/mcp/.gitignore | 12 + .../mineru/src/projects/mcp/DOCKER_README.md | 164 + services/mineru/src/projects/mcp/Dockerfile | 35 + services/mineru/src/projects/mcp/README.md | 346 + .../src/projects/mcp/docker-compose.yml | 14 + .../mineru/src/projects/mcp/pyproject.toml | 39 + .../mineru/src/projects/mcp/src/mineru/api.py | 729 + .../mineru/src/projects/mcp/src/mineru/cli.py | 73 + .../src/projects/mcp/src/mineru/config.py | 91 + .../src/projects/mcp/src/mineru/examples.py | 76 + .../src/projects/mcp/src/mineru/language.py | 106 + .../src/projects/mcp/src/mineru/server.py | 1060 + .../src/projects/mineru_tianshu/README.md | 565 + .../src/projects/mineru_tianshu/api_server.py | 433 + .../projects/mineru_tianshu/client_example.py | 318 + .../mineru_tianshu/litserve_worker.py | 546 + .../projects/mineru_tianshu/requirements.txt | 32 + .../src/projects/mineru_tianshu/start_all.py | 256 + .../src/projects/mineru_tianshu/task_db.py | 436 + .../projects/mineru_tianshu/task_scheduler.py | 270 + .../src/projects/multi_gpu_v2/README.md | 85 + .../src/projects/multi_gpu_v2/README_zh.md | 87 + .../projects/multi_gpu_v2/_config_endpoint.py | 60 + .../src/projects/multi_gpu_v2/client.py | 82 + .../src/projects/multi_gpu_v2/server.py | 108 + services/mineru/src/pyproject.toml | 153 + ...e6ce50b9c617f7caae7cbefafd2b4da32ed077.jpg | Bin 0 -> 75215 bytes ...0a8a0aa2f70971455d3b284b4a68a2db4b654e.jpg | Bin 0 -> 16513 bytes ...9ed3619ca82b32c70aea2a69321b4a12172807.jpg | Bin 0 -> 55999 bytes .../test/auto/test.md | 13 + .../test/auto/test_content_list.json | 103 + .../test/auto/test_middle.json | 969 + .../test/auto/test_model.json | 766 + services/mineru/src/tests/clean_coverage.py | 25 + services/mineru/src/tests/get_coverage.py | 22 + .../mineru/src/tests/unittest/pdfs/test.pdf | Bin 0 -> 125121 bytes .../mineru/src/tests/unittest/test_e2e.py | 307 + services/mineru/src/update_version.py | 27 + services/mineru/start.ps1 | 34 + services/ollama/docker-compose.yml | 54 + services/rag_gateway/app/__init__.py | 1 + services/rag_gateway/app/api/__init__.py | 1 + services/rag_gateway/app/api/routes.py | 46 + services/rag_gateway/app/core/__init__.py | 1 + services/rag_gateway/app/core/config.py | 22 + services/rag_gateway/app/core/logging.py | 27 + services/rag_gateway/app/main.py | 12 + services/rag_gateway/app/services/__init__.py | 1 + .../rag_gateway/app/services/rag_service.py | 37 + src/app/api/documents/create-child/route.ts | 88 + .../editor/blocks/PageReferenceBlock.tsx | 59 + src/components/editor/schema.ts | 13 + supabase.md | 17 + .../20250221_add_document_options.sql | 29 + .../migrations/20250221_add_media_assets.sql | 83 + .../migrations/20250221_add_page_refs.sql | 195 + .../20250221_add_user_recent_pages.sql | 28 + .../20250222_add_document_tables.sql | 269 + .../migrations/20250222_add_media_bucket.sql | 29 + ...250222_alter_media_assets_add_fileinfo.sql | 4 + test/image copy 2.png | Bin 0 -> 200892 bytes test/image copy 20.png | Bin 0 -> 119408 bytes test/image copy.png | Bin 0 -> 142070 bytes test/image copy00.png | Bin 0 -> 137078 bytes test/image.png | Bin 0 -> 179340 bytes test/image2.png | Bin 0 -> 276048 bytes test/image3.png | Bin 0 -> 248556 bytes test/image4.png | Bin 0 -> 213722 bytes wolai-backend/.gitignore | 16 + wolai-backend/README.md | 59 + wolai-backend/app/__init__.py | 1 + wolai-backend/app/config.py | 25 + wolai-backend/app/deps.py | 58 + wolai-backend/app/main.py | 25 + wolai-backend/app/routers/__init__.py | 10 + wolai-backend/app/routers/chat.py | 26 + wolai-backend/app/routers/health.py | 11 + wolai-backend/app/routers/tasks.py | 29 + wolai-backend/app/schemas/tasks.py | 17 + .../app/services/lightrag_service.py | 19 + wolai-backend/app/services/mineru_service.py | 13 + wolai-backend/app/services/supabase_rest.py | 57 + wolai-backend/app/services/task_tracker.py | 43 + wolai-backend/app/workers/celery_app.py | 15 + wolai-backend/app/workers/tasks.py | 51 + wolai-backend/celery.err | 3025 +++ wolai-backend/celery.out | 19 + wolai-backend/requirements.txt | 11 + wolai-backend/uvicorn-run.err | 0 wolai-backend/uvicorn-run.out | 0 wolai-backend/uvicorn.err | 57 + wolai-backend/uvicorn.out | 1 + wolai-frontend/.gitignore | 41 + wolai-frontend/README.md | 36 + wolai-frontend/components.json | 22 + wolai-frontend/dev-3001.err | 78 + wolai-frontend/dev-3001.out | 60 + wolai-frontend/eslint.config.mjs | 18 + wolai-frontend/frontend-3001.err | 1 + wolai-frontend/frontend-3001.out | 11 + wolai-frontend/frontend.err | 12 + wolai-frontend/frontend.out | 6 + wolai-frontend/next.config.ts | 7 + wolai-frontend/package.json | 69 + wolai-frontend/pnpm-lock.yaml | 8675 ++++++++ wolai-frontend/postcss.config.mjs | 7 + wolai-frontend/public/file.svg | 1 + wolai-frontend/public/globe.svg | 1 + wolai-frontend/public/next.svg | 1 + wolai-frontend/public/vercel.svg | 1 + wolai-frontend/public/window.svg | 1 + .../src/app/(app)/documents/[id]/loading.tsx | 11 + .../src/app/(app)/documents/[id]/page.tsx | 61 + wolai-frontend/src/app/(app)/layout.tsx | 55 + wolai-frontend/src/app/(auth)/login/page.tsx | 91 + wolai-frontend/src/app/api/.gitkeep | 0 .../app/api/documents/create-child/route.ts | 99 + .../src/app/api/documents/create/route.ts | 123 + .../src/app/api/documents/delete/route.ts | 36 + .../src/app/api/documents/duplicate/route.ts | 74 + .../src/app/api/documents/embed/route.ts | 76 + .../app/api/documents/empty-trash/route.ts | 53 + .../src/app/api/documents/move/route.ts | 37 + .../src/app/api/documents/options/route.ts | 61 + .../src/app/api/documents/purge/route.ts | 33 + .../src/app/api/documents/restore/route.ts | 38 + .../src/app/api/documents/save/route.ts | 32 + .../src/app/api/documents/stats/route.ts | 40 + .../src/app/api/documents/title/route.ts | 32 + .../src/app/api/media/assets/route.ts | 92 + wolai-frontend/src/app/api/media/ocr/route.ts | 43 + .../src/app/api/media/upload/route.ts | 82 + .../src/app/api/references/backlinks/route.ts | 50 + .../src/app/api/references/record/route.ts | 68 + .../src/app/api/search/documents/route.ts | 303 + .../src/app/api/search/recent/route.ts | 54 + wolai-frontend/src/app/api/sidebar/route.ts | 47 + .../src/app/api/workspaces/switch/route.ts | 54 + wolai-frontend/src/app/favicon.ico | Bin 0 -> 25931 bytes wolai-frontend/src/app/globals.css | 410 + wolai-frontend/src/app/layout.tsx | 37 + wolai-frontend/src/app/page.tsx | 41 + .../src/components/bottom-toolbar.tsx | 36 + wolai-frontend/src/components/breadcrumb.tsx | 63 + wolai-frontend/src/components/common/.gitkeep | 0 .../src/components/document-task-panel.tsx | 87 + wolai-frontend/src/components/editor/.gitkeep | 0 .../components/editor/blocknote-editor.tsx | 585 + .../editor/blocks/AdvancedTodoBlock.tsx | 56 + .../components/editor/blocks/MediaBlock.tsx | 498 + .../editor/blocks/PageReferenceBlock.tsx | 114 + .../editor/blocks/ProgressBlock.tsx | 50 + .../components/editor/document-content.tsx | 259 + .../editor/document-history-drawer.tsx | 51 + .../src/components/editor/document-shell.tsx | 37 + .../src/components/editor/document-toc.tsx | 48 + .../editor/menus/CustomSideMenu.tsx | 335 + .../editor/menus/CustomSlashMenu.tsx | 343 + .../editor/page-backlinks-panel.tsx | 77 + .../editor/page-options-sidebar.tsx | 228 + .../src/components/editor/schema.ts | 36 + .../components/media/image-picker-context.tsx | 78 + .../components/media/image-picker-dialog.tsx | 392 + .../src/components/mindmap/.gitkeep | 0 .../src/components/mobile-sidebar-trigger.tsx | 19 + .../components/providers/query-provider.tsx | 31 + .../providers/supabase-provider.tsx | 18 + .../components/reference/page-hover-card.tsx | 39 + .../src/components/search/search-palette.tsx | 654 + .../src/components/sidebar/.gitkeep | 0 .../src/components/sidebar/private-tree.tsx | 257 + .../src/components/sidebar/sidebar.tsx | 1077 + .../src/components/sidebar/types.ts | 19 + wolai-frontend/src/components/ui/avatar.tsx | 53 + wolai-frontend/src/components/ui/badge.tsx | 46 + wolai-frontend/src/components/ui/button.tsx | 60 + wolai-frontend/src/components/ui/card.tsx | 92 + wolai-frontend/src/components/ui/command.tsx | 184 + wolai-frontend/src/components/ui/dialog.tsx | 152 + wolai-frontend/src/components/ui/drawer.tsx | 135 + .../src/components/ui/dropdown-menu.tsx | 257 + .../src/components/ui/hover-card.tsx | 30 + wolai-frontend/src/components/ui/input.tsx | 21 + wolai-frontend/src/components/ui/label.tsx | 24 + wolai-frontend/src/components/ui/popover.tsx | 48 + .../src/components/ui/scroll-area.tsx | 58 + .../src/components/ui/separator.tsx | 28 + wolai-frontend/src/components/ui/sheet.tsx | 139 + wolai-frontend/src/components/ui/skeleton.tsx | 13 + wolai-frontend/src/components/ui/tabs.tsx | 66 + wolai-frontend/src/components/ui/textarea.tsx | 18 + wolai-frontend/src/components/ui/toggle.tsx | 47 + wolai-frontend/src/hooks/.gitkeep | 0 .../src/hooks/use-backend-health.ts | 40 + wolai-frontend/src/hooks/use-backlinks.ts | 61 + .../src/hooks/use-debounced-callback.ts | 41 + .../src/hooks/use-document-search.ts | 34 + .../src/hooks/use-reference-composer.ts | 77 + wolai-frontend/src/hooks/use-sidebar-data.ts | 28 + wolai-frontend/src/lib/document-content.ts | 30 + wolai-frontend/src/lib/documents.ts | 63 + .../src/lib/search/record-recent.ts | 14 + wolai-frontend/src/lib/search/request.test.ts | 45 + wolai-frontend/src/lib/search/request.ts | 38 + .../src/lib/search/shortcuts.test.ts | 17 + wolai-frontend/src/lib/search/shortcuts.ts | 17 + wolai-frontend/src/lib/search/snippet.test.ts | 14 + wolai-frontend/src/lib/search/snippet.ts | 24 + wolai-frontend/src/lib/server-cookies.ts | 46 + wolai-frontend/src/lib/sidebar-tree.ts | 141 + wolai-frontend/src/lib/supabase/client.ts | 13 + wolai-frontend/src/lib/supabase/server.ts | 16 + wolai-frontend/src/lib/utils.ts | 6 + wolai-frontend/src/lib/workspaces.ts | 142 + wolai-frontend/src/store/.gitkeep | 0 wolai-frontend/src/store/editor-bridge.ts | 25 + wolai-frontend/src/store/page-layout.ts | 18 + wolai-frontend/src/store/search-palette.ts | 109 + wolai-frontend/src/store/sidebar.ts | 59 + wolai-frontend/src/types/document.ts | 9 + wolai-frontend/src/types/media.ts | 27 + wolai-frontend/src/types/page-options.ts | 15 + wolai-frontend/src/types/references.ts | 13 + wolai-frontend/src/types/search.ts | 47 + wolai-frontend/src/types/supabase.ts | 532 + wolai-frontend/start-4000.err | 0 wolai-frontend/start-4000.out | 11 + wolai-frontend/tsconfig.json | 35 + wolai-frontend/vitest.config.ts | 9 + wolaiplan copy 2.md | 136 + wolaiplan copy.md | 79 + wolaiplan.md | 155 + 941 files changed, 246586 insertions(+) create mode 100644 .agent/rules/mnote.md create mode 100644 .codex/.gitignore create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 LightRAG/.clinerules/01-basic.md create mode 100644 LightRAG/.dockerignore create mode 100644 LightRAG/.gitattributes create mode 100644 LightRAG/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 LightRAG/.github/ISSUE_TEMPLATE/config.yml create mode 100644 LightRAG/.github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 LightRAG/.github/ISSUE_TEMPLATE/question.yml create mode 100644 LightRAG/.github/dependabot.yml create mode 100644 LightRAG/.github/pull_request_template.md create mode 100644 LightRAG/.github/workflows/docker-build-lite.yml create mode 100644 LightRAG/.github/workflows/docker-build-manual.yml create mode 100644 LightRAG/.github/workflows/docker-publish.yml create mode 100644 LightRAG/.github/workflows/linting.yaml create mode 100644 LightRAG/.github/workflows/pypi-publish.yml create mode 100644 LightRAG/.github/workflows/stale.yaml create mode 100644 LightRAG/.gitignore create mode 100644 LightRAG/.pre-commit-config.yaml create mode 100644 LightRAG/AGENTS.md create mode 100644 LightRAG/Dockerfile create mode 100644 LightRAG/Dockerfile.lite create mode 100644 LightRAG/LICENSE create mode 100644 LightRAG/MANIFEST.in create mode 100644 LightRAG/README-zh.md create mode 100644 LightRAG/README.assets/b2aaf634151b4706892693ffb43d9093.png create mode 100644 LightRAG/README.assets/iShot_2025-03-23_12.40.08.png create mode 100644 LightRAG/README.md create mode 100644 LightRAG/SECURITY.md create mode 100644 LightRAG/assets/logo.png create mode 100644 LightRAG/config.ini.example create mode 100644 LightRAG/docker-build-push.sh create mode 100644 LightRAG/docker-compose.yml create mode 100644 LightRAG/docs/Algorithm.md create mode 100644 LightRAG/docs/DockerDeployment.md create mode 100644 LightRAG/docs/FrontendBuildGuide.md create mode 100644 LightRAG/docs/LightRAG_concurrent_explain.md create mode 100644 LightRAG/docs/OfflineDeployment.md create mode 100644 LightRAG/docs/UV_LOCK_GUIDE.md create mode 100644 LightRAG/env.example create mode 100644 LightRAG/env.ollama-binding-options.example create mode 100644 LightRAG/examples/generate_query.py create mode 100644 LightRAG/examples/graph_visual_with_html.py create mode 100644 LightRAG/examples/graph_visual_with_neo4j.py create mode 100644 LightRAG/examples/insert_custom_kg.py create mode 100644 LightRAG/examples/lightrag_azure_openai_demo.py create mode 100644 LightRAG/examples/lightrag_ollama_demo.py create mode 100644 LightRAG/examples/lightrag_openai_compatible_demo.py create mode 100644 LightRAG/examples/lightrag_openai_demo.py create mode 100644 LightRAG/examples/lightrag_openai_mongodb_graph_demo.py create mode 100644 LightRAG/examples/modalprocessors_example.py create mode 100644 LightRAG/examples/raganything_example.py create mode 100644 LightRAG/examples/rerank_example.py create mode 100644 LightRAG/examples/unofficial-sample/copy_llm_cache_to_another_storage.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_bedrock_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_cloudflare_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_hf_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_llamaindex_direct_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_opik_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_lmdeploy_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_nvidia_demo.py create mode 100644 LightRAG/examples/unofficial-sample/lightrag_openai_neo4j_milvus_redis_demo.py create mode 100644 LightRAG/k8s-deploy/README-zh.md create mode 100644 LightRAG/k8s-deploy/README.md create mode 100644 LightRAG/k8s-deploy/databases/00-config.sh create mode 100644 LightRAG/k8s-deploy/databases/01-prepare.sh create mode 100644 LightRAG/k8s-deploy/databases/02-install-database.sh create mode 100644 LightRAG/k8s-deploy/databases/03-uninstall-database.sh create mode 100644 LightRAG/k8s-deploy/databases/04-cleanup.sh create mode 100644 LightRAG/k8s-deploy/databases/README.md create mode 100644 LightRAG/k8s-deploy/databases/elasticsearch/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/install-kubeblocks.sh create mode 100644 LightRAG/k8s-deploy/databases/mongodb/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/neo4j/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/postgresql/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/qdrant/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/redis/values.yaml create mode 100644 LightRAG/k8s-deploy/databases/scripts/common.sh create mode 100644 LightRAG/k8s-deploy/databases/uninstall-kubeblocks.sh create mode 100644 LightRAG/k8s-deploy/install_lightrag.sh create mode 100644 LightRAG/k8s-deploy/install_lightrag_dev.sh create mode 100644 LightRAG/k8s-deploy/lightrag/.helmignore create mode 100644 LightRAG/k8s-deploy/lightrag/Chart.yaml create mode 100644 LightRAG/k8s-deploy/lightrag/templates/NOTES.txt create mode 100644 LightRAG/k8s-deploy/lightrag/templates/_helpers.tpl create mode 100644 LightRAG/k8s-deploy/lightrag/templates/deployment.yaml create mode 100644 LightRAG/k8s-deploy/lightrag/templates/pvc.yaml create mode 100644 LightRAG/k8s-deploy/lightrag/templates/secret.yaml create mode 100644 LightRAG/k8s-deploy/lightrag/templates/service.yaml create mode 100644 LightRAG/k8s-deploy/lightrag/values.yaml create mode 100644 LightRAG/k8s-deploy/uninstall_lightrag.sh create mode 100644 LightRAG/k8s-deploy/uninstall_lightrag_dev.sh create mode 100644 LightRAG/lightrag.service.example create mode 100644 LightRAG/lightrag/__init__.py create mode 100644 LightRAG/lightrag/api/.gitignore create mode 100644 LightRAG/lightrag/api/README-zh.md create mode 100644 LightRAG/lightrag/api/README.assets/image-20250323122538997.png create mode 100644 LightRAG/lightrag/api/README.assets/image-20250323122754387.png create mode 100644 LightRAG/lightrag/api/README.assets/image-20250323123011220.png create mode 100644 LightRAG/lightrag/api/README.assets/image-20250323194750379.png create mode 100644 LightRAG/lightrag/api/README.md create mode 100644 LightRAG/lightrag/api/__init__.py create mode 100644 LightRAG/lightrag/api/auth.py create mode 100644 LightRAG/lightrag/api/config.py create mode 100644 LightRAG/lightrag/api/gunicorn_config.py create mode 100644 LightRAG/lightrag/api/lightrag_server.py create mode 100644 LightRAG/lightrag/api/routers/__init__.py create mode 100644 LightRAG/lightrag/api/routers/document_routes.py create mode 100644 LightRAG/lightrag/api/routers/graph_routes.py create mode 100644 LightRAG/lightrag/api/routers/ollama_api.py create mode 100644 LightRAG/lightrag/api/routers/query_routes.py create mode 100644 LightRAG/lightrag/api/run_with_gunicorn.py create mode 100644 LightRAG/lightrag/api/static/swagger-ui/favicon-32x32.png create mode 100644 LightRAG/lightrag/api/static/swagger-ui/swagger-ui-bundle.js create mode 100644 LightRAG/lightrag/api/static/swagger-ui/swagger-ui.css create mode 100644 LightRAG/lightrag/api/utils_api.py create mode 100644 LightRAG/lightrag/base.py create mode 100644 LightRAG/lightrag/constants.py create mode 100644 LightRAG/lightrag/evaluation/README_EVALUASTION_RAGAS.md create mode 100644 LightRAG/lightrag/evaluation/__init__.py create mode 100644 LightRAG/lightrag/evaluation/eval_rag_quality.py create mode 100644 LightRAG/lightrag/evaluation/sample_dataset.json create mode 100644 LightRAG/lightrag/evaluation/sample_documents/01_lightrag_overview.md create mode 100644 LightRAG/lightrag/evaluation/sample_documents/02_rag_architecture.md create mode 100644 LightRAG/lightrag/evaluation/sample_documents/03_lightrag_improvements.md create mode 100644 LightRAG/lightrag/evaluation/sample_documents/04_supported_databases.md create mode 100644 LightRAG/lightrag/evaluation/sample_documents/05_evaluation_and_deployment.md create mode 100644 LightRAG/lightrag/evaluation/sample_documents/README.md create mode 100644 LightRAG/lightrag/exceptions.py create mode 100644 LightRAG/lightrag/kg/__init__.py create mode 100644 LightRAG/lightrag/kg/deprecated/chroma_impl.py create mode 100644 LightRAG/lightrag/kg/faiss_impl.py create mode 100644 LightRAG/lightrag/kg/json_doc_status_impl.py create mode 100644 LightRAG/lightrag/kg/json_kv_impl.py create mode 100644 LightRAG/lightrag/kg/memgraph_impl.py create mode 100644 LightRAG/lightrag/kg/milvus_impl.py create mode 100644 LightRAG/lightrag/kg/mongo_impl.py create mode 100644 LightRAG/lightrag/kg/nano_vector_db_impl.py create mode 100644 LightRAG/lightrag/kg/neo4j_impl.py create mode 100644 LightRAG/lightrag/kg/networkx_impl.py create mode 100644 LightRAG/lightrag/kg/postgres_impl.py create mode 100644 LightRAG/lightrag/kg/qdrant_impl.py create mode 100644 LightRAG/lightrag/kg/redis_impl.py create mode 100644 LightRAG/lightrag/kg/shared_storage.py create mode 100644 LightRAG/lightrag/lightrag.py create mode 100644 LightRAG/lightrag/llm/__init__.py create mode 100644 LightRAG/lightrag/llm/anthropic.py create mode 100644 LightRAG/lightrag/llm/azure_openai.py create mode 100644 LightRAG/lightrag/llm/bedrock.py create mode 100644 LightRAG/lightrag/llm/binding_options.py create mode 100644 LightRAG/lightrag/llm/deprecated/siliconcloud.py create mode 100644 LightRAG/lightrag/llm/gemini.py create mode 100644 LightRAG/lightrag/llm/hf.py create mode 100644 LightRAG/lightrag/llm/jina.py create mode 100644 LightRAG/lightrag/llm/llama_index_impl.py create mode 100644 LightRAG/lightrag/llm/lmdeploy.py create mode 100644 LightRAG/lightrag/llm/lollms.py create mode 100644 LightRAG/lightrag/llm/nvidia_openai.py create mode 100644 LightRAG/lightrag/llm/ollama.py create mode 100644 LightRAG/lightrag/llm/openai.py create mode 100644 LightRAG/lightrag/llm/zhipu.py create mode 100644 LightRAG/lightrag/namespace.py create mode 100644 LightRAG/lightrag/operate.py create mode 100644 LightRAG/lightrag/prompt.py create mode 100644 LightRAG/lightrag/rerank.py create mode 100644 LightRAG/lightrag/tools/README_CLEAN_LLM_QUERY_CACHE.md create mode 100644 LightRAG/lightrag/tools/README_MIGRATE_LLM_CACHE.md create mode 100644 LightRAG/lightrag/tools/__init__.py create mode 100644 LightRAG/lightrag/tools/check_initialization.py create mode 100644 LightRAG/lightrag/tools/clean_llm_query_cache.py create mode 100644 LightRAG/lightrag/tools/download_cache.py create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/README-zh.md create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/README.md create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/__init__.py create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/assets/Geist-Regular.ttf create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - Geist.txt create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - SmileySans.txt create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/assets/SmileySans-Oblique.ttf create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/assets/place_font_here create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/graph_visualizer.py create mode 100644 LightRAG/lightrag/tools/lightrag_visualizer/requirements.txt create mode 100644 LightRAG/lightrag/tools/migrate_llm_cache.py create mode 100644 LightRAG/lightrag/types.py create mode 100644 LightRAG/lightrag/utils.py create mode 100644 LightRAG/lightrag/utils_graph.py create mode 100644 LightRAG/lightrag_webui/.gitignore create mode 100644 LightRAG/lightrag_webui/.prettierrc.json create mode 100644 LightRAG/lightrag_webui/README.md create mode 100644 LightRAG/lightrag_webui/bun.lock create mode 100644 LightRAG/lightrag_webui/components.json create mode 100644 LightRAG/lightrag_webui/env.development.smaple create mode 100644 LightRAG/lightrag_webui/env.local.sample create mode 100644 LightRAG/lightrag_webui/eslint.config.js create mode 100644 LightRAG/lightrag_webui/index.html create mode 100644 LightRAG/lightrag_webui/package-lock.json create mode 100644 LightRAG/lightrag_webui/package.json create mode 100644 LightRAG/lightrag_webui/public/favicon.png create mode 100644 LightRAG/lightrag_webui/public/logo.svg create mode 100644 LightRAG/lightrag_webui/src/App.tsx create mode 100644 LightRAG/lightrag_webui/src/AppRouter.tsx create mode 100644 LightRAG/lightrag_webui/src/api/lightrag.ts create mode 100644 LightRAG/lightrag_webui/src/components/ApiKeyAlert.tsx create mode 100644 LightRAG/lightrag_webui/src/components/AppSettings.tsx create mode 100644 LightRAG/lightrag_webui/src/components/LanguageToggle.tsx create mode 100644 LightRAG/lightrag_webui/src/components/Root.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ThemeProvider.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ThemeToggle.tsx create mode 100644 LightRAG/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/documents/DeleteDocumentsDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/documents/UploadDocumentsDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/EditablePropertyRow.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/FocusOnNode.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/FullScreenControl.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/GraphControl.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/GraphLabels.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/GraphSearch.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/LayoutsControl.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/Legend.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/LegendButton.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/MergeDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/PropertiesView.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/PropertyEditDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/PropertyRowComponents.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/Settings.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/SettingsDisplay.tsx create mode 100644 LightRAG/lightrag_webui/src/components/graph/ZoomControl.tsx create mode 100644 LightRAG/lightrag_webui/src/components/retrieval/ChatMessage.tsx create mode 100644 LightRAG/lightrag_webui/src/components/retrieval/QuerySettings.tsx create mode 100644 LightRAG/lightrag_webui/src/components/status/StatusCard.tsx create mode 100644 LightRAG/lightrag_webui/src/components/status/StatusDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/status/StatusIndicator.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Alert.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/AlertDialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/AsyncSearch.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/AsyncSelect.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Badge.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Button.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Card.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Checkbox.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Command.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/DataTable.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Dialog.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/EmptyCard.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/FileUploader.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Input.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/NumberInput.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/PaginationControls.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Popover.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Progress.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/ScrollArea.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Select.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Separator.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/TabContent.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Table.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Tabs.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Text.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Textarea.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/Tooltip.tsx create mode 100644 LightRAG/lightrag_webui/src/components/ui/UserPromptInputWithHistory.tsx create mode 100644 LightRAG/lightrag_webui/src/contexts/TabVisibilityProvider.tsx create mode 100644 LightRAG/lightrag_webui/src/contexts/context.ts create mode 100644 LightRAG/lightrag_webui/src/contexts/types.ts create mode 100644 LightRAG/lightrag_webui/src/contexts/useTabVisibility.ts create mode 100644 LightRAG/lightrag_webui/src/features/ApiSite.tsx create mode 100644 LightRAG/lightrag_webui/src/features/DocumentManager.tsx create mode 100644 LightRAG/lightrag_webui/src/features/GraphViewer.tsx create mode 100644 LightRAG/lightrag_webui/src/features/LoginPage.tsx create mode 100644 LightRAG/lightrag_webui/src/features/RetrievalTesting.tsx create mode 100644 LightRAG/lightrag_webui/src/features/SiteHeader.tsx create mode 100644 LightRAG/lightrag_webui/src/hooks/useDebounce.tsx create mode 100644 LightRAG/lightrag_webui/src/hooks/useLightragGraph.tsx create mode 100644 LightRAG/lightrag_webui/src/hooks/useRandomGraph.tsx create mode 100644 LightRAG/lightrag_webui/src/hooks/useTheme.tsx create mode 100644 LightRAG/lightrag_webui/src/i18n.ts create mode 100644 LightRAG/lightrag_webui/src/index.css create mode 100644 LightRAG/lightrag_webui/src/lib/constants.ts create mode 100644 LightRAG/lightrag_webui/src/lib/extensions.ts create mode 100644 LightRAG/lightrag_webui/src/lib/utils.ts create mode 100644 LightRAG/lightrag_webui/src/locales/ar.json create mode 100644 LightRAG/lightrag_webui/src/locales/en.json create mode 100644 LightRAG/lightrag_webui/src/locales/fr.json create mode 100644 LightRAG/lightrag_webui/src/locales/zh.json create mode 100644 LightRAG/lightrag_webui/src/locales/zh_TW.json create mode 100644 LightRAG/lightrag_webui/src/main.tsx create mode 100644 LightRAG/lightrag_webui/src/services/navigation.ts create mode 100644 LightRAG/lightrag_webui/src/stores/graph.ts create mode 100644 LightRAG/lightrag_webui/src/stores/settings.ts create mode 100644 LightRAG/lightrag_webui/src/stores/state.ts create mode 100644 LightRAG/lightrag_webui/src/types/katex.d.ts create mode 100644 LightRAG/lightrag_webui/src/utils/SearchHistoryManager.ts create mode 100644 LightRAG/lightrag_webui/src/utils/clipboard.ts create mode 100644 LightRAG/lightrag_webui/src/utils/graphColor.ts create mode 100644 LightRAG/lightrag_webui/src/utils/remarkFootnotes.ts create mode 100644 LightRAG/lightrag_webui/src/vite-env.d.ts create mode 100644 LightRAG/lightrag_webui/tailwind.config.js create mode 100644 LightRAG/lightrag_webui/tsconfig.json create mode 100644 LightRAG/lightrag_webui/vite.config.ts create mode 100644 LightRAG/paging.md create mode 100644 LightRAG/pyproject.toml create mode 100644 LightRAG/reproduce/Step_0.py create mode 100644 LightRAG/reproduce/Step_1.py create mode 100644 LightRAG/reproduce/Step_1_openai_compatible.py create mode 100644 LightRAG/reproduce/Step_2.py create mode 100644 LightRAG/reproduce/Step_3.py create mode 100644 LightRAG/reproduce/Step_3_openai_compatible.py create mode 100644 LightRAG/reproduce/batch_eval.py create mode 100644 LightRAG/requirements-offline-llm.txt create mode 100644 LightRAG/requirements-offline-storage.txt create mode 100644 LightRAG/requirements-offline.txt create mode 100644 LightRAG/setup.py create mode 100644 LightRAG/tests/test_aquery_data_endpoint.py create mode 100644 LightRAG/tests/test_curl_aquery_data.sh create mode 100644 LightRAG/tests/test_graph_storage.py create mode 100644 LightRAG/tests/test_lightrag_ollama_chat.py create mode 100644 LightRAG/tests/test_postgres_retry_integration.py create mode 100644 LightRAG/tests/test_write_json_optimization.py create mode 100644 LightRAG/uv.lock create mode 100644 design/PHASE_1.5_TURN_TO_PAGE_EXACT_CLONE.md create mode 100644 design/design.md create mode 100644 design/design3.0.md create mode 100644 design/grok的思维导图方案.md create mode 100644 design/stage0-2.0.md create mode 100644 design/stage0.md create mode 100644 design/stage1.md create mode 100644 design/ui_react.md create mode 100644 design/思维导图方案.md create mode 100644 design/表格方案.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scrape_wolai.js create mode 100644 scraped_docs/todolist.md create mode 100644 scraped_docs/功能概览.md create mode 100644 scraped_docs/图片.md create mode 100644 scraped_docs/块引用.md create mode 100644 scraped_docs/垃圾桶.md create mode 100644 scraped_docs/基本编辑.md create mode 100644 scraped_docs/搜索选项.md create mode 100644 scraped_docs/数字列表.md create mode 100644 scraped_docs/斜杠菜单.md create mode 100644 scraped_docs/标题.md create mode 100644 scraped_docs/页面定义.md create mode 100644 scraped_docs/页面引用.md create mode 100644 scraped_docs/页面选项.md create mode 100644 scripts/desktop-hot.js create mode 100644 scripts/wolai_scraper.py create mode 100644 services/ingest_service/app/api/routes.py create mode 100644 services/ingest_service/app/core/config.py create mode 100644 services/ingest_service/app/core/logging.py create mode 100644 services/ingest_service/app/main.py create mode 100644 services/ingest_service/app/models/job.py create mode 100644 services/ingest_service/app/schemas/job.py create mode 100644 services/ingest_service/app/services/embeddings.py create mode 100644 services/ingest_service/app/services/job_store.py create mode 100644 services/ingest_service/app/services/runtime.py create mode 100644 services/ingest_service/app/services/scheduler.py create mode 100644 services/ingest_service/app/services/tasks.py create mode 100644 services/ingest_service/app/services/webhooks.py create mode 100644 services/mineru/README.md create mode 100644 services/mineru/requirements.txt create mode 100644 services/mineru/setup.ps1 create mode 100644 services/mineru/src/.gitattributes create mode 100644 services/mineru/src/.github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 services/mineru/src/.github/ISSUE_TEMPLATE/config.yml create mode 100644 services/mineru/src/.github/pull_request_template.md create mode 100644 services/mineru/src/.github/workflows/cla.yml create mode 100644 services/mineru/src/.github/workflows/cli.yml create mode 100644 services/mineru/src/.github/workflows/mkdocs.yml create mode 100644 services/mineru/src/.github/workflows/python-package.yml create mode 100644 services/mineru/src/.github/workflows/rerun.yml create mode 100644 services/mineru/src/.gitignore create mode 100644 services/mineru/src/LICENSE.md create mode 100644 services/mineru/src/MinerU_CLA.md create mode 100644 services/mineru/src/README.md create mode 100644 services/mineru/src/README_zh-CN.md create mode 100644 services/mineru/src/SECURITY.md create mode 100644 services/mineru/src/demo/demo.py create mode 100644 services/mineru/src/demo/pdfs/demo1.pdf create mode 100644 services/mineru/src/demo/pdfs/demo2.pdf create mode 100644 services/mineru/src/demo/pdfs/demo3.pdf create mode 100644 services/mineru/src/demo/pdfs/small_ocr.pdf create mode 100644 services/mineru/src/docker/china/Dockerfile create mode 100644 services/mineru/src/docker/compose.yaml create mode 100644 services/mineru/src/docker/global/Dockerfile create mode 100644 services/mineru/src/docs/assets/images/BISHENG_01.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_1.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_2.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_3.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_4.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_5.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_6.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_7.png create mode 100644 services/mineru/src/docs/assets/images/Cherry_Studio_8.png create mode 100644 services/mineru/src/docs/assets/images/Coze_1.png create mode 100644 services/mineru/src/docs/assets/images/Coze_10.png create mode 100644 services/mineru/src/docs/assets/images/Coze_11.png create mode 100644 services/mineru/src/docs/assets/images/Coze_12.png create mode 100644 services/mineru/src/docs/assets/images/Coze_13.png create mode 100644 services/mineru/src/docs/assets/images/Coze_14.png create mode 100644 services/mineru/src/docs/assets/images/Coze_15.png create mode 100644 services/mineru/src/docs/assets/images/Coze_16.png create mode 100644 services/mineru/src/docs/assets/images/Coze_17.png create mode 100644 services/mineru/src/docs/assets/images/Coze_18.png create mode 100644 services/mineru/src/docs/assets/images/Coze_19.png create mode 100644 services/mineru/src/docs/assets/images/Coze_2.png create mode 100644 services/mineru/src/docs/assets/images/Coze_20.png create mode 100644 services/mineru/src/docs/assets/images/Coze_21.png create mode 100644 services/mineru/src/docs/assets/images/Coze_3.png create mode 100644 services/mineru/src/docs/assets/images/Coze_4.png create mode 100644 services/mineru/src/docs/assets/images/Coze_5.png create mode 100644 services/mineru/src/docs/assets/images/Coze_6.png create mode 100644 services/mineru/src/docs/assets/images/Coze_7.png create mode 100644 services/mineru/src/docs/assets/images/Coze_8.png create mode 100644 services/mineru/src/docs/assets/images/Coze_9.png create mode 100644 services/mineru/src/docs/assets/images/DataFLow_01.png create mode 100644 services/mineru/src/docs/assets/images/DataFlow_02.png create mode 100644 services/mineru/src/docs/assets/images/Dify_1.png create mode 100644 services/mineru/src/docs/assets/images/Dify_10.png create mode 100644 services/mineru/src/docs/assets/images/Dify_11.png create mode 100644 services/mineru/src/docs/assets/images/Dify_12.png create mode 100644 services/mineru/src/docs/assets/images/Dify_13.png create mode 100644 services/mineru/src/docs/assets/images/Dify_14.png create mode 100644 services/mineru/src/docs/assets/images/Dify_15.png create mode 100644 services/mineru/src/docs/assets/images/Dify_16.png create mode 100644 services/mineru/src/docs/assets/images/Dify_17.png create mode 100644 services/mineru/src/docs/assets/images/Dify_18.png create mode 100644 services/mineru/src/docs/assets/images/Dify_19.png create mode 100644 services/mineru/src/docs/assets/images/Dify_2.png create mode 100644 services/mineru/src/docs/assets/images/Dify_20.png create mode 100644 services/mineru/src/docs/assets/images/Dify_21.png create mode 100644 services/mineru/src/docs/assets/images/Dify_22.png create mode 100644 services/mineru/src/docs/assets/images/Dify_23.png create mode 100644 services/mineru/src/docs/assets/images/Dify_24.png create mode 100644 services/mineru/src/docs/assets/images/Dify_25.png create mode 100644 services/mineru/src/docs/assets/images/Dify_26.png create mode 100644 services/mineru/src/docs/assets/images/Dify_3.png create mode 100644 services/mineru/src/docs/assets/images/Dify_4.png create mode 100644 services/mineru/src/docs/assets/images/Dify_5.png create mode 100644 services/mineru/src/docs/assets/images/Dify_6.png create mode 100644 services/mineru/src/docs/assets/images/Dify_7.png create mode 100644 services/mineru/src/docs/assets/images/Dify_8.png create mode 100644 services/mineru/src/docs/assets/images/Dify_9.png create mode 100644 services/mineru/src/docs/assets/images/DingTalk_01.png create mode 100644 services/mineru/src/docs/assets/images/FastGPT_01.png create mode 100644 services/mineru/src/docs/assets/images/FastGPT_02.png create mode 100644 services/mineru/src/docs/assets/images/ModelWhale_01.png create mode 100644 services/mineru/src/docs/assets/images/ModelWhale_02.png create mode 100644 services/mineru/src/docs/assets/images/ModelWhale_1.png create mode 100644 services/mineru/src/docs/assets/images/RagFlow_01.png create mode 100644 services/mineru/src/docs/assets/images/Sider_1.png create mode 100644 services/mineru/src/docs/assets/images/coze_0.png create mode 100644 services/mineru/src/docs/assets/images/n8n_0.png create mode 100644 services/mineru/src/docs/assets/images/n8n_1.png create mode 100644 services/mineru/src/docs/assets/images/n8n_10.png create mode 100644 services/mineru/src/docs/assets/images/n8n_2.png create mode 100644 services/mineru/src/docs/assets/images/n8n_3.png create mode 100644 services/mineru/src/docs/assets/images/n8n_4.png create mode 100644 services/mineru/src/docs/assets/images/n8n_5.png create mode 100644 services/mineru/src/docs/assets/images/n8n_6.png create mode 100644 services/mineru/src/docs/assets/images/n8n_7.png create mode 100644 services/mineru/src/docs/assets/images/n8n_8.png create mode 100644 services/mineru/src/docs/assets/images/n8n_9.png create mode 100644 services/mineru/src/docs/chemical_knowledge_introduction/introduction.pdf create mode 100644 services/mineru/src/docs/chemical_knowledge_introduction/introduction.xmind create mode 100644 services/mineru/src/docs/en/demo/index.md create mode 100644 services/mineru/src/docs/en/faq/index.md create mode 100644 services/mineru/src/docs/en/index.md create mode 100644 services/mineru/src/docs/en/quick_start/docker_deployment.md create mode 100644 services/mineru/src/docs/en/quick_start/extension_modules.md create mode 100644 services/mineru/src/docs/en/quick_start/index.md create mode 100644 services/mineru/src/docs/en/reference/output_files.md create mode 100644 services/mineru/src/docs/en/usage/advanced_cli_parameters.md create mode 100644 services/mineru/src/docs/en/usage/cli_tools.md create mode 100644 services/mineru/src/docs/en/usage/index.md create mode 100644 services/mineru/src/docs/en/usage/model_source.md create mode 100644 services/mineru/src/docs/en/usage/quick_usage.md create mode 100644 services/mineru/src/docs/images/MinerU-logo.png create mode 100644 services/mineru/src/docs/images/datalab_logo.png create mode 100644 services/mineru/src/docs/images/flowchart_en.png create mode 100644 services/mineru/src/docs/images/flowchart_zh_cn.png create mode 100644 services/mineru/src/docs/images/layout_example.png create mode 100644 services/mineru/src/docs/images/logo.png create mode 100644 services/mineru/src/docs/images/logo.svg create mode 100644 services/mineru/src/docs/images/poly.png create mode 100644 services/mineru/src/docs/images/project_panorama_en.png create mode 100644 services/mineru/src/docs/images/project_panorama_zh_cn.png create mode 100644 services/mineru/src/docs/images/spans_example.png create mode 100644 services/mineru/src/docs/requirements.txt create mode 100644 services/mineru/src/docs/zh/demo/index.md create mode 100644 services/mineru/src/docs/zh/faq/index.md create mode 100644 services/mineru/src/docs/zh/index.md create mode 100644 services/mineru/src/docs/zh/quick_start/docker_deployment.md create mode 100644 services/mineru/src/docs/zh/quick_start/extension_modules.md create mode 100644 services/mineru/src/docs/zh/quick_start/index.md create mode 100644 services/mineru/src/docs/zh/reference/output_files.md create mode 100644 services/mineru/src/docs/zh/usage/acceleration_cards/AMD.md create mode 100644 services/mineru/src/docs/zh/usage/acceleration_cards/Ascend.md create mode 100644 services/mineru/src/docs/zh/usage/acceleration_cards/METAX.md create mode 100644 services/mineru/src/docs/zh/usage/acceleration_cards/Tecorigin.md create mode 100644 services/mineru/src/docs/zh/usage/advanced_cli_parameters.md create mode 100644 services/mineru/src/docs/zh/usage/cli_tools.md create mode 100644 services/mineru/src/docs/zh/usage/index.md create mode 100644 services/mineru/src/docs/zh/usage/model_source.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/BISHENG.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/Cherry_Studio.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/Coze.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/DataFlow.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/Dify.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/DingTalk.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/FastGPT.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/ModelWhale.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/RagFlow.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/Sider.md create mode 100644 services/mineru/src/docs/zh/usage/plugin/n8n.md create mode 100644 services/mineru/src/docs/zh/usage/quick_usage.md create mode 100644 services/mineru/src/mineru.egg-info/PKG-INFO create mode 100644 services/mineru/src/mineru.egg-info/SOURCES.txt create mode 100644 services/mineru/src/mineru.egg-info/dependency_links.txt create mode 100644 services/mineru/src/mineru.egg-info/entry_points.txt create mode 100644 services/mineru/src/mineru.egg-info/not-zip-safe create mode 100644 services/mineru/src/mineru.egg-info/requires.txt create mode 100644 services/mineru/src/mineru.egg-info/top_level.txt create mode 100644 services/mineru/src/mineru.template.json create mode 100644 services/mineru/src/mineru/__init__.py create mode 100644 services/mineru/src/mineru/backend/__init__.py create mode 100644 services/mineru/src/mineru/backend/pipeline/__init__.py create mode 100644 services/mineru/src/mineru/backend/pipeline/batch_analyze.py create mode 100644 services/mineru/src/mineru/backend/pipeline/model_init.py create mode 100644 services/mineru/src/mineru/backend/pipeline/model_json_to_middle_json.py create mode 100644 services/mineru/src/mineru/backend/pipeline/model_list.py create mode 100644 services/mineru/src/mineru/backend/pipeline/para_split.py create mode 100644 services/mineru/src/mineru/backend/pipeline/pipeline_analyze.py create mode 100644 services/mineru/src/mineru/backend/pipeline/pipeline_magic_model.py create mode 100644 services/mineru/src/mineru/backend/pipeline/pipeline_middle_json_mkcontent.py create mode 100644 services/mineru/src/mineru/backend/utils.py create mode 100644 services/mineru/src/mineru/backend/vlm/__init__.py create mode 100644 services/mineru/src/mineru/backend/vlm/model_output_to_middle_json.py create mode 100644 services/mineru/src/mineru/backend/vlm/utils.py create mode 100644 services/mineru/src/mineru/backend/vlm/vlm_analyze.py create mode 100644 services/mineru/src/mineru/backend/vlm/vlm_magic_model.py create mode 100644 services/mineru/src/mineru/backend/vlm/vlm_middle_json_mkcontent.py create mode 100644 services/mineru/src/mineru/cli/__init__.py create mode 100644 services/mineru/src/mineru/cli/client.py create mode 100644 services/mineru/src/mineru/cli/common.py create mode 100644 services/mineru/src/mineru/cli/fast_api.py create mode 100644 services/mineru/src/mineru/cli/gradio_app.py create mode 100644 services/mineru/src/mineru/cli/models_download.py create mode 100644 services/mineru/src/mineru/cli/vlm_vllm_server.py create mode 100644 services/mineru/src/mineru/data/__init__.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/__init__.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/base.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/dummy.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/filebase.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/multi_bucket_s3.py create mode 100644 services/mineru/src/mineru/data/data_reader_writer/s3.py create mode 100644 services/mineru/src/mineru/data/io/__init__.py create mode 100644 services/mineru/src/mineru/data/io/base.py create mode 100644 services/mineru/src/mineru/data/io/http.py create mode 100644 services/mineru/src/mineru/data/io/s3.py create mode 100644 services/mineru/src/mineru/data/utils/__init__.py create mode 100644 services/mineru/src/mineru/data/utils/exceptions.py create mode 100644 services/mineru/src/mineru/data/utils/path_utils.py create mode 100644 services/mineru/src/mineru/data/utils/schemas.py create mode 100644 services/mineru/src/mineru/model/__init__.py create mode 100644 services/mineru/src/mineru/model/layout/__init__.py create mode 100644 services/mineru/src/mineru/model/layout/doclayoutyolo.py create mode 100644 services/mineru/src/mineru/model/mfd/__init__.py create mode 100644 services/mineru/src/mineru/model/mfd/yolo_v8.py create mode 100644 services/mineru/src/mineru/model/mfr/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/pp_formulanet_plus_m/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/pp_formulanet_plus_m/predict_formula.py create mode 100644 services/mineru/src/mineru/model/mfr/pp_formulanet_plus_m/processors.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/Unimernet.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/modeling_unimernet.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_mbart/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_mbart/configuration_unimer_mbart.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_mbart/modeling_unimer_mbart.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_mbart/tokenization_unimer_mbart.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_swin/__init__.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_swin/configuration_unimer_swin.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_swin/image_processing_unimer_swin.py create mode 100644 services/mineru/src/mineru/model/mfr/unimernet/unimernet_hf/unimer_swin/modeling_unimer_swin.py create mode 100644 services/mineru/src/mineru/model/mfr/utils.py create mode 100644 services/mineru/src/mineru/model/ocr/__init__.py create mode 100644 services/mineru/src/mineru/model/ocr/pytorch_paddle.py create mode 100644 services/mineru/src/mineru/model/ori_cls/__init__.py create mode 100644 services/mineru/src/mineru/model/ori_cls/paddle_ori_cls.py create mode 100644 services/mineru/src/mineru/model/reading_order/__init__.py create mode 100644 services/mineru/src/mineru/model/reading_order/layout_reader.py create mode 100644 services/mineru/src/mineru/model/reading_order/xycut.py create mode 100644 services/mineru/src/mineru/model/table/__init__.py create mode 100644 services/mineru/src/mineru/model/table/cls/__init__.py create mode 100644 services/mineru/src/mineru/model/table/cls/paddle_table_cls.py create mode 100644 services/mineru/src/mineru/model/table/rec/RapidTable.py create mode 100644 services/mineru/src/mineru/model/table/rec/__init__.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/__init__.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/main.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/matcher.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/matcher_utils.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/table_structure.py create mode 100644 services/mineru/src/mineru/model/table/rec/slanet_plus/table_structure_utils.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/__init__.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/main.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/table_recover.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/table_structure_unet.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/utils.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/utils_table_line_rec.py create mode 100644 services/mineru/src/mineru/model/table/rec/unet_table/utils_table_recover.py create mode 100644 services/mineru/src/mineru/model/utils/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/base_ocr_v20.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/data/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/data/imaug/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/data/imaug/operators.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/architectures/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/architectures/base_model.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/det_mobilenet_v3.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_donut_swin.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_hgnet.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_lcnetv3.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_mobilenet_v3.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_mv1_enhance.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_pphgnetv2.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/backbones/rec_svtrnet.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/common.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/cls_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/det_db_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/rec_ctc_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/rec_multi_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/rec_ppformulanet_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/heads/rec_unimernet_head.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/necks/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/necks/db_fpn.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/necks/intracl.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/modeling/necks/rnn.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/postprocess/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/postprocess/cls_postprocess.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/postprocess/db_postprocess.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/postprocess/rec_postprocess.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/arch_config.yaml create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ka_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv4_doc_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_arabic_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_cyrillic_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_devanagari_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_el_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_en_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_eslav_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_korean_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_latin_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_ta_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_te_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/dict/ppocrv5_th_dict.txt create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/models_config.yml create mode 100644 services/mineru/src/mineru/model/utils/pytorchocr/utils/resources/pp_formulanet_arch_config.yaml create mode 100644 services/mineru/src/mineru/model/utils/tools/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/__init__.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/predict_cls.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/predict_det.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/predict_rec.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/predict_system.py create mode 100644 services/mineru/src/mineru/model/utils/tools/infer/pytorchocr_utility.py create mode 100644 services/mineru/src/mineru/model/vlm_vllm_model/__init__.py create mode 100644 services/mineru/src/mineru/model/vlm_vllm_model/server.py create mode 100644 services/mineru/src/mineru/resources/fasttext-langdetect/lid.176.ftz create mode 100644 services/mineru/src/mineru/resources/header.html create mode 100644 services/mineru/src/mineru/utils/__init__.py create mode 100644 services/mineru/src/mineru/utils/block_pre_proc.py create mode 100644 services/mineru/src/mineru/utils/block_sort.py create mode 100644 services/mineru/src/mineru/utils/boxbase.py create mode 100644 services/mineru/src/mineru/utils/check_sys_env.py create mode 100644 services/mineru/src/mineru/utils/cli_parser.py create mode 100644 services/mineru/src/mineru/utils/config_reader.py create mode 100644 services/mineru/src/mineru/utils/cut_image.py create mode 100644 services/mineru/src/mineru/utils/draw_bbox.py create mode 100644 services/mineru/src/mineru/utils/enum_class.py create mode 100644 services/mineru/src/mineru/utils/format_utils.py create mode 100644 services/mineru/src/mineru/utils/guess_suffix_or_lang.py create mode 100644 services/mineru/src/mineru/utils/hash_utils.py create mode 100644 services/mineru/src/mineru/utils/language.py create mode 100644 services/mineru/src/mineru/utils/llm_aided.py create mode 100644 services/mineru/src/mineru/utils/magic_model_utils.py create mode 100644 services/mineru/src/mineru/utils/model_utils.py create mode 100644 services/mineru/src/mineru/utils/models_download_utils.py create mode 100644 services/mineru/src/mineru/utils/ocr_utils.py create mode 100644 services/mineru/src/mineru/utils/os_env_config.py create mode 100644 services/mineru/src/mineru/utils/pdf_classify.py create mode 100644 services/mineru/src/mineru/utils/pdf_image_tools.py create mode 100644 services/mineru/src/mineru/utils/pdf_page_id.py create mode 100644 services/mineru/src/mineru/utils/pdf_reader.py create mode 100644 services/mineru/src/mineru/utils/pdf_text_tool.py create mode 100644 services/mineru/src/mineru/utils/run_async.py create mode 100644 services/mineru/src/mineru/utils/span_block_fix.py create mode 100644 services/mineru/src/mineru/utils/span_pre_proc.py create mode 100644 services/mineru/src/mineru/utils/table_merge.py create mode 100644 services/mineru/src/mineru/version.py create mode 100644 services/mineru/src/mkdocs.yml create mode 100644 services/mineru/src/projects/README.md create mode 100644 services/mineru/src/projects/README_zh-CN.md create mode 100644 services/mineru/src/projects/mcp/.gitignore create mode 100644 services/mineru/src/projects/mcp/DOCKER_README.md create mode 100644 services/mineru/src/projects/mcp/Dockerfile create mode 100644 services/mineru/src/projects/mcp/README.md create mode 100644 services/mineru/src/projects/mcp/docker-compose.yml create mode 100644 services/mineru/src/projects/mcp/pyproject.toml create mode 100644 services/mineru/src/projects/mcp/src/mineru/api.py create mode 100644 services/mineru/src/projects/mcp/src/mineru/cli.py create mode 100644 services/mineru/src/projects/mcp/src/mineru/config.py create mode 100644 services/mineru/src/projects/mcp/src/mineru/examples.py create mode 100644 services/mineru/src/projects/mcp/src/mineru/language.py create mode 100644 services/mineru/src/projects/mcp/src/mineru/server.py create mode 100644 services/mineru/src/projects/mineru_tianshu/README.md create mode 100644 services/mineru/src/projects/mineru_tianshu/api_server.py create mode 100644 services/mineru/src/projects/mineru_tianshu/client_example.py create mode 100644 services/mineru/src/projects/mineru_tianshu/litserve_worker.py create mode 100644 services/mineru/src/projects/mineru_tianshu/requirements.txt create mode 100644 services/mineru/src/projects/mineru_tianshu/start_all.py create mode 100644 services/mineru/src/projects/mineru_tianshu/task_db.py create mode 100644 services/mineru/src/projects/mineru_tianshu/task_scheduler.py create mode 100644 services/mineru/src/projects/multi_gpu_v2/README.md create mode 100644 services/mineru/src/projects/multi_gpu_v2/README_zh.md create mode 100644 services/mineru/src/projects/multi_gpu_v2/_config_endpoint.py create mode 100644 services/mineru/src/projects/multi_gpu_v2/client.py create mode 100644 services/mineru/src/projects/multi_gpu_v2/server.py create mode 100644 services/mineru/src/pyproject.toml create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/images/278eea7757c9a6bfec4e67e01de6ce50b9c617f7caae7cbefafd2b4da32ed077.jpg create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/images/3a4a2fa3ea82c53b69a6b9cfb60a8a0aa2f70971455d3b284b4a68a2db4b654e.jpg create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/images/4b88c9a89d31dbadcbef2ddbdb9ed3619ca82b32c70aea2a69321b4a12172807.jpg create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/test.md create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/test_content_list.json create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/test_middle.json create mode 100644 services/mineru/src/test_output/99fb338a-218a-4d46-a200-2057e4332db3/test/auto/test_model.json create mode 100644 services/mineru/src/tests/clean_coverage.py create mode 100644 services/mineru/src/tests/get_coverage.py create mode 100644 services/mineru/src/tests/unittest/pdfs/test.pdf create mode 100644 services/mineru/src/tests/unittest/test_e2e.py create mode 100644 services/mineru/src/update_version.py create mode 100644 services/mineru/start.ps1 create mode 100644 services/ollama/docker-compose.yml create mode 100644 services/rag_gateway/app/__init__.py create mode 100644 services/rag_gateway/app/api/__init__.py create mode 100644 services/rag_gateway/app/api/routes.py create mode 100644 services/rag_gateway/app/core/__init__.py create mode 100644 services/rag_gateway/app/core/config.py create mode 100644 services/rag_gateway/app/core/logging.py create mode 100644 services/rag_gateway/app/main.py create mode 100644 services/rag_gateway/app/services/__init__.py create mode 100644 services/rag_gateway/app/services/rag_service.py create mode 100644 src/app/api/documents/create-child/route.ts create mode 100644 src/components/editor/blocks/PageReferenceBlock.tsx create mode 100644 src/components/editor/schema.ts create mode 100644 supabase.md create mode 100644 supabase/migrations/20250221_add_document_options.sql create mode 100644 supabase/migrations/20250221_add_media_assets.sql create mode 100644 supabase/migrations/20250221_add_page_refs.sql create mode 100644 supabase/migrations/20250221_add_user_recent_pages.sql create mode 100644 supabase/migrations/20250222_add_document_tables.sql create mode 100644 supabase/migrations/20250222_add_media_bucket.sql create mode 100644 supabase/migrations/20250222_alter_media_assets_add_fileinfo.sql create mode 100644 test/image copy 2.png create mode 100644 test/image copy 20.png create mode 100644 test/image copy.png create mode 100644 test/image copy00.png create mode 100644 test/image.png create mode 100644 test/image2.png create mode 100644 test/image3.png create mode 100644 test/image4.png create mode 100644 wolai-backend/.gitignore create mode 100644 wolai-backend/README.md create mode 100644 wolai-backend/app/__init__.py create mode 100644 wolai-backend/app/config.py create mode 100644 wolai-backend/app/deps.py create mode 100644 wolai-backend/app/main.py create mode 100644 wolai-backend/app/routers/__init__.py create mode 100644 wolai-backend/app/routers/chat.py create mode 100644 wolai-backend/app/routers/health.py create mode 100644 wolai-backend/app/routers/tasks.py create mode 100644 wolai-backend/app/schemas/tasks.py create mode 100644 wolai-backend/app/services/lightrag_service.py create mode 100644 wolai-backend/app/services/mineru_service.py create mode 100644 wolai-backend/app/services/supabase_rest.py create mode 100644 wolai-backend/app/services/task_tracker.py create mode 100644 wolai-backend/app/workers/celery_app.py create mode 100644 wolai-backend/app/workers/tasks.py create mode 100644 wolai-backend/celery.err create mode 100644 wolai-backend/celery.out create mode 100644 wolai-backend/requirements.txt create mode 100644 wolai-backend/uvicorn-run.err create mode 100644 wolai-backend/uvicorn-run.out create mode 100644 wolai-backend/uvicorn.err create mode 100644 wolai-backend/uvicorn.out create mode 100644 wolai-frontend/.gitignore create mode 100644 wolai-frontend/README.md create mode 100644 wolai-frontend/components.json create mode 100644 wolai-frontend/dev-3001.err create mode 100644 wolai-frontend/dev-3001.out create mode 100644 wolai-frontend/eslint.config.mjs create mode 100644 wolai-frontend/frontend-3001.err create mode 100644 wolai-frontend/frontend-3001.out create mode 100644 wolai-frontend/frontend.err create mode 100644 wolai-frontend/frontend.out create mode 100644 wolai-frontend/next.config.ts create mode 100644 wolai-frontend/package.json create mode 100644 wolai-frontend/pnpm-lock.yaml create mode 100644 wolai-frontend/postcss.config.mjs create mode 100644 wolai-frontend/public/file.svg create mode 100644 wolai-frontend/public/globe.svg create mode 100644 wolai-frontend/public/next.svg create mode 100644 wolai-frontend/public/vercel.svg create mode 100644 wolai-frontend/public/window.svg create mode 100644 wolai-frontend/src/app/(app)/documents/[id]/loading.tsx create mode 100644 wolai-frontend/src/app/(app)/documents/[id]/page.tsx create mode 100644 wolai-frontend/src/app/(app)/layout.tsx create mode 100644 wolai-frontend/src/app/(auth)/login/page.tsx create mode 100644 wolai-frontend/src/app/api/.gitkeep create mode 100644 wolai-frontend/src/app/api/documents/create-child/route.ts create mode 100644 wolai-frontend/src/app/api/documents/create/route.ts create mode 100644 wolai-frontend/src/app/api/documents/delete/route.ts create mode 100644 wolai-frontend/src/app/api/documents/duplicate/route.ts create mode 100644 wolai-frontend/src/app/api/documents/embed/route.ts create mode 100644 wolai-frontend/src/app/api/documents/empty-trash/route.ts create mode 100644 wolai-frontend/src/app/api/documents/move/route.ts create mode 100644 wolai-frontend/src/app/api/documents/options/route.ts create mode 100644 wolai-frontend/src/app/api/documents/purge/route.ts create mode 100644 wolai-frontend/src/app/api/documents/restore/route.ts create mode 100644 wolai-frontend/src/app/api/documents/save/route.ts create mode 100644 wolai-frontend/src/app/api/documents/stats/route.ts create mode 100644 wolai-frontend/src/app/api/documents/title/route.ts create mode 100644 wolai-frontend/src/app/api/media/assets/route.ts create mode 100644 wolai-frontend/src/app/api/media/ocr/route.ts create mode 100644 wolai-frontend/src/app/api/media/upload/route.ts create mode 100644 wolai-frontend/src/app/api/references/backlinks/route.ts create mode 100644 wolai-frontend/src/app/api/references/record/route.ts create mode 100644 wolai-frontend/src/app/api/search/documents/route.ts create mode 100644 wolai-frontend/src/app/api/search/recent/route.ts create mode 100644 wolai-frontend/src/app/api/sidebar/route.ts create mode 100644 wolai-frontend/src/app/api/workspaces/switch/route.ts create mode 100644 wolai-frontend/src/app/favicon.ico create mode 100644 wolai-frontend/src/app/globals.css create mode 100644 wolai-frontend/src/app/layout.tsx create mode 100644 wolai-frontend/src/app/page.tsx create mode 100644 wolai-frontend/src/components/bottom-toolbar.tsx create mode 100644 wolai-frontend/src/components/breadcrumb.tsx create mode 100644 wolai-frontend/src/components/common/.gitkeep create mode 100644 wolai-frontend/src/components/document-task-panel.tsx create mode 100644 wolai-frontend/src/components/editor/.gitkeep create mode 100644 wolai-frontend/src/components/editor/blocknote-editor.tsx create mode 100644 wolai-frontend/src/components/editor/blocks/AdvancedTodoBlock.tsx create mode 100644 wolai-frontend/src/components/editor/blocks/MediaBlock.tsx create mode 100644 wolai-frontend/src/components/editor/blocks/PageReferenceBlock.tsx create mode 100644 wolai-frontend/src/components/editor/blocks/ProgressBlock.tsx create mode 100644 wolai-frontend/src/components/editor/document-content.tsx create mode 100644 wolai-frontend/src/components/editor/document-history-drawer.tsx create mode 100644 wolai-frontend/src/components/editor/document-shell.tsx create mode 100644 wolai-frontend/src/components/editor/document-toc.tsx create mode 100644 wolai-frontend/src/components/editor/menus/CustomSideMenu.tsx create mode 100644 wolai-frontend/src/components/editor/menus/CustomSlashMenu.tsx create mode 100644 wolai-frontend/src/components/editor/page-backlinks-panel.tsx create mode 100644 wolai-frontend/src/components/editor/page-options-sidebar.tsx create mode 100644 wolai-frontend/src/components/editor/schema.ts create mode 100644 wolai-frontend/src/components/media/image-picker-context.tsx create mode 100644 wolai-frontend/src/components/media/image-picker-dialog.tsx create mode 100644 wolai-frontend/src/components/mindmap/.gitkeep create mode 100644 wolai-frontend/src/components/mobile-sidebar-trigger.tsx create mode 100644 wolai-frontend/src/components/providers/query-provider.tsx create mode 100644 wolai-frontend/src/components/providers/supabase-provider.tsx create mode 100644 wolai-frontend/src/components/reference/page-hover-card.tsx create mode 100644 wolai-frontend/src/components/search/search-palette.tsx create mode 100644 wolai-frontend/src/components/sidebar/.gitkeep create mode 100644 wolai-frontend/src/components/sidebar/private-tree.tsx create mode 100644 wolai-frontend/src/components/sidebar/sidebar.tsx create mode 100644 wolai-frontend/src/components/sidebar/types.ts create mode 100644 wolai-frontend/src/components/ui/avatar.tsx create mode 100644 wolai-frontend/src/components/ui/badge.tsx create mode 100644 wolai-frontend/src/components/ui/button.tsx create mode 100644 wolai-frontend/src/components/ui/card.tsx create mode 100644 wolai-frontend/src/components/ui/command.tsx create mode 100644 wolai-frontend/src/components/ui/dialog.tsx create mode 100644 wolai-frontend/src/components/ui/drawer.tsx create mode 100644 wolai-frontend/src/components/ui/dropdown-menu.tsx create mode 100644 wolai-frontend/src/components/ui/hover-card.tsx create mode 100644 wolai-frontend/src/components/ui/input.tsx create mode 100644 wolai-frontend/src/components/ui/label.tsx create mode 100644 wolai-frontend/src/components/ui/popover.tsx create mode 100644 wolai-frontend/src/components/ui/scroll-area.tsx create mode 100644 wolai-frontend/src/components/ui/separator.tsx create mode 100644 wolai-frontend/src/components/ui/sheet.tsx create mode 100644 wolai-frontend/src/components/ui/skeleton.tsx create mode 100644 wolai-frontend/src/components/ui/tabs.tsx create mode 100644 wolai-frontend/src/components/ui/textarea.tsx create mode 100644 wolai-frontend/src/components/ui/toggle.tsx create mode 100644 wolai-frontend/src/hooks/.gitkeep create mode 100644 wolai-frontend/src/hooks/use-backend-health.ts create mode 100644 wolai-frontend/src/hooks/use-backlinks.ts create mode 100644 wolai-frontend/src/hooks/use-debounced-callback.ts create mode 100644 wolai-frontend/src/hooks/use-document-search.ts create mode 100644 wolai-frontend/src/hooks/use-reference-composer.ts create mode 100644 wolai-frontend/src/hooks/use-sidebar-data.ts create mode 100644 wolai-frontend/src/lib/document-content.ts create mode 100644 wolai-frontend/src/lib/documents.ts create mode 100644 wolai-frontend/src/lib/search/record-recent.ts create mode 100644 wolai-frontend/src/lib/search/request.test.ts create mode 100644 wolai-frontend/src/lib/search/request.ts create mode 100644 wolai-frontend/src/lib/search/shortcuts.test.ts create mode 100644 wolai-frontend/src/lib/search/shortcuts.ts create mode 100644 wolai-frontend/src/lib/search/snippet.test.ts create mode 100644 wolai-frontend/src/lib/search/snippet.ts create mode 100644 wolai-frontend/src/lib/server-cookies.ts create mode 100644 wolai-frontend/src/lib/sidebar-tree.ts create mode 100644 wolai-frontend/src/lib/supabase/client.ts create mode 100644 wolai-frontend/src/lib/supabase/server.ts create mode 100644 wolai-frontend/src/lib/utils.ts create mode 100644 wolai-frontend/src/lib/workspaces.ts create mode 100644 wolai-frontend/src/store/.gitkeep create mode 100644 wolai-frontend/src/store/editor-bridge.ts create mode 100644 wolai-frontend/src/store/page-layout.ts create mode 100644 wolai-frontend/src/store/search-palette.ts create mode 100644 wolai-frontend/src/store/sidebar.ts create mode 100644 wolai-frontend/src/types/document.ts create mode 100644 wolai-frontend/src/types/media.ts create mode 100644 wolai-frontend/src/types/page-options.ts create mode 100644 wolai-frontend/src/types/references.ts create mode 100644 wolai-frontend/src/types/search.ts create mode 100644 wolai-frontend/src/types/supabase.ts create mode 100644 wolai-frontend/start-4000.err create mode 100644 wolai-frontend/start-4000.out create mode 100644 wolai-frontend/tsconfig.json create mode 100644 wolai-frontend/vitest.config.ts create mode 100644 wolaiplan copy 2.md create mode 100644 wolaiplan copy.md create mode 100644 wolaiplan.md diff --git a/.agent/rules/mnote.md b/.agent/rules/mnote.md new file mode 100644 index 00000000..a5978c0e --- /dev/null +++ b/.agent/rules/mnote.md @@ -0,0 +1,5 @@ +--- +trigger: always_on +--- + +数据库操作请使用supabase_Local MCP 进行操作。 \ No newline at end of file diff --git a/.codex/.gitignore b/.codex/.gitignore new file mode 100644 index 00000000..3fec32c8 --- /dev/null +++ b/.codex/.gitignore @@ -0,0 +1 @@ +tmp/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..52cc1391 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +node_modules/ +**/node_modules/ +.next/ +**/.next/ +dist/ +**/dist/ +build/ +**/build/ +.turbo/ +pnpm-debug.log* +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*.log +.DS_Store +.env +.env.* +.vscode/ +*.local +tmp/ +temp/ +**/.venv/ +.venv/ +**/__pycache__/ +__pycache__/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..caabfcdf --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,383 @@ +When asked to design UI & frontend interface +When asked to design UI & frontend interface +# Role +You are superdesign, a senior frontend designer integrated into VS Code as part of the Super Design extension. +Your goal is to help user generate amazing design using code + +# Instructions +- Use the available tools when needed to help with file operations and code analysis +- When creating design file: + - Build one single html page of just one screen to build a design based on users' feedback/task + - You ALWAYS output design files in '.superdesign/design_iterations' folder as {design_name}_{n}.html (Where n needs to be unique like table_1.html, table_2.html, etc.) or svg file + - If you are iterating design based on existing file, then the naming convention should be {current_file_name}_{n}.html, e.g. if we are iterating ui_1.html, then each version should be ui_1_1.html, ui_1_2.html, etc. +- You should ALWAYS use tools above for write/edit html files, don't just output in a message, always do tool calls + +## Styling +1. superdesign tries to use the flowbite library as a base unless the user specifies otherwise. +2. superdesign avoids using indigo or blue colors unless specified in the user's request. +3. superdesign MUST generate responsive designs. +4. When designing component, poster or any other design that is not full app, you should make sure the background fits well with the actual poster or component UI color; e.g. if component is light then background should be dark, vice versa. +5. Font should always using google font, below is a list of default fonts: 'JetBrains Mono', 'Fira Code', 'Source Code Pro','IBM Plex Mono','Roboto Mono','Space Mono','Geist Mono','Inter','Roboto','Open Sans','Poppins','Montserrat','Outfit','Plus Jakarta Sans','DM Sans','Geist','Oxanium','Architects Daughter','Merriweather','Playfair Display','Lora','Source Serif Pro','Libre Baskerville','Space Grotesk' +6. When creating CSS, make sure you include !important for all properties that might be overwritten by tailwind & flowbite, e.g. h1, body, etc. +7. Unless user asked specifcially, you should NEVER use some bootstrap style blue color, those are terrible color choices, instead looking at reference below. +8. Example theme patterns: +Ney-brutalism style that feels like 90s web design + +:root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0 0 0); + --primary: oklch(0.6489 0.2370 26.9728); + --primary-foreground: oklch(1.0000 0 0); + --secondary: oklch(0.9680 0.2110 109.7692); + --secondary-foreground: oklch(0 0 0); + --muted: oklch(0.9551 0 0); + --muted-foreground: oklch(0.3211 0 0); + --accent: oklch(0.5635 0.2408 260.8178); + --accent-foreground: oklch(1.0000 0 0); + --destructive: oklch(0 0 0); + --destructive-foreground: oklch(1.0000 0 0); + --border: oklch(0 0 0); + --input: oklch(0 0 0); + --ring: oklch(0.6489 0.2370 26.9728); + --chart-1: oklch(0.6489 0.2370 26.9728); + --chart-2: oklch(0.9680 0.2110 109.7692); + --chart-3: oklch(0.5635 0.2408 260.8178); + --chart-4: oklch(0.7323 0.2492 142.4953); + --chart-5: oklch(0.5931 0.2726 328.3634); + --sidebar: oklch(0.9551 0 0); + --sidebar-foreground: oklch(0 0 0); + --sidebar-primary: oklch(0.6489 0.2370 26.9728); + --sidebar-primary-foreground: oklch(1.0000 0 0); + --sidebar-accent: oklch(0.5635 0.2408 260.8178); + --sidebar-accent-foreground: oklch(1.0000 0 0); + --sidebar-border: oklch(0 0 0); + --sidebar-ring: oklch(0.6489 0.2370 26.9728); + --font-sans: DM Sans, sans-serif; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: Space Mono, monospace; + --radius: 0px; + --shadow-2xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-xs: 4px 4px 0px 0px hsl(0 0% 0% / 0.50); + --shadow-sm: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 1px 2px -1px hsl(0 0% 0% / 1.00); + --shadow-md: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 2px 4px -1px hsl(0 0% 0% / 1.00); + --shadow-lg: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 4px 6px -1px hsl(0 0% 0% / 1.00); + --shadow-xl: 4px 4px 0px 0px hsl(0 0% 0% / 1.00), 4px 8px 10px -1px hsl(0 0% 0% / 1.00); + --shadow-2xl: 4px 4px 0px 0px hsl(0 0% 0% / 2.50); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +Modern dark mode style like vercel, linear + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.1450 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.1450 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.1450 0 0); + --primary: oklch(0.2050 0 0); + --primary-foreground: oklch(0.9850 0 0); + --secondary: oklch(0.9700 0 0); + --secondary-foreground: oklch(0.2050 0 0); + --muted: oklch(0.9700 0 0); + --muted-foreground: oklch(0.5560 0 0); + --accent: oklch(0.9700 0 0); + --accent-foreground: oklch(0.2050 0 0); + --destructive: oklch(0.5770 0.2450 27.3250); + --destructive-foreground: oklch(1 0 0); + --border: oklch(0.9220 0 0); + --input: oklch(0.9220 0 0); + --ring: oklch(0.7080 0 0); + --chart-1: oklch(0.8100 0.1000 252); + --chart-2: oklch(0.6200 0.1900 260); + --chart-3: oklch(0.5500 0.2200 263); + --chart-4: oklch(0.4900 0.2200 264); + --chart-5: oklch(0.4200 0.1800 266); + --sidebar: oklch(0.9850 0 0); + --sidebar-foreground: oklch(0.1450 0 0); + --sidebar-primary: oklch(0.2050 0 0); + --sidebar-primary-foreground: oklch(0.9850 0 0); + --sidebar-accent: oklch(0.9700 0 0); + --sidebar-accent-foreground: oklch(0.2050 0 0); + --sidebar-border: oklch(0.9220 0 0); + --sidebar-ring: oklch(0.7080 0 0); + --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --radius: 0.625rem; + --shadow-2xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-xs: 0 1px 3px 0px hsl(0 0% 0% / 0.05); + --shadow-sm: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 1px 2px -1px hsl(0 0% 0% / 0.10); + --shadow-md: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 2px 4px -1px hsl(0 0% 0% / 0.10); + --shadow-lg: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 4px 6px -1px hsl(0 0% 0% / 0.10); + --shadow-xl: 0 1px 3px 0px hsl(0 0% 0% / 0.10), 0 8px 10px -1px hsl(0 0% 0% / 0.10); + --shadow-2xl: 0 1px 3px 0px hsl(0 0% 0% / 0.25); + --tracking-normal: 0em; + --spacing: 0.25rem; + + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); +} + + +## Images & icons +1. For images, just use placeholder image from public source like unsplash, placehold.co or others that you already know exact image url; Don't make up urls +2. For icons, we should use lucid icons or other public icons, import like + +## Script +1. When importing tailwind css, just use , don't load CSS directly as a stylesheet resource like +2. When using flowbite, import like + +## Workflow +You should always follow workflow below unless user explicitly ask you to do something else: +1. Layout design +2. Theme design (Color, font, spacing, shadown), using generateTheme tool, it should save the css to a local file +3. Core Animation design +4. Generate a singlehtml file for the UI +5. You HAVE TO confirm with user step by step, don't do theme design until user sign off the layout design, same for all follownig steps + +### 1. Layout design +Output type: Just text +Think through how should the layout of interface look like, what are different UI components +And present the layout in ASCII wireframe format, here are the guidelines of good ASCII wireframe, you can do ASCII art too for more custom layout or graphic design + +### 2. Theme design +Output type: Tool call +Think through what are the colors, fonts, spacing, etc. +You HAVE TO use generateTheme tool to generate the theme, do NOT just output XML type text for tool-call, that is not allowed + +### 3. Animation design +Output type: Just text +Think through what are the animations, transitions, etc. + +### 4. Generate html file for each UI component and then combine them together to form a single html file +Output type: Tool call +Generate html file for each UI component and then combine them together to form a single html file +Make sure to reference the theme css file you created in step 2, and add custom ones that doesn't exist yet in html file +You HAVE TO use write tool to generate the html file, do NOT just output XML type text for tool-call, that is not allowed + + +design an AI chat UI + + +Let's think through the layout design for an AI chat UI. Here are the key components and layout considerations: + +## Core UI Components + +**Header Area** +- Settings/menu button (Top left) +- Chat title/AI name (Top left) +- Conversation controls (new chat, clear, etc.) (Top right) + +**Main Chat Area** +- Message container (scrollable) (Full width & height) +- User messages (typically right-aligned) +- AI messages (typically left-aligned) +- Message timestamps (Small subtle text at the bottom of each message, aligned to the right/left depending on the message) + +**Input Area** +- Text input field (Full width left) +- Send button (Embed within the input field,Bottom right side of the screen) +- Additional controls (attach files, voice input, etc.) (Embed within the input field, Bottom left) +- Character/token counter (optional) (Embed within the input field, top right corner, small text) + + +## Layout Structure Options + +┌─────────────────────────────────────┐ +│ ☰ HEADER BAR + │ +├─────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ User Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ AI Message Bubble │ │ +│ └─────────────────────────────┘ │ +│ │ +│ [CHAT AREA] │ +│ │ +├─────────────────────────────────────┤ +│ [Text Input Field] [Send] │ +└─────────────────────────────────────┘ + +When hamburger (☰) is clicked, sidebar slides out: +┌──────────────┬─────────────────────────────────────┐ +│ SIDEBAR │ ☰ HEADER BAR + │ +│ ┌──────────┐ ├─────────────────────────────────────┤ +│ │ Chat 1 │ │ │ +│ │ Chat 2 │ │ ┌─────────────────────────────┐ │ +│ │ Chat 3 │ │ │ AI Message Bubble │ │ +│ │ + New │ │ └─────────────────────────────┘ │ +│ └──────────┘ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ User Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ ┌─────────────────────────────┐ │ +│ │ │ AI Message Bubble │ │ +│ │ └─────────────────────────────┘ │ +│ │ │ +│ │ [CHAT AREA] │ +│ │ │ +│ ├─────────────────────────────────────┤ +│ │ [Text Input Field] [Send] │ +└──────────────┘─────────────────────────────────────┘ + +Would you like to go ahead with this layout & UI interaction or needs any modification? + + + +They looks good + + + +Great, next let's design the color & font theme, + +generateTheme(theme_name='Vercel techy style', reasoning_reference='Reference classic shadcn style that has ...', cssFilePath='.superdesign/design_iterations/theme_1.css', cssSheet=':root { + --background: oklch(1.0000 0 0); + --foreground: oklch(0.1448 0 0); + --card: oklch(1.0000 0 0); + --card-foreground: oklch(0.1448 0 0); + --popover: oklch(1.0000 0 0); + --popover-foreground: oklch(0.1448 0 0); + --primary: oklch(0.5555 0 0); + --primary-foreground: oklch(0.9851 0 0); + --secondary: oklch(0.9702 0 0); + --secondary-foreground: oklch(0.2046 0 0); + --muted: oklch(0.9702 0 0); + --muted-foreground: oklch(0.5486 0 0); + --accent: oklch(0.9702 0 0); + --accent-foreground: oklch(0.2046 0 0); + --destructive: oklch(0.5830 0.2387 28.4765); + --destructive-foreground: oklch(0.9702 0 0); + --border: oklch(0.9219 0 0); + --input: oklch(0.9219 0 0); + --ring: oklch(0.7090 0 0); + --chart-1: oklch(0.5555 0 0); + --chart-2: oklch(0.5555 0 0); + --chart-3: oklch(0.5555 0 0); + --chart-4: oklch(0.5555 0 0); + --chart-5: oklch(0.5555 0 0); + --sidebar: oklch(0.9851 0 0); + --sidebar-foreground: oklch(0.1448 0 0); + --sidebar-primary: oklch(0.2046 0 0); + --sidebar-primary-foreground: oklch(0.9851 0 0); + --sidebar-accent: oklch(0.9702 0 0); + --sidebar-accent-foreground: oklch(0.2046 0 0); + --sidebar-border: oklch(0.9219 0 0); + --sidebar-ring: oklch(0.7090 0 0); + --font-sans: Geist Mono, monospace; + --font-serif: Geist Mono, monospace; + --font-mono: Geist Mono, monospace; + --radius: 0rem; + --shadow-2xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-xs: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --shadow-sm: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 1px 2px -1px hsl(0 0% 0% / 0.00); + --shadow-md: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 2px 4px -1px hsl(0 0% 0% / 0.00); + --shadow-lg: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 4px 6px -1px hsl(0 0% 0% / 0.00); + --shadow-xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00), 0px 8px 10px -1px hsl(0 0% 0% / 0.00); + --shadow-2xl: 0px 1px 0px 0px hsl(0 0% 0% / 0.00); + --tracking-normal: 0em; + --spacing: 0.25rem; +}') + + + +I like the vintage style + + + +Great, next let's design the animation: + +# CHAT UI ANIMATIONS - MICRO-SYNTAX + +## Core Message Flow +userMsg: 400ms ease-out [Y+20→0, X+10→0, S0.9→1] +aiMsg: 600ms bounce [Y+15→0, S0.95→1] +200ms +typing: 1400ms ∞ [Y±8, α0.4→1] stagger+200ms +status: 300ms ease-out [α0.6→1, S1→1.05→1] + +## Interface Transitions +sidebar: 350ms ease-out [X-280→0, α0→1] +overlay: 300ms [α0→1, blur0→4px] +input: 200ms [S1→1.01, shadow+ring] focus +input: 150ms [S1.01→1, shadow-ring] blur + +## Button Interactions +sendBtn: 150ms [S1→0.95→1, R±2°] press +sendBtn: 200ms [S1→1.05, shadow↗] hover +ripple: 400ms [S0→2, α1→0] + +## Loading States +chatLoad: 500ms ease-out [Y+40→0, α0→1] +skeleton: 2000ms ∞ [bg: muted↔accent] +spinner: 1000ms ∞ linear [R360°] + +## Micro Interactions +msgHover: 200ms [Y0→-2, shadow↗] +msgSelect: 200ms [bg→accent, S1→1.02] +error: 400ms [X±5] shake +success: 600ms bounce [S0→1.2→1, R360°] + +## Scroll & Navigation +autoScroll: 400ms smooth +scrollHint: 800ms ∞×3 [Y±5] + +This animation system creates a cohesive, responsive feel throughout the chat interface. Each animation has specific timing and easing to feel natural and purposeful. Would you like me to adjust any of these animations or add additional ones? + + + + +This looks great, lets do it + + + +Great, I will generate the html file for each UI component and then combine them together to form a single html file + +write(file_path='.superdesign/design_iterations/chat_ui.css', content='...') +write(file_path='.superdesign/design_iterations/chat_ui.html', content='...') + +I've created the html design, please reveiw and let me know if you need any changes + + + +IMPORTANT RULES: +1. You MUST use tools call below for any action like generateTheme, write, edit, etc. You are NOT allowed to just output text like 'Called tool: write with arguments: ...' or ...; MUST USE TOOL CALL (This is very important!!) +2. You MUST confirm the layout, and then theme style, and then animation +3. You MUST use .superdesign/design_iterations folder to save the design files, do NOT save to other folders +4. You MUST create follow the workflow above + +# Available Tools +- **read**: Read file contents within the workspace (supports text files, images, with line range options) +- **write**: Write content to files in the workspace (creates parent directories automatically) +- **edit**: Replace text within files using exact string matching (requires precise text matching including whitespace and indentation) +- **multiedit**: Perform multiple find-and-replace operations on a single file in sequence (each edit applied to result of previous edit) +- **glob**: Find files and directories matching glob patterns (e.g., "*.js", "src/**/*.ts") - efficient for locating files by name or path structure +- **grep**: Search for text patterns within file contents using regular expressions (can filter by file types and paths) +- **ls**: List directory contents with optional filtering, sorting, and detailed information (shows files and subdirectories) +- **bash**: Execute shell/bash commands within the workspace (secure execution with timeouts and output capture) +- **generateTheme**: Generate a theme for the design + +When calling tools, you MUST use the actual tool call, do NOT just output text like 'Called tool: write with arguments: ...' or ..., this won't actually call the tool. (This is very important to my life, please follow) \ No newline at end of file diff --git a/LightRAG/.clinerules/01-basic.md b/LightRAG/.clinerules/01-basic.md new file mode 100644 index 00000000..955afa83 --- /dev/null +++ b/LightRAG/.clinerules/01-basic.md @@ -0,0 +1,232 @@ +# LightRAG Project Intelligence (.clinerules) + +## Project Overview +LightRAG is a mature, production-ready Retrieval-Augmented Generation (RAG) system with comprehensive knowledge graph capabilities. The system has evolved from experimental to production-ready status with extensive functionality across all major components. + +## Current System State (August 15, 2025) +- **Status**: Production Ready - Stable and Mature +- **Configuration**: Gemini 2.5 Flash + BAAI/bge-m3 embeddings via custom endpoints +- **Storage**: Default in-memory with file persistence (JsonKVStorage, NetworkXStorage, NanoVectorDBStorage) +- **Language**: Chinese for summaries +- **Workspace**: `space1` for data isolation +- **Authentication**: JWT-based with admin/user accounts + +## Critical Implementation Patterns + +### 1. Embedding Format Compatibility (CRITICAL) +**Pattern**: Always handle both base64 and raw array embedding formats +**Location**: `lightrag/llm/openai.py` - `openai_embed` function +**Issue**: Custom OpenAI-compatible endpoints return embeddings as raw arrays, not base64 strings +**Solution**: +```python +np.array(dp.embedding, dtype=np.float32) if isinstance(dp.embedding, list) +else np.frombuffer(base64.b64decode(dp.embedding), dtype=np.float32) +``` +**Impact**: Document processing fails completely without this dual format support + +### 2. Async Pattern Consistency (CRITICAL) +**Pattern**: Always await coroutines before calling methods on the result +**Common Error**: `coroutine.method()` instead of `(await coroutine).method()` +**Locations**: MongoDB implementations, Neo4j operations +**Example**: `await self._data.list_indexes()` then `await cursor.to_list()` + +### 3. Storage Layer Data Compatibility (CRITICAL) +**Pattern**: Always filter deprecated/incompatible fields during deserialization +**Common Fields to Remove**: `content`, `_id` (MongoDB), database-specific fields +**Implementation**: `data.pop('field_name', None)` before creating dataclass objects +**Locations**: All storage implementations (JSON, Redis, MongoDB, PostgreSQL) + +### 4. Lock Key Generation (CRITICAL) +**Pattern**: Always sort relationship pairs for consistent lock keys +**Implementation**: `sorted_key_parts = sorted([src, tgt])` then `f"{sorted_key_parts[0]}-{sorted_key_parts[1]}"` +**Impact**: Prevents deadlocks in concurrent relationship processing + +### 5. Event Loop Management (CRITICAL) +**Pattern**: Handle event loop mismatches during shutdown gracefully +**Implementation**: Timeout + specific RuntimeError handling for "attached to a different loop" +**Location**: Neo4j storage finalization +**Impact**: Prevents application shutdown failures + +### 6. Async Generator Lock Management (CRITICAL) +**Pattern**: Never hold locks across async generator yields - create snapshots instead +**Issue**: Holding locks while yielding causes deadlock when consumers need the same lock +**Location**: `lightrag/tools/migrate_llm_cache.py` - `stream_default_caches_json` +**Solution**: Create snapshot of data while holding lock, release lock, then iterate over snapshot +```python +# WRONG - Deadlock prone: +async with storage._storage_lock: + for key, value in storage._data.items(): + batch[key] = value + if len(batch) >= batch_size: + yield batch # Lock still held! + +# CORRECT - Snapshot approach: +async with storage._storage_lock: + matching_items = [(k, v) for k, v in storage._data.items() if condition] +# Lock released here +for key, value in matching_items: + batch[key] = value + if len(batch) >= batch_size: + yield batch # No lock held +``` +**Impact**: Prevents deadlocks in Json→Json migrations and similar scenarios where source/target share locks +**Applicable To**: Any async generator that needs to access shared resources while yielding + +## Architecture Patterns + +### 1. Dependency Injection +**Pattern**: Pass configuration through object constructors, not direct imports +**Example**: OllamaAPI receives configuration through LightRAG object +**Benefit**: Better testability and modularity + +### 2. Memory Bank Documentation +**Pattern**: Maintain comprehensive memory bank for development continuity +**Structure**: Core files (projectbrief.md, activeContext.md, progress.md, etc.) +**Purpose**: Essential for context preservation across development sessions + +### 3. Configuration Management +**Pattern**: Centralize defaults in constants.py, use environment variables for runtime config +**Implementation**: Default values in constants, override via .env file +**Benefit**: Consistent configuration across components + +## Development Workflow Patterns + +### 1. Frontend Development (CRITICAL) +**Package Manager**: **ALWAYS USE BUN** - Never use npm or yarn unless Bun is unavailable +**Commands**: +- `bun install` - Install dependencies +- `bun run dev` - Start development server +- `bun run build` - Build for production +- `bun run lint` - Run linting +- `bun test` - Run tests +- `bun run preview` - Preview production build + +**Pattern**: All frontend operations must use Bun commands +**Fallback**: Only use npm/yarn if Bun installation fails +**Testing**: Use `bun test` for all frontend testing + +### 2. Bug Fix Approach +1. **Identify root cause** - Don't just fix symptoms +2. **Implement robust solution** - Handle edge cases and format variations +3. **Maintain backward compatibility** - Preserve existing functionality +4. **Add comprehensive error handling** - Graceful degradation +5. **Document the fix** - Update memory bank with technical details + +### 3. Feature Implementation +1. **Follow existing patterns** - Maintain architectural consistency +2. **Use dependency injection** - Avoid direct imports between modules +3. **Implement comprehensive error handling** - Handle all failure modes +4. **Add proper logging** - Debug and warning messages +5. **Update documentation** - Memory bank and code comments +6. **Comment Language** - Use English for comments and documentation + +### 4. Performance Optimization +1. **Profile before optimizing** - Identify actual bottlenecks +2. **Maintain algorithmic correctness** - Don't sacrifice functionality for speed +3. **Use appropriate data structures** - Match structure to access patterns +4. **Implement caching strategically** - Cache expensive operations +5. **Monitor memory usage** - Prevent memory leaks + +## Technology Stack Intelligence + +### 1. LLM Integration +- **Primary**: Gemini 2.5 Flash via custom endpoint +- **Embedding**: BAAI/bge-m3 via custom endpoint +- **Reranking**: BAAI/bge-reranker-v2-m3 +- **Pattern**: Always handle multiple provider formats + +### 2. Storage Backends +- **Default**: In-memory with file persistence +- **Production Options**: PostgreSQL, MongoDB, Redis, Neo4j +- **Pattern**: Abstract storage interface with multiple implementations + +### 3. API Architecture +- **Framework**: FastAPI with Gunicorn for production +- **Authentication**: JWT-based with role support +- **Compatibility**: Ollama-compatible endpoints for easy integration + +### 4. Frontend +- **Framework**: React with TypeScript +- **Package Manager**: **BUN (REQUIRED)** - Always use Bun for all frontend operations +- **Build Tool**: Vite with Bun runtime +- **Visualization**: Sigma.js for graph rendering +- **State Management**: React hooks with context +- **Internationalization**: i18next for multi-language support + +## Common Pitfalls and Solutions + +### 1. Embedding Format Issues +**Pitfall**: Assuming all endpoints return base64-encoded embeddings +**Solution**: Always check format and handle both base64 and raw arrays + +### 2. Async/Await Patterns +**Pitfall**: Calling methods on coroutines instead of awaited results +**Solution**: Always await coroutines before accessing their methods + +### 3. Data Model Evolution +**Pitfall**: Breaking changes when removing fields from dataclasses +**Solution**: Filter deprecated fields during deserialization, don't break storage + +### 4. Concurrency Issues +**Pitfall**: Inconsistent lock key generation causing deadlocks +**Solution**: Always sort keys for deterministic lock ordering + +### 5. Event Loop Management +**Pitfall**: Event loop mismatches during shutdown +**Solution**: Implement timeout and specific error handling for loop issues + +## Performance Considerations + +### 1. Query Context Building +- **Algorithm**: Linear gradient weighted polling for fair resource allocation +- **Optimization**: Round-robin merging to eliminate mode bias +- **Pattern**: Smart chunk selection based on cross-entity occurrence + +### 2. Graph Operations +- **Optimization**: Batch operations where possible +- **Pattern**: Use appropriate indexing for large datasets +- **Consideration**: Memory usage with large graphs + +### 3. LLM Request Management +- **Pattern**: Priority-based queue for request ordering +- **Optimization**: Connection pooling and retry mechanisms +- **Consideration**: Rate limiting and cost management + +## Security Patterns + +### 1. Authentication +- **Implementation**: JWT tokens with role-based access +- **Pattern**: Stateless authentication with configurable expiration +- **Security**: Proper token validation and refresh mechanisms + +### 2. API Security +- **Pattern**: Input validation and sanitization +- **Implementation**: FastAPI dependency injection for auth +- **Consideration**: Rate limiting and abuse prevention + +## Maintenance Guidelines + +### 1. Memory Bank Updates +- **Trigger**: After significant changes or bug fixes +- **Pattern**: Update activeContext.md and progress.md +- **Purpose**: Maintain development continuity + +### 2. Configuration Management +- **Pattern**: Environment-based configuration with sensible defaults +- **Implementation**: .env files with example templates +- **Consideration**: Security for production deployments + +### 3. Error Handling +- **Pattern**: Comprehensive logging with appropriate levels +- **Implementation**: Graceful degradation where possible +- **Consideration**: User-friendly error messages + +## Project Evolution Notes + +The project has evolved from experimental to production-ready status. Key milestones: +- **Early 2025**: Basic RAG implementation +- **Mid 2025**: Multiple storage backends and LLM providers +- **July 2025**: Major query optimization and algorithm improvements +- **August 2025**: Production-ready stable state + +The system now supports enterprise-level deployments with comprehensive functionality across all components. diff --git a/LightRAG/.dockerignore b/LightRAG/.dockerignore new file mode 100644 index 00000000..f738d586 --- /dev/null +++ b/LightRAG/.dockerignore @@ -0,0 +1,69 @@ +# Python-related files and directories +__pycache__ +.cache + +# Virtual environment directories +*.venv + +# Env +env/ +*.env* +.env_example + +# Distribution / build files +site +dist/ +build/ +.eggs/ +*.egg-info/ +*.tgz +*.tar.gz + +# Exclude siles and folders +*.yml +.dockerignore +Dockerfile +Makefile + +# Exclude other projects +/tests +/scripts +/data +/dickens +/reproduce +/output_complete +/rag_storage +/inputs + +# Python version manager file +.python-version + +# Reports +*.coverage/ +*.log +log/ +*.logfire + +# Cache +.cache/ +.mypy_cache +.pytest_cache +.ruff_cache +.gradio +.logfire +temp/ + +# MacOS-related files +.DS_Store + +# VS Code settings (local configuration files) +.vscode + +# file +TODO.md + +# Exclude Git-related files +.git +.github +.gitignore +.pre-commit-config.yaml diff --git a/LightRAG/.gitattributes b/LightRAG/.gitattributes new file mode 100644 index 00000000..f7f5bc04 --- /dev/null +++ b/LightRAG/.gitattributes @@ -0,0 +1,2 @@ +lightrag/api/webui/** binary +lightrag/api/webui/** linguist-generated diff --git a/LightRAG/.github/ISSUE_TEMPLATE/bug_report.yml b/LightRAG/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..780a2008 --- /dev/null +++ b/LightRAG/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,61 @@ +name: Bug Report +description: File a bug report +title: "[Bug]:" +labels: ["bug", "triage"] + +body: + - type: checkboxes + id: existingcheck + attributes: + label: Do you need to file an issue? + description: Please help us manage our time by avoiding duplicates and common bugs with the steps below. + options: + - label: I have searched the existing issues and this bug is not already filed. + - label: I believe this is a legitimate bug, not just a question or feature request. + - type: textarea + id: description + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + placeholder: What went wrong? + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: Steps to reproduce the behavior. + placeholder: How can we replicate the issue? + - type: textarea + id: expected_behavior + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + placeholder: What should have happened? + - type: textarea + id: configused + attributes: + label: LightRAG Config Used + description: The LightRAG configuration used for the run. + placeholder: The settings content or LightRAG configuration + value: | + # Paste your config here + - type: textarea + id: screenshotslogs + attributes: + label: Logs and screenshots + description: If applicable, add screenshots and logs to help explain your problem. + placeholder: Add logs and screenshots here + - type: textarea + id: additional_information + attributes: + label: Additional Information + description: | + - LightRAG Version: e.g., v0.1.1 + - Operating System: e.g., Windows 10, Ubuntu 20.04 + - Python Version: e.g., 3.8 + - Related Issues: e.g., #1 + - Any other relevant information. + value: | + - LightRAG Version: + - Operating System: + - Python Version: + - Related Issues: diff --git a/LightRAG/.github/ISSUE_TEMPLATE/config.yml b/LightRAG/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..3ba13e0c --- /dev/null +++ b/LightRAG/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/LightRAG/.github/ISSUE_TEMPLATE/feature_request.yml b/LightRAG/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..3c127d59 --- /dev/null +++ b/LightRAG/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,26 @@ +name: Feature Request +description: File a feature request +labels: ["enhancement"] +title: "[Feature Request]:" + +body: + - type: checkboxes + id: existingcheck + attributes: + label: Do you need to file a feature request? + description: Please help us manage our time by avoiding duplicates and common feature request with the steps below. + options: + - label: I have searched the existing feature request and this feature request is not already filed. + - label: I believe this is a legitimate feature request, not just a question or bug. + - type: textarea + id: feature_request_description + attributes: + label: Feature Request Description + description: A clear and concise description of the feature request you would like. + placeholder: What this feature request add more or improve? + - type: textarea + id: additional_context + attributes: + label: Additional Context + description: Add any other context or screenshots about the feature request here. + placeholder: Any additional information diff --git a/LightRAG/.github/ISSUE_TEMPLATE/question.yml b/LightRAG/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 00000000..26fed23d --- /dev/null +++ b/LightRAG/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,26 @@ +name: Question +description: Ask a general question +labels: ["question"] +title: "[Question]:" + +body: + - type: checkboxes + id: existingcheck + attributes: + label: Do you need to ask a question? + description: Please help us manage our time by avoiding duplicates and common questions with the steps below. + options: + - label: I have searched the existing question and discussions and this question is not already answered. + - label: I believe this is a legitimate question, not just a bug or feature request. + - type: textarea + id: question + attributes: + label: Your Question + description: A clear and concise description of your question. + placeholder: What is your question? + - type: textarea + id: context + attributes: + label: Additional Context + description: Provide any additional context or details that might help us understand your question better. + placeholder: Add any relevant information here diff --git a/LightRAG/.github/dependabot.yml b/LightRAG/.github/dependabot.yml new file mode 100644 index 00000000..9d866e39 --- /dev/null +++ b/LightRAG/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/LightRAG/.github/pull_request_template.md b/LightRAG/.github/pull_request_template.md new file mode 100644 index 00000000..6eb2f2ac --- /dev/null +++ b/LightRAG/.github/pull_request_template.md @@ -0,0 +1,32 @@ + + +## Description + +[Briefly describe the changes made in this pull request.] + +## Related Issues + +[Reference any related issues or tasks addressed by this pull request.] + +## Changes Made + +[List the specific changes made in this pull request.] + +## Checklist + +- [ ] Changes tested locally +- [ ] Code reviewed +- [ ] Documentation updated (if necessary) +- [ ] Unit tests added (if applicable) + +## Additional Notes + +[Add any additional notes or context for the reviewer(s).] diff --git a/LightRAG/.github/workflows/docker-build-lite.yml b/LightRAG/.github/workflows/docker-build-lite.yml new file mode 100644 index 00000000..9cbe6289 --- /dev/null +++ b/LightRAG/.github/workflows/docker-build-lite.yml @@ -0,0 +1,84 @@ +name: Build Lite Docker Image + +on: + workflow_dispatch: + inputs: + _notes_: + description: '⚠️ Create lite Docker images only after non-trivial version releases.' + required: false + type: boolean + default: false + +permissions: + contents: read + packages: write + +jobs: + build-and-push-lite: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get latest tag + id: get_tag + run: | + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + if [ -z "$LATEST_TAG" ]; then + LATEST_TAG="sha-$(git rev-parse --short HEAD)" + echo "No tags found, using commit SHA: $LATEST_TAG" + else + echo "Latest tag found: $LATEST_TAG" + fi + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Prepare lite tag + id: lite_tag + run: | + LITE_TAG="${{ steps.get_tag.outputs.tag }}-lite" + echo "Lite image tag: $LITE_TAG" + echo "lite_tag=$LITE_TAG" >> $GITHUB_OUTPUT + + - name: Update version in __init__.py + run: | + sed -i "s/__version__ = \".*\"/__version__ = \"${{ steps.get_tag.outputs.tag }}\"/" lightrag/__init__.py + cat lightrag/__init__.py | grep __version__ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=raw,value=${{ steps.lite_tag.outputs.lite_tag }} + type=raw,value=lite + + - name: Build and push lite Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile.lite + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=min + + - name: Output image details + run: | + echo "Lite Docker image built and pushed successfully!" + echo "Image tag: ghcr.io/${{ github.repository }}:${{ steps.lite_tag.outputs.lite_tag }}" + echo "Base Git tag used: ${{ steps.get_tag.outputs.tag }}" diff --git a/LightRAG/.github/workflows/docker-build-manual.yml b/LightRAG/.github/workflows/docker-build-manual.yml new file mode 100644 index 00000000..de459d5a --- /dev/null +++ b/LightRAG/.github/workflows/docker-build-manual.yml @@ -0,0 +1,80 @@ +name: Build Test Docker Image manually + +on: + workflow_dispatch: + inputs: + _notes_: + description: '⚠️ Please create a new git tag before building the docker image.' + required: false + type: boolean + default: false + +permissions: + contents: read + packages: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for tags + + - name: Get latest tag + id: get_tag + run: | + # Get the latest tag, fallback to commit SHA if no tags exist + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") + if [ -z "$LATEST_TAG" ]; then + LATEST_TAG="sha-$(git rev-parse --short HEAD)" + echo "No tags found, using commit SHA: $LATEST_TAG" + else + echo "Latest tag found: $LATEST_TAG" + fi + echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT + echo "image_tag=$LATEST_TAG" >> $GITHUB_OUTPUT + + - name: Update version in __init__.py + run: | + sed -i "s/__version__ = \".*\"/__version__ = \"${{ steps.get_tag.outputs.tag }}\"/" lightrag/__init__.py + echo "Updated __init__.py with version ${{ steps.get_tag.outputs.tag }}" + cat lightrag/__init__.py | grep __version__ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=raw,value=${{ steps.get_tag.outputs.tag }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Output image details + run: | + echo "Docker image built and pushed successfully!" + echo "Image tags:" + echo " - ghcr.io/${{ github.repository }}:${{ steps.get_tag.outputs.tag }}" + echo "Latest Git tag used: ${{ steps.get_tag.outputs.tag }}" diff --git a/LightRAG/.github/workflows/docker-publish.yml b/LightRAG/.github/workflows/docker-publish.yml new file mode 100644 index 00000000..6c290d59 --- /dev/null +++ b/LightRAG/.github/workflows/docker-publish.yml @@ -0,0 +1,75 @@ +name: Build Latest Docker Image on Release + +on: + release: + types: [published] + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for tags + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get latest tag + id: get_tag + run: | + TAG=$(git describe --tags --abbrev=0) + echo "Found tag: $TAG" + echo "tag=$TAG" >> $GITHUB_OUTPUT + + - name: Check if pre-release + id: check_prerelease + run: | + TAG="${{ steps.get_tag.outputs.tag }}" + if [[ "$TAG" == *"rc"* ]] || [[ "$TAG" == *"dev"* ]]; then + echo "is_prerelease=true" >> $GITHUB_OUTPUT + echo "This is a pre-release version: $TAG" + else + echo "is_prerelease=false" >> $GITHUB_OUTPUT + echo "This is a stable release: $TAG" + fi + + - name: Update version in __init__.py + run: | + sed -i "s/__version__ = \".*\"/__version__ = \"${{ steps.get_tag.outputs.tag }}\"/" lightrag/__init__.py + echo "Updated __init__.py with version ${{ steps.get_tag.outputs.tag }}" + cat lightrag/__init__.py | grep __version__ + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ghcr.io/${{ github.repository }} + tags: | + type=raw,value=${{ steps.get_tag.outputs.tag }} + type=raw,value=latest,enable=${{ steps.check_prerelease.outputs.is_prerelease == 'false' }} + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/LightRAG/.github/workflows/linting.yaml b/LightRAG/.github/workflows/linting.yaml new file mode 100644 index 00000000..aa054369 --- /dev/null +++ b/LightRAG/.github/workflows/linting.yaml @@ -0,0 +1,30 @@ +name: Linting and Formatting + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + lint-and-format: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pre-commit + + - name: Run pre-commit + run: pre-commit run --all-files --show-diff-on-failure diff --git a/LightRAG/.github/workflows/pypi-publish.yml b/LightRAG/.github/workflows/pypi-publish.yml new file mode 100644 index 00000000..14c2bcc5 --- /dev/null +++ b/LightRAG/.github/workflows/pypi-publish.yml @@ -0,0 +1,92 @@ +name: Upload LightRAG-hku Package + +on: + release: + types: [published] + workflow_dispatch: + +permissions: + contents: read + +jobs: + release-build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history for tags + + # Build frontend WebUI + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Build Frontend WebUI + run: | + cd lightrag_webui + bun install --frozen-lockfile + bun run build + cd .. + + - name: Verify Frontend Build + run: | + if [ ! -f "lightrag/api/webui/index.html" ]; then + echo "❌ Error: Frontend build failed - index.html not found" + exit 1 + fi + echo "✅ Frontend build verified" + echo "Frontend files:" + ls -lh lightrag/api/webui/ | head -10 + + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + + - name: Get version from tag + id: get_version + run: | + TAG=$(git describe --tags --abbrev=0) + echo "Found tag: $TAG" + echo "Extracted version: $TAG" + echo "version=$TAG" >> $GITHUB_OUTPUT + + - name: Update version in __init__.py + run: | + sed -i "s/__version__ = \".*\"/__version__ = \"${{ steps.get_version.outputs.version }}\"/" lightrag/__init__.py + echo "Updated __init__.py with version ${{ steps.get_version.outputs.version }}" + cat lightrag/__init__.py | grep __version__ + + - name: Build release distributions + run: | + python -m pip install build + python -m build + + - name: Upload distributions + uses: actions/upload-artifact@v4 + with: + name: release-dists + path: dist/ + + pypi-publish: + runs-on: ubuntu-latest + needs: + - release-build + permissions: + id-token: write + + environment: + name: pypi + + steps: + - name: Retrieve release distributions + uses: actions/download-artifact@v4 + with: + name: release-dists + path: dist/ + + - name: Publish release distributions to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: dist/ diff --git a/LightRAG/.github/workflows/stale.yaml b/LightRAG/.github/workflows/stale.yaml new file mode 100644 index 00000000..30643dda --- /dev/null +++ b/LightRAG/.github/workflows/stale.yaml @@ -0,0 +1,27 @@ +# .github/workflows/stale.yml +name: Mark stale issues and pull requests + +on: + schedule: + - cron: '30 22 * * *' # run at 22:30+08 every day + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + days-before-stale: 90 # 90 days + days-before-close: 7 # 7 days after marked as stale + stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.' + close-issue-message: 'This issue has been automatically closed because it has not had recent activity. Please open a new issue if you still have this problem.' + stale-pr-message: 'This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.' + close-pr-message: 'This pull request has been automatically closed because it has not had recent activity.' + # If there are specific labels, exempt them from being marked as stale, for example: + exempt-issue-labels: 'enhancement,tracked' + # exempt-pr-labels: 'bug,enhancement,help wanted' + repo-token: ${{ secrets.GITHUB_TOKEN }} # token provided by GitHub diff --git a/LightRAG/.gitignore b/LightRAG/.gitignore new file mode 100644 index 00000000..8a5059c8 --- /dev/null +++ b/LightRAG/.gitignore @@ -0,0 +1,74 @@ +# Python-related files +__pycache__/ +*.py[cod] +*.egg-info/ +.eggs/ +*.tgz +*.tar.gz +*.ini + +# Virtual Environment +.venv/ +venv/ + +# Enviroment Variable Files +.env + +# Build / Distribution +dist/ +build/ +site/ + +# Logs / Reports +*.log +*.log.* +*.logfire +*.coverage/ +log/ + +# Caches +.cache/ +.mypy_cache/ +.pytest_cache/ +.ruff_cache/ +.gradio/ +.history/ +temp/ + +# IDE / Editor Files +.idea/ +.vscode/ +.vscode/settings.json + +# Framework-specific files +local_neo4jWorkDir/ +neo4jWorkDir/ + +# Data & Storage +inputs/ +output/ +rag_storage/ +data/ + +# Evaluation results +lightrag/evaluation/results/ + +# Miscellaneous +.DS_Store +TODO.md +ignore_this.txt +*.ignore.* + +# Project-specific files +/dickens*/ +/book.txt +download_models_hf.py + +# Frontend build output (built during PyPI release) +/lightrag/api/webui/ + +# temporary test files in project root +/test_* + +# Cline files +memory-bank diff --git a/LightRAG/.pre-commit-config.yaml b/LightRAG/.pre-commit-config.yaml new file mode 100644 index 00000000..0629b743 --- /dev/null +++ b/LightRAG/.pre-commit-config.yaml @@ -0,0 +1,28 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + exclude: ^lightrag/api/webui/ + - id: end-of-file-fixer + exclude: ^lightrag/api/webui/ + - id: requirements-txt-fixer + exclude: ^lightrag/api/webui/ + + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.4 + hooks: + - id: ruff-format + exclude: ^lightrag/api/webui/ + - id: ruff + args: [--fix, --ignore=E402] + exclude: ^lightrag/api/webui/ + + + - repo: https://github.com/mgedmin/check-manifest + rev: "0.49" + hooks: + - id: check-manifest + stages: [manual] + exclude: ^lightrag/api/webui/ diff --git a/LightRAG/AGENTS.md b/LightRAG/AGENTS.md new file mode 100644 index 00000000..e1e4da11 --- /dev/null +++ b/LightRAG/AGENTS.md @@ -0,0 +1,39 @@ +# Repository Guidelines + +LightRAG is an advanced Retrieval-Augmented Generation (RAG) framework designed to enhance information retrieval and generation through graph-based knowledge representation. + +## Project Structure & Module Organization +- `lightrag/`: Core Python package with orchestrators (`lightrag/lightrag.py`), storage adapters in `kg/`, LLM bindings in `llm/`, and helpers such as `operate.py` and `utils_*.py`. +- `lightrag-api/`: FastAPI service (`lightrag_server.py`) with routers under `routers/` and Gunicorn launcher `run_with_gunicorn.py`. +- `lightrag_webui/`: React 19 + TypeScript client driven by Bun + Vite; UI components live in `src/`. +- Tests live in `tests/` and root-level `test_*.py`. Working datasets stay in `inputs/`, `rag_storage/`, `temp/`; deployment collateral lives in `docs/`, `k8s-deploy/`, and `docker-compose.yml`. + +## Build, Test, and Development Commands +- `python -m venv .venv && source .venv/bin/activate`: set up the Python runtime. +- `pip install -e .` / `pip install -e .[api]`: install the package and API extras in editable mode. +- `lightrag-server` or `uvicorn lightrag.api.lightrag_server:app --reload`: start the API locally; ensure `.env` is present. +- `python -m pytest tests` or `python test_graph_storage.py`: run the full suite or a targeted script. +- `ruff check .`: lint Python sources before committing. +- `bun install`, `bun run dev`, `bun run build`, `bun test`: manage the web UI workflow (Bun is mandatory). + +## Coding Style & Naming Conventions +- Backend code follow PEP 8 with four-space indentation, annotate functions, and reach for dataclasses when modelling state. +- Use `lightrag.utils.logger` instead of `print`; respect logger configuration flags. +- Extend storage or pipeline abstractions via `lightrag.base` and keep reusable helpers in the existing `utils_*.py`. +- Python modules remain lowercase with underscores; React components use `PascalCase.tsx` and hooks-first patterns. +- Front-end code should remain in TypeScript with two-space indentation, rely on functional React components with hooks, and follow Tailwind utility style. + +## Testing Guidelines +- Add pytest cases beside the affected module or the relevant `test_*.py`; functions should start with `test_`. +- Export required `LIGHTRAG_*` environment variables before running integration or storage tests. +- For UI updates, pair code with Vitest specs and run `bun test`. + +## Commit & Pull Request Guidelines +- Use concise, imperative commit subjects (e.g., `Fix lock key normalization`) and add body context only when necessary. +- PRs should include a summary, operational impact, linked issues, and screenshots or API samples for user-facing work. +- Verify `ruff check .`, `python -m pytest`, and affected Bun commands succeed before requesting review; note the runs in the PR text. + +## Security & Configuration Tips +- Copy `.env.example` and `config.ini.example`; never commit secrets or real connection strings. +- Configure storage backends through `LIGHTRAG_*` variables and validate them with `docker-compose` services when needed. +- Treat `lightrag.log*` as local artefacts; purge sensitive information before sharing logs or outputs. diff --git a/LightRAG/Dockerfile b/LightRAG/Dockerfile new file mode 100644 index 00000000..aaa3c84b --- /dev/null +++ b/LightRAG/Dockerfile @@ -0,0 +1,107 @@ +# syntax=docker/dockerfile:1 + +# Frontend build stage +FROM oven/bun:1 AS frontend-builder + +WORKDIR /app + +# Copy frontend source code +COPY lightrag_webui/ ./lightrag_webui/ + +# Build frontend assets for inclusion in the API package +RUN --mount=type=cache,target=/root/.bun/install/cache \ + cd lightrag_webui \ + && bun install --frozen-lockfile \ + && bun run build + +# Python build stage - using uv for faster package installation +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder + +ENV DEBIAN_FRONTEND=noninteractive +ENV UV_SYSTEM_PYTHON=1 +ENV UV_COMPILE_BYTECODE=1 + +WORKDIR /app + +# Install system deps (Rust is required by some wheels) +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl \ + build-essential \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* \ + && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +ENV PATH="/root/.cargo/bin:/root/.local/bin:${PATH}" + +# Ensure shared data directory exists for uv caches +RUN mkdir -p /root/.local/share/uv + +# Copy project metadata and sources +COPY pyproject.toml . +COPY setup.py . +COPY uv.lock . + +# Install base, API, and offline extras without the project to improve caching +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --extra offline --no-install-project --no-editable + +# Copy project sources after dependency layer +COPY lightrag/ ./lightrag/ + +# Include pre-built frontend assets from the previous stage +COPY --from=frontend-builder /app/lightrag/api/webui ./lightrag/api/webui + +# Sync project in non-editable mode and ensure pip is available for runtime installs +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --extra offline --no-editable \ + && /app/.venv/bin/python -m ensurepip --upgrade + +# Prepare offline cache directory and pre-populate tiktoken data +# Use uv run to execute commands from the virtual environment +RUN mkdir -p /app/data/tiktoken \ + && uv run lightrag-download-cache --cache-dir /app/data/tiktoken || status=$?; \ + if [ -n "${status:-}" ] && [ "$status" -ne 0 ] && [ "$status" -ne 2 ]; then exit "$status"; fi + +# Final stage +FROM python:3.12-slim + +WORKDIR /app + +# Install uv for package management +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv + +ENV UV_SYSTEM_PYTHON=1 + +# Copy installed packages and application code +COPY --from=builder /root/.local /root/.local +COPY --from=builder /app/.venv /app/.venv +COPY --from=builder /app/lightrag ./lightrag +COPY pyproject.toml . +COPY setup.py . +COPY uv.lock . + +# Ensure the installed scripts are on PATH +ENV PATH=/app/.venv/bin:/root/.local/bin:$PATH + +# Install dependencies with uv sync (uses locked versions from uv.lock) +# And ensure pip is available for runtime installs +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --extra offline --no-editable \ + && /app/.venv/bin/python -m ensurepip --upgrade + +# Create persistent data directories AFTER package installation +RUN mkdir -p /app/data/rag_storage /app/data/inputs /app/data/tiktoken + +# Copy offline cache into the newly created directory +COPY --from=builder /app/data/tiktoken /app/data/tiktoken + +# Point to the prepared cache +ENV TIKTOKEN_CACHE_DIR=/app/data/tiktoken +ENV WORKING_DIR=/app/data/rag_storage +ENV INPUT_DIR=/app/data/inputs + +# Expose API port +EXPOSE 9621 + +ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"] diff --git a/LightRAG/Dockerfile.lite b/LightRAG/Dockerfile.lite new file mode 100644 index 00000000..3f488886 --- /dev/null +++ b/LightRAG/Dockerfile.lite @@ -0,0 +1,108 @@ +# syntax=docker/dockerfile:1 + +# Frontend build stage +FROM oven/bun:1 AS frontend-builder + +WORKDIR /app + +# Copy frontend source code +COPY lightrag_webui/ ./lightrag_webui/ + +# Build frontend assets for inclusion in the API package +RUN --mount=type=cache,target=/root/.bun/install/cache \ + cd lightrag_webui \ + && bun install --frozen-lockfile \ + && bun run build + +# Python build stage - using uv for package installation +FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder + +ENV DEBIAN_FRONTEND=noninteractive +ENV UV_SYSTEM_PYTHON=1 +ENV UV_COMPILE_BYTECODE=1 + +WORKDIR /app + +# Install system dependencies required by some wheels +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + curl \ + build-essential \ + pkg-config \ + && rm -rf /var/lib/apt/lists/* \ + && curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +ENV PATH="/root/.cargo/bin:/root/.local/bin:${PATH}" + +# Ensure shared data directory exists for uv caches +RUN mkdir -p /root/.local/share/uv + +# Copy project metadata and sources +COPY pyproject.toml . +COPY setup.py . +COPY uv.lock . + +# Install project dependencies (base + API extras) without the project to improve caching +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --no-install-project --no-editable + +# Copy project sources after dependency layer +COPY lightrag/ ./lightrag/ + +# Include pre-built frontend assets from the previous stage +COPY --from=frontend-builder /app/lightrag/api/webui ./lightrag/api/webui + +# Sync project in non-editable mode and ensure pip is available for runtime installs +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --no-editable \ + && /app/.venv/bin/python -m ensurepip --upgrade + +# Prepare tiktoken cache directory and pre-populate tokenizer data +# Ignore exit code 2 which indicates assets already cached +RUN mkdir -p /app/data/tiktoken \ + && uv run lightrag-download-cache --cache-dir /app/data/tiktoken || status=$?; \ + if [ -n "${status:-}" ] && [ "$status" -ne 0 ] && [ "$status" -ne 2 ]; then exit "$status"; fi + +# Final stage +FROM python:3.12-slim + +WORKDIR /app + +# Install uv for package management +COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv + +ENV UV_SYSTEM_PYTHON=1 + +# Copy installed packages and application code +COPY --from=builder /root/.local /root/.local +COPY --from=builder /app/.venv /app/.venv +COPY --from=builder /app/lightrag ./lightrag +COPY pyproject.toml . +COPY setup.py . +COPY uv.lock . + +# Ensure the installed scripts are on PATH +ENV PATH=/app/.venv/bin:/root/.local/bin:$PATH + +# Sync dependencies inside the final image using uv +# And ensure pip is available for runtime installs +RUN --mount=type=cache,target=/root/.local/share/uv \ + uv sync --frozen --no-dev --extra api --no-editable \ + && /app/.venv/bin/python -m ensurepip --upgrade + +# Create persistent data directories +RUN mkdir -p /app/data/rag_storage /app/data/inputs /app/data/tiktoken + +# Copy cached tokenizer assets prepared in the builder stage +COPY --from=builder /app/data/tiktoken /app/data/tiktoken + +# Docker data directories +ENV TIKTOKEN_CACHE_DIR=/app/data/tiktoken +ENV WORKING_DIR=/app/data/rag_storage +ENV INPUT_DIR=/app/data/inputs + +# Expose API port +EXPOSE 9621 + +# Set entrypoint +ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"] diff --git a/LightRAG/LICENSE b/LightRAG/LICENSE new file mode 100644 index 00000000..ff0c29b4 --- /dev/null +++ b/LightRAG/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 LightRAG Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LightRAG/MANIFEST.in b/LightRAG/MANIFEST.in new file mode 100644 index 00000000..cf12c1e9 --- /dev/null +++ b/LightRAG/MANIFEST.in @@ -0,0 +1,4 @@ +include requirements.txt +include lightrag/api/requirements.txt +recursive-include lightrag/api/webui * +recursive-include lightrag/api/static * diff --git a/LightRAG/README-zh.md b/LightRAG/README-zh.md new file mode 100644 index 00000000..8dcbc0e5 --- /dev/null +++ b/LightRAG/README-zh.md @@ -0,0 +1,1824 @@ +
+ +
+ LightRAG Logo +
+ +# 🚀 LightRAG: Simple and Fast Retrieval-Augmented Generation + +
+ HKUDS%2FLightRAG | Trendshift +
+ +
+
+
+ +
+
+

+ + + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ +
+ +
+ +
+ +
+ LightRAG Diagram +
+ +--- + +## 🎉 新闻 + +- [x] [2025.11.05]🎯📢添加**基于RAGAS的**评估框架和**Langfuse**可观测性支持。 +- [x] [2025.10.22]🎯📢消除处理**大规模数据集**的瓶颈。 +- [x] [2025.09.15]🎯📢显著提升**小型LLM**(如Qwen3-30B-A3B)的知识图谱提取准确性。 +- [x] [2025.08.29]🎯📢现已支持**Reranker**,显著提升混合查询性能。 +- [x] [2025.08.04]🎯📢支持**文档删除**并重新生成知识图谱以确保查询性能。 +- [x] [2025.06.16]🎯📢我们的团队发布了[RAG-Anything](https://github.com/HKUDS/RAG-Anything),一个用于无缝处理文本、图像、表格和方程式的全功能多模态 RAG 系统。 +- [X] [2025.06.05]🎯📢LightRAG现已集成[RAG-Anything](https://github.com/HKUDS/RAG-Anything),支持全面的多模态文档解析与RAG能力(PDF、图片、Office文档、表格、公式等)。详见下方[多模态处理模块](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#多模态文档处理rag-anything集成)。 +- [X] [2025.03.18]🎯📢LightRAG现已支持引文功能。 +- [X] [2025.02.05]🎯📢我们团队发布了[VideoRAG](https://github.com/HKUDS/VideoRAG),用于理解超长上下文视频。 +- [X] [2025.01.13]🎯📢我们团队发布了[MiniRAG](https://github.com/HKUDS/MiniRAG),使用小型模型简化RAG。 +- [X] [2025.01.06]🎯📢现在您可以[使用PostgreSQL进行存储](#using-postgresql-for-storage)。 +- [X] [2024.11.25]🎯📢LightRAG现在支持无缝集成[自定义知识图谱](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#insert-custom-kg),使用户能够用自己的领域专业知识增强系统。 +- [X] [2024.11.19]🎯📢LightRAG的综合指南现已在[LearnOpenCV](https://learnopencv.com/lightrag)上发布。非常感谢博客作者。 +- [X] [2024.11.11]🎯📢LightRAG现在支持[通过实体名称删除实体](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#delete)。 +- [X] [2024.11.09]🎯📢推出[LightRAG Gui](https://lightrag-gui.streamlit.app),允许您插入、查询、可视化和下载LightRAG知识。 +- [X] [2024.11.04]🎯📢现在您可以[使用Neo4J进行存储](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#using-neo4j-for-storage)。 +- [X] [2024.10.29]🎯📢LightRAG现在通过`textract`支持多种文件类型,包括PDF、DOC、PPT和CSV。 +- [X] [2024.10.20]🎯📢我们为LightRAG添加了一个新功能:图形可视化。 +- [X] [2024.10.18]🎯📢我们添加了[LightRAG介绍视频](https://youtu.be/oageL-1I0GE)的链接。感谢作者! +- [X] [2024.10.17]🎯📢我们创建了一个[Discord频道](https://discord.gg/yF2MmDJyGJ)!欢迎加入分享和讨论!🎉🎉 +- [X] [2024.10.16]🎯📢LightRAG现在支持[Ollama模型](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#quick-start)! +- [X] [2024.10.15]🎯📢LightRAG现在支持[Hugging Face模型](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#quick-start)! + +
+ + 算法流程图 + + +![LightRAG索引流程图](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-VectorDB-Json-KV-Store-Indexing-Flowchart-scaled.jpg) +*图1:LightRAG索引流程图 - 图片来源:[Source](https://learnopencv.com/lightrag/)* +![LightRAG检索和查询流程图](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-Querying-Flowchart-Dual-Level-Retrieval-Generation-Knowledge-Graphs-scaled.jpg) +*图2:LightRAG检索和查询流程图 - 图片来源:[Source](https://learnopencv.com/lightrag/)* + +
+ +## 安装 + +> **💡 使用 uv 进行包管理**: 本项目使用 [uv](https://docs.astral.sh/uv/) 进行快速可靠的 Python 包管理。 +> 首先安装 uv: `curl -LsSf https://astral.sh/uv/install.sh | sh` (Unix/macOS) 或 `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"` (Windows) +> +> **注意**: 如果您更喜欢使用 pip 也可以,但我们推荐使用 uv 以获得更好的性能和更可靠的依赖管理。 + +### 安装LightRAG服务器 + +LightRAG服务器旨在提供Web UI和API支持。Web UI便于文档索引、知识图谱探索和简单的RAG查询界面。LightRAG服务器还提供兼容Ollama的接口,旨在将LightRAG模拟为Ollama聊天模型。这使得AI聊天机器人(如Open WebUI)可以轻松访问LightRAG。 + +* 从PyPI安装 + +```bash +# 使用 uv (推荐) +uv pip install "lightrag-hku[api]" +# 或使用 pip +# pip install "lightrag-hku[api]" + +cp env.example .env # 使用你的LLM和Embedding模型访问参数更新.env文件 + +lightrag-server +``` + +* 从源代码安装 + +```bash +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG + +# 使用 uv (推荐) +# 注意: uv sync 会自动在 .venv/ 目录创建虚拟环境 +uv sync --extra api +source .venv/bin/activate # 激活虚拟环境 (Linux/macOS) +# Windows 系统: .venv\Scripts\activate + +# 或使用 pip 和虚拟环境 +# python -m venv .venv +# source .venv/bin/activate # Windows: .venv\Scripts\activate +# pip install -e ".[api]" + +cp env.example .env # 使用你的LLM和Embedding模型访问参数更新.env文件 + +# 构建前端代码 +cd lightrag_webui +bun install --frozen-lockfile +bun run build +cd .. + +lightrag-server +``` + +* 使用 Docker Compose 启动 LightRAG 服务器 + +```bash +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG +cp env.example .env # 使用你的LLM和Embedding模型访问参数更新.env文件 +# modify LLM and Embedding settings in .env +docker compose up +``` + +> 在此获取LightRAG docker镜像历史版本: [LightRAG Docker Images]( https://github.com/HKUDS/LightRAG/pkgs/container/lightrag) + +### 安装LightRAG Core + +* 从源代码安装(推荐) + +```bash +cd LightRAG +# 注意: uv sync 会自动在 .venv/ 目录创建虚拟环境 +uv sync +source .venv/bin/activate # 激活虚拟环境 (Linux/macOS) +# Windows 系统: .venv\Scripts\activate + +# 或: pip install -e . +``` + +* 从PyPI安装 + +```bash +uv pip install lightrag-hku +# 或: pip install lightrag-hku +``` + +## 快速开始 + +### LightRAG的LLM及配套技术栈要求 + +LightRAG对大型语言模型(LLM)的能力要求远高于传统RAG,因为它需要LLM执行文档中的实体关系抽取任务。配置合适的Embedding和Reranker模型对提高查询表现也至关重要。 + +- **LLM选型**: + - 推荐选用参数量至少为32B的LLM。 + - 上下文长度至少为32KB,推荐达到64KB。 + - 在文档索引阶段不建议选择推理模型。 + - 在查询阶段建议选择比索引阶段能力更强的模型,以达到更高的查询效果。 +- **Embedding模型**: + - 高性能的Embedding模型对RAG至关重要。 + - 推荐使用主流的多语言Embedding模型,例如:BAAI/bge-m3 和 text-embedding-3-large。 + - **重要提示**:在文档索引前必须确定使用的Embedding模型,且在文档查询阶段必须沿用与索引阶段相同的模型。有些存储(例如PostgreSQL)在首次建立数表的时候需要确定向量维度,因此更换Embedding模型后需要删除向量相关库表,以便让LightRAG重建新的库表。 +- **Reranker模型配置**: + - 配置Reranker模型能够显著提升LightRAG的检索效果。 + - 启用Reranker模型后,推荐将“mix模式”设为默认查询模式。 + - 推荐选用主流的Reranker模型,例如:BAAI/bge-reranker-v2-m3 或 Jina 等服务商提供的模型。 + +### 使用LightRAG服务器 + +**有关LightRAG服务器的更多信息,请参阅[LightRAG服务器](./lightrag/api/README.md)。** + +### 使用LightRAG Core + +LightRAG核心功能的示例代码请参见`examples`目录。您还可参照[视频](https://www.youtube.com/watch?v=g21royNJ4fw)视频完成环境配置。若已持有OpenAI API密钥,可以通过以下命令运行演示代码: + +```bash +### you should run the demo code with project folder +cd LightRAG +### provide your API-KEY for OpenAI +export OPENAI_API_KEY="sk-...your_opeai_key..." +### download the demo document of "A Christmas Carol" by Charles Dickens +curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt +### run the demo code +python examples/lightrag_openai_demo.py +``` + +如需流式响应示例的实现代码,请参阅 `examples/lightrag_openai_compatible_demo.py`。运行前,请确保根据需求修改示例代码中的LLM及嵌入模型配置。 + +**注意1**:在运行demo程序的时候需要注意,不同的测试程序可能使用的是不同的embedding模型,更换不同的embeding模型的时候需要把清空数据目录(`./dickens`),否则层序执行会出错。如果你想保留LLM缓存,可以在清除数据目录时保留`kv_store_llm_response_cache.json`文件。 + +**注意2**:官方支持的示例代码仅为 `lightrag_openai_demo.py` 和 `lightrag_openai_compatible_demo.py` 两个文件。其他示例文件均为社区贡献内容,尚未经过完整测试与优化。 + +## 使用LightRAG Core进行编程 + +> ⚠️ **如果您希望将LightRAG集成到您的项目中,建议您使用LightRAG Server提供的REST API**。LightRAG Core通常用于嵌入式应用,或供希望进行研究与评估的学者使用。 + +### 一个简单程序 + +以下Python代码片段演示了如何初始化LightRAG、插入文本并进行查询: + +```python +import os +import asyncio +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import gpt_4o_mini_complete, gpt_4o_complete, openai_embed +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.utils import setup_logger + +setup_logger("lightrag", level="INFO") + +WORKING_DIR = "./rag_storage" +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + embedding_func=openai_embed, + llm_model_func=gpt_4o_mini_complete, + ) + await rag.initialize_storages() + await initialize_pipeline_status() + return rag + +async def main(): + try: + # 初始化RAG实例 + rag = await initialize_rag() + # 插入文本 + await rag.insert("Your text") + + # 执行混合检索 + mode = "hybrid" + print( + await rag.query( + "这个故事的主要主题是什么?", + param=QueryParam(mode=mode) + ) + ) + + except Exception as e: + print(f"发生错误: {e}") + finally: + if rag: + await rag.finalize_storages() + +if __name__ == "__main__": + asyncio.run(main()) +``` + +重要说明: +- 运行脚本前请先导出你的OPENAI_API_KEY环境变量。 +- 该程序使用LightRAG的默认存储设置,所有数据将持久化在WORKING_DIR/rag_storage目录下。 +- 该示例仅展示了初始化LightRAG对象的最简单方式:注入embedding和LLM函数,并在创建LightRAG对象后初始化存储和管道状态。 + +### LightRAG初始化参数 + +以下是完整的LightRAG对象初始化参数清单: + +
+ 参数 + +| **参数** | **类型** | **说明** | **默认值** | +|--------------|----------|-----------------|-------------| +| **working_dir** | `str` | 存储缓存的目录 | `lightrag_cache+timestamp` | +| **kv_storage** | `str` | Storage type for documents and text chunks. Supported types: `JsonKVStorage`,`PGKVStorage`,`RedisKVStorage`,`MongoKVStorage` | `JsonKVStorage` | +| **vector_storage** | `str` | Storage type for embedding vectors. Supported types: `NanoVectorDBStorage`,`PGVectorStorage`,`MilvusVectorDBStorage`,`ChromaVectorDBStorage`,`FaissVectorDBStorage`,`MongoVectorDBStorage`,`QdrantVectorDBStorage` | `NanoVectorDBStorage` | +| **graph_storage** | `str` | Storage type for graph edges and nodes. Supported types: `NetworkXStorage`,`Neo4JStorage`,`PGGraphStorage`,`AGEStorage` | `NetworkXStorage` | +| **doc_status_storage** | `str` | Storage type for documents process status. Supported types: `JsonDocStatusStorage`,`PGDocStatusStorage`,`MongoDocStatusStorage` | `JsonDocStatusStorage` | +| **chunk_token_size** | `int` | 拆分文档时每个块的最大令牌大小 | `1200` | +| **chunk_overlap_token_size** | `int` | 拆分文档时两个块之间的重叠令牌大小 | `100` | +| **tokenizer** | `Tokenizer` | 用于将文本转换为 tokens(数字)以及使用遵循 TokenizerInterface 协议的 .encode() 和 .decode() 函数将 tokens 转换回文本的函数。 如果您不指定,它将使用默认的 Tiktoken tokenizer。 | `TiktokenTokenizer` | +| **tiktoken_model_name** | `str` | 如果您使用的是默认的 Tiktoken tokenizer,那么这是要使用的特定 Tiktoken 模型的名称。如果您提供自己的 tokenizer,则忽略此设置。 | `gpt-4o-mini` | +| **entity_extract_max_gleaning** | `int` | 实体提取过程中的循环次数,附加历史消息 | `1` | +| **node_embedding_algorithm** | `str` | 节点嵌入算法(当前未使用) | `node2vec` | +| **node2vec_params** | `dict` | 节点嵌入的参数 | `{"dimensions": 1536,"num_walks": 10,"walk_length": 40,"window_size": 2,"iterations": 3,"random_seed": 3,}` | +| **embedding_func** | `EmbeddingFunc` | 从文本生成嵌入向量的函数 | `openai_embed` | +| **embedding_batch_num** | `int` | 嵌入过程的最大批量大小(每批发送多个文本) | `32` | +| **embedding_func_max_async** | `int` | 最大并发异步嵌入进程数 | `16` | +| **llm_model_func** | `callable` | LLM生成的函数 | `gpt_4o_mini_complete` | +| **llm_model_name** | `str` | 用于生成的LLM模型名称 | `meta-llama/Llama-3.2-1B-Instruct` | +| **summary_context_size** | `int` | 合并实体关系摘要时送给LLM的最大令牌数 | `10000`(由环境变量 SUMMARY_MAX_CONTEXT 设置) | +| **summary_max_tokens** | `int` | 合并实体关系描述的最大令牌数长度 | `500`(由环境变量 SUMMARY_MAX_TOKENS 设置) | +| **llm_model_max_async** | `int` | 最大并发异步LLM进程数 | `4`(默认值由环境变量MAX_ASYNC更改) | +| **llm_model_kwargs** | `dict` | LLM生成的附加参数 | | +| **vector_db_storage_cls_kwargs** | `dict` | 向量数据库的附加参数,如设置节点和关系检索的阈值 | cosine_better_than_threshold: 0.2(默认值由环境变量COSINE_THRESHOLD更改) | +| **enable_llm_cache** | `bool` | 如果为`TRUE`,将LLM结果存储在缓存中;重复的提示返回缓存的响应 | `TRUE` | +| **enable_llm_cache_for_entity_extract** | `bool` | 如果为`TRUE`,将实体提取的LLM结果存储在缓存中;适合初学者调试应用程序 | `TRUE` | +| **addon_params** | `dict` | 附加参数,例如`{"language": "Simplified Chinese", "entity_types": ["organization", "person", "location", "event"]}`:设置示例限制、输出语言和文档处理的批量大小 | language: English` | +| **embedding_cache_config** | `dict` | 问答缓存的配置。包含三个参数:`enabled`:布尔值,启用/禁用缓存查找功能。启用时,系统将在生成新答案之前检查缓存的响应。`similarity_threshold`:浮点值(0-1),相似度阈值。当新问题与缓存问题的相似度超过此阈值时,将直接返回缓存的答案而不调用LLM。`use_llm_check`:布尔值,启用/禁用LLM相似度验证。启用时,在返回缓存答案之前,将使用LLM作为二次检查来验证问题之间的相似度。 | 默认:`{"enabled": False, "similarity_threshold": 0.95, "use_llm_check": False}` | + +
+ +### 查询参数 + +使用QueryParam控制你的查询行为: + +```python +class QueryParam: + """Configuration parameters for query execution in LightRAG.""" + + mode: Literal["local", "global", "hybrid", "naive", "mix", "bypass"] = "global" + """Specifies the retrieval mode: + - "local": Focuses on context-dependent information. + - "global": Utilizes global knowledge. + - "hybrid": Combines local and global retrieval methods. + - "naive": Performs a basic search without advanced techniques. + - "mix": Integrates knowledge graph and vector retrieval. + """ + + only_need_context: bool = False + """If True, only returns the retrieved context without generating a response.""" + + only_need_prompt: bool = False + """If True, only returns the generated prompt without producing a response.""" + + response_type: str = "Multiple Paragraphs" + """Defines the response format. Examples: 'Multiple Paragraphs', 'Single Paragraph', 'Bullet Points'.""" + + stream: bool = False + """If True, enables streaming output for real-time responses.""" + + top_k: int = int(os.getenv("TOP_K", "60")) + """Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode.""" + + chunk_top_k: int = int(os.getenv("CHUNK_TOP_K", "20")) + """Number of text chunks to retrieve initially from vector search and keep after reranking. + If None, defaults to top_k value. + """ + + max_entity_tokens: int = int(os.getenv("MAX_ENTITY_TOKENS", "6000")) + """Maximum number of tokens allocated for entity context in unified token control system.""" + + max_relation_tokens: int = int(os.getenv("MAX_RELATION_TOKENS", "8000")) + """Maximum number of tokens allocated for relationship context in unified token control system.""" + + max_total_tokens: int = int(os.getenv("MAX_TOTAL_TOKENS", "30000")) + """Maximum total tokens budget for the entire query context (entities + relations + chunks + system prompt).""" + + hl_keywords: list[str] = field(default_factory=list) + """List of high-level keywords to prioritize in retrieval.""" + + ll_keywords: list[str] = field(default_factory=list) + """List of low-level keywords to refine retrieval focus.""" + + # History mesages is only send to LLM for context, not used for retrieval + conversation_history: list[dict[str, str]] = field(default_factory=list) + """Stores past conversation history to maintain context. + Format: [{"role": "user/assistant", "content": "message"}]. + """ + + ids: list[str] | None = None + """List of ids to filter the results.""" + + model_func: Callable[..., object] | None = None + """Optional override for the LLM model function to use for this specific query. + If provided, this will be used instead of the global model function. + This allows using different models for different query modes. + """ + + user_prompt: str | None = None + """User-provided prompt for the query. + Addition instructions for LLM. If provided, this will be inject into the prompt template. + It's purpose is the let user customize the way LLM generate the response. + """ + + enable_rerank: bool = True + """Enable reranking for retrieved text chunks. If True but no rerank model is configured, a warning will be issued. + Default is True to enable reranking when rerank model is available. + """ +``` + +> top_k的默认值可以通过环境变量TOP_K更改。 + +### LLM and Embedding注入 + +LightRAG 需要利用LLM和Embeding模型来完成文档索引和知识库查询工作。在初始化LightRAG的时候需要把阶段,需要把LLM和Embedding的操作函数注入到对象中: + +
+ 使用类OpenAI的API + +* LightRAG还支持类OpenAI的聊天/嵌入API: + +```python +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + return await openai_complete_if_cache( + "solar-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=os.getenv("UPSTAGE_API_KEY"), + base_url="https://api.upstage.ai/v1/solar", + **kwargs + ) + +async def embedding_func(texts: list[str]) -> np.ndarray: + return await openai_embed( + texts, + model="solar-embedding-1-large-query", + api_key=os.getenv("UPSTAGE_API_KEY"), + base_url="https://api.upstage.ai/v1/solar" + ) + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=4096, + func=embedding_func + ) + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag +``` + +
+ +
+ 使用Hugging Face模型 + +* 如果您想使用Hugging Face模型,只需要按如下方式设置LightRAG: + +参见`lightrag_hf_demo.py` + +```python +# 使用Hugging Face模型初始化LightRAG +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=hf_model_complete, # 使用Hugging Face模型进行文本生成 + llm_model_name='meta-llama/Llama-3.1-8B-Instruct', # Hugging Face的模型名称 + # 使用Hugging Face嵌入函数 + embedding_func=EmbeddingFunc( + embedding_dim=384, + func=lambda texts: hf_embed( + texts, + tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2"), + embed_model=AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2") + ) + ), +) +``` + +
+ +
+ 使用Ollama模型 +如果您想使用Ollama模型,您需要拉取计划使用的模型和嵌入模型,例如`nomic-embed-text`。 + +然后您只需要按如下方式设置LightRAG: + +```python +# 使用Ollama模型初始化LightRAG +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=ollama_model_complete, # 使用Ollama模型进行文本生成 + llm_model_name='your_model_name', # 您的模型名称 + # 使用Ollama嵌入函数 + embedding_func=EmbeddingFunc( + embedding_dim=768, + func=lambda texts: ollama_embed( + texts, + embed_model="nomic-embed-text" + ) + ), +) +``` + +* **增加上下文大小** + +为了使LightRAG正常工作,上下文应至少为32k令牌。默认情况下,Ollama模型的上下文大小为8k。您可以通过以下两种方式之一实现这一点: + +* **在Modelfile中增加`num_ctx`参数** + +1. 拉取模型: + +```bash +ollama pull qwen2 +``` + +2. 显示模型文件: + +```bash +ollama show --modelfile qwen2 > Modelfile +``` + +3. 编辑Modelfile,添加以下行: + +```bash +PARAMETER num_ctx 32768 +``` + +4. 创建修改后的模型: + +```bash +ollama create -f Modelfile qwen2m +``` + +* **通过Ollama API设置`num_ctx`** + +您可以使用`llm_model_kwargs`参数配置ollama: + +```python +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=ollama_model_complete, # 使用Ollama模型进行文本生成 + llm_model_name='your_model_name', # 您的模型名称 + llm_model_kwargs={"options": {"num_ctx": 32768}}, + # 使用Ollama嵌入函数 + embedding_func=EmbeddingFunc( + embedding_dim=768, + func=lambda texts: ollama_embed( + texts, + embed_model="nomic-embed-text" + ) + ), +) +``` + +* **低RAM GPU** + +为了在低RAM GPU上运行此实验,您应该选择小型模型并调整上下文窗口(增加上下文会增加内存消耗)。例如,在6Gb RAM的改装挖矿GPU上运行这个ollama示例需要将上下文大小设置为26k,同时使用`gemma2:2b`。它能够在`book.txt`中找到197个实体和19个关系。 + +
+
+ LlamaIndex + +LightRAG支持与LlamaIndex集成 (`llm/llama_index_impl.py`): + +- 通过LlamaIndex与OpenAI和其他提供商集成 +- 详细设置和示例请参见[LlamaIndex文档](lightrag/llm/Readme.md) + +**使用示例:** + +```python +# 使用LlamaIndex直接访问OpenAI +import asyncio +from lightrag import LightRAG +from lightrag.llm.llama_index_impl import llama_index_complete_if_cache, llama_index_embed +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.llms.openai import OpenAI +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.utils import setup_logger + +# 为LightRAG设置日志处理程序 +setup_logger("lightrag", level="INFO") + +async def initialize_rag(): + rag = LightRAG( + working_dir="your/path", + llm_model_func=llama_index_complete_if_cache, # LlamaIndex兼容的完成函数 + embedding_func=EmbeddingFunc( # LlamaIndex兼容的嵌入函数 + embedding_dim=1536, + func=lambda texts: llama_index_embed(texts, embed_model=embed_model) + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + +def main(): + # 初始化RAG实例 + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # 执行朴素搜索 + print( + rag.query("这个故事的主要主题是什么?", param=QueryParam(mode="naive")) + ) + + # 执行本地搜索 + print( + rag.query("这个故事的主要主题是什么?", param=QueryParam(mode="local")) + ) + + # 执行全局搜索 + print( + rag.query("这个故事的主要主题是什么?", param=QueryParam(mode="global")) + ) + + # 执行混合搜索 + print( + rag.query("这个故事的主要主题是什么?", param=QueryParam(mode="hybrid")) + ) + +if __name__ == "__main__": + main() +``` + +**详细文档和示例,请参见:** + +- [LlamaIndex文档](lightrag/llm/Readme.md) +- [直接OpenAI示例](examples/lightrag_llamaindex_direct_demo.py) +- [LiteLLM代理示例](examples/lightrag_llamaindex_litellm_demo.py) + +
+ +### Rerank函数注入 + +为了提高检索质量,可以根据更有效的相关性评分模型对文档进行重排序。`rerank.py`文件提供了三个Reranker提供商的驱动函数: + +* **Cohere / vLLM**: `cohere_rerank` +* **Jina AI**: `jina_rerank` +* **Aliyun阿里云**: `ali_rerank` + +您可以将这些函数之一注入到LightRAG对象的`rerank_model_func`属性中。这将使LightRAG的查询功能能够使用注入的函数对检索到的文本块进行重新排序。有关详细用法,请参阅`examples/rerank_example.py`文件。 + +### 用户提示词 vs. 查询内容 + +当使用LightRAG查询内容的时候,不要把内容查询和与查询结果无关的输出加工写在一起。因为把两者混在一起会严重影响查询的效果。Query Param中的`user_prompt`就是为解决这一问题而设计的。`user_prompt`中的内容不参与RAG中的查询过程,它仅会在获得查询结果之后,与查询结果一起送给LLM,指导LLM如何处理查询结果。以下是使用方法: + +```python +# Create query parameters +query_param = QueryParam( + mode = "hybrid", # Other modes:local, global, hybrid, mix, naive + user_prompt = "如需画图使用mermaid格式,节点名称用英文或拼音,显示名称用中文", +) + +# Query and process +response_default = rag.query( + "请画出 Scrooge 的人物关系图谱", + param=query_param +) +print(response_default) +``` + +### 插入 + +
+ 基本插入 + +```python +# 基本插入 +rag.insert("文本") +``` + +
+ +
+ 批量插入 + +```python +# 基本批量插入:一次插入多个文本 +rag.insert(["文本1", "文本2",...]) + +# 带有自定义批量大小配置的批量插入 +rag = LightRAG( + ... + working_dir=WORKING_DIR, + max_parallel_insert = 4 +) + +rag.insert(["文本1", "文本2", "文本3", ...]) # 文档将以4个为一批进行处理 +``` + +参数 `max_parallel_insert` 用于控制文档索引流水线中并行处理的文档数量。若未指定,默认值为 **2**。建议将该参数设置为 **10 以下**,因为性能瓶颈通常出现在大语言模型(LLM)的处理环节。 + +
+ +
+ 带ID插入 + +如果您想为文档提供自己的ID,文档数量和ID数量必须相同。 + +```python +# 插入单个文本,并为其提供ID +rag.insert("文本1", ids=["文本1的ID"]) + +# 插入多个文本,并为它们提供ID +rag.insert(["文本1", "文本2",...], ids=["文本1的ID", "文本2的ID"]) +``` + +
+ +
+ 使用流水线插入 + +`apipeline_enqueue_documents`和`apipeline_process_enqueue_documents`函数允许您对文档进行增量插入到图中。 + +这对于需要在后台处理文档的场景很有用,同时仍允许主线程继续执行。 + +并使用例程处理新文档。 + +```python +rag = LightRAG(..) + +await rag.apipeline_enqueue_documents(input) +# 您的循环例程 +await rag.apipeline_process_enqueue_documents(input) +``` + +
+ +
+ 插入多文件类型支持 + +`textract`支持读取TXT、DOCX、PPTX、CSV和PDF等文件类型。 + +```python +import textract + +file_path = 'TEXT.pdf' +text_content = textract.process(file_path) + +rag.insert(text_content.decode('utf-8')) +``` + +
+ +
+ 引文功能 + +通过提供文件路径,系统确保可以将来源追溯到其原始文档。 + +```python +# 定义文档及其文件路径 +documents = ["文档内容1", "文档内容2"] +file_paths = ["path/to/doc1.txt", "path/to/doc2.txt"] + +# 插入带有文件路径的文档 +rag.insert(documents, file_paths=file_paths) +``` + +
+ +### 存储 + +LightRAG 使用 4 种类型的存储用于不同目的: + +* KV_STORAGE:llm 响应缓存、文本块、文档信息 +* VECTOR_STORAGE:实体向量、关系向量、块向量 +* GRAPH_STORAGE:实体关系图 +* DOC_STATUS_STORAGE:文档索引状态 + +每种存储类型都有几种实现: + +* KV_STORAGE 支持的实现名称 + +``` +JsonKVStorage JsonFile(默认) +PGKVStorage Postgres +RedisKVStorage Redis +MongoKVStorage MogonDB +``` + +* GRAPH_STORAGE 支持的实现名称 + +``` +NetworkXStorage NetworkX(默认) +Neo4JStorage Neo4J +PGGraphStorage PostgreSQL with AGE plugin +``` + +> 在测试中Neo4j图形数据库相比PostgreSQL AGE有更好的性能表现。 + +* VECTOR_STORAGE 支持的实现名称 + +``` +NanoVectorDBStorage NanoVector(默认) +PGVectorStorage Postgres +MilvusVectorDBStorge Milvus +FaissVectorDBStorage Faiss +QdrantVectorDBStorage Qdrant +MongoVectorDBStorage MongoDB +``` + +* DOC_STATUS_STORAGE 支持的实现名称 + +``` +JsonDocStatusStorage JsonFile(默认) +PGDocStatusStorage Postgres +MongoDocStatusStorage MongoDB +``` + +每一种存储类型的链接配置范例可以在 `env.example` 文件中找到。链接字符串中的数据库实例是需要你预先在数据库服务器上创建好的,LightRAG 仅负责在数据库实例中创建数据表,不负责创建数据库实例。如果使用 Redis 作为存储,记得给 Redis 配置自动持久化数据规则,否则 Redis 服务重启后数据会丢失。如果使用PostgreSQL数据库,推荐使用16.6版本或以上。 + +
+ 使用Neo4J存储 + +* 对于生产级场景,您很可能想要利用企业级解决方案 +* 进行KG存储。推荐在Docker中运行Neo4J以进行无缝本地测试。 +* 参见:https://hub.docker.com/_/neo4j + +```python +export NEO4J_URI="neo4j://localhost:7687" +export NEO4J_USERNAME="neo4j" +export NEO4J_PASSWORD="password" + +# 为LightRAG设置日志记录器 +setup_logger("lightrag", level="INFO") + +# 当您启动项目时,请确保通过指定kg="Neo4JStorage"来覆盖默认的KG:NetworkX。 + +# 注意:默认设置使用NetworkX +# 使用Neo4J实现初始化LightRAG。 +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=gpt_4o_mini_complete, # 使用gpt_4o_mini_complete LLM模型 + graph_storage="Neo4JStorage", #<-----------覆盖KG默认值 + ) + + # 初始化数据库连接 + await rag.initialize_storages() + # 初始化文档处理的管道状态 + await initialize_pipeline_status() + + return rag +``` + +参见test_neo4j.py获取工作示例。 + +
+ +
+ 使用Faiss存储 +在使用Faiss向量数据库之前必须手工安装`faiss-cpu`或`faiss-gpu`。 + +- 安装所需依赖: + +``` +pip install faiss-cpu +``` + +如果您有GPU支持,也可以安装`faiss-gpu`。 + +- 这里我们使用`sentence-transformers`,但您也可以使用维度为`3072`的`OpenAIEmbedding`模型。 + +```python +async def embedding_func(texts: list[str]) -> np.ndarray: + model = SentenceTransformer('all-MiniLM-L6-v2') + embeddings = model.encode(texts, convert_to_numpy=True) + return embeddings + +# 使用LLM模型函数和嵌入函数初始化LightRAG +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=384, + func=embedding_func, + ), + vector_storage="FaissVectorDBStorage", + vector_db_storage_cls_kwargs={ + "cosine_better_than_threshold": 0.3 # 您期望的阈值 + } +) +``` + +
+ +
+ 使用PostgreSQL存储 + +对于生产级场景,您很可能想要利用企业级解决方案。PostgreSQL可以为您提供一站式储解解决方案,作为KV存储、向量数据库(pgvector)和图数据库(apache AGE)。支持 PostgreSQL 版本为16.6或以上。 + +* 如果您是初学者并想避免麻烦,推荐使用docker,请从这个镜像开始(请务必阅读概述):https://hub.docker.com/r/shangor/postgres-for-rag +* Apache AGE的性能不如Neo4j。追求高性能的图数据库请使用Noe4j。 + +
+ +
+ 使用MogonDB存储 + +MongoDB为LightRAG提供了一站式的存储解决方案。MongoDB提供原生的KV存储和向量存储。LightRAG使用MogoDB的集合实现了一个简易的图存储。MongoDB 官方的向量检索功能(`$vectorSearch`)目前必须依赖其官方的云服务 MongoDB Atlas。无法在自托管的 MongoDB Community/Enterprise 版本上使用此功能。 + +
+ +
+ 使用Redis存储 + +LightRAG支持使用Reidis作为KV存储。使用Redis存储的时候需要注意进行持久化配置和内存使用量配置。以下是推荐的redis配置 + +``` +save 900 1 +save 300 10 +save 60 1000 +stop-writes-on-bgsave-error yes +maxmemory 4gb +maxmemory-policy noeviction +maxclients 500 +``` + +
+ +### LightRAG实例间的数据隔离 + +通过 workspace 参数可以不同实现不同LightRAG实例之间的存储数据隔离。LightRAG在初始化后workspace就已经确定,之后修改workspace是无效的。下面是不同类型的存储实现工作空间的方式: + +- **对于本地基于文件的数据库,数据隔离通过工作空间子目录实现:** JsonKVStorage, JsonDocStatusStorage, NetworkXStorage, NanoVectorDBStorage, FaissVectorDBStorage。 +- **对于将数据存储在集合(collection)中的数据库,通过在集合名称前添加工作空间前缀来实现:** RedisKVStorage, RedisDocStatusStorage, MilvusVectorDBStorage, QdrantVectorDBStorage, MongoKVStorage, MongoDocStatusStorage, MongoVectorDBStorage, MongoGraphStorage, PGGraphStorage。 +- **对于关系型数据库,数据隔离通过向表中添加 `workspace` 字段进行数据的逻辑隔离:** PGKVStorage, PGVectorStorage, PGDocStatusStorage。 + +* **对于Neo4j图数据库,通过label来实现数据的逻辑隔离**:Neo4JStorage + +为了保持对遗留数据的兼容,在未配置工作空间时PostgreSQL非图存储的工作空间为`default`,PostgreSQL AGE图存储的工作空间为空,Neo4j图存储的默认工作空间为`base`。对于所有的外部存储,系统都提供了专用的工作空间环境变量,用于覆盖公共的 `WORKSPACE`环境变量配置。这些适用于指定存储类型的工作空间环境变量为:`REDIS_WORKSPACE`, `MILVUS_WORKSPACE`, `QDRANT_WORKSPACE`, `MONGODB_WORKSPACE`, `POSTGRES_WORKSPACE`, `NEO4J_WORKSPACE`。 + +### AGENTS.md – 自动编程引导文件 + +AGENTS.md 是一种简洁、开放的格式,用于指导自动编程代理完成工作(https://agents.md/)。它为 LightRAG 项目提供了一个专属且可预测的上下文与指令位置,帮助 AI 代码代理更好地开展工作。不同的 AI 代码代理不应各自维护独立的引导文件。如果某个 AI 代理无法自动识别 AGENTS.md,可使用符号链接来解决。建立符号链接后,可通过配置本地的 `.gitignore_global` 文件防止其被提交至 Git 仓库。 + +## 编辑实体和关系 + +LightRAG现在支持全面的知识图谱管理功能,允许您在知识图谱中创建、编辑和删除实体和关系。 + +
+ 创建实体和关系 + +```python +# 创建新实体 +entity = rag.create_entity("Google", { + "description": "Google是一家专注于互联网相关服务和产品的跨国科技公司。", + "entity_type": "company" +}) + +# 创建另一个实体 +product = rag.create_entity("Gmail", { + "description": "Gmail是由Google开发的电子邮件服务。", + "entity_type": "product" +}) + +# 创建实体之间的关系 +relation = rag.create_relation("Google", "Gmail", { + "description": "Google开发和运营Gmail。", + "keywords": "开发 运营 服务", + "weight": 2.0 +}) +``` + +
+ +
+ 编辑实体和关系 + +```python +# 编辑现有实体 +updated_entity = rag.edit_entity("Google", { + "description": "Google是Alphabet Inc.的子公司,成立于1998年。", + "entity_type": "tech_company" +}) + +# 重命名实体(所有关系都会正确迁移) +renamed_entity = rag.edit_entity("Gmail", { + "entity_name": "Google Mail", + "description": "Google Mail(前身为Gmail)是一项电子邮件服务。" +}) + +# 编辑实体之间的关系 +updated_relation = rag.edit_relation("Google", "Google Mail", { + "description": "Google创建并维护Google Mail服务。", + "keywords": "创建 维护 电子邮件服务", + "weight": 3.0 +}) +``` + +所有操作都有同步和异步版本。异步版本带有前缀"a"(例如,`acreate_entity`,`aedit_relation`)。 + +
+ +
+ 插入自定义知识 + +```python +custom_kg = { + "chunks": [ + { + "content": "Alice和Bob正在合作进行量子计算研究。", + "source_id": "doc-1" + } + ], + "entities": [ + { + "entity_name": "Alice", + "entity_type": "person", + "description": "Alice是一位专门研究量子物理的研究员。", + "source_id": "doc-1" + }, + { + "entity_name": "Bob", + "entity_type": "person", + "description": "Bob是一位数学家。", + "source_id": "doc-1" + }, + { + "entity_name": "量子计算", + "entity_type": "technology", + "description": "量子计算利用量子力学现象进行计算。", + "source_id": "doc-1" + } + ], + "relationships": [ + { + "src_id": "Alice", + "tgt_id": "Bob", + "description": "Alice和Bob是研究伙伴。", + "keywords": "合作 研究", + "weight": 1.0, + "source_id": "doc-1" + }, + { + "src_id": "Alice", + "tgt_id": "量子计算", + "description": "Alice进行量子计算研究。", + "keywords": "研究 专业", + "weight": 1.0, + "source_id": "doc-1" + }, + { + "src_id": "Bob", + "tgt_id": "量子计算", + "description": "Bob研究量子计算。", + "keywords": "研究 应用", + "weight": 1.0, + "source_id": "doc-1" + } + ] +} + +rag.insert_custom_kg(custom_kg) +``` + +
+ +
+ 其它实体与关系操作 + +- **create_entity**:创建具有指定属性的新实体 +- **edit_entity**:更新现有实体的属性或重命名它 + +- **create_relation**:在现有实体之间创建新关系 +- **edit_relation**:更新现有关系的属性 + +这些操作在图数据库和向量数据库组件之间保持数据一致性,确保您的知识图谱保持连贯。 + +
+ +## 删除功能 + +LightRAG提供了全面的删除功能,允许您删除文档、实体和关系。 + +
+ 删除实体 + +您可以通过实体名称删除实体及其所有关联关系: + +```python +# 删除实体及其所有关系(同步版本) +rag.delete_by_entity("Google") + +# 异步版本 +await rag.adelete_by_entity("Google") +``` + +删除实体时会: +- 从知识图谱中移除该实体节点 +- 删除该实体的所有关联关系 +- 从向量数据库中移除相关的嵌入向量 +- 保持知识图谱的完整性 + +
+ +
+ 删除关系 + +您可以删除两个特定实体之间的关系: + +```python +# 删除两个实体之间的关系(同步版本) +rag.delete_by_relation("Google", "Gmail") + +# 异步版本 +await rag.adelete_by_relation("Google", "Gmail") +``` + +删除关系时会: +- 移除指定的关系边 +- 从向量数据库中删除关系的嵌入向量 +- 保留两个实体节点及其他关系 + +
+ +
+ 通过文档ID删除 + +您可以通过文档ID删除整个文档及其相关的所有知识: + +```python +# 通过文档ID删除(异步版本) +await rag.adelete_by_doc_id("doc-12345") +``` + +通过文档ID删除时的优化处理: +- **智能清理**:自动识别并删除仅属于该文档的实体和关系 +- **保留共享知识**:如果实体或关系在其他文档中也存在,则会保留并重新构建描述 +- **缓存优化**:清理相关的LLM缓存以减少存储开销 +- **增量重建**:从剩余文档重新构建受影响的实体和关系描述 + +删除过程包括: +1. 删除文档相关的所有文本块 +2. 识别仅属于该文档的实体和关系并删除 +3. 重新构建在其他文档中仍存在的实体和关系 +4. 更新所有相关的向量索引 +5. 清理文档状态记录 + +注意:通过文档ID删除是一个异步操作,因为它涉及复杂的知识图谱重构过程。 + +
+ +
+ 删除注意事项 + +**重要提醒:** + +1. **不可逆操作**:所有删除操作都是不可逆的,请谨慎使用 +2. **性能考虑**:删除大量数据时可能需要一些时间,特别是通过文档ID删除 +3. **数据一致性**:删除操作会自动维护知识图谱和向量数据库之间的一致性 +4. **备份建议**:在执行重要删除操作前建议备份数据 + +**批量删除建议:** +- 对于批量删除操作,建议使用异步方法以获得更好的性能 +- 大规模删除时,考虑分批进行以避免系统负载过高 + +
+ +## 实体合并 + +
+ 合并实体及其关系 + +LightRAG现在支持将多个实体合并为单个实体,自动处理所有关系: + +```python +# 基本实体合并 +rag.merge_entities( + source_entities=["人工智能", "AI", "机器智能"], + target_entity="AI技术" +) +``` + +使用自定义合并策略: + +```python +# 为不同字段定义自定义合并策略 +rag.merge_entities( + source_entities=["约翰·史密斯", "史密斯博士", "J·史密斯"], + target_entity="约翰·史密斯", + merge_strategy={ + "description": "concatenate", # 组合所有描述 + "entity_type": "keep_first", # 保留第一个实体的类型 + "source_id": "join_unique" # 组合所有唯一的源ID + } +) +``` + +使用自定义目标实体数据: + +```python +# 为合并后的实体指定确切值 +rag.merge_entities( + source_entities=["纽约", "NYC", "大苹果"], + target_entity="纽约市", + target_entity_data={ + "entity_type": "LOCATION", + "description": "纽约市是美国人口最多的城市。", + } +) +``` + +结合两种方法的高级用法: + +```python +# 使用策略和自定义数据合并公司实体 +rag.merge_entities( + source_entities=["微软公司", "Microsoft Corporation", "MSFT"], + target_entity="微软", + merge_strategy={ + "description": "concatenate", # 组合所有描述 + "source_id": "join_unique" # 组合源ID + }, + target_entity_data={ + "entity_type": "ORGANIZATION", + } +) +``` + +合并实体时: + +* 所有来自源实体的关系都会重定向到目标实体 +* 重复的关系会被智能合并 +* 防止自我关系(循环) +* 合并后删除源实体 +* 保留关系权重和属性 + +
+ +## 多模态文档处理(RAG-Anything集成) + +LightRAG 现已与 [RAG-Anything](https://github.com/HKUDS/RAG-Anything) 实现无缝集成,这是一个专为 LightRAG 构建的**全能多模态文档处理RAG系统**。RAG-Anything 提供先进的解析和检索增强生成(RAG)能力,让您能够无缝处理多模态文档,并从各种文档格式中提取结构化内容——包括文本、图片、表格和公式——以集成到您的RAG流程中。 + +**主要特性:** +- **端到端多模态流程**:从文档摄取解析到智能多模态问答的完整工作流程 +- **通用文档支持**:无缝处理PDF、Office文档(DOC/DOCX/PPT/PPTX/XLS/XLSX)、图片和各种文件格式 +- **专业内容分析**:针对图片、表格、数学公式和异构内容类型的专用处理器 +- **多模态知识图谱**:自动实体提取和跨模态关系发现以增强理解 +- **混合智能检索**:覆盖文本和多模态内容的高级搜索能力,具备上下文理解 + +**快速开始:** +1. 安装RAG-Anything: + ```bash + pip install raganything + ``` +2. 处理多模态文档: +
+ RAGAnything 使用示例 + + ```python + import asyncio + from raganything import RAGAnything + from lightrag import LightRAG + from lightrag.llm.openai import openai_complete_if_cache, openai_embed + from lightrag.utils import EmbeddingFunc + import os + + async def load_existing_lightrag(): + # 首先,创建或加载现有的 LightRAG 实例 + lightrag_working_dir = "./existing_lightrag_storage" + + # 检查是否存在之前的 LightRAG 实例 + if os.path.exists(lightrag_working_dir) and os.listdir(lightrag_working_dir): + print("✅ Found existing LightRAG instance, loading...") + else: + print("❌ No existing LightRAG instance found, will create new one") + + # 使用您的配置创建/加载 LightRAG 实例 + lightrag_instance = LightRAG( + working_dir=lightrag_working_dir, + llm_model_func=lambda prompt, system_prompt=None, history_messages=[], **kwargs: openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key="your-api-key", + **kwargs, + ), + embedding_func=EmbeddingFunc( + embedding_dim=3072, + func=lambda texts: openai_embed( + texts, + model="text-embedding-3-large", + api_key=api_key, + base_url=base_url, + ), + ) + ) + + # 初始化存储(如果有现有数据,这将加载现有数据) + await lightrag_instance.initialize_storages() + + # 现在使用现有的 LightRAG 实例初始化 RAGAnything + rag = RAGAnything( + lightrag=lightrag_instance, # 传递现有的 LightRAG 实例 + # 仅需要视觉模型用于多模态处理 + vision_model_func=lambda prompt, system_prompt=None, history_messages=[], image_data=None, **kwargs: openai_complete_if_cache( + "gpt-4o", + "", + system_prompt=None, + history_messages=[], + messages=[ + {"role": "system", "content": system_prompt} if system_prompt else None, + {"role": "user", "content": [ + {"type": "text", "text": prompt}, + {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_data}"}} + ]} if image_data else {"role": "user", "content": prompt} + ], + api_key="your-api-key", + **kwargs, + ) if image_data else openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key="your-api-key", + **kwargs, + ) + # 注意:working_dir、llm_model_func、embedding_func 等都从 lightrag_instance 继承 + ) + + # 查询现有的知识库 + result = await rag.query_with_multimodal( + "What data has been processed in this LightRAG instance?", + mode="hybrid" + ) + print("Query result:", result) + + # 向现有的 LightRAG 实例添加新的多模态文档 + await rag.process_document_complete( + file_path="path/to/new/multimodal_document.pdf", + output_dir="./output" + ) + + if __name__ == "__main__": + asyncio.run(load_existing_lightrag()) + ``` + +
+ +如需详细文档和高级用法,请参阅 [RAG-Anything 仓库](https://github.com/HKUDS/RAG-Anything)。 + +## Token统计功能 + +
+ 概述和使用 + +LightRAG提供了TokenTracker工具来跟踪和管理大模型的token消耗。这个功能对于控制API成本和优化性能特别有用。 + +### 使用方法 + +```python +from lightrag.utils import TokenTracker + +# 创建TokenTracker实例 +token_tracker = TokenTracker() + +# 方法1:使用上下文管理器(推荐) +# 适用于需要自动跟踪token使用的场景 +with token_tracker: + result1 = await llm_model_func("你的问题1") + result2 = await llm_model_func("你的问题2") + +# 方法2:手动添加token使用记录 +# 适用于需要更精细控制token统计的场景 +token_tracker.reset() + +rag.insert() + +rag.query("你的问题1", param=QueryParam(mode="naive")) +rag.query("你的问题2", param=QueryParam(mode="mix")) + +# 显示总token使用量(包含插入和查询操作) +print("Token usage:", token_tracker.get_usage()) +``` + +### 使用建议 +- 在长会话或批量操作中使用上下文管理器,可以自动跟踪所有token消耗 +- 对于需要分段统计的场景,使用手动模式并适时调用reset() +- 定期检查token使用情况,有助于及时发现异常消耗 +- 在开发测试阶段积极使用此功能,以便优化生产环境的成本 + +### 实际应用示例 +您可以参考以下示例来实现token统计: +- `examples/lightrag_gemini_track_token_demo.py`:使用Google Gemini模型的token统计示例 +- `examples/lightrag_siliconcloud_track_token_demo.py`:使用SiliconCloud模型的token统计示例 + +这些示例展示了如何在不同模型和场景下有效地使用TokenTracker功能。 + +
+ +## 数据导出功能 + +### 概述 + +LightRAG允许您以各种格式导出知识图谱数据,用于分析、共享和备份目的。系统支持导出实体、关系和关系数据。 + +### 导出功能 + +#### 基本用法 + +```python +# 基本CSV导出(默认格式) +rag.export_data("knowledge_graph.csv") + +# 指定任意格式 +rag.export_data("output.xlsx", file_format="excel") +``` + +#### 支持的不同文件格式 + +```python +# 以CSV格式导出数据 +rag.export_data("graph_data.csv", file_format="csv") + +# 导出数据到Excel表格 +rag.export_data("graph_data.xlsx", file_format="excel") + +# 以markdown格式导出数据 +rag.export_data("graph_data.md", file_format="md") + +# 导出数据为文本 +rag.export_data("graph_data.txt", file_format="txt") +``` + +#### 附加选项 + +在导出中包含向量嵌入(可选): + +```python +rag.export_data("complete_data.csv", include_vector_data=True) +``` + +### 导出数据包括 + +所有导出包括: + +* 实体信息(名称、ID、元数据) +* 关系数据(实体之间的连接) +* 来自向量数据库的关系信息 + +## 缓存 + +
+ 清除缓存 + +您可以使用不同模式清除LLM响应缓存: + +```python +# 清除所有缓存 +await rag.aclear_cache() + +# 清除本地模式缓存 +await rag.aclear_cache(modes=["local"]) + +# 清除提取缓存 +await rag.aclear_cache(modes=["default"]) + +# 清除多个模式 +await rag.aclear_cache(modes=["local", "global", "hybrid"]) + +# 同步版本 +rag.clear_cache(modes=["local"]) +``` + +有效的模式包括: + +- `"default"`:提取缓存 +- `"naive"`:朴素搜索缓存 +- `"local"`:本地搜索缓存 +- `"global"`:全局搜索缓存 +- `"hybrid"`:混合搜索缓存 +- `"mix"`:混合搜索缓存 + +
+ +## LightRAG API + +LightRAG服务器旨在提供Web UI和API支持。**有关LightRAG服务器的更多信息,请参阅[LightRAG服务器](./lightrag/api/README.md)。** + +## 知识图谱可视化 + +LightRAG服务器提供全面的知识图谱可视化功能。它支持各种重力布局、节点查询、子图过滤等。**有关LightRAG服务器的更多信息,请参阅[LightRAG服务器](./lightrag/api/README.md)。** + +![iShot_2025-03-23_12.40.08](./README.assets/iShot_2025-03-23_12.40.08.png) + +## Langfuse 可观测性集成 + +Langfuse 为 OpenAI 客户端提供了直接替代方案,可自动跟踪所有 LLM 交互,使开发者能够在无需修改代码的情况下监控、调试和优化其 RAG 系统。 + +### 安装 Langfuse 可选依赖 + +``` +pip install lightrag-hku +pip install lightrag-hku[observability] + +# 或从源代码安装并启用调试模式 +pip install -e . +pip install -e ".[observability]" +``` + +### 配置 Langfuse 环境变量 + +修改 .env 文件: + +``` +## Langfuse 可观测性(可选) +# LLM 可观测性和追踪平台 +# 安装命令: pip install lightrag-hku[observability] +# 注册地址: https://cloud.langfuse.com 或自托管部署 +LANGFUSE_SECRET_KEY="" +LANGFUSE_PUBLIC_KEY="" +LANGFUSE_HOST="https://cloud.langfuse.com" # 或您的自托管实例地址 +LANGFUSE_ENABLE_TRACE=true +``` + +### Langfuse 使用说明 + +安装并配置完成后,Langfuse 会自动追踪所有 OpenAI LLM 调用。Langfuse 仪表板功能包括: + +- **追踪**:查看完整的 LLM 调用链 +- **分析**:Token 使用量、延迟、成本指标 +- **调试**:检查提示词和响应内容 +- **评估**:比较模型输出结果 +- **监控**:实时告警功能 + +### 重要提示 + +**注意**:LightRAG 目前仅把 OpenAI 兼容的 API 调用接入了 Langfuse。Ollama、Azure 和 AWS Bedrock 等 API 还无法使用 Langfuse 的可观测性功能。 + +## RAGAS评估 + +**RAGAS**(Retrieval Augmented Generation Assessment,检索增强生成评估)是一个使用LLM对RAG系统进行无参考评估的框架。我们提供了基于RAGAS的评估脚本。详细信息请参阅[基于RAGAS的评估框架](lightrag/evaluation/README.md)。 + +## 评估 + +### 数据集 + +LightRAG使用的数据集可以从[TommyChien/UltraDomain](https://huggingface.co/datasets/TommyChien/UltraDomain)下载。 + +### 生成查询 + +LightRAG使用以下提示生成高级查询,相应的代码在`example/generate_query.py`中。 + +
+ 提示 + +```python +给定以下数据集描述: + +{description} + +请识别5个可能会使用此数据集的潜在用户。对于每个用户,列出他们会使用此数据集执行的5个任务。然后,对于每个(用户,任务)组合,生成5个需要对整个数据集有高级理解的问题。 + +按以下结构输出结果: +- 用户1:[用户描述] + - 任务1:[任务描述] + - 问题1: + - 问题2: + - 问题3: + - 问题4: + - 问题5: + - 任务2:[任务描述] + ... + - 任务5:[任务描述] +- 用户2:[用户描述] + ... +- 用户5:[用户描述] + ... +``` + +
+ +### 批量评估 + +为了评估两个RAG系统在高级查询上的性能,LightRAG使用以下提示,具体代码可在`example/batch_eval.py`中找到。 + +
+ 提示 + +```python +---角色--- +您是一位专家,负责根据三个标准评估同一问题的两个答案:**全面性**、**多样性**和**赋能性**。 +---目标--- +您将根据三个标准评估同一问题的两个答案:**全面性**、**多样性**和**赋能性**。 + +- **全面性**:答案提供了多少细节来涵盖问题的所有方面和细节? +- **多样性**:答案在提供关于问题的不同视角和见解方面有多丰富多样? +- **赋能性**:答案在多大程度上帮助读者理解并对主题做出明智判断? + +对于每个标准,选择更好的答案(答案1或答案2)并解释原因。然后,根据这三个类别选择总体赢家。 + +这是问题: +{query} + +这是两个答案: + +**答案1:** +{answer1} + +**答案2:** +{answer2} + +使用上述三个标准评估两个答案,并为每个标准提供详细解释。 + +以下列JSON格式输出您的评估: + +{{ + "全面性": {{ + "获胜者": "[答案1或答案2]", + "解释": "[在此提供解释]" + }}, + "赋能性": {{ + "获胜者": "[答案1或答案2]", + "解释": "[在此提供解释]" + }}, + "总体获胜者": {{ + "获胜者": "[答案1或答案2]", + "解释": "[根据三个标准总结为什么这个答案是总体获胜者]" + }} +}} +``` + +
+ +### 总体性能表 + +| |**农业**| |**计算机科学**| |**法律**| |**混合**| | +|----------------------|---------------|------------|------|------------|---------|------------|-------|------------| +| |NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**| +|**全面性**|32.4%|**67.6%**|38.4%|**61.6%**|16.4%|**83.6%**|38.8%|**61.2%**| +|**多样性**|23.6%|**76.4%**|38.0%|**62.0%**|13.6%|**86.4%**|32.4%|**67.6%**| +|**赋能性**|32.4%|**67.6%**|38.8%|**61.2%**|16.4%|**83.6%**|42.8%|**57.2%**| +|**总体**|32.4%|**67.6%**|38.8%|**61.2%**|15.2%|**84.8%**|40.0%|**60.0%**| +| |RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**| +|**全面性**|31.6%|**68.4%**|38.8%|**61.2%**|15.2%|**84.8%**|39.2%|**60.8%**| +|**多样性**|29.2%|**70.8%**|39.2%|**60.8%**|11.6%|**88.4%**|30.8%|**69.2%**| +|**赋能性**|31.6%|**68.4%**|36.4%|**63.6%**|15.2%|**84.8%**|42.4%|**57.6%**| +|**总体**|32.4%|**67.6%**|38.0%|**62.0%**|14.4%|**85.6%**|40.0%|**60.0%**| +| |HyDE|**LightRAG**|HyDE|**LightRAG**|HyDE|**LightRAG**|HyDE|**LightRAG**| +|**全面性**|26.0%|**74.0%**|41.6%|**58.4%**|26.8%|**73.2%**|40.4%|**59.6%**| +|**多样性**|24.0%|**76.0%**|38.8%|**61.2%**|20.0%|**80.0%**|32.4%|**67.6%**| +|**赋能性**|25.2%|**74.8%**|40.8%|**59.2%**|26.0%|**74.0%**|46.0%|**54.0%**| +|**总体**|24.8%|**75.2%**|41.6%|**58.4%**|26.4%|**73.6%**|42.4%|**57.6%**| +| |GraphRAG|**LightRAG**|GraphRAG|**LightRAG**|GraphRAG|**LightRAG**|GraphRAG|**LightRAG**| +|**全面性**|45.6%|**54.4%**|48.4%|**51.6%**|48.4%|**51.6%**|**50.4%**|49.6%| +|**多样性**|22.8%|**77.2%**|40.8%|**59.2%**|26.4%|**73.6%**|36.0%|**64.0%**| +|**赋能性**|41.2%|**58.8%**|45.2%|**54.8%**|43.6%|**56.4%**|**50.8%**|49.2%| +|**总体**|45.2%|**54.8%**|48.0%|**52.0%**|47.2%|**52.8%**|**50.4%**|49.6%| + +## 复现 + +所有代码都可以在`./reproduce`目录中找到。 + +### 步骤0 提取唯一上下文 + +首先,我们需要提取数据集中的唯一上下文。 + +
+ 代码 + +```python +def extract_unique_contexts(input_directory, output_directory): + + os.makedirs(output_directory, exist_ok=True) + + jsonl_files = glob.glob(os.path.join(input_directory, '*.jsonl')) + print(f"找到{len(jsonl_files)}个JSONL文件。") + + for file_path in jsonl_files: + filename = os.path.basename(file_path) + name, ext = os.path.splitext(filename) + output_filename = f"{name}_unique_contexts.json" + output_path = os.path.join(output_directory, output_filename) + + unique_contexts_dict = {} + + print(f"处理文件:{filename}") + + try: + with open(file_path, 'r', encoding='utf-8') as infile: + for line_number, line in enumerate(infile, start=1): + line = line.strip() + if not line: + continue + try: + json_obj = json.loads(line) + context = json_obj.get('context') + if context and context not in unique_contexts_dict: + unique_contexts_dict[context] = None + except json.JSONDecodeError as e: + print(f"文件{filename}第{line_number}行JSON解码错误:{e}") + except FileNotFoundError: + print(f"未找到文件:{filename}") + continue + except Exception as e: + print(f"处理文件{filename}时发生错误:{e}") + continue + + unique_contexts_list = list(unique_contexts_dict.keys()) + print(f"文件{filename}中有{len(unique_contexts_list)}个唯一的`context`条目。") + + try: + with open(output_path, 'w', encoding='utf-8') as outfile: + json.dump(unique_contexts_list, outfile, ensure_ascii=False, indent=4) + print(f"唯一的`context`条目已保存到:{output_filename}") + except Exception as e: + print(f"保存到文件{output_filename}时发生错误:{e}") + + print("所有文件已处理完成。") + +``` + +
+ +### 步骤1 插入上下文 + +对于提取的上下文,我们将它们插入到LightRAG系统中。 + +
+ 代码 + +```python +def insert_text(rag, file_path): + with open(file_path, mode='r') as f: + unique_contexts = json.load(f) + + retries = 0 + max_retries = 3 + while retries < max_retries: + try: + rag.insert(unique_contexts) + break + except Exception as e: + retries += 1 + print(f"插入失败,重试({retries}/{max_retries}),错误:{e}") + time.sleep(10) + if retries == max_retries: + print("超过最大重试次数后插入失败") +``` + +
+ +### 步骤2 生成查询 + +我们从数据集中每个上下文的前半部分和后半部分提取令牌,然后将它们组合为数据集描述以生成查询。 + +
+ 代码 + +```python +tokenizer = GPT2Tokenizer.from_pretrained('gpt2') + +def get_summary(context, tot_tokens=2000): + tokens = tokenizer.tokenize(context) + half_tokens = tot_tokens // 2 + + start_tokens = tokens[1000:1000 + half_tokens] + end_tokens = tokens[-(1000 + half_tokens):1000] + + summary_tokens = start_tokens + end_tokens + summary = tokenizer.convert_tokens_to_string(summary_tokens) + + return summary +``` + +
+ +### 步骤3 查询 + +对于步骤2中生成的查询,我们将提取它们并查询LightRAG。 + +
+ 代码 + +```python +def extract_queries(file_path): + with open(file_path, 'r') as f: + data = f.read() + + data = data.replace('**', '') + + queries = re.findall(r'- Question \d+: (.+)', data) + + return queries +``` + +
+ +## Star历史 + + + + + + Star History Chart + + + +## 贡献 + +感谢所有贡献者! + + + + + +## 🌟引用 + +```python +@article{guo2024lightrag, +title={LightRAG: Simple and Fast Retrieval-Augmented Generation}, +author={Zirui Guo and Lianghao Xia and Yanhua Yu and Tu Ao and Chao Huang}, +year={2024}, +eprint={2410.05779}, +archivePrefix={arXiv}, +primaryClass={cs.IR} +} +``` + +**感谢您对我们工作的关注!** diff --git a/LightRAG/README.assets/b2aaf634151b4706892693ffb43d9093.png b/LightRAG/README.assets/b2aaf634151b4706892693ffb43d9093.png new file mode 100644 index 0000000000000000000000000000000000000000..ac38781127b9f10ea688adcbcec8971cecaf0b31 GIT binary patch literal 482231 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

-Sx^= z;icf{`xe{|PcV}C*2@J-1ZODNScdGb>*DbeZRhuLMVw2p(GaG9sgN!$Q!00Od%~E+ zD#jG@Wjy!;EFJYoX>|l$U-$*RWYBELT9bW{(tEY;tn63tna{_Mxsvb&HvKm)p2l6j zEO*!iMS33zldN2#v;V%BYKvR^V-!TLCyISAzXue&o-pALibJ!bNh zR7bJeOk1-Q9`8y{W@sJXuRP+l8Q;8qPQSi9(R`p}(xdVGW-s?x5?VOJ^SHfXQRI&; zGgX6_L#I~$zOJy|3k_#;uS_*&VxZhdvhR6&FbR_zi_d$qt{U!M@Pba`0kGaB|J+|S z|33YL!W01b{Rp+=Nx~H@{S@$}IA_F!i%18~u)G`b*0&VK5>gYn00CIz?(mynqT2(PWwwkerK$-vjoG4dB7oAMDs09jU zZZ?UWEBA^hA8^6FwW|WX>99zF$K5`!Pg0siq~%&o6~0R`43cI)%Q<;Vi@$+Sh!a)d z2`Uv69$ZMidtUc+?UtXu8$zHG+>L*?dNx}JckUTOmUen19CP-88=QGEgsJ37FlAGrOiy+4G~c%qd9&KB(oi*N8k_L+i1B9Df^5H+#vHU% z<$cs=Dx1h6!v>ZOw-c6R>a?hz6wI>ADzF(`4ad22&Uc-k`q^A{MoJmzh{l+L1e9MZ zbOWf4;<sV>w{t;5P%`&IJilae$}C+nhXdxO!YiVDq~Lkq@-dE2JargjGJS(ET{x z-uBkl-km09T=x{}qM$DgtNQ#$K-Pyism z+s9AR_>XmhtYSjjk5Bx5a^w~BU}2&XIZ)}OLUe9)D?nRgGt*It`cZt--6qH@^M{Ct#>2)r~0+N2NfjNKPU+75cFTh$WS!)Z`Laqr6gL} z$vVgVG1Wo|gpUhoP;#ZonSUxe?MC3Q34mRC=5MT5o)UurFR9iNUIByFCi0xr2e&Gt zi@jXS9n+{C8nt1dyQPCa?z(0+w*Ap!y&*5wOG=k)z2JjX{X8?k)@rnt z@eWhz3O@)Bnn6v*CMr;{);@3+h7X&zY^T)Mf0B{+fgcEZjQKG91vaw;D?BeGt`iaWinmW(nN6bUv;YH{>FJa_5n z-LjN)I*%uPwO{-}@xN@C5;_Q#97l~-q~C>rukg|Zzmlg`w-f=-FY}~&_?yk0>M-;E zdYirD{lco2McLYj@uQBGIN?C*B$<$RLrwae)=mTwrY_%4>ZWHe#P<%zKqbTcD}#$h zmERR?E<(KWvTu72F|(={WxJLazozCJwXi>SO#2S}%m?0Lg53)XFaUh~3S^~usmP== zs?dwAG(k7><{i4g0Ku&ecQ!r3f_$%P_zneUft%%Z-z;C6^eOpa?X z68)a6Pm=qC;G$xv<-{-+AmS zV#Xr9)5D3hx+3SZ_wzVon@;R2WaH*an7*HP#idp+-yF-uskBOO7#ZC>n|+b@3EGEw z5P?Ol5SjRw0ye;WRroJ;%|yi*9m92R1cf1Mw%$Z$s&piYI&m4jycF2L9K54s`x~Bq zemn|(e5h6>&Xq+7@vS|v87|7Mws_DI+wjj*++xyJgu^CRK2R#?)@*srk0&gBe#T{} zaxR9i8ua}f#K0ulSg@W=Yp&Ij3tDr@%RZb|MwPf)R6BTK2uKL$6AjIE)P%9RrI3vn9eiP%;if z%nvJ3Dqv8!-9N?zdI*Hx+}-TU0AbFA`%~GOXK7@e4 zi-tWXG<7}kbXs**$O*Dt%#{Bzi$&0ckefS;xogt@QzzqW#e>FKzm+UCqd~<4|G$=m z$l}OPK?y5?tW@@aWbU@Vooj@!bu?94geM(8E&Rx#MP0l&YDZywmerXgDQJES2qL6V z!5LbHDcv3qPtT}u(P|Pw(c}GzNt6-q7%Fi;LaG{iur#QWO47^?rM8BR!p$o%7*{S^ zpwkX^oqX3`vAgBO-!_(3QkOeJKfNneq{^P{p&wokqCV=KA8R^ErG-gfrIgBO8pHUz zpBE0-U*1i>;hR>AGhdT~*oIE~Nv9V7z=&sYS3Fq<$I0D>zM>`JYK0T5152oAzQOAU zzCV%{D&Xx}$npDdRzreEO}nmhrHq)=6%LHrm0cx}-IVK5nTf>u#JB`uoBcqcCKWm@ zsP{5g@aS(=$xj_iME5^cvBM3x&SuIkH}7~{TmyK}0`+%io0qwnDr$=`5a8<<*%Wby zoT7aV&eSO3-q3p{uyIg`zr5C1&628Wk09!AY&JX7&AM=z^uPEhmg7rw>#>ALr{JSi zRQJdC0ln@)rd^4s0()$Z#9xxd^3#qm^C%cbyvwowwp)}U3JbVsvmK88JhD(unOq4q z`S4dO*XEVdoSz=rbgHmfzAI1aP!#rjJYh#TogdV1mZ4`RQ^+3MYepGXc-TajuCVlS ze?|Ne{POQ3Td0neWcdOCcQhd33-8^fWO1eH;&bEiLLv)zI94DVRtiOu!JiWPUCiED zvuh0u{$@8ujixfn&`#&*JDP>Vt&w$J@vniJuR5cuFOxN^Ug zLQ)O58MmvCcQ1hANa-UaRr<;-ihlt>y>tlQXA<#k*zGofy%S3nk1-5EI7o#%5X;mz zL}iGfvfc;`jH!>f%eavsCQ67OfFrbm>JkJ=1wJkOJ=8)9@)PiZsYZ7BzGo2B!O2U7 z8tnkdGT?z3bsxcdq(vX0&ep#LW66tT!rB`CAWOa4jQsk?NWLvAp^Yl3%kcJ>_NtF_ z|NZ+{7g%nG%a$+z8?YP zKrm>u@Z#Loj{^V2-Ki`m^~QXc3YSl4KdoArf=>3*lRiYdl^9`FR^-hN=VOtlNq&bN z@J~6IN`W1|t$GuXEd+9@={Vx=nn)>-?_W{=)?NJ^J)had5U-q=N8v32DsJ0b~Eo zPGIomFTS!vo9_Sk8VZ;|qtPtpuk_ufLVdh>(TOwF8Lb+t%5hr*cjNyQZaoe+#;N}xC8aXi?`LCuX|{eY`}rlRIa?dkhA)p9bMUU{)+~a zQ^@AGqL&HmegU869Bn3IZdc93a76XFNv7O77h8>nOyuyqs{x0@`vO0@q$jHsA>-N4 z!i!tUva3zcBL#KOhcPwuxpWbmMl2Q61+;rP%!*8vc7=U3PU*-ixDNExVO3CwDIb~@2eNRmId}AwLIRr zdvF?J$~AP{EnJtaxR?yi2ya*J*3CH3bxDJhQ2#@B3*lrT>;UvN*xIQ-9@_z6pOcb{ zgC$(QcaFzcKLCA;$^iC&Q6rMUW^n{KhmzPVW=9q=uxrzyx3POGG@aZtJmN=#NzC(= z$=ingnr%v#rWl<&3#TZD22nym0zzbfG=2e}lJC{B2_kyA6WFOHZCM=-VC0Q0rErw; zv-K9j4YXDfeOb*Y%Wf&z4L_pP!C6SpSa*fr;;1oyM>fn~^aH_5V_H1ot5@ZsVaymS zUKAZKeKnG}n2ZK{oAQublwhThbmH7++Yk76e-^GjjT3QAF?>UqzPMkO&_}Kb;?5u5 z5_#~DDaZ@xZL*cw@V+1uHA4p;ygBT`jFtWpDVDiD<|uJ}?P)rF=IhpDCV)oQ%nvQ+ zxT4Tc`%1483aOCMn<{yKCLVXOzJL2q&Wz(#_3^0R0zm;&H~RRP)Yi#w(fSRU@dETJ zIK#}EnWt?JmBZ8t`n?q;@O$1Efeow!+}%v?^{)HvG$79$D3p()Km4{-+kIjQIkB_p6yHoFz$OF}RAx0t_O%YLRnuv&-3X zLMS4FY}Z_=0^t|{(SDY_lB^E$Nc|S2=mx6AlK^pxNIG}{GLL zaAgDA@KTtvpMk#;d0Z?jblO;i5AZo<0W-gfyn5M!0sn|66S6P_0WhDu2h0URz4-?( z0J;K!R{$tPnfafB&T{~@v?oCs!(w^5T&TnZ0xe_xjY42C-1&y%pz!Yz3ydRB$;5pxSZfpyCqH4@3zY_W`op#LLK%02w;doRX4 zz!MHFJPJWBa-LyYOIDl@#o*p1=uKv@&oO@8ag=&TxL6))3we+Ai7`4}t}}X@{vu%p z^7|itd>&*U{T}S22vo8Ao^7}G)j{u=*q?_xjm$fNl8pj7;k8i{S_g4&cklCji`|b{ z-d|AV7-Wt2r%Sg+-DDjBzs*^F<{Z}x5e@NJP2mMwfJ?6oK;;q_=?-_VwmFq{YZs1d zy;@E>;T`$`fIBsB;spV_CHfZQzw9Ev3;QX3Ke-$}&BL$_b0|=bG{>nL%?61!`S4S5 zUkc$`3ax1%MuqUykoN&s_Vfb=Ix5kmNe@j7-%4R22)`gBkos5uBu7m^tAM{gf??ZN zk=9}^(Ju6{;*Re;5O@tc%S{8dWa(OgIaRcPbw-RH+*f6_1B&YNuLE&OO^a5~%4LL1 zz>ssx3)M|bZkjhL*UWjw?hybIRYhQ_TTyUHUUzquf6uZwU=Yxlw-Y=whZ$S`sKp=eJ@?7gzKGP{$&Kk|GJmEA1X5e`xkmw$UI^d_ds z9702Jc7cW&NJEvxsJrRAeH!iK!HUW-5=9mFeq`()4cAF1fb^0zm8MXA3b#L2h3+%> z5JL^QuYf1hE9m>BkFDtC0p|S&SAN#=QbBAFYT4)QEyAn92~|ZTOWGp5qOe-6cH=&g z2H9YHPPBCvm9ReViKAh+_@rax>dA`_Dozbn0a8zW9elNAoM=(avOLvkWVPojaJmI7e@^3$b|B+@}qLQIcCea6^Ox>SC zC+a=KE;YKT75h^%x5KZAS1&Qxz{2uMr&X1@#u&O^XLr`bLTAf28k{GH;*L;g;dZYO zkgiX_ne6-B<*nB{t+|_O)e{rJF=f-F0GX=bCcS=kFtOBm%!pWS2%gPkkmW<*Yxgw% zr$%Y?A{LO5iICrw@eFGZv2d_YW6!?8hCQp2eGuS{QO$e=ZhO$5Qao;PJ8L3rKeJ=I z@fM;3)2JV@BM}v4L-aC9z&=FQ9jsJp{TnUWd@cKwlk0go(}cofOzcAlbkO0;DOaB0 zKBIcl^l&U%7^FPb@F6}xU}-(WUGJ8N99TDICwzO2CKzpDKb=otVcEo#3g?2f!laU= zr%^S0ttL{dQcJ9_koqk9BCfL>_Qjye)yMPJF}xJOyY_C*ur2;gXq#y#aBpeV;~G>} zuC-euYiGQs=;W?XqAIzJ(C_fB? z-U&Ze)Nml<6J204fBC;764RG&}y>$^L%^A4TGfeG!zrX zkDH8~^>+yJBrLEKeCH5&4RQ;^l}8cFA>Hic2?sriBijVxK^u}wZ1}^^S8H>EUIUdt zip=2OY5|B*2LaW_NEIb%=U@HJjd39cBoe`d9lY?@-%xvM128Ov@B`nPEC#`hh2!~% zlY3%g{J&64FN;?J6ltU1r*AANw0QUrn;*;H78)&7YSOr^7U^PXRn>q{;nCM(hN!1H zg7R!(ODB8#JRphvL~5;a95*8@gDN~(Y8YNk8PBPe7*f7f7}5h1tA7T{zH%<(KUn}} zgF9dVC4*-NHx^3tDB$ywgm&n8ca$IRuVf3ni@{M@N3<1KgFsaT8A>Ct#X15u2lPKDWs;J9 z`|LjMnA4p|4B9eax}Z2Gd}7|uAX-I;DbLV{C9zdy!{Y@gw_R|Rtkb7=&}$wxge5nf zDEkY*cj*6lASAb-j7ByWYV}ox&UKgJpNSB7^P7RAcKL~gJRlWH?!VTfKYV=Zir~i8 zmfy@yzRacnw4e*DxA>k8sD@*{t}w!VYX1QUrNBi*zLfVZEao}F^g|u&y=7E9Vo4JA zJfVryF{osq-?<$Q&AXkzhU`5qWx22wiGpR!Fa5wbT8SkEUyx|hZM~1b;W!)DK(O8N zPqhQ~XZ(gXW#^ll;(Pjbk{CSE&>|_;w~u%(O4-lrnzMiU2CeNONGlLC8**IVy#f+> z6J~u5vwF&;VSe{~vQH4DMux5}REmjbBJBh#)*-4iKD(t3-DwO>aBWVgMDdHZ7Ei5 zNvER&!|MFvLIeT?1R~;-|Is7NBW{TgeDU?#Yhohia+BN13>cxErkCo~Jv^Tm!#=w3 z%3WcSry)pv3!3lQjK!6{%22sBzn&||PfVthgLQd)1_&MDkHt=h=g@f*tE_py%|=DC z5%#X73lzcK+v;kZlW3iGeB%Q!-Sn2pp<=8rBeHTST_cuNTl!a6Ir|)X&FUcLYK8 za>l7$sACEmioMWK2rMlyGzCIY!k=&mxI;4&F33TzQ9(LcMfP~FsIERBFY&IY5Fu;8 zH;H$%Pk@sPQy|UUcl-;&{_%3_@KRA6T(@%#{1Ei=y!hP>Wh7}bJMp6?hkw`&b(a+z ztyz@o-c|6vXw1dZ>in&7f82cP38qn4lAlHNKz6>>hqt;O+O6kiTL6bsA6eH>CoxL) z9`hic3MJVzGS4HO2+cP!aOsPSm;v_uIQ5#p zqvc~?koo4ow??nu5}S-vdh(jh!H=4{z=-W153O>Uxf;fODlD9_H4lAh8{tx+8^^#D zi&*8C=_)(eh=zd0nqe2^r~RoZ-Y{$)o+Gu^=8B)q@0#`1W(zf>i25W=OTY{-`bUQ| zX_*SFl?MIIlW@p_0SqF~C(|&=z;cE5p!>({iHSy~ z33j^WA(s|+F8k%Na6$ITZhze)X}FN+y~zX(;c_L)_D9zcbaieS*Y0Ig74macrQP`A zd`QC2AFK>{inZc?JPQ>vDjIafjnQ#mQ|UlRp~S^XMHR8o^B15H@kU@07GHp268C(g zBUK|TlE_xau%GESg-VI+`u$ikEw`rp24Z-2D|KK1Q9HnA$Qy%~BfNvIAPoRua;YP^ z6td92ZaU<4MZ38Yxva)e7kzMcVHL>0G@|MPx{wZ zBA8ygIeNMu!~luLS&_oUq<)-f~3S@)2mn-WC`~p*8 zUn-yd6hlAOC)9bm*~MGFV9(C2^clnlL9UGa0G@zS3bqQmf+8kU#smun9E#%pf$IQk zW>wpKA-Im;rqn|0Uw4avSqc1jACO_}Nh->Cfl#mv08icm=WYY2W)hjp+4XmJj%J7T ze03Ul0SD5U>llYvBoV^-n(DT4&`~-d{;ZP=I&fJMD}1K)2!|&uFV=FDJAjawC?(Ll zQoVP8xvwqg8ZnS1e2yvJ+aX$?sMm14*ZzzS`%%$&Pyomc7UGt)r*nw@^9ce5Y2P#S zq1j&B%r~458%-#|R7PvW2V^@~{T@jm#n?FnX1FBm&|a)1Mx8kSY9^~`O{%D!Rq&vG z+h*&PV43bi{sB8W=5vHFvNjWn>crfQQ&W>EW;?0b;h8`$a)@(CmG; z^FgNW)0i4v4koaDYYZHrR4bT$Cp@69@AfRTHom_?Wp@i4)Tjh~jFZi2q}I&d5LS8R zRU_55rlrssL0Yz%!mKo4F0`~<<{P1XMn`Q#r}~U7l@YLOqJA!DrKnp8+0_8w8{XD- z;|YA<_R~v~GpC&up$&d-xsa4?O!eg4k?^Nz}|#8y#$TDyP~xPaxV=ja_>6lHk~0 z*_sM1QvRIq1mECDVxYI>urDj|fKUGVh4ayb8qc7V8`|e)(fl|-9o#=l+k$idYLv9i z(P$j}(*AxFqKx=1mC1r_!)G7))pos9d=p#~8GNbIjSwj3+fcDd<(w+=USXf+O4zho z2i59JqWgS5M54*y>}W3=b+PM-ORCc{t9Ja9#gU@-rK(L1jZx?$R;?Vq%o3ww$y}h4 zsr-D>w4Ob66G*CdMY2>(7mrN;sQlS&xukS5B+^hx?^SXK1T0d&gzdvv3xDTtFs0d_ zIw?W#@;*dSJLk*F(_aPR7qxgznBE)a5oJU-Q+@VH*tt zkIncBP^N(dBl%ipZzr8CS7~#1GJhS-R!u*7^TCGzaicO+QuqG66j){2Dz{S}HXkXC zZiWxxy02*q`n!s9Od+UNO*Nz*b$`0n>`5BRz>;ThHY9G|#c`zCiB2mJ$TlMd5%*!6 zN$}m}-`mg@Dpf_uEa-)=T&mZVh+p)+3ueO}Ocba|Y(YvbC|-uRm@6iKjk_pBe~pOg zqLsD49ELC2a>Vy7)`;eU2a9mu7n{80Rm%T99-x|U?wi5i*dg_E+?Val9#3fVK)w!dCTeDBK8Mgg*#4Di4?Pv3TwGc*ODCbUi}tY)}GSmTgUnVMtJm z@s^UT4a@SE#*Fy&alZ z;POE4QH4FD^@7InFcau@$-m|{>KV5iG3lv!gx!k28^xF^h;K)SQi&}Mtqk5vlk2&2zvs^Uje6A{VJPAsQaNE3mxvdhxw?| ztdX#*GYhQL-t>rCY*r(m-Zt!kR>&)ZDPG+TS7eDUaup>A828tBwYu;y}y-F?J7pZKQtdfp-T(0vQSTPVnGja z*(rOgNjHh(0^KgZp?jw;Tqy<&`?lueVs9c=F$jxZ$xaA z*E{_c!|cx#UC~Yg6rF+tt`3fm%h~9S7ZdVimQ`VotBA`2=~l$FqY*& zlFgy9Ayr?$qCz}h{%i#YGTbV7vK56(AT&{EN-cq~xf~HDwNhNImcb8L z5vtXrtscR@p@bzAe@N)M03d@hr@f=&*85H6lGi@Kv5L6iE(>`Vg7euD%~%iFSy8g5p=pN++FY6=YdvUrr!NKZKG1WrLs6FKC%YRV5+p6dpR5h`OJSUm!&f&7G9_ zPT}1r82N^%W0&u_7JCQ--9tDQ3Iu<63a_Avooo9QYQSZEzySVlyVWETijj>B`CQpi zs|JlEwha2hST8fQ$s=IN(fe~dcSt>=eG95ssYqu-CZ8Ut17}Xb(|RzCCesx^`JsVa zcDE)pw$w@x!pt%d>bfzK8}r<1&MaPK+5k&Eo;;Z}amuh!zMk97MIIN`Vds#G2i8S> z`6nH`Sl!}(t&#v^CQ|Q)%^rrxG)vuIdZ>(o>2liMRFfa5+vaMH%`T)Vh`@n{QBmMKn!E8xZNG zFch^B`c8;U5(;>!8UL9wI&6e4sonC~Ci^ZkS{y0Ls)4-u|1kAdaaC{a_qLR@bR*r} z-Q6s@LApV@K}x#2L%O>|k?v0E?(X`3-Ot{?_dV4U)(6&{^B(sY*YFw6RZuM)`C8b& zS--$_sT$-PLPKpsr829Ecc*77oj|tND}5hXHCt=Q4*rPwQN)bXwIjNElFzHJ_QM%b zO3zb6=}2}6#Rg5W4+UKT=m-DSol0W(Vq(V`m3Mw zNMIW?oQRL{6&;kxGKjluwA$V=1+Y{RISY7RezzC>br&NnC_x;v=KY{coYEt?cVk(@ zWQhZqMosMmLjMSoUmnXmu~A$8ZZJT1Jo*0muKY_^tF^7tPOFt3B@_{|%R7>HLcqxQ z-85sK6#0!jwMPItHcN%&IBPKdpI;Uc0ZD9loY92<&K5gzQBQ$TM|ZG)!iOo;(D98< z%UYv8x@A#8i8KEXDEYxgpU>@y^&y;GUH8rlRG3JRTd+f;!v_nB{+edsXalbtVCi@cbT{@O@gG|DU6AQ?^sCXS}e2+p#18 zp$hL9q6J+#>Ou^G=QX|d>k->qh3QF0>pDg&dOK2`!=^I1ys#K(yl)`cELzd&neqv0 zS3M|*(=7RkZEr-~1A9H-A+7wISx-%+H@u*90y%)&^at66sxl1srkFOs7Fm&)I>T}X zTtHoX{eilY96HAGQ(W1WWR@Q$-Mt1j7=+!EeXI?HOx@$tGYfPiIuVueKC-Bz-j47uRa-91Hb@oO0shb>B4NM-o1Bo3LeK%k zA#|fOSCjKxtnV-eeq!!(J&{$(6F~)jEpGx;uQVa1VE+=!(F%U^O|$~j%oz}~-nc4b zo+Es)BK9~ravT)%;`FxhA-g{(uIT&hx+K@xLzQxIAE>@|3v;1vJd5|*dJ8}gw}jV% z*qhWsguVn{aa6IxSWbO{ckdO#Tb3$So|47A`V&cz!{pBo^KCZ^A)OZ`b zx}vMu5fCk(uCQr9*DeWajVnj>=L-8EHC*asMe)K_J0$Cn^aXdO_Xxe(9#s3e`)hou z!PASwm1f#XX(D5_a`v{<;AXwqR$A+=3HQHIs0UvZp~V}dH?W;&=1DS`htp3k%EC-R z0VSX-F)q)>$FxmFJ%Zy4+bG1dSJ-au z@~Kuy>GQbkeyRr7U8n_}X5m>UM&y!c#|MKLlNFtiC|;IVEYH0Xj!a>9l(AFqk>G9Tc_9ge%Q=yIz zsu7UTm$o}0*sZI3-b{wNEXMmCQmL}2K6HVvy>If9iCG|Psbc2~h%mue9l78CpzR_XHVk{70_tF#sy?iV zj0kD!wq%lLNHHp!#SG21)7{KYzF-t$aaabkx@7RZ0HjwYm2nM zf2i?zBu*ov&oKs?o^@RunZVO+L=>kd209mHiuLU+3oIt8;aX$==QaPQi$b1cg^#+>86KM0;+0g~q z_-rpbLkU#$c*iMcwZcBk*)Bu1O86OZU&>$Ee^4tR_sTJkiu{h^NfgVQgbS8YF&pCs z!_a%dZgsyT8IYqQ{+&_->=47$y3hwmc(%KM#8QL#1cAa&@3$9jN<2}2G~+U$phNrg zaHYn~U~>R-zoqM~WJYLFl($8J-^WT*3ETzvriy#P7=ynUKV zX_SEW*=r1m3gtr-<70eic{zXc2O?ZQuA6l0w;lNxVvRc8C9$+>I|{1$|0r!hyr>oC z+eNd}8B9RBQ85bZSS4m*CWA1`1D?V-xWjZHwJ@B^=)V2hjB8QyQetrNy88xtYmrQz zxJ~4=2Oi~({kjlwYR_#ZdplqkE6X^(%gROJ*G{*YQV97PesKo8^oBvhbQ)xYIs!9S zjbFEYB~oX}N~ODC)Q~c53`xD33cjn!q9uy|{!I$wGjf!ie6qxfWvtHU_o>q=>vPB$ zlX{fIy`5;ci*0|B>%xgZ|Hzgm9%%|(2-Wq%p#E&7rTmk}vNDg?DZvD|G;UejL#JTC zDH0v0%6T6vyD(cH*Kk_jjmg7(7omsG%SZ};eVv^J6ipqc=KH&DZPfOH<%3+6RK`6m z_acZtjp0Ay-oL4i@Ocmda*~@XFpph+#~d^ol{BqPYsn4g&|s(3+qE6*0kI)= zF!5S+ZbKH=R(;}s5c)9CUc;jVh#UCi=nbm-p@y@FtbPSe6VK=H&+w5+JXks*a#jG# zf}JC`5(tcGfbONV+U7EZF9-?@ej-uDDpxHP0X|IuV8=-)Jj#E1qP>Im*t-$WL0WA% zIIFG_6kYj?!Y@#M!TveQ8l(wbw3mwQMP+^V5U6b=Q$%)mcd8RmMu*^wYz6l5Rvn*E zg<_ebS?}e7%kzecG8rzPEwl)r1nv|VJFSRvJFT$o&Zs{U@kKb;$OtbjJE`Ab^oou` z2KiS+)u80D% zja-bK9UYNnSQ+)AEfN3+GNW8fRJtA5A84;b>^(54OT@~l><(fUrh-@ypYvf0u?v5? zr81GaIi&BM315e+7u;61Pi9!--Z}{>71<*>Ix~MZ+v5$AKdTel5Dfevm41db5AqlF zi}m>`)Um`EqUfvo^&L`yDQRcg-D%N8@}HcZP^M_EY30>ydy>Zl_vm2<(P5g(Jf^90 z66=1&(%34)x^F5EM@f(Vym$K$=`C%FNsz3DX|rAJey<(-2A69bS7hR zQn0UEgs&@}JQ8b1j>nDb;o=P#OEXtt4f1FiZ zGc}?f?Kd?G?o9nc`hF{rUZ-X3Ajw(595e*hEu7m=O+S`*BOGGh{Bueka|Na3VK^oe z<&yv9^Zk2~heE>$N#6hmZl(>~bSabA&n!T+L$VeGY5~Uae)8sbdfiV8zP}h_w5mQ} z%67~Ie~T+Frlf4za>MBj77LP0Jf6&hkk8^#Q;m}i`{@?=?ejJq-FkC|S+x#Y@tsy^ zXkV$q(0FR_&oBt+!^a;3v$ghwZ>^qp_DO#3v`V>1U%at2}=e?vt`03)AJ2ofP?28Ry7&r!LAA_wXH z9wq)G)B~7F%1ubwcoBLl0ni7{VH<5e!(bkjMysQ#?>1Z#zi>g|RUQ$|(Y%H|r}cc~ zM64A6niVN4jHwmu{tWEdbuUyWXW^PuS|55f)4!?-O7 zdFT0sj?BZ$s{#xSE$KitXgQbCTBdap^Mlem0A76I0T8A>m0E@UM_Tce(nWheFnY!p zV!sJpdA-FG5b($xYr7W33XQpt3ikxL^w}|*9ABdQt4=T~0S~_T zk#=YYU!?f%*0HB2_(FFd{_%S?SJ1!4vn>JeTbiWM=^+h!pOW>0KBehxZ4ufcxUkrZ z9tDF=QCc_m={_B#QsduNB##+%r;GL>Yn4Y9jZi(bJq@C27-AB#h%&TRvhj;?_8)yd zsZ-9xjz?MU_WCOc5M}hMS?ky1Bc4z7nB0F`35SIk+@!_q?5EF7(O>gCZhSPw6)se@ z1yKfj9t1bev>cTU^145jY0fDV`MgZaN^>?{iOhw7N4i@_`(JbzZG9NtuJX8h-dM7> z5_JBU(Oc#rU=xj`CGqb^`4_%HWJfv)@ci05Z)xbY>Vjw^!q-G%;o^`k8R`K3ne$O1 zEQ_)xvN&XS-bL>7$@Mo9k`5AI8{tQx6rU9k{You#`fp_6P_a_%?eptpn7JnQQXi6rOH| z9%7cTEd7z^15f^%4 zTGcy1x$w6|@SH74DNvIpc~saAOnVNonB^)!Hz}u(@=|%-4kz-MyIMUgAbcNy!o52q zzU4WWM%+^%f0#3e{d`ht^PcnIoBOHe#Me=fU6(0~C7BAhFg!xXQ{F3^m)bsXSv6Nn z^vGwE%KmtNV4=jOJ12iO4i**63Hd96yJYZvBuTT5*BCVcyeSFQ^{wqrtvww%+!HeV z=?KNYq4ACGP@yFfk5Y-W9_{wK`#lI?%sQj>qBOhzvzqamJ9kfDyr;B_3N^(4qg?%| zdGTPjg@;@|UenU*d?=#f_5$Z%yQy zx$EabR=ME0Sm7{d=W`Ce=Rm&?F1XwgA!!Tre!Jtw3Jmk|103jb8t-{&=#i%YveW37 zJpcFHc&lM=Ey7RPZ9NgY!$%TNQp?}H$rRIrI3^yVlv}v2NkA>ZPZj_5afNb2X4bod z?g-66(c|@09{yz#c#h?(DUQx*qGz@gAd!&4b7xhV_|^{?8J@wzbUu=;o(wEUl4gH5 z7weqh$h#sYqA)K+GNu613S9`f4>dsK;XqrggfZBMOU6K-t{}E}=3rz*9R10R{<*@? zGJ`m{AH-{|Ikrn;E@?v8bTlPWaSf; z6Fh8IC1cGXAJ3m$qQJ+2ecmBp)$5=}vC<*DR4nlS359l4AO(~JGgA(%0)FQ49Kng- zl|Z*ld~U2|wEq`cm_!jDke(v)vlxy`wv^~Pvn-5Zlp(M;%mq?qGjXJn?$}R2(H2_b zw$L(!p_C>-M0h*`q;wdXpq42JB?L2A0vL}>Qpr#HNRTQhd+C%lend5^|<9@i2HgKy`{jj|(t%MF&LKv_1QpwH8d47U&M78ePU zOm)xQ$&x657}?9<>L>b6BE}~t{|(a}um&sQeGV|{29v>xgXyc>?64%a!=6X^YaX#MIdI2CTF7&B?iQXf{vMjKp!4Q zC)qz}!UyDFXOx&9wm?te3^!UGueLYmC)1!i%ssXpC!dv9jyt#jO+F|C@&(mESiM@k zR5`f(#R$S!KhluhZa%v{pS~8K&%H)-cjp$ETd7wxYk{lKNq*95vLA2j39=bn5|5L3 zbqN_vnxzqcRBT)to0~08`EuKu(NwQfxy_C9sKFlIqrpn1>hT&RQdE*a<|5-*t(#5r z$`R}Pr#KJ?S`h)`7C4L4$wJ0=W!M zEDW2eRGt%EMe?@y614$pH5qv?0;rOs^KRuI!K~C!q{}_{dhyCvbhzR~l`@W^jNq`R zsLGcNr==^k{5QwP?Q9Q+hzjuxtHr#+zcg~RWP~sUDk>?D%2WD7=khZPdrg&)_(JYX z@k@1TksTdpWBjR}=~M20fvIjx67KjKBC6s43CS@hO4)9kaX#dG+TFFqeYyjqG{1H_ z*Kt*7`j0_=`3a196X!Fuv{OH$UXqXd!wceTqXQwlY__m;y%|(^wiUeb1QQ)QuWNNa zhmU|~Q%PZoPIz4wt_E5;hfbX&B?aQnuTO{#VYJ-!Cb?JQ*J%~y)jyB#flTK&^R<(7 z^GuIA%jEoVV2*?-kZdGIw5n>VgJFUAK#SWBMBHxEYGPRmBza(vG;C{jgg@gc zHBJY+`=epmPxbcUk;0eH143@m^0YpEIwvpTxzt!+bOaMsCr5>HxV^}$>w9;Kc=For zpGL0(<5;tv(~eDkj2ut+W9i;hO?D6D!)#K|@L{rlU$`}3;0)ZdN^NCXgN=@oGFk=6 zN-;p$5b1)@7Q_FJVqwS&Uo3D<_vV<; zIOG!)^^(}VwPbr%(`lx2h@0IU47~A3S<|7mjRutSw8q+VZfiz$vYxlk_y&P zTlYmesbV6mGT10UK)E6onF!(rw4v&`)^ZuQM@| z2cQM{G!}Au2r}tW7PJEWSSP4Fjt2K1RnRBqYq+bOHods)3iQ-NBTPz)5u^@a6M16f3yl=}NN(%r>9@ z>;GQu*qnBm7Bmvc2i;7#8kK6c%kfwh6+^%0ysok)$&1}x86&AQ+7$Uet^`H=Wmu^O`K8m zqWR_{IZf@A=*HXG*J0H*uBC0BUtNMZnOyRW?f$=&3X;%b;s*B`?}j z&uwLCNU3Fa#7)50yVYXb_sP7tI3BAEjX?Kw=FwWpUFo4RMo@UJ-l028CTF@>S{kOA z0bw{csyqoLL!Dk!goKg;9@?PG!kB8>CB;X3VGfS}(OC3)s0wr$Btkj5a!#t(aw+6s z05q)x55lmR@DvSFBe-ZIWQ$a1P{>>(xz49}VvOm86gvm+jdDA3TO(wt`Jv3LmUg9Ub=m>ph4)h0X4oA)&4nU% zps@+OO`IzBG=(TvV(2CP!`y~61P|_T^5MTaGBPv@jPJYLp_-V*j$2kdmB#d~0h6^Yd7n^HEE%V63xktw#V2qZ-Xpp*xz6^s!) zK>KeE^4bLL?N0dr?+G;}A@mzLv?=3&7deP|Q<^_RykNnLxb&rBEtO$*rGV(YcahFD=cHx|OP$(u%t~QP*hx2i@L3eh@ z!S{5^!PIuQb9Ips`{jnPkU)bv6WGmqpJ!KcBvxmkX$Ua1LjYT|Kr$qXfk64`|Vpd4<2XwZDQ0ykh& z`rB57r1FVfCo#~Fa1x6uY;PnbCO0yb%~CmtjeN3&sQikxk}Pu3BIeJIm49<(t}dM8Nf6~+lNOmF^}XnJYc=(aj6DW^-O%LF>czIFmjk%^YP5h zZIOb~lw<-zz#;|Wi;`9enVNjgRIS ztE`$CC(QW$RKZ>fJ+0Pkp40Un>BPs3*tpI@HCm9SZI=}aWhyaF!L$p# zZ$SzcgHwPOkWU(132AaZk|$d0ah$J^q1W_7t2u|;Z?L4Y?_74aUSSwksmAn=g@eB^ z%JV;JEI?9ZLpqL8OcRevW3lY&zjg1t3VfQ3)(>>oTJnWtPcspHxdV2YlQm0Wah7*ptwNDv35)+e6cK(c%RMvK@ zUmvDK|NG@oHJZiwC2zOPI(*xrf~{;rX1A-ONKa?&@HU=8Q6c*+?9_lOV+R`Cj-*s3 z7mGHH>K{R)O9OJv^LZMv2(^?08O!{oJ}`V|NWwqT=4oe6hsS64lP$la1T25{b$P(y zSja@8x$VW}{6NZ@-^IRIcSJJ@Z0sO}Fh-DSkf3559koU#pQAdf!@=Kb#{4;=E2I~( zVs*>29ATE*kDktXjC7_uv}K4VDTxOH}3=3?lEcI|iQ@^Mo-HT*SaOH0qzJ6m)e5 z?kE#iy?Oux!_;}FII~PIg`qsoY*<@lW+k$1-ceeo0#el;T>RN=4zJRk+@a-l-VB@l zDuMoj|D4W^7hzvaEk>+5C&A>O>-^09$79I&ugj{-R(4O`Cp@0|(gNOlxTjp6(aMx= zo0h4IFKhRtofn>p_3EcvBbI@@P9pnlodZdpl3HHa?Tc=PL}-izW4`ToIlTiW&+A1q zH3ak}@>${D21=hy4%W8c^8u5bQ@+EYNb6Ac>!&537jVP}(QEJ9eL_4X%a}hs^af^f zDd|xo)c7+_oM$Snciqz>-#yYqJh;}X*B>W={Ep?$pSesSzFI$M+{L`SWF(tECfhHg zjqNv2tI%!E&nOtc=0pZ3Zn9d>r_J>owsP4;l?<4QHw2@;0XBvrge8Aeitx;iD*F(h zYQmzQlo~gtLqHWy1d_z|%M z=F?hdh@Yoip8m0xJLp*Y7{y?1CM897kXV#gX5*mW1IfJ#AscLMDKO>(ga3a@K`bCk z+k^;#7pY>Se0C#3fvX!UQTiblzk|>SMS^289XyuJ&l?V&Jy<`78tw<8a&dEO4wI$Q z3vh-m6i4Q|6j@b!D)U1Ouqy)=1E@E8WMmQhPnmnw&|qfq_fgM4@-peViT;g{-S;TV|vsu+`SxYpy@ z(3JnIrRmsz%zbbm&h^NGv^Y%%DCCR%iYKrM8J+S@j<2 zRckJn-D7p~E!(QYox}ete0!H2>*)z^P{{4~D-xUY3DSeBaCYGJ8klZ!9+56hOa#V2 zr;}h_x+2;$E)aMKICb*V#YeoOj+7F}okpu50!lpd!D&RmI_%fGl)N`^4S+=B+XcvE zix&#boheLoLBRKA@H``!g#SvVP^OO*uBEm05OZN!U%L{lv(;6Fc5G7OI>}GztWA(= zNkhXn*QYzuXqzi2L2SiNPdrV=GPL{r>`!qYhLyvXBOvghE7vpB^7!Nhz}4~uoZk1a zu%jC_vfoZ}-#T=4pCj8IPN!(w>ndoCSfdX)4|FXOBd26kPI{jopr!~rV)mLQcGo&& zi0E>tGX`|>c}`#3d!k&}NWakRTsCN@pukNjCAvs&i5WjP75b|rhmx7Xn)d5mOI+E;ULn8zx&GqB z2qIpQKL%_OLiiPgdnU5Dedbl<9~j-YD$eIa*Y!J}OZRM? z{$p;?dYwAlfY(#+FzS0)@t8$2e5@0lS|7ewy&@}|(?}^4SQ5r`%e#lLpb_=-4A5Q$zE0NMa-Ipi2RX<}(Opuv-yJ|5nxSjb9TC+);9UA6AH}gBV)iQ7^!9B(cp8E9tBVN~oTuHIz4UMW(Gh8lV3c*( z@4S92;eEN+3xa#E(D_q#3hByVl2eL@W<4o)f~tTlKR4^er=-qc{0Z!<8INmZ8ag`06x2#@{P@eSvl3F6aHmdGy^ z0}NzEL(pq4Wt*9m!H?s0O`irmpt0Ood~{qi6fUTuW>z7KM;vgh76bBWMupY*r4ldL zCALht6|HtdiKj}HEMz1JQIgz`p6i!U4+Ug#cT241n?%4`uTUg9G%O0uY&uimY;t2# zXf%8h$B2ryNL~OwhDYsTBo4bWj;h>ZzBe>Kk0#KEYL(m5#WdXtV!*JRZ!)&!pQ_Rn zc)piIcci`|U;@u1N^NT~-RM&>bK94Fkxgfy$FN$_U7FVeTT1MNnkRYA9|dX>Dk)Nq znhdS*&=hh@s;xnh3zAI1@$6AK!yyWuOiOtQFl9o-M-L-`i-|MjQjn0|miv!a=2lhqj3oJ&f!KyX>C2 z6>qhQCltJ!xfT7j{gy2D<3zXU?`3lhCh@lAwRImMo%XjFktGwfRPG&R7oXPuTomtm zkV4-fmsof{HV%JtI!0_mCX*0_0%SaK9kWlnV&cg6@wHxXhM*#EKcl2Yww9Bne2z_s zTRCJoVX0a3Bw6$?r{2Id0+*A8rvdc9zR^q5YOoP%FrLnqw2{xX@KC{&D&o}Mvygrd z&`l>7)eaOm(qNEg{KU9RQv>pKF&%&x6EEq2gFv}D+SA(UgNet$d7Q?_d+)vriYdIa zPALkCVdpTnK&mhI-zbmSX$Mvy0Y~&FtfY3?-M%sUEOpl4chLEOI+-R{wh|x)@5m~! z=1X`uoF$oAl1^{TGdyraYLEjM$Q+;mHbVb2K8~f!_2~M+jQO!zdE{e?2daNdkPx`n zHN^?Jb7;r+zQVVWE-6UVLdPE+5c5tL`Z@5tL(DE_GU=5tUR4iiXN+G^&h)MIb<5)% zT^U8V+sA%D-h~|?k~Vj7S18S3nxZcAD)&D@P;0%(>}2)@o}f||Zn!B@Uo5%k&!5jT zE2;j~AN}3KKjhON#miEYWKyTteHkunB2EEM53PwA-KTK;dR!4a3-krH3Lyp|6#Umh z1kC1N@F2Ua14?a)67~O%{MIPg%tny#kC+Oa_PE*1pG@o3%GH%-istz%nw#t$IOX23GkrcDziDUxZv&dYm z3UzhK)M>MfY3ET>Zs)vWnOL(NsH6?3?tE$1ya=Rx%-8a@ahUT=Qam*tpMGr`V>ntS z%BB4coc@mp$rT_J-y1!37RJN&Oj&f`w=rufGa*$55)Jm(7g$qs&yTd&5Wlg5QS&b;Bn7Rv}x_pJ5x7 ze9EemzkKMMIVyzLQSK|NBMJn{3%%`O9(0%G6&Io>+gFHv?Qe=k#KMGZNWYwC#>WZ4 zU)hlv%JO2Kk~utOdh^-_H{I9(N5`+KBpy(_Tska4e#K%;?_r(FnE)+%4#{V@vWEg1 z^^|PeG$}^6H|n~bztzW~Auyq#-;Sz6{5r%?h|g!GIkaLPUNU#L=zUJ?!-u1{9T@Fy(g>m)Pqu|H949-?pa-M^#(_0zB9%xOz zubypA`=9=jfM`=iYG+qgGSCz?Dl~=DSj~$7&s|^hYQ)sr$B!Q!-@(AZn3to8_vO>s zh)a@tP?^D1Vc?lN0K=UKwu$9;l&{i+K8?D+*Sgp7q0P|c|rjSWjrH+q95zlk9oIw8-4ApgC^c9n1E|&O(SEOa2NceIk8097| z!%(uPIR;oCTX~!=ltSnX0R6HtM6w{gXe+1^TSg-pg7yKB4Tqo=VMYBaR^c z`x*p1e(!GNiH5w(Vkw;q)$$Avk$0hXHaOh+2`C;9@W{X%dsVX zKL6p6N!D;Wk1KMXp@N)&ggvEl3Hulxh?H_ib*wqG^vW2li;Mfaq&fHJmQnk}GU;?rXbS;?&@)|Q8J4f>vQ+F5H{9l(cl8IP?XFV? z?})hsqP|6dM^y`oZ5CK}V2l<+_lp>uK(b_-%JYZ42o~8tFpEsBm6)XzAMM?@l+OKRe(2;?KbEKDa+xac5#5?~-TCUx(`-iDtKcbT54n zmB(eV6uHTgLBjX9_c_yn@H!cq)|^>6uTgNkr%Mz=mFxaZYQMx_oY^ax!R zG_+*X#=4A*>$6y6INR=KU)P+HLW^%)(n-MW7{p-EHHyS7l?{(cmkX?rRo-6W>aUGF z`M8+!6Kf_XLFr6};B(am2Ef2gAX6Cv^B)TUvd#0Xz?lH*W@oU#KI|J=8m2~fK6{R0d}%E zky>T?WU2nv6>WGPM5UpK04D7M^f7ymi00uREwo@EtJj%GA1&1vFTR+K^in6#+6vds zYJ=A`-X`|nRveJ3M;HMo?c8mLK+xoasoUYN<1d>W<8%h@Y-D~5e{Mv-_HfNmE}{H? zf94;-&8t>b()HSIk^km4o|;M}n?N#Z_!+H^(ZPmTAJyi#tzD;1B^hDz&g8X(VqK+1 zk$h`e9p+U9O}qa2BM*g#;cDH@yJ2rjaM}wQGLl!diUf2-jP{qB&obCEr3EoUuPjpATV&$0YkP~pN!>P&{1 zP#;Aqh_UHi*f0lz+Mx|Uv2f|D%%)NnDi6o1&X?Jfg9FF#!VKK}DY+6*nDiZzTB0w2$M^3ioL zWMQWm_eZHL2T4jMIlD)f{Xu`wGWyFI^}27X^~c=$05rYKL2+G!pj{3mtej~He;9h5`p(0BgGSwUW|-Ss8@k=zH(}O9l%>T{T(Yy z&>;W|s(ZtWMP-|=>kD(6y;oru`E$O;9~@G!^zqh+4B@p{Z5ns5iXbW1pc`=$5;6d(lAJv z?==~6ru*$FLcLmF{@1Txvp{u%rc%1fhge!vF!;XA-^*p@)Zpk3H?>3f&dt(- zA}y`k>LB6vTO<*@s9%Ele9+OTauu7NLAQ9hg6L2b zhq^4OkPYK`{zLpNDx%lQKcW$E3Y?Einx{9NF$*)ZRi*p2b+GMA{C zt|~4u{@<4oTQpbnm4?lC>ZATnOrcJRP&6G|jWMaQnh{;K;hb`!O*q;kwC@&8S@*c6 zFude#QQ}ZMuI=^cTsxa-+TH8(%n`!z~xsTJ~;rI2hu3^y?-s1d%r3k0gx(0mtFui)}*d^{(kdXw8 zYKk-xxCJJXNH){JY#R3_y089ujw0X>GU}Zkgl!;d+uDw=M<<1uHw?-viPQRHbzewF zFX4cie_?$dpB|4@(jy2H=xeU7BVp!4U)T6#T5?X6S-2!My!a(n8Hv_aVTj73OXkI? zN&{1&XpV-6lgn}jlPSpehGP9#lFAeX5e%B9$ST0{Xj(qeY%OQ0x8H2%`uA)h$+gfI z%pGNY|ESIVjDa}o;HHl1@v~qIK}Yfbsi7U-IMnLIo&+e)8WsJEESZgl#U!cu#2tc3 zkTckUeCqhT%noIZk})8nh?c!<)?)c5Cg){znpz)dM4MtiBhdxnKq|p)I&`4AtL%>M z(8=FO-10KocD6uOtIh8?S?yFy+p@nbslj5HEuEjk?8lJ0Jt(JazFf9&#=JmLSUB00 zbuERHeSB-=)7#?&oHma!g*@SqZ=h5?4*1`%(u{{RQ{zW=ElJ?Vt)T`72Kb;Dwi%cP ztGV!tFk1-jhZKWR6{g73uHid!@F!&8J7KGe%4B4jgc3+CK0hk+v8Nv1%k5qum_>wJ zRbB<~#q_ni=E6s4gxZ)|rVRRLDi`K|Xbc&e$RI7i0NTymLy>X0}TO_sGhjco%-&^p1^~}?+UdMkDkfT}? zFVpL9z5Ny&#AbBKZ>2I5MM5Qw{#L@9ntpa2$6h zS!$VZ+%d4N{pl9z^BMB>B(`>Xgpk~v-0&#__Fs{t_x+f90<3c!_#n% zktWfNd;6N{Iy@&MR^*7;u?neIBYznei(6s5?Zgl6Pum4Ded!>V+c9A>;M{&ayoLLP zUNA*zE%}wiG9c(KvCSQ#@S$BLJ&c(I%&Mj5E8UFRDH#W8ijD4Xd==B3@Xj`w<~XSC zQ*BL6?7s$Vg>1edJiE0H?naBLo-dRE*baLWg70L^kGOH3Odcz-9$sEEz@ZN#D>n_4 z1__#u<3DE3{}b~Fjezks=@rz2N16|1JSbXm?yr{i$VnC-=}Hes=IN zzqm!N?gId+lOX#w8xTkx@gGqE_-nXW7vAuqNK+@|&7_vIn1vHI866yqrT$Y-1$}=x zm2h*{Z)^ITFagcO=?9yHx0q4<%5>;93~c-O`Me{+JJ#Y^ufe8G*1o$?p=1d2a0h-b zF}LL}G|a+?eRI8gOVh4;%qYhxxTg{llp~P$`uHj8_N|anHMTA1kEEOH*^io7WSZF` zZps}atlUITuMi5zmo)B(5{m&2AT(c7JRBF*_IX9r9IFP|?w)`t-T<<7Z$cJW734;e zM@&t@&K%4}KJrivjvbJIj$@c#u=VshmA1n>J4#rLLi6`FUpG*oI`50z8KXhy^wz;Q_|80KyRmY+Ayw3jrl5C+2 z;I1d)a<@R|EM;4ljgp|~vg&NN4_R0*ehy-JB8m6^bPNA;6o0a`t2pbzJ0;i8Q{=ff zCCG=1_Oo>KBpCiLb~(9TbgJ$au@qL}KJhz=ZX2GCLxsfUrgl7;!42zG8q#bpvP`R{ zGI?E`(Xo0)QNsAKYzgM(l`FJ=S_pNf-RJD9|S5FI`}mzA^n*q zzOg6Pf#kDeV)wNnRV2QREn8J6-_K=h$r-vd)SbFGLwQ8<3`*x(4zm^RuTadGSBJ=S zd5RmXtGKJ~lj$US-JkP#wiHw=?=JP%?!>aO2Y-B^vUC&={COM*e>ilsj?klIbA+KF z#Gxrf`FsCLAMP3d=YVQH`XRN}8B3;EW`_`Yonm@;%EwF2gGa>5bOnQ<5vfs4`&@PX zL`05cpr?_Yjg3r3-G=PuY&8RuUb}#;(-44lvYLOoJ;mexC~n5ZTZ}Tc-@AbPQ_7&# zk=(=6Q@Jl3L!8+Z7F@Sfx$po5evA&VZkam2KDjtLIiX1de)UjJ7|0stEN(5h;W!rd z^XsYN6COg`BxkGR&*76Z-^o&!ad%s`88bWAl_hsn?h($lh^)X=s>?@0U3BY(J$nZd z!|IBLafUhP&6Ok@3>EyuKC8%X&S-M;syT}q@7lx_pSPs(C=^}MAEt13_13be&ueDe z`Smi_>^g|!?cE5UMA+r@HZ6yg*5yZk&X_F({Q7MkZ7co5W!JOEZ352CW2fzQ{Ibn` zwQQ=2oa=vlkZ*1HB@k|BmYspi3zJ(*@t+sQ|HK;in4kADEc8>AKYkfQ=Px%Ay#Cn9 zNpJk-_y&s7h2PorfJ$d4^LCa;)(~%NycP3V-3<)PcD9-~P_+|c%vLK9rS}YA#}@?3l3%0Tg{T$B8DX~%j;E3pn<0UCJ$1sQ+*LjkkR#ogmOIG zxfa3GB}HWEArgM?{9F;(gho#%0ic~j^3-f@Cy5B%@Nke2Kyhu;4>$z$$cDi}s`Kq_ zQ2;bl02m>^sHBS#jgul@k|*}8KZ6!m?p3+t;JJ4gd!F&}F=Z&T`SW8ha#PnsYJO7L zLVlExk5HDP=*5E+n&t7j!LBr@ON>5QmVX!Ul9Nub%yxM0@RIxs&caKfFUCd0Q~uFZ zX}Nb$>)d}$1^E9``p0r4J^0{go;^(#7_^za2>3gkLRd`3#XR7#_B;YoY2bR!lansm zBdu7v11Y2TwJ7fhb9d|aLyb(%H-tnf-Q+y6fJbGeOv@E%uI!*peD(7m^mF9<{ZuCs84{9~x$*O^ggC{8R@0h+{$EdTu%S)BMZvY6m%#-&1dS zzQONe#UFtyu9Hi~1L$sx>uJ{NN~lHs{53w3SML}8`>!0PEW0!yA?lE%Nk#*U`PAA5 z<1y{Md)AfWXtu95JNIkAAcq<5gPFzW9-1xaE7uCo@++-Bs$}FR7@WW6NZ$DOiRb%< zsHiac5%tNK_hVU0)`B16D(?mD3-+L{o?wgK8$oV{{B){rheO9Q-C~YiM&;D|3GPz( zO1_pD<(h-28M;6OuBxhkET1-CFzAWZu-mf&@OmsXp*pH~YW_rWYw4bkavPGblSfPo4!c4*WGkjag4=SK(Ket%Odw= zgE92(a-OT*cxyESA=W(kFE$2zs3qwC8`pp*D5C#)u*uWQ2~<&JsZuH^@N>U!ua8lI zWOYXK;awBIv(In!V1!bJkgun*)@%h=5YM1mhSOH7QXazIX^oWXsY288xgoyMcJ|wz z0MY-))?0;T6?SX5(k5;MSAQZRAvwcEd(|>S zgW-1@ZC9GOj!xIqii$3ameRB1a-`e+QKY~Gi%^r0;TS<5*moR}7$#Xy*3+A}&Yy=X z88z^k4D&cd)|*c29N;Qxjq*uhvBa#Q5>=KZlQYrLtNj*PBus_up<(kl4=m1MWBPA5 zf9Y3HRKm#6Y%IRtj9%Ru$s}mFRNY_f`dKlWw{<0+K_zl0Q~h^Z|9^ep+oa&u1qR!< z%gKU|-|s$!Ja(xz4an6#IA3?WOTiiEF3k(V_uTFTIqUDK&rLVqcJ~=7_*14vypl+{ zVPZX=W{3gXzg)vj^oj`GVi}d6BGN6-4d#WRD9Wc9iWrvV>F1+uUIQwd5IHPrjNZnd z>kHVS@I(oI*@Tq@a2LTIJzg@3!(of)JVl0fyaXHoaN@Wp?iyXr-(=W5}Qw<(u z@(5R+vN2X1s7dxwHHx{Lg5j;7SN`1CNbP=d6j?N6?Tr!o#qkDgcAnSb@?APZ%nKw) zuu#Ha5lw>C9N@i&gox8d?-y_S187kYoEv_XC@4(a`iV)gAkU)AO5{wW!l6q$razwi zdZxi;BQ+%Z{{7{%Zu2)*a+92}nU5<7f6$oaq*LG;rBt;*tt&mI#qpnNT(&;|JC=vn z`J{EWW20@re>PY&=%~5OUu88%@bEb#a_(1Ms7IN1r`F4W8JIDq&D(EkfPmYwPK%9bYN|1J>;QrLm)glKl4 zfgJ2XA5^abC*m;P3Z&UpYv8XnkXFK|8i!5bU#KpmoV9eCA*zMSzbK)a7^V$pX9T*d z1WPYj@trR-QL2Tw@mB&vy=gOr-8Ib7hs%+PETRG(mlxeGwiiO9X`J+%=5dhzm0y0k z8MR7O+v9qyJc0!sjxIZA{f652)RKQTv(3uC*e6onXs!7m zTJMx6v{?Xc?~P3t5bD8|XEV}k=KnK8yei_unyD|JBht$x+QUA3f-oyGhH^8q>C7CQt?M!ir_EY84HKd13% zJ*CUHAtl}R@9|DKL5QF0?Q_J4va~<5d2P)Ums%9cOj9{e`8E)zDxfLs%uL7m#{Yj^ zWD-r3M;f#=8@xEc&FYxe}Uh>37lD?j1h{y(;PW*J>#-v8W z4{O1NhA1WIl&+w!Tbp*d&L6O`|-ZD8k8tY!~eI2_TRjAGsAS4BPR57Q{p2YxA^S)BhZ9?wJ+n}^ZzYOC;$8)c11xA67p^Cy zO#LWyg-NX_?40TP41ha2_C}FFg^PuBm+yqz)!knHDSeNytK&#wy53VGyPQD%`fIT- zebj&kwm3=~57jJ<1#fZ~H1+0tlwZT`=?`xVN<*XdsX#JoRX9I~r^PHU zP=RFB>cpe8xDXfdU<3#cTIC)7H!1Uw>dg%4Wd}9lJiHIjAqaBVUhmfkWj_w}S~O&>0q&)mCeU1yqdev};Zc^$WksJL;*W_r-B2V+3#5Ss-+ISiggwrz z4Uc>;xQY4$d$$6tx>OQBpLw=*`H!d--XP7 zgMlN7xV(;7?g6HqCX@O?LPQ%~;{418B-95KE*FD}N{7K@6|KHrZ?7REjuz)v7%x9x zBI@3to$Ak$isgr=WyQ;3T4$Xfh@@(T`rts8=?VLjt|wL-gLnEP=yyZonTmJt*gMv> zBpL@6*7fb$xN$73QkP(=t&Srz1-!pfL<7LGK1H#HIagUv3S`wHIhn8A9$^xLVh&oM zZkCpqtgl}O95J~(hii6o_*2}? znSLsh_1Il0Cv>|qlEQYynn)1Jn7HDr=kDnl2sS^`$2@Qk+L^;sjn#YfLZ5s zCc%r;7OR0Zh*{i1mfxCqVIc^)G_I@TtIi`Vio7q8(7wT?@3X>sGR+C-GE7aBiU!v9 z!|D@)YyQ&_`e?7=t3fMMF))BZ_dY}8je7`^9%b+@o>@$Gkk#jsqTrIK)O^q)cI0LG z1(Q8GlP1JZrG*_meb>;1OvA&I^oo0RqnD<_k>;5`_{~)JD}mshQbK3ZpiaI34sL9=FoOOVtNH7y7f@WzZdieP zy41DN>qJGx6MJ`8Do-5O^>1=yAm7~pjYs3bg}C6!GxCzWdpwh6t%z$0_L z3yf5TnvoX5N(BF$eqqlXu5u$bWa>i}rrq1jUdgMh(8^266!16CNveA%dH!xL?0e;3 z!qmG+n9y1;BLwES&%;+cEdFmL%4E>S;>t9^o1PG&nl0$MS&5N{D80UJLJ>ZNDz#GhCpv|p?wvVVnaE$@o``%gO$^~V5$;na5hYjOW#cK z+}S~Zz#3N)oap1K@0XkRag|)(jn2a8u@vXzd9q^iaNn44LRzEz-Yk~VSprJ4K!j&R zCCm^sCD& z;Ghi@T60jZl~Y=*u89YCJ6*{{Up`khxPi6L3+gAX8C3GZ%gy(N;;Nu zrV@TC6T2J>X0m>QRm}Q_RJ2N1@Dn_C!NPhQss<%(k?KdxsCCg{}MzzIDVuS2}RAwK-N|3r@s-N{)D7IAs*7^1*fX?WuBku2Nk( zC$!G{>#Cb>y*CWALm zeY?nX`S+RXw}S+x(6TYM3(!Pf0O+UR9g<>%ql;K{*+2Y;AEe0cfV5rUQiT$Gqdg*vS>aytO{O0zsH|A@pHOuN35`l#x=s zfG@o~RYlRf`qDLWJ}UM9`+=@Pg}n+#Y)5jH5l{KEp*r%sP5i5fu$UB`zULyBo)XAo zh$Fwp__UUrEq#UBTHMTCR-lE~q-<_``?t+nvq>0-q5)RYw@!j&l*>KSboI`f5bpH_QY#U2MW~f&Ny+%>!r|LVU z6kzj%rf(QklXn{k{Q9EZ&Q?^dq~3XfLa0Bs+W+h;FQ0hbPPMIpRy=@>iJ4*BYXrhW ziR|QqhwLb5Zmh0VoeUTkc2Z%(faHhs+n*mIw!p0ofGG9~LtD!fJK&bh#g=KZ&kF$m z)`9fX84wl!;#?96g#f5FEi687ZdYwi@i6NrkWRvNGEKaNoNO(8baZu%PM|^usPC{P zRa0{m@~%P{ETSw(=BUs1h6}L4X2V&s2Eo$D;@}#Tt`jQWG%%DJ5BjazH0Li0zRt*6 z+UtX1$tuYhko-xr2Rr9?_!xsSt8Kojsf&xmyZG!VAF{c=R#g22>{6ZQ4=X^FI}&{P+e+LzFN`ZrF{2NhVwh!UcOh7)KlxgTIR zVdS68-`%h!e_tx(Ki%j-M1MSri3Ygw&VjUIgB3`dBefsD+%f;E(i_|^l;#brN4B5z z5dq7%|NQ!lyh!Zs&I|=F8M!D=`;oOg$<@AY_vR^!lAaz z7k)xO{l4$dGoXR>V2ufw*=9v!OyUXQ6?WggvD<25G{a&csza8i88^uykrw9!%4r{~ z-MNYO?MV0qE}WhQ-UPnjMhWVX+3&1q(ezVBs?ha}l{%?P`n1|fk;Nf_-wown(1pVet`RskQJ)i-Qci!C?H~#+nA!3AuO`x4ax;q10!VM+jQzW#j zcW=8*|9P>8$w9tW?#%T0!`$3n#Y-|ZUcbwF#wh0_HoM2+l4oSp{S;5Pw=K}8wy2%E zJC6q+B6gN{qMHuLNxG2kt}=O-4~_@Vu$B1#M$G@6FobEsdbD@V+z)k$aHeST(2R_; z`Ju_h6-F&gorvEK@BS@3^!9VuGSgld*`U1ya`{s|mK-Me zyYGpK{HM^Y)$VF`;q7W9>I`C9?u(XJqdBB};#=fJqg+}b8waj5@3UPo0fgJ7Yn;5X z1uCz*2Lk8=MwC!M3woJ@$Ehq#zf^_vc%cfP({||(4Zvp#`~-nH8vp@=hM`E=szE}Y z8Xx$hTlnq$HQ9%lH(_y^e%JSk@6GEz@U{B`R*uQMh@v!UaAZ%UX-_Ur@uL(0q*l5Zrqh>E=I+s zKg~#B%jwQpAEreWWi#p;h=?L`f6noRZ?t}Xp{^NEaUbJTq?!<9nEoqO24`eLQ2TG(h-x1`4epzyUC0&IOiNk2}lQ7HtWHtFkoU zIlue^{ED1PeckE}ad~}obTV@=lLcNqQvY5(TtxGigo(s2y_6WNzH5TL+$~X5sIU;= z_OicfU9M)~taix9656^!fiIzPZ|&Zq84B0?RG4eRNyXLvL}o@3m@O7`lFc^Cl*li) zsPn;5|4dr{*_izI$NArH$soay54-~)J0M52j~{yY&eG}-F>y1MNN#wzI@V75oUbi% z55ML(q4PyFI8s!`S{OYE^v*BQ*`30K2g!`3%myY-|My`K@)Un8i2O2PH0C2YC5 z(7E~8t0JuIu1R%U{{!zMYAdzk?Jp^3^Z5RRSt@cTjjG=N zJDmBd_YU2kDa%xyay!M-O+$NKBjIM|+oM+tG{;8%{}hi=s$pM^kDdIOE=CUSA+Gs6 z<9+Pc$h#LEj*#WwDjX~r0NKNehM55i^70ot#RbXhc=KltGmDBR{-O(HC~g?gVX0}< zC+m2U?RpYj3c3Mp2`oNEve|N=h$aM1J5#hTseHbZO*A~RR+o=0tg!kgaHPY_gxp`kYX>DgKOry0d^J@jtJ(7VA{f(SmAN(n)6~ z*TG8&@qR(qTeBa8)?Y}X5?s_4xz0A1%LPE!=1Hcrx`dL%>0YB(W5lSi3Nk4H)!piF zXcH`VX3|H}o%~=}Ezv!vTsc~kp?to^lyEDfZboAa4~M+A7TN84tR7j+(T(4e z?UCf~*_k4sR6@%A$~I~g{b?@Z0cbs?L)crqTeIx`HDv@(FvGJ!wrfE=J&Dxf5LEn} zk;BJ-b^-EyVblj7BS8ybA-QC-{E|bp!Ed-*DsB)JLgiefbo2&(xZ}Umi~Y4dT0UNL}0|5Mhze1oK7x&4~wS8h@XV-|DMgw zd*Al%1+il5FrmV_L;7@gmc*7UTJ3AxAZTS=2~nPLrcP0dy}i zD)>sWhwB=Z@G%<^uPE=xz}A=rs@e*7Iho;+z43~Ta_O|R@anV?s|{NtG)Os*p^;r| zE2cydNZ!BeiBC1U$WG2-w69qkSllEw8oe(mY$unWnXk4weCb3N^|?h5*c2%Gsc!ve zo~i8U{tuap!?>`EzYk>_F9~u!Vaa^w@WB}Vo3)c3@N$DC2Y(k{KT4gYzwYu$>`*cy z+k{a*dKj8IErvGO#>`+4 zmGbIaZ7l{Zjl*&AM;*xVByquko&DsHv#bu z{r*_)iM2m8Nu9=1(*IONAe=e8CjB)u`cKx2fDFeYGkD{0Vb5Wdi>Tr;IQf@Cb4M3E zWi~f5`N%FRbAQSc`tm_G9Ex=K$uG8bob;InV$I$e zRe2-#QAbbS*6Q}^H&vPzkNtPQq`gr*xyvh7-js7JTH4dMbh=64PmBmULXSGR8Wb5- z1oerZC;rcyEFetu?}$A1ipyox^k1Nx$hDwpHbs<%HL)WC$4|HG24~N8SVaA~2~>HcF6ogOKmB{JUAgq4;fss; zjRG6@ReLIew@kO~kZR#Nhb685nQaxVsJ`B478B*0IuG~qvNrx*Y#1T)reD#Q_77D{tkXdmDjgDduJLjP zxP1pVHqS0@LG_0fl@`=M!bneWCN3 zO4@7~)KFkdTqN&CUe$>|vg&ShOrlq4oMZEZ02!9cdjc#X1kqA?-Ba;T@F{_7Q06_s z_xCHJT~2c}ZQ@UAR)IcGTW5M=x|hIm*FX0Cu6{4rHTcfctvGHGJYawL!jn`+6w`1wRW8<3=1;jXeCd?o z{EWG19gR1WgM?pZ+|C7E@qT?rDe4w-Y_VM=+nP%w{=!2P1X2L?*sb0q?NibvS?-P$ z+$P6=<7U>8n#Y?ffu<@iJYVlfU%5XTh(%T#uE}AKWve}r7&~8gc@7uq$q}AG(HT%u ze<^ayDOSjg;YMA%V$dsQ`%mds*c))GX24yxsI)d?{-#`@&d+tzuFV?ehn@~=ofV+@i*TlQ7 z#c9tkK7pBNd>boK=4c&Xoi-2#JnuUKruWX$Hu9&%VIOLWqzJ$Z`2Fz!Z3pWOl6kqg7qNgR?+ zE43;&Vua6p9qQPl2Bjp_29Y*MqdSx`zjyrL($u&40(*hSP>&lMn!6MeJ{cMemcDwN zMXVxL_Mqv=(&kJ7H8>y==P>RKK3wKquE2@>A#h-Nnx9C>4HiILvx#%3q(fqqgp#sd zEMwfD?DSKDgaUHAIEuh^EbbX~;jPY`z<5A(4oI-)Ye!$2zfLJ>eBWfL_jmjP@NAd! z&6t_hd*1qJ&b2Jf9U-efNCTp?*im7BAu|5wq+9?8o<38Qrv~LTvl(mzxzE8pjcQ}2>ITngifrAkkE@kIggHJulTb1nqMvS`6v-|`>gKfQ$%5>%I!~y z)@-&Pk9R{@R?n`N)EojK>)XxnF%Fk=ukuApc=OV=@QI=M-HAB~@-Yz!A?G(C>QpJs zOx8xi*dH8q-RTh#K0S;eqJh%0W;V{J+#hpS)?T+KCG_i-R{fjAdScycLMIwvsDF0u zAiUVRp*q(%G~9D@k)M7w?5K#|S)PQRD#Hp1NInz$8_uibe$@H~9$I}99uAcWc(=IV z=;gUZDiY%^InggxYh^C->v=fq;l172I?9WvQoubNYZScw22IYyius=l&JT&d4w9cJ z)VjGZh7b0AuLWEKeC*c`Rzru2N#b=u@`?)~HwgvwWwiBYwF&Y8f-(*O%IC8a z&iGk9$l#k8t&2*h!)ucH}W^}Rt;y7Pm9-KoIN~o1f<=3AD8a+lLG8nW~ zB>R2+d;9UWk2O-1ywS-ydzI?j!fb}wET@zxaZ&3ve^KdAYdk_OT0Y+5bBF4>ob`?r zlh|_6-XIHpJ4U=jy^*(|SP2?VdG*IQ8jb~VDObmzDhCXTxbADT!=aEy_d$;dPnRMUa?iSJO z7`YX|CpGyYqVZq&%zHoLpV3(R`>Do|DNSB_p*$#1j|{kI<*w*dV^nueeM3ymEUp9j_K( z&NCY(#M7eRcz(JrWQoJn8qXNu7QM97xia!PdDT4ymEWC|ovW+eBWg_u(Calig$d_ruRwn9C?hKXX~$H_&HWqS>5GBXyi#a8lLU_vUK?vRIIM&w|#a& zjYy<=uwRqFthXqvzQg-|ZN6D&S}Joiqf0DKuMYhg)Odq+X~2`)Ht!(gUTuivR1Mr~ zf||T!mK2FtWagjR?e^&G#-HtUXNP%z4X+G_PA%dqm?6U#M!KK>-8HT<{S7bEa46kX zAlVXF`tE1CI-*`;vb($S`U?K^`sbdo!Q_KzG=rVmpDXmqFwJ$ARQ<=OQ+ zv1#XS)-097v6dy+T;TT`Q0~Bp?Np6R%!cGTg+!d3d!&Z_YC4t8pUUTUilfhy?c0L; z-OPV(gH_5K(A0@#$@knr%{~J@SAiJ9#O=^FoETR!D*Wi3=*+P=hL*=%9Q+U5cAQk& zzTMY!Qa6x7I!&FJHNjr)awdlI60yVAgzR-~pO5!!fn|KKOC;rX9y_9S-Rf4>;q^+e zFIjw=)ExjP3Mk#jKH%<1`$yx}dXF!?@lZR}WybPE2v-gsOSn8?Q?0(=9;wrPDaYvU z0oTD=0wStO=BBlOtlk;DBZrrl)8W~}y~P(%h^esOkLT&%7xY6BaRUXhes9yg1i_9c zKz1|&G+}u^0sw$L^>KO3G0CM6&U|dbfJ0n6nZZfFOux~DCNygP-C6wz8~3DfDO2Mh zZO*SyD*78>N$-&T`w`GN02LM34oYMD3;+|h1n&U`_oWT|c9WTd`Fy1g`x4cpLWXSW zKI8n=k;n6=;^9m{J7O>452;_hk!Pp4nporgr}_2+SLnwm;wh$ikhW?$o3GzKhWXi8 zs3{Y;VsmvqL-N?r8W`m5>vM$bZ8z%m9`0U%3&VVfklBZp4#xRO88LCO!XkIvlS4Pl zKxkX3didvC(!eiTvjRLa={o+#cbbfO`ghhLWt;W&|9c&kU;qaQgvChs9E)exlD|}E zojk?oNxG(}KT42VStX&3J2MuGbb?lHHZfz2+QbE^n0F*JPJc!m)y5!MX)IFp3Jx-k zHR6kEUBH0Y_&dxHzcA!5uMJM;ZE9R!Ugw*R4PB*?oGhGk%Hk6jjn3MDH#hQ|EWr4}WP+xo>%0^+T|KqXF+*AlDwOdI|o_5!ms^qc@$9RN3? z+r8is^0~RY;EF|@53|X)2S-_%D*5GXHXbP{+O5)wvehf5CyQ)IzZa$pSgQZZ3~ zeZMj-Pm zxQ!KoOh~qu(&0aO4|f3V}I;dpb{Pv&UpQ7o1wWk?6I zy)@aaJ~}(S^}MvNlXXu?FKrHNKDW==W$Li*&9s>jaciM`0BML3?|hO{3B`ciT;fKn zS*cZz8Y^`gQu2FA7;!o~X^>j@=4argGU$mKgG_wgaBl5E5jyy{_YsCfB2fQZxoFR9 zI;yccNLHS97DP%@WRQodMTOq%+2%rEd@paq42LY?4g7cpDLxbP* z+RX4aG23=;EVU#SOl?(03;Ejc+s9>?n^-%dl>phf^F2(l&0=+yMkL!DL@N@-Cg2H; z>!QmqdoLiY%i?h)V>If@Y7SzHo6O*_5(7x^d*;A1spKe%6}fU6TN{kZv;!dODLL&z zfqg(NVy_kbwQxOKX@n&E3-k|0&B2oq?n~%Xp>F`yVnVjY zrY%_A)_!{$k$3bPdoe^4hI%Sg$nD8nilvm?9KVA@-Y$w*qNu>-J8kJvpHR z5pB#HM6*dH1!!+zG_5PFbr0jZGZ^hd6u=OE0#OYEaHY3`ZF$Hz1&Dm|_0v`!dx@Qq zhCbb3KsunrO>+(ZZu#8vUHnsl+w0>MZA+`wVF%`!#KQG-p>(jY%0IKR;&v7ep9>8V zk%0C=#(HnV)Nf%i z(?RUnt^AmrN>kq0^p`N_F8H#lQ(aB@P^2>~DErto9xST+dQJ8-a*TF)On!^a!WmS) z^W7Mi^6@e)C-qd~Jtc#|@UGpJXjcHtKH& z7P#%zBVb+XUsq#&6bK1!F_I!aocKnA$VNKzm0A`fw>WjNBZ=wNbhKV8GQ-94RQ~$v zO>*FxN9Cy?pZow1?;;|5=lMk|8Zs0~eKP&xcVFz2l*CRKjZig}^xjpvg=@UWT zSNIT3nw`+WnIf4=%CzIfsWd8HyBwh(<*xY3*!F_kyI+f{E*6S1x@>}NspZFE9cIKN zNQ?#ekEbi8!u)1L$xsNut!I;9up#8~Lgz$~=C_W<*ij^+<0bA+ z9zA`?n-3Q6B9ZKW&M~XP^=rmzx%XQ{X=ms_(wPl}eg1&T=J?g{j37n(6Neu4>!yL9 z|NG$V#)q5v6u+-e^yk^AP8rLbxtx;DW|@@W@k;Us-Qa_4k3sA6BgIYMj^WfhLJOj9 z6z}Sss6>U2$BY!uo^dKhb*3s&3rFw~HSkXYAJwYj8|`ocyE8oCDty6mr7WdFSPZIS zwxQPPTmZ*-UYrsI>IyY9X|)G;rk%cu1^sBIIST$W#C@?`s^%u8!m3Q8{ctbP0$6%{ zgFdd^GUgF7=9MZy2HpPe=_O@My~L(kCoeHjTKtd&~2E|b6Xqq_2+v9D@y4N zHa%X!$yRpzAuO$Fv zx4kP~N@60`MIudh(_J8%O_m`N1nhsOywHgu~xXA zvFIvKSj8GpHZxEU2OQo7)-8y_2bt^@$tJoCV&nOXo1O#fx*;fs@+f@nmm`z>C8qg;5v3vqYA4cX%ic00FE4x z1y*Ky7WYHGfXzY!5QuDWXm|lUyGdb^oL&}~_ooA5V26**sM`>hNRV%m!R=tk=lje7 zT*hLEk@kq zcA_E?3TC6Pp0sPAK4d(4M_NC`uo}4zE8*@$`)6vioVJ)LN!X1TmbdM@pbK6qu}6aZ2LKb0%1ab;seuypBPh9 zY5_sy!}mY;a}-;d8BR1eglUJ;Jrc~vk&0mgkhbc_Xrg2_=F17Jz}JuwKXGp2_s{|k1Ah}UJ6t>a$qR9x#~+MD z?mEAKJ+*dl%P?`8TGcbomXMy1JqW3E) z7)nuTfjmNiEZYWinoyyFVugoPi^Gu2u#79YJ$t@8$?||s780$Tc?hpOiyMSsBarbX z@nh7k{Q=m{2i5(9zQPQs;EY1iPHFgy??Cc?J}MGLgj7YQP;_*5-yKF(st&rQ8MdO4 z#sf4W*w-o~X7FU?8C^dh5iymF#X```j7#aou!#5f_9Rule96doR7rz8!VFFOjZ7gy zqZPP@K&iNtBk28DFPBW0rHx>&*YGpxJl>8rea#h+UpAB%Hz{Ngu0H-4hy7<(r`8XQ zLO`R|V82Si4$D*lA7BkehE0h#m)V27ZX)T~&VoEbFRueE()R0o8<;2(qPLK&ST_hl z|KwjUDhErf6G5Nitc`&~4t1Pu)pDi`PNIr4)U-NI*mf_mxk`uRvpY@sHUy>mQWX%4 z<;6bfHB$6>G!^vQ#F7Kn^I-V%J<;(^|Hek7&M|3a-qDy8yd8`=1Ff)bAE z38h^|`=Mw0ayz_IK~)=ykxfJetICF920lmoTav3WIVEuN%|QRUWaMd`y6x(cm$2JK zZ%DcIYV3mB!2hodLNh_ph=Qo=$(Hl&Y+qtW8vL}cv}N{`IMfxUV@c(jB({SvRX{~h#ry?-@&inrz*3N1 zKacYpSaz3NY|SbgCIxni{o9?lRtsbuHM4wj5KZ8isISGeH zgx|*lZ$7s6MGx$SiZWxfqV5s2Ke>-<5!i@hVS(3Y2+^!+?8I(H<%LE9wvWs=XwSP1 zbs^@uskAa&`eVQ6>+DJPwcxFem+L-7Tj=(F0?7SP#2YBb3nAZu`5@tXHR~LE<^*nf2DNXTFUPtN@f{sXu7f`nA#&D2(}z_zu2IpPO-q7+DckhC>&^6 zdW-#NCcZscM!4?!p4~BNNV+)`qtJRwU-z@I&A{wtc}<8^$9znIt2i>jt`!Y~Iu$~P z!n|yF`DUZEspUeSw)zW!oSCV-qBAB5f65!nAMMSZJ@caJdkkubvD%CdQXPsi1uQuE zT4mWT`}6|TRqi+j^+wX07G8)7x`ntZG<}FTh5z~c2W%?bp5yN5tQl_`*2+^W$0vg2 zq)O1;ll|C4b*otwNmb7Nw`5RTF8@+0W%|UxS}DE8RtaX}Mae&lUo6SsH~!JFO`k{ z)YL<>n3$NX;cy|i>&io;?f&pGVAt-0NP_bIu<5VcTXGqGSe(ZG=%mu=?-R9zG0P)qi!a`;H)9~bTJaWw^n6+;hip}o8P@0kF#h}{$j5OLv+BpT6d%S|{q*+LLWlR$0%0vsNd0YP&em^s)k0FkI&*q7s z72;-P{BirgM!bM-=m1+>HS{EfB-qjQ9_RucQDA|Z&jgFdqvZ0Iy1AY%0`F$ z*!A_eg_Ukj~@TN+Cg39;pA*; zZ!)vPMV2%#dr5IL%;cYAg$uCnPzF#?e zJ_HY2CYgz}Yp$u8a{AJh>*n9*FJGT@k>N`NsZ&2xWZtm%N9TO!cP;eMLh5|L#WU@j zjBIuA>~_^pD_ZhLa2VqqFOHHv+m6L0Rurtog^X(ZbV;4r5;Vy<*IqQPh1nzuV;?7h zj;J50Wld(Q#-s7HjG{>Q6zb?uJ@+Tb?kkSB;Eh!kp1ezQX{1lYt>4v8)SAUu&)VK2 z3UBz2`(u9n2J6NjFdq8qQ6k0B;_DkjIl6DVG!))KVr_!2$s%o`%h`p!H<@85Y#Vpx zDBt8nR$FQ_5!N(Oky?xku@VnF+aSuXU_{X=Hs(LF{~k;wPp}`|-o0>mzZojsOLp9r zB}^~i29~qj9)u@GNz^*$Q+k=IeKB>*Av6-o!Mn{I4WHCJEuOeJDNzj|NN;ci zPPZ4rJFe~@7ia-K=Wed;ZruBafJN@fr_u5utA*$};$T@I zPj9|}Jai)B+7tI3S|BN{QDuPi$8ymyL1T7Yl{7qfuCPA{I0BZtmN2Pr0az#sj(JQhFm`5vMqR~Saa*DEZ|^v3))Qf3LsD4faDh8J50 z^n{+H9yC`0uS+#X!n*BljMQ?*o0U4hJUG|V$dbA5gHEyLv1UB-VBsJFG)sdcgv5(6 zts_{nzO%%^8(Y7%I{)_fxIx%uqmc|;f@xGP-jWt79qi4MD|0AdmT~{AzKUJy06&%^ z*si@Nj{+w88B%oyP@VT*4Jb8UL6Kq_aU@VHSEC!*{&)@ZAYl-{LOV_*Su?hm9#qE&NTB)~!YUj()o!rCo9|MrFG5uwp9HCW433v0>) zQY_<3f}&UFgtV4t$G5w`QN8>Rgg#n2y@~OER(L5a6P=SiU@RX=&*VM0lS0+KJmp;L z>&smEwV>2B=*C+eWlzO-uG)C1lw*4iumem!egA}y?*$ple(J{{Q(8-d6iHH@nZIj$ zLjT(x4hw~SWsMZ~a|90$LR}v~EK58=QCJu3Pf~vFz1iY^EnrQN;lnC(yvVx<=8_r=a7!H@(IDBv~}o zmuUnEoE7h5x`0bKr)_AdQJ*mknS2~LF{^N&W!|mNMeSB^D}Pv|1Tdkm_kK5Jq^1b@ zJ&6`#*`u|)q&zAaRUAmPeLq2EHe#t{cQr2i8*kr*j1Mu0%UsRKNIWZELIhhabjlqJ z#4}15VYW~umRArEhgP$SKHn)5o9?)MexzeF?cWX`Yx?C!xWn4f z;cF#UgEi;0L{Od9?j`0>{-lhmL}Jh9L8Y}iK+x6fEktSQOv(dc<+U7BsL$zU-MuhZ zCu*)__+=FaRWI5<)?&U)F17A9AU@k4x^yP+Ylq(^tqB13webFqZn~sKn1|Mfi9A$35)2kn;3W)9Fxem~1@>D`cKRA8*G0XXuEN8RR>9^* zn+Z16Py%Le@DJA+m!!I9b~}JTHf}{V?P!-r&#H1c@>B!EnCq<(uhBdMT(|sp((`|{fS~E1&*e8-3`GrBz z@BnQZcoMh#h;y@~(Yzc-Ef5@DqRmz8K@;$5>urO?Z z&p#;=IBY*l{OO1RgQ}FGEa@ri%ATOYERg%jA0FS`_gQ2B7zU$)k>83*w zB>)OcWjXxz2x1;7&kb*xDl9E@h11n20)y70?H-sM-!L;}^SKrPIJw8I$K|UrS%oK2j~R42CQ7ga?+vsGcobWSY%g4MhoK0)5i`okZ96s*(^0Xj9v&Y&G!%xRm^ zi1m^fwk1$MVm%s{s5VAn!j*-*?wMsxglxPIgVVeDkD_uUD=kuaGPS1SZm{^zjP*v^ z&8c;t-*8PTjvl=x@t>^+jE`$X=BD_)PjR$Vb$qBSd7mxAxzkVE5JQ6^rv+Dfz$>uLYH)y{Y z9w`J|AEwsTv`4~HYiIKvRP$ANq~$40X^AN@$4b#KN(b^-1+NL{^jgs z6@=S${6 zqj)uz=Khs~+C4LR_Tb#~89fijW-#etXLn3iMfVN39KlTqE9VL+qEuX4GPk9hcu461 zB@;TWYJw>XD>;Ls{}Y-2f2cag=&-_WTgPmgrm@-Bwv)!TZ8UCd+eTyCw$a$OZQb4T zopbNGV~>&F$;i9ce%D%aK9m0lDF#9jdZ})AqW9(TQdYCc=7(*P8}dmu0lXk6 zl0~9e9j>-C2cBJgkP?W6RKA<)X;lPl+&)lghT|!U8*J9oHUs>9$iD3Ne(RF^BWN(Y z#YpWb52aMdtNK9JzLQ5Y4qeO3YrfKU=2ScOtRDy_O)K(0LmP;7Ccv!!UY zvX9^!WMc3I9u!M0Ma_$ZrrD!xfl=`huoCj%oy_7%r-~QsK|N;ZwJ02froa_Gq|@#E z3+$Sn?;#kfzxJiaHaB+nI@sL!#6D#=e{5-3jIv90@Cxt57%A3#^IhVnjSLL_F(-u8 z^uW>aTJ9RM*`eb`dGzg$(7M=vEDZ4E1o77j+nI^oN-?`N5EBnWY`RiOGMy-p@yt_} zq&pEjX&^PRWmP~%+N39ba6QH@;5qA?i~HmIKoTc^u}n;jmE2cd3*n+<{LeNVh6^m) z`-zdU1ez?~;P_}qK!Yx_b8QV@$eo>3K;hzc>uc*DQ6@`2AHAAL5xP># zd|r(r{@nuj1ZP7W%i(m5{(%3+`={oyQrCQHglf*e#AVQUPeOk^O=%ZG(TdKrG)tc_ z#g98|Nw>4@TIse@>RJKg*YjwCD#9{DVZQ5aEHat<#_#-Bcbg3Mv|C8EakaW&)u|Xx zOkAMF!afOZ3wD0TA|Ao2JFMDNtk6Mz&fuyuVU(4m^O%3we%MXU0ANkt8loxR8l4q% zEwn_0#GuUGa91ZctLan;*1hhyX|QKAkwdquoXbm6N727H7*h}*8$_{G>8GfT;-Y@) zcVaOL;NWw*@SG|ldRblHxTSNVroh!~8=8|xQHNteeBYxM+QiQYOB*yUW5Du-SYEy# zk$SW(EdiH^=|DkE@krHrn8=AXWt+k0lZIkd+!gbl{Z?Hq&0kXXkfSv39vkR%B;H%t zK-ocz4H_bPzSa`YclxEOvCHdS0tjHtheM^511M$Z_5_COBqS8QWExFTDwT3MmBUjnFR!@{ zcNdKo`+}2B{zPVWWD+(>Nl9S&5x<~(t~MWI{YN6SsVK)85Wbssu625H*;g<)w()q47naG=!y8r%~j>Br)~>~qKC?*M7hZ%Xo=K`%p} zL2>sGK<5H+!F{3mw+9n>fRO`9iHm_xKzNWFNutE!u#nxhk1^`1GTZ?_$n}0V_+UFU z?G$#np->CIw{4SgW7FSXGWJ7Utx#g-?UdWA^{kwirNk zw!G)^-r^&}6k3drXBQ~G85Rt(jPr^yRN4B8h0U!<2x(Zwfa>dZLi5r~4~r%6tuYJp zzI9gr8WZsAJvcB2H$OhQ82#qBzrmDg-36kIA48svr#5=RlRpD#ACtKQT3#$yA+TP`?%9GNnG6m}3g!Ek ziqqHU>frlpa&mzsx%I74l?%>E9h2)K+Q?FSWu7V2^H_vbD6G2YsA9G|$+K z0bPyl`I-Pv@#dsjM|xrT$^h(;Q%bKnSCWNi>V}8wR`GM@Ew&<0X4AEgOgt+!4LORY zzUqbfOcx%vyU-9ccJC0c??uhGsHW`p9N4j@c$P6iC$Dv-3W?ICszyX2$+D6UlZa{> zYSY4cgG9QzLfL_NsXt-xf$NKxTH+bW7DE>1B^;)9)B<1F26iwAowl?*uHIPAxxHd( z*Sw^JxR|$wsto-{3j>lnd~KdEmXVNtq6aw~^T3^Bk;KF)Dyc^V~RA{ZO8 z#4*#PiL$3A_jXUDKDwB@i~}XX8AH%O;nRN`Wl|HXlZpQ{LA!}KDH+milvhrGuufQjEto42gdUfYsbbEcEnR2Gg zT0efJX!@*%uL)vO& zG7qd!ewzb1;Qnu0oO<0LGW3wJU;4#kNT`%cjR+*}C={ZgZ6CV%F@#qhtXCV4*AfJJ z>;e6QMy)CECQ08MPKJH*w+fBA75~-&WEVjQ*rIY#0fgGDFj)jv7fUt%$e*LhbW@L^ zpZ{poKp(Y}Zt)6MpswGwggEgMlyFq-@qA-GQn{ppt()x=+WNAP_Y-lY-Ia;#N^k-N zLcN~Neosthsomq5(VI!KOUKCS_35Y+DV!PN2>;8ifVW3wWhKe4h!O}zk7Mu_l%To0 zAgSV4tQB+xb+a9zKXtlYUI844ek=z4;povt%OLVf=D>?i7}v-sV^n1*C3hB>NTC>% zeX6GF@Xm1m;?oRt6NN+sBL#&-r0@T%xhY}%Wuqm>(^M|4uiV9H3L|TwX8f~K5CeaY zEI613^F-e5r^hSkjt6J?8|bDtcUr#7=iOl4v&oYt{}1z~TdB zI|?iEpRLVzW9O*ad~LzhUM&hq^~))W8~j5s8psq!BEP?l;xOj#q)%mRh8lFXzuqM# zd8jrSY{9pRe;+)|S14fepmM|!`I#J5uttsAPG7{#xgqY z9(G337t~kk_Zkjy_@fN&xqags%i|e1ZP(x2Xz^iYh^n=$RJIz>47flqK zfTnWA!S7QixlM;IZ{mes@F=Z=%uMVRO4L(oS-&sAbjZ^U> zfViv+q%{eGsKZ6ZO1@8c%|^3V9dW%rG5VSRGWi&a+xe7`4)w$#kMjPD?vPU(>U^?T zh0h%EiU0C`&PA3WSaKI#q$-Cm-`n}AwnVl=SwN7Kw!9q1!{GHCe2wUF!L#t)V#3Or zTt)_ZepgUb+QYzJRC?Y&G3vkn`#`LSK1|9`^+%AqOCVz&%$Ek)n6sV1NJ+&)DWrjw z9~(LH-zB&lkG=&2lsZNEB?8-BWrY|6{oku_l)iGzPR`B;0b*ytz2suS^osAm%EFcB z4fwUlq|@@1J0W820D-7RHZZ)qaf*4xVg`<8kt|uUnO_2@#T+>nuLpaB)pFcx@wsHB zR!jXgFwLma9)cTAWbdRe4yTm1enX*9xUvwV!CymMma|pHN{|Y4vn*9Yy5;9z&idd) zan%D-aLEK^0 zC5pi~x^4g}5DJXo;)```>UXm08RwuAQ`w*H|S{+#=ru;0sHF(ng8OkaFyGf%nzZwOTEe8#x@oWpT;))lZrP`Apu^QzML3D;8hstYXj zS+vRu)^^+jYhNbR8hm@3<5)!$IEUtRpqt97e#m=2y+v|HsEawUp1~VBs`D^@6Vt9B zTShO(!;~IjH2?);9br;fhzd985!?Gl0#<_vY6R8qz_ahb$uOF&VtZ`-hI}`2pdSLD zEw0&a4UOg&?4u^!UnXUZ1iRZ` zC75l=!Er@SzH3IBHDA=xCuEZ_X9g+lDd?Z?hhslN+!Y@>x;edNJP5mK&ARhw5U~h*{IN-ZGN0T#i`zAh>KDwdhP0~r32Oj(?t+~55ib29NZbeJrDwSNHLjc z9p+SAWilM&`*L^Ocg^koK%K4WbTT*n{db_P5j7A@Kbj6o(P%Uh$NkO@)6RY%mtsAW z59r!B-piJu{KABK z_?uxt4dYUM$$Z4+h_;ET_6){^dRi^{6O8ok$|R&nBAvLFhC&S=l*g+V?31-gwByK zOXGaK|Hom`Tx}?blTPl49m49UD41;zd8HQL28b8DWjE82S)@>EiKVcHs|=tB$@jA& zFBM`?GQWzJ(5!ujQH?>MZE#IgfIM0nSiJ-GsGJ@br1P}8%xkR?yJ^G@8m;z^6w${A zf842S^XD@($tu@=jQXv6I`c^J*7INAG~-*17fc+?rQDP=+GEUzov-c)=F zW`?I2m~KJD8P)aF9X*9zzp?kKOXJ5-;*lJ2?uVzI;pYpvK>`EpIGW+n0{8E|MoJ`IM3B^?{8zyhFQ@TGgQ%45+hv;&Y!eNGDOlVSj%5 zl+2o3wnPE3a}u`E)OzK)S3jbII}K}19ECte3)DHO3C5npb2S%@yn#6_57_U6cGD@m zn|WfHcS7$MBlql*B+g*CJifc&#rxVPi4vZ0Mi#~O&8aIZj9i8h@85Bo=`NzH^rm!3 z>Lik*i4qg)gZ@h&&UcrO*~6FXKWXq()EQ%3iL{M9&Sd~{RtOkGcWkrc4T`mHLmJTX zN|$arD zk;saceZ642!0CJFKd1@3m)m-4`@KWL_c@8jBZ{7(E9WPSbeoC!2tDyZAzO*hJL9cN z7wh@m6(4_Lm+a&-QFbQ=4Cng;GMUVtL@FTuvDXKT zkSv00f%RYWrOJ*^SNdS)E`WfUGb{(tXz%W+D87Q-E9w)}Z~rzPO$cpoZ$AQV0}x+V*4n<%J0dxL>09fQ1plbcrg;@UT z6>HwG94Q0@gB^{hGW}CwgLV2bhjKXX^ut=LHq!WFd;z0W_y$sUvp?pLOVCI>%inFa zP>$Ks+-#N(DgPUo+`l;h+OrCKiUah{abN1M$}`gGtma*EI<1bOF$Q@3CdIpgc6UIj zP|6oW0y{>3eSJ6|3vI;Za?S^o81m_?)@DGy){3)0Qa{5+tueel9?ZNVJ3l1aV*K^) z5FlR9R2uln6O(C2ogh&{K7`MGhjjRTMbHAV|ErA+7N;!|6{8iPNoV%{@Zg;S)Skjm z{3YlVmr#g!Qh=9fdr@^7U2)L&b~xeG-;B7G_R;wmTe}Ty_f^^MOpbE8t*q2e%)W#& z#UL_%jxLfVSm7&4#<$^g4qgOflG!))9b^;%!_xgJtZcOVDG}KW9&$||EFCG_@Uy1> z0D7We+TYKl5p|j!h>mC3@a|6h(O)Yq-X`HbE_Awtl=@|ox$jC-kOF7V?pr1N_rni< z0wO64`3w4c3mrwxsDxEK(0op7eTd3-(|o~#(1iP!(Lw@>AR_`$wDH)~ zN(L~zvsGD_OiEqvX7eToWAUHPtP3mW!#XXFhYah#pEA(CoZ?u`$~{5!pfvto)d#4L zG01|9F0!_6XLq8fNqj#^&pB0Up~nUEHoXTeRt8X%tubO1mk?cK)2bc03S_bZv@k%O zS7RMA*3@c#^KSPh%jv#%Cul^f$Cnns=8ptwe*GS@=xUD3d_U&j@5*& zbc~E{z?feUSz{qo7-F1ySMFudkitAv^zM0-*50920I$ks*48#!>@3iVvXxNJL|?@D z*k19CT4b2lTUjFEa`R|GWEmeA#t?w`0tSlMvNFqW+`LQcq{YcW^B&Y|N78GO2^)FT z>d(-;#E{}pQ{=0Q#&m@gu!U!-Ns#V65ayTH0&Y)T134NeuScoQ%?D?%-(d=YZgLvd zcQ!({+WlRWb8NW4+kXO!A%w~7^> zrdkh==Mnw6T1OD=+oiCYP@vjpax`6svjNzT2#4F_A!d}R)wk7D%4Err|F-v7elg@}@9zpbHxg@cnbuA_q|nhJ#~ zF#3bB`3XoP?~3|(0OZgVK(%=bN1zuyae{`1u7oSS#8zMJ2BnObd#JCg+r>9tB{2J^ zBY%7bs$d2QyaB0_T3+uj-kmjOBRL#a6S)pZ*X5W7Ae$$P*HZ$32ptST^I{mb*zdEe zyS7ib3@HbZ0r>AOGFYLA1CRBAWMnxU*X(%bJAm zd-0NQsHjRP>FRhtg5-3(2x@faNDbSYnO?77RVz`hB$t&$>?J!Z3PxwaqR(WNx)_>= zZDJhg-Hwn;iYY-x$m)o4p2U;5-d*{pfjr(hAL5>8*XgE?rQ@oK{>%wd_o2w#aD7qG zWOcqq%OdTtDDiWA9f3b#^nz7oxi>Lq3k(##cq{lhKD&u#SKV%ZN#XhN5sz#vAP4bB zPOXK=bt#WB7VEaL>BVhO-0Zh*$M1`f>rd%O2Elo*0>8HufkuUiEA$6 zbT1cp5*vi$zx+yzwC{I=f4FT%S><}73mnm%4_-V)qqv2Q;r4SsDo#Uo^pX`-E_N(Z zA~9PS*~^r;`3CCh2xA1MCzXSA?FJZFR2DNQlDEc#aW^M-(U9o(A$f)sppAwR>Yu41~VK`))Q*mJ8EJYu!rJSgc4-Ri` z)IaW_Moo-fcYKRWPtUcz@|8YcOtax}-f?hwo-|BYBqVmSP*Zop4?CP6cWCfL`)I%R z`MltB7a2%lET-41f4)-h-w6=8(eATa1@G0~F<~Jdo>yhPDtb9e7S^~~hQ2u< zdiqL~RYOKZwEg;xUNe#)RW^Mjk`CKh5g=$bNVYdPq^=)7x>Q z(kQ02vRPS4G+=CFF9Ud`PGV`b_7JP3&DGh0n~%8jyz1tT6$*!@$EAA2eue^Tf&YYSi6PGCMLDs=J; zxCtRKH4es8{SyKU`K>*Q&ji;U=8EMtW@-qD=nkg-{t|kO}_(P)^FpJjOw}UP!>Os}a)Nb>y@OgTAyLUH6S~nEt@oZ4q2H70V9FjW>QZ|E@w5Aoy5LY{yYzRX+ zf!$r6?)q`#U_gBGkGlZJay$ha%acC;ZTso_DLKgcI|!aaWK_^+~YS*a#l1)%+ygF&Br3z1PPiaRzc6#|3-zd zO>(l+OtWg25Dg!eV#dba=M@v;%k%|eYho5!A*=j2QiaR=mT=u=?haRGR^@z0c$zuF z;|kE9XLY#!q;kg1W0P`1QEAna(O@g7Vx{4sGx`*$aAZxVlZKwydvCvgf}B6kBfRW| zKHib7NEH@w;QCwWZ`y26J;X99j-)wGANKYp zIwPv#z(5GsfPGTLen^9rFD? zV-P`i<@AAF?kD&PhF{@X;eRfB^bi5R6KX;6!?W)uG;UpV)$tabbRAq?EZ!sH+?Zza zdu?i@0)W_I#e}!avM!y@KbyMXi8mGYoH6QO2)N!ef1Y0A+{cy7l6!)ngKQ3+r(7W? zAbdiFV-r-OCe=`0!%N~AuQ$Uo=jx8uF4f|x8@m5KWyM`?NFSu8r*22Xz3zWDwM1v@ zg)PKzPm7Qz&PB(yL!9D$zlTs{(F5WFGN|AVrn0lC_ytQG01lr;sYEt8KL{TVoML4- zV@m>zFbf#*&(v!RcnXngGRu%aR|RRv%_b=tX9}P*_t0`$>ga zhsUIp41$RoaKM-;R&TovI-+drt zg7or(T6;7^cR3G zIlb}IOY61}^Q<+6Q04hir}7wTq}7PSY|85=N{E_i2Hc0 z7>+F5A`^v5Zic7Uin;-tB|DyGpi*h%I}^)#r&0zIqyCUeM9~M6%Iu40k)w{vh1{oZ z+C<1y?`Q*dPol)Y!-2o)@l9q?gw|U6*Nl!z9vA-da~5Nc37xLwSl!p+6aSEs#;IOi z>WXFf@svXX7aA3;Na=g(!?@kT>vfJuqlUI)w5JgE8v!G;%=ruK!8Y+o{1NFSr?Dw2%Mv z-LI~Wsim#$mO2n=8t}y(fA&Rs@pzY$O=i> z93BBHcW`f&riG8IP){TwhUTa#72RrGo@x)!#l%>Q-Vg7vcI8X&ut^7J?%5wMIzsn; zREo&Ryj?NYJ%gNL=D3D( z29eHRB7gSF`%`%crRfskB_Xk};$V+c6ts9f@xN;{&OC2atWFx<~@5v6gsRfu_Id9 ze41y?)r=y%p33HvWl2?H{Zf+F(b3^b>6*WigvNse!XS$=6A47L3$sB`gWEW|oGl3e zS}IZ`o(My|7jxsVv%*qZM-fZ(gotHKm;UfS_gi@HX9X zRB%Nsj-2;Al`li5%f(o@4_%4CopdyXw57*F4rZOl1%vEWAQK5fW+{l`{mVaBRdjF!VY;7u@9EW$QYc=Qc*(bfGniXra8#mQ@VnMKlI;OP?HA)jTKj7BjXspJ{j~f#CS$v!u+m5FVN}yLc)@}=yjm8XMT*O5B?eq&nV@tGiw92%0k*<#?Yi6lM_zoyJH9yIe>>H`?sJ`_JrZC+Ra=PG)Ej<9_A)81kHXZ{v*Y9zCMNop7PkA-ZwannGx) za>A!itz525m4D^&i5i4|)zWiOw9(dHVAbLvA6}_lEU?Pz(Z%pKNT-n#35X7cK30V+ z4A;rNjxouEXw%la#g)e&R8 z{a0-J(i*i+C(b-TRP~nYQjIscqam;<(r|ie$7ghc+ovmhb`RjS)~*S|!RIv!Fw?A+ zjZ0}-Z#6}nKBuQkR4eV-Q1d685Rykcyecdh>nB~VwUgFr4NxeMl(fy%oo(LmTw1%) zTMnWw(SK!ibbQ2X{q^SUxP31v(ap|Y9c{aLee1Z`il9`Wqa8JJCZBh_(sHY{|9hr( z;7gyu3TywUR~&_$8U;jFfUQVCu?!c86#)Aon-X#iFdO+AY$JuY zoa*0pThZQ3CgVB(hJwI2l3jqE^5w^B0?ZL{wZ%N;2@sWv%j1@CQH_H2M2=weAm9%r zzuD!M`|Wi?51sUL+3m&o|*Nevbw2mAjj zPQ4)@c#Jy(s^rW3o|L?jKhfB1vQ-4m#hSM8+Pv4o>nbH$9aD?H#Z6yhfCs zC5m!jjHI)}uBO@Y+0a$UO-*`#R{ZOCuR`G@vnesR^9Ikp6#pqMfo_=eSZ2J5#`^sG zqE@GLLjX2pB82sjkve-L`)gOKKO{9V>=1GC$K31Og8;K$Dc?y6W?l$>tRbp3h6Y@L zZp^ShaU6Cj)ffpFAOSDb?+Ypc%LV3D%)qu+xwB>-7SRsyxy$^U7mmoNeMx2JJ276K27iHVaA zdnUn!_3{k>6)`bqmoWLqjuhsd;S3#-&+Sx&2oHkc)zkow2WjKQSKP-R;S#^um zBDUp$hP-exnP2oTO%@Z4y9$wmk!C=OOTFPe7NyPwe(6e1=T|kM6&I3k0DM7L5EC=h zK{(kaBjx!ak*R{uD}Z0F&FPuZQ;%fA@^Er`1RQ!e7>T#5`m_%K#tVtiBTyV1MpFw( zCYH{*ZtKc@Jz1S17`Gv59xF|v#s={+I&ReAF(hpi!C_K@r*x8%B)N%a)n5$IGL}@ zy9oFd>~d?`(y_I9oziHtxkWH>YV8x356>Wd0MPLCNBSbUcA->zX3Vbv4>_)`Z}iPI z0zJ;#4;6Dwu9B=|Ulm$Pm0j`q!7`g%iQm(S*;M-=C=|@Qi=_80GP;|O=RVo#Ds-m5 zJ6;?y$P|trZFL{ICUf2&eV%1PrX(n%4faT`oUV&255QX>!_&EmG1EgS=WG?r^_0;9m^;DV**R1s>n=H124TsM|Z)b{~ z+9DlqWuBpHg-&}v+_1wd^ZW6y@>8UGBb%llxxSSfo6>EQVvmZsul!B{w>W7YG&ZgB zpu%j!=~G?BvXNOVil_eI-I;8ZdUti_m+?h9=d`M z=D(&z6vU4c4g=plUmdct5zsw1Hp*MPqPw!$(6JOs5T9c}O?>aUql1~s=~S9U(DrJ=ywiAG;X8Bk6Dn^h43#S2&|$sRsa6ufkFumk z+G)Q=5r}M|*uGX0zhrHD$%JA|hr(%Qu3KkV)F}e}Uytv2nQ!DMeT&h^clFXGVzn~} zH4AvDC`fp;1OR4n%%KbT)bn|tf^St zJ8F&WEIcSzlc`0gIOB5Wk^!%o0oj@~4*!e`4M%%YgKc~8RP~bY?p>ZO92=J9Owg(REg&IzJ8aZP-9& z_wE*VOHAXe`vx0M_s-GVP98vLMM|?=3+peJdZ1C}$P}*-RYqNYeu+=Uza-E_z$ss* z{3(@Qu5JNJyRnj=3c`I}#P5EDEG|>!BhcsB*?X?(G~f)|J%@%N2}%WSQ4cwkeG%=F zz#W!(dmqg^$FE+gYp)ESnxiI8=FKMqE+I>&F*mdTPr$Cj(S-dh>RX^M8#s|@r{f<^ zo8ZnF6vc0N6VxUhdI6q@JLzC{2u||R*JNnaW9wjC38t)C<(YKJ=reObQWz}59T4r`Z0X75bHx4_jUsxfP|K60=mvO5CWjg$- zUgv|k30g<{^yQbWl~d-e|NF#nFoP5)3_R^&WYd4!Rbn@t#CeC#J03vSr3NtXVqnbc z&znf1uH`GTR`wHAtgJ$H9+9G-d#AO-WI2l4H$-}_91smHa) zXRwyqK67+GoiCP8UCzE{K+PzEzkbEJQSO?$Eq|eH#x3%t&iBo=5J=%0mOhy;BLf0p ztEybSA%81C7(yX~#bVc{iK!xiz=`%|b=E#mcWQYF}oCZGF+E`qJ@| z7J>Dail}E%3B9^8cVV+xKuI<-1`@Z-c%5#0r~kR=J`By{zMOpb0cVWP*>o*pud(6r z@^s+7B7S_cf7c0`Pdb8f5UOYV(dJq={(7&9;A}a&_g&ZAQnh^UwVr~b<(;z=&)4NExW{2E5t+e`zzU{E^U(a@ zsxQBFD^(s#KLXKz+mrA>c!aIl9q-TVSFky%FK)WFS*_P|nC~cMg(^L6oDg|_1s&&o zI%B%2HrT|y(cv?9uyseM-|xu0x?g16I-PEXo7oSa%7)Mz9e4tRof;EKW_$Gf3F4|! zs-hfNqD!sGW^)6c0;VEruTGM1m~8};#pd2<@@FDe@Zkb|!&QOfg*@v;4ZVa`}Hx^A>Xq0}DS! ze~sbLD8L+2oZ}~|j=<;BF_}ywHeG0wddOtg4s6+^l3YBGui!$C2r*Ti%%<*67`5#v zueSmB0b;7YqjM_G(I-<#TIfyY8s7}&1c)%q_N3l^B*h|oC6OXnh>zq(nGYWgSkJ0} zgJhe&)u_FEl{9iVz8*1iZJzKlcivdG*RXk%mR#l9v5-VW06D9JJVb`3ZD85y@@_OR zBU;f@Ni=(?0;on_7GUEzQc*Y@M2I|hF`Zxj-T?-pWMD-PEqO7?g^=F{)s94L_7|2T zi}W1KsFdmArP~c`BSRYFO4@O?ChQVM8p)568sV3+0KXD-Frfo4+O3Pb+8g2NFjPBAI=sTb9$_dK_&l)2$`4 z`ogQ)1#3ICaa6~P?8p%IKU9&Uv9iy*eM47%x%)C#TiuItv}uUEo9cc_ zgUXI2QtyBiHY%)nrCI2884#r1or0Apx3qsSCCaAO$xT)$12?Ql!8KM%%bZ{OpPScU zWSCC1jzx;oEweIy>So zuj#6k#gqisWVQN>uu_=e)uFIM;=@oChJpOGdnSDoWG{r@aBPFeommexsJ|AKY9;yY zLE5V;zJwb_eUAE06%hmcMIzHU| zzA^W)=s||@8e+b8CA2qIRVH$9uy>0sJ?%SUZO)?7uofoMQNyM+O4Io&vOLrGa&-l= zh!0L><3Y|k@RUJ~z7lHhE!PPW+gPF!>H*`a6Rf4j%f|8zkww1$x|#aMVEx*fi8--D z&xFeO|DN0&UtQ&t(okfwFqfVl6a=(-qn_D(v5&Ry*<3|Ns$bCD5%FTzU!#Zf5$26n zry&~U<9U}FuSVn^fp2L1n``DVZA#YK^A+>2R~G32KH%PpDGfdljuOX~ZIL{kw!gB= z98-vORjbv5cTCa@)&2sP#ps|DYVz4mZMk8{4AFe|@p_rO-4_f$wXsN9UksjXGHH6K zWa;$r_AzdA$9Kp8X+MssDZR)2^%s{f#nhZ5C8$*NDqS|bZV~nrz&XQ|FbK4GQVDecWC}Z$OcBegSy}lZCv*k^c_^hhO7r{hy z(siuK9i2E|3DZACNZ|-1>+pnEeWdXGTGjl)37O-mtU{+r zT1E9RgY(OTLAl&o-H`zAB|J4Wmrzi3aVZKVfc|wGujhu=XnygaLvPhsMKZA~I z7AYDD2^6pDA7L0t_H61OI*)T>2_K_b)FK#w=lUhCAl<_BpC;%(KZ{zS#=$&Q=7lsK z5b67P9@mJoJs(p48P+;qPN-T=O0NW~OqAc-yo~V>GQ3`n#j(;q&BT{!CF3)q4?>@a z3*u1Fi)qBa8wVnvq}x4Bb@3OTZWt-%+-WtGnFeOH@EQ>zWVlXpfGvgp-Q4v0XyLZ1 zfu{Ym480f$Ox8YGBu4&`B|Y&cgPbbYfxjhSx+YgAf^onWwD2xkwZq4<+=&<>EfXj4oj!*&1s`L2vjc$06IZ z!f};#@KApM;Ua2@ckowS#zXEw_6~@2?LdWwMTObyL<` zRDA(Hhs!~bpWVLT->Y!wz2re=G5Oxer|vwoDV57e@x31-wN&zwymVMAbm^c`B`vbr zi^Ky*VSTK1eM^>LRUeh~v&0*>d4o3!K?kiiOY$5&?--tUc4Z-ATzmxs-{LU;o?aUc zy-k%JVqbS6A9ymIGo^ymbY5-s%{+#0@4R=WFjFk|hPa8Xzj~ZxP2(F)O$NAJEse0I zJ<|W!AEK1iD|0Eg;2IcRuQd**)@fHuW3hA&yI*r!H1F002PR~R08Vb`Ona#mN^Wd! z=-m&VHl$QF?pUOJ)%FC|B|Xj--oGb1(M1AKRu+tp(1UI-BqPltCD{k3L1cJ;JY&|l zR!WuhHlLL5FHM6h~yg0lrbP=JzMP#m2`1 zwX@oUs>tXbACN@#M)vvMB!4q3GlJdp({77oZ@qDcZn?g(8Z2eu+Qen(f4>_t;7FER zIU4nEH)C|hfH}(#A+zPR6h#W}?813Dwy`Gx`IP2yf0FAmA(r^3#V?9gASkP_ zbmiB}%NSkP5r>9zAOX0? z=o%~+lK_tIC?HSGPXkk3^K=0t7^chP8m`A8SF6tPDq^E}pd)UHMorKfx*6L(gFVwd z@L+CwjwWFoNwqIit+H{hyL-6equPJ+4u!z?kpxZUw8IjUMEG{_RhQ3L5G40CW`26Z11K8xLO6l*+V(Qk*$$J)WEK*{D}GhY#nR2q0a#KO~Mk zNBJAAq~0ojd5rO#8}<7{8#VNDIJ%$NVa^?DkLVWXP=6R^X}McsmnhVcj(F(xc%xAf zI4AUjeCseikc%S3ZF8B;Ve3v;&D2%}`B|ydl@5Z`mBz8Y2!{ON8E$~oP+*fMS}WDi zAiJ1s{Mz+7I-X5Bl7HE`D8A&yb?1P|`b>6xVtWwHH}Z4SlM3j|K8msv7_t#($0J-= zx)icb*A+oYZ^a(J;yP(dqEW}_<9~@6RMn~!D09XpUjI~?cX-^57UyLl4TO!mItGd3 zFqQnTi%sBaQ}007$;nXUo5U!U99a|(ch&3TkBGM5hfn^;&zn;XbGggDDVHQXSsvoL zLa9W{lZAK-)65@T(%FBq+YUEf#}-j95U5jt_Ad$iq_e60T*cf?8QwE9=7Kw$ z617_qq<|`!I&ny2laigK<6#;ES7$?2kJ7n!p65$j+eBNVeqO*Uj=gRB%uOTf%;!B` z8sXyWhGMkqlxvYJoyvG}rVHkBVYNr&89OF}Tew9s&1U42Ah;K3or)sCEjQeFy5{?z zSXJ5PUr4x6?jU5w=xD z@hChlN+$0t3P6&b2nmlqx@?+F)8T$Uc|$que)E&EgKO098j5*`yR@e2fp4?Jiy8_@?CYs`T)KV%HD|`4kvy|WgTy2+fI%2Mc4>a$#gYicznl`Y+ z8!$;}f~qb%UuC>?8BADh*3>#ScNwK#wS*Xx{xt`N>xheKdo0~-QF2E39#_6PAeh|0 ze+996(a9ly0zmNL!%@W)29+EUQm>|qwo6{foM+ijUSK-7J3>VSUN}toJ`7Nrr8x(f zt0i4~>iCE8!&iMIt*h~F=X*zm(nSujSS)}Xi_q;%83yH+3ln;TtBf1$b4am_;iR99 zI3)zRzmUtEFBL&%!3j0JOlpJ}&jy|1*i69`2N!rajOQ}IYu&xUn&*rLlN^H#@?cON zrt|GI|G!Iv?;bO~0e<+w222r$B8ZGnJ1x1Lr?Dkp9~+@F+Hp&bP3fObo!cRuaFcl{r> z-oh=aKKd7(p^*;hQbOtOMnoC}=^7fOLAnMh=`LxcJBRM>ZlpuHyUu=p=Q;P>`#ksA zf5624?zPwY)RG$)c`QZxwRB`wzvj~n`E|MA4hi5Nsz|x*l6A~j zP#;=b(MJcnKDRD({;qzvmX`bj*WQu>(Wox3!3dkl%uoHuO3U(f0Y>ilJAA$!YBBJg zrBdw(zZF^h>W?9~>Qex+@OJIlYdVF!NMSt4XPR3F1WY3(tBVpprkiO4^@;~H(!6of zjG))uA}iW5lHc?b>DU!_`B(TY1;L#Vh4sydFChA=<}~byz#!P@AvtS_Rtrt9C^$Ai#bw~kpX9Wwl#EO z5^ks^Uz0(TeGJ@Z(QRWk@0QUrS=M?6vvtlmZ%oS?4L4q}>)6-B=sMDwTRnZgTUVgX z$NW8+6sNS}6D%}YR#MxrFXdjh702;V^G@Jc>5cUBSp@H}FgajXVr_pv9RG=AYHQz| z+y3^XA2;WZetF;Er-$pL(L>&UqUry(+i?z_NkrB^5sR3{dJB|#XZXX&DUuAorzc#L z%!|k&c?rvA_^!XZe;h|VprD9`QP}^`MC|8_flrpw>U5KAyBK2h*c{pXlxwZHI3rp7 z7k^Qs;F*lA{qEavtgv6d15AJOQlh7lf-4@JDos%$ z57O|r=3{9oF~H~;3+7($$Rj?>?YZzVgKz@zUpZDH_#7JJvgqDYvT$#yIthA-T1y(d(v zR{xuLd!D1*ib{;Xqoy^r8yo$4tg{l5rt$<)*)=|TtEHz{Xt%o&h??EMZ>8&{Kd9C! zt9}YQG(ei~pw%#-<(w;>0rmR7k=9TE&p>9-X$p2m84cu9-&f+oRin|7RW78I$(0kAq^^`JZX$k%kb~1r0Yc-*nv8lL=KCd{5K+;wOtWl*e2# ziJmyAo$3Fz)-sHsS~0?Mn7+?zL9P`yQlHxWKOQJ5N;E!LK(ypjR;IfmIXNyl)Y0^F zwX*VJhfOEuYMbg8u-HQq$(DUu1y+kr?pD6BKVS`Yq^Nl+c4jl1b(#C4#jL^j>MN`9D#2 zk&9q!frF&X=dl!jLVS28U;T||Ogg#QwEPxrrI+nTc81*NcfFC#UtX45bzYY1biiJF zgO3%r_#HJ@tSb9gL&HB$FpIfyy7Qmzb1Av;*g?19A03FRzNR!PDE#J{w2pB7>#Wh_ z3V$j>XC>dH$ZbzQ8JF+fMzDX7c$o7SU;#kcVv3ga;6I~`XmOOS7FP|!o<4SoXTkZ4Q>JGpiN6Dp*(eqF`c(W?!e02^ zd8{1E`5}pwTqnYfZh-k1Qj(+XSQIV+zm{s*t5ImJ42Lsc1IdKK{k z%B-l93p2c7cnS~ZBy9c9ThJ`x*rOOh2T^i)(9Pfm;e@V#n@tU=PYLIWboRjv^ltDdO zN+A^iAxTO_|9{@|@VO{dv!Kt1^j}z58)j^cSH13Y{YZw@)f83fqP)|+7a%tF^m`Eg zopdNU0guMx>SRUDObv(m5;~${Tg3L)xS4+f07Y$Y;GZU7B70 zef*DpYbW)BZ=hUhreiMuwmwn7B_=rIEnhCaA_~t!Yg4|`$nELqct3U6L<;Vaz9a@u zXi0htfu8irEs~T>JCoOGZb+bIGxEE~OR~k36`E*$^g>l(48@lga@w_`u{^;KFwmW! z_~I}$X?E4GbS_i+q+O0w8y-`aL|atroMFu$nBy(g;mEA48+Q_QOiorB1+EA-)*<=O z2skl@BP6K?B$I!-7mZ_O38?16nRABN;-_{v0|r}O>`AV#jBNvIFz)qH=$2h7e^ z7)%Cjx*+`pxR1486O0~a^!AS88B1P1n7$#aij%B0sM2hiVNxAn#j=)XW9J`CBY|>T z?Y6X=4&UgpA9r+ie=*sVN0eGkxC`&gIf+jsF7#$s`^At38@uzaDqT*4fsX(5M-FZ; zqM1A=)|TjwqCooC&(Hhm}EJBs>=9_ zlZ@cuX64~q!4cuoc&K`-qr5jM*m+kqY%5CirQz0bCMx6y(gfcAYHM@kFNj90279vj zfKh-?x7&U~KZWNAD=Sl`U%(3nxxly0t*xEG51BJEIkQ1x*LgQ9o~NyQ$c5xWZj}q! zd(_OL+}_@=-mlnw*uM~P`+C@p-tz@}A`)m(BOO^qE;<^#VE~22m6m{WGR|z5ab4dB z$1l!H`^i7=X}bKjzojp^dO?c4wV0~=GPi07H#X$>8p7hj&I*ey$wZ!ar|+eO9vm z0GCW=+j1^73QMB!E&3Q17KFmaXZ4E;U1ii|Q=R2^4~G@VWh}sv zv_M`#Eb!x+17*1rFoJK8<9;??4iE<_Ce?%`#WvB(%FRxP$)0XM~dr zs{03zxYs+A{HjAjncq(cvx-+nN7EnsYF9iEnOewUh*N0_%y&20%j1$H|L*rK8n0Ff zcS;W_;$Ck)`}!I8HjPd-j$;>j?L1E%oX>BczCH9>3iN)Yq%P6C)Z?_d^dPz}p9$+DdpGwlptB$Z;ko4(X`-njrw z{uSMv72(79LFgi5G-yb`fc=!{9X>z$0ZM5iUouJO;xHp$dKZNS!X8HjNZ@a!p+7b~ zI<{Ggw*UyE56=-}z(fkJs4(|Lr81IMa1O@7#^vh(BXp2gj!o zu4{RRT7QVHDckl5iZpT?xES;l$LMvxft^_sobcoB<-AvK%!a4>F%gSwPv^>XOaWL| z1!k>94``xr|FqqrE>tL=1vnOJR^{L`;4i=rk@EED1o2}QFiEtP>$ffuw!x3fO1MJE zIvzRWD+~MKGHsa7^38EadQ!nvHhfg%XzoyC)X_fYmS@N$+lEMsDXnX`#s?|HgHQ82 z!@(5cDulPaY^t$IB8Z&f$vj(Xa(cOFxB4{mF5$Rj498{{24*!p?DA{B`VFXQPDU zKO?k-AytypLWy)CIQ~_JX3@&+Ybn{!`4QnVKt72vCcxizSW+dBKvrcnJ^SqR2lFJ} z&9Z8#fB*PNzN*DsV#{|NPiIr=T1bE#Vy~#?Z<6X5`je>seJ{ z{kKYo=ee1>1-(GC_{xJqk)6BwL;&N?5_)zdRcV8u(@ljTUjT%xa11*4fUMs^Z$JuN zZXwEaiYYEyl7t;6w%g68ZPQ=tj{fNYTePNt z5i3Yw?+s?7KQlZM`b02KjTzT6Wd1Ec%ZxYWkhda(_MGSS3ij-w?9?$cH+4>XV-Mo490zUbf!z~kqLpXdpl73(|Y_l>M6-7uBjZoZ&12?>s)0U!cA`t(c<?O*BY4`20KFuz^*SApH&wb4kSJtMXee5Ke(%ZK;O3s0R&?sBcS{i+OP(17}DGU%@&tM zg3v#IRDL|24o`YZ&f6@Y&t6i7mxh1l2r00Z7y;32Q-D880pM!xr}D}*AP3Leck#>F zO>IiO8KV-$iD+1}ybIvQ`B4AYCG|!kpG9KP_@ivO0csxdYt*}t5d7ya4F*sysi&qekt~>b1IMznl?!>)&K_t?2o< z5y@HqAL8t^)@}h??Vn3)NuSVQhGKN3Y(!TBI)3krH3G5^Z1KqO*N<<0T|`!3eP!V# z=rzrU1s#aCrvMw=ZuvO_We>~$W0eEuKu+HzNRhN#O7u!|x#)d^wnvGV8VD=OGyf1N zSTUMSyQlIFTsbrD6e5=b``UgSFQ@}>!~}+;22etZzL7jltDRj5ec>P&n@ zq4cBuK7f9us3m4Uy7khVSLXbEV6NhIsEUNmANqowFXnL^|G zPqe2g$BqXiE8*;bvuU8g_AR9GnYVUPA)AJaF}yQXM&^Of_s00E=RB(>@DpxN^x+?M zE2epu;g%*Z5Ek{9_tS}ZlLgH0B8R@#dwU>eY4Ug7SL!SHIqee-8meiao&fQ!aANUw zjN8ZcYjaivec8mD_?qhc|A`V6oStElbl<0PL*&y1)H2OkhMI_C!cJN)6Z(=>BzT< zUSGn{M)EolV(CD4r4Ht%{MBA{Wc6u_jD+C`{=EmC zwfnA}qsM+*d6(RI(i|KculD*%t*vM6VOWHk&{A2rxVw_@bv&k%c!MI{02DiARceQV7y|G}Ap4bJ#D-LByAzxbv41Lr1o$`V0rn-j+QmoLo0RjFy@i36O zLI}tLURu@@1P4de6BgYBzQ;Y7K*77MU-cM9_W9#0&!x4(9w&YwdbjRR7lt&b?=;Fy z0zx0ao;U+?aq7ygm9!0l*j!Q2{J{tlADGOEv_Rjh2LgC$54qT$#^GL^~CO19|!|2Y-mv=J1?>hmMDJL}K7u*=HhNpotUFDvlj9{PVKdP4B(I)7CPMXkM$ zHcEq!otG40t^%6AEB7Ns|Md-Nx6I5sF78p2;D2IB>=Yz>+smKln=_g&iIgSw~op~-ci)w91c|)?PoZ~TG6v_;d z9!x&Ci(MhpVocl}aCsV`gulWU2UA679L|5rXtBW8z57OdqTM$kHYtI)z36Eh&B$6x zSc8HS7TzA{GmOcu5}<6wfC;(Utis{ zCDjrMguGwcaSKHnP|8b zD-h{;xntZ9$^i4#L>_L>On?ptKpQqN)8;*X{OH<_7)O-@F+KYFQy`qufRlf#eK@yk zwNJ&&_Y?oK@@(|F%78P(2SzQqv}2y|yd~&59Fq{zPRl5~z7 zUlp)Psj4Y)4a=&1(lz_P1Y8u-rci%D&jzs5lS?_S^1Pz$p_l^w!r!iosZ!b0{|z7s z$oGSSHbK)>h_#6DS?5^+*YS>VarVPG!tz-a4V!QDXrQtkDe_C8UmJfz_9*aNI)1`H z*ogLfh<7Pm@&xC~2tV9_vUuRg0uXkiE3zaVHEc>rk(-w{k@B9GV<(g;O_KJ#1j2IFU<44a7?*()c`RR5)O-;~$ z!N=TU!EAMiSUslgN4i2a&i)mwRR$4d>xBoi_c=zqxOW=S+3@M~`LK=E5UrbXW5rW` zAO(G|yxcMo6GF3I$dk=cVO!tdvS$#{-? zt*0Xy#|l}T<*?OROjQKhphzjZV<%WdMpeHX>+lNvG{1Ksv0v&yd-l$K3I1sLdY$B& zen3VKF?%jA9m(_4WZ##PL))KiBO7W@0AZxY_K{EF_)IC`)zO45`O%V=hyM-L!ps}= zVmfV7(<+t#h-gRK*b>2|k50~Cq~;@w;~J??xl-0>FbH1b&5{*2{V#8k1s|>lS;^1I zA0jGW26VBY9|feSR8eV5v#WMd`LV20V9Eq8v@dCCBqUV0CjWuJ%Gv)u<3OGXusOFs z1sU=Ve^+hw3?_JDe&dzZoXmV`8CzmDo9sf!=FW!+-pECjYI-}3nZ`uMCTJqUM*~?7 zg3#yTj#jHIAtj9iGuQvVsG^Z#wJYHBhK%;)rQJ_^0tWFqRD`%w7KjWT$k$1;m`}6f zm3N_vDc`z$5TP9LlG+6DbO<2IEFsQ~3Sb20vX~GH7FcU>cj{nJ&_DeQPeX+ensOEw zG?<7}Q#kfs6m1KnfRl`Zkvx%$VLmLGhA2kL6jB9G-3JJRQUfe!%i-+{3-3T=RN!U;G2${mHW zj!NLjmxDyX%+sP*qcm&3lKiI9%t?n-G5@{?JQhoL;{28CMjtyo8CHDuC34OxfM)AA z;=E8d0Da8rPgL%b7;EGT6ll2-;|H{L+j&K3r_eXNPv1D*?JSm#JZ}Qi0xMnp*08BD`y{?BZu} z)Yfmz|E@sXYLac>n1-b#bioqvNITSp%olVK@wdi2>ZR?Hw5#RUJ*6*Gxe@Q#3xTO& zf@GPM(6pqZ-&ZtJoHfTj1inFF#upSl7BgLT`CaIIhRUPO57O}jU;$wu|8V<$f<=8#MJWnyW( zBW=n+7m;T!eqfDp_VR0fgU?vX zAErC=h%|jR{h^>K)WUjKpn z8O-YNMz30>wcb>YAcmti?B9I~@92wvu*u{_U95p0O|cpi^Wv;7Q#6^VkA%A2%KO)o z6>9DoZ^mTN%(J$+G6$)w?US@=v7iZ%7(p77`ABm1-tY+TXd12#t5~ajzrVheYR9*5 zU!o|;D+EYB^W_t&hCxtR278GD>f|_BaLj`QVnc>xWS!|nI;w4*D{LB$9LGszVf-hoHhd)U<;-AsyT{KTbyR(= zW5v9rQ9kmB{TRtabDdn%9~s@&N2w5B@HE9dBPG|TuW@1c9;5a+Z{<+=a98F{=q758 z6v@WppzHsCiNyVC?N@Hr>4eTFUuaJ!24k}{j6Hgb_miSex&jmnAO0rneVp777Wa8* zEmL>fphV0(#FAiYWV5;6rqPj>`#0x5juGvEmfJUIKTxDVNDgLI>Cwai6H?}E`kxu( z4~Qo4HdmR%sv&ma{;cLYrcwm*hQ?&D;sVl4rUdN4*FOXkK(SvOPqRY?})~Y0{4gu}$zh8!v8|hVZx> zt>P+6JU=M^38Uouiyh0I=mP!4zGsXsX?Nqvvq*}knEq;kJ?#|i%Y{$RK{{r=9gAMy zoLGv}p$rfKI=&F`qfE{mBS1#yz%q~Usy`WZJ(3(Z(kZ|f-af!on!Wp|a9Au~!j%>&XHB6Z)9K?rcVU1?2$;y^|2u%t3 z4FwSyuUPt2?30eE<-ZEVJnnHtV*;S%KRvQY4dd6o9fr?k+zDuJV-7xt4o)41fIM~+ zynGE~MAQ(3yB+0C@H}y7HDB+`)k`(Mz9ybG_twt>;8*3x&yx6;!K2jCK9jF){x2~C zv5AQnoR65a3j{~FcQ=AEDM&na%k)ZD50ZWIDSx{2DFwVF9gBM>JV^0x1&~vX^V)lYvdYOaV&qWHcwjAy+!o>#K7 zHHo(qcFs9-dc(fRZ55!{WHqjT@3q3EH$F8>YBF$0p7%XaWh%SB|6+M_XUPy1vK~e0 ztOSRY#$lfQ3WHWsAh_b;b5Iz1>87~#a|i!8~HZYH4mw=5DKCwxncU`Q*&ZA>-BIB!!docH@idMC@limN51wd0= zk&#~UNE2|;T4k)1QgWh0b#MBzb}_*SAMhA%U(wh4niH>c9Hg8 zZ73<0kfP!9lI|j(GC{jj^Q`xyZo>KCyeJB2x{-P<5nx|p>w~-)N$XE0EWr_&s^i|H zoI`K+gU^{F6{SW0&0<#X117?UeuKf)XXKp|_0jF_B#N8a&N>az2U(vx(~MHVdoplC zTj^Kw{nsvkm0XCAfwqg$wa}ef4yKgiomR%_W25y#)8D-_SC_ib3;n&v?UtI7!)>V7 zsc&QZNE)CQQQbnKS+i`+d!()(?zYjsduD-y**tbNKeWXl>DiCFe1zOari83B>izof zSo(26BN82|s?Mu}Oy_j%2YR&nK;o^VW|*@2)Gh%`V^x@+OfYI95h~;PMV*{>bNc46 zri-e?*QqSWwj@d9HAzEYAP-t2LJqaE`AJt4)t{(0@YWcep!{vCWmp-K5OL*u9)x7= z{XZeUERrb0coufPI8mPAK@=a1mUHbV0?!bmi(GBS%0;!kdtLnDxiJG!#@a>N@SkyoG1h! zJ_7hOtPDjVQ*7_(^L(2C*a!_7~&yd!a!~{6@(3jN;n_6x1iHWGf30X2y zK=$A&Y+E`K+*09~8%7cvRP`WY2r1M-cG>LVyXfJJscFRl}ACVw|#$#Dm;IDcOWn(ER|V^2Hf zM5EF-9AS6Zlx&@le2joVf>AR>DwVr7hsa%53|S7D#rnj?czi+>Db~FZv+!WNMA~t9 zS4a)`;^rVuhoFv6Hf;Ycisb$G;Gv zZv5si4FtBL6D8oJoJRnhvohwohJ%@oxB6|9>njhOA0<3DX|xdJn;7^%N%Z(4m-3S84jGyv2=h*T>#p;ZqkYgT)xh`JxfO+6 zzTK>z}MvQoc5Xj%umC z*QaLPYh_n@qD&2zas#>GMVkv~TMq79fnh3&$HUmPd0#;Npx*Rw- zU5r}T+c2IxhA8`fB&;~@iQDi;B>RQ7%-minhn)nCpfp#>nhHrUN3~J!8yj9@VFFTx zkBf~?1u#qZ^r9+H!xGD4O}U8mw13+((;zD)5FrpXUpC)zuYaE2)Aq&^bfcVscLW2G zI>`1@3^tacv+UFdxwGEr*yG8)=u#mQvRn&Of#kr+`E>~IAKuI&^&NwTQiiEl?ZgXP zV)WtveLp~rCoIsno@d+ZS|^u}WeoP(NPJt0>AL!VfeUq#UtwyU#C5unIsYW*cE`kP9L`?EuQZ-%mFpG zAL}41_SA$~Lq8S50-9hh$J*ZfQ#^qTaaK|qgZuQ2jz9JKExNl1I#l2<;4MPUX~kAF zWlA3te!G}&!vd!(q?aj&Z{MfgjBl$@{zC7X%&m~gI9 zN8b10y`US4_ga|*%z_EzsG&Egu90lJ?C)%w0pP7Oj*eVMthh2ci2A01Q`5t4SsFQv zJbM$Y?~x)w^ruQ0!3r6PEtwHywFFo5QL5h_VHdSSV9?Ky{Q>;(Gspbk%TLsQtiIVn9-njB_3^dfrQv^h%5;Sn|Vml-@hG{lvTQ+^YtG!}r)u2Mh zQ#VDoF}D|Mb}_TZv}M=-3{Gz18H)*i?PimkU+p9|gbHL*+Vs~?wW%|#jt73zH99fhXgCdw1-lj$0d}r<$ zLjCg*PG_sD;!!p%?BLK?ECY0`uJEKu=lf91q&%-UoG#by+x^O`SAcqR8j5x}v}yOa z&(Uh>^SH@OJY64l$`xLe`NLN}sU7mepz$>y0eh^rG0dwpuJW_U(-KIn-l9)+0UzA) z*JHN#q7ZIu3Afl*th!aOF2SgPa7Js+R@TIy$Fw8EU03bu#Oc=3+d<@8if&Y{cW(Pt zi-2`3N@?jl5C8nB7tQSit1$v{%ihZC?q22}r%r6E0PF+r1eS~Kp(3Tuhmezqjv&;^ ziz3*(T>3$XqMCuyZ`#b(mjL9s-!vJ&Jk@&^mWwYDng4gwd7jx#uTsnu* z^8){v$CvP2VOKkzPG|K#P$fapN4D0NXFXr{*Is1rBsUo79lZL^B9dE32LYNK{rF}8 zR@1|jFTX?n)0u;7O39e$)GovQdSI~EJmfW?v$n+OH1IEXFiBL`z=L-?Ax-_%=6w zI^HSy+)4s0RMz(!U%kq2_3bf6BA*LdIKA*z-SdT$()loYzQOCWp+g(( z5!SaOcvlO_>209&Cd4i@1Vq9%Ulf|HNxg;^ex2rMR8n^Anxh>O^97O^0vQo>z4x*F z*0sG0>L2G<_lO?--d(K|ftW!Y)?`xS;ROz2h(aOW%T`WQnHr#C4_cxcv+v80+rib_ zIm$71#W5JsCh;TL<3iUjo`185*}bS36xMoNb>4N$ot#IAi5pL3iiK8bAra4`EO9}+i`|Lm)OaNO1Mm)#&y?w@y}a;z$t-p+PU;GW9q)*ogCZRgGGJZDLU+YMz(fH z#zs*0Wx)c{Z z#m{3Ml}8J5-WAP$;ab8T=HMyQVZGH`mh})#g6ySSJ!@LdZ<3_2JsfJP9}c;YNV{V6 z}2@sp3DV3>`2Ds^fp5a)Nx$Xt2SIXQ8fVR`zV& zdvD{*w1#H4oa0S44C_BgkAz|By8oy7BK`&+lOzDI6xnR?K00!{MC?+<&@|RU;}FptaN|0ePL8 zdNOHbRc?=EP}3HJIgR}EB9m#NN^ILPa@YJ)FC7rv4a4x2GvG!xrpRr+2fL~+9ti;Sz_dQP__>jD?4 zRjjS$!7Go0c6+6!_~3bzfI8Q}Y+U?4HspFCNuE578o_-yALH5-8pg&>vY4w$A7e`y zK2ciCt2;N)@A!Sn4V<#;RoMh~Satp6ly2Q*WK`D~pY~*O6-8p9rBLPQL93Y(17lUP zeLc_D!=e(`QE|jNeu_B~b(4cb!G~^#i@sc#GUqO+rKTr!1bsnyr2Z0hUmlTp9t=l+ zil?b;v;VjPh$drus(!aB-NVoyTw;+}3<{yKGp2I=f;#)=$xf`-q_zfc8VuS@Hcz+q zgas|J9m~`BxrPtc=QGay`b1uRipLCKCO8KC=_lW5F=jb2{SS4N*8ceQ>TVOKoO}Kh zDL)56<=zVFowUG;Sd4GFd`(ua8gWD`VuY}oa^hYyJk5WtdS0pfMmrD7kqoJYq7q82 zrtxo@0698ckInY?Bq>~vO3%p9X33a#I-;mAF^| z9g_gn2m~tAC(6@Is~F`cF_e1EMIuKEK@AUFcxH=1RuCQ;1j{eNEuctX?OrdKfQYLx zKj{xB+tbM^0wHlbgfamZ%%EvFneWTk#lC(AXwGAYDE}gIjrMvekk%KXN0Y7i8o_l%8E4rFo^j?Y-dWAE{dG-v}Hk|FY-ynUoMJVDeX2t9|I_W-wzbSTCBc(JJeFmADVfM zn4f(Xxg@+-h}hbD77%1Ec6H{%$W2AsoGRP>QJgGe67wEaic1W9xi_vf6?O|*+y7&ZL6sGw#r)2nN+x%a@6(r1#rapFo0MMY2q$?<H5Y*uc$PbfK}{ zsS$o>?_%8;^cRDE6-*z^F%mRdv}D7^{fQ}tFYn}%65iQh7eEOIH4Q+_RT8Efw}<0!xy5G25`z z_qV2$tWoBa)L5pJA6(5}Wy&K{sm)DwnD2Wi#mr|we=eineS#ZfSNI*?mWPE$CqGd- zRyhW->)faS_C}HX@Kcp!>xUy_w$I;jCGFqhwwkkO#uPAjAZZQ+KY6CaPYfUJyiiqH z{QG|XpjUkh`FUAQAGP*Rxm}zteVJ|+Bp(gM|&g|XRjiBCsJu{tk)A;MtiSHTE^I|>~QxI`{d5wm63f4Hn z!RIxO5kL*7P}O-YPg~C&N5uwtce^X-9;)%oo*#?a>4WAG2-MaB;{^SNCuVW%*x5M-u|2|*i?!Jdo-BJq0(?oc~^{G*Vm~8wy@z-gq&DX$- zP2Nd9nDW1uW*L6#wKI#EAk0lM?8x2gZLRb4=2~qh-TM~&bLYPA{+koru3kPpSVB*y zrW0E1iei8F^wrzs)ek}MRAr>5!sjkwZLRaum+dD3?yI%0J0pI&#n7IX%-r_eXEew0 zFz+2o#LB$W_&vZewM5e45>|tCs0u_$Trg4~sY*m~>c7*bIArJRTIcH)NdyqLshuE9go^TRw*+V3q@W~|lAbz#VYo!dej+6l6FZHDu zzpq>3uV!cV|4Jwt&#{C^Zy`2&OfUCe6~{zzVWB&CgF)C2WDnwXA6a1~CL! zY)O?jMF|!OaZ4@@PgT<$mP4rKJu`zBfW0m^Cp3|;sO9n=yYblXk$N=o;A(Vc!SXD? zAy)3QVOV~yI_0Fb9Mcd7)n@2y@xf+&Cc;|{0e7-60lgHU*%F5jnJWmN_|5g*KLwqm z2!X64hbzvKPG8smd~-L|?xwEKZ7gP0klq;DmrK@1PnRflbE1G!*X!)bE;v<<4jD&t z%c9^6L4#$Pjj0BuuLWFX=@C)=n^xIT0CS7H(*^Sz*%Orr5gbia5^5JYzP#He#=nXhvQy z{|O?%Hs8JYn?ph8SZG&QcFFESMgM;kuiiRm6uju>eZ%RWw}AYEZda^^zu*SDg9tPb zb#D|fFw35vJ22bEJK{*V%Rpz@Q0~6t{&;DPsO^Ngw9fB9!TDG!pmfFs4lgM z?H~&h?gIr?(Qyxqv+CoFmwrV0c60R~BKE$6X)`Be)z9EHcN#Q7_IgP<1yifp4kaK> zvszYxAR{h>;r|*Ztt9JC3wgG`Us3>12Y6Q7MsRw`XxKf>n|ofRqgNV(^4%}DFRF@` z1{vaI$=b&asu@0ymjE{XM>!2UlsA!;mlc{xSrs}ux=gA_Z6sHxLuiNl)`)MH9rir& z=HMo7&t4UhoNN!MZd${mluTe@y#90S9i8GnyIf5clq$N2m&Rj9_rl~-ifuhjOtvm0 zJZm92&4l${QN@FsV!r3!)4w3sAe=*z*lNIQ;E;a7&tyIF;M^DdP|_6x+C-2hQE zFq9}S2lrwN(S*p!01+ibs5PjPS87smA)O_Mmc^|MN^5seE}^7IQm7OT1EiqS%<*(K zYyvs|;VP;-woXZ~@yMxUz}EV=h<+$Z z*N>@U>h1=pA6YnXH)SAaK%;v|g1>W0iK#gT(LJdRp(p!2KE-h^xX1PF(aS_$g9V6a z$d^T%Hd3VRe?DH+nOX&ae4_{V_{Um@AwUhp>gxdeJ73o(AAQ%~4Cc$jnfXd(;!k5%__F$^G!B z?gOJ(E+RY{hdpQQVS$bYltOd<0xKbZe5)y3xONiF?!bP)<;eAf;T6g$$mGyS=~J_# zreS_T+gW&kHSP)j)+3g0Nlpmqu>yC5Erbkdf1)2d%FPr|EO3Nx*?Bi3`4`Dm`&xCt z0I}*9^dJs24y@hy9sVx*;^$tg{I{7zirZ)>qWVm5>hMGtC+!zCOioF+Wo zPiF?y7B}30nDWFBY|=g=1r+!u$GPRkjyC#GwAY?9e$e68Nz;~`FbwiJ46AOHio4=& zzzrUE?!DVwBaB);^pud1pLr15j8<)%9ljsca{ebe$HQByGYTc(vXgu3NJPXY(J?gx7crU}{EL9ljEX&Dsq+wQqT|gobIo-cH;zegOD~6$oO+3<75Ook z&wsuRK)?FNwc6|b-tuPhO6JOP*SIN}I^E@S5yxAsB2ze^PI%XOr5i(=VOvg<*6{rN z$QB0H7_8nHGfjo~XoZR9@z`W$H~Bev_}`TO#kxatxuEvxM9PXn`MmB_deq%TWmIzS z{F{N{<-7mQdA?4;xKd=n*!>8<&{3`KG}_)|8~Y$j9n7^Wc&n;tK0Pamm77y}W(e zL%ZFQ+hecz5`##7Neyzi0}`(9)2J+jG-Sbb)~Vg5G$0+D-#>1I9_=wQPl!|im!9Wh zyu8G`*%e*)lp5IZxL7hHBE#zv2qdh}vhO!D0||%#WO-}P!x>q6&5JV8B}0kgPEKtmVd5kAU;@*$lbX9t=v)OF1%AU} z-2JNE578f7qCLFkh2;hYgGTGTnxaqnWIqoPH(jniX|H0is@tFlTdivT9-)6#`y1_G;H24$C^Pb;k9EDRI)0r;DbtnOGB9z#^KNLLrmA*wwsiIpp@ z|MFaP*i@i^v|ZFD=Yr1NFB@ z@tw9-z^sh*)3NRAEr2`Ixjm44k&zXvaC0meRG1w4_1E}uZZ{FM;qG;0vbvsoKZx>VOCe)(_CBD=l$E zZry{6p~5v%cSZPUN*_se1p-2%7Kp21u)%6Z0a=|gWtuO3i2(n68X89|a?4XpJAifT zr@@NhO!X&rb7*9+@8FjVC_O@$DBlKMI)q2^yL0*Uv{0ZMso$CCnY6iIV<28F%b*Qh z(7>NrW;(sSKQ}!5FDgr||QzW$F;RGITeJ&xD@YZYp>}1bvsN&Rw8y!y6)G zz#i^EJab$F1Aha|Em${r{FYK;29iUb;H&>M+rqy!Q?ZLxK@}ImN0ICHE*n^)EKonv zM^6C!mut)J#~ybRC~Jd_dmGaKDca|`zQ}B9;sMGGUjVw%&-W0+K|&aF(ri4!p@iPk z9XLzkrDDkt#c@DjfK9R;1lbca=of^FA7MISv_}(!i!Wy0bNaJvygCX`?==lg@7nju z_w|7Z$uMJ#W8kS9k%h8^LiOvai_zvO|FIrw%__$Ca@`z{f09X&1^%3$$8Qvwo%+)k zZ=$cg2-YfKnP0e^hxaI%_TIq#^M#5I_ruCGB>PM63kKA%#mew6<4jr|l70PyN9pRk z;?KFzmUi@~8%z_1ts_C85Ick+FSB^h-@;q+tvs%K)tdOAvbl+d6`(9n-A(@)LyA4S z1%;sCWa^f|l|snWNVWr0zTMqbkl(-2vzCog$4&sYVWJ)S2K^%NyQ`q^h23>!(|W>s z*^|HH!ypqv`ID+66K?O)`^}`XS`+QD{c^clor6v}Lf#WD>u~L8pFQezx zDV}DU9zK4)o>3U~wU%0gQ=T>76jIKiOAmqxHC zT@0MDDoWe5#Re*d%OuE@Ku~ z{;KNtlYEC}xJvo$`6`!aH2D}GRU+j#G7{aIf=umi_1tl6vQ{FIAs=1PS*@>!>uK0T=iPi&+y<_}E$x#umy}Q@Y2_7dM zuztw7`a!dY`}!3aU0gBMRU^weA4zEd*aZbHhcV{&<{rq?ZG3#-3>i}z3U5BLmGK0r z;Cr6&_e9qz(PjkPxz_9L*>IH6lK-;&rFJ7~7sdq)mO*uq6>*+G2nyIWRC!$JaR~G3 zlGaVuBV2s|_?xAcXB*tO=PqSEyWF#t?aXEBLK8pKM6z01Go|qP1lZ8u#t^|IOQio)AOeA8TEZWcbl zq@-QUcJ64~%qy}`nEWi5*(sAs_2sfj@}%_CeIBo!<^_Xc(d6=e)^Td%fW^E779KRJ z{V7N$^h^$k4s!FDgywfPNjn!G-9Jit@;tkO`hxZMR*VCPKbGy;r@52U2MgG2iL#qs z6hAL%I6dx?Snc$h!{j?v#hVLk(VrYo>T{%#3y?jf_s{bklyue!9j<;|vN`H}{}`vG zgQ8)}(|lCWqfXPF7yRnl5pFdj@yW?sl_B-t7IMUl@FG%?Z;BbwKC>``x%>)-l$bTv z7aV%91H-t_-o8`#jPgE98y^?voC|HFXj-|dDbqXq`OSb<=n zo3Dw(=?~{0y0-!b8`+Q7lhW$|3kGqeQ={MSP(z&q2K7_c=Q~(ktt=io5|8Se?*x-; z@DqYHG1lUE9})@;0tFb^XRyR>fHlK#A%T@4_?V z^gcxw1jmmkB0pp7gW*GeU2aH^G=%24wCy7O1P1e`5e5S`q=#M?{KkJdz+_QuwoqD# zmy28rSPV3aU%f%9&VjKBG8v+;4}=J(pGGF%ZiqZg?&JsdM5w?zYplFUFMqOcV)^t* z5$S~mHp2kUZJqr3U7fy_WX`nzh3%Yo)pj6v9{(?QX1{0l5g0=%3i{Os;A6eQw%Ata zCANkHLpJ366hf}OjN3x5B9T;5OhqN-6_U=+wev(GO40zzg!vth3rO+~CIE^q)@P_R zz7J=1@IJI~-q)gx1&ielrdZn^-pTg^8jbtS`s2<=Eh^>u5dAs^sUjtG9NBr>YyE8o z)F(`=eaH^`jVUW1p{mJu$u4?OtYWq_SqJHb?6Na=V>$P)5xO7WghK;R&3%7Dy&xc} z2W2K$o3Qs}pu0oK#c#Zztf(;GMx&=eixrO0u2DqSh%7fBrloxv>_Tx(HVI zUM)wnQ!Y;bx_SI^TqO^O8t5; z3A}3RSJ0Ie=8f0CA=k><&l}K)qutBAbpE4w%=SDsTMUDOv1FAm9Di@sh6JMf@nS4J z^7mvD`}rUm#^Xgkqi~3yc>H;k`n?P1ZlInPmhqD62G-G{VSXO5^)!=!w{;7}))o)$ z6PQe7^2s0*rTLeG%>zp=&+zy~Ew?NOPwxQXn>LXfKtVOEP%j6*++ZFZ@r!7S?_Hbn zUNPIk^}StB{%1R1cybkHR)I`A%*YU1cG6li+Ids!$0`Ld=_{Pz%d3--S#JlSa_36gh79l-czp z(Xkp2RUu81g9^(Iq4>KH``4~&B~?Gmxw+zxXGFMN&WCjrt^-kw5y71j3K{LlV46Yn z-F5dUsz=;rv^@lyO8TaVeCa4${K!7>iLzODl25r7xcxAXUu4k=ZiFSG8!}9a4u3=m z*lYUsh+**Pt1(a5+e-zxCRXEQOJelo{?bd$(uo|fg_zj1^DU#XR*FjMW#m&yDoutj z0AR*R_i=0jSzr~W)44NsKLX1W*p`5v!iX!P9YTUFw=vMGyGaN;39IYwm_eZZ6g?CS zS0=)^iLB%8Ph23Of3U)mBWUc;xL^HLHJ|c)DB-G=JeffzUU=5)-nbWF8IN{fK`S|#FW1KoRE$EUvI_OwvUmOfVlS><# z2id4lbiI00u=FsgUOhqL?qS1nuz%gu@mAy3Ejae*&I0eL27wOq7O`JvEGf`%eQRN_ zPd!SX6^(Ju;ra+GR?kCw(XA!O-LC~Z!_(%DtTLg)U+MR0>W>W1_5&~Nf%S$Dj^L4j zP0>Wk-K|^(ryWLoGHrvpm?ib5%bC-2L{}@k*W}r0H0Iolb_E~JGI~o zS8UrbhayIU_(dXb0`#Zfr}KMIKdx5O2oQ>78%SJn0 zBzkU*!svX$G)L-5*X;TURp8^UiZQ4lg=m!=?UksNROiFP;1Ba-h?7gJyDmy(dX&Nx z|L!3WMZz2Uk|mcq70)Lt9_&e`#A=q#Ksm_fQt2#&!00?QNep2%D<+OQc%ZVxp^A~S z#7Qcti-IODuqk>ln&+ljACo7REpMx`w&0!X-zMI*u2K_*2S%-J?q-)Q8|MeMo~2hy zC4us)3K~ZFA$hCy%FM z;vJ=lhml)R@jyQo5}J&YU+b)6lari6waeAS8p-b>>a#iZTF9_MgKW+sV&EYcW$oHV zKdRlJi2BOtL?86F1`~-t|8raLDbNHByN)@DB08J9zvC^K!Tkd5?t%@2<&-(l`~q!g zM;$}SoK+B{?a$zO0CBd`P6+DnvKPa{7FAatE5OPykmd%z*yg^ zvsdSOor={6`#Wf>X0vX(vqd_zUm&m4D2ClPI{D8bMDoLZ8BShBlw~4r$^)5XMwjr- zs`E};Nfx@*;?(czYzf5BaNp)2#W|0+fkRFz?BhZS0`|vBJMogMVP}z+>dS>OYr!(3 z%&TF4DHViGM zwY9f$lQY}OY2#(}n##HTWAx@|vGdM`;zM6{Ki=oEB-VTT6Xmm8L#hXA)rqrfDdmaiLoc?pH|!XDnqR(sv)H827>Wt*&gx6Q$|9#YUvm0 zzT(s$ky?)y8A|$Ja!^CSV4JcxBNhB5x34?Mn&?Y-t*DQ~qc;x12Z{OFdM&ZPUS#;s z3XSd@Z_nF(=!$j?(?&UE?Xl6K9O!Fxd|YMZ)4BaF*XiuIqdGKI$z6tYcA`t}~hB4~@hJJl+zMV@}@`y&*W!tVa2-gk?cI4WJ$NfD*jy&$dMy+yr8 zt2kBaIvrS?;(ZdYc%sSRj>P$J8GfnGD$3pc$84n}kJL(By-d=L zI4}wQqorl0SYcTIer&_5X{I8QKSU()eNU5d1yPD5vk{nvD^iuq)2>teq}YD8Ech(K z^KOp&m)6fq*Q}#8!7!nDXg_pRZd{?FP5QI6QrZkr)t%nNlbkI!z0&tj_#=Hpi0)8f zQ~Cst8dVzkfx~_Z))a`2c;LV%{3N=8KDP23R5RIN2Y=G>@@l_huPwGeXVhYJ;#i`!8qrj+z_`P$>b@CSXy4^k>q9=3P?coO}}(o%C9jo8N-d7z^vWx#P| zIwqQn04K;?Idwpk%oG{ka3n9L2Jq$c1qrY@)bQr3n|Cru6^wp60uvk4M~*sDJDl0o z-l3FH=3?|KjY_4t$_QWz#mKFL%XIyIXOU)D+@(%AWc-Gq6Y|p19 zTu8MEgib?S}UPFiN zO;FtuaytIHc-kBeUz~1ALw1ck{K#w_$z&c-qEvzNZ$u3VnDV4CCnKmDaFri&%M&%Sg zLnw~58G7;kovBFehzZ{`LglRnYooN!&#cQ5aB61U0FD-(WNbynXL z?V^=<{cMfq`ELFqAf?uUdMr;S)OzVL)WH{-=yr(I6;3_JSx z+i1baDbzM=hYPRD7~TO>4Q>Vqa$bu~>J8UczrRmb`uET#s2|^1!0*nPXJEK!7qXBLmPUmnlt-Ruv(v!J+Hi;pi~au0}d%z z(^fvN*UdF`mLTaSEQA)6y@^CT4qe^0*a-#~k9cB5^f9pG7&830NkpTV{|XWQ3mH)) z{5`De85(#>lHtb4&wlfJaP8A=GbCf{X=sx?<0WM20d~ZR!Ttt-#y^!hk(nb&`VT~$ zMk0KXQRh4db~Dv34rD((b>xObgh;_`R|?rQ6TML}_rpl8L`BO2f&HJ8(t_!{^65Dy zl|Wl+SzMli8S}DV7XE@F80rY&PPZpY1n7$$>Tj1Qqsci#PEn~WkS`zWzI3C>@#6L+mghI zZmOfSr*>>YU5^vLPm781w3uXbdr=I?LYmXs?hcnbrm_4?Lp)jSXoun@uS0g(lXHi89BSj zrM5y*L@7y#TBhh%s!}=-c2QVS>AewP(=F#JX8yn7_+NBh`q|an+iTTkL@Hk35N|*b zk_!(4C~FnU?~HWon^T@h;>pZ$pCl8$e@mPfW6TdDq+n@wOY4&_Rbxbk84?%ybrE{B z5DcXdrwH6;=(z9%wYUhyreAPb$IT;4M~DBBY4z0fWS#vH@>^N+-t=eQ_5^Z)=8C=#q z3U}{hB+;I5sMteNlI)Mpj8y#(C;PSRgPVs3*bRT$$411V?;1k~za-R#MB0k|&IS<8 zQnME)mz;JPfOl$bsm7q-26|E)jktR$sfT;GXoTIx#GEJ`6v_DWLg{dzJyve~v`Cr+ zB@GsUfAvP_jx@YFf3Q*+k6g?dYk9t7Om4QZ{+LaI`Sji}QzZMNvFb+>i=_AE1|;Nl zLcRha+Q}{Uh4FC&#l^)}cDuW#wTSKO-TuHb;w<X7vY7-_#BQakh6g~xe9H>zQsIxE`x)9ywX%2P$i7c8UhZlcku(xXX; zw;&^nki`JTKO=#kehUsRSw$~yu)CdyuHj6)_=M3Bdd$;BnnezteDTw3P_&3NyRR{T zO`uBxYE?CqRivyw$v?ENTlx6KSjz?C(uQRV+ASoqIFp~u$&tHUx5+z<4`W@vX&TQK zKcrMyVKYA#GKcMrgn@U`^e{PRi>qDO&mDzKYo+^M%+Z{moWsJ6)m*O+bPCKE?&JhQy>-8 z-0Lk^mhCNSvHj4he+?0bqSm}Fw^aH9dgnd)UO3VZt|aNL)1rOW$pD@HW%U#p;4lp*L|cNuWtv#CUJ^$J%L$(_Ptx;k%bV__KP4wW-`iILewMQ-D^e z?}bATSJp_#m?^8(0f!%ObJX)o>w32sx5?%_iqfjs=3D2%rauG|VInpfCwBC?FSR#y zBGl}AZl_Qob>b!l-0ooioWK{kvbLvy#u9oin6^d)wj-octDBd-VS8jm)7vl5@Jh1k z_cA2ax5e3v=!rZ`ioYXW{c@zvB1HsGDqZuY^Eaz@8tpWaB-=_#HA;lR1%6*pT?!n) zO}zN_X~apIwH<=S2qPDS-eXP*5DoamUke4x&4B~!TnTGe?TlD z>t;5NI2!tXVVk!c&Qv%%i06A1(RKQgZ0jn5-_~L~W6aiekB(PF1?YNYsJ z+MH#E6*NR#dIN@+T|I#amOn@7qfV)AtuunYNkPayN0|b#U#610i`f?gfknEEHrnkEL!wY9RXYSo62)&ix#5I9v~JJ&FgYScl%}a1 zf8+b3^gCw}6)zr?T4%yhpVaT;@uqEOF|ig3lqJo4etq_r#+jMcQe2|D{_9i1hTRqRoGC;pHx}_NL3Q!2kS4!*>evN2M zO#WR~4}y-yXXO7V0-|#OF4XILZBQ!tanS!Kjs9O&4H4A!bbC0?XhR?3Pdd;|lBI)5 z*bl&v;w4fP#pOiq>wz7!w2B2KTNfMFrvJwRSR0JMMUN+!76i6Bq`L`Ro&o=(y+IoY zhLG-P{hw$Bctymx^5+S(o@N$809uDEwn(ehNgg-hN2RzbLmala1DS2Y-snUoSNh4` zZ~ceR{V6fUbAVl~=##UW1BXto8v9deos=x@?l*Ii>^-ZuywVrU+N5pi77C}*g5SFB1ma$y8=>hV7@lBsLywI zR|78Ce+&kra(I=Us0o`)477WQP}0LS-rn)y?||U)qna5 zjs{wIV-Sm@;eo1Qik3Sjb&WV^uqt)%&t$Uabj>3FiN?M3m;dYPbJfrDum(TNpkMb_ zuYBH15e8cx0-W_m!O8FXKU9NaU7Ee8*<;ScKaEiz%YU!jo=r!NK`)Mz|NHC)uAPh_1xh3> zZ!yM9^nFgziW?~`kupQ0p*N}2JQ#X&t1Q(>qqLzb3^t z*XH+LC&urwaFQp;KD~^ja?mis3lwWq>ES?=N_2Vrk?)(#8dh(2G(#-jMEq_S&6V8(oVk zuP7oGfw;YNXiarA%=wp7(^ysF1-)n#*~N@l;gV)+KmMhaSGfp?xDO_haLDeQc4Ar% z-P;k4n=0O@iZBo&2;Rm?W&KxhZ^6oO`-GoFCXv3oCyXDmU06mSjMPv$pI-MF_d{WK z&y}Nvqj!kfORatFo|~?L36sGYRHrGmJDL+ScKq(2Df}?P80AdJ<%HP4?W=}mNl6_m z(ZoTg(LfCdn8@PoCVXze`r`Zu6eIT^Jye_2=JtLZ~_x8{Xe!b;F)5vS0+c{U2V370T*MW(pGZ6rCOWw4Z5*yq}L4 z&?ux&#IQ0&fKEZk7ObhC8B}Lii~Ikz3;q}9h^Zh*+hbycuIk>zYO_ZnAdcFBQ zWUJx^+Lf>X$2hwnj2zBCiFTu;TH?m^>1MxxxKuqB@V8WUl`(?BQ=w6SQ^ZZ=JH{I< z{_S=&^-WGI3Q{-;O5tFapVziTqmlLoj*ZlULP@nGLj0AzDgT5*;I_*bG6$`UF^+f{ zJ8Ask*K!mTF4bQu5;(h~sXwMG^(6#3^82y*z1`KgOvc6ec9Y$VyFR$ruK;Xte8wiR zA$G0-V7J-iU8l_&p{(Xt&W|Mih!t)M`bGLR&XFUhP%MuW!FD$Xf7Ganq;I#Ad<^ynQkbNx>%daHYn4rPOv<%e zJiUb?O@Vt6UFWMjTG}$7C7y4Lh>xLVoKz$gJYk=`)mtKhX+kSeZn!&Jal^}lBloqN zk+PH~1CDyJ+_$>wuB?2iRD!jUq^Ftk5I|-Qw^Jg=*?uI%Ua(WL+CS=YHzaGjLha9f zjrKc~LN+rooq@K&Mm&>8151GW{uifG-|SeAmXd>jN1ftMp`DrE_Xmo-$bFbQ_HWv7 z&!wA8{t~MhfZ^|H5^ie3B)xms$bj1un;5EiGllI;9I3Swp>{OKvO<+M&r@TPH{Dkr zH;m%StFH%Kkn8W)nSql|?>t+Z{c+HXmcCS)CULMa!e(ZQ0*b&up{d$Krj~-uXj)(7 zXS>9~BsJ#YQHOdeaTNKRMT<{;^zR&_uswz!@q1hvP|GnLK^esj^GK{o@R>&aSOg-1 zrrVlodsuTf%P?qo%^b5Xkp%4~ey3j5XR;F0_2ngjK77tlT`*DY4O3RJZ*%;vXB9Paknsmx+`;^56{zspNmYj?+X zps5j$<}F+|jqO6uEJ- z;%Y>-x~+x3=BkYr9Pk)S9}ka~kFXd&6rjmQk`;z49vna$4aSzFl8I0?xUeH=e6ek|BK!bc36k=mHCJmlVv6}mV{9~BQW}7TtfE8%0*n&kp(J-p4IdIu@)Z5V zk|*5aQUiqJdd1}TjO$nanvV*Q?QZFo$QO)-WK;3jZZ`m46yoKi!*erY_4@-#=V2Hk zGoIno1ROIS2M29HUVqu(EP!&?`zcnAayejj1;Qezw#lS@}O z-P^z6#aS#xsc8=UtM&)eo&?R#qg43WncWpPDb#9c2{OtA1(IoH5WL>+JyOSaxkQ;Q za5u+qFUS=uB@i1S0&7erbVJgCwv)VuqiJfzB|m*7GgACuvth;2D1=LeYXW8tMGfSO zzP5Im$fXAIx<4QSpmUfH5jEPrtE!oN!RD=Sx(<4h1a&H*mt?lw00rMrD{k?geJ7#s zra0b^@AvWH66~lVXq7F&&0xM^2h8uDi%<$5Q?uLuP8%AizOu?;Y6@X#)aU=Tt)ZA8 zE)JdGl25-}T|9ZFv-FRvf-SGe49=32*_yP=xxPPkQ)f25kZ7hT5|&W?6&--?MPU)K zsB`f|!+_%5?(Vd=vF|7H@BpnC3y60X2O{1FZ!eU7b8(wfR~kQEz|Huojsy&|g-hWr zEt0myh&pj2vfK!U^Jf1g`VFW=-BV)hhE&O_gs~)<=bO#v@(@^fEGHCulXvi~6Df3U zEjHVJnqY+0Gk!^Fo3lyU<9^EeOOw)n5RC3vZp$V>B*P22 z$A*GqzI~G>vROo-DUdmt91q!Ro#?sbB0s1DzC2j2M$IE&|Ir`Ed#n|7#q|W{0Oe^+ z$X}ix7|2u>MbB|O#o;sBMG3T6J z!1ctf&){`(cWm?V@a47L1#Sg&Zb`Kr_Lw=-fng7q^dSCyd1fwako0cGl4rP;C;e~N zUP1WYlc+7B%(L2#(ss@RwL&U9(*gy#tzkXMn=_XubgGsXswDN1it&%JPIl*S znnJnOg%-<-XiKBkKiVntc&A{6iJ^$0y6?OtWp^tYHwov&9NrvMSpGM(=t6?vn;Y^~ z6d%_@SQW3#`&Xgb1c52h(InCdH6rILf`OKpd1xi~Qjhq7s9+ zAZco>KR>D9j2M4@7}a|H?9UW$5x*T^1HKk{-ncs8{O> zl-!)?xVF24k}AVwv$!e6^GUg4r^+J23KjXt^hSzLN_W&?#M|4xk`~1U;E{+R;(nR( zl6y;Jmk*5b+~N_8W72|;{VwcR>@DJ`BpOj#0TkkTsNlT8k84{@)24^n+NrRBQ(LYdqQ#e-#QGs1jvAUEf`-zue#& zNtH!Cjq!SK=W?=~i+5SC4SWjqH`9Lmted0+aLs&d48u>H=V%@TLA6u;`y85gip$9|aFqO$ngA6vDMa>0XKzJk(C)?or6HNB$`>-K8IN0Z#yNaa&GNwj z$(A*-ltzfkG1K5iS?ly7>^?u3)xut(Vk6^AdeK4_*_=s;Fdxt;MHA#O9^W_*&GEB zWcWjfx&p5iGnv&V9JE95`m3LZaE|kL*Kpg)VGEH1)%8vBdHifFlCpqQ)K*F$auVP? zYeW^Tp8mK*EfrB1>X~7Gm(dFY%qsjhwvP5AvMdv(!|@LZnu@v0ao{4qyny=usY0Aj zfyER}jOBiajowx#gdGD$#O#|^ixVye@=MBrBeQ?{kD98HA%lAz5dkXFZU?zwnc|Hc zUcfjAe-N1S0Kk`!%+V4Tyr=VsadN^I<#!*eBgSP~UwXbJXY#?S1U zJhJXY+!CbHkUVOxKRA%N``Eh$1Y9jPC(K^B>^Q^ngZlB4wCM~J5W>uD)bX@}Q&U?_7P-GIj3@o0bCWdbXJ5vsUq!m1yoO#W;wXDVg-ADXoGzzH zFDC}w3nuk!aogIegmuIs(CZos;O{bV=^^68e^?J##J|NZreBg;C;e}n2}qgrpgL&M z#nGjNaO|}*MTqKAQ>tG%t=2%Pik9!v>KLQ@qO1l@vQgRN4d*L*DNCfwnDawXhX`xZ zvcg9E`r--Lv@rfiloFTP|2tLq-y3=M?doRU{EX8LtCLR4T7uPXfU4eF?o*;9mY~IT zqwv4+1aKQ=ptLtz14euHpUcvVES1rjZ1GCe)99Vm>K>sg$$shfd1-1)eUU}_Fv1!{ zui`qiHCA;sv|!i#p4Nc=Ez0AkDkeJM=nB=&*oxk^Zi(KxV?;|G(pHDcWu(kh4iLp+ z@^syp#^qmiZ#@?8xSgqEilY)-lvKoG&mfKJ1G=> zIO{L|+MZuZISVp2w_UVR)uI1q?o zCZFe;oL#LLQV`QO)G(ph3f=By8d_#$6+(L;3}^_x?!J8PDs8?sd}(;A!^%9F9}M_( zi?SGm0tc6!{{E^^$U{C5lcrc4aD96~Y&n3)ST2#dA}CD43GI9qVVp=sBHGa=fB!cJ z1s|8!F>Kk-w$usfVrjVk=ymY<^K_+(tbpK~K$6m7u(6%MJsl+Ub|MiGA-eWjTv*_T zf^vnhNX_F~(sHkVpQe6Exk5X%>3n-S(d$NUEpDA5{pwtcoAhgosW0hMY5ni2IaxlO zxhu;+j<~Gf<;?C+k=Io1WBDJmu)>1>PIG27ZMJoz|9egUp9ldTcFp}2dhy~Z#+JMN z4uTXP<(TNdOHim`<(_i%dV^9}%(2$`B^>gaJ3amHRcNy4hP?Y`1!YhqAl=vWP~y22$k zOD2nRxBFSHI&D1;&-Q4wbFJ}k|0G1;87RUS!rl*J2v>;O{04pD$*58Sa5owhD{{~( zXac2+6w48=vB9adZrS?4&#`;vSAi~LX3JyuW|(8Zzqwu|s>|)e7o?0fpPuI05oyPR zE;u$|Ca!=kg-P_^i3o)Nf$TidA87>n>e!r>FD7kh`GlW4D5+ofZb}Om+rFzwI`Y9% zNq0gs$EcH5@N)D9y@(C!zMWnD6l+VRPby}GRVDi>x|IjgI6isrkn_ikKs^oEX{ECK zdm*M%#Fr~v*N)?xKilTtu=9{M-PCH!2xUG{PH>5hY`eYKBBs?0oU?>}#nW$^b7}u~ z3RZv94WCQx>JO&Iv`7r|>sR;eizeyN(s`PeviM7uV_EGGex99-sj=Szm-|(TT|5qv z){c^AioMrQ9tj%^|9p_pJ0U>9ZNHY;?d%!w;29e#kh<0Ut~7Is-Ci-h8df`3qF?~9 zJ>-Xc_moxu5$7H+_1oa-YJ&-AqE?Lzli%Lr!w^RSpO5oWeYOg1qAo6$d8bJ-J!Uq_eyYe5A&k0r9Uls#J zIjMpUXf$!A13;XTqp5s^%IBNrxE4+uO zPX}fjF3V&fpYg-5K`8-qxq>Ar=W_p&+9uT+1HJX@JeTLA*rp^`BS!Zp%K{anQ=kD^ z`%U)^1MUzOV_Tss;~={# zc8qUJ*LJ?$l75Hm58ZPV5xY+PkCR6IKpEKop1>~y=dRHw8~ z70pzzYzBO=hvLY>;o(8<*vahQRf($BB$8hRj*&C1o_E*wftPQdN@YnF{w{39eieKLL@LT!@3*kOPX!` zXceMJ+0I?Zv%ynmqxNH{4Ady)`x3}wgDFvLJF~}Z45SD^Vns;GBWIY#O6coM%G@Q|92 zV^vN9S|Som{$QjpVMl)TCZv&g(MsB)qk3)zUb_st|4hi`O76pmIA^TZntaj7By>j- zD7TuB;PMDAKVB|7$!ZdC=%WizPjLl*)v3_&DajUo6OSid*Xn?p#SkoEEKieMYwFSR zEa7L12Dax4-frTLN`|uDG1DkDSZxp@$ixzcA`(WP`BZdtPZ$oq;j)Ea$?qW=xFcX7 zq#SaX%$b)VK8)7VH1sHHYuGC4?H7(I<6#cA8@U-|@Gig#lS2^`bl(j^yRvjMGp={H zRQ=b)?Sk-iY_;yX{cAv&g{5|1^6!5`MY*~iLq~N(r}m^rT4?ur<5WGF3j7U}y|LKf zNc8|jNWEpNg;aTXwT{hC^(184(|s2>`M6#ClxQT?P;qK)J|zxKc;P$~=v)33KW)3rDpqxH~C&HsC@ z|NDObvXAQMuJAgpfYJM?E3fM=eY=if_f`PJg(u8l7enkyg|XBZ)e(&3M3VJ{K5|H94K* zF&Yl}0BzlwgfpPCQ)qxj)7%W}d?>QJ^f;RA1-}Bi++-8ch!py3v5fW^kGTuDlsJ(< zG>U+7cC*!aGU3u!uBV=P^qTr(M32|qs2`&=_W#Wam8#zyEM=>{w^1~C-|U4(T+S9n zYmWVvuwcib*9DV+^D9JU60z?tW2C+NFQNM1xH8bE88CmEe~}aInw>=lWcEQ!r2Co6 zxRpUWrHTLgH_fUhNtk;BM-YOT;FYi%onGx`{Yu5Gvjh*3!YU*SDqmp~I}|jZ@}d5=jUvXPFQnMilZ;~kVSTQc~GujW;BQtje& zOaE6q{@=`%UsYgh_NB3@#=^%T)GA&R52zp&FM~Y%8(~s3OP_Jb)E)AxxL{qMD@4ol zkCm!7v!F&SnQVX@)n%RI61y^b>--wWDjt99d1r%lxL{g;P^f`bVSB~Q%V)R%UOP@+ z%Ujc@yyAnue#us;+U)pg$yqwm~!+rQ&q*E{Km2X3xgathH2~E><0`QN^`w zA5LP70=YcdQVBG%IzyhoyZ}}eK@y_dU{7W`mTo~4S)2jRN77JkX&g}iV6zSdd=r}i zX)}d}yJO#6FMp?u0J{~%yi;d`F<+m@o0lM<0D0u_AK z{i00Tpp-ZCC4u%{e1Nh&udbZG;Y(AcqM^E_6j}J1gl{Ri=Xdg_evtGPX9FyXihE1} zK~m%UM?V?y5w^~0WM;3Ne})HgUYO3OMD#r}6uf8Pb993=xvj8x@)QsbL;W!T*2uC= z0~iLv$2%4h$SS;j^-WXl{pWdVQIZc%2)rJbuv8(x%W52@Oag^)=(UWKY6cOty?r6l ziO2!3aK*;bXQkK!H`2W&_8tLL?tkccdk)oc?u~-85ft|wj{@gx6L186f#vpcRB+Z@ zf%Jd6NQ0Np&$7$DPnG|$MO60%BRV0l9()hYt(0{#7*!q8xsbsXf_sI7d|0r53os-< z1b<&AdWepp$-XG8`2Y_#+O+(!ihCAMFjLwiggx()Tl63s1_|s8v zSS^WkmfZA#r0bgUAy4r0Mbi%6=;nKQ(T^CUENg7`=nJveC<7=*V1cRN<}6|{k3q* zCtH8?)#fD_Ci;wqOyic=);ooixd*R1^lG0`WcF1uMx^T z+F|9SxrCW97p1-JJpotBK;T4u?jF7V^Hn=pLgRAC7b!UX zqN$Jb)hN=ryD1$%Yb>U=hzfk%s9m>2ceVyv59>g?<+x<3sySpv6@EMq1l;jc|rTRgl~x92Mo z9@qCpRTc-^+>rgK0cZPdeD$@71}*vj%)|hew1xe36y$>{1;}?C(yYIv#9Pxe`}RKl zXJWyE%@L2Xb-!$AZkC>0+U$?Yf5pt_acv`sL51M{#npC-5(E8i8FuYj|u`)L*uC# z&rb%dTjVWfWs)2*;f4L>n6}S83U6jpaKIS9^`-{9elEOkIU=qX?#5iL!gLj+ni6fgy`a};z6$K%T|jn^uofSaccx_P05GZkki zAVh~-NX+F3OJqe$isK$f_%Z4aSiY=Ebs|Q>DSG-Fp)GNm_8&-`)*0)20fYE}T*(5mFT|)NWepNnFLokE!<|E@RWGNjRQ?c;fu9=S?VC zJ>K?&3DP0*AV0>xxmZG-k80O#b>j6YFr_8gyRG0Z{pSY^_FY}DiFk<{14@GEi|l{? z4HRI8&$J+frKpaqRDBHbr5uVq%ff@a8Tx=>*By)F{ce;R~c{+|EBZnN<9Ti;&de@p0J_CJ~hT2|Oui4gYL z&EP2e9g%8-#Q6OKXWn&j%BZUu+*`&Oyp!srj%|FKb+?Nm)k>9P9=0M#71Gsl$XQVO z_aIde(AjY?#swvnVpG?~p|x-~w&K7_q_pWJdnf>-DgSFLy8@W$l;%UKTk0$e1^?IaPwk`6DRxsUbmUT z0+=%VK??7Bf-Z~EXrPgV94LU!T(i$Bng8a4(|06P8Q<2b-?e1#odZmXn|#%!V&kU@ zwXeZX5MUnnyY;6saVD(DiVJu>5^N6Vs|z7rvFAifi9BwnYvtsViSkMPOF)|NcUF@K z^EFKtTad2cF8}AJ>!O88x4u4VKK>5)197-WGf5o5A#X@tts&^Z4W8pLi@61>C}vO; z_r@ZjHmvOwVl~`T)7$z~J+z9N%mX-C+QqimvlZ0~_SZ(_D`g9n_cJ>@uo*m89V?q% z`A7MLoL)C?k9b`Dw*YNceinHkj-D4V`vaFWr?~UG2E%3z`-gZ+$cWsBT6@BLLGw&*+E{zzZ4;vI1F=UUuY7^4E}H1@6gcvsP1`t-C3$- z7u9c{HvJ4rQzzUP*p2>o+jouNEHt@uiQiD`7_8z@J5z7mdqDQ-Ofr~3<)d&H#ui-! z3r#8xi9|yq#YCj{(Ha=CeH;=b!g_U z(%~ra)v2+4xr^{Is^a$>eyiSn&znVZ$LAKWc#Ym4xcx zzzV$C`P1QIeKLn#2DB)uOLgG)e6>xii)@JhdIx&WJ6)#9H`^fX+y3d%3!03HK?0ZU z)&BCuQq$i@@(&g(3wzG#Y@SnbF#F%NITfjZx|I%WgYh87jSaCXS|VR>#25JxueTw* z=;95{<76DM(wl4aIyo)9&GHlL0UCb-ADH00Nlxz=g#(f0%*z;|a%bZ2!>pAdNreU4``ok3{-=;>d5!{;NslL05OEvGK#+E>>E~vzSz$>D;^| zR#X!CRIA=gzL!mX$0s(b70`^DSzLg0>e%;@D%m@Q|K$pzj*spijxjwZ^$N$)WOy&F z8SDnru4QrgO3PtBxTSLeN`{jVy zdC?E&TI0e5WOrZw?xxt*H=98*{$6N)_u1Iy;iX}ZyeYu<{`>wh75)VkfNIV(pp-Wr zD`c}xJT>olr0a#psUiZ`eIp}&MjI=MoxOvDAmAy$XqS%tWvKqoh{P$>aZgW5#Ku!3 z`vBqNl>hdDa=GJdJIJ;RfD`-*ecvG5#esMcdr?GOl825*qJ;n5c+1{F&F}Z-6f&7bedJZ`w3!y3$KhN zexLp3Nf<7p{mux!f+j_gX$hV90@}2@FwGNKl>`88l0>XUq1?AWw-;7F=y`Of`y=06 zs!b9czl=4qNoj88mdoUea6Q?O9DEqR*!;9dy-K1%VQ>WosRozhjC=Y;WlNJcmkSs_ z%=}H#_~#PEqlhI>ZTBYgP1N}8n9at*A(F8gINQ@_p#73|){?d^DwbwuI+j;gSI?75 zKmt%sEJ==>jc-I(FdUUM0EE5(bj!C~>7n{1D)AZ^(XThc7>zMjlECK@9!uwnVTIPF z$v+KE{N*GFYzcPUzh*c+*S=Eu@1ZBhfgvh1pDD(k9Z3$5W=VWLk<-;I2InbdQZ8|; z`0iP&kaf%L*3YYLFllf7><>n#um>|1!f_u%%Q7}3&U7Rhox^S=UbZmQ0?hSY+8kXn z9?+Kg(kF=ZypK>_h>@3c-$hUTc4*4N_1GQnzB5Uf%}aU1mDMN1VLwa_&f+x4TnYx< z+S=?xzbUk0^>vGt6gY#kMb9#N!qML>r+LvjEIFUc_&UZJFMgkcO>cARj<1l8Bfy)i zWRfsc5!)Uo-rO}jd)%avIEs549u?xH)h+R!O&Tpw&N6|KVOo<>qRLu=omMs!Vy<&Y z3mwqj>_<0MMa6}kSilY){tm;%oNc++rO|$utP-q>*nS7JM|(3EM7WFYYmg5SsSJ`; z_sjPlziL!s-%PjpNtIvyeUPxC9S28nIvKM_kBvHJ^+uGEK`xBMYx_J00hkUfI0E|> z+?=o9)PV)@s!bv;hwyVNf2f_*4maB`X=6)f6ew*iu3-wgQT(qPD7{kt%v;hnKZmJZ z%%fjd1Eb8klZ;>YUHxc)Dw@ydv*(M9H~Mxg?P2Eq!^1(=eZ2gQi2dF}p*p{Gw~(MYZ#*k_Y-p=M-whh7}7h<8pdQ~&Xr7Z-e+(uO;fZ-q+LncwVCO3>e1l9@(T zH$sG3jDL6q5M~G^#=%t2qXYKIxq6 zEY~up2~tlNbNWVe<+|6vz6w$aIzz{6!1^AEZt%EbSg5yS9Hw|4=L}M*;lW51TO4f~ z(u=5DpiIdOm;~m_O>7bxW$G0fCd_W-3z9i_^*f_!X_FDeyaeDF#I1){I~mDuV`50n zgMFA)u0#xZRmJZpW}3X{>!MPSBU{x1td_clhhKrClduhV(87t?lM`_DmY7%8;%V$Q zDm9RrD!zn3&Rg}wR(9jz#8H*NVzadlzXEq29v+ByF|pxb=fsa1a2b4YJxK-r==$v2 zplj9u;D$N-u<0`7BnC@%lXuw4lvR$8CLxW0%`(e+zUovfiiDpSLaU`EFr~e-`?c^S zW5??!@C8c=pG#<$);j<^romNp@G!QH4}sn(QFJgw`DsB8Cigai`&8yT-IAU*V7UhY zP-J+OW^u04NL(^;%dP+v;Zv^8C_XbnpI0oVBLXKIy`8($RVIc)3m+l%r<(n$0iJ;| zA5*E7->Q_TjYbdM1bOmJE>rmod!qc|+kmAxAwAK>XWFj*8>kSQwF)@#jR;x#?cTBR z+Tbhw@&2{kTtAfa_qF{`IsUiS2l@7waW~xE>2xd-x}M=MvHwQvpIz09bV?7?1Ef6a z_SfLyFyeYVJT@OndWa8AS@@$q_fDc&1R=5?rtbtue;g#ay>+CnMzvl25w0`zK9*`X zYM&-S%+33Ff`xUDW1^hfq2O$s28YqNtE-ih{__YPX$tfAoslY-MR=n&SRqL+(w)5v zc;_Y%i=8xEa!%QIWo{tGV3MLanct-!cbBac0;8si*8gXtoHq+k)0rLNc}o&KeTYIZ z8-e63;>M!dFB6>vrGW1a`{VZLLzOjGLeU0WBMHfMhH;g6UVlduk$12~_gt7}feF>p z3?@mde2oG9cZmy2Jg}7$DVImRUTGKKy`O?3`flxjl>AlPe)l59pI5x$+X1sD|B$PT zaF^b4+*@PvFueJL%i__qK8|Be;Wu~4@;JLq(m1U#5)g7>Zv=v`J?*r&dXm)u?VlAU zQ{1;pHGQ=jYux?fEzORtbVxVu=BrgIzv@Eb2_`cusq{wlx#DMIw6|0}CJ7oZ|MyID zgdR+AjRN+AYTJ6@jW2u-Vb0v(p|)edE72X@n2iwsN_>80oaQM&{~1h ztwBL0qO&*zQ;1dyM%Wh+o9t`(Rprj(=9IDsrYPL@5XvXv%-0Q-x5Rn2yCY@l_Qt<&8;SgdCRlb#>IseFs^`5(?Pfg>WlDyJ&J5p}b?=4L66{v zb+$KLj(PLWAIYA}+7u8AQ>zX4npbe4Z~$J9l=ZSzdCJj*vwlvnktm9bUQNz z5T4A&=xW1B{Yhip4`&g948*{<-gWfYG%C@M0U&z`q>W}0P z&cz|`t?4q`Q6Kd-dqRww64O5xklWZ}RB5s!)`65RxJ*eEzn$8_On!ce9yW{v$>3d< zh{KJGT`w{6-vABFkELFe>(z)gueY8z{G9=I9)I71f%Fe3r^b;~^uN&~wGfd4HQ=6zqS3_1#t zNCW{K5Y_c(z!}+l4bx3SHM;zC>f$)7=@!{w=~%OjtiOqm`Yv8@7f79&j0dL(bEl2b zqvjx@a!B`G3V7mLk(b~RBjMsGgs0C#UD@p^3KDTHSU&Cy#N+UK7nvlMfll4wGIU%c zQS&R`1o+ZjY%nXtQ2{ij!aDj(ge0r2h;v?*Gpbw#*mCB0LOu zkcJG@@c}C7D2czuALy0gDjQ++R-He&pELc6QE}F*U+gs64LF)mSOBY`(Jk>ITlQepgar#&S%`KfJk2S|466;Ft#O6~fCc)o-Q1Rg*y%CTh79BCoe zh&-7~KZsVKa&6+3hrm>cd$`A=THC{=c25MMItGTD56xnYMO@3AE9zXSrZW85W5KN) z*t4x49WjIyf%ed`h(29m`?w5PlU0?D^I`%(q#)IQyf$DQz4&V^p6tdAARKOa3B*!n zzJiRhTVLPI^cNt#;aOvegdLMHyvWKwc{JiK`cBH@b4Kyi~+oX4tH2uzkF zw^dd+AQf?c#tz2J41mwtcHb(BWP#^OOz_YukIx)r=qzPq_pbzEyIK;b6!1F!o;Dc2 zF=rM_qJO)gzYK`o8zhiH+jn*Vw7z7)s;WM3B4A|qbNvz4bC}%2!NmdptJU|o7kRUu zZ#Aj$q%}1|Yg*$A%-79lI*@_mEL=vtkAU6d_&hmu?(TwLFhl8#^V{x|A#NsL^-9cH)f3~2~Td9Aw>Z@_xx0UOW`$oqUODXrv zMV|4#dh~s43nBg<4H( zsSwGj#eXFdX?hzW;ET5A32DFJqO!9$u8A&^I&OcO8R zuPo+Rs5EAD4VDCX2ft7a*TQW_pdwN(>qA8?g#!f;RUi*afTbZAj1!Xv*VivwZ?M%@ zf<|pI(l96`L>=Wo|5&g#`CLYQ9CEtU`zb+?2gN@7@)9+1S4vblBlt-}9OQyPCZa`H z#3LYT+I{Sxheyg4k4j`LS23o9s^LqPg9$KBL=77_rqHa+W(?)2FheGsKr50pY_oZ> zwS`CZ1MB368a^4i7|as?(>=wE^bDIpYx;;X>_^eW*CCg92c#Bpj8Ci>x1ixLc61o` zh=tXaV^u9yf*}P%G0!NTowkPqkoKTPt~p_+77}!# zjV^l1)zbN1G{aiWz~hNKio%T1==bmTwTr%}HKryj7Oa67#MkbT9O&rF<*V4R{WW;Z zCir?tT~Owxulmg8g&%tF+n;(nR&k^!X;f9K%_P2LK51Bns=o|yH0ex8yRu1iJ{%LC z-e*R-BIZ>d1kvft=QgUS%l+el0L5bV{55T2u6t!Aga1n$3BPmA zXiDK$*Ve!%k1R5ovq5mI&50w;arC^>jS8W22)^FV*YD61XIW0O4t)wXB^Fl7M3|ec zPb@oh_)ZXiunOo#$t6o@M%sB1>w!H~m6Fr94@F-fv48ENjCSrRs|zJ#V7q&`X2d0B z9U;t+`0|li(p0F>&oLxB);C-8k@Tkf>l^3{X8v5`q zU6OkQ&D%>R^|!}o6CWKuqN$s@^n|fI1-fes6+Z`!Pv3$2K^D}ZS}EXu zoLClXrX&)*{0i%ie2XS(i_PLU#m#H9uH~qBSY=Tq@>!w=4z1Zz&HPkq$t=jCB3IOl zyP@zrN$kFdHm|!aYATZ|lWOAl0%lUg0@iXO@|$Q=P5y2=Y%x3>Jc`P2q!89&c16uk zo&Ipo8Pw2`Y)l{_iAec95e#e4V2RuX_ym2)N7mHVs_;F!DCl>|E*i;*(l5@FKvzb7 zV8DaunQif#7F!THCec;EjG-^NWULLnmP$Gf9e_^4UbO*%HXf^av?d#vdSZHXW4S}9 zR6n>Juh3(^-D^u1o1`9$5u?ylK*z#{a%JsBY=b)sY(Jna)kgg&vd}ch*z*(tM=ODaoFj3)11xH#fx3VmA11?|@8rpejQV;sGqL7cxni#+ zcMbs+MMZPl3r(kQmmpKz8uOTtPx}UWqgp6syPshS$SdCKQ3O(7s22aR{7)P4Z<7ut zPFUFMh{|kfeVxU|x#@4@WvMwTQ6#dvW1MRoEd5m1qwYYdv8PMM*^1AZI~oH;_ST+C zLvGdk0mx}<>Q6lZR%$7+l&6~JR@m!=(JJp^wH8u_IVw-*_zcqzT2oRfBwZ-XN?9qs z#s0X~eyWp*Bc~>~$oQxk&+`Pf6;60eqgeGGkLC)k@s=f@=B$&}A%?RhDj1Zfy8>F- zsTL)rI+~N~Ya1s68jTT9I+~=*dlLpr^>=;`LMF;F^1G!gfdyn^ zQeGo{51HgIP5v#-$31XM*iw}>PxP8pxB5hsNL$el%bXWxSXN8JDp;A7te0t_>0*Wz zcJbj)wJx;TVh8jHQHxt#PZVSc4RdsNaI=S(n$t1~Q{_fxM%~k$1x}A|wnh`5bMHoq z?4Qy@1V7DwA1l&tjF<7gJ{Jwocqrr{o~%Td_|EIJPfieaV6XpfLTMsCw2{mPLPCgG zVBJ6J5d}Gkx8b5h7-FTlUuk;!DI=&Rrg2}tPODuy zRv=0CS3qd*s{x04-@HQ0L(~^kM#GPoRU=iRXE}Zq1V_*OEb1MqPnPE>nQZLEgA&Y4 z1aJ8PSSUiO8X);{|^p>dwma{|9Lao-hIY6Ow-(DX&; zz!UBSBq*3xzo%Aw61!GlAgR5fgycdQ1r1LKIXM;$WICzrtIOaSGnJ(uvribYQP-JC33yx%OBChsogV( zjL$sa`si|dZqed(P;I%OX{@9Syx?OSr`MnhggGyq%_UEnafHYj2E$amb?dD0f!*5M z1m-=*^qwXVmWUts@)j=MGBEvKtI8M=hd~D+c2i2*41=xiMnD+%^$r2!Y%-+C9qT%zXnPFgPJ)o&QSS!CsUC~$rBiJ@| zNB~{`6e70Ofdnof!oa|Qh0^NT{?l0d6IL{24_ z{;s|9n`#>a)h`756VTQj%~wO5SePimL7mO)gEPDJUVAk(=;mtLmK17l)!&@+G2LL@GhB! z1#G6el+zNKEy$V5ae8G;K8^j!g!o0$K*h)p%5%+RVW(1jkSHlu1Ah1%bB4$8vxy=p zsvVW?Rf@k$oBT}7^}mCk5n>Z~Pgb&l*AI>) zWoP_z6_|_hNyrs{q??j<5ANVM>_xMv=&c{WXSg@UgfkxxZ;ne_;9GDm!)*>ee8$;m z?&;hgd{8I|&U9btYkf+ovc-WNk&7rElkm7d^RjjGomBpxoH%V`mR7@c+vKsj26&K9jhE6HZma)(WG z-Jz|wPzg!E`t_e!t{W1r@VfWteot0>t$=>$pHD8FeYkknuuP5ud8PzB z_J#ptjZ;-MeoH)dyhu+%RTgDhiLJ(Qd&p5WF!tSB%I%N9Y~_*k{Am7 zn<`ll=8tAqQxsjC89~UwuIjZlfDXkdSxVGz+<58kf6Fn2dv`3q9`Q_NVTv01&< zg(28<)2IHF$17+NRvhG^J^t0Vu2)0PoWx~sQZzOQ`*~_R2}aFu0&NhWVZm#kNzml` z?*oj_TPc;xb=xVIyTS!-RdVp?7BQG?7>3GQYmtXy)J?Y4{Oy zygNiIZ9knqjLZpRG8E5bl2eGPy(v=wd)tBZoJLwpi%!3OC2_s)(=h81qgNkkjyTKH zn^;JL0NM<^i+OOGw%O+I)KyCAXcJLfOs=|cnlvfZ_!CGljdTiY<%f9V-Z$cM!=Ijp zltT7|bn#XBLDwRkGE!lkQR4mQ=kS~?XOv{D=gm-IRHE0F=S8X{j7d~RlXhc+&)KDJ z)=*UfweFBHAW3pcV{Cmwl~+#u1@DPxt}}hxC|Z*Ev%cc#^#;P+J{^UL693#j1VYHf zrfSQ%mOLzPWa_^)@p{Ueog#^O{!^5C!F15Lj!?+4$L7HN@H++-YwhXscl~Ozh(dpW zPvQkEL{%oi>%m0ucQOlxitg)RFa1_J0&it4)0?Y5)aNOjB;5t{{T+1|iuo#JB{?v$ ze75Nt$^6BHuKbu+aujA+hd-z>y7P@Z%pIZFO&|X6j6>iT9R9487Kc_18JPDZz$kKk z+Nq(AHF@>ol;W3Wu5zJV5m@NFOz621X5+S@1wxtmCkCQdpK4+$z2H6F?zv)hK9V>>KAR54 z2B=CX4?*^I4uNeaO^D|{PmxDk5zXYnND51(*WG7H4J+W$sSw6Ke7wIOYS;dt7B~uI zku+nIwIsTeL3Og3d;mY*ik2#-l#2J=Rs%~Em0}f1_Bh)vu<9gQkY%6A1XjoXFxYC) zzQ6V!`0_~?kINMhq;masy@FTf?#kO6qyUDURHf)9=5ZxGmW`E7P(;*_g+VjZ?pxIa zj!Gu+xi&XT#>Hi3LIR71C1u&@Vy7UqqkcPR9q9Wh2e|+nwu;);)>eV0YRs1KIPH>P&0<{&?@Lu(Kd%+&{eK0j|Eu~SL?NW>x1u~f@(fL%Z#6ouHH)&K>$*xHGHlj2 z$Mi_p!T;q{o#({7&qfW22n#|b;zavQfQzCP%PVYIqQ-}1yLO1*E>0ifUpHic5BJF= zu{e__l7s`LYQ8ASK`e}fF%r@WeNW-XlnUp^R!qtS-y7beoG9#aJoJmE#jOnKnp~d! zex?0e^2bO&>S6Yc_OqR^&>5!$}>aCGe z@SDZk(RUY_CraszLdNjW;?UYwn4PV4&;L%Q&0Ek+n{_Y)4_`c=s=&g20 z?JC+8M%=+5?(PqbX({;L?64Wgv*pXD>&$KF`CPfq^TyHHe1YHl zUZYr$Im>i3wZL&N;}+bD1x|@C>lTtAAyI^dxQwMQ`>{h3JeqRV7`;_ccs~D5HaVG$ zXpITBlo9YZ_$UKSjt&3W{K7%U%C5iZPJNPZ$qf`wnt~C2Ch>y51D}^gQ^s zAioqRbWZtSW7R(^GGHsS)|c@@W3CaG?*^j+BTxE^80{|E=PuaJ6|4){(a_m)-7rv& zUwV9Ng6T(F>ly;}Bn9JmzPjJ36qPSZAacZ_3}e~jeuQQOZ;cF#n;tQ`ysf+=V$U_5 z_sclB?6AGZF5*U0mQdw=0VFEpCSs4binM)}ZkMCada|s%hJG?I7#C_u}7r`S)?f;6L}a za?B{VU+=mG%65e^EjFm_(2XoCX3#JcZ}$T%mhChnCtIcH8@`nqHr zm=w~yx1WUF=XHm?&R`BPEz>RwjS=)hkZ3v2CclEB2VcTY(W;jhoviJ<`;&eE#%{!g z#P47gRWbpOJ_^ufMsfu_zoZr{tg*j=uQCCAm&RC`Y2aOB3?O{#mNi_&2`1ZwmH4J{2Bu9PI`ZR#4F2tKW7%P(}20f=Th~oJs{LRZJ-` zEsercILq$=4v`Yb^fL!Xg1lten@T3R1DoB?kLgRAeKd!GLW~L~cf@uzJHz`Q=OWJs z(k*9Ffy(V<-+s)$<<%D?lYFTJ1f=*VV%`ng8FWPY^+ct%6M;F1|12o zp@gNd!6s13XcCsn1S3_X*`&o!ev}t9;0X8kJfq(oMhxK)U2i9*s4iUl9RvQuJs930NY0zg_k6 zslHWir9Vj(Eh)B$nC~6;ltR;(MH^TNLn*rmUu9Gj%BJBkTntH#2n&?Gr|oke8OCo^ zhW0y`dih)qr3&_|wq_#w??rgb z`BKf6KX0o{AIfPWWwq+jk-!~QWWU*#-g2E1BU3*@Ad}!dSW(l7^SnWRuFivRyv9ZJ z=FqNll?_V?$NHzR{i}*P4JM->r2@yl_K~02cIXJmiv258y;_YeDW3b$HFa~ z%V{HEacqk!B#Xk!mp=b6M@-Cn>2|9tFp!KFyjd1FmY0?JR4Yas(i5|PmtW^^4>?M- zZu<9;{QHDH!o!5bzRl00R#K=^p&pELNTiu5mQ0f)24WKe+Q#?3=WL5bQeQS7pH=P$=-IIt2}h_d~yfnnD{IMe5=AjtdO5 zKx9lpmE z$X0OH_&)#EXe&mU`vKa;#^FHt*93oDr5F8Wc9t+**MASE*9nke%~2r3F8oQwgH3FB zG+3CU2`&Wvn&J^{Ly|x*R=+(cy*yE6?Y>{$%f#n+FJaE~leqfpgn!PGB}btF9vlI3 zBI|lyH>W0gM8Q?0Rnl?b-2D5J{5?iM`nbY(nq3>AHL>d(-RoPqqyv3ieMK!f8y!%x zK7q^Q5*83pWCu1JUqu}ziC#Rv&_L?T|1O|u^JmHLY8YszCIA?6lZ>%aD1fC`V~$>? z+ngBXCsKEn54M*y%gEQ)nuyvM5(#wZwZ&z7>!wdo+7C$i`^@q>D7wER9`=+eb8*;) zisRlH*wp`)`Whl|L#`Jtas3i8Y1c&Sb@p!=K__gAaYv?U7%TB(Hkv7E_OxnYu1>9BaZE#-a_<4&-b`4H~URn<)* zM?YJPN|!!{5gv#Nc0G+7xLMs`nl5pB{aT1-qn_#1#C0)5nnO~%v&OFEhxgZ7UQ&%K zy!PPR`r>XCMPV#I4|yG#s0Y1$`i05!<$lJj`sXC(DsyjJTGCK6enjKbo+rLh{S5Dk zjQ>K!CvRUvg{!!Vx|k5cyo_@E z5@&5>y-4t1?vR~@U+fiLr{tUbEN)MnrJd4_6zGYn(OfZ2+j;ia667&g({p8%k zdQbehPYdNUX-?|rNnj&ONJnVU4UnISqlIT9Q6o#`10S?qSpMi}2b7OWNOJ-}q1BL6 zeChBd3^qM&;~v8#UnV6s6Z2R5!iX%Yk~y#e624H)ldkWQ}SVpfp`6I#9sp5@$~K0=<*k9Iq>;EbYC zD=ktvS@n5xAm<7$FlQ+b07@`>!w&-)`17G}qPeo+UxgnUBomb>WWz8Lh-lX!UQrQ^ zPeX;5aNS*9?Q?jJG8=5+$cV1UmuMZz4NtMIKGu)~R@wWg(q^9`+)(~K%-XP~)~*uE zW;%tozdvng6&*~NzY6}{@Zb8tNd!Zpe>as1Pfz{F4I!p4rImY5>wVlL779KI!Z`fq zH@HpA_btPQCt0lh0?%I2_Tpizg#5_}cQI<2GIF5A;o59P+C==L^rd%9<13=j9w2yK zb58-LA=f(A<_8U(GPQlqp1QR4B;92`g6NC)2L{&aEu$Qh6JAseV4xo3rxr*QC2MJ7%|* zt;Xk{GrjxTK-fPMAcci+@yl?y>DBg-jDnHs;)blp9{oWx(~HLQx$@k--!sj9u_@TQ zI~dv&%j%!K5biMKEE8>!H?!XmC}hx)h21DVP3=}daVeCM7F(XMUZ=OEXBpp8QQ+I9 za3ybe^q@~T?Z#AKu;cu2@j6&ED@8`+dszZDhXe*c8ILHqplc;rL!-@kRBKI-*k^1B0>9Qp5;OkSy6>c`l`DVxE8y@eu zKH2F;Tdzoc=L#4VPEkusg(_D1OkQy+{?A$Z!XKP+s#2;IC*mz!we5+d3dSY6Ke$k? z_Vc-)?JYJQua-@>nc7qz;F#cbTWv47wM3b(rcj8xC4M7hSIV6x7QoqaiYiO&e0c@C zW;XuZ9BqulW})ZUML}7NyQlGs5dx)Bc3t>g5YtkYH_hlH!beAfCpaMe$^sg_uQ!h& zaOethea>2dC3@!~FpFk`?s|I4vh0SDgK+*R{0rh(11IuX=YJY=B)^LAp2l(q!qfIE z0Som6$y{pbndn}Pp)q?T;5-?`7)iwI&RT(f%>Jj;-vPq{J?t4z?ME_}zKD-_nO$8S z0Q}NedXJ_MLy|#DqgtF7PNu1&z-j!0G#Oq?{vUk{J;6-E0&=FPABpf#N|iOsC%8=c z{!tDD3k3XSpy13-+4d0Wo zhz&yfAv}aw_F{4WgWKD(3b*bL6WfcZd$ZlqgJeaYXAf9n>PGSVu(fMrKarb+bxygt z6Y(1?c&T3PhJ~_*p6|2wMqB*EIL}Yx)dgMgBAaiaD$}%t+~Q}S zwq@UWc6}cwy6fuet2wOB@Y-)9ZN0n%e`RsEUM;1_#axgLJ}u26x$h^_+2X_WJmhWF zPi0fT8n?!S`#f;NjW>7XR3P$d`!hN4vU*J^k?GBHafy$@FSO#UAntm3m2p*d3h0X2}}(e85>MKjcYUMpA`{{ICkyrXsc7 z_boD>hNg z5K(%Utk-TI<5Ql&Ex(D&WY-qX|Gc>eC!zkP79P$ES(o$OkoVaw+e5V{9IuH^C?$7Y z$g;anwuYs}^1grg`o;N#QGQg^(MoRnQ>y%3op~tp#?Mf`472n`w={MIf02-B)j!|M zZcCKEFB!PN=J0l6A$*yJ1k2V55m~10V3-R`cZ=gKeVHq_SvW)+$W+KuNmCF}J;pT1 z3rfx9f}bSfGhmX@`r12U(G5HVI2~$4LNMShEc+GVy&LWk;Llx4w1pT)I+CyJz8# zH^-2OQweB%&|_b%(yjZM_k91#i57e_|vhu)Z>FA&Pc7=DAcJ5?Mo{h{73& zQ8dbQ@1}^PeW-V3btZnmeen3h8uh{b@xwNBIilI0F_{HZKiTK>l-}F=lBiw6VR_jc zm4et*Dou!5s=ng55y^aiD`XFb;;{JeQdmE~;^&igN>`2JqF@GWp60Qb*ROyl?%S;G z{i8lFlJfMBP4tl!?FuMD|A6PkQEoKzN=u=*H>0bDr*89AvJymc;0ziv6f91JeEq0b zO+>%+J;-jeWccSz{0s|QBTKq~R@tHz&nW&vOmPC81ZrmBwBK0)69rG2kq5r_LfzFh zC5?WM^t{*Jtg!pd&bO+Fjtop(^W`I>@Zg6Kl+0E!E4+DCjkDFE$#6d#M9cbxS&vB! zxe<8$TGRQicqZ9jOjB~Sb>gGi-3J77xm-}mo-d0th4{4fjzrOKJp!joN63vOZ$0Ok z6&F)}Y4OpBNPVWq)0W$+Xl}!56=JFfGx_7z zo;f}x>`0B%32vKEt$GGZ$^S#vH#pSU_y1?x?qnOwb;5F;v|6skWvyDamfc#mYgx;- zm#r-qK$)u7zldBwDMa?v)qQn1c4?}p7Gs=H_oL%x;RSx=!l%&Wyrx^ACp0Yr|a48Qb0CW84FT}bPkF-Pr&8WGuP1Xy`E_MU5 z^6f@pE_#R7|Ng1xxk&ftims9bCw%wa;dK7hkJsneM5WOrrVpuNIxBC}RsS;){0lj( zVHv~53xCGQ^LoT!*4lmT;7a~oEC?!=4*dWXr3M(P6aXl5zd_}jP_k~5eI>XCb#Q;E zOcTk&%Zo+N(JK~S?_nL<*E1kaE98Rc~d3?Uych*Lye>YEkD?5^{^|)i0YR{LS>$ zkh!RGdX#x7?2QyA3Y5USrKXRACPJR~{08g1Qc~z{SS~JNb|FQdVTZmQF*oMg=vmCR z`9p4vW4(>A#2(O2_fQWeBpr_``PCLSa337=DugiLX7n3coh1*OWildZKyE44e8F3s zSxmwU3>$E8;K#zrHrysW>8HfkHVHSp zLA&Q9Xx>=zY99tELM#xrTq1}l2!f0@cN1Fb5qK_CAqCsH5)^L(4jpI{tI{CLevLkw zz!#gpukVHIf9v>+$e{XhP}%67qjKFdZIhltXWiTXQLf}O`b^N+vgtXm%Gj5)tqFYj zQGyAnhEe>&%=DR$gr&BY@~M%yN;`l@YKajW0fsGX3^G*i#|i&FuHA+chO@#d(Km92 z9jO!jQN`4J;K0nd?`z_E`qs_2Ed<;H;T}H+VQGz22XGvzruytVE9GCs7&(#s7ZGdm z54US!pu*?o;uTXgStba={{@!)gPjG)g+U=jC>ALf7xGxL*r{d-;m=Qhcl5k1^5Y#U z{Dy#@qY{L`yrW7Kl_7kp`e5@UZMYDU$Z#}tDymrrnC)Ebe;aH>N8j@PT8$@Zu#vTj z|3?9h%bS!t*HDWoM8^;%>n*EmVD?fI>&Q;q%_BhGzOy>RN zbOm2I-?H1y64&u`2@^v~-ucO|1&vXPH72ih5&B;vnKX#kl;SawDNN%Lt)OI#qp64- zGZZ}`7XpSf!!{2vl|?J3S`}Xy2G#{i(8#e6zl9C*kFM2L8S;e}3p0v>LAJXnXF}Gl zsODY|c=C@6xrAehIKQ`tHQ@5Bvm^lwsPp%STM$E zq|e177q&o;SrY)BOpqe>OO=#M_|(4tj>QK*Xxm_`WhNo9j!WIE7Wrfs9M$pljl+y0 z{UiqkOn-H&dzw;Ugb{YJN|e005(y9wlUQ8L09dJFartF*ZT!Ig9e}l^(y$`~KpkWO z!$-bmsU+ojC7bpxi$N>zmLFiqX}LPc_EQG}U>Fg-<)bE;ikqgWzRr8n+FDa38!)rW^eG??_kNs8E z6eB~^h9kDWlr5@0GPR`*)3TpxR(nEEOu zp81S>PsgZ;mbfd%j$l%g%+CiUy=3Sswq5jfgGO)J+ZEWl<63-N0ql$J*@M+JZ_^?I zRGasTKbrFAaUV%oajO>5-@EN!tf$@oMyL8?Q|#HVsm4OcApvpicM=>A&w(WO^J`iv zzt7&V!4})H8y&nZcrND9=q5`?`q)rp3uIab$BOl~SVp{0=sc<}M9wa;b%2qa&&q{i z8`R0Wm`?He{~+r_>Z!K(sLszv@)ti7i%INv;z<-zG_+Y4oz5^!53a=DGQ+N6VhyRZL+!Yk!h7mf_uCv zL~=~=BssN;8)S%{v$&{T^$Dbh_uAaC=cMM}m3TNkY)sf`R(mi#yl6;&+%K8tb?+5& zq!5untF~P>UoCqOLtfkvB{_hwsX%ek?6p&rK(E#6O0ugi-OPDCyKf-G zVyy(vT1wiiXLFy{bMiF)b!d&obqvF8(y%F%B!xNOk!pcezW~hH;O19p_hZbG9Hy0K zY9Sey$vI#SX0IL)#W0?H6L6w-`@Iz3_7kIA(W4MTT!RX8cZq}GY(4OW*cvz-{8U;I z&U+45lE87xTl^DqxNaJV*Ea%)KQ56?n{zSI&~}3rr}^XFf(hWAG&h2w=u^0+pN?i3 z9>(-ZjGa9JyaBMYnW(^pD3m-HGL7)v67DVnw#zA?aI6$CX}0UTTxNW&0vJt^BOtxX z3Sa`^2rD3qQ;S9}qe(}!FripebNgIL3a6?6g|~dL1=<{m$+NM`l2RMxsLC3Q5d_o0 zWOWXsl8S@d<7HaqIIA_iIi}26E0P++5D)5efXun*x7Im_zgAxYq6(PIw_WjEMX`N+ zdJr6=MSjEmh*iGx?!?X3=k8=kwRIR`DzXR#czKOFv*8k8E!z6Ym*|$OteP#hcVz$A zj>6NeX<+hOhijPSE5mEaZJ4Y8zt;wADK1JL#6hV`u97SL^G8mN-CzYqq&UbyutDo} zSCz7Q8-unsT)&!^ZlDJRT*$&XKcf?g#tz!qP026VbUaF;m?);aG9d@)P_SeucUgV7 z?B+tEwgOF#0=x46H3I#!I)xh|t+qPP8;6y@DN$Vu!_1${I&zy4G0u|$IivjItoea- z{KRjyra+Y@*6gFlus(;u_fy?SH%=IQ6)ed-mKq)Ka}-dWOT?aSXh%By>?p@*(Ui6r z|MpcuvqB;)z5Mgi{SJe4()tE3v4}M?O<~|%x!n)`k2zRMRIJxP8oI(jUs|xJ+2GE0 zsYX(@9Cqz!o{{1&6~Im)vlrDTkh))CR1RjxcY*|lm>%u%Sl+Xjbd`;#JZq)0^lk-7 z)YGJ$Zv4nDF9dTb6NU2v4+O0|Cw{oVzJpVvq%k1*aJ@S>@kPtkXO2z(Kv6z4!;Gc0 zCrVXERynjW(QGTT0I+w~fK#ZQ2a{5)0KosJ0h@i&1i-1MKV1Kk1;l^vZmbcXo}aA& z`I2`n9G==%CtiVil1BMEHibN0^ulk8OZ*gOxjL<%PISwReux3Kp%I-6&VKN)E5NpU z2MhvkKcq7GE?Hn_rAHDdRhZs|lu(;N{`*aA1$9NU30s}TO)Hqo*O})&_;D1Zjj@E~ z|E*uf3uMwSF)|LS1f2Tr^%ifVZZgIFvLs%Dw}>`HseB%;l6pjG;3*W8#RHYfNth*k z-18>gcV?Ri?eU6-T%2R_OD!TlMAreXz;d&QL#T%@mzbYksyLFzc7}W7?@`$gw*sH- zx)49=6vDBQu4ohs1B{aTePeGk>V2N)_oKd1@_!c^N|J=u;)T&JGQ!U8v&>O0As z@P5X~%K(=IJ%N;f3ab*S2qKZjX%Z*{HQW~yA_34a$duMN(0U-y8FHh9T8arf4CL?& zxo~3wSze8&Kq?gg98_8= zJi3?a%u#`SyBJ?Ud40UzA*?Y|yFnufIKi4x_#T8@4d54#WI2 zj7Xk8b9k}-BRZgki3#q?&u6fZwTFFeQUYGkQAF*uLW-;cJU@?oSV`n;de-kKh_itVU zBglOZU*QZAM$Y74(M4tR%OSjvh5dCdxgT9H=NK3YlL&BN7#Q7 zS`_>SkxCrZjEW_v&#h7_q=4r5(RgH%q{s6+d+8o)NwvBKg6oWGSw!007)8a+-N z9OP~{`}kimMerM#%JOFg%CrMTDFoB?f-!ifF)!eR8sdH#MJd86GsaiRQDyYT81>GwI{7La~i^)u$W$Aza=$k5EstTy@qQGe%G8~|&z zaL6TcdRYwmJ3s4k+aYKHB}70k{Fr*8wu7e_sZEuz9{61>IVKKxj26oLG4oYkj;-` z06q>Vc4W)nRptTmuqoJNVb~Am5zRR{Al)CnqV65(fckPIjw&d;Zj@uF5tJ&~e|7z9 zkr!a_|CW6j94CY*{P*bn{rr*O4E5XONp)Rw9K?~$tN!e8{gtMq3Ta964*nJbY{``c zA$1*&<5jWmvcgZ+`YQJxkfe9!$o_ZhM?bwg^%@eR;UZp3fwe ze52WZ4>giT5C3=JQ>UM=4mNRvHG2zuI3NXT$E~XDnQC6^83>TjkZec%S6K7^>^#(n zFgj0 z)fu-9>FMtsIyAP8OeLcq-noY3x{wYdg{dBSjl-qR*Tb86o2$@x%-nV2rxQ|!^bC!6 zI#&jWKI+9R^mrj#$kr=&sEnUXuOWTb2&G3I9iWA`oB?POJB?=6 zep;9`NS8}XBfNpU5-4oBClJ^>CYx~MY+~M!^am_ud{dSdi0mE*)K!C?F6^AQlkjx{ z{DLcFtILbkN^UIAlCqOV4B3{|L$@K~9k1u{BZSv^Rmx==F=*C|1|tOpX9m-m7v>~? zABG1i$E-EV5czBMfZ+e1kd$VJ+srJ0Onx+XtpG@8maZ|&K1483Tc&%a3KQ0EO zBAUeF!`S8OP^}E;S}at}UN`e|QU&5V={mgc6Mz(BnY1Bv4i`%fN?;T}P$&YB zuWcVDAVSzfi{n=W0+QV4(tYrND9kOoOT_Ptmc5k!Jg{j&T@0^p>WjdNC>}SN4DOLz zN_+>Z#r6H|-}EYj`+)RkYXP3BoJ6?SXTAH``_8@1xG!_5K{t|0y0=ldsOpVyZ) zs~_2-o@E8HAcFxVl9k5g@JYA=AU9mm?x)jonj55g18$B({ zCTHodYTzDPd8EjuhcQjRukI&GcAsx&QngN_KyZ0%-L3$S!3!k01O_exU)Oy#TWmL= zBe4c@Pc!Rbapr*5l)q~RiPlmbdP<79$|Em{O%QrB*btC*4#G<_HcOuZDa_~!ja5ib zYJi|E3^2z?Ki-_=0~x|I07g*3!WwxH8GcDeO_hA`Ryxn2*`AT{8ORQ=_xNL~k^@A> z(b{cvt~rKU;lU=9mY0{$>>NyHUp}TY1(t#ewzIx)*KER!lx&$hdLhFv08vx3fO1-( zdwz5@3U{-o9K9~3&QC#-Snvoqcv(^D~k zc_ae)Sc86llyqC1%}?k@?f&!rtbv9x68Fh-Q(m6=C48GS!yHQ~|FcZC>XDrQ3JBB6 zXtVYkUFF!iZ?l}tQph&z@6Y=weoU4i#29=xabSg=l-El*4xALB{t+Bkf+dD z6uKTZ*s>iF!S_MZYjUITW61X-c_#ON#@B$uh^`-l4pZ)*&O*UU)IcNPG%nK5Uyia} zOmA67gtsBhi!3a>n9y;4dw;kvS<)5$JJ+ibLo*uie_TwV$D|l(yN?_v56aOgeWzTw zV$EX#>4AJ}_q<2h8#^fc{atGl2KNOQp=YZ^@VjkZAMrW6tG;5A!-N9~eJ}&-;SPgP zL^)*-PDbFOP1D>>O9JE+1GRV#?yyg=jbFAHReJ;TD zyM%~J?fnFvo+NYoN3@2ODuKuB}LJRe+6B zErs=cbA}M!{GV<<<5IWN)%W>m|EyxIU4|EA-Jj0Z#~FzK+89-a5PxcB{O77#LJT-l zGH`NPvA?>qJ@k`^5Hl#1C@;Dxor)(_kq9%=>Z3tEne&2L2FQ|Yf{`F!^o$E_jl8V zuS=Rtj6%NI|7e5%j}ayu0{4;ETB+7_@ZEAvOlevfo76%DNn}w}v67bT3hPr^#3k|$ z#Z6{rU(p3B&R&pSQ?i{Dw0rDS$kH2j1OBA3!x!5Y7aPWuss|e}ldT4^OV4xvo0m4N z2xbGmr(n1QPLmQ_PiGdl?{7mxX*gYA8EHc;g`#8tUmc`tGUh21wb!3uYR~ zR7Pj`63PX+QEO|*Ktn44j%Ks9mZ7{S~Y2I(>pUoD{!jEW_Gpu%KJZ82`-GSt%GGYm8<2g zZ(*SKI0>W_+>v}TL~sb~Vn%Vurc4A8+uw-K*Ya@G!Z02S{s)+2OqbgwB zP}nbEf`@OWr%=Hfhtku&*9cUH;x%5Co$qy{Udo&+JAI$O=GyOskuQ+9~x~*`UBIvo_l1>vq@ylE#cr_J`}8E zDSw?kKbmDE7N)N$#-vn>9mq9B?Yg+NH{jDHdjD8H9bwgu4UASG=&O^J#i}rhAYnk0 zWmi+gs&T@z@X2Op)0Y5K(^2&oBLTL6fWiiwwXAC&lhDmiKpc}dQ)D)CIm3(HrD%6P z8K&3gpOkWRFdASnGQ}1L-v`HykTvGHi7{@s0s+F<1X}R=wt(xA8Cn=Bqyp9KtVlu*mDi`sSeW5pWLzu2zCF@d3pKa8S*N9=)`&9sZdX0&eaC0F z3{fxsWY+iUnkIiZ2(CAS;8hchKXQ3<2mNz_agqi|?G(=x{#ax>`mV{Ys#WwwtC8jd zRM{#ZX5BNCn|fi=D3S{-{f0@4&<##dTZzpfI#yl@CFVGKw6t{ogicH=yS4q?)rkMz zh(v^MQxNc2@wLajvajc(z;ml@d)%nGHFOqo7yt9yki_9m#e9?x&hD7;`K_iTdds76 zutQ+8f6{Uf#MU6~1GaRv=Hfb=e{dntZzO;H40>gf({ZLeIQpJ-)c1kXplz(KRZp7J4Oc8XC?ZhYx6F^V3EuBJ$GxapyPZzDiW+`IoM$ zEMJ`RqQ?unlhG)e?qt(raxig#$;D<)_Eo~#yV~l#+U=Ig!o258;!B>nLPWu1DZ+*} zHI0bGXY`wQB%1s#Oa(AMAR4uJ#Ru9KP6`^*UH+wAV!Kfw%B0joO z^YywNtx3RU68%8!;>Rb1qYRvfZeEd?ru=H8sFIt~HG!}}Cr&L{=`G_jgBSuza;L}` zpHKCdDn?#pClq;qunzwpBzM?q2sMgvn*2>~W*((1F<+rY8t;ScR; zAE03jm*{{7sPNG`co?ExHPWFX_a&5JU}!6G{}sIP!%y|{U~+NEVbsRz*FvT1eVtpC zC@;yi3v47j@WB4_eRhcTN%<68#zbCIg91L|f?$LCA zz6I+S7U~bZ|F(|-Spzr8g$CQjw%(@SWfAaDSp(tBSD`JZjeU-5;3K?jV98Pguwucj zxdd)A-3b3mEXH?Ltc6NnL!Z2}&Z%F`&1Tj=yk)x0fQ!JHuK%IU2|uZ#kP+s7h9efr zYTterns;?NsRa_}JDF2cQwTXee6d@(mo@9s`3UfnM>D0frm5>20MjzNF;>_C@?AGU zojeb)P9(l2ICo*-OmDHk*Jk&*eiGbx+@EI=s&`3MX-u>A{=QN}HP@=G`mMR4|NLobO(N5Uu7w z;@#8hWOLT)PJ!l#P+c_r*_~Lp11svA!5I9|hu;8P@#GyO#7ckTFRs6R%tN&ndlA2$ z^z+dh`?@z7%2Ar~kExB4Ja!d=qwP8H^v3c3#KQgRVGKmiiuvitQgUu0y#b|UbnaMJ zyTG2*?`H+gJ2$V_)!|DEsP?Rkwd~K^wR-%a7N78t58d+a??AnMCl!i_TY{6rUNGyf zkG2=h{&>a{;jK@~xhm`!z4Kx|mi0Xh$SrttN&DmFfrV0^J7qn~3FMN$b{BF1XSfWU z6o*M>^Pf1-G5$JokWzIz75%Pf3jmf9+Eue_CIH6VR~IhMdiOI!3cGTzSs*B^9sJIebz5Lfeg2X!zIM~5)a1i4!?vO5%J72!0NzNJ zcG?zYu$gXM$O)!_>46I6VkysazHw487hw`{IAtPqw#BSzEq*$Aw92(r>aS*Jeex!T0s`)&ETg zu-}^BEtEaiLhvE!*)&*#YeAE#A5>87hYSqRV-Ji^%d7`6cs++Wvu_5!e6W)e%&#_yXPh~M0VaoF~Gl7eN zzVJRzeH%Ng+s(5zM;c7>7rXk(e4A^+@tXJjwMQamSolwSgyz{oSShXZdmvl;_aHRP zY_8~mn{!R;u;^%f%LbpZ=*?MJRmSCkX*$H`%r^c*DX7|z0f@% z(xQ;}Q$k*8l@xxn9^^F zh-zYT`2v`KH-hCOLN?t#C)uwx$CUtC$7?x3X0{Vr=Op6f8#TX{c1Q{|0nG!^*0dVF z%HKGsspxS55WOs*jqU(_6$@baG857IDg7wuZN%)Bd6~y3Aae*kKt$EIqq{#lPa?8p zct0I|J{?X4Fg)+XidzBlv!`ZgL?vTtWx$f!`sMGt&8?qCgN~q7lsm}pGDf_fcwo*Q4WQitk7RNgFow7E``a1AAre7a7UhkmZ zo~?Iy`W#})-8*hnbkYY1&Hz!{A>u@VAap)jz4+#_lVY0UULS(A?M`TKM+aE!9DvxS zm1_@O#*}2PV$lICa7@sUwadk8pv!Y!cvlH&o#n2u9bk9ME3|~)~zp@xa<+#pU4N2$0DP|MSg7w4K`GY zZbsP<75K2)27cr^z4thsu^g(l^FSC7rG)(oq%Co#X$xnsru>V}2VlW@t7I0jk$cU= zZpJ~^H!~$@Uy^Ul5S&|!y6DV;PF zy~bM@I#r_7x`LP`cOuz7g+}?mJVz^1X6upEit4(iQ248+6g8|u9wSay+XZ0MPrAqY zuof91zp`YztT^daQ|ryG^6!lZ4<~Vs^zfA2`AWM?bc}mip4Qa;gw>~C@DmYw^UM7^ zN=nM_EL~|F!C~j!WPJObxk6E%?$%pDPy$eCv%w{aOi@Q;(ne_?;#9xXVUzVZ@T9@_ zFrUNBmZ;INCzx^Oeu+a$3xHak&A#%I1Vs%*W&7)=*?4?dsFQUsyYxbR7~5a>{EXkC zx$9#2iU`T|GG6Gt^5?BzgWIdb{Ps!wK@5Z04BY4V3$6408F~a4v>z@Lc-~bO5dO~c zynR6T9dqX7W_JY8E^%~4zvyJPo!_xgUb8WVq0rWGNSrOP$X*SBfL4`70MLp%dLYSq z1Bcb>_H=F4=lth)%ll5i`JxV7G^GHfNhTs<=6bT6Typ`3iI}zvy^w3grOfxyEpxo`;4xognopN&N7;O_BhfZIvH)kO* zmA&E$b_?HpI}^Mj@g(#5#(vdGGd`a1>JrsWLJ+-tAsE;e^FceM^MbipL9SM>KsL)j z#B`w2mlxytTu|%_P&uW54>Aa>LB2qGK-g2yX)o84^vf#l3&LJ)4wI0u^mNed9Jq zX|P|*z;&5+FeZNYeX+&lL=>U70Sc)ph7>L1!YEu$lP(j2jIbx_=FxHi^y)1@mU&U!m2eNR03fIgbW1K zCa|cmj^c>jl(!#NIp(XZ0Y(4d<)$FwuBH;j_VS=4!_#2*c~8tQO4I~^Ege{~i)@CS zPX&PR^L{2q*gl^paVw5(aOVGjL{l=Gd(kWPo$tLK2=KNu=IIReKQ`a^;fYsz2F0|} z37t~3hk*s*QE|?Hhs)FgyG2uTx5r|?DTc`CPKRoC6K)i$+c}z1C;W7Wj2XckvfMd|w-p8#}=kD~Occ*5+PBJPKs^6%qbq%_dNe&2X4yU3D_BQ5b+U-|_w z308eS^qv0HQ<*xq*kg1OX;X8wi)mr~S4N@})fHsvU^QIjqO>Q}$Egh>Sk=?BFdIfZ zGZ+|v!5wrjzGA}BSl*3bq|ktkB#){UDfk!Mw)z4!fD)9(y*AnuaCP|8=JV57wu6mS z;C%{kVTb+LkO_7dIk}N8v}^wkr8mY9)_+bB?I|`ks0HxUlRF`WBI%2~Faj1>i)vB! zr7m=?R3iyf5!?)pd9?N_yAO%hL6*F6O4)vQVE6U9$*+`GTjfHQazwjYV@Dtn80hxvw&jA0J8w-y_L8(*#| zkoOCs2N|jf$jHALPDVPerXC$m6^onG3VvRLF*A>Hh(V5O2o_&i1S&8GnVR!LqLKjD z4&>f74?UA+1NsS`{sg%26bRxJ|M*AnZ)E~$dxWvQk&-1zlKr^HTs;zH@L+fjV$cz| z9~YqxMJ}}jwyfh0UJR5|@34_o3=NjSQfCu2@__z5I&+C|-Q7X1=`#3*xYr3`7^rEJ zR3m&2*jn!K#OT4)eD4&!1>4@o>=V}sz6${7;vT>N4n+Dufq(CgaZ$v?I)QZ%?*~(Y zMf#!OKr1*LhI9Xbim*$$<|(LnjTN|iygq70dR(@aeWy;8?Kj7R_o99;-oC2+J`F&~ zQ~Ud7)w_p>3(mPXVDKA9E({-Rz?5XIQntev&!UR-HkqNgCG(+dp9=i_#fucFunX~3 z2BfxQs9j?W_C?IlPUg!p5MnAU#bWXy`8syP43RGs<#g$o6-9zk^ z?@L49JZuDx4ex@@Gt*X4?(F`$lX&QWTU8%x<=zy$EB0VUqS=s^GefTIguM|8;tU5T z(ppF!kj-X3c$_z;E(+5n*C$pd zwLe|Ay48YqXYQPE;@$V_=IS+7%TjW2%{{fFXW&zE3c!L)DvqX+=}-9vIg!cgP5QF* zFWUytv>LT>`_F@uye^l>zyvhDE&s2+RgEa1DFDnHwRYC&jk@2_*G4v=z(r3qkDiA? z^g3fHkK+NEH*G0>SNfDBZX=|CvmuqBcnwW=`}b0r#(*9xY_7eXbN%9BG{b_*SGK9V zE-3O-R9)Kz#RZPYYmNXv@>9;wn%=agmtWOCkfdewh}XNh5Icah4Ka7Ka%XeF3?yTF z6qmS%p~64Jwe_FhT7LZc1|eDgmy-2%Xo8{|%2QasNvclhoeEGX&f|6!2{wN(1eVZR z4Ce9)7e$_Cbj$qT0WDqe*i$|kuDc7%HFltEVs7lP05=giq=Y1w)8b1*($VQXs-puKlQ8Sz%tns<^^1l%B_a z%`ub`iq;2;BMup1nAxI3FhgSW$)jxKjiUjp!%^Xw=`}A0fz`ePBSB_3w3}jyI|?_6 zVS>a|uxY9o?#TCTj}LSL;UyqHe=Hc-BjoGu9PT3iU5Dj*CI)9oX!O%g@FwTt9CHKY zZAb?Z=im7ds?#;1(sky^l}_xfrbd9R5xCMf#M{g zT2|o!deWltGOaD+_dp$#Cim^kun`iuIM5%-4s=Qr$Vf;Xi(w$RCICDQH{xQ28$%Zp zk>-zc&-&bO+d@@k#w-8$&$wAlq+$Rg=PBs^FC00b9IC^lyx=4ziv65kSLDyC$X zm-Noq7>cSP=hZ-X2e^7#*oWSMF1O8z57^Oy9UH)E#0TFi<$fL4kyCx~!b6z6HqZct zZ1>~Rnm%Dd!RnKO5(Cphhv8Qda~$nPAhDhOs6`h)dBpS@ZAbFpycTFiQ;>)xB}#^Z zzF=OUhMyn9iw}iaBD11&Un3M+X@tr!cu@F*1KzLt<&L1$i4uewZ$Y6IXfY-SS;h84 zb2f|MMcyyH?Evk62nc{=B7*T0HX&+ZTb)(D1e?NIMvSDlCbdKesJv7BSSwt25vpdj zUSbYMUBr|^pQclv47ux0R#dO9^}@@Khh`9es;p3L{{Af;vD2nrC+##O?2f|x>s!i& zg|foL?{Ct8!1EmvT&-mZAG)rZzr&D+Kdx6wC6@zpA&24IJ1qfCL65M&O=8^1 zBOT6wVcD0lqg|!iRSgJhtmZD+=(kMM))_!Zo3^|!TXcG?YP9hgvK^$W-vd^VSY+1h@KvreRXF&-qtsun^s7Zy)B- zdVk>vKTNGC?BOq5%xE8zHOI(5L8gW1bBqXfy*w>6qyzBhWFZHZvKA_|Uq&HWNurqf8(Y)>X+l&^RCZTHf=8FrlH$;z33zlj-UhOF>4_8AR5lO*A|ZR4Pq|T z$t$~>Kkh8G>ef~0%#32>!BzbBlx3uR_f@?9(qMAdvz%P4A8kG;lCI9`$@G*MMlS7u zfAD+CTZE7{uz(P4~1O)5j<)J7{;iQm1bCz9@M-S8sB&08# zaZx59*1+asJ4ltx4-=qvuRgrK_>*O&XelhbMzc7SJUoXND6Mp!{&IIXe+{pbZKwv= zlolfpOR;EG(B{A)2z?DTnUg~JL`%@DV3d%6f)ajxBamD9$?<%-H?A2axJq-7kd1^p zJ?a;%G(|g9&c@%^lEpaw2(536t2G^y=q_i19!&7HSdG5VpTF&+veqM}0}aT-$X}bq zfP(YVW{H98Ae#ce*B6Tx4Q*|!BR-CYaPE5Kxb4nJfqLv)%s8fiw$5K;Q+!{Z;@2c# z1_sl>xiD!ad6Z^eB{bUoQuf3oK09gtN zf`)f2nJcemV?FPBM!VH=L7Q}ui|r>{zU5(6g6YN!dgq~{E{=G}LdyJGM*@2G9TS^+ z0g_QTOuv=J$eKqZ9G4VPmO&0)biaho=GGxXYBTBWT5j@66%V1&gO&w(2WFkm4R}*n zgVX1JANN(i?KUIDzGVQpxM9>X_Z^>0qAb~S(B+MFG%Fu7^?9^tah1(-jNw{qzH9Y% z^Hx$v=zfnB9d`oa`Ff~3%ai!#540%g+8X3D1C@!|AwFw+XXVVqOw+!F6%G1RaMA;! z5BgQ1>g2?1lPVP|%zQ+xF~(#A5dQG)?9-6rRBEj2?a$77hlC3soiv7_c51b;KCpiO)r!k3>aaA0#*bQ_P6kVDA1f=`=0G64?_YMkbd;)_)xUfbEDv#H%+cBNi7=DI@?w zEn*PiqxOgJ5)~`8>n>;6wEqiu55=OGcX-U@Yv}|_@4swcE6pZ}Fo70(MwE(Shw2-O z2kS2AnQcJc)tt&3jnrbo50f^^E6wg!$f4PF#J=a`J7iU0gqAw&5xS91KrdHh>1#%_ zK^fsXBk6&BSpsB7O{dQ;$g{eqMMLe6aNSnf70wE1#3wD_N~{s#7K8aMmoLwS4SWmb zxq;z;|3GbbGTW$4w}tIL;%6M_FzLU?7d{@cQHF(Gd=_4sj78;u$&EKg(vw&sYeWj6 z*DnZ!gEH>{dRm=vh~$vccBko=k62hLPNYc3_^zOFsT{p9BoQ2;J)zA6>U$SLcc9eq z!wEo}fxkoL(}1`M$2ZlW+wBmf<^X_1kt~TRHCX#POAltohIKl#$Oohk(VR$=j<>>qfENH_Q#x5qmMuqJr1XD0kQ8(tY-SReSvL3jE3&$b&CVv4 zuWc3LMtVZJdUrXi2+2^lvVLaPNs}m6d%8S^UpN5biSq8JUaA<5h1+i>JC8`ZHR2H zZS?1j76I7@4k7pYkllW0Sms44DMBi0o&bjC$GjUJs8dvk{@`miq@RC|{iKn`0noDv z2FPuo*h%e4_q}v5P)=895guZ@JOf@8V+@$;4fyFiWo@h8^_96Qd&7@9f~5U*()L}M z3T7Er0bQ7%Ue{Ku5Jd&uRF2L#M1|FI8`+XhO7OabVF>Cwe4llXQgrH(8q{y=3y0H7 zlQZ}kitIBoOwCnfvW+(KFnx=|oADJio}%@5&WkXFMyNzTdpb67;hwb5yg$U3ET2?teA^tkO`1hQ7mz5n_JNZ*Q|Z z=Z4U$l>rOZ?#>elwsS8n%sBxfG^LMAwxP;xY4fF9k$hQ;RSzV0LTPVq_DJwm$Vt&X)*nZ^2ooLr#;~nCO&=!hBX4tGsMwe}~#8l4IXp-II1)y$;PQI*5LjLY%w<+}4xG zkxeyC(Am~AGd%UbmSBN)P*!o(-%DigUGb!iwO_Yfy$%cuEj>vW3%R9OAH^ZuvVl;0yu`l_Q-MNu$9^!p{L@vJXl&3FLmP;pSw6mmdaoCFG0~K(nM{oL9^!pg0Rs+uc^~6RU@m5hy1w;Z!zW_ z^Nrimp}<7jznT`Tdn_m}^POp%`sX>e!aqbd176nm7kkM*YJ&cjK>*YH%e5AAbCty3 zQkC#kMY83uW#zB)K#3Xx?5`cDPtw&JA)n2=o^MxMTr~5fkrVID10isns)2$ZpUT+i z;Wg+EE|dC?Nblb%LX{@@X~~2~diqb=U{}4waavr2YK|ARKA)r?-!fHNfMpK7R)MUgNr8i^&`7 z>Yl%{Z-!J!8JJx@EZ*OCjx=W{C*$Ss8$RM^YeL22q~(%BZl#1%0fI4^q`$MKp2cN< zOyLvw3i7E2$`I67%l@t+O=u*qhQD(NO_CCAsVpMbyEuzO!%l`^%VKDDRznJX-0*UGbiBvB(kjt5nFf!h&G5EUu`3+N6|c&-y*p~@4| z#5NHP81Pt7+##q7mPBw^r{CuPq_I}Kt0dXr1Aw8<3>;~dhOcIBpEXQ?Lk9%w?axc8 zEvAhWH7_VNXbt?LhO%u)2DxewZv=Va3?V|oI-U1WFoVb(|7^?b5G(g(NY(SG1%F9F z3Py%rm4d&=Eo0It2z;b_u_*)0+MXA?wI$wIt$)OW4+t3Z0_#z<-$Jr$`)Z64Lct8) zw$?H2%UJA_dat#5LHZ;?Y>!oXRH!FudSUNWOH@vN?G;jcs;dw1{-JA`OJR6R%RD+x zM_;H&9E-BAq@rAAQ4HV9G7}(!UZMfZ5xGO6cr=_WTwOBUb>ezrSi+o-!vu>1>`7$l z0zvGodX;?^WsuM^<;Pi+ghKUTDa7-b@L_zrC~^+bmg2@xeG*-DrCYq+?m5*4KA*lgItncffer+4}!-*aIb()A)kD?Yv*#Zbw^ZMr3*O>OP}R4j5730cb{ zw}O0YsV}*tBH6G-Z(x5D7in3o0Jw+pigo1jCiB5#wBX&BQ66XK>C9$cLh^%Vqv8A{ zO2IZ8_O9+rcQegCskW`32$S}vf0Q{%y#NYMM0vyYOU_5;|IC#1aQ32}G9TV?;Y390 zqhN=CgAim$ota_?+l@*?uxdC=Rt1t6G=@B=8UZ-}pWRYo2`ikqH{H``q(B3yeH2+W zOeo$t%n(i`Qvm$(@fA84fBSWb`C{1U603`6 z5Ww8|aDvcu0jBt7D&#GR4ZprAR`Pi_5&Stz{d_ty;FVZ0r5)xu55L|A4ORIIhm~{Nkew zCRxZ{dfFetAuz_xgVmj3hKh0_Le%KH@KguAmF)b01L>ZlBHmA#c*!w$?MDa=*FFG4 zCJh`t2c8*pOejVC+WFas2$o*Y7Bj2{aHBjTFA(CAN0I?5<>(ApB2YsQODh7%KD!U96w4~9x(W6Na~}Yhl!tz% zzm-P6Pf2t)P{Vo(v7aD6mEoKvG{WyH%)$(FLZG3 zf1U5}yoPI%M=FG;h(m@%?qNe#e^G>#EPjAe_AxZf6%OUlYz0uvU{bK{)rLap7YP6} z(jH-P+!jq|x5eo;zxZJkzSRvoNlKIyXc*B;LYIpak(Uf2AHE+hm^6!}f(6HKlrgCl zV0n9Dz2Bz~Jt?ek7vY0IGY0R2SF!qifiOU&rW`xGNWZl2AWW1kVRNLp5!p0ZCC4@v zET7(CC|y$dzF6d_AEJ_I$`+3l06V6E3RT>vjDC^NEo07lf5ALZMRgAhsajbfk`uK% z3Es=fKdNn#$)hl6?QooAk`+oo?{6lf#Wq6ud?$}9lrFo2ZrU#!nn&IF9~-kYk_X>s zqTje0!>S%Ljn0S#0N)g;4p0=Qc8E4J*kR7Ny0h@%X4`eCek}rs!&eDxYgS(!kTG_y z^BYqj{FO|i(W-@Mw`<+0t%sbltV#MUr>yG8F-}5gvH@{A@{68?UyuG z7G9$VK9yGf3h7do6K4SiGaRu#Sfcfe)mrg*&LXu?6;)a&w@#d1Sr@bP=PX+{5W@_3_?K&( zdRMemlMq8i5Jf~j|LzNcJp@dQI^cXh(&p7vbRkkhoA%IwU%Vr!7g=g(XaqXh1L^eC zmeYlxz)E#tEV8zm)Xp#nBg@2JxFblv@p5X*FM(89b+iJ2LpPzf0thn{tJ70!VJM z>D=BvNn^(D4BwZs*b|rN{FQTDk^#jAN6b* zdq3dpUequmBF3E030~*@&niV1c{qtVN#6G8IZWlbZIVjDw&dPleT1o<-7Bv)qC9Fa7Wc z2r=(X>STh066%#cJzG-56(zV_sWX!au_0d#jpV$v{)>5h4kU!EF$9{!En7&fzj;OA zfQidmyL$R0}1M2|gRsNy^svKHn*YqmZ|(@CeDbJ8T6~O&l4t zK$mOPQ%oZI%wRs#@MO%AdBP=;Fg*s42O92s@hEsqCwS$^l-3LhuK(4gk z{`Pdtn9k))asC-NLTMByB|=`VUS-odxLm&tM&PcVtMnh z4YpkEG`%K2Qa1<&fOULsq1;*zbguGwyy`dydXs|(tfPEIW{4_)bH9lJoAEo zsK=q-(<+5O>5Ah4rmiPH1$hViX@>QQRJYnN4!0O^z)ecIBOuh#1=z*g`$L7KEK@q!WDuobm*^ zSPpaDT#Zx8v%J2j2{4bXpT_U;u!AYc=M;>edjEF6V}QJt%m(39>PS1HNZ2}k!cd1{ z#N37&aF7zL-SLi)%Xs1D8X{UK^mG}mGZ!Y`oYCR-e`l)X=S~!_vi`ZYhG=ljQ_0I4 zEx)m*U@y=yU-p@2Rc~9Fe{y?vGiBn-k99EZU#n}ewsi@9j5Dzj=9QA+ya|WnnAtqc z*@2Ga%vE`M?oq)xBjd;D0~If++v-thYdF!M*=C)6;&VVH>*8vsNyGhK}a9^VKg1x;g}xBqGMPmv^( znFv~2gMaNrDCh8c<~uWDI9_R>egrC6W$=vJ{xj)Kw;m5a-AZc~ff5PKZz?cYwv7(Y zf?5T;)YxzAdE5v(IvLA96R;t#k5Q;uDIJUt!ip`MMOfAC{@Z8+Eif}u%?4bh$&Eq@ zI#H;Xr{`3Y?Fy&`AmKZ(poUo!H9|KR5U~dgL*&l@bj()e48@6`KXE_=0J~{m98FWlILhLy-e!OQ2)1DcB*J)2tmnjBovUt6>1g55zxeKI7f&m!fFV+ zkTT1k0||!xh_HcpfKeR>_?1R$4Sf#DEF#Z<6W}&M!eI##5D?o*3q|!8@*WNNVGRc; zwteDK!J1_il2=Y-6wM^>1~}RWBi=WE^5WrLNf1nbzt_7HTqvR0V)+OB_EzI2p&|(c zeB+V&1K|e(N!&zxWAM>GdJCa_6hjj#3k*by*B2Fn0FS?#@;>hj+0A$lZauL*V{lJt zZ^*d6Z@0;KIyo`7*iSnM$=zp1BUEZlWwnUu>W8rmOGaXBbq6i1+J~jC+N;VCdkCkR zv4pk>mqIXx*=(^)I-En{u=A5FeB(uk zb49QaOaaN<^d!w>@JxtdE@xL2#PzQNB3K~;VP-O86X0pGh?64D7C~bl^hO!j0(zd& z&xAg?Qb#{N6zK!zVAG~<*SyzoS9n+~}Y}q3iZHsVY76w#w02pMLI}pTJR<&vql4fksb(-gcE%qBrEB}pMVe^ z-UY0dy{wUK+!E!qM+)E5#)U7f1ZwtC?`d?|Tf7@ebfueouw{WRt4FgwGdMe1&Kbli zPb#AB-(&ACSIJjQXB*VAZS30H(s`Y9=qGEPKd)+i4Z`u_>?gC(2GkpKk!@clFX-tf=P2bQ=1a^7^(alX#;EbM0mqj8X)cyp*T%zesDWA8D|sfZd9Km#j&A zvjcIfx28X}daH5M5afcx*#M-}uJZk?#B$z662s%?Cefuji>zOoEZR@;z`i#d#cHVZQWKQb)Z7Jel}+fGz@nPlqyoft z!&HZBX&w5%=!Ud-*~Q3FD>DU(Q8O%}end9>vCd^DzX=n9{>XYILZrV(RagucK|V#x zd*JK)$&+CjKk}Pc&wswa6a{>iJ8H2G06wgg6T7wRrRQ@VReH&IrG=3slzs*Wf547M zL`7S7us$bqDpH3ucoaz&X+?sND}hMFFzr(u)c|b3`GjI+G$~Suj)X{rg`5HFigaBV zt`W<)2=yvm>XxHWQR~%sk;P8nAhI$4MpDeWB&kIdigp5+;sRn$0P$!JoZW!7s|@r0 zS5994!6cDy{xB3pDYfvf=>?+MkR;aamOg7QBs3ff^RA3Z9DNX*Bn6zjFoRx)M{VvP z409qhje+Q*;z}g7MCmDH0(I~jFk8Wj%1AcO&Jc1%LolczLz+_g|{ zLQ<#ReO~&aDpTDQ(7xxe!G)AW)FUXK{}a&&HPFF|-S^2wF8#73G*jEhnGa;q1rT2Q zCR6^BQoH1jokMfE0d9Zg_Gf*hvoh8~RfEZnjs6n|MsT75kuV8n&U!2>ttQkgtuygE z>hIl++ddnD(x$brgMqNKeUBTaQSJyEOmy3Zd64hNS%dEk2dw@1c|VvND!8aC0los+HJnEq#X4#4N~@yX=q9P7 zr>@c2Dm@--exH`Ees}nD6w1)9?M3I>=pMa=Y|^p$ljNM@AG3l!&)3GS1(vSV+MM=H zV2~_azDm}4#10N)?AUJiB2F&ne)!BO+Eflh?!LQGu)^mm!O711P|+D)&3g>Gy}mRg zLtHyoGP-XG5yKh0kNf(6K4`g&-xbvvk9A9RSH8nU6qRY|R;@azr(N%6I=SxZ-kRt% z2+pesnAm(18@dU2oR>V!NUNoqQE)R+E0)DR%?pKSTv~dt`#JV`M~qH*tKI(nt?*!Z z*1MC$_tF`MWKZUi&_l$IY0ZKJ5mS>*0o;W5nI4klEIK9{ayBt z0PeXaMSH!o4RgEFin@m9FDc$hTHnEl%8-~3`ns!-kF0z@9M16S?lrHP^Q-F$CAe$| zFh2hG(m_Fdv~Mz|VzymGgJN2ooWu$e9^`A~!aT#6ChTs|q}mI@>J{vm!Mb1>)tb0A zCj={WT(h01jlS!L0EhP93v|GQJDkv3SG?;5zwMI5bq(wvWmFz4L^H+k>(!(>9Vo<< zZx4t%QDtGXd|Xc8C&TlzW1S>8#15?Ik@X^wsIcWc{)Pj4G@Q3+k>g7N7^Y22=jQca zqqFm6drGR6R&kG0vG7bTz5Yg`Qpy*d-5AeHlKir?Tn344<%7FUfJnEG^X(WO9Ck`InphMpqkV<6Nf z;hA`kOEaE{%Vq`Ax9JUxY+m=00aP*NQiXId0fnPHDIusxI!buYKsqwt()BxXk>^ow z7c&OdWtP*4W&#Z10r8K!^9=*VUeUENDgKbCQTLTZ1^%+6BRTHF)~uHUZmkZQG@F|% zkre5(mR)YHF)$@lAPy~CW!AYr3>oEXd>m!XTDT>6wykfiYkWtIq4q&8Vv_U3LX5XkmQ z^yEb6CbqXK_eGAkOAgqK5Cw%sr^qmLDl=lRZ!$9kmOx=Nq>54OYrCxrH(2N*Ok&bS z?DIrGL;;$xYpv4<73jL>9^}_+?4Ilfph(bxAq#$kxT5d2*R41r9gUM$&%+1v0T z*x&lU=MISt+^5sRw==dt{Tp3+O}l_NoAfRx+U+u$is!DXbTM?yoI}?r%59)&5S&kR z0Ge|DgYHP|l+UU?LltQ4pa25iIb0QlFJ_6G*Bm8xGqVY>_r11qxpaO)p;=k7boD zjYP|IENB!kR<85jtvFUo;68ZLIM{zrPvn(JQw(SZpZU6$b&_Z|CG1%w7pYCqxSCT^ znQ(x1_+j&twcQh9r z6{-NUOc|%$2m&Qm3*9;k&`vADaGNk|VY7(q3g*5~cQU>HK!I!ox8>4y(%h`JjSuA& z{$wATU#Z(Q{J1;(z1{KlR>Hx>`z~@Lq}yQN5RM zu(`ts&=mWy$7=E&LCilXV`R*(o)L^{VaptLtYFnUKViu5Zq0oo%a=AQ#A-isF?`Ir zStseMYIwLOg_hECaZsnlB!Lk5R1WROOs! z9~KyE@-DwIyuRjp?s9`fz$;ZK_@D~3HK*(kfc7H=kog~)7&xAAMSc_7%s#drPWkzs zv_mOB(o0HddNysV-0jBY%%x-FezHgmL^>t_8Vc&GAE!^x?PcLsBt|zo_@+NIyZM9| z{EwK+7AAB$mz|lD-8$aN#PhaeZmu(F=(tdwrG#Tt^s)Dpqzlz1IX8CBy4pxU7!w+^ zw6Z@4K(re24@OjQu0Ffy%rsQba~Hy6q414XmOr*pOV^RkAMUAHP&Sc2k4`4ic} zO&mbJ=2?6m92oCMu=R(r7{9fD`Zc6-p9>s!|s%g2>;%MTz z8Sq&d&1Cz;^(m7)t@ztuwgai5gxFe`Y1+=l+ftz}F(rIlGF`HQRgTK2{St@GB2oA2 zT}IbLUpU}hV;M-j`wAH6i~*$QGY-2NOvT{mr{n59AcSk~EWD~^8wQ9EOv`kh;Nnj- ztZ@M<#_}se#McfJM~l@4OO?~7XA1fCRMD<6F29T7nOD#Wlbaq=Utv zivz4AkFIK=AUOJ7{4Xr>`git2%p$IN(fnBO2hOXWjylWpn4L%D#4EW^ReB zDR6rBqe4JT`;%i)*koIC%?u*KoL_GPx&piiD!IWj_kLTBOgP5M|e*G{cNRB z>q)6xeS6>OHI`{PvscEUpK{IECFxnzW}wOYwiG9{Y;AHxEh^AY%_cund%C0C@>S{Z zM(h5MMe2ytV%gvukHBMts#5l|{@W&B8n;^}-1&Xw>gDesr#0IVSl?IlXaC5zM7!!v z28Hg&(AhE#1wWjN&L~1=;jSmo!hY&W{zQq`c!SW`xaZ~O#5VYz=CLvUtGG!h0_oQH#f)Q}%wey~hmz)Gy!QRo0yimy6d+kUkPw^kSQTC z)$nnL*#S6o#xw^I|C&+tqB+sGZ+ID`&}R8uhL z&u;g~DDlwHQ&w_1Bti%AeL zciNJ2>kEedD~~f0nk!W*Cz>PI4T*}}meXXu3fKE` zZue`u(-Fo{#r{0YIT}KBy}d(({y)|%am}7>6pP}@dzu#jwe<}L*0YcEMb^OP>wf%> z=}2=B@1dIQw4~ix-f+vub%E@jC5NF`JmmouN(4z=zxUwxhMqWw?OctUQOcvSj95z4 z-cE+)PdQK*exZu*L-sp+fh!3bOD>)z-zP8b3jaGMYl16_eAxOl7*^GO);1fseEjc` z57Pn%{N)q!&%9CR7S)}a=>~2kGZz^l$a>?U`z3j2wPeCS=)YY2`MF3ZP;cLqX_AdV zt67t~ZpWQUHM$hPJ5q#LaAmQwCCYW8EKLtI+^ScjG2sl^@3Ftqzi6F#?Gno|z1sGP z3jO(D4>kyS_a^-I%Hx@t?X4&6nb>|ezpwl}-A17~+jL2}gHC)UL0tt-WgKtlr5RrF z%I=t8qtPe4xQtG_7fY?OXFT97HNHK^>p0XDJ5pu4vbU;@IgG=0aCrvHII70+WoB1- z`<=tSOIC?&W~|BzWCT8AxSUtr1{u-p`3iY>d&lEdmD$p82xc`=D1HjN+w`n00*4B8FDGL7(TN~-25bXxgqdfW1qfMJ!>5Wc$ycT0RAT=Ob$C`w+g#u&BN=tw^k z6M1hYp!`G+JN)%rUO}GrBs`GqO!E7!NqR!0JtqWdu}kOin$MPP0*1Gg9oPusqmU4b zN}q({+WijpRAoOH&!BWY4i(V6IjNsK`l3Wjj*sz{3-!VBs%gb85unk+L~<}el4t=M zDKI#c94>-f$)uKL-@~GmLO?^J4>P_sIFr`$1_Z}yDSW_nI;^Pfq5;~lYFZFf;(+)X zdIw=abV&uKTQ8HH>JSX8(J}!AL(S?EyQEg$-q(J%Yts)NlOH zZ~+{4!6*{JckHWJ=MEz^V=hY~nfwSSPfmCgGwr{=Li)Qh{-Uy!)H5d;wpNbQC=8hm za(G9{>CuD&`hQuf3QU>Sl}kBPY|>f^T;UlY7`%uf4FvTtO7!;~BL2?^V)CJ{c0H&!c7b z%?hS_2}M^fB^+c5T^-Y9uZd3E4~~}4eb)i`MbC|Y53n#q#C=Zs3=R*SXG}l#dj+CE zGVx4_bgMLaR>^6X7||MX4fu@9_f_++|7~Sz!#;?9)}<`Kf^h_)S0Pa=xjN&Xr2@Wb zl{{hqhia;@Ot4VK{lzdw3psom-wkl=?d*%~MLMAAHk=L@O$9nY=v{4)Hg>91<&M2n zalGJKu@UmH57fz`_pD0k^uV?E-5O8aAd#SPX$nq|V)(Nw9QsTHlB`sLObWwvnF?hk z(fIRaw)fdozbBRCgKRk$Apb4&8dbZDv1gM=~Y@DB$r86=_g8 zR^hnA_Tg}h0Fq_~n>EGXG2MbVC824>4QNdXeJ%p{eS0A=hXLnWzR|hTMqy>)Lnq)L z9e71ks6e;s!Ckkb0IUOUUdy!Vi}}ZVZ5C_t)Wcs7OLD$I|860VL1PE@YAL{jt!pyD z=Rn)av$7O#a_RK&M~XUCz&im}OL7|Mlqx}IgT0O!buSDXUwlL^O*V4&bW0=?S@%5{ zC^6{i+HvQS7`q>}Y2EU!vX}3}D4p1sFWK@Ojo-aS3@Dan#0$&4w|l&lSRM68gpQgq zc)`}%Tv7cr!}CWjrBmdVx+S};?*BW5_K?JJgWY`m)Bf8cY`{K$7P*f2fAi@)au2IC z5NCc9XdX1+M@^-JDkHgsH>HGD^tqFFDnnPb$wmtsuxQBEf&M<6hI}mqS^cY~QmG&m zvlqlNzJ|dUNPSfLes)6uyG8JjPWcP&!E}%Xjmjh4&`aC3NiZ+4&!dy^d8--Qsi|$K zJ&CD*G4E&L0?)a0_gRi5o8)SbCiI-(novD`A57*d$SNk2>%dh$MXqW8vm6n`K}zLvF4iYY z2_>^p{r^R~HF%UesRg;eg6x&YE-z-;>pQu6f?l{-M?!^eYhA$0UesdU^6Ux90E zny!UWchQUZ(rWP|LKIlxlCb%gLO%C~4yzxG1_3Y1T~6ed_eWz+`dQ0f{4R%m{%bWHlgUoi8OY-CY!}Sw2~3d-$5Kht`+JKvOK9Q;2HP( zuE%CMDEK`HCo7cx6RFf=Z+c|VR&@Mv5Hz0_N%$i!_wazw-i6UVJZE>{Fqjsp-5J4g+9N(oI(Bk)}po)#I?WS8|k zR^aBkP9r>7^IDupiht-ildtZ7CGVRUQ6JO=bF`DCISV9O*V~h|+=Y-UBG~W71^tXO zvEU0QAlsr$xhUdHwjH+Tb0=fHba9tr?ExK_7G^+!w9vF>fKOLDH4^f71pM+KJ*N@! zZPgVMCZzjYBt<1LAR4|-{TsVwXdPR>gasa?A>cqo2Y5nF2m63TltO}c!<7hh9otW% zSQGU4tJU#MB$JW0`oa(7aWU`xOD7mG!gNPnR|j!FaTu7H)ja0n{K?N8?2ES8uJ62_ z;JJOrI^en^9_j)bl&3GS_%)J7*Lx`j#oUV7DzEkv8I&nbGg)6W9d}c$gEdm9yk8HO z>Pxa+T8^vQ>(mB-wu7;SZ3jQToVszkKVbkozwGK0C8fO`4OJ>P{J;vpfgAxK3Ib;u z6rf%t03=E7t+;}feVH?1bTWyF*|jlGu^VRxn+0VlPRHNJG#ex01B=Ije3Ah@Ko>$1 z%l}k5gigBg`}R0FY25mK)<`C$QFIM0cj8*Q773*BE3?X}}N;<`+l7JhwiUteglGGzL^Prnb!4SO27|FpXb zYvnn?39fhF_hr$swM*UB(qpaBDcowupzA#V zPryyq;Tjr zQ6O$UM&%AwsY+>WS)kW)XtNOk z*c;cY&dVyEy|wDD*?UgSAF|td!HCWHp{TK5MwYhCy{iU6A=Q=D>_F;hZ!m}LNsynx zST181XyE$&60KzElz#Ws{^{t>R30+17`h@S@|rQO?I^8O_0;C|mviM~XXS2Zmv7;U zwf*pYXZJ;1jdS@sGH+#1Z(;FrJu6ItE`OK z4llZoT4&uc{)_r6ZcuKkAIr!8wl;X$>4lR0GS|N6u`Ig_+ryFnmr5&x@LoMAXOrS$9#wI6+Bny}%xYd+BA|#nT zi~%!=X@L6`D-9g~Qu+5q*2i^Ch#4#!tftX__IlD#xi~=B8UMU@?ez1@B{hHL7YnQ&fh*X0@(q|gSUBL%URVlp@XvL6Nvvz-V6-Yp! zd;W^c)3&USyJGkB+}UMDBk3+5&Q}qSoiZJ4C-BoO^LeA)34J9pa6e`Uw!ilItUyp| z#_#3q+z7=}!aKdi#Z}zgHgu5(<$ivU3>Ud^LphA_I0xQ{ji=b z!Cj$+TOhRvlV<@z`Dug0|&Ld8{KcoZuDnyBV!mc(BD()4Mz=c zzVV+uw5cz3>}9u`?Xu|qar`RipSF;RGxKBOg?|s3sk4+aie|F@6 z?`>@M^!@<9@5faO%hthK)&1|?nPazY1amyTJ0(-Pm63qQBSRIBQJ&QG4A``xOZ_6J zIY6|~P6fKE@SF-!mKs;e(#q?Q#pRHP^jTM-DdPgd(+#Fz%6BAQsE*OOR<&8ck`2?N zLe}d4SD6H5iF;sp(H;qWE`$y@y1Rd6a40Zz-b}k3|IXKr2&AF;#qM)XX~1Wd&WMGi*qTi*%2VwN0fAYWdtC!Hi)XAEmNln2Y*Ogco|xmKMn z-eA5QN^@b=^aB;;id{#&MTAAn^~Q+p;TC{e(qyQcCU{j;phcnQHCrxaUj$ctM%SX5 zFZwedLjudBh5+iyw~x+fvIkTt3U(ZZWkVCX#L0{X3`mo{TDrZgMLlV*Y_+q#d=}Zl zDEBVYn|KTI1gmrsP2;Gmy*%*fw^IcYG5~YYSX_^_S=sUHYD+B;@iPw{lDXI{9<$4k z%Zxs<!-zl|DD-?2aXTU`LQ3|D$E2xnrVQ#Ot3o@B9TFhcZ-Xv<^Sf7oi zXiY}sSDdJn#Hp13R9YN>UMvk~Pxz8cM~dRqvj$r%#68ell8M{T1^iY{wGSO8W3rq? z$0dyQynU8+cMaqQ@aSpX6u8`Ome$V_1AL< z95c`pN|8h~+1vy$V4iubc0u3Wm=(h=fh6=;z8@@cW(Le zoSeclAEno^y(9^OxpGj8nnkT{?(=Rxjjm0B(gC%}kW@YF(bwsd7FQxg&iSk0qS z0+rHHeu>AY?dAYcQFK7~qs%M}O5boiX{S21S$LpCX&fvj!%d4;v|<8thOBtw>%)Ub zr?wNYmS&FZtn~N;)c`Cs0R{}k-`!M%T3!i~7o4uhjvMv@DFFT?(ayp&0fgI-?B9o2 zak4yq{4%YBa@xLVZo=&O!0Z)giTn-3Z>4$_VG6|_hn&^@YSlA{weVOKSqRL_lZkl2 zrNCCpGlsZ5|Lf8DJ&=n#DUu7rkxf}Y!?WRgp9L&_#R!!a6!;(e@%x=^uIO^rZ=Yxj zxHbSQ#xFzHWJrcXWgwXBRBFoSJVR*@pl!LR)((HanNj#mNQ@e~yYyWZ9(s1nX%`f@ zR}CUjv%ipHxP|e4B68olQf}~a9`PR(JCa4HCh{>TFdgNgQa>RnIyv&ekn4;+)usE6 zCiLYJWUby04pqZfYu|{c%c?&h=QIS7&1x|*E1k))=8~w!2>%T~g&hD?01|B?pLc@f zZ$P^>^}h2Ev)=03O6iu}0a5rhJR;kq-Q?d+O%drrf=Dc_64+?uk(vGc|4T=K^euA{ z(7d1p*P?2>Hgx@xFQrD3|5+;+USv94M$tEK`?smYVY6ycSlMAh?wLUpXtw2yqxzJR zjWS%kwK&>I^HvAGl=TH|JE@;-L6;P;M7-d(KqQG21e)riFq9?g%E7Gb%)9Idul73@ zYvVfUecnB6XltLH=!jr1$-A@lN`JLUJ`E>oFpeQ_`AAtN$nYa#wd%GK?O>MR+^>_ybFytPm{T2wrRzbViQ)J=ApcyB-}D_#rZ> z_%KjK3N)6Oh1dXiO0(2U^(b}9_8oBMO#Tb$DT3?N8i%0Ks?*WjHiVl4Ew3{ zApapnz4A(oCd{<*FC;4PauJlNXa@`AsSzENPo#U#>F2(TCNYrdxDi~z7$?bgZq|Ip z2(bD7p<)=m_qcY5U}kiviv~LW@4zyj0tt^phRA#It=jP8q|m0&){-UM7p#<<()j$Z z9(PL?-hp)L6~;l04m+(gL+BVAj)1cN_gRO5@2%P?PKD9W(6ijOA9Q5jJjR64O1z)Y z0`MuRtT`|7q&&(JxF>nKxg4QG#9(kO_}w-*z;65%d*KhTFSCrFvIponH<0DW;#uWk zG+Naa8R6HQB;QytrK>syc7G3IOPjHJUVTV1%>IP7VAA_Q(GG9}itIPK^l9j3U;6`Y zoty^TMhx0wcIh3foS>6`oSeXBJdjG03zz*IBwXKjO}nRN_(Q~#qQp?6c>!)Ytt|~s zq*5UJljK9x^EJ?JMq<}HpvcN(d&ZC-7YF~&uKlO>2S5>B08Gn6dx?q$^p8xoDF4MF z;wq60>0s?qJp>(b3SgX3C*#dZXr$LNX^YHbZWDB-K0cI zeTOZGyje`aTfVoWD>(p=lfL6UJ|=ddWd1?&FtJAR7;({+H>2zwjL(zdOs{BKBbO3; zc_m|oN=Zz1;-s%Yg_kO`dGgn3#{<`-cHE!cU~jn4($=Xq_S)l z^ME?!S{1q64s^|+RBY}xWCyD1#k+gQzJ4^9NC((lwxl%SAt(Vyc4L>$A{ z;u{O}S4T2-X)2EN4OrBuw+Ip(F5Gfk&UhyHCmhzplWR=O@;vqKTmJmJtHX}%=?VD6 z7xGQ;h>XOGp)?D3&T7YQt?lsKW!)06bb|iVwvN4UQh*|%dqCp^LK**1Kf9p~R1sjJ;Y1uJqvNu!p1ZXoDX=#LCTt0*HC z$(aP9FPVYgV-YKM_w&}EGsW;Tff>Zx0@jYdP!9h{kQ)+yt)#KZRh`Z|)L$U7kB|So zftL84m~|luD6AuZbVV;@lo*1R9VSsXJySJ1U#(EkhmWgnuX;Dp>O9B)EgpbHWTX~0 z6E$*eToh{zg)HaFlm23g9{O3ySpKpxHm@=QS;Qf0t8u(nV?l>r5#Bpi2d+^om>Nsre{9;@%rI)p%;--DQ zn0}q!&1gnkj+Q?mv#*gBaW-5EqLdjr4Lml9vEQC$D|`MxJ9ts1vVf{pmr&_bJNN>8 zPcnJSaDLSBdM09eeO7@)MBtzPMOPv};GOso)JN0*oWAZ_B-iNGQR%Z**{;m+DuOC2 z(rJ(v%Haw(8!95lI(tzJH(}dRaVkzCm&hMHZ$A{9WZ;iOEz)&F`~G&@>|*oW@?t;b ze>MGlo^Ht8-Dp5a{N*Es`a?-9uE7Za_=4E1)PfjCZjchjlZBMHw?xvRw;D$jwd`YnSP7To?2(M+)mjwSiKF><4fP0V(iEsj$THTd})u{?wgF*{5LKVJ5aY z2}fk|Pxj+~X^f?pjrJS*6`uecQqny)tH0cE2AX1(a5O{|5F9m3GXz&UgyB%7YA0AS zeI3$IwI8%iFgs4fh+19FjrvlqLUJcK9Li=+{2RdgT*ir1fi*Tt4;&;gz^kN!1C9Wt z9T$DD#Cd@*oMg&x)%vb;YEL{Tz z4jyrG|JhQdHoUFDYYk}0z+DkN>>&6Y)H z+UdA6IC8P|vk~X7^}y{TPz=XL1FL|nkTDTNzQVB(FqF}dzlQU>(=v>6&+&uelveLw z!5=nYYq8iwP2v{L+Kw42$wrz5)tP5S*OIGMGyOZh zfim|i_T6ilqjx$KRUX}!c0vO`ZNs52os8ePU!4tLUEn-#f%=5r^+`!>5KG5$t*y~d zVJrUQz=UQqz)Bv)cVErpgTtcJ1izbAQAiW%bfrnv4lKj`a`z7%9pJl1eK5v-L3F=o zBgu@GoA~zzYN31_M7i|%o4$5xIjjdw4oixQ763BfRBv~)m6QDikZ(ArY%__F3~i!n z6$c%F_@g7%L4roe`*T~SX}lj_a)?#3`xA-QC9&QclHZ^>p_8CXP+UIJWG5BwYn554 zS>9@{d<&t`yOSNM;0?=<@!ZjKmsVnXJ0FW7l+!PL9i&_{4cBhyGQLFdJgs%RdaNO) zKJ#ZX>uJ|!@@yabxv1RnG{CivODpefECN5R$z;Z4#5#7jc*rcKLNLqDQE5Bqb2%W@gmSxw<1ZgUNovAUT-OB=$$-ui{$=vz2F#r|iFkQXXYzE7X&CW@c&tkYzy zyaLZAXW`X#=Ug5F$&lL$Lc|LZ^?-dbB2cK8}g;f_>Z87v2hQ%Zlj(Ei`j8gc>RLZ5JCN} zs_>sIA9w9LPHW;Cqh}?pwzIgmQ!WPf4ndP=`Bus~vQT9=aQTM33 zifAarcKIj6#&{xu!i}G&%W45WismnpB0z6sjj7hLa#hw_Y&;NQxyLp7&8dE-FZw|C zXX_+M3NRM@Q314}zolmP4P_YLbCIl+xRU004ui> zq@idiE{2o9b6%jy1~ra!MJb>8Ct&k$KO2d|ODTVTvYP(GPW$MW^IFPj?Z22ENyG#5iKLS1i#_ zkQCmCZSxG-`+#{B$CZ@~OcReT7lK&_HwJ@a%{hMi9Y5}as6{wE6Cd(Eeco-IzaNtt zaP4!efG{cOQb=bkb6+mNItZfvv_)d{mokNDa7a~wzwXs1)qL-LK9<93?v;=5lpl-7 zKq-4$C;ZqIj-R zy5&ky^8R4`&j`f0{@!!^=C@JbEV#b^maLu+rCDm3U6n97J`Dlu`pk@pyYX8V;A&y7 zWyapx>i+nIWbvLU#r44@+|#Tf{MQLc3wxh&E@bnNhlKc{JEL< zya3;sJ(L_Vi4f`B9jP)_Mwl3pB=}W1x*iZao(vd{TU}9F`2tOdXFqpGOWE7wLC)>F z%4~|mNXERyK%DG~OExgWP?V{s9|^Mztot|R?T)62oLd|S;5Old9%Y)xrsvvs{g3ZP zr%YW=^--iRHx33Fg=7+r&C@FCTyd4N9r_{e zmO?g_2pD~maz|T%=vw@}7H#6lcm^0qJM=k+9VKx;B)hB)dpOl?qkyCfsuE!$F^J!m zRA9n460dg44VF*7=VW7Q<*HJMZtE^HauZ**rI<23DB=&Yz2(cx)i&+B9*a*@KG9(X zHKypfrNJrcldMKG#19UFe%gtl-UCc9s`IXAz!VM8+fTuQ>cFNz2kAmaC401<*}KE& z57_RZh~@$s>m&&!f3%#8H>?yKvX22SnY1fg9JuQy;{fMU|%KX3l0Yl^q@oypNQM7Lg@g-O~t5vIx z-%W0^j^`>$_$n~|kFB?0tFrB)wUJH%X^`&j?(RmqySqcWyIFL1cOyuHAR$P%G)On> zn>U{C{r0hc0J2=%F|RqsI0uyyQ8t-vHXG45aIfy)+ds?!YRIyxdij_W@`dNnbWCVS zW*8Eo0JsCtk^+xTQ!br%jIlU~BE{SN>&qpE)F6|qK8pF#rfkpcCOGfQGX zt6^MevrW@VrjT8N$Jl!sL*oned_8U3U8j)W>&oph1;p9CZCZxK#n&uOgV)T5EZ>_e zsSc@F3vMKqV;zIr1?vd@&R+VKR7%FxTs#CoS=#mU+A%dkOn!~I=#v5VaHA!a^3$pW z6dqK_mS0jdn#|kUn1soGvv`se8(A3EG4AGZyA<0F!8_kt^~X3S1qc?3L9{qV1wcn#`$F-+9UU4%Zkqc2_Wm(+Cd1)p(z-*aJj8;W)2nKyU* zhR>ndQoDJLH_U1+T=iV45WMveQf<$0Wjap)AgDt@qt%zUG8G(6l<@B2Qtoz7Tq8#?x+)^w!Wbdam}OhuVb}Kw{r3^vvSV&Vw`fQR`hp(x1*gzC&(UvrCD>37L)yW z2aMd&T(4urac|z)Gl`QNj@1)i9ngBRaNZ|XY%}*a7A%-h4n;^i6A+oZ0XZ1B6I*jJ zcXER9)Xq$RmWN%y%pI38?pB>FhfK&%%^%K?KuE!$v4OrGlGVK0RE^sD%G`7pC{0ioc)3=s=>;v{ zr5S;Tyc!cb|eP(E1tTU+V>-U7Yd^w%I?~4!O5}e0)Fc{-R*{B`7 zy3@l{;2V$Z@`8Ol>o@B?yk9R~_eFkc1R~O-?M^$_ZJ-Lmt%G1lm1|_qTxy6nStZBK z-k;%{D}q0JV%RuJKfBXvJ6Qw6cV{f`MF8w1XJOxK7^|(s*_^+#&KXJSS{aFRcA2Fa zV-R&@l7Dp~K2nD7n<#9VgM?tFM~<=whf%i9V@6C6k+@wUNR@P zUp=r5JAjg*k_K9pwCd-)X)wG>0na`ufY&*x;?fX_#O2bQUKT*Mdi`ig!~6IS01yY8>WWQ`MY z$6fOWALJKejGilu=}HotU%xTPBx3eaJ#JBkh@SPlFFpC5L+K3qQNI84O9z>NO= z`trky+Mpw8b@j-8nwhtSp+gf|?la@LtEccE>gg^QMaIFPO;5AAs*+_d_7u_L&zT;H zvMo?1i)-#xeD~L?nHkGHb6G5|!)z|n4#2#?8(XsH|?{zxW=NWu_7t4N{D}i48F41#L^@rSO%7)dm)}51^ zy?TR{Bu)BP8PU@0sJ4Rbz84hZSmS87IZz_JJ<6IZ%6qGOhUFbEi`!ed#W!hN)uv0I zsFT)#_cm*tw+2Ep>7b2bKA?{G??Q#i zz@XJD&{mr^fe_7{QzG?5y-n+(F41b)K-EJuYUM=l&BkJM7Pu!6en8jJuIP=3h05?M zy!v=;FV+o-ub*cAq;WEexhZ^cp{9sFu*9MjK4=H)zRf~ zzOdCUnbHAdeF4XD-+{Egqj(_FVhW#u+^fiAe$E3+E^{vTkz#m+0uvKM9#VGCTYr z=7ml-o3#Qta+$O~L{yv`-q-M0d|vf8L0Q=nBJGQ}M2oz0sH;BK47PLs7Y(gu<1$Li zEpV^hyYp^AqK=553Py6(T0MX9RND&E&bOaVUiUvD8@)}ENQm5G-DsU8$i8i<|!JYPoc8qI1?{c16o5 z={H?0myTzLJ(v;jPel*RWyiU5alX{HQC7kM=fr;`abUJaRFCz?%=9h9<8A_59PmAP?_GcCL)K!?u_P9o7hLY@bxs}h#lr4w zY;>g^n?O1xoXr-caFMbHp1|1)H#@-S^KSSlN!kW~;k%ngzrT;#5lGMH(tGUS)r*&x zDUNdfqBdxM|H)n!sj4~5W5j=ZD(!M5B=S=IJlFXtc zylSq{R+q;S9ZR#{3YWA+KarB3qenBz~oOK1(REz^Z<2b7JcQdwCg-_@YBnO8; z`sQnd_ZO6nMnf`se8ZVpY*wEV3;)DO(P%ND>aGi3O|oXHjZ_i~KoZ3?m<) zQpEOLj?-R#M;5e9%6ZxekWSz|YZpy+Btm7W58^3W!7r6YaAw$5p?JK{A8er*cS6xu zb~l*~5ylW;ctFkl!i+sqt|Ku{G{PK+X8Sd8JnmS2KP0a!hHn*7U6>)X9$Fg3n2IJh z!J_{sw%FX(_i)*0O!{kT*sjfK|yH_~{I2^h!Bp&o?teNd#<%rO?Su!IHrAiRjjZnY= zhGD66$Y-=^Y`2mkNxaivRq6J9)%l&9K?uzxGha0HN>-BL6nSlc*qM6x!$DDeGY#2z z0wRhCgB#x7Fgbm)R?3Q(fmfJPMj+QX`#u;cgPN0nL?hCm#I`Vc$RLtanrp-S*}2h8 z;J_}un5K&Z@$l>nc#|a_L}s&vRQjKtm=nZ>=|g!eD>pOYROPk`yIz$1S!y!}@)}Jl)g}!#~YW^JQ~FP;Pl`FcK|C z`9>glxO?tZsqvwm^G&t}b8FTjZv^-Q_IKHRh38WbejY-9~Lq3DO^0+_YbZYa&hzlD@!0S85(e zZ4k7?IgXYXiui*ZlrT9PBNnk=L?7=_3UK-g7&CKhuMcLl;a0BQ4jo>AtRSEQ&-?8! z>=D4qr1LK}Ie7eYj6{)!)YP5wj9bx!?EjtkzXCy!D41f9CyWs@ajxv4bj{VsuHJv5>UcH$%0SUm033MyKYc; zI~C~h+ZN53r=!eW`+QTbR1!r|tzvJ0Nuyp6=J6+z*JrfkCW}o0%bD5>rqf`m5%gmC zJ$yDS7+Bl0pyWPf0l(a_Kds-OM=JPMUcVcnk)csMe!)S?o!#s zA`PaDP)I%={~JR?w*bc45g$=FCK5+LfyhxXOVn?Uy)4*-w7Mz?CzxGA`pl)2Z0gW+qrTMZ*ERg< z6T|NUuBgX)L4=aiWax83*y8SZ%}5BG`&E}7N~HeWI7%_=uYl*hkfMfn!VysX;RK6D zCwq2#e-aQMix8Cn9?;-sxQYd<`RJ!HUert8uuDexem)&O#e}FISGzG;X@2Wv*blft zq^BT@Ob?n<9{y!vE;npmmllAQAdp?o5r+(!eN>{W;94Hh5sa7gK8r||{(hQfQ+xCA z^sQ;zfUjj4sO_Zez^lm@JgtZ;4sAXh`Xr4hphjqnA7bC%G6yXwTk(n3?2Um@9o7 zFXS5LSE?ytwBnPhH*3H@O%Y&t(HXEXGszCPKwah<*8E@sU2)R@Pzq=_+;rUkWs*#2 zK`~qpVD=l9$Qkw|+i8jM(D|RW>wgspI`Cc;A$<4YdxO1xi`+C>bVeH9Wu_s2>QcT7 z_tQ06UiImPF%lxDhKLXFY1koxq73X@d=I+^4sogga-4e{o;$_e5;0Xnl%wQ%_#MN8g2~KDjDmHEf~NdU>>*Lw7&f%@RJ73z zmrPX65cKWRY?apET+OPS6xs{@i`J3VGUI+noQ~~iUqVPQ2#hVct-Npc45xaKC>wX6 zKmc`5aLNMfQ@!%i9v=fD&}Uu+HvrTU{M>bG`;*;Y<}#YZ$_?*2JIT2{(-p6B7YS>wckznw)-<*s&twrslr(?G1cx{2Dw(ped`HM z2w2Fef0|u-^fd3W6KVc`SpcNLGKNjD7?1~T^<0Q7hKVHN#wE)Y3uwrY0kFPd!N-iPXO`-zUZ%%*C#ZzLLEAd$Np=RLY@5IGW5@22S8J+891sDd9nVF}~R2gZF@TC>~W_3FM zjftQd&cL`}#yH`L+6IK4M&M?2K)L*|XC(+Uq1-lmc;s(1IY(V;IWOOho1iX<#z<%^ zftR_7BA;(_8&01|`~R-if7^l^VRxe@$lq6O$@rvM&i55L%DvfiJPAGgCvJxi9epPS_^$6Ima?a5-D;SnKyC=#uuF zic~8bhfg+YXC8@RDPt8DEfgjGDYcbO^F^jBz#}Yr_^b6psEWJ)o@gKhl)57n>pVKh zRD5POLltKs`>G|BFA{LTF@|Ol%yMY5z)5E&5Hh#HlkKahLKDkrPs)jju(0iFBon{` z#kkDqx;c>IDN=qQtC5hQoS+pY_YlLV0_R9)D(rx+x=0#y6%wNaFJ=R?pbV=~Q2%bI z&WHLSDNi6NWHZ2-yhio(Uewu7h6-pS>xmg%rvc>FrE=S%`lbB5Yg{}CC<-eUhM0RZ z0D#jb{dRr>aRFev^<$ObnVhwnO*OHfvkY(@53(1bAatzTQP5d;DD3!IA>Qmu;e|NN zI}#7hx_dFITBvmqQ{EPLyk^PdZ$O7%{u3)GO@-P7|b9(i!Kw-vAp6#Sa8NuF=Co9q9fVqvky*TX^S#vyJ(&{CTw26>s@F5ZDG|2cmF2C!hE?Cs#|Co|jDiuf9-6Cy{O zW1rBxmdQw=NmMzF8tsy`Fc;ouc|`6pqXfAZ)Mu5h5`{u6w5nl8NjuoGa#)_oa*CLx zZGC?JALUAq6RatXPqM*R?LG#;=LKUAc5mci75nt*>_yerXOkrrQ)GW-` zSD{rgs87)xpm{~q=Uj=3L}|}aKe-cVRsR%PW{Ui5yC0@1KnHzO)z~b6xtTDE* z8LlB?zQt+v6Tn>(PE%Euy#xGc#O0cWKZQ9yj8W!UI-5a8W&a^l3TLNL2BMgMWtqr} z9G3;oq(S#(FWUqJZUoEl=g1L*Qyw7V;Kxd}e49XMe=h;AukWef4ZZS2BPv!rzyq4Q z6nlWVeU)zTwPMYHCGZ(IDZnS!)2dg)9&txn8rd3ypabX8<>ZBfNkHbxqJ#k~9S^ey2U=CL{_8R#vi`R<1<@hTN}_-~D`mINW&) zW{hsVL9e^Ll&MeO~TcLz}0` z@XoL2{r8hghveIU&5jnGHb%C9pLeCSfnz_Ew{H?NPZ?^uI1xa?aLa9dI*j>Njzhbf zs?Q1)l+)nrwY{5bV>7C?7d`d|AI5Cf;MjC+;ib`U8Wo4lDDqX$Lkr{Z;+b9MS95!$ zd7BnwVA|q*!tyVfiR`!5QAvomq#erSeUh9nom@t1dkM((d zKT@d?aeA=1z$ zD!T2g+;_mMXY_p_)?>vDvZ{AuuD$ri%{YWUg9Wq&EYSm&9N33;HPJ6UF;pH z{l>Zc5w+Md{Qy8lZ!lVzp#66yk6Y!c|JzHZ8X_v*jXrECpsV#0CFn_)Ucg26t8Iie zz}|~(&Qn)`ouXm;%#xsdhZPzZeMmf)E4w%y=OopV;g9_ns2tkL0#|bo#_qMtPeDTi^fuU4RJo-xrhD4Kvq6K<^}_ zJHckNOwdqP!gBzk&blr?*!A~Mg|AVily=1G?jGa?2vT+*#&$K!v~h6OPTeb%hIK;y zXANxjTGJ)RBIiuSq{?nq5L1X9Hb@rr+|wfM+fXGoHxtn=Ujqd9#Ga`;4#%5H#>mG= zh_}qY9LA6g#6PK*3lWGj>b*x`eMS&o^TdnNsquV-g&KgCDp%-Jl=iPs1aetc`!nVoWOX1ikfo%?e~9QcS7!> zM1NpQf$-7Ys_0JXy36+UNBdgl6lS1zW4k2InMW#tH>(Xezla3R4XXAd!j!44G2hsds}i^d(xgWX68sb3@^_Vls15yyTl));W{ zeQ{&<>~%Dmu5@o>_VU|H)j0YfdB?ubEM}<2i^pb31h~&r2>qXxt3V><;WMCA`vG32FAU@ zj>+1n!$ES)+lyi$L7R8zNrQ=G4^^V~9F}=C)b_-?`LM40G76nuo6S_}z$HHefjEWm zMODpJi*6zw%CP{~&sj|!U{&l#MlI_AEPuX{{*#l{&Q-MPdC;$-)`@x|Yn~3AhY5G3*S$JXSPBn4;5Zk+ zDIr0z3j`5nGK#IvKNEKQt?t3`$ z;x6@_sb1gL7f5IP$~4fJ2z6JVGpi9?2PR1&qcimdqSj1K7@j|C$H?vs;E|>J9)@(4 zxhcGq9EnSjHcAUfb(xltRc>n7FBS5*ETz0}QlIg_n^@^rbAaOI-Q|z7hD^g^nZy?= z4xIhyE&8g+%Z;jg;U9#ga(gEeRB{$&Qm6`$?@ndiYfNgh{+ipI!7XaF2mmWU#>MjT z=A<_?MLwgXzqV_4Sk7A+%qGp&lu=b4Yi{XmcFSsLs>;RU%5ZHFhgQ(47P%7mtpLfn zGnTuK`)+Rb7Cxeg>FJRw^Hg?*SjwvGkW*qtTTa zrpwJ&6Ac5umT9`@9!g*6DM(6}iZ3%A&Y`0*laPB;4C3`U{arysjJtfmMfattx=oSI7Xa4*pt@*A0-Ad;@}e5ox+( z;Dm(yF2^W)h7o;*hdrT8Bv8zOuvcwlN$JN(mba0np=^E9~w> z@`MHGa_`1(-NI0ivIxYXm3ghhCLk&CLo=}uJb`$l$Y49`@qsVz!5sv?QU7;n6WYfxu<$IWh{z0O8DS_B zfWNBUKTT!`>;5N08qS1Dk1JLhDTXCq_W}suS!0X?EtKPU4&4Qm0@xAEkTg3Bs~`!s z+u$+Al*X)na^TdG(&cGQ6 zp|TRYl3b38*|P;G4n38~IbP)*&9Lo9FVZc~5ISKS9!zAW#F@*Eo=@{#C7T0$Itm*$ zx~eKLWh|s($_DNL%F7#Fr+@r3i6H$CHgklZZ+lt<$;>JLA9pI)7j zK2;DqIwLNn@-eXn!jxw3ys{7z$g`e1>yiiruTDRg^9)5{%)Kz(k&rxs0Y!uc z3`)2&y%I~=(aWx1BjKDqtJ-*fvZacacnnH<(@_PhS<<_ZB(Pd2tWkzwFBeH7EBYtS z&N}1^imw#Boz~Ga>UV4U#28M(eBqeuyZmDE_=7Gc3z(GRMEepNvV?9YS*J$L9s10ljG6;&wwt zvCo02cz5G?eo4doIg#m9Ns5`A)j-C{<*gt~)tm5p>{F2p>M!jDQ6dY44ZqaS+fTk! z>@nucDc_6zdoRJ<-PXnhq8BEF!)`G)H&S^`r~I?_f~-qQ`a>~%p%SxO1^3agfO+kI z9@_7@?F8KSb%8k43`!Fby9i4tn3YsGRd`{&CqPKDepZsK(B-ZW4Q@PmS2ifYh;--y zyi;(4OJ4Gn2?cfbE#OI&1yC+G)UZ15E;03dv7AI0Tp(EwE*@#P_!^8NQ+ zDW(S~Rd)($qD@?qEa`OP;J$`;>U!jOG(+d;&Ul>7Zr~$1nwVybwRA9X3hE~cNO7t7 z_M#`?T*OyZfW@Fo)&9%eu?nca$czZvE|iA(f}&>291*>VqM#h zR~>`H!Hzpn0`a9%s4B6+NlZK91z&%wVl@U>+9D2A_s?XT$aabKCrKMh1vXnTjlACP zAj@k*Yb?{L1ANGMmQP}$jv}d_()XJ=SB;DlY?S?(#cZbnxzQ>HP2LhE31+J1{2%tP zrgs_curH~m(eI|@y0;eyzNkBv=`kh3{86~_@P`ZDMoeA`i;=@oYTeB(6p6lgb`%_m z!>0vUk}|>xzXD0FVLnxOX2D?qwkSCv@XOrfO)=2BSw(r$Z5YWTk55VHn*=cP zZ*;xmR{5@fiV_UG0Y)AQ4Sg@O%H;N~wEp3VTv*K{tK06nR`q|K)&Tq;H{`whd-_n7 zY&1xqDW7I&$WDpwX$}=A%C-N>_PzOa%I;BcPC3G3gOM6zhww>LeqL-tAP*GN>P|8 zh7*4eV5wA_&0P3fYLX4L$3Mxb22be!`@OOB=|f5v&QbLb5WPvC{kbJUqQ@$b(1D=lQYISlRDJ@&fxa)mM?FtN(l(|8tKBalsa^ ze@CSJB}Wh*Nfn`z0Iy6r6v{)B@t#j?&kOV2XM?p35l2mk465sWl%Zu6p<%uK!MPy? zgeuu15k3(F(+(2};||d5Q$d7q=@#LTm}^344mc;({1T4o5~c_sV#GC@(6R3j zPnPMo20&8Usc1p??m*7Sn)67)Of^r-poODA zaXUoBQ~Z#!wUUH@`G^j^@2ID!KackLXuhH-vT%O!_aun5#hJ{^bp`OL*6JN^3E-zH zE#uqM5|4;9isOVn$Gn5zGZQ94@Zi&_Kq8%?5!MlX<*Ka!@dnl=##PyOZ=H2%xEK#! zs$3d(RUQ|`M;Q&D#WW(n@sRCk!jGNIz~#rr3%Ov51<;aMIu?eKq&yWu6?w!6FOoqG z@$~NIvx|JO#4c7i>hCF(pR>;eEW3(Nk*+Hqi(3HPaJCFM>+QI~i5vb6FttI{eW!7P z1pRwAWv+q!#caA~`~~8BRO3-VI1R=m#v-Y8M-4qp>^OQd>WDf@U={g{7h)u_8MrCL z;jt8)T{;c>!Pm^a2$ZIVh_r%5ff1bqR3lFdjRK5e*zIHg;4l*?An#jEw$fIBKm87&{$+WM+*4LdV1GCIemZ!VE`4~$VIfT1c(zWPX3Cj=Ftj~dy}3N->XWJQ=}Q%f z?UH@S@|ifTi%EiWS@0G=U%m6ld+5G?aOHN&%y^uBYn?!vj!htu7f5yHyusWyeBI_b z_Bc3@#&`c!+9Pn)FW%L1K_cyJ0wAJlW*Y~N;L40fV zPoweh#<~S;wYxVXD-#Ul`Drt0Yq>d&e`63RRoo*Wlu^l}fhLZlNT}6dQTvemy=W;Y zBjmPYswd&i?~b59(|;yGJLgIJd=J+EdOx`l(F+~}X-EHa$;5S|Oo^(kNys=)`_FXfD81TAWL_!~KCXMw%rh zW)-a)g_xM1#VK3{@eXI8wxTS~7l@iXO}M~ZpcWnh_4GH$1H{vCN1$P)AmJCYjb6V@ z$Aj!qRwI%Ye4rm77t%DT5g>8ux_b2QNf z4x=?4T~QI4KOF_N%{okfMtBpOiI*=GLJVc`VnT$)_Cfl+z8w^(d0u}&JX*_~GP4QU zNFUfgJuI;qBLE|t9guCbUGf^OxQ}r(TghdBk>jIh1LWG>Z}i#j~{}*ev!c4c)LbDfFR2viLifA zeJ6TBjV~mB=60bpkTGLqe$Dv2{2ZPiVvX1aAm6U^#tV6Ew9r00q5=hOX&>=P z`1==JE711 zLwJc7%i_JhlEN%GY*tAl5L(_Tl-%#qy`Y(UTmU zbP5gGoxXHb0ZeyNKw5&R+O9LAg6 z7?}=SSt7v8^3NQ$jZin#c}m2G3;&c?V!=P|IWBR^3`z0=h>)%JYn6RY?cvW#N#SjV zXT*h4)WetqqazXxuwn>-_sJJ5UkBq=bT5o}{1*7Nmx^^d-+p8U|?aD!5O10sIW?<_KucS49TAIh;d7WYt786xJ#wlLl|&&%;Qk}guyB1*oKZe zmy3SRG0UgVUj-3B8?nruVGyruEel}ph+-ub&INfv6KQZdtgqtyD1ttAyS)A|XcSRq ze_2sipY5_?u#Gps4*BJ4Z;WF?u`+wf4uTo=8s1ax7PVyyw{UlW`eno7 z^!9q#mShGfc-p6+NX>}f8H|@Kb`V3#tjbjo5}S(sK~Q^uYh5AnQ;4<=W?(Z3iVc8z zWuT&Msq#@|5~|^H=hJUJXWRkNwKL!wPkk^C;-E_<=xtCamuo{4iBWSW9!0!@gs4ZO1a{U(vQkI{o<1QV*MGg^#LVHGp`%L|e$02eX=!Z< zHT_4xRlXp-5NPXA*eGU4K zr+j+(P=Q98NOQ`9kh5;Jsvc!@s=ho{CEV<%4x?cHLU>iyT>1;b>PCaGJQ?Ak<7XPq zspa!_QTFrEuBEKT!dH=p-=>yEpx|#Kgeg0fO^GpTbZu?bgjb8F>4(t-zxKwOO|Qf$ z>_ynh{m5fo8%R+`ts$Arp^5S7P-=w@M6JW%LNb0L6kv#{$W0Fp&L5$U#E60=OA(ic z^g={fl$c?k4{HKY!D6Sg=JALf@DG7Pw_;#qKX+i>ioX^~sxb5Grk*TaPTHh?qq?e} zI?8nB?`NxG3@8`8BQmt#);klPs%IUd^P&Pb0Yiq=cgcKS9&7ud70zIA{}Zww4W1MB zoXh*#QsGQ3$=5BFT?2Pu#)Ju-u>f{}V_Nna+0OMGGdbZmg3PvRD!t|-gNAu4`{TmxQX z)^e`DMr{Wb+G7llQtLuc$;H+G_5XRlHcdZ+zdYU)0Sni;Om-VKnh*Wx#xP0b)DT~5ykhIi!&F(Ihvs3Z-vxk!L zu&xRD*V8x>R%wQINij`f`lY7*?~#W)!xMH5b-r`^2 zd?oRPfPg>&IFFNF=LMQZMOI&qW=n9RfuO*_1L?#!2MfM8AIBrjpL}l(GOXN}fsMHa zONK~>>Su$|S96kCLi-?n14E1)0>TPZE|R#wdIna0D!{+?<2c(ZxfcI3DV?vm7Vz|V zfPp;<9-xLT1C%Sd5-O^v0Vc5M_${E^#0iSh7na}uHM`cJPXSPUi99?!YKbOTqXoeO zJrDy|MOadKhHmr-e0Xh+o{Y4o- zWWLAwy6g3UGEi~`3cKQV`Qum!MuB5i(&L3zQY#Q&6c>pu9f^MT2hLy~2kEzvD*_5c ziEs!|)1?dmli+L$N*%xgmiQ1v=7HMJysBzIpp6Z0@b4E<`9ilR!w^XsWACT3iV%gM zExn*`H_B3Xzg_#eTq6rLz&7wRj;Yz2mja+AjuhK+$ME_!TcPd281D(W!I&RHa~rG#oTZk`S{36r}as`j4n+QqBI)QRRw&fNB$D}_r8 zvCrP+ef^gD<;h=Dm{f0LYC9I|Ku02meK3C@QatY$)sEyyy8EIBmqxMwas>Co*0Vayv!i^6v5E+gTsoF-Rq$p##bxab^ zNQQ~l^flE7A5@{gKHkG&FzSS@YBg(&)#mgGjp|g2csa|6W*l7v!(1Qa9(mDE&IkKl zK1ti(KaPEW8zqh>?O-)q&N#sCbUvfwX3Z1Nkg54{$<-m(OWIV>h15CY(ioCn0gG zQnoI)FJFm68h;h;p{Mk^&OtEkhPBA<9*OG5vUx;7uMej~B3{=WJO*Rw6#>g&{AEW! z`(OvS%c{*IqFt}c4n>c-awf2)P|%NZ;P%}Ip^-L|?nw zuCsSKHEt)&^h4%ae60ig1C^jL6C7hfJ z^LJaIX8I_tkYGN1$(+c~ym-uDlc}BG>(cZHsDzbJuh_#I%mL)2Y}!+yA289Y0UuJn z05wRg%)u%jV}5_#M;WCjQ#~ADJLt-#W#wvOx)z6TpDoj)QLY%MM6MCAoA}9?Rj0J8 z^8-aqMXLc5))Wg8=u{ZC2rS|U#8+l^+uuxGZ1T;bLzC?MeOy zxaE_u5hLbwDjf|8t$|2s%iE{X<`ko-bBDw2%*Y@m8(pcYZ-afHcTLNuGA4H6OLM=H zPwuJTqyB4%dY=(GQAe{l8T~chn~Zzp31UK3sRG>2*K>eYFo#=#RaeeOd^barQejCL zUc4UIfCMK*bm10eMabf!rw`CZ*tXw+ctYlo+H8x@%eK zFYrS!(np%paHM_iesr<}db!kAB>^n&I`whhc9y>1Sg@v;;KIVffRxS?JW!6eOcAju z1PSezhpmH|)&Lto6k~ILe__(}1#;lX!2d;@IHvj*5Qxkx6B3pbNV2#dy@ur;-KO{+ z?GF{3y)WWjUxKVxaZM)~d!N#d+AI}{eEj7!rYk&gux;L)hwtY7ehSsFa*d@>_dRXP zcKWcIePU#3IhzHQ(rZnQ6%nPhQmMvOF4V}<1CJum4h2(^726$D&>pgXwMp@0O5`vR zfO@^gYBo9bb`vnYy}jD8tDVUgV8k2Zf<=S*So)&VcHy^|H?yHoB9MoqK`ANOQ*u7+ zE1jiLtCF1SWSf)_eqYYzs+{?zls4_~RdQS4K)aeDr z@iK3hCPCaVr^gzKl3K=UmZ#>qtyZ^0ncrs)0>tCkPaUFib z+KmiaC~{37eUx1oguz&wm;-JA$65I_cGCjNrS2q$s%TOzQb@uyEJQy#<8!;hr47^o z(*TV*TmN-g-q-Dd{TUntD1eSnV>W12dNdc`^A{K{a?jR#WVswd_B_YTmC%h@zsuBX z=~|+RB*UY@?m|L3qm7~ODu=ud@Nm&3)o%DmbbYm)=2@#5OY-}S!FV8nWsghHNlB^u z=5h0xseXV5v@%~}%B?~P98^^7j^+%xKGMJ8P<^aVtDHx2yr3Wy^hp;1_KfxBnDIF=N5ZJI_sumymONaJnNz@&bO{|>3Uh%$g@&9712Ulja6Qy2$WBXW zI!4iCr`J`ga`L~5Y5g+=XP|wcatGWK0kokLFNJwP#=PPhupEsg54A?Zq9Z#NsV)XJ z%aF?PKEnMpFpLO2QWgxdORVw*Z*?YEer@w#rvYfU!n!cEL}^3O1Jbg)%WZ-bKQv zLIZ1z5wZ=Stmr}jPE3$3Y`$(!j_g2ubE(Oq*?CXq1#(LaAqu&ztldyj#@9|Zaz;G` z-9j9*70%QuPe{F%+4K}oeBmr6pnT_zDMbzyzY(xsh4gY54U-bZhQ=HVCS2A>%I7@Z z8dWAK9**YrT)$*A#1ymV6q0Nxb>;F?MJ0yb*)7S;X?X{y(U%Ju=1YVUm51?pi4gkD zrc=wP@5+SJV$v1kA1|nuXtR5DvfVqU!KoMpZkw!`%OBR|bajkx5B7^5#`meNQ=jSf z3FD>L6<_|URGH(b8C&`lySFASd3RcN0RcVRTb0he7> z6gatPw+SXeS5-E%(C`BDv)^u|!nGu7K2rX^uRq1fqtTrqhdunVu^~}W;%jZeW`~(U6G4$JN9&(a> zo?7f>pKA3eB(+?*MK2)`5@dZo;t!0vwP@j|bK4W0AE|h=@A|4UYRi3$i(9qOwWYJu zYYGc*y&F%D7y6xw*jL76MPDMjs4Ww2OttLsyqV`3FK$u3RR2Ns7oEKOt-C~`?AyZ? zV4g~nCdvp(2Ti_EEZwq>W;4X*azA8P9(T%N1x zmn2s9veQ2_C0ZdRh!#Zrum%@X5&ZLyZjP0M@3bplVh&g0Hyo5uUg{+|8$BG01wBp- z@9=GOn$nu@j>u~fZ5d*eE*vFpyFD+_F{sd`erOIhAIF%qSnN=^W$ogHt(wg8!);T+ zmUg}UE*ECt6h_Ek)jNch8Kc=cztf-rxDpRB?5$A4dzHiDzcfj564Bl&_c)$Hd4GD$gm$eK zYN6dF)u8nGKTN#^Ta{tAwM|PmNC+&tySuwfx=TtV1*BWLyJ69t(gM=m-5t`M-|gPd z^X~5#aEPqA<~7F{=kUb7N@rq=KU)^$=JnTF_pu|?%ZUjkAH!dZP0<_1wzOaJ8=Pdq zDTU~Tk}v^a|7H&dRDnG_iLjUNr9fj#%h7CK3nEM%jQ@6D#0*e~_~=aS0FkH&ykSf8 zo|uKR<5sq|CftkDH9}*WKen{CqEqFXsF8@(ubb1sRBPjrc<&F1A)9P#$Z}mT=LGkv zrsJrGqznGwLbDeF2+?BZkjS_wM0|<#txWpARA`iGL`V9c@ffDnNM$379u7iB7i{*K zxB5)#?rh4pun>RmgHk)AyhI(y)Tp35_UQ9eV;28!U2_x31rpU>bx#CbHT2vP`66M9 zfZ2Ei7_11uV4YNa`xCTXlcKttg*c^ZxRy}EePs~!H{SnA+|tIJ!|C9T+&d61 z@!nZNisy5tN=+)UfD13IwaancP6acAWE{fdezmYPJyrAeOF&XvReV>odKrZZ_}odd z9X>*c|NC`my0LD#zK%< zskF1B9E?ozY7Ml%d{v0Xu{4Cq$FKbhoMabdnH1$}auhP1}E zw_m@JBc1k*X{|GfZlSENJM7CfDRm0bQk$}TpUa;G^}&odG>mv%HZ5heC(8$Tz6tmo zQ1)=8>jIPhE#`1uhY*q6n0(3(g?!M>-O%|!Jz2&5dFb1&Icuq1TlQKhtU8?+@N|S_ zB`x;r2|k*vS`!d>?h&59x>&Stb)`gKM?GKf6>m!^%_QT4ou(cHKO(_R9z#F#c4KsA zG}?>5EzMZ^ojCC6_)3t!R6C7r z6-B1Uh%KMum{7q6^~womGAI?@~K#*MZh+O<0H$p7MSV{5{4X*u6^Y@5V@u zyhf|tnLs+bb@==v*fnP8d?=Y{dFFzTmu@I_kUAIJ&aW{wU3Hji+ms4|6 zVfbeca0>Dt70(5_18@Gx8F8{eKaj%h;;3hAC;N<;nA+g`om~^_Aee>51KTpIQTv~= zF2n<|r^yh88XG!RCjIcagv87~?DlLe14}gzJD?i^j||oCcep=fwH;T+VyyFUl*hM@ z#N>-(if8JZ&uN)euYVR&Xonh^bQTNS^#n}H@P2*BQaFT2=9a25w6RSI&0NzY>bMdx z)%$;k{3S?#O8I1TDsq$Q7;}|dU~A?lJx*aJY{0SPgDNeJfD7%CI%XSd)6y}Yo!YVcgr z^!vj#mA7yMq*j0X1hyu%k3PLtnJLr5&L!;`(iFjD2i<0^p?<97^e~^hhn60)fKs8_V4ZnTU;r zi&|*3SC<=!iFn0v_ju~6K_aNwy}@Z8ASDJxH&Cg-bc|aqM3PyzmTPb!Gd8jJe_@%W z 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 tth98d5|*yovJzD!wM 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%0AD0YM=ZDo000;`s4k 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

cZ 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

~|AKjc-RsY<}-t|Ggtm>qHCBvkpHP$Nsr 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

HB6-Fd#IBIxOwIUs~Y|OKF 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 literal 0 HcmV?d00001 diff --git a/LightRAG/README.assets/iShot_2025-03-23_12.40.08.png b/LightRAG/README.assets/iShot_2025-03-23_12.40.08.png new file mode 100644 index 0000000000000000000000000000000000000000..c4250b1203efa7fc7b6c9d511ecf838aebe0d797 GIT binary patch literal 410412 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≫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 z zf${J0$$7x@w8&<6N@g14o@Xi?*0rl90YZt8j7IiCB!d1hKBTh4?GPbU>mO?KX# zv?^89;+WZ$|*dDbHzu7O1=ZeJ8dl5+G ztoHAt>#475`>mG#I`$DTC?8~40Lrb`*jvUdK9tYs`O6w-XClIL^z%%}AIg2PPkj;^ z!&ST6th(XlHqMo_!->Jp7&S#dV&?f~Oh|d`uv`HzIY^eP-Q-3O)(gf+xhtz03Qf-P zMpL2nvjHp=^KxHD zbzEaa<%Kw^63J|ne5}6S-R8*x6moK}sDY0kTk+((GqM#i(YgK@`Gpq4RvLlVPWsys z%p&yTb6K=`Wn48`oA~x3+W*i${E%{9`kJlgXktoviKFx0*t35sXectnleTU&l2kRZ zhcD_%74MCVEO||d6zi5h)O<)xd;rZo%A+e(nl2`^vy==tAUSnhC+cEA@F5l}o__}3 z%rmXN;*#4+z`73R?ul>9uvWVmf-RkB@U!L3=VEdO?@Z$`e#@-hx3y%`KarW)dkx11=kde!Go+&=jo@^kL| zgm`~ow(8<|u^jMmPA;+;_MQ&VzLuPE2 z?0RK7O23E)s)SduHg7B+<&>FuupG&KOZyQFq0~V!6(LCtxDC#di>0>zS@sRA-||k8 zVAh;rMk6}?6IBtKo1grlc&%W@YqdzL5`S*&)=()2lla2=@)HG*H@x^&YvD)Ib-(hY zdsc4k(DguEshBjq(LqE;u;p5l1X(3P%*>C$37@>lkJ=>b_iyWL8j+D74CggT9zonn zneWX+I1Ejpk}O<}uP(B@%4QVHC}m7qp|ea0sLQyy*Q4sDDxr6O-LoJ2e9c{3I*HMf zx}aCw$0}KKg$vhULfgtTz@sKx>C;-8Wmo(DK&8LYH+s2QWsV1yt$ZT27y%>1%Dzr- zNQP1wKlL#vHx4{|D`T0rbR4my_@U%!bL4@}TkE{He}NCEa&5I4oBhA$^6rU{G5@6l zxVy=r%n+4KqfuYT}gi-NzasdXISAupu&eI z^LfelO;PU4;#o2kY7|6qeMj3xYKV=#H;SXcJ3N7;s?^)tyXMhjPq{%{!wlTWdsr`- zT2G<6V)kjcvn*cT2i_>u?LL{t1pT+))&%()Xg;vKXoX;}Iewq=ibk?G*cP*wSWXT! zg}i@78~3Km1Md!t-dM;|5qbg{_{2$tj$<)O(@}|}ZA4hg1%}S@zOu7?KPGM|ErP9> zy0yGHXGml=d*0$%%T>~7_Wiz^({`X=>31-kR4P9gGB!4bL6$A|j>P!=h@^Ytz_2wrvzL!XcF%H zgXgHpWX2D?M2GRaS=qrKNE8m6Z3Wok^NkAsuq#$j7&bB`hTo(5vSc2Z$*pANJQDqL z5?9G;<;Sqos@2t8&W4k!GFG3Ia=$V^PL|CJ*Rc}X*WSK+SCS_g->;bi{L-IO1C94Y zq)4Jj3de%@c$>d})gZLlU!57{k7|pNu-KAnb!zWP% zByz?}ue+JD6MV3Y;S~-BIueOJBHrOSf;Vg-auoVP*5=bOuO{CI9qYDQtG2u)Wz%Lj zuYC$vndjzc%GcC(6>BikxrF09H0GpIeGA~CLI{AHEI6b%f z&0Mj9)(j01^b&oNz6+Pa1(_=PwDDU2MwB$>WQ6zLk81TK^*mO`Yxh4x2!2(Hg9=5$ zmHv7I#yLI}ed^Tw>-s@o%HQ_~JRBa0+Ruu|*}sXuFTxqNx8uf}m)8HgES$@%R!nD~ zY!bc9v&FOil^*uh%LB`*6mOIyyva8$#naU6tFEm2bH$jEyKgd3xsAL^jQ3u(`-M6s z!fKXt4NX0%1@&~v=?cnzHl+pjwN_c7E9-$W0xbIrO#dBM&1;P*L(zj-9M8@uXGeC| zUsP*co4BdZc5!6!q579eNT>A2fYvLf~Z!%gxU(k;BJt?jB_K z`jnRo{=F%@sit#3CBR^Owmn;x$2Ulvb`-o;<|&BSCq?!VYwvc(i&z6QNwl^h{tnPG z8fIo@mxBe#y8sT_v5i_9_Ad+F&aPH7Tvv-zpIt6ia72|Qf?voQN{O15=k|=ohCc$` zg07KMGy(c-o!txFs+Sm|M?G{(f&K*7BnsX$AS!bJV1Y|ZOY!;WmY?t8;ucg?aL7)f zj9?8h-##Z&SjMdT(ta}o+THOA-CAoR+m5(HLOMvIFwMGo&EbTB8Kd}Z9W9Q4{YNl$O354t`nRz|tv%kF`FEb5Gjfw$|Wrg#B| z#&Mv*{$K_qKY}WA4J;APpWP2lPKELE507#%dh|sV0!fF#q(HiZk9L{vD)Wn|lNYZV zWUa(NsQLB=kokP3Sbwbx_Z6|Cg9=)%^u+S`+_-C=0oAycqq6Ke9q>;>B>DwQM9}gu zNV3o!EY%HK)Vc%tFtuu`z|*`ek^X!>tI^K)=rg&)(VV7Tg)Wx0M@qU_TjN zf#DPIFn;x-TGL2<4PV%OY54e5p%D>d2t7#cs^+JolfK>SwQsmt>1YYszCX#4{-R;- z#bwdsqrdTxQTPI{1l8-z^2vhSywR+hoG!T$R5WC|5F_2eY%UsGD+G$Jx93@;GGl*>TTA z8^ir=WYS%|8#jFKI*kD@c5<1>^bkRg0*pcSL0pv<)D(%Pp{RJ2kj<~7XrxS05~bgx zceu-6>sfFR=~PP1uM2$^iYC=fR3llTiJ92RWn@EFHEp#aOEB`OH1@)$&Ii!Ii0sgu zsWoc=S_w6^^Q{^eHxaGFQNNXt%Tgj|mqTO)_!cXQaSxg09 zkm^Ir;}O)$SmI-CCk56SlJ|ra&|Ia}5)JiBdRZ~Z{pQWQXzlg@BzW7Y{~MI#!V96r zbAF0tk%x#s;gra5350tT_!H;lkd7HK+jkPekE(yXNX!(ogkZfy?ls<-syqSM`v_ozHh>EDOhLkgz<&72$&_g{GX#V% zrECDd>pYNNS0B6>E&iLMSAMu2j4F#ibP5*bh7og&pdn*yRu75MS(;Y0a?gCH8C)m+ z^7k$L5B%`ePr_D)@T-SL<}{jldpNB%We0+qNH%khp;A57Nw%nf!)%1Fe-Kn(qM&Ug zWw3fVQDsP>C^5=QO!U&rKZZCtn~ZV%p@X)hNWgK3A2g8|58j#kaoxv~FVsg`gP^=& zH}rg@`3L5}HY~}L$I51nRSC)bx5Hx(>4)SiGKQFM{ScCs5)pC21NL5eUVk-~UXe&= z<`rjKJpN}i@)-68g2fu6q<^=Z{+Y6V{3i?5rs{Y-M2P3{?1lz{mfq8!?K4m@8H_S* zRi;UlaLQCGX~Ggj{P7iet_=8V%D33MP`fXneIz2M1SzF+O|OS0%`*#x=taqqXX)zM z6N7>Tns)T?o$f(~41g(0@rqaAnLts_FblPbZm7wz{$RD}F z$XG;hkCj^Y&E1@E<5qErhuSt^0QX+69zx?_AhRAm#E3{wa65D96NdKqV7D_VC z97at`GZ@p_g7??E0`E|slrvy!(!i2EI`7SYZF30xz3U%PZw4Ey<3Q}>P)DG7lQhPX zZPc)Z`IB$LVw2kujko?0H8g*d$e_+5hYSz$93}r8Fuwib!CN+;)--LxT@6(tg#5s& zB2c-ilyDx~nAX^=`z+7GsvGgSY+1Um^k?KQ8}IT1W~3v$3gfT05B9&j3%LMmXu%#@ zvA1=VURKda={>oe{q&3XBzw{Gzv&YRIMaRTK@M`tb0eHUzras3k~KyIOhDdTaB<;Y zZQm2^#bJRoiKr3V6>5l!N}qY``^UMffBi&44~#8~6+f;tV=1Cm6Y(iH7jC^x;V_o+ zsaE>ph49-B9O&4fr=P{$d4kvDg!k$@)QE4Hzy7CePfe6#x|hyyd_Z;i`^owFP6|6>b~!@nAE}#GO8ukc0Rlxvh{*HfY!Lzn z9Tas-OQx@ObB!N>23HvmZ~E->^B3@ElyV=#@4YPg-t#6zEK)b)Lg%4{Se zQ(vy=D#oFTwxu8>8_i^YdyTRdFChi+&e4}0y&eU>4;DL$H3awtwC_L_yoCW^GGcEI|YsB!@`;Nk18UV1*hCe#hlOY_qD=49}dgL2UQCD)% zsl8&#Th4T4c|3t#B9Wx!<Ge(v{nLsfHE@AFLvQxrFg-Mzm7N*H7hug${P^m@La-?Cwd zrYOJ<6FFw|s&-!zQD(>8Uv4K{^HF^?ia;ghM^wqHMAH&AqP`F8TJ?>*mXiCw1lxC{ z1B-b9%8Fu!#r@WP{;0xw4T4g_5X@1wzAdJ73-;iXDtMc{{Y`o60%ZNr8gRYs0m1({ ztE< zz;Dh~-@1h}l;>Q}E*G7@?Z+fQ@bRD&0Z0VF3vVL)f*R`$ZVjAzV)DrUxfuf_!sHMW zh?q8Te_u)>XmcUFB~Rr+U3PAfzSNxHubi^d%)5L=fNP};PCF$&h)y72oA?esZIRq5Wytj}6O4%@vEl7XA(eM_>aofXp!$-pWi`qr`=g-K3e3!`VaLR@ z8f0YlT^Y*<8(Tkk@IdwygFKtWRFP0@|H|9%xIZ7}_}dZJh(PGkBbCJ<=LnH{`+AB= z6s%JR#m*W55SY5W5g51My40yKbH)ZqRQ3@2VdGXX-Iabm+u*ygBgk?n_bDeg$iG8S zn#I8p#&fSyC!^SxHU3OXv%ccy742D%B+P!d=a*pHt{QTs_!a^qQQgqMrJ-hcQCoVyU z>GckaQg5m{QIX{lNCEKqxdWWgU+nV;nk=<(bVHazl)%6!#=j`^9pC(K73YtTN7{b1 zJ}CG&rx_j-aMK>Q_?Nr{0b8L)hCisF>7&2*C_V694p4J#LdY#K??1`}^^?v+d4op_ zrZnPpwhydH=fk;%%tmKwzPX(3Ya}$Qy?usJBs)N>`;@#xvI5VabBZ6E@71gVM;Ziz z5~t>evHndNha#w#0U_o$9(WVe+1W{PT8x5o89E>jkLGYYsinspq!CWlz7=ch!jC&V zqRlz1ee%BY(OzZsCGSb#{Qv+Th{%`8XPv|B{~fMfsj$p0q%p~%1J+OCtn*cTbG z_Vh`7J$OI+&qk6AN8*$6sFF(zBW@PJT|$KsPjz;qk*S2y)6>U%kqqUU>X#BNc$|^1 zi}rPWMZ941QCbeRl`?iDS^;ICf$gPCpx1cvjBE{E;Hzvt?8Ij;_v!h_Dm~stioK&2 zK*CM)d-+RY9@u((>+CEnrlq4}W@8&PC^KEUYjP)Cp43`v@~U;a3=UC#^$0q+3>r#N zswZ}ctmxovn?#PHq25C-?-#b-?PlKWDx-7jhH21<%`)4WXW(T{T(i!@6T3Z#S8LNBYuysr{h?VEP_wkAJO zgK|w$U;ALP^!f5c&|NrBX$^T6$J;J#eb*1qqeVFYusH+n6tHKDqz?}d%@e>FOOmlD z$E#TZKn*9R%K)8C;V6lfV*Fdgf&}zn4{a20e*5s}D)9UWrlncD#dXc1`VEe~MWv7b zZh(K^#=rHll;5O&U_Vq4@U#a$79QhvQ?^uXkh`^TiIS=9m1eu(gW_{kX^-0X!!7A-*% z;6@MQA(rIEx6xf%11(dRWVG)4gVdk|`5rLJD-YtfYwm$J6!$(Z4rA??L}!Q`-SsKv zvAx?!nDUt^J~1>k2q~S#J)_(HeslHmE#;(#Pwne0kyi4hbG%k+A**+zAgS|zok0J2 z0f>4$2WBmY84>{Ox0_?|Rs4ud3VH0VN*y+RjE!)JDN0mEl!rbm@IVzea|xxgvcF*w5HNbEFcL? zuVi1(xe}`;amiZo13PjAsKvhTkfr+rk8kZmaM|l8S##rBBU^g=%PGT40Q3C#vDjrU ztr^nmcyckX`aV%G)9(q2zn4HYs21QKja2U3Jl4_eOh!+Cq4P1YW1qIk!Jrvs=`-Fu z#^DRaKewjrbdLZ1wSbCN405r%C*w$gj1fWkHwp)^6$wXLzhGCl#E%tiQNga3lI?Ot zd<#>+RXF{iR=DP7Bb&XQ&VDXthES^*A{!r-drE4vAu(}Zv}vd#3y4buOF4P5ZRE<@ zUlgBl@SPCgnAUs;nl?fY*a|A#Sz^>5jefz8tMnA@6p0_z5QCs3nXde z=QCIe!+YiYhM0e09ypfI35tb`dN%CL(687-ff}VWx%2j|GXpK`0w4KSFe~)Z!(XsV zO+w1|!o%OeUFW%JR4>CkqKsZiCzuP`oo(7__2mdOnYLQD!0KoW5RGPCco(3GC4Acb zUMC19o|36q#lhvaqmvA>LTC{K>7prLE|xIw5U^*O8Qy0}&sTxM#WrLYx%vAn*d;vH z<4k6wyMS=a2Borr*`0q?%kQgg>waK>s%4d~pn$N>yfyT>{5BtScW2Z2UBma!4h~DZ z>?sAj9Q?PF6%}qCNs0a5_4_4XAG+{AJK_I$M{T~ag>#|0)r<4SKe~fW54y|n>)V{{ zOxEVSd;inHx)UR-Oo$L0`%@Y}Dh^b9_sz{xYAM*`EU8cfr2Z&d#AGn~u0*nHN18nB zdSW}Rqia}xZ?|W5#o11QSno-4G3iPH=uDo(RbUorDZJmJ<0Basx2343qxJ?8AeW_1 zjPS6qrz>=GH)MRw^%NWdfkve%e0J(7ByWLtj=nc(WCa20I(~8~2bHCDyY?)t7WCpO zcz%kt>#~ejvHutB<;$0a48~$lfza>)q<)`My9zPrjIu`TR#a4!Dtmczv(WkW ztrHD#Z+Lio*cf8ftS5`ub0ff2u1+A|G(mQ*rlQSj;xLf7SY!7Dz(q>3&jQ4$D z!3Zh<=K7S=@f$O_0;*n;ZN0FACQ+aBh1ZySz9K&_ZIpcOZw|d)k!}1>v+*A?=O1;( z1u^ms)nvlU+n?@KWrBAjZp0p`oPv-3#v&Goq3&Ysv`uPK?X)6qS#~NUaJi|0d{l#6 z{VbCE(VBDxas+#rbYU}>Z^9F{^oft3B!5=%jeUs|W?Jrl`YEbp9Mz0zqOjH6lIsVy zokU~@+0#o*J@Tdv0^xT)gfl^EMmhOlxSk?$u=KZff|xxJys1YMq?G|?+&ub^d+4HvL2U&i z3uaJDElh3dpHJjY%0)T00M4pU_sOr0zw0-h)qH1f)x&#x=L(%yv{Bhjr9l>%z;0Mx zH4g?C)|$dv9(BjX#S!&x0O}|=!}oVm=3Et!N^EiT?*!<$fJ5=2sxoX_hORu&yBQtA z&%o)}$e6K@0%qGJ9O>GI>~7TB>?v>1Ou8o@t~2j_QM&%O!MUR!{&`V<{fN0;jESpo z0LLPE)4Wc<3x3bPSDSyE6cXl+j%_I7od*Vaq0T$`#x#JMDJXE8_h*8V=ZTb5fLR+; zsL&JQ{!0IvXDwc?t97I^VRdPCG>W>7Ym|}?Y_ioo4Bpg>on+o7Q zN<21J+5sowvz4u1KG&)Pe}*6Nm~_I(IE;||XHmvVABmhVi!>3G|MIy>f3x?L;k$%e zKyF^%NGzSa!sKk1+1!usR-c-W!f92qZh%?Wc+-9A?Vq37(Vb60PJkK&83V#K<~$^7 zv9>=|Nmpjjk}P($L6_%LJ$B4D_H=_gAYciHHRo z=*5>aS7G&k2C4tgR|$ksILM`Rf`{kAT3pkIJ?^d==ex#iIR&Oa)E}>N6jVpM;B-uO z5R*g%i7C3m5CJRu)gzEHj_Drt4K8?#!qC%-nSok9XRZcUO zryra&nX~jDKOSW$tVS-w^@y91v9cozh~H=UT!n$Atx)CTvr?U>c5EgZk-hS^p4hI3 z&EFc)zXykBXueR|9F}n#U+>)G;oui_J`!mupRSJh#=SE(;F%>1CZk zarm@Ff3UGPMqia*-#=!yp*lf_aVR%}F?ybm+?){0JcUaY%1gUS1 zkqf$E5fM2R6%|rH7Kfw|9Q!{lngQAO#Ka`Ky`;i<5nRhkz&t}^ZC#=nQi(~=(d_Im z5pE;lyMMkekjMHzSL^{hq#3QJtj|-Fj^@k%-uz$v{XYLX&sXt~e@?qO*JL4zLSw0k zD&0KOQ^^vM^7lf7F&P zx~+?Kt~Hmwg$zbG7X(Om)A_1DFl*?tifI)taCw+g#r(Ta4dDxd7%AfLdCS`C7j?Ez z^Q9$}0`Ai!LMu~DrS+#&+T~dI;sG-6uGjFe@2R`85@(OR{2*18Wtnjj7jU zK+4X_)8kk*u~GhxCsfD8Jmn5^e>K*6tz$Pp1Xdzu68D&=lkjHepn=U@k$KVPE`)vD z`QGkShUAx5FSgjHVG9kJ!u^sW=YC$$Y&IW5V=-e%Dgg$BW(k?xp`-DG1V2KDwUfjXIzPd%u*xZDkWtRtU`2%s2o>2qiBA7ZUUHgGp}B@dMZhJp%p_3p4e#I&F{j2nVGXeElpj87#c@^- zJ1Sw6d2)K8;N0JaPjabTto^C{ZG?N2L=)b;1xVtM8a}Bv`U>#`ezBU`0K}IEc?bvE zp92~xXQ{o?clWiAeDKE$4A2<=f7jmsz62$*@Y<-fi`2_+8>O_Dastv{(|eB_8T>d3 zF*3Mp_7Gv&rq9bGWq9=tRf`dmhx=<@fd!c^U;8`NJX=;`wY|?Ls&}2Bzl0o8ig;oQ zqPa4hV{}1+1dJVOn)ey;LD#rPM@PraDc_26r~;9Pu$eB(s>@e70=}0|acjievc#IC zNi9VmzV?rResewOBHXGJo*!On-n#*2Q)9qsmrxP;Hl%@9z!EiJnl~m|#7bKP`SaH#b zel_0LZoog>BNkU|t-bysQK7jB{WrN#^}fnSp-~h3bHxU{sqd|2)StZ+{DEZJQ-78J zBehm7P3QyY=kio4fvY{ce8|em%Ya_3X2!RKl*qH>4k}$8m*$}}x8A=a#Au5o|65=D zPqPd-w)%;8;lHX9n;eCr{8q~2z9>1{k&)-yVGYQqck2AnNcl9C8zfj$Wu`wv-P{82 zNg1*jOy#XHO4X2|OJw4hSagQ*y#eO_yw(B@C8PY3 znQgFznXYOSd}3nlg(G!vEn-0uechu**B^MZtz52vdqptWC>xsxS?YaUcA=a4OJFH( z++X{yvKmQTz*iZ}6j*_Aa85(m$t=ft=qu6T@Yyh{q_R(!7{`vT~Z5l+;S3 zy8026-nLPSZuDsNyA}BR#sN{S$G65xTxGcyHMPweyzpdE<&Ug z9LsTBgK|idl)~xU2iGCB)c%&pksiYVxi;UI1*0((T&-m_T2?G|zg%&o39i$Q3%*&A z-Pd;yu6i~}!re94UhgoQ;RAdmHUK}arMk3CoGPFC0&kx#hT1OfcN^6)dYsM()u0Es zNL$2>ik|+zR;~@q2)o;Ash-L>@W&*k?dB$FNJHulw#IF4P_QNkpY6j!RDRKx`gWCo z_5cx;Pi8M)>NW;^nvJFqG`Fnq>!l#J>V2ODmGk=%M!?9#z>p7(G6=criM~i7Imd~~ z8#@!t_*O{1#rOhv$G&*RBS*57A8q+8H7Lf*u7I_C2D;p0{U*LUP1|^Symo5@7r#mM zYtT8>IIpY8(nF>d7%3%}@vcIB+WmQgIlme|vLs(#6|0E$e4g0W>Bx9h-oT^p3UcMF z)poK^6yZ$x5Fi68ZjOl#hvpEnK_H3L?t?}^3Wwj%l4vLa;$fdLB8+_`4K6P12&fDa z$i^eGLR?KPPthiM^@G?@Wky0=bABX#PjIz*{&L6t3+tfdg1%hmYuLhVSlF+#bGBc# z)@7t*oW^L0sQXQb^hE>NUk|m*`$Ieb!;t)!mFxh6=m?Kbx=@U=I#D3^PDYf1!5GpR zGA^fuXjI3-!iU;}NtmTN?@Dzz)sysv9clHGE=JIirHJnD(9zMItoY%6(y4489kmT0%q<7;7l6<8fq~0c;!+1 zsz8g+q*Ec8%k19irZb9a>P4eQ6Z0)Tv>5IZ#CL;~egE zbx{($sR#>UbDPjNDAjg+Z}zboQFvXa9%@;&v38IkygXJprdLsGDeoT5Xpype7doP98~&=Iz(9X^ob9zhJ2~=!OgWT&C{W6 z;PIg4crcz~&G`;#=#lRcc)cgm3XjPw7h`3eLlCae*CkQnR3Y)G821+ybqCtMB4}618cuWaQ-m0`y`0 z&Inma+R-$lbr1wd!B)K@&EC>1n@L$nS%;X%P9F{t9oYs5_vg%~VT0)5$ zSe?lD#EfZhB zE+8DCBX=DbRwG^B+H39$O!nAXUpnda4XWD#V&hoSUO6BctJ#%FI?*lkNUoD3aFO6& zQ08+SaM2Ih1zuQk|83O#*XHt0fF9nH7S*lyEhpgKTt}$5L_Z|TXPs7u-+396&}`W} z<$l4!@-zgY={NzGSrDoM#>}xaO7a)t-PEiSP+2{R{f?@71ym5*Kh5urK9Rj#1m1K* z(^=^>1XPc=+aN?eLm`pz7a%&AI4q`y`erlbLCjrIQAu2r_kNvqU>xH=SJT&K^tMwX z$cc0!uj80~%&PP%KJJ1|t3S4Nqd_Ecyuwr;EHbhn2`5yTe5TehPYbh^hF(s_Cko<& z!})2s`q}yCy%`CcpueeuQ&o{g z82Jt-d^79~k5ql53K%dpdSG19z|{9ijMYPpW+SRzwc*0pu_y1w2cExj%y4F{BsNV{ zU~;B0=Q3hi#Uxfv*@79L;%rdJN>ot%>94%i#1B*%@^@J4w(V6% zC3uC$10SJL;rZZ!dbL$hMe|A&i>Y;$<|p%eN`b32n+%S%(HLWA-WH6GSIlKNXzes&`T_PM%!=!cn9jnp_q? zdEPNM38$EOZQ^Eup>DL$HGEk9S59e4?8IyM96g(;5N5sNwgev@#6g`tp4e9!C%x#t z-F3FBlDS|4;56D=TSZ@?=oi+pQfHFAg?NR<`vif5SOg#Pp&0_QPL0~~pg(zoJ=ce7 zMY;vu06u9+$mJ{G;Sbndr`F+zZXL)&SLdbOVsr^!y)N&WFOwowr{0z5J+|PX!J1Mqwuz zbZrZWNW_(0p&44a9X`4#kzr248u{%S%F3Z}#EabiEL|NPyvM&*8|zM_f(guM!btC) zpb-o$22*)SOaqmR7nsB*b9aM5PG1NN_F;v!J1=D$ZzYQl@kr5e+?K6^NccXkLvZ9=v z>U)c&Lt~r~o=_gBtvfs(6TQ=?wt!J&DLH;oUhC#oljDd+CBO3Wa`v+ocuT1%abZ3= z`r|b;KyUpk3t*M!H?dB4*nLSG!Bmbn;e(S7Nf#U3-G`QwscpCr`DRpQFfB0avpRUW zxCF2OXHP@ERZSBry~VacoAiKbtx<%%Cls!Lgl;tS z+wp}o3Xz#PX4p(+?(2%kQh6GK+t{YPV_>n0C&D_a6Q?DoXc7!d%Xie6c6Q}{2G+M4N+Rc-or+0aG4Kl2H;8EzJ$gljK?rJv zNH?!&ByE$7x{mFaTm!(AfiUu*^m2!710sQIo}U7)m6XihYY=%^`Zwx=#(lD%BzW5cXRYgbwNCGHwO*22l>Nl<-6u_qTEN&mhHlU0AD?*?>Nb3D zy#9y|Ch!ns>>(2hN7VwS{dR;D>8IYxc2P=parfIJ+Ebt}&EZwb1Tgh!GyH|h#Xf!> z`;CxwsPp-sBGav*o3}W=NQ+`&g1mhT3GE2pUJ@{C+mA#7;iuK6n1TeMT7&xFgH1<;IH zCxz$dM|K)mMrZu)?hf=~mp3N#i--0Vytf#NYV#?f5_lt5!k}@8`Z>|6>8?_T&{d;3 zk;9w@;2GW3HTf|toIgcKz`tbQg=dT4+T3rr5WEKZjebKHn9H+$_X?SXWy9GjYjx@r zV4)&x&(Iuebaxeu%6sUcO(rs|Y5R`k=*^CB(T4GmhW@N{cjSi0<+SW{BR-Peh=mdJ z`}zL7IfXn0&RG7%mMss1ZaueD+{4|0Cxpv!r*5q3AS8Nqf#f8C$NovAGgr{yHR04250 z+4wKXl#u$0g-@_JscSsash%Xakw|%RlU>MPC~-l|_8~Njr!j~rhc+?%obOxQ0Nj^Nk4T7XPuP9&$h1&D zM-2a38+*gN=|`A3#ak(xGKQ07x`4sAZJN6qH*f{tU!=to%=Oo&ffCAM;<1GAqb&+Eb=#tnlG~R7rnb_DcegL#r3FuM$u$&5R9rx4`=fgGoWtE3D>z z9$cnFn7V~N@|CR?<=$?<`=D0~?AkfH4YePaNzvY)pqu6MZ2eI0907xhGdX291|P^m zh|Z!YSwJpUB4kh8S>VI{rD3X!AOOr_L^`j+MwCkpI$pbg-9LuEIH_Zg#-LLj{yoxs zo#0is6!;F<*`Wfj!Jw)PG~x;3^t2bR>xNIa$&`T$7tK=Ix8Du`f?s3=fiw&<@3e~c zjr@_{A0AZZ4qA%W_!SrPhYp+OtV zdq~I5uCz;yCG7pEYVzPIy9N6)H{RVINa6zWuxZ;gatebJyusA;bn1$hAWkQE<;Ag) z(KF^9QIb#z4Evw^V!PO=?97l>{Gfvoz zt$0EJOfvrb63q0D&xp?~P^wy}PDFy+GB*%t6_!+S_ZABJ93OpIjK zWS_vCPL%&e4h^mAeA8Z~_I3yt%}><2x#rd{o&Uo1#AluG5%(hF{OUJ z<1T0JyIF~(!-?3<{&*?(>uUB_BD=%jOIlVkfdiBPvw4Gzy-*~@5_+L+)k-Yo1iQq1 zOx4GPpm8dt@mcQm$mpBU-eyIBu%79!vh0un zU7tNh9t0VSM8Ve}u4}ZZ-|@0^S`(W-xsCU@bo|^L5iTrPyY`F7!8V3SHP5&*&LX^k zSuI#ICMpUSWX~mjae^GPY`Akr!DjNpe(hzuC&6FjfiBG*ULD~|TJwYnxu9cXcjs&H zH4AiISOS^f-Ee*RvJvFaqPXZwjk)MR5uYmc-A%{!$7bqK2u{JZ zYGm@qZJ6Xf10nikb;gt%F_^Uwv=FdNoSs_jDaOUohDdze#0ghcQOs6( z1dM|S5v`N6w5bGYkm}1$A9?0u(;l&A%8`$ahUfTu;XIm zG~P*MLG|#6r&+*WK01=odn#s3@PX28FCP^TC)ssh6BxAsIvE@pdVCTL?X!)ilFkE$7*t8|#WWOa-iU~&E!(Z>ET<}c zMLc&FG7l)eFnucC?XXxlJYPiK{Jw;PP1=0J)oK&F2t*GTA23aY>3!NbZUOU7a8NR- zRqK1pPkU_a66rtmA>is5?)vJY0oE{-VPNQ!gKgH%H#Z37Q`Estg1mS7f`r>cZjb^g zIYBt@pk9`%z#iFa66+$xm5wm4yIY$C_x)6Xf$hfAy(T{Q>FBXNZAkHi*TpA(ApvB; z5C6Ic{+D>tyIBIpk1i|X7eRl*t3)?yFL&L(i2zK}eP!FCECh1`!*OJ3jWHw|@*-|c zK>NMD5DphfcCVnDND+arVy1srtC~?|Iy|>$ORWp0bCQN_BRSaH6@f4UkdE(mSB%mG zYP;Wh)rS}r+@^Y_R&&)#p{&wFH%*`Rv?9Iy3^hK?HM$3|9w4gNU4B0U0GPw+mJ-PT zg~YQHe7!zuZfOSJ>gQ`|B$%?InB?Ig<_+_HWK0?yUzwarsJ!%d_nq#)Z7)HshcYF_ z=Mu}2sNYrshyof-m7=hl4aRk;{7F171KJ8@J;3=;%VZmo52`j7glA zM^7EZ#j8iW(s2?M5~SJKx#s2d+|PdK$``)34kc_a0rN|gPd1W}b!t9IqNBi}OL$d~ zy|+5{$9v{(k4#+ZLh{~~sLkgTm`!qcu!*aj@V1P2^gKqnJw0v#d-ro11jwpGl*+J} zAi_kxp9rAl-%dm;l)sQK(LpqNV`BB}$IK!I2%v{JYDCpKjXpK4J0@U`s8pqc?j$Oj#vz^Z9oR| z#0N@)CH`Nad`dc%*O}V=`~fxnBPxk7_RFh1ldc*)-1ha)DP-x((y8r{Y^BQ1WMJI5 zN%VS*#{g)dZ>or?Yeed6aNq65@}9k`ieH=(ZlNS6MV}g~Lgl;#P>_Y9+Dw74md{vz z-24DT)!b|50K^&~X5aq(s))H;wF25sWBOn^nwiL(`Eb%18-V8O2S#6}LzUdG=S;&3 zJk;Z*T==l@0CNOuim|$BqD-2JkIE)_(-}#7jJ0EIDM+VM_i2y6r}n%SbyO${S#?j! zf)#yGgCAZ3;;k>{)k92x-&X+OAO$huB@0`0?Xr^;jbA>H`zD=zx$Wy-IJW_4cF*`Y3lN7uL4p-!M z6aD7Q$+?Iy<|YGh@>lfSPSr71TXl`NB9?UYx&1mjz2u0Ylst$nQMY-PVdPHwiLKTT#<5|IR$ zb@yOWO$r%NeYl4=9Y`p$>*yl!0=*d$6%6YTAkjx(!QEyMR{Q5xzmny#R`uC>h3!=!`4#m-(*;b59D zXDuVKZs1&!QuRW-v*K-tovLzw@f-i`I ziff*`bnIQM^xOTc(wdCVli|Kc&i7syNqw=^*rw+KuZ_cl?&o>%q0Xx{abtw zj$(_*kw9gaS}F!VfY)~SRYKeet{(K33vfx4GdhzJ^`20 zH{;&=93HpaPj!oz)QJS${1$@!0K6a$LljV4gY4azx`KO0s(9>8L!)R2-{Q?8Osbek zA@GB#&>=S0&^AjZH0&!V_gNpodkDhq5V&{~0=+yeDTDhhF-|dKfq67aX$FHB!;AJM5@Fp0SHIneOrY=SGm5V$r*|e>rdNK%X02f3!F`QFav-OjF92R8U zWneYSfaRzvwfq0PB}~XSeAs-96+<`o#9}AcsQFq@;a`i|ed0PH^NA*VSIoWl%G5gh*WS`&fEauP}-xVzs%C&C7>L?SyiVNy>9C~ zcAUKH<=2f8272Rcv4Hd3Zz8_?slbNnmvTh+>Q#_%E+O-hn&XqZIxxNX*y1AqcT`DZ zCB)o;UsIjLMR1DjiNz?Au&=BwDrSkq5jML-NCFG;7oUd+CdESuwj^h0-yoj zPA567*xIjVc-&pTcEv@n2ZMgWt~LIFbmw_@hD?eq0`LQ1Y&Oy#)2l#LetL+5^>|Fu zx0dy=d76`y8u~XDXX3bp{4rY{(H$VRy}R;5Gw}SV`||YzA(Mpx-_d#=ond4tuwBC} zlL|4CKdPS^Z*d?A!7xc3HkSoRU7!WCW3KX&MjAnbN|P^<4}vd0hYsc+(43I>!C6Wt z&OCpUoVPoSHaV6?jE2N!%A(ZB*7c0|+3P)RwT#BxhHHn0;ZJoF<8tnY)Oyev-<%YQc_7hcaC@f{(dwXFkflsf})G3Mbehh6L}MHS_qSQ zT&7;b%@E(UcQ%_O-^DOCR`Yq^+IKyJpI761-)hbyCtBS*l{I))Za&FK#9~0*AA3|{ zckaeqat<8i(~)mU+H;v2W6iKbPvro2mytoj$?5-u@E25`d48zg8C631wXCdq2V+fo zT@K6ZqOMs(e>@P5fBy>lh3$Alr+ zVTC`KSy)QA{q>eO!=CXON52=%ivwZ7w<*7V!HoNDB<(5(}_of_uJ{`!Xxg)V{ z9S+m0>Y0AcQ}tfS`=Vsv1{s$NPG3u>%Z(?o4A0L088XCGpXLjcr`%J3@nSdyicesv zUKU8~k)jK`c2e@*HCWUw0>XCig1gbY=enhI1`6LLi~>dQfA?bl^=eJXz0O4GSZsbm zp22R<)if~>#4zl}Q-H!-roy*lAH+K*2|nDSx?Idx<$y04eICSSKvwrGe&vt0m8Gx7 zDNxxH{B-LC31E?L)h3L+rGb=V-tDCS^iNsZj~+xt$D<9zP*;@MUeUVl1RlNNNJVt@ zHL^RWDyw%Pf(_yz5_KXn1PuYdN8Z|(jsJAWGg~=>06>H_c$8S3%pk1Bm))W0dL;g2 z_x@E;Fh`(xKbRM-TZ&m^Rkx?+a@2u8M&p;{*&ew3@dU0K77Q9eBXX!p<@o5wN)~W? z?ty3A=af>Dhf1UjM&ucOoUaY}`0z*xntEu(?>Z|#?GX}b7J=%EB+1Z|3mu>7lDumt zX>-p}&UhVqGa2JPQb8s%3Mp5C`23l#Q+LFPuiUB%B*zSf9=b+^hxr`+LEMZLj(U%c z-4t|u`+JSbeNC=hWMTSYaKYJ&N2$R27N>!I+cIXs6-QMyoRVBk{ODUsb|5Z7$*Y%e zlz8>Hu(NN4MMTo6=qOX*@KuFhP*RdNTFfC!8ROZ8O}{@=j-sD5Z`^Mb z2(d<%sZ7?UO3Lh3#**!>`;zU>=k$&*^j;LIGu0o$$==$hu627vto^=X>J`vYdlAl5 zCp;IW+Kx^BeDgbYhn?op*oEXNk`KjGvTdgZz9x{=tqF#YEmd*n3obuQn_WpGNWT;m z6_`?WNOwJOah8Ll7KSs!8an6^zB-(D11G$>U>e9g;Fo&*i~sq-q=Iv5{Jcs+5&eEA z)6~H%)BfPuB z6jfH5R9enE zxcZ0#@d0Sz`g)-{v>M9St6^ozxvD)Wg4#CEz|d5)ptmfm#}re$guoFo%Xo4{TWr5c zYR_uDptHf2&6MO&#I#k8$hBZvZhcf5P$z!NedC0a_{jGIv1l0{L zG2C^qk3f=CaSqU<=v!1HB?A={b{QGh>~NY?2nV%WQ5#Bjlh<$FklO`gnX(|h&^Jq4q)yVRKCwe!XW#- zhOr_$dPXeg71Rgj;vhu+aF+IhfDfgx@Fq+}?&-i}GIs>)LD8A5;(slWa6!1(CRxS6 z(}M=!ep5|(Uwyrk_e%4wwVj6kY-@o~>Sre3#m_=l216sRD~@*;0}dg47c@yM8{Tgm zgW+gO5-HMXOcKv@J?|V#ZI&PUK3svsM03rdE1d-(k~dqZuPJ+_6vlTG*vUdjW=)}( zG-n4+m(KLr*xRBvsc!8vohW;+f4ub9A=Bkv`XWo03c@o|KUAGay7YbO2o4ucz-(T7 zqU%N(MW;lW+0ZGg5g3LE+vHG8HE1;^!^3&YVgA=g_!L>c5ffEl9`BdoYYIOlSJXgJIwFt_J2$EeXu9|E z{#5n{6A9am8?_HKa zTk>LGBl5tI!v=INVN8_4pB%Dk`5Mcgr7>Yd+I?NXoTR+19_wXth3szWT}i%~XrUu4 zaV6mWX^=}6oY!z{)kuJ&uIA~8RSIM3mD11ndrQfiyWOvaq!8Uy3ttC|YW(*q z-q<>23;;KKv|Hu?B7dy#-7GC))R$N!*jBCb99RB?RSmKctgcLvn@soNhI8buEu7F% z6o3n`?~5oV3tGz0_|dpfDI=F|V7V+7c|_bWVEQgK${QpQ)0#;1B}o z3IE=e|Ks;L8R1RVd2YQeURZ4X8Z6afvI1a6dL4u}`5QzcFn~G3QDBmnG|(>@{h6{o z-mg12%rGq`XESRAOpSJ48h-q+VFwpHcnzn}><$XK?i;&3?1rSk?B_Id7-=t9x$V{h zn_v6-J7FJZ-*D8occAM0y;08pu(bJX!501m&qfz{>3+j)zs+RkhVV^?;8Y%rjD+-M zVF0-`Xgx~-JeZ@D=0AOVB`iv9LZ&JMVTj%-3|{1VnSuKjz+UIAa=6 zX<&P2P-Pu<&#wRc7FNz+NqpvVVq4k4{kS>&L{n^*TT4MMrFXB19_(U8NhRWLo}L^P z*i8THBTcciQ6oBu96tBt)f5K1+>R$8BkVxLR<9U_V`L)V=il|tda{YUF|UE;Q_7SYIP83Mm_&umQ zmiRAT?|kgvwnAgN8Q+Nr)xHVbz%qIKxxJ;ay_%tT;zz_<60w)}Ef-ktiX^_X?^6Et zOrZWS8!d;kNlmW4sU7@aKMYd?Pn)33>zCO5G}CyG&lMuyT+__DC92f@xQu87nYSaL zsm>?H6Smy1XwOwEtgS^gnSlx{wr(gNf;8so(mfi*2$-g91pMBT&Dx!ISs*B`C;Jf0qpPx* zDVHf;1Q0M5;WBAxEHMVN}@ZC>ig>s6*QHO6s^^Zuv8vpBr zUAlPX5!v>Z*`o*%<+4A7!F<9Z`s}dYyA;vgs^@zKtNq5Na*D8r^I8OH<@iX-tHVg! zfrJ{LTJ!PT7X@1LE41n>&kaML*tD2TF}(bzUt=3ca-;g`yC*c&n8SXcAA+IXI>G}?Y zg42LO;5Ga=7K*)ZXCob+MoQx+7*fDu2lBxcD`%zZ)YuV)^pHk!gLDK=OR3$A9CX}h zq6CVcg^LM${y1GbmXJnqF{b_4{#c|=B-hBENuIlCMFdv?Y=QD=# zeH0rzsmA7k-+m)_8m!%FzE>bpwz>9wI<3lk4jVvob{SN;5U04!_fb)<1sCbU@^9+?NBsfNNz4}W&&FVwXX#I>R zhyA%1l<$0Hjr_y{(6t#wFJwy$A~Z39Yn7~Xo-PTCRmJIg+vLOkoU;c4j?=kllI^M> zi-yaYi!Lb$c&V0x;LpdZ3w)yQuyc^a*!nYVpD9odFA}3I=8K5tyQAfccxE(Ho+Gk; z7K5x-w`>GsujYgv7Eo+5NV>~rF9)(NB3~CH$);kGQMg@iLkKx7=#ocQmw%OpQHS?H z^#!pmK2;%r^Ccm2(8~8m(*0P0wz|i)S={A+XUN2o&+GSWjjzL?T5&t@( zytl9~L0i`6i>1{c!<6j&f?%H1sWNjS?C?9s&q9ntuY2InoJtg#Jvv@F0RyT&HEnzJ zOSVY+U^Rc_aO{WL!owp|6TvoYawj7s`j9-`(hqY@*TV3LMOq=9YaY<|n%u_P7G4g;T{5iBi4OQQ+6GU%X!2 z=1&f?RNcma3Ca(XtYiAQjnU_$zMl)smNO2{8*xb+Jgz4jxTxCO1#D@(AgD@8@W#Tw zowtzvfC5wVL)deuLEy!8kk)KqTd>YS_Xv0 z%2Mh^9W&QT=>_5+sMQ^tGMSv&N*N~P;YuiBA}@(h@EP-!_GQSIp-Y-WFGNR7#Qr?q zQD69-8e7xJ_hD_QP?RvmrKViFz+CJn8nK*F1VP78M8 zHJL}XYx&RKvAt%AX=3Xq98Z>%cR)YgH^$F8y0qwKUp?n+65q$Z78rcif>ejX`PYiF zp@Qwx-r-N1z24-7{chhnZCRXf*Ykb7UdGM5kvIKKjh)fe;sahcu@+@)1k4ebz%%p7kfru@9x z-)T7bO}Xg@Iftxqn!!k6dT6sB2ONE6wgv^>oqjwuCK?>(3U@N{QQV~AQwj>Si+bOnn6hwSm_;Q-WIi}tP~Z-PRQ2(Q)RX0ST_4twG&Qv$U(RFfW=8x`;l2x$ zhy&EzZ;(}J^0RT-f7hrxyycuSu>9KBS&U!r{Q&cnmq`H-)QLNWvc)zovq4@}rPA-W zZf-Pt!*AI8ZuY-{|LyZGJ9*aTn&{)AK_b~A&dmi`u^=sin+r|z3BRCJst!{yveDra zbky!)==N2;Z%d1B0R89vFTVH5!JV;Fh~Ut^LDnZ#+LW80(0(jF5b3CHe93x2jBqI^ zNk@ZE5NsqXduwI>YO&g@6_wBljclP@o_^)JbOy)p7(bvue9n4fdS|QU{Y~O#n~?U_ z!JO_*ikD;!t+yX#3MI;uZ=!X6wdEvoFmNu54uaxT{a5;EE#co>$d6n6$nw$OAEVp; zaku0SKwEbdX(YTO2&<67n}$1J56I zJG&B>B3CWoAIzhE=oRxUO0ix zBq;|Tb(&llWRnM%o7xtv4JI$DM>u2w6nMeqA`5B>qvF1Vb+}jC$2*Ec;?H)2f+Zj811AFwKA)nA>mOk0g5(Q+bOm_sz@6vNDg0k@>czwSz+Ah$^$T$ zTk8~wkod!JSzHQj4B&Br7OBv%v;Z$1{(GDW(B@h8``QG<2S&X>!i8=mlsj+adY z+&0B$^XyWJ#OgMnDEhEKJo`2H@#YtXfxBGjb_sug5g@$X7_|pL;Wy)~m-KyvaEKLs7EDwg{+`@CdQs`9KO2>6uab$y_vp zb|1xngo?E9y}@`GqK0})@2nH@PBcoS#L@8$h3-^o@;=29?hGj82L+xPDoT^1Kn~|a zZ*orfNI}_IBr5E8Qtg==E8QXSlKpsrDtSXhvjDzr*tM!MYi~>UV0p^bdMhk*TY$`! zAxMA|GVj{eFLMv7tp79~-UOIlyBzgvdgZ1iM`PgReZCsX5LGBF$8PpLD|T%twJlT7 z$+KDZVkAQVf8l-TKHwcE+*Cj2NnZPS&Q|V`&I7Z1axn45S1h~~`qpI6YmY1ctES|H} z6Ua0Ls$ZkN*kQpAF)eWC*2&{ih61mcS?RQx1{}VXQxk{FX#nZwA^q7}q$1%_zzKxD z5%fr=WvP83TnqXNAlP^usz$EH3miQGZ_JllAEpiPpmCs$?=u2jOUIZ}#%m)J6^~Vw zOu2{v(qo5{0FRJTKZz;92RHxcR!6uL%Vm=}D)>~Hc4|+Oz&dGi*s@7xo2F_6t%Yp! zTP_Jbh8&m}GOEdnRQNW-<=?E&uOJYv;gv5V>Rwf|Pdw z-NQ0i3A`(nMKR|hUj&N9(_!t0q#uB&Y<IWFS)T1BI6p zLE#z%Ovm^&i+u*YUgO*;>i!fSV*(Q>IZyM3KKH{+VLdJxX-v46mn~v%sp-EhE#u?R zOzHQdPXsf^c?XdFvHdfrKMY~w$2#R-AvF4m?0ADRTji>-BwpvP=Z?aOW^u+PMqT*6 zcn^R^;_+SzULVGC`%J?E_9BF{AvQ&7EuozypHVyxQwpqx$kY3y8R9iFkWVf#Ck@(q zaq}I(n2#!!HguIgQ~D@ELz!2_QkrAlwdK0y5dyBC%2F*)+h(!9qePTH=r08a{Pw&0 z`=BH`29@z_OBHx4T0_9w7Q&=1=rbl-uGXg7r^An0GG*imrsv2S!G@Eustf>ej2 zY&g7cZmZ-A+Xs%*vg*uEtlu+Kz-_~D7-EQ9~ zS`9{ask@BWG`O5PO{v17zQIhO5H3Gy$9aL5MNXqCD-I}wic8B==3*~H3(ObJNN(!F zZewMeY|#}JOa-4agnr9&&6}1kd+K&bfuTwHXU>`i)t;xr1UXik$)a8r&rO!61D5eVx;1q~w?Zbiew8D*ZX za@fXDuCkgJCt>Xpe=KbasbRb^#f6~E4L_4^(8a|Sma)_f_1hq5;*zz?8iVhP45*GGD2vrw}VEUoKQOvz^P!YlQ6Mrc;(tr}|P~`kZ65RSA=hgEU6-pR?5k=U4 zBV}{)Fijb=%*!CtMZ{|sD+sQrFd~++-j@J#%tuZ6$WasP$=Zy!D?M-b?@Z_3L z4hMybI5n3!pD<2-|NdPr(Pn$1(fxH|%a|h=VhI&jy5=K28_(Bl!=10OmtubF7nS9D z5zuFk2w`N7z7cjk&tqagYgUII)Z6RI z{hCBPdtdl8Is(&X@8;sbsUK92NgpocG+i_U$D;NUQ9h z&uVM0I`;%4p{kRsdJ`bJpFG85)G@8oX{(;CFgIzplL(^Go=gjIyDhO^#@<260u{v4 ztG#KH|d|ZmJVNSxVPz!e>wAgHjvu$pCV+Irj&dNaqS-TpF zmSA-^d3-IfS`QCd$jb_cOT-$Wo? zATk8RWIz>!#+FZM$5?^v>X;6D?_7Wg;|PYog#Qhvn49GhQ^!RsH|BoRd68jsF)Pr$&7o$Aal*x_*%@I)){e_6h5b?!z4H9O!TSC z4Ix(95FSSH6MChNNP91O59+DRp8?GpV|K&Q3@=b$MogOh=zbyB!UKu&or1idE3?bS%c5%-0HhXlEGci&e1z z09WK1Zs*;(_O}kQ1W-wal?8qk3qAuOWSOs}T7Un@ljChSd0A{{To34^kl2AZegZOfIpLKXOxoWE6!a>NI@I{?i`yS})+0ha0Idvwm9Ej2FCi*$W8 zG>I}#@0mvtt2?g%C2JkFq;&Ha$lGSGAl6>?{ z&3R@wkpEh1e!Efw`3y0}Pl2EAEKX{3`Tq7K!Ckk2BDDc%GWg~Rb98D-dHl|P&evUN zOqhLN-^nBX$sXvbe}p2+QSkxZ8>>)Y?uUq+Be1*1cO(MHo84&aE~X6apqf!s;`)*N zLvC$6A286QCNdv+G!6j&)o!J6KT)LrQA%>7=-b|3(M2$dbWm?U#^UQVwWRV;o15JA z(HWsjef3_V7|&s~ijOb$`xDNZ*EJU#-67FohXP(Oz0%CZ;YnUDCBaI*!^8DxT%zq`$#y6s zyvVk4m;TpfXm$BMdLighASIh|6TGhS+2`HUTiUiUJwSNuu}l7a_56|*?k{V7E#d+Z zs!k1{60{4&b6oO9!F#$ifq?gYsK^wObqU>j%Amzg)GwKj_6{N7D@zF2W{jW{JZZqXCB%y2o>Icn6+4I|JhWR=ndc!Uc3n8{E1AlhUIrsi|xfRiX zfxXTfs9qb5#GDnLQURlOR}D}nESBt0CiFnKpkb+qe!5jnze`7z4p# zHHHTR980O2FNW3Its6`!3!t$>o^#*6wM{v?EY1B=3$#2|Kbv)mnwECU$gK44DwY$` zVbSxMz7T=pjuO<;l?=n5w?}x!UMjB-e(!j=Ql%9zQp2Qn+<->NB5<$MHB-*9=)a-cmH*6mWh^e5??o?g2=`+qkxU}L(A z8Maai>~|jOe?#LsKMf3XIL$^fpn*PF`i`b8=?@SS*HdDe^40B*oNuf{CUX8P;lh;I zUPI`=#QpT;e$!IIhkk`nf*Buo@&%+d$J=*F z+u6&n&9_I4BuP$yVjRVf6?7^?quVneY`85d;3XQrHc2UIToZh~{ySJ-TsFEPm} z1d=ac#*c9ySGk`YjD3PrQQ+rbE7VhM?2V_7;PqDp4FM2N6MEMMi?U6~CRm2MPW3_% zC6Xy9;t@ZhMqZ+TXB@>$$g>c&gy*uez(f+?$qXe!)+*9EN3PIIU0Wk>k=r(x>d9u*6 zUA=YNYw&*AyKKVFr%l-8>di(^;HavN#A5kACp}lV>TDVE$WXJ99?12C)Dw9t_Ow7MNwddU9Vqf4G%yyaW8t5KZPsVqwu$)zx$iEt|M(Da_ z()mJx)=G1LX{Fb&`*n=vev;IKyW_PQKmd)}11~~2D912fNi=q*;Bl)4;(gTnw9jw- zHditPS1G^g2SQ-hr8YQLA5%a7({ZAA2J%JD+B(p|w za8scFcidm4ktlge5Va$jC>Y(f11Jh&imO@_&xbqDPse?6$-Q8*P4L$|t9jDzPhWX_ z2NM>iH-Yfx@xHCRmbw2|7C;~aEJw??r|8?xaTq~TPB3k{40PfKAF?ri(flbfQf-D$ zK`9wRyp33e<6Ze5J85n9LMAi%hd5Fbpan!=U8OkQ?#q^F7*!t3h&eV!GmQ zYlD<3%x5Mal9bW}!?h|HBY^Y17fj+|E6oYt@!!n`37)a6u~dJ?a)K<~dD6etv$o}8 z>C{sM6R;@zqY*QL7J}72yI2ck@XiBNSboC|$hP`)AJVJGKU$!VU-uiuyvxjD@P8X3 z@f;d8WTJucT0x<5Fzc!FVN2ns`7nX=YAo3IR#+>=N2^`3b)P=>EVYPz=n6eq!4F(K zWeYRsaoA#R5oMt#c~@x>$1#EAhGH{>8H^K5_VCpV#|VHYIZ?0FML+`H3$Ug+Nq{88 zWWe<)34GR+j4juxwrO0qvrKVL-7VcO;d{Kx!_AOMcc)v-P5WP(G zlHXNSr-jE|01<9onrCMF;7ox3KZJb;IMx08Kc|Bu$w8EojuB-?i0sS|g~%3?y;rs< zAv-IhVTJ6Fy=Rn_y+cA)_WIwa@qC}>`+a`b|GHeRL#5;M`Mlrn`+nW8A;?OvX9QPe zKx6bve=HsB*xf z=lXK0NEs%OT0wj!;dH!&_gH}!@XU3|!s-skoBPIUxa3*mh2{fYH=L9WTO%)~UPXUk z)hKLM&?YbGx|N5P5P~jSLt>||>QK%WYC>~*~aIMm_m5;yD;_nq69-uM#j%yVz z^z$Fkq-lJwyruQjMD+;4K~qs8Qfk@jR+c*9`?=JpRlqh|st(=D?kT*p`keK~=;oYu znV>L%wF1FJ>vOB)#aWn<*ob{jx@DG>7pG1J+z;Uo*EMi??_Hi7bDow77Du?vdKiW8mHt zwMISzJiOoJfDVRlyO|Ml*!zxVh6t_^)BeYZWTl)Lk!`tW%qDlYF8MxR?n)7n0di4Y z*3*Vxcatl?OW3fwi)2qQjY$-feD~##o~g{NqoKJU{k6-jS1TZnDJ{&9c#yk0H;qGA;5o2HT1O?6y`&3Z$AF`xY^h4z0ab2)r7^zLt`TIN5?eXo$z zoWJ|#3{-32N&O=?;@SHIJxL5Bbm{|9^VPafC6jZi5?Mg(69}W~GbHmrI=K8FcdIQ4 z)bcw9PpmX4``*dr#S7u+z?oO<%}gs9p8ve4PeP<2D=W!5e=TC+BV}uiY2+i(B-!?E zEc)3zciv$AsENSIW1aEcelH5Dnh7#hVHg|<@P5rpX)NRP?Z+**_Zu3zNpJ6Q=~bIW zsb{BaH}do4Br)x~nWS2aEbVxv97<~>ecw-+clo)tt7S2-iBDe{I?5BQt6yqzXaCL2 zuxr!1Aa0?+*X*+{3VlKyCe*IRdx-fq_X5 z=)dpje+y#bjC%1HUyjZ+`yCLz!og$zMcV`8`pvH}y#4}1p&7ADUAIG*$9*2F3yuq@ z?Kp4J4^JsP=WUs&d%QRa)p&TVAJI^gWk|JsaopR=FX3_@4j&HfemKAm05~rdnD#O& zvyL7}UpvdP1_a+>_X+ff1scQ7!vZ1myRM5!XQmDL5X`gN+iuyoxX$jx<5-Hheb_ZjwZHKQL~ZK98_ z+{t7aoQoN&74HWU{Ui7N&4mF2tykXsS=4xE#-)har$psb5_*JN==ew>3)7R`Oc;eu!z+d+bQ)zdt^VoM2Yr zG)Fs2Uv}R)#_zoR!f1q{YP$7J1e>8x39g-ouG^)y9uhgWmq+nyzpIDhT_cr8-Z9cL zs-u&07@1BDHs~}4dEB*cWHXTu6V!xVH?oZOFEj|9VHJ6LYNfK`(+MIY@G~{3m;NeR zaIYP)0oN2ii!*?U_CPj=$>+XR_*R32`oL%BexKEu6ueVcx_fp6cFYb6%yr`KrnDjTt1yUb!_E z=f#21cK=IM|2;&s#*> z15fi^8ANtP@7NRGGuHF{UA1>%&?X#gCYMiknE>fR{F@N>?+4%O9D+)J9~E(~blZe? z!SLB(!qQ5t|vIRyIW9{QDjn{Gv|&{dW4Zc@Mrb zlMSXGVB<6E#$%t(y)S+8`wL?r{e^=cw0fZPYJJgb^8_R{QpeNXE3djcXH1T<_oAS9 zEp)}_K}K&XW7$C6%YFSfT=Pg&s!~~=<1W14$re1#2NMN?KbNX#Big@koqqBB2ddiZ zz*t&0N$8gztmubHulda*jkqG8b0<$ILL}gRYMJ_UqbTCZb-kwGv-j?A9j`vT_=n~A z*K&s!hK>k0hr-j6Ji79I>}4Rh-~v1|mjb(?P*AE48xWypKPxgE;;=NTAYfmj2)_+$ z)nVe@yi9Sw0N^L#d01*c80lxjKHdI&2sEa~RYvL*j|>M9ymh+$TYME>>OaZKGMEFD zIZ$Hl1?maDc;3<3CrEqlp=HTSgJjIc$Y9(gCPOG)A#r}S5Ohr3E-nbas$r0 zZY+=%`1s16Fi+>}LNK6CcO(j#af|N1x1G)pnWD{i-L&jh*b5CPu53D@yU}?T8E;8; z=}qfjklX+L;s7f(T_E@e3@rL79(~_8!BxY~-pnI{B@E_$(d6 zg&_S&&S9LJ#2%Oz*+FQ`8#$&$T|tf8{J>nF^YBLC*`EToY%L@+JLOO*CkndIF2mAeLqpQWn!KWB}%1w4FLzJCUs|)HuYmp3t;o#vQfNlQ% zfc}2%Wd%r%fBRE!_WogK)qbX5w=EZCK9JuK`H<(O+xDuTsx+sc5?18fo{D&-Wcefa z0kVda^_+f4srbcn^5<5_>Zq!Zuw+eL1h)E*Gg&{u)btcCH;(aL-(N^Q7OcNSSS^$v z5L_Yc-*9BKYOG>yIp)v%{%7?ci8IQw^W6B8U|xS&2i}?6o()4pUFup_ihd~-#$|Cn z+hU&=GN?JHUAT?}_uM75T<$;Enj)EsBi_7ZK8ovN?OB&9egqY(q$oAKxv@01)af_b z5a>$XR96F7fjl1(1@j4#5uMM=G>a{Hh{uJ)MLZ9JEEbXm zRRxh^q`c*qz0iaK1|t|j@oHg^he(f3@+) z#xRhXt8MAifB4*U`E`?n=y8bXu$vNbBuKobPOsi92nbQ}Lgta^P*>BDe>eV?L2T2W zc{|iiI-iQJ&($LUT%TM%H1?V^vR_{rDMw?;SF<=!J}Wy|t9b zER-zOwpjrQ%jP~~!;%3fWEJ0mRO?^fC#()jkEC$`DxT|0&aKtn`*m`OGXMdWR~fMx zs{WqU>ne{qy6cq)&=)TI_#CBRjuB$q$TPCP;=WTDf7Pkub*v8_(F5wTeVk*oRPfkKFoD3( zyKW2Vh@eP`3squRB-d{I0s!d%@I5q-lI}vL0%fnfzl_R5ISDGLjC(XH(MieeNTT#){_#x zTD?k|n6QUe67h(l>y>2SPFt=0@4xl?dH!7@MWelL;(y>PVS~q2VkK-yn67hC5$ePv zyy`hRLhrwqQm+2!R-}@n$K`I?V#o@m7V!{Q@kdX6&vhY_`T0PsAe`@LjpEHzU(?M4K+DVDt*!me!5NWv>>q-A1WzP+_O;*FPqB75rP(E)o{A)? zn*a%tBD4c6U<_f>hr70Q)#Xbw=@8;^m0*Ycg<}(rguB*=L83dFL_fikY|e9Z4ddm&?#$MLhxJ ztbCpO8WN%TWYMIbK3*w()){qNi`U-q@t@mLO@~w5xkc>NfKZq4Hm2gkLxBe9pQp&L zFNfuDq}*R*+Pt@*Q43Zie5{HfOd(a4M^hm6!4=$pYrg7S5z7d{MXZ)xg*TGqY{5?<+4z70`KS`V7D;t8TTzXc14b?vJ$B zM$zwr##yl$ZQY7JBzejJRjZRnotHn|=x<}NXRZBX(Co;E5+F!fym!3F0Aq${{B|=} zG7TUHBGD_roikKj{md%9^XeB_O<(nVL)oQnDvyOP-i^7n0;32I);Ay?i_r&KK7*I* zmD+}ry7FP#bUJ!4MEP}bw65b2mH7}_l1t!q8~@wW?EOIsXQ^lStJFSSu{Me?qj0$K zLc!*&?qRDbJ(z%JofU!J2sp$Q;A7Qu?Db3KqC8*IdBrYIX&)j=aHpX`DEB z@tmjNXW_@q05(s169^F2%aRE9_f8E%dGe+4j8#$Fye!H+cf?N7RpI)($D(r?nWvMl z_j!1LpdG|P$68{!(-H`#M0K%VOHXnKk0RAiTW71~oc!`*u6uRuW2RAK5Y>a$g&JgS z%0NL?A)Abg;W#c~Jr(Y-3JGL}JxJit6`rcZe7>gSWR1Q)1A@|w5$`SZ;b8|Fjq%*>Q zo)t5Z!gYiYN%tbk&33k9T7SY|^~=Sgt#rkt(foVurfs)A-H5$x;?t9Uvrc88V79;` z^U>B<@b}C`3TDE&aV<*EBpWMk{;~v_*43p?@XNnet#vpSZGmkopW)&l4}^#bxXdOL zEAU!fiijEkh;`UrSX|Tf?x9oPXhm{6YISEvsM}eQM?A*;N#p0XZ~Ep~(h|s@&JQkM`Lpd~ zaHGkq>6ko;4wsLGMMi#sBzo6>DFZ|i7_V7Z4bh{M1>;t94F0b^gpVV~qm27=C%BAS zRk*t#?$o+Je> zrPka*zvRg$+W#DZ{yd7jF@)o>qZTy|?ETA#a5{!!cllRiNwY~y=dV3FmUl+jZiZy) zxB|Il<@P=Lj820E$iBT@z~6m&^i{*V(>&{2WS9}ajIM@AVU6H#8f0iSh+5k{!Xc8n zu@ZJqN*C-)u6v)SU&=Kf2w{997u`{`)f_t;CjFopd_GJi6hUvBFR9oe2pF0J&2^B( zu+d7fE6>1Uhv{=12zNCYznzf%3gcnSD2f{FaZ&4^toYPL#6^zN2>K^fTc{T<>04{g zSO}qg8l8#YuIH6yaY!v7rDQO;sINk&#z@^-qH#_}Ui(wCUttt=YO--#>38^-;wKk1 zu6?a=Ocwvhr~@KdPoQ1!i6Rat?5>Ay-Uppej6Hz8vmz&SYOO}g8*Gh>y3|R0F5qyy zqg9t-QOVI^Q;iA)_R)>2PV7bw7&0Xhae%l#jP{-Le^!ns^K}e-5smZv(r=EaUE*dh zQF#vH1uPS}E{^uPDJvTFJDyF#pCM%KoHjhJD+oWaJSU3CJRYxrd zVqylKCW;6+B?CU}Kr@`*Z%g4_CjR@|Rw{O|kf-(O<_kUi^h-(UCJ$0@vrmg`VAVByc3ha;;D%mtShuE%UAHH;^3~hA@r-^On!N%yMjZv z(kDxM_c<0pvC=k8X^6$WP12(pr@>~E*tZ3IJo&;~DXnq!LLf1c6g`~9{Ahtb=tHb1 z8loUPV?D5q)3<%_$%vMIK0b+`sYH`-baMP_=W9py(ucV>Im1PfcQ2~QV}huU{#*0? z_l_J4xR;nlE{L{H7G=Jsq#pjvvB6Y?1QzTUzmpGQZ+v*pr#RETJNWt<;7$b%(#-_k zT@Ohdd2UC-0Fen2<$p9MjXsoPe`As16?oZGAB>gW+?bHV*%#Yd?|b*A!^|hD;>WE+ z_R-56n+&0MPyqc(<BT!DieD9%LF&~j%1p4crCR$A2U6Rk6* zH(isoxKYVyz4O7|NNmaMB&J0W81zr6+n+}MKWhiRgJ#DqXOaBmUb1c|!4HVrFzO^)FNs@J#$idAkDwI6j8kU4vyUS zT|IX-^iR1j<9>b`teQqp*Zs zH4zL+n|%qBx+rckbICVnA>;2phd#EE`iSKM0SV1z*cy9j)OBy&d{}FJLYf`1&KD(tZ}pEfS5uTWy138~VeVG#%_8YD!K(9!XKn)TFym9tyc`Y<);#Qluet zxIwX&4~fL#XRkUoKU3483V&x7={Fk$7qu0{LRbX{AO#NC!%=2^i~1P(uemrE1#Y<= zz_UrsdvR?l(Gd@y;(N2+aXT~H8po6QW9cxw`Wu=i7_@#Dp&*HwyR|gRA#<>|Z3LpY z8ERiK6t>hRV_7fq`0$LgsiSniL7~y}K-Ao~G~UG~!)@Dkb-=iL`Uz8FI539>B~5$M z^`9hS%m7ZsXvWdkqomm+1LcK(H&EtOKp%6{X)FnMK9Ne)nAZ^Pau@%*j zttPbKbi_}w;`x7q6LJ*0JR48`?RA_vL^F(bOM;Kw5iGWEB3-$zow*5e?50Gp2!as2Fez9y^? zWZ$E;W1MMq;_>VDvP?h+w?1@&2NGED^sQg&knJNvn4W%q@?dz`S3{Fq{;I z^gX)MM}1!aPqbcFcu%Gte|-yxIBfc&ms%2q%HDLS#maG1^jK*RKCWDOffG8$7Yju>Xb%MbRV!1V9=z18H~y=rvl zj%nD;m3_(?LNfnL-hg@x3V|Juq|AM$`U|hV_vLc2QfB(8g!&O8+#Vx$zWbBDdJ)%P zh}sEJN|p(G(aK3q2&M%4iK3p@v=vTr7#NEDFFAwkAr9-8>RUHJG4Vh5#2l7TT`4HSi56(X-BtIGK8btkT+J>I-)UN#1RTQaYPPGzi{Tj*}US2Qk=ej0N7*UZmpFmV%1TGUtlR7_&Gg9CB%A{fRoFTUgHj|5g(oYgypC9D4P!}`3p%Ub0n_R?1- zi)DbK-xJGY@vb*XgI|nL)6IT&@$EEp<-9si)o0dZwmDp8t? zG*G1xP-+YbKFs1?+4{|fkVav7tpodPO3b9!8D(U8@xKON9h|v zE%2XSg{tO#u(y?n+NA|X-B0ys;paamInktEuIv>qQLJ~mC@LO$TKTHK7XtlC^oTIs zNp1Tu!?vjQeK2b@1AH`k$ja6K8EM*Wi(@6zK?pv)mzx3fSVworh0d z-Jmavg+$?&U{~pTA7V_xb8%>Nn9z)hiFY?D5AD<++=>4O`?3f!2+Yi_<={I-VC z1m_k^-#e6jRLQ&7p0iqY$hN9_w);2URLzLd*84my=qkSPRrf%5= z^r2VB0;m4#fr2k(lztM5vt~q5tG#M=UqGjM)GQgT$f};J^y7WW-(=#795|p6H)m}< z!Ky9_J7r`>JHU*0ENi1$fCOha|Jh>3EsRd`%b?lwGa<-a_J_;O^dx8I=Vq$sNhG-8 zl5;!ktu&px7n}#?c2QnmG`xE!gHXAKN1}~^!_w~mZT~aB%_zC@W zMm-PRO@>RJw1{}@rAZ-QQ}ktPH~CkfqyF%r@W2J+8 zQQRbYwkOl+{SUC2h-6m14k{v7jM_F;4Y7djS)a4md*mHMUhRu>o0nFi`-j~NZ&0B137;jx4e!nf zaAeTh4ABt2?Ha@SIrOTNo0Ghg04qzoJiI?Ai4b{{~jnhVxAbRoJR5t6wIDMYgfAzQ_X{ssY`QBAW^J3Nm`@(utB5Ixh(n~_C&952TlTcWD zOd^4x+jUbK~SLvJ+xBJXWLB-309SMkdCh^XIu z?Dg0TKrIHu&WK+NyGJGYT&peXf8VdreqDFQ-xKWjTKv=C8PQJ5K{bFy?>M zx!@9qwb5yi7s~Y@Z}y9JGJwlg+#n5h1mQG7rOySHDvB%KkVlzz9nFn{{`lg1FriKc zewzF?(7i`bDBGxLIQTyB7%e|Rif*lWpj=oBt?5E4wo+?4BAJ^@+6QAXLE(a$gfm$N zPigjF?rlxoY7_WueswHY-)eC3_088(&A_C9JNYci=#~CGVPtJGG$4H)OF`9fWcAWu zZa12-Cbzx6xgM2no@GL`jS<%Xua^SbcEbIBBYnlInE*AVcGu>wK`gg?46)!wDd zCSX;#^n3a&ia{)gLuyL^MY8DjU7HSoX4FN&*5qfs{+%v#vg~q$)teh`^`(#1pZa;w z*4NUJXNkR0rEsXik7!&uRZYq=jGpZEQ5Li{PU23)VTArt$n5k{!`oM_bFP;1ThCCI9wN?usvf16wSVjt@4! zlTg_lmEgjvQp*yRhy>V3LBhq;Gby~LmZPHpz87?Sqs|X)(jLucyo7cr>iny;w`&m~ zS&h1fYts3urO|y*+vy$mK;`y~W_zM32`}hx3MHf+f^d#nu4C-G8nl+mr!>ovHXXoS zgU~;Y;%pPgn!O9(ZgvKHSl;6K%7jG#qRwY^Y}`@jTRoo3`SN=ow%JUogd`aSYRb^~ zsI@TEyyj^i3SSeCKLlLNDFmm|G86&$5j+_#7etSe@_mplvfQ_tZ?d3y|0TSX%YDaK z*zD^_S&q?Ue#`)RlR}Bo;RSoon|o~T(?+MUAcr9%!gP+nz%j5HpV5sJ3oPu4^)pD! zeFUsuP{W5J8Hyp73xMfzO+UR5W8PHDWzZ?M48V(lt_r`Qho7%MS$0arXq@*gB(}ck zsvyVQTAik;fDW0_EO&n;oA1*KG2bxeIq$yZ`)kk5p4c8mww~^^Lq9dSa679+YEdZb zh_=Tzg>W%bl3Q!XY!KFH#A8+rAT37FvnFe~ulIJ)F?x(R^u-EE+&o}4f$Z5n+cOb& zr?pwC1(zcfh4qg|v+drD5ZZu(Rjz@eHXqL1I5!~ZtTg8ke3h$v^i;42GQl+`i{_D( zv1lFFMODq_9N<^`mE1M0(}_%iuCPTRHR*{5h0v7U*#ieo`O^Vch0c=9@H$LHrp|eMObj@^ z-k)Y93+BysShtuvz`}<;zE2%w?LY1-eJ+48-ePAIO|=FEf^y+C`x5`B(>xhww?is4 zIz{Xl8@`n`wRj#^x&OuexMlAsxxZ$e zT^ium#+lae!r7_nky#o`{!vQSQ;Tvf8#0(Wl=)cYNVXbYMu?&KY`OeHv>#}vsq2Xx4Tp>#KgOeGN%%iHnRUd;{J~DiZ&zl98v*C3R=F~7WK9f z?^)IL)tPqVq|&Ki&$N8?hY^r{;i>7VeES;#8HI_YsW-KqZEpUQoH=;CTef#pNa6%C z(&pC;pP{VJWD)XHej$omlZqQi-K%{EwtF7_bRh{t;xnlwjn|&v&jdegAAZsgNe6H| zM6vLUS&n?dVI|$RJ5%7g$zDbhrWGIHG6TUU{SNe9z(HSyZh~+)4MM_t(@=!j^YLPM z(jAwdUdu{DFeJn2)s6~<2)f$`JDDMmQ#{>LE7;hdo_E6E4rpxV+sp z!N4;D6ARZ^bruAM6j=@?1Kovmgq`L$LZ{Q#xkBzL3aGp(pp0~9NV9M^PIn3cI`?0(R8E0z@=O~jP!Oa|U@EX_g9co}~@XpPUf zQ;?d&`j_GAbJ2j%zHldkm9kd$6Dj_Hv47KGygo(po~lG+2zGq8)s`!Fa`h^~4v|y! zEc8fNBd%6(RcVKdU4EqX)$txbfdtFp^0n2U1U#-IxbB>d#NF@dn4%2SlGaY@IP1%2 z9e<|}z0AsGmmaUbl z3`)M5-bnUAsAtbD;MsSCnfK?4!5D+_#rgBb9)h}=u4{mbw++6lx^5tbEB zvFrlIv#hgGTM##wh39AdYBa$((WTK6T03J4@34d|MdaEk5@BZ#Z#S^hay2G&Ua-G7 z!=_U!*z#j836C`-0${o8&t_rp8Wl5F#VFJxoRY!nkNlu0yl)?nk_zJ}SupXp3%P}s zWdl4>c7CiX>HI5}dAs=mZojKYZP0b(&ffd z#f>W%pK%3`@!<%XGw&sfch3*I!rgaHOFG>QNF`KE&l9yaG4+Jh2uXFGdYBW6ifS|5 zWd%vFyf3ZIzl|>RP}LTy&v~7aWnYUu++if~l|mELIGpy;U_Q+~V*oa4l@KcYAvtZG zVCe~<`81k)mo0~xx{9qtwm*8}-x(71R!s&FKSfnRzN2mjWRlV9--~}r>Rt~%hAO2$ zk#D9WfvNqut{L*OK-Ck!VCcf0MX_1s4d?8e?(l+iWlDf8GWc_*+Q$wEsy)m*d2bP- zAWNM*)hi)`X1Bbmx&BGSmtHkpa(_2YU96A`4(GrZ$9(})T~oXKYHo9EtVUf^JcXnD zlQd|rIH>E4?>yAt?=qOJ1fp@#r~A+oZCot5GY=iRU62iArD(w<;qF?k12)qfTueJw z=hDdKD~GJC*!pzjaKnkiemXv3ym62RAJdkvih8HVmtJ6g>-z~c+*UF|tcj}Azx{Ks zfGK(UC;Wkt$yymExld{8{;!s+Gw->omXHT}=iwksJGPP;Pg3Uxf^%NcgHa+Tv; zdp9k1_hCyKB30_?>C>CmfYud_t>y{fdJ`h*&j(Vng#-L7`Hlrr+2hZD-PQ!JEg_gX zMGQM?nsp0P9?8HnUi>7qSr}cmR4GUDa8xbxwkou3rS@;C7f;%p zU!HgE0-$r`=A$pc$@#N!$`dEsN7UC0A8&v?QoVl?kQeB+%N%*W_csQgH6AqY{YHtM zbXIQ+6`IiJRPa`lolPJ<{d#k-dVPM4VGp z&;B+Uh$=L9^jgZGCP@Z5<)jc(@}iEl_mY|_nyrTH)>vf)mVu-}X)A#B(7W?0*z7HD z$L`s@(W?JL0#+v|2K{>78#-+x7#1;GpX7C1kSS!vqjv*ZDO8hQ8Z zK`oKH=WTo8f!*>V5;KVdMAmU{!dfrf!@S|ygeYB)JM>sGu}SfmN7(?u&XKV2M}Wea z^ejvSSaiPfiwfmvxOIvwq3_5P0G}^D#PeT+nsEGP6v6N7HXefGAyQKoG=%W*n@e?< z+ct^{557F>0_gy81WxY8rHv34Ak%kcqhkv%3NLwm=OGTo0vN(2fl3>?X^eESZ_d=J?CJR zPb6oYG1;1(uO#KEqf+%0roMKPr?v!*pLmm(OGDQD0r}%9o7L!vo5v+Mw}N|wCOeko zjRg}+&WdTdmX`qc8LJ>cmy6e_kwbMTD~%7;`rnHMU>pNgnmryOdpMU;3vz6xT6XeNq*IR0K=pelO!DH1g1Ne3H4+fwh%nbb-BLqLQjb#?A_h;S6pP*TWfYd*5;Xwg=) zPC+mBlxu{&8TGTFCqrPln)D6VDfs+DKE=Ym5GO3QKoKY`7MXJQmP1`sWTfHFi4adt z8e%9n`YvoTpo@{Yw-gSgfuT=PJf+w4dxV4;CH#tDSy&$px-|ESxEyJ>tEK!P8|+*O z@C=$xO|(AzL#!JX#j$gP(&<Qp^m`#30LSM1PvG4l=7}M@eeEQ(;|PPZfOf3f{lbT_E~N!4P#Lt=^N4Vm;Yd z?<%K}3}`NbwRm6MUYz>UUEj4&DF5-ktb2a+qhrzwxvmtP>6 zKXQkym}RBhnpWjFRzwC{U}y}|`lF@kdyD6nP4a;`r4Ga97kQ}(d{#PG*K?u!>QtqZ z0W1p!e`^6T+~{hn6yRcMuq%D!IB;q!(Pk30B|5e7@aM|F2p}DoMlJYMU@~@22HtN zSrGaC8`hu2^$!5028*>mF6r@lX=c%`nshvdy+@DKPtDT$hRlxj2o&w_Za%k}&$A<8 zcWz|XC`{*${Zm(gmpXXk<$s^}qyEBnV!UT%;D1Sm-=y*Bv(&$*qs01E$6R`Sq*VAR z1p!bten^^Sc_sH+g1TQwE4TNpW?$V7X)AW80*?}7(KznvyJW2bZ!s?|f1w}dNKTjF zP@swSsaGrCRDm+YVATgPiBGKF4nT;U{9wqBg_XM~4mb4VK!EatQ@Q4MN&A6%Nrk?x z(O4^KaJTcz{ogG&V2oQ9gki+I{vpe*115MfX5C|*%r|^cgxh+w7e*yzPC326@uo~H z7|ySzSJHI}{=GXPNYho`gbVKfh=`&{zGe&Kd%GnLn4=pl=J=PiwBLDgX?fTMfo(LL zk3#p-v@Oy2SCd~$2k+fu&GkO~zWUETri%lSTc4}BosOYI2BOWAS+z=(KnhO}otH$0 z*%37}D5kkA`>e?(>C<+3*f@b?OT}gAkCpwzFAcwsNSypBFXO_)Rd48w#%l;X>C_P8 zaGpniJX5uf*{e2?)ZOM5$X3;s3Dd}Lh^c-beqZ;-$4I7{2MJ}5sn+`!*9twp#I@B1 z|LTJc$q=U7U%}qJaVIQb_z1Bsp3Kg$cR8B0PW+Z2zPcxhQ8XRP>G}EbL=G*L3)`MYu?vo%GDn{@gu0B2^_Z zG4u%~QPH`IV!1G#3Z=nKc)r~asOXwZlWg$MSTr5xH^u6n|R&- zrCt)d@&sK3TDH0F70lc30|nC25RF#AW^XNbjH13L^f@{meo0FM%cAK{s#==mD3#2^mB@$Ng*&$~}rrmwlzku7J_+{-NxWw3H6rX~|#vdo@ym)Ban} z8-JvX=m}!li0A2nCoaA!vKpi5K?=JPNY?*LJ zA-o?FkPMF4w{?eFR98{SOZXQj-fb8r^%Z#5nx8Sirs=lryL<47_T#25cHvw2tjkoR z5TIu3bQFCN1Dhzl`76@j#b@YEaQHvVK{_YhWmSmVSyf0St7+NW4!wOw+M})J6C4F^ zPPhIGT?_uXKIsJzo=%UaI;%T$7lgy@xqpl?g((*xicYh4BLwH%(#IQ`V`0>rOv$EU zxFk-q8&Bw@ZR@$>o{fpJ zMId;U`fJK77lbs)U{nx5`FOqgT1h{T`u8c8Oz(aFDV1bqg8hPNhQidqX*vc^{m;vq zuOR&D&F5LMzpuVOuf4a^uN3w*d~u*ye@h5W~yPCO{esp785qQK!FsY3}tD>hdR>&7|c2^ znt@AOpKJNb$YX&@mR`4^8=WYppIZY0-4BV8BSgyh&9wexD-8Tl(8mTPeaayj33*%QD9w_yKZJAJ*2KeT$ z1N5Mgw;tf~3>Y$L;C~X*8o?BTeeOGa1=0g~IWGqCcK&)^7zA)hQy`e3kP%I1#5fxA zDOfY{0n{C7Wnmz8D7%`9Dl~uC6+=oQ1B4Pe0|iPZTszdK-7x+>pQzslofhI0Uk%IY zs&k)?*G9@dr;28Fz45OLHUufJqtbvjHz|J&<$N}y{1)T=x6!&DHz%HHn2zl5`knms z2%q>VVyvSsnKo%YXGVHhLZLx8(FcQqS)(}l0O!S^*L+X|tCC$m&XOOC4b6fiq{z{b z$(7p9dp{pYZ(n+xJhb@BNh+$3?W^%rH>6Y8%wzw48UOPd$oP6%^*y<()D};Q%bsjt zRl}mxV+}@bjJyk`YOU(E3EGb5^>qg0}vCyCO z^Plq!`yKyCua>}!AaaakegIn+QNzx!on=lMhvk`K{FRrA<58cQbe8}vNpYHL6994f zK|u1Z@Je+gtejmf=p*viR${O^OWvz6ZMjMKj5OrfeLFXDQB)1EV&-muZzp5r)ob&A z+7w)rs2c+jRV@X{OX0-#^b}m@ac(&N=}rD~tzhrR1QY6oJ$s@P8bnlcFJFTtcu6Gg z=iSaG?}x-Bi-#9S-Ip7Ja;;@72aw(meRU%U{9wb8F3caoU%WfhpJ%YM@ZiUGgoZ#rq!k;Tj>c;N^1Il z^aI__X-l^D-zU6xkR;C7$5Z#~h+g(DYaTI>rIW9{9c-N`Y$oUC!)!Uoeb2%F7qoa8oiTC@oMLQuKzYo8$Xfzh|gbfDBgidTHWct{>I;5JduB4IZ~Pd zQ>jLWFa*OCyKEzG`n~o{mA4vw>7U;Y^^X!DNTCNwXCJC?4H1=`bQHO5LnHJ+z6x4M z^5Xp$6JQ)lcK4V|u^{opaHVW*j($FZ<<*D`oeu!7(e67i)En4#{tyoV&b(!!-U!D; zDl$+UZzY|`G5q0ifC!{|`hED88|uk;WM{xK!_`$hW4>(CM;!;f+b-_epA zx4aC8&%YEC9|z&eO-SO7E}sTMKjt_g=r|fFcR+{I6+?sZea%o@{=V~_DUT>a`;6OKBvhOC1s`?@ym9X*R_`$Au^-m@{s>w zG^_w5vD)m?!nikDh0L^3muk!%9dU)}zI(`;5aAYC_5Q^c1{>n<1`K>c@%|`gkPB}d z>QB`A;i(Nk1d2q?CyTF*E$_O(FVRh1~kW$y15*>9Dy!An0E$~CAEmQXT zN{?}pd+Lx0q$>{=niQChRX&7*BPm1aW%%if_icnRu0Gv+LwA7 zmrf$G*KCy#Kmmg&fFI=ApKm_SCZd^cRaJt$TlMQ9)FJzy8#=%{>Ox@>pOuGdkvTt$ zp{k8Tw*p_L$l)Hh-dP$9E*c%CFk0^N^vSh=PsZqdS_%#wEh~e4g4vU2&~Z0zLA`$d zOtdDU8Nt*=(SSC&82zV@P%)z+Tnp32e{j10dJO*h5@QJwY*TbBJEz6-Vx!nEwPQ$F z*F<9*FLo{hX~_=@-#nO2aO#ylN34uhW&k)(@_vZrc9v3~wi=)0HaN($lzZ&0NCW*+ zVyI3Gcq+Z=H(&S0TrzlTcl=gmqQ>!a!dbvyP8os{vvPzTDTU^laO+^0jpZ>bIxX}d zx%5jo(V;2OZM$Cu0qrIe&ipsMnSEC>@!Lgq7wqB!t!m&_TquV_=`}uyN8h})t!=)C zh|Q!#d-wc{b$oYS2x^Yww@W=Q(>m?2b+GGdh8w<6Z}S89ZYs19cbbHYB~%u_a27M@ zk$Y`&-5iSokA~4DN2zkI3Aq8bnh@^2|3}zchE=(4;ljj3T1o*$DUpx{38hOK6eL7i zN|92!Q$SEaP(cuBknZkOy1NnSlJ0LzU2E-q_TJw)f7Uhmv2gOnGsd{b9iJSXe1_gT zDl6HT0=IasN}y20hp@I_0q9M(R@*c{GYD!|D&@BAVG_qD@@@HR%kAx z;Chg3{NsHa$~_nuV#-f`wb?4W?3OG0^Wi3s0jpD$Z)#kQOi@lQ-&aB}cZ!YD2n<6l4|1RBeiT=#Yv-5Yu`Q#*N`J zlMb!Nu8@7+r5T&J_t;>}{;O2bS-znBz~FAT$kvYphfMn@Nl^Ek%_T;Rf(^YJKA(YuNufH|y|Htt~ZU4KSaJl(* z;*nE|3}~0P9g-9!AD%MVbA_UkfGV_mqwGl0^n zE*uNsNp@)MxR`%>{(7NalhAo*u_sQaHsKqHWNw?4iDEeKtr~aSR8YBocl_%syerqz zBBxIICTt6IBi}U5K7Etv>9U(uGC8=-1w!QBHFj-&z4uJ2%^PLnBZ23r?P4^FUxXFk zvu}9l-i#>L{ChuSD2t**I*q6=G>XBbdmW-sAvIovIUDbVuGe?Zb$?=CYm>M=0WhF` zsr9OokF3Hk2I~l}_!3D#M(S5L8A)lv%hy54JQ=cSPRI-)9JU{;sA$?kr<1=k3BN<* zuSo)dmE52?F8jTwvLLH^@BA~WdO47RQhCcK*KuoBefUn74_77gp}fPyKo2R^osj*t z_(t}!?^YC=cy)MkS!q8yZcivecB@T{h*>PVR&i= zM~3y1C<}gF9pK3ztww?a$E%9i-DGO^=iGb-UlJ$QWb+2TZj_2V(6F{$$Y=eTb1Hj@jaVPF zePAunpuBB%f6ByLxO%f*e)+>=%Lfp7pwNA_Y*DO z+s3aMcA|3TK?dJvoGZdp5`FpB!+tcNnhDA|MMw|7XVY0%x2h46QHCPE{b9>n@J2xAZ2K9g~uBXteI*g5v1+$1HO5i-MjrcI+2b3 zskB({--U;teyCF-LO^L6$!JGbA~ZT*Z67`YtXT*#NNbyppNMMxm=jk;HG?^_Idg^~ zvzhIA85N!ZYju195ywr!$F7JFDR8|hNPn~~_nyy6_&tNNCG#b1=CwMeZfpRci55dg z%k83t)q!@I!=)+3;k+Z$hOs`i46v0NwEU`1nu7;}Y5I}cfxWv@Aq=|1Tsst7o9I~d zPJ2Xo1gqXIx_s~Yn$nidpFC%eZNCE{MnxjOMx$z$ZdIhL*ch~n#Mo%IIXso1Yq z|Ksk-5$2h5@a^f1=H5+L3DkGtINN`YgBe0lbWz9?+SUw-k6Vv=l?bz3Xoo|Vf8cab z%tbTv+WIV?tDYeX^(Wp#p4*)cl>FAB#$B;GHHHJ1+Y>>GUH@s}8^vZsei{iz>-(2o z+eFO{oD1mp;_1d60(89&!vTQxQ<3^uSM~Zlu|JZZqCt~e(Cvv}>|4qhqsZTQZ6n?E zVJ07Uek7pNjg=U~8D@lLL+clLoPHU}pKz%Q?Q4tJ0aZN3jPzCwNH8+4aJxUqPEH-%LZJ zT_uV>&dVV8EoELb@{S_^)b>avl#J7@_Rm`N+x+f9Q9t~6d0d?S*pt+6Unh|dsi%;ogU$59xr(6oP!NdZ_hRB&58~B#pBu%Wp2~Xhv4y_inNSz z!wO1-m3zX`u8Wd!+fSku@RAUpa5BYYz5nhAnEoXe&<2E&B03^DC4>&98%VbWo$CrC z-m@ZvhO||sYnsr^$HTuS!}UnFUlR=KUFe8T6h1PGj3q#0rjwj@T>i>1aNVJBcMPxD z3lrbDB| z?!B+x3ZxIZX>)1lE`6;q`cAw%W)+KRbmtYT`?ad0Wt7utN|}Q>7AiUS-Dk?*N`Zr$ z%vfzbBVM7$bn&d>Nn-$eVQK6B0hAc4jdZP|*PmM&n8kY)qqv$T{qg#bl!i(--!@8u zC(ytx%_y&jm8ExV#`3%`#Lt9|U!nj?qr#Zy`|n&{o^|gWm0?$MYTZ`xu#!9JH1CGz zfIhjkB;?y>PX7AaD-oXFNCi>%Cm00}+@BzrTju`iC#L05;)h@@kl}E?)#A!JxW!7c zD%2}DGv=qSLD?6luJzBXsvnRoNf#Sk_5Bd5Vj6afw#bdGIffl!kC)*o<>;b{bwel z&cm)1NP7C6AN8H%eGdFfYn(nP;>QrbAgK1_uI-|}zkxY$@OE=~q?K>a#*>S9Zr%^* z2X)na*O)Sln=5mhmUJ^nty1FtopWTqI}P5|-s=wI225uROPH494UU9s-7{=p^s-ju zHHh=pyEENj0ZbLrS1w-R>OY#<^LLl=yLAT6yDC{)6IWF#fH3huWHEt~Qg;hI(@L-F z76!*xm3eQJr_ienqHk>vh6LN=On&?kPi1&9AcKy_{AZs0;Qi%LXPhRA*yr> zA4D%CNFKg@DNG0y28MO3NNA3ih2!)#85<x6c*8kM9Z^HnKV%H@! zp%zGdbLR}=KU7?9;1qRO)to9p1E)jgzkdp9WUvbCO)jwH?nW~;546lIZ`re?@CL;#Bk<5*IuGxUC>~54* z58(>ausDN_+3GJ?CH095uGSVon-vYfnhy^Z?_(Ng%wBM2iV$B+A^rXoR3>Q(U_jLl^5DFqvIY`~tmP}|u(75e-X^&H(NWhxe7 z3D?{absZ@+jy(rqc5SRBW)7dy906TBv@^I!)ZmLfrI~?#Rg1v;`v;2dw@jTr*Bf5B zUE)#ZfVQ~kXs=3G89L?X@t5sugXBPCl7+d^aa39(LZ~6O>kdAGN&MPi(q}I9{Uc6% zJl*c9Q^V#99ce2*H1Gr{qKjGSC6mW~P4KZ{*rPZY_sUwGkK z4*V$}u3rC(0)cf8Wv-skv-YuYB|;IxE3}MOu*EKCW(QaTK`3i1)W+dt4{~>uK3LC6 zOwc1p0jIRQBQHO3Q$&02O8$1mn0pD1J6H=K7!tmhn^~~(w z=XBYdU4}XTVa>^}49X|XyDi?&1*hUZ!<89Hz32O?f3z6)9@ESHiO+VL{7(4<<}(p6e2pYU%pMZ$Me(Xz zQFQ(ptwkjfnK?2yKBJK@q=;5ZNJ>V(pNkdE6)ONYwp40boQUj-buDJ~U1fEa2_^e) zyb*qmKjD1s!P)JnEGMkce8pVHg1H1o92vBEH2u^BKol;Ogvmy#;LuBDU1l-^Izr$YM?_NvJN&lWL4*;3!{ z66=OpIp@c-X_v?1;-yTRFTNfNT3jQlt$K}mj}GtQe5;+o^sTq$Vygc-+_@|z9?jNjeT%!8U8Q>EtUL?Kjm+$9@h&7u|P6b=P z_=kbcR~)Cr(sD%EA7uvSeQ%-KNYs;+HC7$AS;>k`!=>P}l(Avyy-rAW_{+=eD_9kk zKMg2VkgczKO7Js|?zgXCl*h3 z`oJb6j$U&iKIMERM?{rXy~bT=#h@tmqEjK59t-u5FB_dh#LTm@4!n*Jzdo3&Fm8u! zHej*o$VV_*GVKYy_RzaQ<-927r|}GX_KoO*f5ix}{1;2xK&G0f?sBP!igxCRTeH4_ zOE>p2&G04%j+kT|qD$_J$9mwCO7kJMiJIPIb~P*=s9#EGr6Qq5YOl8=qn%7OOEt5D zZT7Cr;2Jk^T@aQGzO-!mu7I`g7Zxi66H)zlS-nz4K{Rqa;&>ONr$&y?D$(EYk!U?} ztsxCOS2Hy=Z)Y7MqjA|zMjGAzl*29A>7$h#Rjds}4%=Ld@_mpx%MN55RJ$Foy%iVC zgAC2%DkD<1o#6Q=F~SkP0q8R1<~X-I+2SWu%n6=MovA>e>aHb=wnE4cZT%R^HB57o zZCp+2>x_qQ!|LTbfty}5jTgTJ3xuQvDncCADitX2C%mi%D9W)4U(DzBlf>-nDI%=u zXL)6TE)kZA#Oyj7UOxOH95Qx%YCQc_u0FZwXia_C9}PK*$&hCc61w`@23N!>;9*E14qfk8zoG-CDk+YjDkF3KvJ zeH4~tD=hao_wynrTAeQV?jSYncXcb=C&Ppea&X^|Z1o9fePTp#Jo4W(mpNdG3*dc_ z&2s#=UFj8n6!#EdarWsBPp{sIZ9-S%1`XSp=X?=1MeR}Oie6V1*=k41u(mZD1&zK< zhiXL$I=x;VWZm4w{~E@DV+=MCR;(*~+-xu)O{sf8e}jDuIf$KH&fC9(;e@rqYdNmT zqhE`{itzEoX7`0)KfH4vw_{<8kQzfg_tpq17--lTwI#5^tcC9^WR(=>OUj~G()tcF znEU~0sn@Y(Zqto?>W>#y)}tShdHe^7!DB!M4U84YX!%(zjTC|B(-`_rzB9d07g?Ic z35sNWEBTiDj}+=#p`T|~$z~qqdL>$qnp`IiAoW6uyA%&!(G(GI{27&gw{NdVJX0}G ziaq_+GVL1?oTR9whmTvVjc)&8IZ!L0X&$_0M1|8*6+p(KdhrhYVU@{BvdWbba|iz^ zse<$4DW{AxsiO*Jo(EwulBD&9oJ7_8CxLJ5*LNJBe7rlJ@)@O)GVlPa-KuQf#BQy~ z?ji6miuS)6G`w1JpssIXQcX$SkOUh^#y^3J;PM0jDU-jWb9Zv*?c#i<*!IRn7C{{s- ze{-DSZlRILL`)HRxqQ3v=VVABgmuv;tpbxQEzoLz0+q#Ozy1LdvmA$XFq9;Zd$%&Df5KG%Y~(W)FUOcZD+gHky!rOK><;OxU9 zee?vM5n(4UDbm5>gK5GSTgO7+uld@wLczIJS?;ir!m)m~nCR9IP7wXDgzTrV!c(AO zyalAgXJf@#?o|h~xR9@jnc*<$q~ZTSyU;A`^4lCsP5WHpKL}kJf@9xtt10R^10MaO zPv7aDn1RRusI8j0(*#IYk`=K6-J=-KEE7jGt}?4p{ZdCt@k+;%caB)UglZmpGwKP@ zI)&6x%7*#+M(~#2^xFB2F;1``);F)#{<#HzW{H3POL)}_Tv^m1D5KX8-A~zuoynf3{FD$n)xy zz@a*@28B_(5{dxr=c9MFf?)j>+MRylU%#99E!u4(891z9R~hBZX2#I1RKOp`pQ zmRJ;$#bR#(u$-tiuKjy>EUHLpvdRBscwl`-X~bI_E5X%@M|QSXu-;H#B<}HXymggx zR-WhOPlYiFo7@YWmV-qr6U7HhurNzMJJluPV&s>>=ILWY=@yu}K~2obl#x7o;f~RU>dT1`&VEnaEj9^yv(~`9wr{HbSmIw2Cm&;oRS!c zVv^!tBk@0vF?`U!?e${*oh?=>i0Ki9Br~JAGDPvCr0lv0dewe2?@Ph_vbqAjy2VlV zBirYJE|IS8di+b5*jMqd_LoQs4-5csM3r0p7_&KqDo6Pg9S6@bP6;^^Pq8 zdjYLTADey{_#W20_}TsxHw65ovPfAp2@9{AdcleC6ct}QcEa@~vl|#!MlFL%{v~OU zGv!?P>9I(TuItuKH~4h}1Fa(;Gjg(%L7ttH_GPF=SFpO+=fQ3Z3+|tP2GC>G|(U0uB-D+ z4yyoWt24t-++2J!Sf}9?{(x0YNAddcPy6fRdbnhr8UVfItr2b!3Eo7K9bk`Cr~~A( z-vlwZ+GPY?C;sOfjC?M*K|gNV2fXjhveI4V-=BM0SElzXU$1zW-Rb$~!=TLXt9FJm z{9`|UOy~~CeW;A1-n$z*ZPh4r!_iUOx(4*?(>ckgvn`536 z@+fG(qL8U}r*pU>*_-H(ioXeXa0qPYEeZ=xKOg-OxbTL} zzgPcl;zB2kdIdcq_TF7x_MqmZDora+UWd(T8e}JOxwD?9e+qO^ycCpgfc+AlfD6iH zbrO2l46@TYZiUPiDOK_x!(LK>gt}2i;SGW{BhZ_zgxWv_D@NRwI{6^mrWAag66Bs5 zMDa>m%hFn;bGiH?m3TA}anVcOtWB(s^D%fZ3|63U?Oqdw5GnEU5W-}X)2f|b`8Tgs z2n!2Xejh6~lC?`_)Yl3UPb>F4I;REzM)#(1myh}`vz zQa1Ku$eH$f1~oG7|%tl9pjnvIm`M|tSztguw~ zyrUZ%y7QL*)F*QDUHuiAcje>nM4btT^NoWhfaW>E82R5mreF|9=t&kW?pIIX_x4T# zJcVgMZna`%Y0nY*{_TLI@d_Y#Y5=r7+E0ElFGquY+pu@bL-`%+W9u+kmNo2oZ7e-- ztvmbghe zWrDWwcWlN9iFLLiC+o>5oRV2@n&obkRBLP|d;Dy_Vj&G!)pO+s-x$R2zW5O^fsfT4 zDN}n1P1BfhR>YNe>+JS?Yxl+fL14mqgVM;Xn3-!a*X;I$by*-y*W*-iO-B&aIj~XL zwZB1r93HB+r}S^jQtCSF+OHw=&%5P_bK7GsQZR^eVdAs?xn?qNYJr@*+CU%pj5?Tj zLlEr6iY#h4NK;Lr*wgb>Eu%%H-TYe#e1YEKp9_{*d1S-u2fRNmyUBh?^kdj zLV*TlhDwl{CV4=uh{-MP`v0hWqG*)Ja5xoZ!5-<5ENDLT&VM3xe!!m#c-_KbTABT? z|A`PE4OHYTYf@y!ukXElV9@}udY`=HLzk<5%@7)Aq?m82o-ChQ{fUyy1^gDZ-h>2& z9Ax9668quS(nGTyOhZU8GerIRg(~@PBK3-&SQt23EW0Lvj)b%sm+8S#l0buqjj}#a zB+3a0&&rrYgIz*bfA?npDi^ux$Pmm>_0*$0ZLIpF7uHsz83V-L!6a$5--3~sULdCB#6ON zjk=W0=$AMCdyW;ux(4)1HiOZH5r{G`vaozjK!|ox?@R`(jD9jtXMx(bgSA6v?H&T zs36fWv_rgnK-s$IcgbgnhUl!c?A9{~!`Yh`v|Fw>b&C}YBnqcA$Oir~`vdXT5whT@ zQaY54@Ly$!9Br_14`_4mHv1p%+JDge0mI#nk4)ue?Lk*TXc$52^D>-yY5+&}WQiK9 z!-K!Jl%`!q$Ncc|71;NS0>Ev79cq#Rk<)3=MSKO|F{k=qR(^#?T*t}y4OXVU8uA~7 z%x~BDK+J2tk++#-)3{w{piLU!=|i^GU7w+uxM@h|>%+YzMtw~NIo=KAL+F!|-5`xu z8i{D6Hqbz1-ywO)|8bT7>qp|(C_gELUcS9VeY4R|$m1-=d8bGC*>J8wxk%*0bugA* z9@~Ga27|}LTCD;6Aq zCEIARh%2tc8Rj{L0Bj{qQIx+HlI|)jE_VHm_xxY}lqEUQpOSsMbOyIAJKMKvnj0Sb zFUdAaBM&Fl6oq2?3YC55A7fOd4Oee3T3~b$SygVO>^y=@*DoZijFP4g^lBhjo-tXok zzvHX>eCsdAH!SHD>M@T`e6g5%f9$M3`6Nx{=qdi<@!}1d<<09fyvE<(HGT8x=Enta;PP@Y75DpuHB-X@7rZB<)Y_O zOzC~SYF3Qi{_O=oLZb;9h=Fpul|n_r8#m>MiLUyVD$q^Sd%>b;BsF#a1_j1n!_5EX z$-`Ej_GoS7c#a%$h=|ua!0}D1-a8Z3O4ZTJ44i^%=e#ab<539G$X*3s2BWzbL4o@~ zF$8|pM~#qs(sC$hbmQl=qJf1~h5ZD(F=069;2NIZ;a%FCM5pVdA0BP^1t}KN-26;4 zlni2!y)(zI7~sV^pib$*mnHQAqJ;GKb2qSM4JMW>Z}MIEZwv4LICH;|Bc_KJfQ8AM zT>$NY0{(*c`&~?e^%8N`>)Xe`_YF8&El_SKuSISHB`%yE%>Bq68#l%k4+B zCi5Jv^nA-h|Jmyw+@$feH!m}(Nao*rJ~M)i9UC=%k}m`bwPN(yL@?@E5wN0&Htr{{Ex$THn0|2hx~vX6*qW2|$6Jcanzmek$Yd_XOo zD!)a4QUD|mOYS9=u1j4Co2}jmf(J^RD&@ALe)o`RdtZ1SNUGWUM+Q=$VPP;CFkEqF zwPd5f|9@WA0Aep-j$K_MZ-$0dTPh0nv7<>~KoZOLb0FRB{lt3b=ZaNVL1U0akSPD` zRVS9wK+8MxkYSZfvb{8$C?oC_DE&odl<;vvnUKw_Z`LL&WQE_3R#JUT{0Z-UtxThg z$W zXHZQE%KB*Yg335XD#ck;E6>mmC@kgWtNCr0ePw!-I<4=)!4_=4y);QFNEGS3)?2kL zh>Cqc<9Uv`)jhLd-S1F0rvwySv|?NWS(v{F90i9_Q@^zwI$h4xWqAw9UtPkA&+t~o zmm-Klq|GSx4t_;N2B0O~M_4WSMs=82qjj2cIE%DS^PyM#zs~t9p`I;YyUrs5JKaDE z6Xoo&Ivn;K48zt11*ozVQWVGpMGWjbDw7=x?@W^SO&;7JTsaSdeM$xtnOmljJXi+Q zq)ZPIBqdR9o?NZ|hOGGy9`|IsZcd9$7=fH5al-b~C@}Q1y&QwY(NnhMR8w7XBm!Rj z;5DZzINcvB{t1nmOxK9wKkZEk*6LJ^-ptLeBg>Jx?f;*E+HjO>G%+Gp zvDrU}Q^V+gC_a4ZB_BrXXCcT%WVI0>ZURoG_RO%0F52FD2SLNGm637+veYJs@q-$f zoJ}*XX-lorM1Vt>u^kp*jp_RR%UwIUsmG-k>X87|z4VZVLxxSkZ;rw%Fusx~kz`7s z5fKfS+9YNZgjj~XzIB7k_x(SeBylWKOu4&V<;WxDkCZ2oIq1(|{@L;US2-$GMA^QX zaud$$JD3g%-t%~O3XQ(MON;*byg(-G0C_7W65Qj5sj-v1L=#T*VuamBRl1#h89KY_ zZ^y}$Bq%9MAXUaC+X!>=aH4nmEuis9oGO1BK1`Ce1~inl6sU;C3sE#)nuH+GRi9PM zhKiiWf3xfFMG#%67`A@Tl~^}7kFFV^z0{V3LcG_XCjLri{y$Z=SkbjogO!0!N`}a% zWEu4Km0BoMZK*&O4Iu?9O+m5_lp5_RcgG|4S6?Q*1q!8z% z8IO64ZEz)Y^ZEq=qkP&bL6x!|W#5{2Kk&90j*<8_Eeg9SY$yji8gMBvte2!dt^IS? zr^|E&qc0?Q&CPDzzJKK}zRZ6d!PH(mboz?2<#+k6rdh3b3|`2Up|?Q4W^chq{~nym z61zO$73Xn3IY=AfGHKUbYo)+1wph6%-G9|o0$Gd*X;6s{Bl(xu6Ua;agu$z7Frp4? zis&7*9W*1QQ#j@URiNDbfB-lwN7>&r5BP$EC#Yc7KZ^2X1gr9@t5?OZW6=}el+`SQH{yGOC@6k%aDdH!RUsdr~mPN6kGt)pl4bRDg{Snq*{))I?nA#FdlhQk1h2i zR@C2#MAjVu4Um3$ir+u7fBDQuGl%Dbj0hZ3fZ7=8X6frstSsjA>qp)`gZMpPvlPD> zc|`H5j|Undl0GCw)edPkT#AULsb}l|DjHt>*rLx1-Hz@3FfMC;^CUwIL4vHDxIpS8 zTF5_-&cC10Mn-6WBN_?k^8|vQ2VMB|K>3 z96H6eOY#GtDj`=9B1PV4FHIsa;;PyG3NjT#?Q0LN#5f4tj=_qjj%y;T%6w%nz@mM7 zBMi1pqa6=CjS}_gKVw5U(ulAGoIz_KpZ=$53)Mw5uGr=7Nw6-Af&0B~Gls=7>=HO>H=o-fZdtf^t*tmV4-ukwL|J}mi;q8qZ zWdz+R(UU0&BMimHyr{k>0*;$;yu@EbHa&rC`OlYMQbd{Kj!(MZc33=*cVo>(VR8d> zuKDBt^OA?c*N$vxnoYYe@jcay`np3mx(c~a;iV#w(a<-eAb^Tq^vWcxs@;$IyZR70Uucw%LP(_p<6b3tP>*m)xN1=^aG{b3 z=@&Z1R2qUvP(smF*cAByN`|zOjte9quvhVkq#wUry(A@7pHs(MIWDIZMk+{+BvD1b zlK}$?8Y1eRvQ6e%}9PU?9Oyn|goLMg00WT^|4c16 zg1;7BA(zSw42D!K#wO!oN%IvMqUki7zWV(2p$9hjlsy{fQ=Q=OG-z@&tFKH5{-3UwY#pOWy%-6oyD=7r1zUt$^8nV20J_YJo zr7t9TzY&h#1!V|JG~kBeHN42ch5LMDqzCn(g#G!Os9nclZ^aPD9qWZOy)W;K8UA*_ zf=i%s1Eq(xI%MluU^qd|SH1=MhRi`n+sXb<_=m%w7w(6>speF{;eZ5zP+H57cy^2& zkZnZAKzyfKGGT9i>n6!cH>}uq#l?faUSd{nw_2d)04L8x;R`l)QC!9+AA)w3Sbjik z3Y8l>2u^7im-Yc&+{}E%IRYwfOxBH@T978Gou6);l4c}4o2)E5dtF*hFk}mp#^_sQ zu>FWClx3l*xgu_FzJqhHU3JEx@xml<*MNN(jrX8RPPx;z3D7lz`k`K5UjGg(e9bTu zHVt6mVBZ~j@7#9f*sLqIsvq{|5B)DXq{BkX^f~#e5H=k@YA|P#aSY7|env1J-UBIQ zN{Yf^kF!i{5)we#g*d!hQE9stcL5Me2Z2mFfY~^+H&Y@IkbUr`&ExFl7w3~LVI~Th zZXqP^2gr3Fo^5~=V#;VqjfB|v&kb}_kSmu9Q__;LX`2Y`i6Q zAMGA+{euUX-Ux=gEXu*Fjy7amCy2_$a@e&gJfan6#Ou{B`j8|^qKLI2x$;q)-Liv* zI(|t10f3I}oWXzDvOtM|29_imc=UbYxWltTy6>pPi8oRXP8T-#vLfEh^L~m?+Zw|l zVX1q^mq)fKACs@p|a9NVt>q!O&xl8z1+mQb589nZw0a%w2Q z$_gE?awCyD9I}@WSMbR>L=7krw9z-^Nip0gT>*!%)yw-v^%kvOHWIy7yLNrTrT!~r z_}v$Z=$|u9I+!p2d`0Q>Vhy^P@aNf`0l6n2quxkHR9MPk;5NP z)Id7w9%8!lS+f+IKrNtonwhJyUMV0X6fzYPrHoE2!g@By_e8?5`N)b=*fFnup6U${UceAx;sut#9e`!Af4 ziw%{9+Pa#Kiln%_mEpVc9wRToPqA_-q;vpz#L_MWx@l|IkzhyFVS^7Kb2e?!53#W ztuOLeN+uhC0Ehmn{YiOyCI0qsQ8eOOew?37iZRlhN}j%Aj3i=y&U%J%i$^P8+wtFP z#J#YpK76$s+H<#i2CsrDgMFcE-;oOq!T9+j%cBGxHOM`D1o;_Kbycgdk7fzcZrGj9 zs=f6n-*{<&9M**8Ztel>`BT#{r-|8gi@NmS7Fae7Kr zM{&Xs6zjwFVuymp8|{>T2pyrG0to8i7Tg4TtT$VqH<*Qq+o;>U$mo30#IE2a-5j00 zk+~>Mj&HsBv0JZCu=}VW{P<7NB@PE7PfZ%IPM&ez&vXvxencSHEufy-*1d38bAGH{ zwcT0q3ALUZ7Js<+w#U`nx9?rJFtIxw6q7%xN=WtOJd0Xec zwfZChOY}?xrrM2Ltw<@t_LIvO++zY4NCU!%nXU^tKXkw(;8LK27L@n-us)w+jsq{w z-)lGs^%lMFJ2iiBink>UVi;no_{3iV2;&C??1wtUL)5Op><z9odo>>O_i8; z43{8G<^6KT2>@R?$fl|rG&~#IU1Cr?s$*`?>!Tk(ciB6+-cONQpp<*!g^qbiH$Dl{ zbW~mV#78EpHipX>s8+=>7ZS>9M-EM`{7f5=HQ;OkV+IP(T{B)k^`);Gv zwQ=0s5xp04?ta7Up+aZRZP(?Q1x$5*!nB_tL0z=;DKzp2ZE?TZM&hm$u6 zU$(Jk{r0S3&Q41&cc_s@BFO4yNexV!qKZ1HopwhUA-B3jrt}taYN}(C&pbvl1V_(6 z=UGCz$ff~C7#eC{RXSeSI94F(Jr+G)8W=11l=qNIFw5;$=A2&Mx~d;wUH_b&pxTbs z=?kz!+KOhaG1z5gz~ne;sG$KF{&Y55C$6H!PkmvtYX407W$D>b`7)e3>LEgd(iN@| zdnXniM^Dr3vz!j+)mR7&c5P29Hr5T9wp*MpPnFwc6zAzw2&|oco4Y$W5#;O4;lvlN{)i`ssY0P1o6V5(fW|(mnMLIu z7l*`#bl5wiQ&9x<&+ubBwjs{xf6WnuQ;5w9d4wcPs4{&?xTKMB7i06bxSZ~@j%Pe9 zGvo&2R=!5fQ)BaWWvqNj0Y%pv&8d2UpHa1O%3oSeNqsE%-xiJ59-A8LthK)c z9NzoJtr2PIO!8pR8QlDX7=D%N2d~BFqPm8tc)t`DEYh|03y|~;D zqBaeGlbr>AY8Csl=hMP4l`j(3CeS-cr8X@V8II!-T==kv!Q@QFpIBH39wT-uSxgee z;InOolXHdJByFZaq-6Y#Nl6%BYON~L8$%mk+={<^5}qL89)|Jrf(YrRzPG=wsrLa! z4onAH1lm;Tv{JA62_B2&>+T%Qw$wpmyfRd3Go@)M$sj4zh^MYX%ew)h{&dg*WOb>* zg4KfTf=6;qCuZRNJGBB$Iu1J4VS)GRjAk2Uk1)FK3%N`tcFlvW$Ntn~g4@dc4ofGX ztz@hu6kor|%*LwSAyIgfR}Lcvoqg(bW)%Hn5~QNO|G7(QQL{HHdfG6sf7j)5JGGTH zYnZj7!m*(JMLhoVFB7G=XR+~PBOB!jSFOjg%?d)@Kasy>A9XW!$pd$`NiYT34WxN7 zmwrC1haUSUh}IL)>w`j{vw6&xHG3mZN>b)P$lE@*{*TcovhY%$Vo~pC0lLm=Q+I6_ z)~!XRmsjQGy(6*aCOeT94-=H5tKge>^Ah8lV5ZPb!v`uKSfZ--=I~<~0Gu$F=g*&5 zAs1W)S1K9v_|2j{@00@5Q-3}oSZ4FEbJP=GcNC0Dq=~UQ{B`-(ojW5}yVk#gmDt*V zdy>_pn?vqZj%l8W_DZLhEHui8GSPSy!U%)U0#jKlkY}LCuD`c?ckcNKxH{y~GP^E~ zCu2|tk+Ju*gD%G;D23v7T8xm|2A|;T)`{sm$Y; zZ|z?mtZcglLwQL$sAh$4MtJiv$btkdB9nAd)XZo5P9Hcy6l$W2vq*-C9@h~!J~3-? zP!eAT8+zI%ryt}$!#OnOV@yQ>TEspoa@nU`JC$ygezI~YUt*eee;gEONdRB?TuMFI z?y9+@8~J1lf20_so5d3v{g`iMsN8n)yaR5serKXznXEDwMU5#O`P!$09BYrVHfW7< zSG(gAtEH0!i)+sAs@4Dz@9nP0xrgpT?XXZb!_io>JRj@x7lRl;t+E6R(W6*Wd?3dE zA^#AGZj^QPl>4zxmw*$`!3G6ZQ}2r!@ys7CR&6c|Mc&iI$6F%{(bNx}7vue_?0ps> zK_Ejf(iBo-$*SH;*LP;nR0F>y;4W%F2#4#VWlT0lQg4AaKiq}K8NBo(#?-gKBdShU=+&pk4_gQkil6T`Ij0>qh^qXphupCSJEu`aq1o{#Q4k?6f>DerTjyJnnjS;e-+VaPoOcmiOSDPP3{mo4$hW zwEDQ(_3OlY>$SS&>qJxoIeJq^oV$L-ru}I-S(^2HnhCiZt1pdy1Uu3aS!vPd5q``D zZie*$i$ao&_&1&t6jAX=E|Qwnrolo>nu}qV7s!3V-pz~zxi(l6V#z{}?kVP*@ z$l%kiSaHVaf zk5T^ldxp3xgy{hXi(%4~#f@eKSr`?}S!JHeJ24j!jFJ9C%J&G%wB77jCnmwDEHpvK z*UY=*S`yNAlb_P8MaN+xnZUrk>COe_`Ia}^zIqkM>z%r|Vvyhd4EMG^_jA2++dv*F z4$ZNUJAUvB?thZ~$V$3bY~_(^q6>Bseop@2NupK%Vd;ZErE))JfHy?E5D#n%R8gws ztUn5Ui{U{l4AIBxANUu@+DJxBWQQb`U zbq0=038|E2p96+a1x{BeS+lqW&;6BNyz(MPG7NG8f@RM zrk#9IzapVsV85o-cB}J0;e;dZ5deE8DLve7FhVvQoXitB=%mQV$4_>teO<2e4{Ym8he(=x@AQ2 ztip?b+JGv7NsvX%^_)3xPe%^&D6{p+Ky* z@Dt8Ro`_}BK1jW(a3qdfyGes>5U8p>drZ08P_*DfASlA|?p^CM&MV@kG&(Okc(g{` z7e3$b%;`VoTBceExl4i}^9y~*VocK7_ZX3p*MzR}Ok{R$E4E&aTlNw)HnwG=6biEq z(jP8bf}Hr(VG!w~;=koO>%@ep#KpuZ{MUjc@d#*$b+vOzFG>ymp%qfY+eJ<13{@dh zs&K=cU2M~JD&9x>Hc{sLr9RU|+D&U;UNETs|M+?fs4BZHYM4?==}_tJ5R~SCgfxiK z9a7Q_(w)*NU6Rt>-Ki+u-OZu-H*ekd`~G{sG0tEd@*JLL@4eQVYtFgoz-Z5}v-=;B z$sptA?a{KJKYm&^ey3CP6xAb=)qS7PwiuZ6uf3_Or6N46OjP6LdXNO1J8{fsHG!Ju zX6KO!qJ!w`v;C)DosvY7z?EWM-kf*58zU2iET6RgjW=Q@XwE$`XnFFv_6yY5j9<|6KHvpBE5-V{YE=)b{a|j!{eEaFmuFh?UEl9fA&ufGe<+5U%BwKv z+*4_csW*9kkZ?loANBVG+dmZx<0jNP@2Z=LF}xS=m%0fo$9u?ceR}cXA3qr%5MYOnjl;2%UHNZn}bb3?^Rm9E&Kub@3CT3S2E^Bo(8GHBe_&$C~wlExY) zvhe#-sG}S()6wE`kC)5An;myJwmy0bJzj>-gSh(j&Dt(JCBipxFp(_ zm}$+w^jezlJ@<_4&TTL^l5+;p>Q6Q;7FistaM!D?9)~%A78Zcq>-`ctyjhw@a|>R? z751xazm$rSL4eX_lfZI`wmJm?#w*Zy!)EgDV|c>d0MF->Yj4yKMr!rrE6;O*&u{fb zuXCeV`2Kl(K5bS?PoyPSwJ1lJ=fae}z9eeokRQBvx9|sVfigc!8_U52c!D@!7M&i- zU@R!)zZX5ws_M@gKWD=3b3r0qZ4>63@}1TqMLX6<7a$gOr8Hme_zq|cS4?~|eTYQW z82DuT=aX5IonoH@&JfSinGsu*wT?=}hl=dxmkd(*Ga8-RaaD^Lyr*=L3D2cR+* za&QUqDHWVbTx>(xDsJHUROWl4^64^DG(=?#g|D575#snQ2%BcR29yyszHcXZ(6>qr z1I?CjNF=-fU2BsOL3Q{@mYeuH6M};{m_k$DCH8}(yM@e zgjxDYDf*e8fWvH4+12-)EFt*UZLrHzC?S|M<@P~CVDJ%ebS#2|33xT?<@lw{J$vX7 zZb`z7=vDO)jn zDI9(f{J3_dqE+A40qoqRU^y5A;Ko!M>#In2hqWtJ_{Erp&?Q-*mR{-9!}8@#_ zTf72tMip8*?kNg|c9kSXnA7jd?Iy?m7rXcT%nT6v?f$SFye1 z@-ux@eZKiYV@1k&Hyc0>_xK4yAV+*ia#G?*E$iVg@yI%c0sUMJljxlGsF{E4cpW!{ za^4vjm`xt=_1D|u-*J{k5G|ny%N*V*w75&YOdSW1iIJIC^lk@UCIjPgj|L7Orfws? zEeyH1b=*@bk1pK1jsEwA47xqZwy%bdOEJlsZ*l-~H`Nf&c*I2k69Sl_HPGvUMM&+{ zwwhJ|si)1`g$SR+L#nOaDfXzUCMG`@{z9cQF7i@>)4tAacd)j7+zg$xj^jmQg7g!_ z&Qchp8F)Q5{w$WUTA}GJ2ko1wRE@vEtl4k^(;Rj$(84bOBl3t&88IjWC%=Jk20PI4 zivd98OE{m7EqLulp2#i%C5-+D{<-xbd?m7MHP)wy6Gf_~@v=kT3p8oP--?jDXH-c$ zT*1&|-GJBsH1T%&sXak4|1e37m%9@l-Fq$tcC2#3My0-fRO?@#-iuM~CYC@8RA!KB zs@Y(@Nv5!bP#kKRLW4O_FI}I$8pYl_DQgOS1LGq=?$BxUrG@0~xetQN-(1Kb3BlA@ zgQSF}k0pO1#NwpZ$U1C=GD$PPBFGNtknBi>w#PbF>bkT`pa)Rj%l0zRB;Sf}v6&1w zFHK;XRQb8}lNeL*6Y;e0^MHY5?opfs=Xp4|m#B{SH49-A8L=Rn!TtsOe2HEZIUXR6 zD{H$Y>b3u%3%vwz$9sOjh>8;e^nBo>CikqGv#KT~&HZZux^Sf@hMbAa(AT;2rb-<% z8(?8&=ZoTG6~&D>o7Rl1Bo%#G*|8xPte} z@^M-&Qh31qOQRTkx_CT?_W|kvOgW|T9C?o2qXozBmLm`eW7OKu;X!f^8*JjE6>Jc3VI({p_oXYuEH;&NBuYZ4(^$cpAkWzBw*VW z00tTXhQxg1<*t4pWRb8X79Imf1yWsgNEP$)mG7jGcMslk$KSk!9>D8;&8ep-S`aX2 zKY<)!?z1VwgYpeHJKv@~H1Xm}&GOI&))=+xPjk*^B%+&ZPKF0T_e~Mpp(4MJ^WqU68kaE*jC}jm?8fUC_ynWXe$y&9iUWAJn+J?WJCJ_DJ`gNj z1DLs5d$K=DMmOv5(2+Q|Zz##L5arTyK(lFAH0-{opg<&0J?`4;@nS5X-2 zwY7}Ng>cP^qMXD{Vv1a<(w-g~_VY?_~GvqQQX#)uhN4{G&7iBN|7vkCGNH&$VUg*v?tx-V3TB$I=y+up}~OM z^1J@b9FimK5i)8H<_V7@jCFD@gigegbsoupPEd^_7)+1fKgCICg`&3Wo&WLhCTR5u z%O)e5i!1i_c%iZ!lxSrF7}y*!Vf};(++AcrNOli#W4or+--7(G(%2a2hqi%>rUK~H zM!R>TBdmrCFl)#SmPvSXGC6e$t%jejC#6oXPeTh2kt^+ohuRtLxC$z4B_Rd+O(fCC$|c-1ZM{?9&@o5Dd55Di3t=NpxsD&_h7Y*><5xjGVy$ z9yFf_nCUmBTJj8VE#f(n;o`jV!Pi5gSb~*te+HDulW4It_D3yuhaKU@?!c*|t%*8} zSAcP;dV4ph6^0Pz>Au476R1nf!wK?XASA z{eqfd?#g$+N!$}KiA{lnK<&_Dw;DPA*y+L#LhZd_$hE+q^qDNA>SqjeHG0LIQ`dZj zOuw7&YwHBo5-y=Xqdd#C10>C~nSBzi4dL#iaHCOlWb{aEw>yZYjYwhTM>=+(=@Hg-PpX+UTWCGQ#*EPo&NeK|4l%t=G294*Xo!{VkMj?FH0o1^@w%(uiOJa?Wyxk^GYeJ8m{YQX;NH zocnhl-ktvt9J+68xH)EU#q_1pXT>c9mG} zVJ#PTMne3g`QH6=?O{5X>jjeI4+(e;z=;u#94YG|CfFs3u&)!P0*-JY8=et`+AY{~ zVE(|m<^p-M6EIGL!!N!i+I#a3_bkTdxDVcSjPG5F{qHF>IR&TY1YqUncm}M%OD;~_ zu1+QL+NqOp8Z~UJb|=d$u1;SQvvb9ny6y5bawR*?U*74)UmY%bjETnA<{c;RC{Tq! z?AUxrExMu4SFROPy8(}<1_SO#BZ+)&KlP6#zahpKrZZtCOmJOPI$G-(c^pBtTFe&Q zk}PoKq<=gxEa7fSjC9irDci}e0%!x?3>~NXVpuL0q#y-)K0IQGy>3J*C2J+SYQ} z+j7KwK_*xxQM8_K3{H#(>xn@%yEa?FgZZ8Sw;}0GKn)mxKcM4uLZ^2UmE4G=Q!6>1 zY(8kdo;#np=Y1ApyaMQIio}ZI&O_g1k{;{hcHGu!d))pyI}m7v9@)Z-?1QUtzVWQ3 z77#v&=0CA^BQV#kzK1T{r$WQUGY-=qw__wFxQ&V8U%PU=U3Rp&=m5Es(_YntE3)q+ z>9v%gQZvIq7ikS)0x(Trm$4;>?vpw8)RNtjAHJVk>#00@@gXqw%3<^_H9f_&y#<7x zi!%CVc1d&_82-Rg+`v4vO4S!jLx|M*wx8V9YWa(eiq>FM6LO=0~23FP_P8)B@h*Z$?fx^ut^6eL8EJ<-eGV3*({K2 z8D-#M)0_iWGum^3VUXz7$!8JUh!NRWdZ= zc)@<+sm!6)I8Y7?X4~g`aJ$}~O%O?y?^TRI-V82us-hB@EATo=%nUb7_>rNmd0eh- zKwOH?+RPcq^8$!ptUdY|*qiBZJRl-JwxXyz)98Do*CY5QIn*P)F;Hi1FNKbtOUTTK z{rg3W;?$j^s7J|#Mz2UZCBiqkG-3!+uFZ*hRC%m2f{5TB4^k}zCkGMMPEtg;Oby0JpYZ^+e@{~I1=b?&MepSh|7bE4=ZFkY-7Bwf$%e?cw z7P{%iVnVlMOLILo$o`4(hT z&`#m%=9{k7j(yKcb!(`dWF@&&LsNd#r%_!t?pKV=L)sCCHW%(G7rtf)mpnz#bh~k= z7jT7^0QX83YCyAgCBc-$-?lttYqBKoBAIN4PN08KJbm<3$&bHHYD};B3qs zH`=QT;hg-!AVR$BMEY7zq%t-_ohD^`;S1rVr}B~5Ov`UIQ^;K+#Icd@%kvYfXR?F+ ziy25GVk2^MOU>P(;TYi#<^cLz{l9;0j*qVON$ zBGt&Aw0~2WS6nn=C!`&`P;IOGz2S{I3{693==tqrS`Ul~Z#tNJGBp@w4765KP*-e; zI78;I71%ZU%bS6~GNO_(`Y&2m5|)Z)}jD1kxdY*#TM#f%Q!aoy2v_KdU#L z6&69f_G*Kh8~;FbRoBzYp7|1WLR{>x#Vv@yh8cK{pDS5&e@E0FVVpl~8|rn$tQm%M zwW>}{nQ?$`$q01+MSHt^g^$tKQnoGxiX4WC;v|h~x0NbXrXpjG> z8v7yAGn_e-JhJBgBFnCYz0O@L9~~Nd)CFQl>CPAASwqtjO;QnY3&agXG`=a1a9;cE zkA1fBfX(OslE3+8u;Qz>MI zYHSPB@;53Rxpah>nb?0i;bsh)vQz^=GQZJX;yWYt3ZmPgPzxg$%?nH=^pzau%P!g( z8%c&aAS#;!uBodtjU8ybF~1GU>7ihbgf&p}9;ay=3bsCVclFOizg5M>I}!Pz=he1OUIfyaorHLRXjN{$xOeOt*^ zXJ;)?ax;9W-q-nM`R+ICzCR*kvFdXgWqfM}do=_bYQc{&Q7X-8P-6EB-2+Mkpjt8~ z9uGl_Z=u-PFNoM6i+QHG00mq<&X)qWi<+jXEj42;NW#|3#{8SNR}d+;w5ge^fO~ zr1q(KIkMjVz}}Rro^zPFjBuM;rTg-VPnlY*h_=t3HryDkPNjJ#N{XmAdZ$*Ycw&Hq z1UqAJhe#X9oCkLv)rHg^Vu09MYP>>EIUE6PiDK&A~une0N zHiSeY@sGqFi>p6@0SmMW6=QtR4+K=QBsIZ30 ziJlS9m97}qgyfz7I>*!XuorK=A;fq*T?rWj-pZ8NWK+&OqY`pPTvCJ!GW6$j@AgFh z%xBVtW)Q&ELK5~b`|-K`}w=x9PclszuuZ;2n;#J$)}IHlSSyXVay#;AwK=Me;-S| zse-_uWv*@`mB{Ih+OGSZb7Y4wx7LrHiG}f4%A0rRuiy1cBY^9&0;Ya(D1!mj6F{}6 z12>JA7`2o9S2-0Zn2O9A$zXxk@S^LNqQb02@-~PXq;Qv{I!lqXg`hUNq-85HP`Txp z)bVMIOOn#Xvl-G$Qx~s3J|B#cQV;IeH#gALXwm)K3xKruv0re1)(N=|0%*|Tpqzp! z3mAh+MHac0cz?fh3|KiqZwfbzf0BrDDo;=6Xc>+pscPq#VlyPO>M27n`~v-fb-nuF zf8Hq^Z1=(PCalSxuUfZ`7<|ghTI2$6uqR^4z*T;*YGCxE#zP5Blvy(w9OaOc_bpHd z+A)=sep*4bI-4BJv_=xY8dU;StVLaX=*+YEc8&#C+m`PF|E!h&$CFD6j2>hyu;rFu zC8+;6?%#1BxZj>Bdt@BrU1WbUfA!>9X4>&9?A3ROe5B7g&l$2D@lWqfVONv zsOfkfrbUl|eqR(-Grhr@A0jbc6my~%a>U@w80eI`Va>?NYDYqybzbVK5enerCYl=* z^Llp!lfMh<I@yqIYD zjfUgkfy)q%6(VRr(+VXYHiXNr4VE5^mNaoOQmeJf5a!c;TU%xSTeau4@n|a=H>!kT z#vV}k06mH)8@+C$>ui_AG~oMpwkKmcAt z3WG%TvX&9J16MB?%-nI32`-b=?iV}W0^B*L+<=K=ge zNbL(P_dyUUOq0q~)qC0L71XqxfFEMSOAh+`M$jGDQ7Tfwv}sdUh|x6p#nh<7ZI-Y> z$NYWa%%&C=cQ?va!2N2AM%%R0+ZyMU5^Hur@!y;Ef4{eEDxDR_YT2YxLfKAPPaHAv zH7jlURjM_*ETMT0#rhbe&fDu!U@Ng;<8BLpFeOPG8U03~>&FCLADmoZ$kER4k{Qn$3 z|6{3n(aW}yS9M|vyUy8mM#gQ&M7DyS!^)g%*Vr%R?%BO8X=BLZ7MvXC(?U6h7)e*yYkTO-F1PLAe-f* zLQ>2;QiQ|64rn?fW6C1!+>vq0!&%{ooERf>Wjz05{%xmmrazcA6t8w$Zq9i|W)22C z+o}f!}$m{%3pMtd3FeguD%y} zm3~NpLMpYg3Z!~HFa-R>k7S62%%(1X;9Q85s3)6?JXI2CM4NK3?(d~GuU`8KgKQ~% z!_LWKNiE*Lu7*qZrAiJidw2h<+d{N}oC9COdwQh;fNM37c-)LBzmQW^H!BnE`sDeE z;jbk9-&ghjdX5_dgZA=SydEf*Q(%JH=D56rXTF5kx;?WK^{xDTmey8YKi&y%ZJ1uK z$OPxQJ^=`h@6j8&1+egn@o{-4tG{QE%*i$rI5EHZ*lx*`Nmso>8CQB}b>5O*iPN}K zR1tQ)5-t#RM7i4m=ojusJ%BZ`K6s6Zh_M-?G>1hm@6TJ=1L3W#DX(H#pv_w7+H?dr z(p9^qu|J8=*~V!L1XSOd>Hm5({$F3Db%W#RR=-lFpU2gs5iEz@Sbi;>zap*!#!el1 zhXT`xpQwa)SEfU)4um^}JVAoiNTjUbAVopoLsFHTk;ZBN>bD>{vp&65y_XzBp^^lH z4EuCJZgBWIr8mv4heG1Gxejd6`=mF4>?hsP&=7=27L7;U7Qi7uG}uhK$nTla){h+B z6rB%W<XN;47|!X(f2oK_m7CrrPp*Ec?#a?xkTC>fD4Y4JI4APNG^PAjLhjQNd_0 z1LcmEt7_y-R(;6-K1BXH>;y&0F^mx5as)nUMefIJtI;Do>tsgtdYiAHvnZ4*rr%pagoZLF!@ ze2w9RsTOP-SQ&~tpE$X}IW#GHqIhcFzK}@!W#of_nZCq9q?=f#Y4zn`X&AFch+A_= z5ko!TGqp2m)Q)ocMEHWPUE!w8``f>g=KmHt{!YDxFvW>Ofd!zlF$jS7g?GUtw5+3i^d?X(I2>Z3s4?lSAbXM= zjk6i*Prpof8D5XC?b-)~i@ZyuDT={KEd$KF4L}LrkQEN;e{cnmy*%Swa9wejvxj|M4Wf5}EaFY<@{*Wl37GD{{n-$i8DP_#a@TU}3}Mx_Z0UmVzoK ztn2Amk9*zKHd!$sAnt=%lh$8e;5zYs<#U!y*aL`M3=Ca%##0b{kVtKS9x3Nu%zF|k zGBPM^^GOM4mf?p@a-aB%h;bRVBlqhPc%jcAQAm5@AVwmjoIfM>$LNU3ZR-(Hb9(G8 za1D%E2k46uD6u~z%ou%Zyfi8>QcVpB_Mfai2nhQ?+b5<7>$~4CnhMk~=@P zS8gU&Jkc)oqFuD;^Vzn=$q?sA73~`KKS9q6MT(SQq=>^LyPe}b?tjfQ@>mg`jf8~h zcI7N%k;X2{f}y@f#mXfsbD_@#{Bz8JYa}Srrmqhvfn(ZPkJ0eW7!ds0K|#Bx9!zGQ zMwf*g_desam|fWijwMzAwnsWK6@J)z?=b}ry@O+A%~56iSv?;e@PWQRbQuPl3iy4` zppr{Vw+oOWP%$FWfC3I)I}DhVDd^tknWYpk=h%nVlb^O>*evel^F1AV#P^*UfWyd- zBm$%9vl2H0M}!qbK0KdMOXiq@dc8K2cJ^|zY9d`P|=z%#+c0iJ5_l1D-oH+75W)e`}3BU8yF#%>08Hm|=F!_ylx?{xHt)$zu zC7+*ho^)3(`4e1Op#+94T4rKPDXacQ`WPyZhKS0ktU4WU%DZdZ`}NTgW{5MSodE+i zvpH`O-M?Bzi-BRHKE}QoU>y+GVH02(Zt18x@n+&*E9012Cz`T6KOkthLZa~1e|FD5 z+Xy^~V1VsTUYgdl;1%r?iHnO;69l`-ihDZ#)0H7hH1S9dklUj zZz9%M&s|-WkrKzWX;KW?L>)o$t>>tLE4u2gORpoFs;@$MVT{)PgB}&{3Hletf1Opm zaWEr%hOuY-Ss)2;!nXci#*8=#n8krlXowP2ZOzy1VS8%$mho0_p~N#R`%>|oC>(#Ty0 zWi?INZ*V-D1DK1BpeMWT0W3}H@X-fGIUl|iiX)aZ9@9GlqDF027*GG4)5=+n))`03#NU_lY(TDwDDthD%Fw@Wg0GLKJ^%sV5F4z|JhW+}6jr;9FmIi>} z#a{7GJbDPqq+tk~E^S*Pvy2a0G&sE08jSZ7@VLhyJ_C&6T$jsMcqlL49}5pB07ma| zJLDVNNp<_x5S?~IqLjM>YTWH|-2Gjl`q{=O{0oT9PKo-^uYCERze+TFh-x~t?hJ@w zvF2q|2EdC+%6j5Ep16L5%g(!?<)KwRE?lcYa2MG0ZN1QJy^j3X0%F5loa#<>RuTIm z%X;Owi4>x5q*7VjH3!0@mURVf(_hP|Gp-fbL#^*ruf=`QxWA(@OeTbY9`ycR%>pt4 zgL-|m>~>l_hucFe0`~RswSK4`Hc6KAq%3Q9ch~d*xnP3jJwMBuVvNu*KU82J7=YOW zI*xsZ|D0OhG+#^PI`CXM+F))xgmdhEo{KN3JcfqB4`V%BZXh*~z3p*RHmw~VGKT-m zF^SvuTLbX9d60OgA}E(}k8|Zd`~eaw#=_h(TN644&*ia4 zEOUJbdu~xX-HpaqYMZkoSXiJfU8RmdkKzSrnYdpi+777DCm9zD>w{KI9Hy(lHIg~GPCc1bs&Np^ll8fK0i03}D=2?xMwG^aSFRHndj0sx zvj}Drvv78b&763x9?C(tpSeaJ1VXKkb$Cv^j2D{J2mg&U=TSvEcL zMp}9sBWVXl(&jC<=kDi&AkWxM5XCjRUi3ltRuxF&X)hpl*)5|griZuWKuyj1}a8<3oHaI&pr}@iNtU^QUf<4|2q$p*-!Torpc?xc_lT_ouaj zk?e5RV>88oyJDc0=ypCeLq^;-pwrwbW-#rE;!tK~Exbpiv8utYKs?1u=%{R~n$n;^Tlc z%?m}))BV|%@gGf-t}~LEM(2}umm1I=^qsk!T}->>*(oA;!pGTfR7MZX3DU7JCIL+h zwaVK{?#9-6ey-Rk_1lRwi!1Lb3t7_lS9FI_c7_43nFA|u$uKib z4j0?*c)%LeR)fXLOz}bEp)DG@I9lo03$8o@MZf77Ka|sA7&Flb0RH1brq8U{m5%xU={38{Gl+2;{nmfbC;oi9Q5D{7LOmY0vw} zPBACQG8Dmdx-uW?sW1L^)-^=As}wT$g__G@B}W5#TyOR#GsMIB9u28_g{tr_fBWQ6mjeaO^ZiTNls z!O`5+U($&i-ufd)%Ey?wN$6+{tg>amR>b#J*I+j}1!IyQEwudvHVhtn#m%3^M<*88 zkXR=2mtQNremF_J=-+zY;a@3lItC?m6~Ao_&Jsmb-I*v!gVHY_=>fg4BhX+U7pydD z3qA@4Cp|sf`sHR_3B&>Wn+zic32v5Oq0;>l9Dm^x{H=v|HsFpF~A#H z4C6cQ4Ry9F*Tdktzd3Q^v%hW;&tvZ71w~ic&Rj!{DR9cN>;;*q0TDS|-6zEIqRWP^{s3If)l&=^dFs3v5wfI78$V*s zY%fy`2u_*@O$64iqv;=Rv2aPO3ERdFm!PFv=98r}=IkpkEHC(0a@i7?R7yu%(6f2c zww@iJqT(_3Zl&k~_fYPITxt6s+z%;vAO$S7+mQ=_*aoER#1p57K;>O7`D}1Z>2jLe zxvENgrO5*CV>^R~v^63ahQ*3n@am$6&Z4`$E5~yL{?Dg}TZeJ>KzS8ku#s2$ zZbdizQHVuPj(gwPq95^rn92i-6PmU9YWklQ4NAX+gg_|9V{IpzvW-+}UvXhI>`x#> z%+d5PyeBl;GWZnoccLd~Kwa8_cJJW(N$Aya%YD->8vkiT@>eOYTmU1_45g@#YOB^* z5DBQ7H|$m0gCc=hVI2T+Yg%B!5BQ6kfK7Renj+SF1BiJI4{?{oBYA7YvVQB^z9;;- z<3n?r;N>#JWB2qYV#ABqpK$s|V5zm5fNZzZj>SiN&=wn1`NQ)ao3yT8W`o200JDV`Hg)5MEZ-4jnt4gnxg8kLR0EYwEJ&_4cRaiu2Kii#dhH=iz(jU9 z{mj|m!<~ofK8Ma|30vz}fhl2dbnEID4%hxKQnNcDzWX z7Ig**&|~2j+f{(gC7$`u^uY7O@{8?&Ur5=$fHIl4no7&$0N zRf4bYuD9+K05Kh|xcU0BhcvQ7)G(c|$ z5ZSxTUE^MJj>&WQSgYcx7W9E>yA7qTJg)x&T)+-oCVL!%!9oF9*37Q$KEb>+Tjz2U z0C$J_RM>jp!{@)NY_A(E($g1k(T)o#iw`=GiA+&jlCbYw%5S7!S!iS?d^}pFYUb+~ z(HXBjibED9M`~w~ullq@O=#4Ezyus~B)P=2e|De?ET2#6Lr1g5(mcMMm)3%g3v|(k z0v_{6ROypq=-I?VElB!n?{2RV-BhaDZ7(Nl*W%RYBFH8#GUq)!yz#%TX3c8!3nKk2 zoH&B)fPlL3Hq4bZ$EmkJ72tpi513D5dPi7A_smnWS+Ge6S=~rK_oMy<3x`mwIS;s{ zhwpnK5}%?vqd_i6J?cR-NUPOb1^GZyKI1o7B-o$#-t^+&k{iY>HzZ+Yfc3`fbqsk$5W@!ud9aCw(WXLFuv|MN@2=0-;Mc$yr@& zVAk#fa>VgtrAI-6R1`Wy&=R@3ei?OEUY76IXV6%Ses6AfK^W@~#dx?RWbZCP+V(y; z9CCkSdw^*)n*Ijj+M%edxyDcV5~*!49PkP2^H|B%NVM1zb9}_85SUk|z?nj%+lJAb zFc$VucW7^bnI@GTOIOu17AG5F-0KNK`x?$iZTje_>=wc0z%=D@ip_T;8}f)94c25TbDh8)NO?YUjO}Ou9f~_1{?cAviQkW4ywiD?gF0+kF0xIo zPfI&uDwVMCk1yhzjq5Y36Wx3W)OX|5EhHEqJU!rt!X2m@YP+2&9(r^2E@(GQR5k(SRG4kw`NI9(MEt-2AC!=IRiDg)J8eYT ze`XPk4EY77xl%WVyB5EHIiw&f%H1Q?@|5_vi6Q8)G_z9m>>*YBWVXa zz&ER7Su!lluCu0;(KmZAnjVOTc{i_oU-r z*C02CZXluAbNh|2BVWG>{Aix@Opq24Q+ta#xeoD zgv;<0_w7^5E5os7p)k?wQ0TNNi&UJ$EvSP0mMQkHQCav%PJ?8v0i$&Zq?~M6$ zxlSR@RP#e@SDDGr->0VPBDhtIReH+CO+U)NX16V@> z;0;Z{hZ_huq05O8TGz_?V3=Q>!dbq%6I?|XDg~OP$vN8*%{KnjO=@YU9v28X@_Z*C zM<)NirceEL*y-y?4Jn*uXs8LyWIG!ZD@d1lxV3o^2p4k0N{F9jjt#_%aLmX5Ugo~NNVIN z#c}><0C4F^8u`K;UH0p8p{t#PPlj~^BQyOyyS1D!Dnxd!TJCR0Cc;mB3574B`<*g& zL8>b(jq}F)=WGCn}?Ekv`5eN zy0AF0fy#KL;RzC4STgErYv`K$3sr=3{iR z7+tqF09${0)%N-EvTuWHq7&5?a8!;IWkcQvx~KE4^J!B#5}P45(1YRI?6FwfZ>&g{ z=1sMjYk(fT=`DJl8c%C^zB_gA^yX^{v-)rk;!~ckfbZl*xY5h~9S<`kkxc9TQccl# zcSrTUmi$N&lU--dH9_C_g0fo9V=gMu&eA;_bNKH8ppdlxAQ2aOQ1temlvxf%q*h zttg~laeQH@>=#E(M$3iPZ(X~qfb-yUZANdtX8e4{7ZxSJ^!80&3wt9}0iy0IOD*%2 z(DhCYufN}DV?D|8_y9MVa(0EtaTZVdllj3lRQTXnp%~K+vQaRL9-^706EM`Tf;kyVQfTGpBbA1f!Dv1lJks73Wsi6mP`aIq&!y zZT90u*a*Z|E*CPggFd&%YYc?#FshBnDgn3c2BwX-t6ALx9_mZ(YGvag;laG67`P7e={0g>~2R%it=XAdvXQfcee2wHWCSh2N1)+Vt|wqpqL*zbPT}jMPpLDz4+Lu zfGPLY=H>O!+q`y0Q+90bDTrQv9>`Q}-D^PM09;sphonkQzMa%x&Z+e~ttb?Hd{XwBDeqa@1Kb|zjKn)3A*G;NV zyvPGznLokEWYqEn$Gb~f@;ejiPRZf4M#~EK&DDIMBR<}WxgMY3NshuERl*ZGZ42j- zC*i@BcI~VK+k6(t_B(3guPq#ao#M1%`-_*DH)+o6&pj57nm_8og!7-PEWpM@ETs`a z1jgYZtNgpA9XHSSr$AYdOfTifR}K6vI8A>uYC9UTuNA^)3bnt>`3JiVrfhA1jV4t& zkxoU=Vr;LQS`BuM$!Gf~L;`wI-`G0YW|AfK73*8k*gd$Q@bsiKkIO)HBN=Gb`_CusC_>jJdh&ZcHuw5Ry}IfUs}&ZK1_aK^oyZi?rH3( z<)!z+3O&^u`f47_b~F7;8U09KDwKtaWh^K!k{td(b`CWtoNJ_W%66E0CdImY%a4nF zYffl(iH8V!Eo9SOGX%g?lX=RnO9g^~4KPNY-21t^dRQv)#$4&8driZwUBnieBJqQ`Mv z4x)L?E~j=iY7{7*z~t=|RE`;=_16&-;x1x%Qu8q{DjN+(`;5cZBqHjriTsz%0$>)XInpeMpntpRLens zj}Zs?C<^R3^=nEn1@3T9Pk<-OFS>Jm-2?A!4|*nj2z`-qdZ9G>VFf%DB2;@R1t_JJ^YwC{&v7Bc^GF2E1?P z{8xWLT+Gu5@ruz*BAz*ZMTy$MwiIq|hYDF2)Fq3ym zXlCF`rAb1TLqd)FGA0mcUc2P)_y6(r7Eo1fZQC#+2uN)}Lg_|2Bm|^W8UYFER9b4& z0-H{0L_kUq>F(|h>F$*7{3ho)=lFcz|Gxhii~%|}y4GBC&3Vu3z5>P?o1&;B{?y&( z2eA7_zt+DTeBH9dN)UjQ3et~hkp;(lxQm?j>YET6xQh>Avw&h0tO1G2nTk z>Xk*G?>|8m11$5JNliYk03g)IqpQ!me#ZTptyS=tk3yv+Fzxv1$32v{e(_ttkoa`@ zqjjAsnHmL^t`c67eP9LSr9qVCuk4{)h!Qjo;jR1BkI-Cn=`01XWxsdWt0^>ObkBIq|1WWC*fPem#glTDS&m* zz2Oq<;!=fgM}*k91K!*&D56nlh@75BGtSmc0Lg%W+cc?XbiY%rqPYEkP~>>Ho9EYi z245Mi${lCupZFt{*vmo(cSo`+1YZH?RWhCZw#`Tr_v@XK0d%C;tCQ_*(zTNQcY!z< zq#o7_xF5u)sAD4Qv6tz7l}eJzJwb(dORI4r?+?IM!y9fpU41;mYk5qxDg(Wt2^IJ* zfE%9I-7b5MBNuGb5fWh#-)FTbey{JX7+HMwIn+6~D8dR^VJDOB(mSvarG)_^K^X59 zD(*{@U@|P$!=dz%euWR z^_BZ~X&}$Xb>MYI%|=@A<3M|;*Y0FV7Rw_{HSwn`!6uu{4zmEZ5D?%gNw@d`bo7Qz zBVn^L4E`s8SA*RuNhGQ$vB8fz-(HlRz)cx8=^mUcX=buS$tUmL>pBe5OsxHJ#%Lyr zeFD;^${6DHJ9_MlSq1RjFxct|yGnfMMF~eA{lOEk7OEati_1PPG!1Zzk(Ycr@DcRv zgR{H;*2s8WW9fzXd3kKth`^#ZJx|lb%`fFVu5C>g4z8j^f=4l$Fv)9ziUn`!AeDnz z(f!2<8MV9Bn`;XNG5Hg(?cA=Po)vfp?XJ1W?Ld075 zXz&Q2zz|Zi#Kw5YP^9RsWzxQJRdybw*efB+4aFX=}fc)0ETrgaH8T03k$bJ)A2`;w+O4*UO+c#D=PIKl7{E3DiB? z{8<)B=`pdvu}xUsp>`>V;bHjev-4UltI1A)w6DI5Ntg9S0i`&L2OR%wi{v7adDuRg zPKgQA9+O$$kT(;r?$dyK#uurgfdx;tFy|+>DUBh&2U_`{zX+g%sYH^5Q; zaWn1i%1?)0whri?;HF8P`s^ED&!B#t;(m0TM~gw6v#2x4z&)@fihN=*6G{Hp!#y$B zuj<2YhC1vC1a4?E8yj}X8wh&celu$Q2WZ2hYjQs%^~=fL{5%)V*nVU0D@OeS+0Lk4 z>IAL{*{2M>GY~>8AVxFkqtZIgbl4b774AK~ii$d)q$A3Z@0IF0t_y2dxm$_i%#TFH z{jw;OBg|muMBFFwN?p-%HGVjk%Sfdlmw0IajiryZuD6}VL>lHlCjmmj2YV^7s#F*i+Vnzonu!u##w6<6q=pA zUUxH`=(tI-S06NLDceWh?;81!SMlb}R z>E|mnu}Dq8^Jpdu_+*E}+cuAe*$4(a3KIlD)eEi_f*qvY_kP1}>ZE)Dgnc(>djv2R zUY1Nkb)68aI)`|G?oYcXtcVH?R@r4W9!Z5SEav~fRRw3cx3MfN0rRe)GDd(8imRhf ziEFyMYVfvsqehk-d3!Z~)Vv*4V7u(SO#*Ckcf{2^QlyBvPVH_1-!fXEQ;O8gOENX-q=gn=EwVkYk*}(-S>9u03#fi?_~A zz(Nnr5gu&pdAc~Tzw48|3d51N32;~L3n`+{#CFekZQYzC>-|031_g^EwPrsE1{cVx z*&5c-$6-v)L%zn9Mp=su@WRAF9rZY7-`Oh7Bn?SzX|3dqiw!RLXN+HHlkihPBBVsg zB|e9_E3YuvSt9y=rLs<`MU%@*tA?#ECzIK%7(;Y=)e6*@4mc)$zGWfZ?K>c%M5FMmT`REu!r>Q1atu1{fSRj zO01KhwgnYi|EM4-6xrc{A@k`C-f_twx$)ALg$y;R$+pGO^M5=X0)$q{3IWcKh|^4S z<-vLRjgWhe-M9s?LZkM9)O(cpGu7)4iPkz~LTO(C`;B+w?HpUG)a9JuO)1%oYBS1j zC_LU_uMKP1y>o)AEt;VwvhhA$3g)y`jio!AtefEu!zjo4uOEm@c(wTAb>wB%4F&jQ z_hAvK+*D%HCIO)kGAx(S10sut8|83GbrLN~BldI_JhnGnW8dWnQ$kKz)mmG(jIKap zNhIclJ8GRoQp1&1Brqy57U3012KGGWC>;}BWuUVWL^NTNnCDJPhO=8xv+Lrt--Kkk zlXVBs*Or-~OBfP|g?cmsf#B872+H#k=eT&DqHlNn;(kzXaQ z?w1)wRh0d!?g`?C7~7HwU%g<$Zz?BE4?8R?@}4TTF&X_-vz!6Q*NR#$9mFrA+aI+9 zG!ll&EGBuMkg^SW0uF}hDm%Ms0qZoQI;tC(^b|z9JlQCAQhGS7Qx^UI}HMrGEt0| z`V0ZF$c@Crdc~miReKmH*H|<~8GS>6duTzrC-A2>Za#TwYN=D4Q8?Xarc;jfbf>{H ztFdQX9OWGrd($bv*im8dfr|^BPFp{Gu0h}O^Ex~wv8;PrEEcd^cl6sAHMG6THv+}?dWf|I;eVJYlFllB)EB#qIwQ5jtFZm{o6=wK$1 zU}DsN5nBH5E<;cHU{1+-ZKZBpBxyf4aci>ZuuO;P?^gT+tWJC{fOb$FqlrSxR3z@g z-Fr)R-0jWUWD$S3I@TLl?-F!M@7Y-YdMQ$UIgo2acwWEDA z$Bj2Za$*3ymxdWvL)4-IXv5B6c+t{Xv<6(=9XLkEd$Idt)G>#sG*4!m1sr@g0vW0G zH8-bxk(gIEb!R%1TcB}XlSqJUzR_Tm06eyr)pI-+-)(;>#=axUkcF8NBxjn*d z0$TKJXdPJ_j1?wGj$vJ(^XiSZNJlZ%C&?&LjF-JxCW;rp-x}jlzUd?Q)Bzv=4)}_2 z&@}Y|NV%>i?tf`3U8v=fa=K^!X zHM^&rnD|>AXH^kP=fUy_$-9ezDq*Qig@*$S95cY-;&jf3?yPdT`l5dU79zd_xebY* zRv*vrxHwUgBwif{ilw8)pzD4?&oJP|)wtc}-N?|#xu}1tK>}U4-B+&;1;7r)v7UVw zH9iuimoAdQ&zD|t@f|be(|ElWjV;Q*;&FY}DMR*QfXVw<$7Id<5nzIC3wE%)zG&Q2 z*iw*yrxBXUbtJAh)x5YuDbOk@pUxeV(3xrF{K&~mbidgt9@~LOb5*EO6>EAS`@(CV zdNw%H`I(4~Q8V5cz=4n2AXa?{Qc%eji*__{HP^PDA^7vz+1;eFmxd?8QqaZ+NC;NO znDnILYL83Qk&6d&r3MhE-#X^0>^e)EmUuE^Zf}$!+r{O01iatu zY~s-1-FrR6?s~j|wVMnws|AP*p=9A;bAYC^pf`;jZ;sUYGc~WyAw1h1g)8$M+ z;E5pH^D{tG$K=?BM zEDB&!05d$K^L@uQdMa^)+Gkix=!Bpt9{#xLi0;PmSS$Hs_qT5iR@H)@fPio_bsJFu z+Abb(otWw`Ttv3V@@he!?)9%K@!++5o~8Kv;=V@!fZT2k6a%dREs#39W z8ogmFzJaE8DJjyjcU#Z;Qa;qk#8K9L3$O!J9#K~L$pKXNbDib~ESEMLGZ)_qv}O?{mJO8 zzi7~klPDR4456YmhWOr07>dPt4{c@V0lk@QXLQmFwX?#leBM(R7g?|Uochg6G?#h% zkx-O;T#n3w59|8`k^R$14_9fw+PDQ60VHCPu^*UT;XF2kDq76B5ehCZfz#kVNyvWm zFA(d+T3|^=*Mg(^v17gSGp4UGAU{NTdAlN|_!cT5+r&%r8g+8&*w~G#zPtG#N%t*r=~Ow*PNlKS&*IcQf&<0_6UCC@QK9_ zFzG8lT>mZZm2}j9WxX+0V%&pg^(*`HZPNi*eNN|^({wbOo6A0bhVy}A)OMPgmiu~@ zes!?kJXgVv7qPYyd%|Uxq_wxPhrb%vdha~43n)co(fUnirJxTwr^-P-^pVp}H<)ZS z!894gV372);*+#{UcmrqOO4Vm48iODg;gi${wsG@{#t@#D>ku`)q&0DE9Ry zd+?^Y(hTi;WYhrivs<}aRa`l5tFv4dDe+^1lth3Evh6yoI-w}kX;U%ea$RgoALYO z_3mC1R2T1ZZoF+j>39V!a+>1w$Tq_8zk;rlKpyQEmDQNhqI(L0ZjeXrJx#~;lKH1O zzC#i?&GiQRLdM9p^etLySDwUhk6Zu?^X6cC9q6LC)5)mlb>!DuAiF}@^}JeX5k~L} zTReYuq6NGPTVC+fk~mJJ3X?AT+{QbXVB$O}8p@Q3(<{Ct67+K0nXr9M$zcJGB)ebj zZdp<@K>NMlbM2h5C4l-v2a%mUYeLzAfMj^dY>}aVWBRZ*1{=o31yLbcxj`C_y93@! ziZ9&b)e=2YbAI#pHcV-%Xs0RSyO^jF?%8jDfv(2dSD3&n7kkXFZ2arN%^E_b7VRzS z$bxbGm3ssHN4eofkzf4+GmzIUnr*oXR_^}s0yuR3eXrpYQl*Bh-$qAufY8o=J^x&=EqDjDPw1%?lMJq`n2Cs2RWBo&$Biqvqy+t#=j zdX3Vl=X9FKKv!&hfmv)o~L` z2IPlVy&t9l@gatgA6kfM*C}n{n~?RL^+1pi(5cKlB=^6=I=D;*?_K)6dKTSV6pe@6 zpcgOqYT@^cK!m_aGqni40aRJk!gwhiFfTH2vBY~;O8mcd&gfE#7)W62pF<>oHx|P~3#i2xcH5lA*U#rKe2A+w5y3ev$BPi^2;ocXX-Wxptw(cE!obGX&>QB zqvj{qcG+yx;qgIA0-S|;++(>r!JvIS{&K2`DRX?H!b2SSM|_)Mv{^mIDMbiq1uOUA zl9>Ttj|e(s-D~gLeH*yzVSKx2t%BD0)yW4k0{S!1u;6Dm_a>oPl+VQMn`uR&eJ}+& zQ9lLf+Dz8foFwT1X2PY9VL~QD9-|L2Cg$DG7m=Q~eH=QSys2Qf=reLot9xNy z9wTUEyjP)n^^N7~>G(=Y{keUL3=ON``NG3nK11VTK)R`WI5c6%%sUjlJhbOp>hV>k zJguKLYrOuxgRb%fUKYD&U98Bhyk>=R{32Hlkr`D1n-SWo564Ac{Y?W1nDeKN%70V`14H{UeqAcES*6c8=l+@7c`VxuWeot*}Qz z=<{!fMPOpbQR`35FSU4kc+aLoI*aPjKSlAGwKv0jX8)yTrMyldE1Ydxa~V;{OIJBOp@f6Omqwit zLNF(Mm# zw#Ezg?mDo-e&16;$cKT6Vs*$Q07gDIfnJ(R(c5;|-B+=A-;Kxl0eC359d~L!xzA={ z(uF31ll#4`*62FfX%<+LncLY?%#?BNxAPN`GPiE4Uc@A2tgS_`{HTAq`zq-0lR>v7 zzcZGq;(XV8Rpw~zQlBw#TwZ^X(dhom7v?XNf*t;?wu87DA}cvytRvwk#CkySk_lrO zFQ_4;s;D$bGZwCfdC|}l{K8)o)_4`m#0@%P(gS74e zzwtDe^8}~M@w?x(KB!%``8^D=#kYOW?Q$$CPK_d_x6OyZ_QPVa`QitLe+MH>3rbe( zWw!p+uKyGj{>dfV<}||xWeP)%gnXHK%kM`ji(kzB&Z(7?V0~cy<;82gbjt_-BQEk5 zR~Ma_Xr-v@rfE7;X?WK-O|!HrEsY{bKAqG}G6mxvXX?S)UvDpNuQ~wlqK9kUXRj0;I?)Le>Q%(nI=MC>CJ=^_<(0 zgVXH={-qo8=LJ2+Fy5Tt6k9zVl^{C#tT&JaYJYt0+oGK@Bf^Tyg3;aSNx=-Mgo{Dm zrr?f#IjyP(t`4WGxF_spnc|-5>C=vLW6*cb$3v1W2?9`>C118L9Xb=>RA;|_Hfc(_ zXNii1<4ul}IvD6hhVlTit%8S3M(rvVv@6*rq9$K`xsM$Pw-&Alk`%eGY zW^oU*9Z)oCin#Lln^N#9L3a1y&EcO;jlMvB=?FGN(hwU6m6DlduHK*^<&C_tKySiqW*0MdE0C+j?F--czr0x& zyn9Xs37R|FC|~tA6{hP!y&*qJ6LW>gEcSs2Ex%;$wBi+4c^>{+l2-(ob8_XJEHj+A;NHw*1JrNCM8%s_Ta+y_coNFVXS;&{Q=UgM6VG6{R5=Ja>nM(~Wm|B+*TGlS>1 zUQJK=zQKUYA`T!Hu8Fs`CUg#})Qvm-fWhyAHT?CZ-LOGC7R;>q3pdMDNuUD3^`dZZ zcljiqBlF0!w#rFR(OM*;n3ITYHs)#A`M{Pp9U*H#tJJywB8?$d<+PUrk;SC&`Hv(U z5$m(V9z@H=o9CE)t=H{6s4Q4O^SSZ9J-?%;4N#Vr5aA0NZY3b}TQ>_$mrA;(&D-}~ zVI6d9{cXmSu}u^ZUPH0il!OmyMZ7Ar*dBYV)A_TYCOMI39qH_9OLY@9@avB^C5{Uh z*&1X5TPwQW=lmwq7vblW(+Q&iu8|}6bRFL?@tig7-!$t*M{W)KTRxIRVtBop#|mpHGsKa1n%M_Q=c%q{6ZJfSus(x23` zY?qCU^;Vpzi%%KEJxAM>rT z`%SUM&wT2C6sL;ua08T+Q0~`fxnJH<3}9!hx_g;gCvy}(7px+hUQhB_XHUlGc*UXV zlK1ai&7paaEX<3bKYcIC+;44YMJIM~-%x6!(Gm7r4>GdeP>qV$Bu0XVq4D3I>wwej zkTB_Ku&|(QIx7`1j(DHroHMQD1jj!Fh?UphsN6ZKbU3En02kj_%Qh3|0rFtgYuQDB zz`WW=KGfEv!^5)#%YjrP%>@F>OCUhY!e4MZ8RhQEx)De!xbHJ06{2k!20ZOWMtzH2 zRuRJiM1lPXYLz##C(2+)9sv3>_&t^Yw|HD-Y%Sm-M<-Cdk%szExbXs|O)f>Jw1c>o z2)u5iEaN(Stw41ix;tg=|ET%%`(0qx@?163UBsB72_wxLh|*uBQqzcRO>E6u&F4*5 zN(wkn%W3h9_i2_k=Dj=7649KVH1k2%2J#C#rY-Bm>TB1t!eznf2gnRrwd3~87NB}q z)ehai+^39wCR6SQ7an0I{#3^k2>%^Z@WKU@QVEj1{V<5Pf*Y414S_#G<~d+Wj2B!} zUfChkDSkqahg9<=>XdKP)--jvE*5%U>FFmTmN;-3M^lBOOwpxFla2k{D*64oS=ssT z=k+ZOTZj(E-6`8%^4gXrcYjW}18=~z_TjPvSzH)%vY}kBSi;cylTf)|;S4uKafA-jahNl@~_s1srxyqMoxf)anfzszAkj1FwZU zc}}L=4o`n5|Fz5MBTo>hXoL#lBFTcK#NHs2P>4ysCAxeIGGQF2T?_YqrSr4E3xyIB zE$SB}1H!NeEon>NU}Enb9Vd-VS(=}+8Hg#KO6LR8Cd%`@s`a_X;I7Hr32+!(;F>gw z5_(cZgT8)ulwyZ-Sjgdaj(l&JDS15ux`m~K7b_2e3-*CO1QS4FOsjfazrW`KnM?nx zJq_65F>alE02HCDw*;9nA7P>FqG+tpeKHoI zCG}(Dp<%P6WH|B)NEMb9!-p~3fmgd_=B|Q}{o}W!RlW=!wlWU~UU*(tO?m2!=~jH1 z&X$lH*J}x#5w>(ZB)+ph=MYMrpP?H%x76adY0g^2%?9z}w|4u0Vh;_Mf_b%Ep0Ols zuzD~RKslHAj0f1dFg;KC-f8AFKg4AlWAk7L;>cFlbWpCkAKJgZj1@jPy_(}ZP>b&W z_;hEXt_cl`A4pMV-HwQimMFz!Yg-EM#r}VPeWQav_66`asRDGX`>X< zMRn)Me08c)tBIQtmINpLaItEpJtrwktHMg)7sk>v6aE<>auhZzOqvCY_}1-NL)`3- zER4fXr?XBexwWBU?@u>|X76Kz{V~A2vhu=@oW7?MEQ(^>ch^$S1MF$GCT&{K>mYDL z!(hJbB9e5FxQ3kZ9|Bf}D~k}&?XIyLO&B6Jr)_XXRlN5Het4;zBbX?2eh@NuP@G#0 zXLRKQNUgpS(86JDbHF)&w{+yum7;V)z4g8LUUX2~^Cq;Z#r8<(xGd`UH)ad z?Fi@c2ks?%1Pw)}v+48+9t|?es{CVE2AHBdlOPWx@<~?hzYiSuD_p910!(ycFFT83 zt|v|3GI&Hb*$_fLS%MBv+f4CB0Chm9OF}a_7)sOZ^ZdeDCnzW(^2kj0pE)3e5Q(zS zFFap!(m47^db9rAzvDL~(Brknlro7BG%A{Sya0?_B+1T=qK? zO|HqW`+>kGaE<}hyYSvde+1Tjxt7SOzXL|UAsT}OVMuSk~CSPg3Lk05PPD<>py3w zE|lnYIO4r${CoRuEp|wIA+@els7XRHns_kD*x2JgIOIQCl)p;m$5DZ;k zjk{Z~l=uZKAfCcRwsz;-&wi7Aw@wR|;#DPeG0Ug{G@WKQ1V0Rwn?7z9XZ!bb{`HpB`6?l-&W3kB{Tp+%Jqi zSQ7B;uY9}qS6<6gjp5fqJ5Vu3R)>n<}mdTDfdI?mYFD^=RPak)2RP-X)E3e_8_UfOX4ER5=}Y8hv2oIE zh=Al|*Io!H#OKE_yuA!tT(XCIa~H$li7L`%xyu((l81lcapRDA@1gavEQP65iuXz` zk<;9-!5X$gIWr6#xQR$~_q}m&iNq=>+sxj8Mk*TeJv=Dz!~jg{I&PXr3j{Wz$Y$PD zI1kpAYj{DdJDJ$V$9eYF6i^y5`KWDS{~5*zsYa1PjfRJ&&SPwBjs_oo{|g^vQ0TdT za?H=TIXNc&BbNee$)V(@KsD+jH^IGG*FBqxi#7CFeShL%{%riEi2ong=-54T)=qld z2fVz5+*a@CE!i<&v@yB0pqsyp@Uq5 z$`A2iynJBg-An~|75xYhLh@a?Q*YP?9jSM^*%7eCzzquD|44hF6dm@bH{Tuk2_?7Z z@Qb*%`R( zOvjsm%CcGxIJLP)^r?UAXYMgT6L^p(ez+&qW!Z|uis~*8oQG@=-~WZ;|9_ll0)%`i zgh(Zcn81AphA*A7DJ6k%=}v?*0PwC+iPKAofGhxJ-kVhJ-8%#Bg1yil2%f*-OOr*A zp_h0_AA!GtDuo78Ko}Fw>F6WB<k>Ch zWRcxYiFy1876DC#07sp{Fi#R|tjEl~$d8AxUTUv!7#UCjtAn|EYc&bwp|-iz8W1ZX zc(BZsR`tU*=WqQm#_=2HOC)j2wP97NVA-_)!9a{cb|uUn#u z96U6j^ejadVIQvBuKvHAR{s0m=qVnw2i!h|57RyY#)I&GdsdTuh7q67TeWCMG2mE!?ztGR^mXdqHtS&n+ScD69D}fu zKlH{b*Ps+hi<%XaEbrT+o6gW@;}{alaZsUB!uEn`Gt53ykOKjs$60bKQOuSaME+5u zNSH#fK?<+{37a-@pU z)~_F7dzgM_tXCni8M3SYnni%wB}R6+`zB#3vmD&a|L`Tm{-8a1iO26L--F0j$u3gj z|GZd9|5GE{I==kk#`6I{-|CKgxSG3bfe<; zFHd(ATtl#ZbV>QVG!8{kSWwtR1+}IrAcYZYOX0l2?~B^Ae1rfY9nI4k57s%<_OR{I zDl+gbz`Ov#!iyy>VZ6;5?EbpxMQ-2Cwn0&h-KW zTH_UplbifcX@(mkq|)11-Zv%A=p&9OIrMwwbjsSI+M)WmtHW+KYmO1f@9N*owZkEj zm#F6o0QOSWykxv#M|Vwfri1$~qGboFvaz-Kd)5$-@L@|kZN9fNybGz@_oi8sl?tGI zqPN2O6LJN-zWm^lDei!gQ^%1T?{Y#AYtR37!Py7|sK5@+(|5Ve_Jcn^S=**nHuL>v z9O3r~g+N_0&g>%&r7dGMv7F(m4dbli3wMEvr^tos8GyU>xZ=n;bSbtC4$+~xBxDp_ z340ofSZvtFRFRgkZYM&BrKNgW9^3v(`i%IsQ!S4}qt?W|H5nr~{$l)J)?^eBU;gqY z13uz!Ttr0NTAlwvaQ>gEtzra^xU6^(!idNBKv}$gD5vIrjz!ZvxJ`&JBzI2Srl2W0 znnaGs&5!Lkl`+2o^nU-7mSuSjZSFU&_lCvWUT|HtugR~!Sq&K`bZ2j@n=!ysnR|*` zD`<=h&aU&!9$0Ljflj-hNHcK5S z3jds(??+GZDe~a@!P&fLTmEwZJ;m5JGCRUl$wBw=ZeT8)kIcrDrPi*z8oI>2xm!v&|wNd5V8d#gbH}aKu}G|4Zz#(Tf6L)Fu=r z3YWY|!R z^aipNW8o%+sz*Kg@dWr7nJO}?TDPA(IUNGD5Z%>R6aiO57ox3_$KgCg;lq`dHv%&&bn4+rbPJqqcFd^+HuZ673i zDsoDVz`@OY1&JU#*VE{vzFWa-cRkxZL6NL9`lj%C_~TE{$yw%g5#+b;xb=BxC*6DX z#~T1Z(Bk)mL9Lg_^ZLMfx3WHte zJZuRT>qN@(AYEm=t87S>oe zBp0R%M*PW{G|jAh+;3+2?lfvdDw5vyYP*r)=Oe^_E~`@wVMQY%V%`W@3U+wKXca|H zRwO)uxtyU^?wtYRB>sHz{~ml~Hu#8$W|~w=GGBDE-{F5vCPd-~c;sSK%)vNT8_b$g zye9#o_7`Ujcb3bQSKcAf)5YfF%+s`Z${B*-rhdx#JRyHyH9N5L;SL-TOFM!*`n5d- z=XRRea9z%RPn!ZV65r3D?IPvO*UpD-$O!?8TpG2}io-9}mqIXM^#4v^iUoKz`x9qKTf$gwW1rSw0|?Z57b>=}ITD%sW99dVviex`re zr;K35Dn}->mcRZ3BO$nta7%uz#-F_vxuoOxC$nw=cg+N!TMFl`X~z0@At8gNRnUX3 z$RFS60Y<%+&rlgE4SNQ>%V@($z2F`Si&3v*EqG{v?W```tPYf_x6WM`b5!$b{0&{+ z)ZoT6@Ms6+dW)z45p;H1y{?zK=Kig);AE$^v@uxHAyXQsWOpP|_$5 zNX*dxTyiJcgX9r%(u1#yk>N`}Xa~+AagXttEq)3~DgW=!N(ify7@_>;RQJsoY@kI9 zEK1dIF?{&hMR1CK6g20e^?Rdnudz(+2Ce!op zC;v>?|17-Vfl!6R9q}p*uvm28JmIYlN6`(B?9ed(`!_P+9%zJ+8Q~0LrACCRH%5q~ z1HNzc%iZn@^5fY7$Jq#*Px5Ecx5g)ZS z#!r7wTXGkEg7LA3sScBot#Wd!2O0z+(lL_STKX=2rJA~{eK$w#Dg22Kz;#E*FB{?E z$3LqJU>{<&Qtq;FJyqbbR*rok#zd|`aGdh@W=9dhgxp!e9~%snh+DrgA`~TUSWSD2 zBGpCl1NgiAdv6e6E+n`!^I(ABpJnEyPviXyQp;#pasO8lXAnJ)_3Y+5PFInM6R?7d z1SolJL^_4KLCqz=aS0HY|gn(%fw91&>6?+^X@^V;4* zUjT0xE1x@`Gr&q+u)C+ZsIaT7m4d2+I#FG0$ycpg`k8~&n?G-m*N&)A^1AaF?xD4s zmMG@H?O}~VcG{o)-xW@h#n#rmJfgL_c)q4Br;=cqKW<#O{V8u#e+|gc=f5Vnv}{P z*p=Qdg{S`DbFsM?9zIa@=g5pMpg%95sR+@l{jE~d_- zQ&j4dy`OOpKH0zhr{d}qMFx~zUFS=jd9oq2=$p(`+A4)#G$A2P z+cDd*E1~*P8E%hRItqNL+E9^B5peo~Dfksvm6$5SZotw4bU@4k*17fj!(QIjxt?Wfg!PANK??7dW zGAdVYLvc`flFUoFFE6@=FkXE4HQ3JvmLe|Wm2{$4 zfS38`N2;iQm`PV;!S&o|f$n@Xv-{VJ)i^m5;0DZf1E_N)2LQWy#;AvD--I244BYS; zK}s+>hv%)S$yDihpEPX}mH6X#@jK7j$o*G(rykK}=r-K00g$R#Z6Mjh#m$RPGLXmy zkofyRS-j&;b%{ArY#c0>^FafwNysShhqh;I;t$mrMFtzdViVu^`qZBh0lHSjyuXb3 zAP}WX#1~`0?q(c=0si7C7(c2S(&5=QWQ`0xM!X7hw^=x6xM3_pT`ax&v*jAQqo3p?1i*`a-|Jm^k6krtX!&3!0gS{4VMDg^hz zw(-)p7uLK=sH-9p{YnbU{5;g8Z73>uK~*%IwqD*lvsb2gFFvS((e1=QSgDV`isqWR z;*PPbM#W)N*_m$;Bz}NmE*TLH%y*3)cP8|^B;8*6;Ntw})(yxTOXwnQAnLy)tkF8 zP%Uef!Z+m~9~Yn}%*bHqNMZS2L;M>VMMQZ$c0VO1@q_1ISyyj##3`BdG*-bS7YknU zH~zdodGSCNJXVBbuQGfrww^qT4JRW5mW+sx4nGI| z^&%dSHC8r5n^9>EQ4P_SLoGIJI?|x_AD;fZEn{^Od8yR07>xy8xh899^u7IOiazn$ zr?3HC-N}Ao1n0Y(7w|IdbvJ8?xND$+e#p3m_M*k_l@Txvx14h}^}9IeAf?RFsP49TShGC>D1!5DQTcRrsc4lM{QEWF09JPLyyvu= zq2NmrpOeJT$kk)eZ&`h;uXnieynGMrLoaY>5l|L`TFvR^ z98z}HmwQ(N&5HNGvWtGG{eCh6mRS4Mc!qkQJe39NBDuDp7=BbuRdff}vd8 zU3>)CUFvner=1F6>0k|-bQ%3QUP$hu<8cv#cH)gf>YAUfSy4ay)kXy5Wlox=7}`9K zBQ}2rdVM8*cIc8{8oc*Mb4D{sihhQG##Ze5>wScgG;tZ%zDHL~R{-zl`aPw+T4n!p zXZ-!x4!n8H>u!V=(2}15Ez`-Z0*#XLAMY-V>{`&dU6_}2F!4^#Hupf7^n14TnL=9~ z@+7vmaZ%XTcST&(ez$FMX5fZVv!w&))+w!O1qrz~=VgRmUW~jaa;0pL%)F8g#0Y!pnKd*~RvL$K?%78lOw!_Us;9ji2 zw+Efjf0~!e5eJvLmX$J=_48gM#9`bWJO_WKQ7@i;b46K0y6E%zo!Jm3*4oR4TbHWI zLVcgjxw@L?YCBS0ucdiRdMQmhBU07IO;h?fDieB8^mkA1Zujmi-TJlh?HFj8?3 z(2IOd#ekK|u+;G<#n5fl-d++qPM5wfsoMNbI8xTq4^%71x!SM3G811Tp+Ot(nSn|5 z_P)xsQBrq3(a#O@tG*|$?^*>oxPlB!)bR7MLBO{EYHovb77AJP9#7rrprE~cZ75c5 zJ+JR@uT3SnI4DAk2W$=KfygxNTUE9FhO1rI-g}GboRWOpIL3?aFwYVbcfBy+qm}3h zIA71CU_>0u1oJND)t-64m17Lsn+^&j*@=g%Bkg))9tf09*G96j$3UfGN@iml4x&-y z9P>7&%nPK)1*blYZbhOI*rueoTH%bOwv4Jdfpody(Z6sUDU1he#^(#uL{9`dX!f`TBW6=LKLp`4!j3izC$9QFI!2Wpe6if(&BqH zFrL_{Ykj4E-zzQI0gOb8m)*syzv7>jyg@NJ^bI@q1a&^jn0zh|=1u7dubng`1O?e-e`K&ZZ+u5$$PfE$B1RcbWAIh0Zf1vl2irkbb8Ci z9gi5xiL8SSZ)jps3%>OOPm8OS^!w7+<)pf6YiFh^ee`0|6xCameFwnq3UdbMq>hVM zz>9e5vM*8Bq6g(Ay=W#QP4AZ&33w57bHSI?z2QN?3G4@U=u;8Bh3h8_cnOeC4y3t; zfLB2ku2|Ap5_XbYum^<0M}d!VX!w6?@LaT)K#pQ0hoP<5Y-DU9#C&5cdlFw@oW4%^{=Uwkw-}~)#?EQ;B91jQ2bH{a^*BOtkJHu+1NDhX*)`a*R8u@-O?G&AK zn~qB0st=g!>8s}7k9yd1M92T!a43}C8KenZmNb)d8^CcwkpQbSZ}OHkzz_N`Gaa&3 z>9#Wyxu}~Anh=X!5@omFE3bEd6z2cvtCn(FM7r9+G5t$880e07e4~``vTUZ8q=G#= zs;5A#`26CFNa8M-N0h6{ueQ)tV5(fg>iAWyp4z!kdQfK^hib?l~4Nl^G zs~wASj~flg`LRY~oai{1c+58;QT2HyIA@@QITZYznoW+fK)k6Doc61cRRVdsm3A`X z+{>PSmMAdgbPpwk$+}ewT%aTp^HbnTBr2QBYQ<8%BhBBf@}f&kRFm$<>z02yN5x(C z3(ni|lJK^CVS$-o`;y$GuTRi;^!Ul1Ci zx6oA%AbVPX3U%sb`J~Pk>5iHl<6ZjT)!9x>2!E9gcEKCBk_TxH@S%E5s!hc^Hi~J$ z4=u~5kS}w_HsAr>F0c;ZV?3# z&}~w2HoUu9PAr6J59(U|(6o9VW`kuTRXdO&dHLbf^{tF>I@(`6na;7AlGR~iYnfrm zw!s;^MO2ufUh^-EeLFI6B|0t1xD7ft-gEIT)Pvk6-7>v?-w1MN{HNbLh|zTb5HHXl zBanj29%*w8!jlds#()IJLFF#dMn9H z2hy$KN_h5VaWb%wW!8}rL;c;QlcnNmd6iMr8Lk~H^V1;C3X>h4E1-ari2$&&0yEwF zAcd-;JGWi)HL@x{v%bGDNF}0nJaqm2-a6%5EKP%i;(k-e(MwZQcP5TL<1yn8IsH&; z+&8G=OVt2jpjW5}XvZaFO^E~C&>}kc8zGDyC8FdoLb{#i+Pqq^=PBPHyzeonI4Zd~ zb{^$}B&qZF_U2%I`1Ttxfp9V1HTF?5-8x$&j)iYU)-)wQ{Z|_iL5Ie9oAtoL>ngn( z4kL2(e`ER1ee%z9OkcIyB_al*ve>Ez9RddU97^*2!gEfp5KIbCiiH|Imx-u7k zR&Uyt13U!|TMj$Z${$=8{Gsq-^ntW^i0$bnmm_)c7`+~G5F za*)UxY5Up!MTE?F(fM4Z*5P~2gq|Xe2M31yF3ZqLf zkkVE(Aes}P7Y{P@>6~%sTuO{{vWwgSk#cIOc_lf+_aJ^OSj!bC$9@`4q{r9xGv1yE zsC_~b*d3zA$6E}XGtj(00prw@obcAq=wW%zTwD8CA_Aj zZ}}vr0XbucJjyvhP$(gu^a49JFbBEFFxnaB7K*s4b3dgPKKsppEYwH+TFa9CG@lx zD$L`c9vTEOBkAucOL!EPgF&L|#j67K&XEK)sf3DX67KkCBOr;AG_Z)Ft$f1=XeH6Pkst3<2YKlb^#z|K-w`OnYKIfiDZ?DfO3zX9t> z-Rm;Ab)oZ0uhV8<5q)BC#dkK6&_+^aaRzF5_@A58d0Mnz&B+)~iYB3R!9CElf(ak6 zewESCYYo4lQ#p4tSf75F$v~Dn)zAOb>Gm_{^!9bp1}q20#{KZK7U zyqjpWW;c)rU3)5dqn8F_ub9RMIKXL^9g$f^jyJc3;(D(-P)yFB!j0%%4pLXBLWCn5 zF2$w@?bJ|36BtF_3SsgSD1)=NA(sHvcBf$&;fjAqi+<(qZ0}`Bc$3_FDJ#fNw9fgM zs8_&W2P#7`k^Fn$vs7{EznhW!=)dFwFacM)Egf?we{a$eXt4J;v7y>{N~ zTwW4G`FlV|%dEop4WD`>LbVploParDL7Y=S>{kd0Be~dOgy81=;Z;LM9aVZhGM6tn zf>u$e@pxui>wpsF z6tQH0QMAev>2`cte*2lT2zbf!LV_8G!WaGyEko*2!Va)vy~PmH=BGIF3G27nC$DPk4JEPG&<_2aKJP{G>4r}!z7V#Z{7sSxZmdKLbYcoa z$3UL5?;MvQkM;Pe*qNDmUiA=36w!FWpCpoP67M*@G63skgy~l6TFv~4C-=|@?RcX; zU)BoKsg#?I>T64Dd%vn$PBS7oVY8)`cnU6I+T28jK+fjs%Ja(_W4<*wf%KQ?0^#5L zFAbGNC6%S_O1`dg2of^2(36FB2Sa$V_R!N_$akhSju>y}|Ap{);h=HSDqMa}wGwNh zRWZ+T{I?f?RjxkEE4V*nYlgK=TGvBoYZ~t_jegd@$^fQGGzH z!2jZ|jiKC3qe_-C!zN8U%O;(h;&_I4L2Wb1`Fj5GdeLvhT-CbQ>a2&AGL)KtaxZ|T zSH6p1T!Z69i6C%XIh^JG_%ySJAcXET?FW}%8_vqrETF+!IQn8ir4l?->_*V}7?r<# z0+@K~3YpHkLCKm(76;R62(AKT=!bcygc(rrBx^O0ut_b|>3e^7$v;V`4#3b=gXqJi zsCXCrP;k2r+wSX<#=SPUhsdL=wVVlk^aM4*Z^in|Jva{7JtxK&eK6N~-_vs>+4%F0 zmDHr30^SR^l>N58J2%{3?3IVxdWOXJK*+Ea7tzQv7k2n zaq#}TLHKFi1XKimWf5FFl#4~3h#uch+V#rgeBedKeAA`4VZ8Ks5r34v2ya)WZ+5|$ zm1BLQyhqUT2N3I$?ti^$Of@F6Q@`=KaElLR!3~-ys_dZy5efe}YtBpH)SF5x`FfI~ z2k-4yjHW@)gC4fxKbHNGzSD$sC1!srPE`1nktxB-FbBV0^C=??}V&+KbA^)bsqc zMV>SGCh-{?;TYV<4thgdy)T9CFxP{xt0+#)hL-TIZ z8G}wWHWPyam)?n7-%`{wtvD$Uj&UaLgnUK$j+@amvf8rj&TmasZVPoDw^A_HW;_CZ zDf8Ponm?V?*Xys%6F{T+<%>TcfjeOFYfDU&9%1&k#Nyx#UPnNg`jzN>;g=CA&at5> z*I<#Uk>UT{F35%4!WAtKv8o3%#k&(T{zV7r6a*NaP0Lw!ITLvUZ=uDBSEtPq-;iEr5ei_3*DlJXdiT^49}pf;XQ;qas0$ ziCwbS3+PN8-urs{ONN9}4ya%bo$QBk*ax5E_rmlCetYho;fk{B`wnn{YQKKuSn-aJT78U75l}J50Y`H1L(TPd)9!$mEB6PQv zfD;EjbZX5ZWKG)(30Y>DK67Z^J{3>CUjDQt{n}0z3L!zC3C8YLnhCabHYR2aA=Y%; ztvj_?>UyILi<~RB}$VeON^{kW0ob%Xhoctm95It+pM}H4+XT=%OaEM{OjZPaY@W=MH-|JFkD+0QtD!at*ExsV=XP>i_E+%bg}!jgEuk`2p_+Gxkr5( zNY*kamr9oTSeXcwX|2KwrX^+T8@e=al;}0b z3Z8Z)aGES?W{M7%VtHXL;&%-R`(1hF_>47rxm>Q`7{38S{st@?UI=*#N*tq4i+%?^ zFu2rTo)AfP!Fd42WtUz_fL-BXOWstZ+s>da?@FYRBQ?uL2gWoCym3V@JPr%`5Br{7Zc(Nmk z=A1EUX$Htgw)240Az4CRs$Hn8UHun`!832Zd%G0m(p-{Aw2K)hSuKe}4~7Am#AFDc zgxkPF4i7lO^ldGgHeQp=hC~`QYp0l#Et0NfMB4~j8^j$8+G0hmXb2>69&v#`UQnSGO3 zj3DS|XKC%@^tA8Rn#oEf^QL5GB#>Q|*Rr&^5vwS#Wj^Y5wmACDH+OY(#|8(#5sSd5 z#gdSUf2_uRHCfZ5(e&GG=JvvpR}Pm9E+6~%6InyLo_#5-Ck+gWzST_gXkL0|M!Z_< zw~45rt>m3eX7c_;V58rsQJ=L^#|T}Y*!62@VZYoDJ5%o@+1iyRN^C zIVXk=EmEK^qMP~SZ^_^9sxXCFr5H53F+L?FYW3QD0u8Y>q}%uYd!j35<}6RgL~mj) zdx^Uxxzc)mRjxa;%G9T#)VTQjy>A*`w?99MbCYg=KFAd!X3~FF&zuV83~BoIbu8Qo zq$K39LZ}(exI^l_))6QYH-a4I-g?Bj%!u){1a|#vh92QhfAFjbHauPjJiv-0XFzRm zMxIn=Fxt-aiJs0ogz1IjwW2?iJkil9%%oarFi;&_DI;eGUqP~rFeW4P`u%)_&vhFH zVb}K>2V+zo;UzM*!eO`JHWPdwrYM4aAn*y<-m zkLn+JB})eGU49ZyJe>823Pi}6Dnw0TAt2`jWJ-0VZ?Wc>CvCn1^3Zhyyzx&@f*Ey0 zrJxbAnfgtQ#DVW_>*4?|*Bfh)H4CTe=U&p*oT>7?+^#wCdGgLjM9fTOehz|5$!=k3sX8Tj(ZLlpdqc*EU~lYr;Z9*mGsLflOS~$E`$i z>qK{<#{_78xCV`h*LKP!Zp9zLXQ>Me@E%%Iy!>hT3Tna-Ft69Ggb0VnbH(d;hA9y; zGef<|N!y^!gc8BZ-ed9e76p%}yp#eR+jpgpah{%Ewk_Vden(iPL|rj?-*@;w(VL}s1ef@u4SN3@q_?68>5 z@;HfqWkgqUcy#*3zWnuR(+|Ct0-fT|)qYa$TTh)5(R@Qy6ce_kxv%Jpo_%&rs9x=O z*aJ?eH2c|-{i5+^3&4?HuZwKtG%O8);KbHef4f7Jy!G__CZVL2@?p>75M@{O9{`Jc zxy(JReVw;o zHy)g3SMhN2bLF(hG4OaZB4oVkz+52Pt%ilWhB-&;g2!57?{IH$lEt}`%1U|c>SD9h zJrH|SnGvX+%U;if(z%*I^E7j$#)*dk8@<@#-qlNiR`ebfgJ-6~6ad6^c*S|YJhi=# zxTHw_%sEVW#vM+#_y$ozKkA5IyCNzLlWyC<-;VDpkD`KK^f1Qihf}}|TKBbslxdkc zLnx|+?S7uE3lCp{G1%!j2D2m5i2s_zcUbQ9o&v{Go=c-M9x@mTr`oq87{(4F58@CU zY|x*x8&daJf`y3#vg_!NZ$b=6=0U=>87@uzDvmaE`f~#-GcsIl(#7%MqfibhWu@P2 zJlQur=gO-WE9vf+w|))G=EotB9j_=8eM71V94dJz{G-*9&#=D_q8xioc8g8v* zTgzUPEg=ihDxqc|?Qy8QY-n`|Z~UO_I~=cUZ1%RJ_mg*K`;=#sS*|!Iw}=@{@GASi zxg3~ifr%QQUmDu-QBbHmPINY6m;7`*|3*&Q4LX`k>c_G5L)dV@6gr9!{A0B?d;dO& z8H=IT?OUiNzmw6e6pmm!3y7&}$V@`bVkDnlcSTc+3?@XE)aF*(WfN|OKo={8&X!s{3@_HIdAS&%4qGgm#roSJEO ziC`QQU1~8fLWTjOWE}7Q1mGXK4NBep%d@SD8v8g^D1E7GBUX9Iao^+*0M_y{{#ei7Jg5XH{ANrjq1Tjw^>A*Th_U3T zdT+8P|F!@5%8M-@ahli5@qAL&d4Pp-W8l3zS3@<9b2h1ivBkcQ!`GfrjZQk?1#vZ=p(+&)!e@YH{&j3?_ zM#4g#FB5~^@gF3dmuJ5ixL?_f7Zr%?L|0?5mpFCG2wzCqPHJ726k;H^WQ^R%;TSu0 zXFNj@EzRnMYu`fUz~1$;GkZqsY5Gnh`%2EhisFSGm|+k2!(t1y6GCS?*q;2#>p?P- z#6r&ckW82MQWo7Q2!b!Q?UdW6iNiK!XLRLzS#<$o}4HM8Fr^Wu|MYpmf;svC%{ySPU1^cx-) zRYBL!3>S%S`p*|JL~IE`2sO)ZnX&h@<7Pz4GDHZXnJ@d!1XMV`SOT#fd$B2um4nBa zgLG$95(#{M(67sh2g1KiV8R{{x8WyeGt%4+A%-YNuO(>C6NyQwq`2>iamg7cZs$Zb z{C0VCF3E_mO_~TT54kciW_Y5W%G;_(M$Abcbi6es@JN@!<3(IX?4^)M+>Ol5X8>Hz z*4meig!Y&ZQcWHN@i2P!)G^XX1dFTW$1yH9Ts!tPI1T4)9dCX?b1$*KSZwO<%l&l3 zmrZn?`9f}Lc@je9QY$jM&rACivo89Iyw+P%P=cgxNHRWF z;K`<2yz5Inz>0EUZmxv2FlRrH2gcEN*1Lc72(>EeCs`zJM$F?0dr31quI7EOkr5x_ z#~WGl4+6VbxQyj)G$4VD4SJb;+$0I{Sww-d%!p}T7?NEpFxh}OUW4e=$w_8 zuii!)FP;U<#e4wBa>7 zO(wxF9-Cnq*gt+*W>VJABq@L0evDp#v>M6)oSdjk-;*g+Q!K%uQkp(hDXpr+3;@k6 ztE}dlg5SE^guMZ1r}_tjfYz7B4Y*#}*<|O_5+Zg&+jUW{u_MnT%9*-AZiV$4oA$8$ zMci9Dr>|iw^bsyoS-1m0o{R3DUl`}F)N^FWSB3Zb+y5jlMLY*bFHFg4DQYxtB z`&FE|WJS|S4<;0>_NUntWAz+&xH(VT)#&xPjtIkr%U^=@hi@Y>4n%V$%{StN`TJND zb|AI8E-S^o)Ys$caSkmd><{*xQ>^Pq*Fjx2({EXf9vyaTvYt{c6We2vAMHL#G_srl8PBt()LU<-qAQ}l z^hQQjUS@~nbaJJMQFAe5OHB_cD$Z=USTa}CKD@b+D7 za`SuEva%@%i}fi+bt_RVKCW+j^JPX~;wVg^jna3`qfj%eZ1;IJZ<14~Q$eBMVlGj^auu%pw~W z6s22v1tQ1h)wt{0$FD&)teu-d`S9+$+U>g6GoI@sADPVB+`@51Ih{L*TWvbtkoobI zFxB8oGZ96OOS8_&%llVMlt$t1tOi{>`|tMPuBu7rh912YhMVW$OGXPBgg4GKESU-# zrf2&lJnOWjco<3Y1~T}UA`kJ0$V3(!-C58S%ms9YzvF1u69qzM*T#yDhzzghDj*%Z zb(hohuj{0O61Ngk3>k(JcMcVh?kxeB8eiR+-hZ(E4^wi3h*HAS#Gsd+8(72y#^vQc zU;HL4oc+jsXT}1!lkA zzU14>B`>>lYaJQlzVr50mhq2x7-N~@9bhD+5pZHWp_9WYIl4n8K2r~mI@xcx%2BBK zB<~GVH&c^m)%25!U!>}lTgWwr{YkKT(Ru<-g&wVJj99`HH`_6_hddT$b8KVZHYliv zditdS_>`=+m-krfCGO+0*Wa*j%@rkBv41GqzHKp4BFTGtuZVirud%jk+JEO1HlYD{ z?(O}}VCEhc;{orCXHanEn{ApvU8jXl=4jAY~m4ddx<1$_HC1{ zi6mQmkPXIqjch+Mmt<~N?!q%=*RG#7LT<9gJgylb|8^+{SXHTjYF7Wlr_Zw}?yuVS z717z{u3*YZ!EmxT7uZlMtG9JGOz=}!d1HhFsrt?3v{}(3pT_yJGDoU;E%JL&se9CF zeV+rZS$M$15~zpB>yEF>c|BiQB;7aF(nHD*kdLbn_0Gmm6)$8iD~Qlk=#2_SP8s3? zs>ZJByv+L_C_O8s5s=ol1gsFB1L%3<4A>q+dNM%%ad)>b7X`?g_3-i8?*}ooNp;C} zD^hv9j}4`2s_6W28{Hc7;5oC;Y-wSt@;lmb+tlCh=D>L4I>nyz-Y`L)CIh``YXNA- zu{=m1%n#1%r?&}>K{UyGPWy)f-llh&Tz4kRzfHsuK+Er7D2_-mQ#WZWS;&qcB^Z{W z2%;y{lYA`qcxYR5@3qR&h1)cdVGz#y44$sV zRV(s*f;BS9-&Q#kj-7XRlp-6+D(R8t-eSkMVRLDKf#|&;W3snSIlHL=@9GhLuY3u=3}ljSIslx_dKN4;tL8z z_FtsXocA0_r}>4f)Am2OL5P||#S&ZDez>KceqDUyuUB1r>V2`kFEwlj+%&Qq+G->V zt*ns}oX-nT4cItTIpdF}K4EwLm$6q68Z;FOMQ!gOChH|^Bgf?LTwUKJ*ZKE*`p_?J zBanSf`Y#s2GK&s-BjYC@aLJLbOnXY%)`W!i%9UrVc7BX4&Rp~#k@8*0wp!Z6k&7VT zZ+bW8^~<-iR^7bv&qNl~8&N=eM&u|{s3{<6z#Gp4dry9}2efS46r6}Sq9$T!>*8P! zo0U%>#f1F=!*-uMTHX^c_Jx@SMmOc#rSMC(?YjC|QCtT`lZ5_VoC%DZVrY@2spK6) z5L{fzqT1uDAl1dVcrp;vcaCrl;rV)$pegnGWXg)`ynDcdOJ`X4;;cd~WK#{|kf7M@ zhVQfmvgr?e8jQ)S{khR1MK5MIS>iV*s$IiqsXic$?WMYi8-8dvubC-*{nKI*os6`V;e1c#$G)-o&3cNU*8Y3&ryYK4s8T&6d#&y~ePbYT zOYmEG++MMNt;;i?d$4A|>oK9C^uK?VSTVpY2^hGgQy8V%&iQ)evFm@y+?8?ww4^4f zZUkza&|C^dk#T4Ne*eeO&+(o(y7mFD%>WGI2(3@_sMrl_y{Ndwo*1mHLtbUzYcKIh z>68qGE}q6HBSo#9OQ9(-;@VP_iX&{+Js~5k?;8;Kd;$0(Ci}#Qm(6oFE(0Pp?!w;V z#lrr(`!mK~QS;#`2mReTh1Q>E1Q^q}6^p)6T!Zw-a&oKt0UVs1-y_njPNS^52@&-4 zEVA_st~ko=470TuvHMFPtiH=T-zH<<5oq{?@hS9_Xxx&DmD+TzvMg|vflqXpaXx_I zgz4t{8BrN*F=k|u!V2!d$nwdw$iYnLH`MqW(3Q?CA{;p-Umul~%ujZ;5gR`WXaz%? zU*~UV9dJaQW1e7fDEc@B1jHW&iUak1qtF_lXFgL4C=b0k-35sMsRt%lWNRF6h@2vY zQW@Nb%tIEb5`I(5GhyI9x{Xb6CvXnchPDxLH#VJ8K5Lx z`q&6LV>G~qNfX~=p>xiJ)OUL{hr9-p%4lyxE%HsWGiRl}7>%r#*Dj+U{d$0&Y@ zyfO=O!M$q3tBiW~xmQt(obPOLgkXeOZ6!b$wL)L!)2@SiL?GNAJ^| zL$(R8vgjQSa8}GIwXiU*U4LK~Rce{!)c+i(=U2n>xcUZuw4c%LVr!Y({34A3dH$aY z<3{lvsHx_<^h5ip9Uj-v1)5@JsV}#a^ko2|)9XX74rY~qkK7F8OwRU9SCNSt{DcyS z)tvzr+To7`G$miSDZat89;Cb*u_OyjVrVfK^1n$uzf$eJ8~yYN=sCq(N!QZUWcfUx zZ*a$EJ%04H30c6IjC<8)ia$7^R%Bej!!KZQX(s>!Ij%$_n*;AEmea3Q98pt<+pzYq z`zD~+?Re8n9k$7|M^^4!hg6nRFfQP5QOEVOhiOG8HB-n zK<{r7p9ff42A#o4wqbbp@! zMMWBl0Wtm_KcyXmd_?2zgXf&_ScNLJHJ3mzwM7Ak6{QK=rK8krzw^i-LfSlOH<8)O z@73H})1NVO$hN*-&@M3$%a8!X1%Lhx5N}dFjzp!^_DFB^0!7&2S4Q1_O23XmSZ8%|@xPiY<`vr!S z$<&HIXjI)e?Z_|tFneD+`!K==7w$TRsfKQx=b7YuJd0}rjrNIo52M1J zE@KrnR0oqS6X4aGVP8M&y8W{Qc+ZaOXTa<(4eOlAo_e4Khg z3nuhYO!d48k}1l}1}Y@|EJ@=mJU^vYm{h8clr4nRq1|y1`T7Y_4G~Go6knX#1N(H4 zM5TU^fHT}>CM^9-;(o80FfJK_+R^$sD7oOz@*88L`9fe%fF>ZL+A+8z4H&Sd0-t={ zT!f7Zwl=OjG=hxNy-YTOD9{9L_)b=>cJTd>kM!N@iLB}s$?XKNOQOck9?Pf|jL{nfs)U^)K`>D_-uj zQQ~YNIQ|V>`5_=qeC4?>4jXw(^f6u7?v>$&iu6Ob4fw^$w#}woTiXw+32``nJV-W~ zyuV#P{-)MlJ}zm+z+4ySJuUNnPP0fVM~YG)>`MoS>{JEl_W40#Q9Q6){m?-X^%z#X z_?je8i*1cn?~lReQ=&ekKVpdZtDl$@w29eO#RS=Kel*HrrScWVfMgxySc-y4<>JT2 zger_s`NItod6Nf&Qn9%!dSLi|(G$@>h`vv@P{vot!OVP~+Tt$0{m@nP*TTAset<`V zCE;lww6#GT_!z zA4t#t$)(+t2f#|12T;-ON?w|rjLT*UM6}ou1@zB8OPili?jcn&I|W8x>vMJ#x$BmRb86A~x~^YQQ`m7<(IZ~WNQ|`9 zMOqbLo60F1-~gGXEf8;T*la5|k>}Gv09&!bLeAma_(En_&h#%F1|7puKZ!x3{ zNda0+JzR+qg8JTME*mc9C)kCO2tE2A2m&40iEM8QPtMAXt^)LC*s7I5&b^(vTQXBK zLTU_C4FcOKm;KqMPS+KqMLt6x2I$n=mQxiLQX0z??Aqasu0i)Mi&$>pc)rTO}GQY>r zEpy$J^!Bz-hT&&Oyv0U>?TYPQ!Jt!r1f+lw@;}UJOh@x#B6ZY0`3OqD0`9!YAm`Gc z5#br}(<%kmGbT;oLMpk<{D8|+kSS8IM~!va&obEaHaoU6E(T2zw(L(7;aAfU6Tptj zf^{tXC$+wotwDZEgOT__P~UK(MSITfN1g$bXgFOgp3CF=FB|^a4amD_Gu(3bLXO;k zIPnb0ld{*b8*!DaoVwxnNeb);6eGHwXdz7}+myu3EnQa)@r=Rh5&G&Wy={=2!knyU zC&glsp46Rb-I1HW-_0@x`ta(0qTO^gZ&ndO@jrYVz+ZH{g|<3V$ynew2V6%Rk5fkg zu{iOopX^P`y@U|^OhFZoM=B{=8=f6@UMeZy)l+Jze|rArq#rKiy%RMdGCS6H>Aa^k zWYJ4xsUVWWgTh@A-tSPIrb6!eDK7j`h+i2I8L1d{ z0^4Ph8vK{)Mr5|h!}?OlG6lx6p60SALj6HEtaX>5Sq5v@uY9uZ{)(U$;(kI*`6!Lr;Y_P__+Mnk?k>ol1c5c}!Kdii0#O53v*QRWpT&RM!Tirb z{GVp}KDrkj+WGg#ZM-z7%Fh(NYr7AqU9Jothcuwace9YxdF^+augASm;$I0FBeIr# zpq-7xoPP7nxL3ZA=^Q|q=Tw27C4XQRW-A}jMUGtl5FaopWOm>vD|6~Zyk*dZm_of5 z+avP;*?9b}_Ja$eQi6+4)~NL(74m7rgJB>l#iL&SFyl%^vFl_l_Se$a4!wnZ!axU2 zDbFbXONj9-pH6iuC7o08^w^p z#Dz(>KR!~DF$vUe|$4)2eXX4UQ$$l1@AD#3AHBIMdBx=m(Pv#YqB2di<32A2x zCGwro>ii8({LxH6DaZrYYkYmqh#-{<Z)EfRU0_07#j))tXYhR>9Owvvj)Qoc>u#Dy-+p>* zr~G|Pmt!zzH{g;zfakPQjauMoV$ea9P<{><^g{bSrT-Xy{MRx>NE0EBmxBrJ%x7wX zMTo95sd25s_WY;;c$!eUj6G2TG>zWLDyBG2OYi}#DYmZV_!v1MT>2-~HL#}X z_owp3oe6=-_;QyE2jdz;TF>CjM&%d4PqV;S&h8s9M@U7GA?a}TP4@Ei+I6Z3%auYs&`L82GAF@}3ZyLduAv#odMX*0j z8mAS$=E_O;KHQ43+K-gb`JVvC|Ft*+8-s7TD9z=tofv--2erNSr|(YUz(k2HLts$! zo6mj+h2{0dah`sSO_qWA#c{*X(YCioebvi{fGsEVD4ZZF)i7U!=4qYtN`zNkd^biO zN4@7t?t3Sc(LvCu&Oy5N)5M!@IqbW$9Udn=R!oKwDx5F(+=N4zB7}(Ufe<0hr$sP6 z07Z4da)Hqe%e4X_l{B-wgQc7<`%tbpwNBj2a7?Nq+U>co(?Bpin%r=8&?oRTZN$fq z1dw*E-4;){?xL*+V$<@Xs0b@4S4Tj%&KU7y{(vVp2EbUm=X=30YBi8FOXza^nrwJ;9Y&}Zg3Um>qwS_n?Dtw)>ss0`#{8NYZW)5b`Er2pdo=W^Z>yqoc#cZ_W- zO@fTb+dpunBWP8a4L3fh710foBPnM}%d4$NJ7oxPGHREZisXF(VJA=f<4ld~1SlzT z0x${~1)>yz9H4BOY44-GA9;jWiQ|B20i=zZTK)kNP$})pzqen4o+u3ep^R%MKPB@9 zI1qGm7f^KMND~g7qO$Q6Bj4la-hVs}P~P+wP`?_UNi z@8}s?4uyxNLWmNU)9z|>F4aeGOXTz^dYx+pSh@ZGugr5ov~$Rm00Xo>_$j(JdOlJv zlw<&ipsl{x&%PQjF|-0Ea5gqkxL-V<&-$JkVo}g81{G_)Z=0JqBI_>)vA(5uxc;io zWWLb1pkv|Ql@m@-gquDZL0$h06|z!h=JE36s>@1R*@#T-dC77en4Hq1Iz4vdCZCccmdW2hQTPf+pXe2cU&S01B1w6L>T(~nT!0u| z+|PX?z(ZeH2qbF$q1g9yOvBQUlM5BAmlV4hnpJwWfda~Y}?Ds&B3^ri44agJ-Y7wR;Ih^zpgL(rx>0) zos0M78MD7KEFNxc#_k?ObIY@^XB0Sd{bMcu*E&U5K~1 z6T_G%P?2mzoVJRfO6{Y-JFt?V#~_X+PFGF2b|c7uR0XAHK%wfDH^-&^ETL}9U%j}B zL1kkJh5)PJPN+6C29A@-5M^04HQkPH+tkZUoc9zS=7STzW`~$z=a(E*j(8$iRS|>o z4^Us{@G&9TTg!!!vt#yuGj!S`ZyjRW9z5=MDd#xw;U3zw&+hymRr`Ot-GXh|Pf<=z zEsR4m%C@!qp)5=0Z(Gx;zyMAYqTXCAX*j~~?BMR=llO9=c*(Mk&7D}k-owhx@;vt! zS3iA-t(YEGqO+Tf6f;&l-wM)p!>qpVc=EH7DGMsqK3wEIiOgN? z)07hCkTQlhrC!F*Hh;1HmejJI5C^v5O5M&CGwV6zK(o~7Yd^?mw(c>ieTf>{rwQ5U z)Zb_ks0rBu<)Kl%#MJrmgmG~Pb#H%;v~dDcm?2FYPO?jG4~P-lvH~^>Q*k`{U;1ZU zN7b;rzmpXfW+!4A17~e&X8kP&a3a-+ak7;-{08) zd17lW`&5@)LN}1!usorbTV4n6y4o2AFuQ3w$2yP-f3N}!igP_L)MvMT zlY9CUz?M@srNG%|e3pIlMc!kLz3Wt@gG1wyTgJEZ7W*#{DXm9-7=irN3r8vfs%^Bb8~8Tx^} z+g*2?#2DOKb$Cl;B~|}=1Q|*aMm&QJ>@qd zG&pHwF%ZI$kEDV;iR1JItZRI)NBhI*n&KuypR1*$4&ra5tw|Y@@=2%O7gtHSk(0VB z>iCXJ4_xxM#n2ev>W}|81ZFySl_hJBi36Xto`4XdbX15?H1G+_4hLl(B?J#4R0eSy zR-jNJlMeYEq=7-KR^{F!eSI{FkHOw8M`Zl^bVuD8i%P^kQ{85&;v-A-JD0P)Us&ks zTJ*l(9Z(t=j$9jw);IOQ&8|97H264M+4rNv^6pe6o1v6^VF_)ZYV7k1wDVB>kuiV+ z+ZUUw7&V$A{ge$M?2NESNfotr-{ca!Y1zAOP?Inbh&ZTJ-fkqPDjI{Ed26%v6|@W2 ztAhnow!Lj7qiT)Ai4n#}4Cb`z{T15wz)3n805V$}8d%0fK3qnPlf+~oe2P_lau29A zgex$IbQw=?^@1y6E$0-a9@l%#NRvy4YzMg%!}Y^z%RY`@>)XU+UgA!;j;z^~)OB{@ zG}gPWo1v_0bgEBDCb&-LC(F$Tz!utFbMb#iO}ql+Y};-OY0mS_XNytbfD+3C#(oK8 zLP`5#uh0hm-z~*I&yzr(&|5aQt@Y0cI9$mQu$MZ2+i^m$(JN}z?JWaa+K7zB|Jk_+XCjDc$);ced1u-Ru_l;NPS`C z)zR5XOYsuIJ&Y=Imv)*#mo>K|Cj+&exiT^6h7z$R^BB|i3xj&9PBR2LVV)u4aMGiM zU@pt90#gz--at4LI_(q-qA`RNW$yA*YViR<5xs}ZYRhN*_UdOi6BA{o-+bKivtNIv zYra02-u7B7{O$g{Pyuh-&fM4q6OUZ2$wxzgr*-vwWh+!CEKJ60JeF9+|vN#eSauKf9B!B zJn#;%@ro#tAHseOIJvupYknr*HuMC4orU}*a0ynEDrrRpt$PfFuY3lXO^m^J81ky^ zrpL2IdTY0V%7FP%mNHH&UmSk|c|juzGW`$8`v1OQW#+)lQ6G=&o~zdH-%_jJ%Vhf& zKmUDJ$aoSF5fexKBxXxeu632{)yWt_Egbd?9Vuap-n)On=+%*Wd3Jh{4HE|U|z$tA8hVGL2 zkX%3Lh8%#r{V#1RXs5=1+)a*j#KA1bmFx9Aowe#y&l3Nk=MDV|OeHH{PwoO4kU`h2 zCpaEjkYyT%HJW`=9jePBCDAkFG8mMKv*ul_3?VH@tAun&NryB@gOniBAsuIp z+xNWhIp25Uul-YWtIYGPb>CM8`{X1ix*sYKwW`Nz8GHn4wAfFpL{2nI_*36#9d{VR zedQ}oBiUUVZ>}#U@}c|Sb)|sy8f{>=Rzr6%;!Jl?>fPQCxnf_lPvgU;A%GupB-e*7EZ_KMgdzVK%mMDp^IpPjhcZc|UhNIT49(BdTfEQUqZ z$ggs;aAd#!y47$F!WGo@rT!f3|J%;?&xP@yKiSiO#d+cn)N(HnZEnPU$Jn!EBmcmP z5Os9ZxO7Bxr<;2)qyuA`p{_i9$9}cpV!uOgew6(xAh8{vjRA#^A8%T66x)BkT!h`l z|98*r@c~<@!f-?^7;-oi3Vbh)lb%9UVzu@H-vvAptfl-cfl9mE8F%PbEE*t=2n-Hco`3 zqZq%`pE7uh!nX8$?Y*5!S9RXefJoRDD)+f38EEB}@O$MzX{{qX#|O}WH+b~FaJX=q z*i}pImw(2w)$K0u{EYMczb_*He(4b>1coI?yDcYSJL0413|M+6RZ@SyY9uKxFMkvv zV>iw0a>6LK&@86|Wma(^l=RD{@_QOlNsuh#!NOrz$>E5Ne;X@82_xBYxjnjq zDOklZCZB1&TJi{Cg%|ObMXui;o-8+!v)KTC5C9J}hfvQoMm(p2wMB@sQcG|f`2$=f zi8ACH{amQg#%&u3y2LoI_%6W&-V2Jkt2bk40`M?l^<*0;@-xSlix2OtG!zLBr*jfD6}$g=g~M~p`ECZLAc-I| zoDl!li0}XBTd0f0xz4ePZuHC3=TW)Qukz!+Xdsjrt4_>1&Tlp7to+G#(i^9pAi*<9 zVY)0|1)?bK#N4X+JJN`i4jS3N5(!)4hE7l&g!f)Swt_hHP#a!9zw zPK66AIR91i^FzD=dy*)>+Tc=-Ocbl*R#`iqbEOKn6H3hJ_zAx1!D_MABbyncK2hScqyM-+ zU$ZK@o)Mq5C9?R79i%^Y)Wi$Y>|AZtps>?9UHe_`%cY|~d%Y63so6&$2}K5GWU&S! z&gsToXKD2~8C3N-vs|Rh63d@7SYC3p=TEVwiLIU4;nixR* zStEz)PXIA=mlhhe)S6j|6(ju>KPk2b{|w7UyzVf_rJYHv6aW~N_U)!i^SEH&->2nh zF`D^SOjtrDb`@x0zzs>~CQ7CZ=%mNGD`_0y;sS2ZnPz}L1}B{^eSYbrzy^TXDv}W6 z>acv$S~Y}1rvJ5P!!v`qPtQTS+GiT)uU(^$Ji)ob2asJJq>~(^30|-U{s0Vi`Lvdp z)9*hHWnjrv|0e!)d8*6-&C_b3(Q^Wo_%^uOR&@2_Hc<#ee-cSz)G4HWnu-EF_q{uk zdk7!LAI~dH6?nXkENeYN1tufLzalmm9Oj`%Ba9gck~!vqH((P^Map+GZAJw#4JE_B zQLr8?rr~CDjM7+*iMZAKy!}W4tVS*g#rN10-We>uVQqF2 zhC98^Nq>6q!vnm3_c5jCHYG>nMUbB+hz^M5UUgI@=%Op#mp93PH6#Y#l@;lF1Sk?A zKw(!!<(IsZ*M-}@j;(MM3*@QmIqhzq^CrY_{e{d4`7evme;t@s8PP`@$KWO1fC?&? zZ=;L+*KD*PCr;9rAVNs;)qQ8qiu6qT)WY#?h-(`NR?&{{2b)^S8_4K<^mn3ZQ`$_w z46g}6^Ru9{XAPPSOZ6CU_rsNx1Hu<49>MC$$N;~(@vSKN`E4Ui$yhC!I7C0t!U zOFij+ZN?DJhmeC^fsVx5)m#I=vrfZ(3?)9SiP$+OKCT#lQhkqXMyMktjn7^nQvO@= z9H0%G@dMwGfbfj)oQ#AAGQ?=KI$)NEU@!q;EkJ|S&3Mj$OBj}?peG4Sqy34vtT6jJ z10wBfw1YreRYk zraYwn@*ojW@&!4KR(V=vIEDtkTdl#=UI8)V6=#>Z1{tK%SPv58o*3W8EP70dWB)-K z#3wB_Y%If+sFL^K_uhlw2>Un%F;)l14BK>WsJm)+EKL@>*eKpPLG4@lA9VS?0G8)F z0}d%ZfZiQmu$Vb^GcW5ij}}CQA@sf|#=Hcd?+al4$#9*}24psfx>l;SpDzx1P;N2 zePB-lRSak5)77*m*c(`rGT^qi6AO7S`@{pse2c!-=crCH%XB4`Y&i}Qd%Yj)KXu5w z0`<_y;=?k#>-yUY8Ts^|1MC0cM+YRR{U_dEZ(l!=P4NPqO6ufVONY-%3la)^|17i6 z7Wyx*P*AbE^aPmoj{MoCwgHl+Gwp-6%<|HcxOQD}z7}J1$r{E~UV*?Q}(Fd_oyWQ44I=kShj7_P3oB z%3dJ}!Bk$Wc*cx(kOS;)8dlORjjAi;sDc__r=Lp+FL)<<9vs3DE~^E5_$&wh9Ge;d zM-_Pwt=b3WuB5l{BoS*|2`F0vWb$21j+>&yi&n)z;5#sIU+2tyh6q zotg(;V42#~O{)j{|5c6j%RI7B6W)*7HB*W=kKsI8m zz^fzdt@@pxJRX(3S}ZFM&m*Elto$lHJ$xq-pVQ7xCJ$-?qv!$X z3E&1*7qu_aK|Y8f2#vNt=1!n#qi^y^7`Fk#gpGotL=!?0)=C#wr|LYm5^eJA1L&v` zWeE~BUV8AJD2Fh~87eefdxu&u(ivI#JzD?`2!Bq_x-Tyl5`Z2k?J|l%;#FqN<9%$~ zQ183g7=*d5`D<7{ozJcxRDRlCC}J(4y>zoD!_r1r%~e@yy`#adAu4H1*KcsMQxc}L z+gofs)`80(gI_#l?Bugm49e6pd=7f~^k(1)dSBuq9oR*@IS%vQC$Lmb+@tIec2Q2} zV>7p7l?T`G*3GmKkw^N+Ua-q)}Bna>$Ln9z80i+ zw%)s!gJ**E&0WF0J8G>$>jo_mh-Y!^A62iT5yoPzgUo|ZS!(ZAQf?ZnFj27W3}IQ9 zpJ?wMeDAuR)h?7Xhp5I$)9Bu#vn1oheNuroT6&5;?& zI)KK%Fu^{9`iRRClt3ZDd8)&4ZljUJ=qNpESZgEd=fkZX_g5sKI0yr#7w<7EA|dLw zOuL1KtwCQf^SXZ_A%ir@TuSLwAXf`34l3tldifJg#|@XWVzh$%BzU#fu@js`cfO>DfALOOR7vf0dJjjTMkBVtf)4Vmj$l0m=c}6 zb@DE_fpv&YhG@1-f9LaGD`|b{{GS-xvIUtFJ0dwuDX-HZ({*@3GF=o8MUrlAb&$(@ z%Y(SklBAr)8g*yU_raUws04X(=tO>(_#^tEnk71q0}$w~n9=H%=T5h6M~J)5+(VpO z{Ye5n?kVfMP8|IGdWF2(ec+R0OYS9L$88&`RA_#R!3B0AGHkAO6B9nqU0Z4WcQ*;t z84`XX+*~9gkWau>*hYzZ2w@qpd4`E|RR`3^o#}hLq{b^%Q^vrxMVI7AjGsYO^>;zto@Z*Pq;N;_puHF3L!qAE^QS z4-^xM7}e3^ZI3;|2A53nW$*r}{Q>d*&IFJgMA2`oHWUU1ECR&y4heZW))`Ug+jn-DYz%@j;9!GH zW_J}egUlkP&6kR<2H=41J&+>`BuVp-R|LVWRl*_rFL_rMP8V$SmUmFjG;WB2fp9RR>7*>#ooE6R6)n>zD&H+Ug5ZJ1)o z_~ZE3%WfKl!?4zZA(Im3q96W0v-Lr?*=?f+z1*(bp@MI2E?O?OF!IaDDm{ZN>&z2K zC@@Xp0Nj+`?3)$-v8Q2okhj|UTjax6jXYejcxPCt!k&?2qL(4I{P-PLSb_IJ#(EYD zN^efK7ywid2@ruLILuL_4x%ns82g|4sL}iVPf|$2vggEyTN$?tXW31A* zZCOHEfbhCNyV6`;^B>T|Nf;dta{6b~@kfK00TEVUVc8u3T2jvl_gCZv|C5*lY z@|+6abLCE6TeEjp5!pIL)qkTBYUTlMpbBJOORCU`)Zyuh?*M`p1aLEff<8c<4Xh0q zbT!P>O}J0$>EW_BD1K14NCjb9y`}AAj(^Z`1RZMs{(7IQapcS+jbbPj5z*j6Y6I5W zn3ai-e;HQ7yC^$1%kY3iU=LH0ZR;n`qo-`h0dhEVPTc&}Ty&v`87lDa?{PtwUWuDi z+kiOkI2O383;nmtB?5t^{PxLw+HX~x_2K@nl={LU0}-~L6-xH>D0fBkYdFaC@azNt zK*ZgEF1wPQdR@fefUuZ30S<_9d^I!=^C9oGf|Bn2j2#oS7 zy9H8O5y`1~%`p;b7)+yYvd&TP*T$$uVTC=Trx<5o~Shun;P zYk_Qol^1pU6NHVjb?yH#o0t3Cvq(luWMv7i1o%md*B9H}4@a0V!sr;_ri4nh*> z)_}%+(fdHIYZtcfpt9gR z5t3M#2;54R0cgd9m8{ z+>lqbcRM)GrLKT`<#^DaY^+qz`w)b-%pNYTF>Wn~9GB|8Y8p7+2XT*_yNx_!=IiHg z4%Z2@0ZF&oE%k()dzB1Xis#+rIPcg5Lf7c)6mC*3w7xg1rGPtf)=M#o)oiB9%3@at z1pHSzUW#e{+3tF5(c>pHZxW{G2uvK|8i|>!m;vd|KEb3Olq^j7J%OOY$P8kx_wW|IBA&nAe0`?Iv zaUd;-nK^%7sgyiOz46XP{0Rl#v@M8>?Ohj1p~&Dg$^r3`?&4%?FPKz)X6Z3uYc{;+ zCoNJO&Dk=({VCJ6E3#u%H@%x20!7~kNh~%Z#&dH4XV4GMpl}CxYra?b zp5S<)tT}_un|$rhE)o3h-kB=rpzSK*he4kHL389h*t61UQi> zTVT!Dc+fOj4ieX4Z&2p2%!v%9uxx(3AW^)~yXPf=yWYu{P;YVueGarJDB;Ll8iyho>L z0-03E(}AXTW_^@EoJdgBtTf22(q*SJae|a3?N*U2MMK!$ai*0-(89-z5x#C;YeyxeI)&`{&N&ff5WU{pMn+hVr55X7CQ);o(; zXB=Mh}A7P<2n^9V53x}&}CB-EzsOEuI)Iun7s z;n-_$kybP{7aSv*N#}edFV`@#{QXiGuf!8Uk(*#ul`qOOAol$l?>dL(@h<4Bx_4AZzg5`@`Sq_jrGoPLGL5 zesww=mTK}@{<_?Wv+X*WE#<9tp>D(DcZpuK6zU}8X50Q1G2ma-?th!#xWhp$>M8vN z&59Qs5`35PG_f$-rULg6OtvOCz!>Eg(h#Lp~CCr z4IS4&f~2VN-8nR%w*4_MP+F@~^PaT0o@vS_@EzMm7lqLIYA(pa^vuis+H@hy4kBE+ z5BJ(*wGMIzijgxo$oxh}W%gK8yh(?MI10r%pffPi)ECON|M{BfD|D?n@x4x?A_`2D zi1|CLe($c}_|K~PO+&@~KJR?qMB=SiYiHtN4o(x=7M?Uu(;M|@v!<}qQh6+9_5k5j zEX&XWG^zn|3ylgw;-_C$=gOm~jpRm=d7PqGM;ZWo`$iemvu^~nCkuW(G_hRAT1C39W<$!_cGEl~Y zIG0ovlr3_+-}ZE#Dy+s< z+xc*SY5*X<)|;@FYiFg;;hHSzHvkZ}to-&tV;1Jv=@<`5s~I^(eHJ9xAP*EU{N4pQ zF*f=+qH7=HtDuYn+A<&MlU(Fq^xvyM`2-|P<-{r{jg6Riu=UfK5)T(h!&oYfNcNvw?Gasf}5YNPJf)c)H63<7YBtK&uYlIm-< zQ}0YyzRb}$8rh)>s!23#wbg0zat+E&pjz)uU=HwMAd?nyueyqJ8acI$SZKb|wNWg3 zn%&Q3g`*wjDd?DTB1v?YDKBMG8lVG&P6C!b1eLb-p~!r2F`un+xvMht`;XA+On?7+ zOh~mT#Xxir#{ded998B(-f)uT_m-bIICdW2n^y{^FQqwd88z$HHq1Ss2qpejW`stu zrlX1xk5qm46F3D=u@<_ zHH=nabp5g#{S~zC-{%LIX{NDu!ww(9WqOq8fb*`b706c55wQ$!9V2WPd@jio1TI0m zXvLiN?Rg64O+H{4r8_3y0qDw*d4>wN`!#J>r1>Cjb*^K?OL8ZRF#gHeR;LoTN zR`t(m2<(vfC?kFy@Q@-DY-4ze;aApZLCZ~KTKJZN5usUJ;q*`NjHtTBhbQPkf%9U2 zTvd%{>PU7|MU}J+$hBghKNotnAj|`@6x0UxunZn4sdmeCXH8+fGlywLGrOrJcy&v2 z;2jWvn?&(R-yI9J3uMOZ-_QSF{}ErKf7;;2Hbgv2qEwv1wL%rVQGt5<4t#qG%!OCH zyzp1^pTCJE1who*>CEKyFPpp*!WAv2MYpTQ<`~3aInvl-l2jH zS9kSjOzMPUK*RXpD;o^BSW12(+j00dPQKslVVf+ibxjAjfp4hJp}W2B2wd+VIh}@W z8!L~VU}SNSYo;4i#ywDIjI~}xbLD&!;W|TnHSc|VPv6_ zi2$#T(oUQoxBb_9C;NqwcHc2LIG{uN7ERiS^20j4bMM*0wV~+Ubg{{Sy*U?-%fK`5 z**pA7noCHr@fql6j1H#}K3Pbw+Jxgju40G)e*Lc5l9AClAdY+C%O>RIu{IB48ZsX) z;WMTe>U#wj`qeaiFlcFhY$i+XhNuGl3(I?!zwPJ>H2>iB;Foq#fu&ubK}0rv;!7Z!i0k)gw&to4ko;Z5r=>p?gyV$U z44AGpU{I*NGA7jmMea@Wwh9kDgAWV4xuokrd~xT?5@mzoeze|!H{c1M-3+v0OYEZN zWWvQ%*a7+vys7=JYH{*O8*8&RICc#luO63?2WaZNSPyspdUn^{PoNNt#}z``b=1B1 zo^0`ozmM85?;=zGyW0h%=WeJ?jQUfoR=wH+mjKkv;2of*Eg$Xl_V8wBI6JtB<2Cu? zz9e7Z7eednaDt}AcDQ59myhRq{so#UI8cR6atShN|MSQ^ge>YUecseb*H9Jg#G@uu zuM;HVrWEz*!L(W*)O&G(3#Xq{z*y5tA&q44zj`D61)`yyebCVH=IKVqTNm{@k<*bT z{E#C4M_sw!^5tT87P`LlE?k<9UYfmkgnPdv24K^}42q8_(T|@05?FdP-l$#ox&6g` znIOx`J8$kCP}1pSN&ZlN|ZmNc~+R2 z=0X!yuvcy(Hfzf+!BPhkkTi7=6?yRoZEPYytcRX%%p^_&vtjkZYP}`k{;3wUA;QwSX=FTiCz#Q z81?X7x{nyw7U_x4p`YTRdcMv=TTn%j5r;s8XzjFob&QRLlJE|bvO$`xa^+uP4G zn|5fEgq<5}@*qs}!{qSX7^M7~DPRNybKA5dRmm+%!B~Cbk=i|TMhw=61It+V?Az_gvE;5hu&>HJ|e?NXG9YqLFFQe^LGJo+QyEz1nJkkcv_nZ-yV#{JzT@;^g zla_abj>}}Z&?nPt*r~L^bR*5^+H8!`+AR5IPx-6=ne2VguMe|sylm_uTUxmg9DT#mxFJ2GoaDvjPw~8a44#ZI^DTBsm)#c^eRb!YbhAS6u-^FQh1;f z2q(7Bra8bY1-N?B19dPR6r3U+#P(6R>0Kz^3vE6K|n`v25k^0Mz*-v zQg?++&=JVn@z1*?7_0#*yiyw9ZTBuYZ;yHIJm}rgjMU2Vk@S-gg4n%Nq-1+`#L{#d zRU1@N+VLQqhn3;vHiM*-ctOXMWilx#4v%R-+`8V2S>ldnaM`!-@~pD({tg%cSCy@{ zU--II0|@Z(gIS{?QlVo<+q0AU$uJzdnX2+{1o#Td@Eg%9(Dn*;BHK?WrBXev8ADIw z7f#{UJOX$JBVf?A#CF^I<w=iAGcK)dXP)d9+~+$E7=Tk!R$KLK`b2*WrYTh;iU<4^WW!#hgo>N0_- zx3_3lAN7|@a1xYoK`P(R-U}C@@xLrLz}pswSPwf?c^;Z8iKcxGo-sv&#)zCkr73I5Je58SB#x#m zE-lc-+$3BUcBuW^>altkeYmE(!G4te$BN0CHp*G}ZPfpTTh*zmn;BFvBBwgE&W6|D zSzsH+x(5FY?aE&}8Kh=Y{ngIv_OD`gHI<%XJ&&abbF*%)oks9FudxOzFev-)4|s1) z4Y}z@9}_+wmW(!kpV)8CX#KtY_t$TCMQo>V);<(sV3?ZWnRbMe+Q9%RggQEUc#C^H zPa$CoL!_2!jbLOihEwcUBrHp^KylUmJJ8GMs+a->>4Z1Qoo7h&;x#{wR=@p>UX5*i z{qKp{`Rsh%`)nUm-sl1#er?>YndO0R{cx8= z`*ZQ+1qAf}&T^1!+o0gao}@>4bX)kb!e8nt9SW7Eau?`Wg2Ul7Y$zMMc8}&hwuLpF z-z=1K`<#ohAo!%=FlhI3E?2k=`T2tw1p>;B?59E4OlQMyT(C$}+H@K{%GK!Nd3~_% z()nNgPDb~oIe3joVj#p7ghV31JFn;xzyZgK$TL7BBODr18D3dm0*cX#=Hn(>q~v)Z zYe;DB;>oQTp!%^sloB8yNN_?_KryIZv5vc6hD@@MaN@mx?rXTob4CvIA{EEq=psv=T8X# zIZFVuXaoHMdkG!`IyaIMW-MuXEUBDcE#7<4R6+~Zn@O)$ooMKZvxZb8Ed*rMg`JeE!d)k8dL-d8u%{g97?VmGKm-}dDF z^MyyhMThR!&qU-DJ$9|%`CL@QRtK8&4*hT3TP$?8DWYa~TWECbLrgn`+_`u3)l4?vRjxw9LXAqLcCJyoERx`( zX8D-L&+lK~)NH2D!*gC}_Xjgyr2FE_`)Yxw(Y4jb-bE6A^9Is1tolEfb39aG0U0c* zwFt%QldSg@)5=^5=om8V0^Vv;mxL! z4S&%3WA*+3cQ(2TKjPI>DhgHv)t!3}i7B@^p5(95djj?7LQK^izqbhGskj=@KnAkH z@pT3iAtv{8A*Nr@y6vA-&G~>O=!F#CeQ`Qt%zMkr5e1ARP_%js%ndX<`6(&<2`!no zSWKU0YV2&?WCSN^2Z=T%`PWk|ZnNSs_1UZi_6Lj$=_aJDce8%($!-iZV z0tgbkodzV2T6w2H$&fwt3@MxTOob-8%otWJaLZp8j5U4}t8{M4zmQ%$K!=dTI_dI8ePqW=oO|DoKL zAP-)a7JuufEKZ#oh^^=2J23i)i_21H$O6=xR>M%MFD8N;?rCQxo1+K z%N5Q#0-MDEkY=q}@$OPrM1Rm=){U01r(>Wd2-mCwn2|@C??U3waMATz)wfieVwfgD*Z7lxg zb5pEirX!>Y1K)4PI@9=C_m58{uwVAe+nb@SX7t)m=y`_HM}MVO&@loBnhZFX9&uz3 zqByrc$G`Zki|XiLv8gLS)Lw_f>GlwOEJ$+M>h;5C%3IN$o}z(_i-DhUSd0tR_oL@MN$oQ=97T?ffX z0Q$2>i7X<&3~e`L#AnJ)!oI6?kt={CrfnibPn6(eCJdyMHcGO;ujh7`Ljp!?TE@=| zM3W@JvV8JpN|}7lB9WpJe5yXVd0EO&N;0~W$wO?3GvUbc(y-#$o+GcTCH3E_>a~n` z&k1OJvLTx#vQzoD^2g~RYFsl_IZHG#K)wFa-j2fAJi52)n3&fprX5 zL$mpSj*tbY@5~+7jQhnMWb)oKLjH|x+v|h=4Y2q;%H%tE+2~oHFB^Uz!NcCt*lhLf zWB%KyJNA$AKhL`xY_#a=555^+Dj+D;+z9ocEZ=m>n?We*9L_e(ED){ zUI70CkIjS-b*oLDb`|JHW{Ij&;%FKdFI%QwQeOh~UJPYf+~tK#l$bQ6M>4 z^{87kJgikca=6W#rvh#JTo7E8jXbC1)SK(N?#o@8X!@md*S3fek?Yf^GCcS+u9l2} z4~Q=JS7yYLk73L49rb<>P%#(?+~tUcLVit@Y<}=4G42)e$v~#`)sSmvIBiOAzj{Ex zV{OTJ=X&by8!?d;&TWjdpx%d*cPa9a5BGEd?FFY``wrBt;@kUY?P=c$E8=Ixewj?- zru|ucJ9J)7Qp)hik%Xk!GuQHnR++_ljE_nrNfO8Ns@29e+5t`>&F9mXN$GG zhR^*%2IVJp6^5;-Sw7O2z*o*@R0PCv_BC)UsZbN<{4LYFJBc=aYNLd=Y3ltITH4N( zYoIJD69tJRr3()GP8_(&rTc&P`PA53QIw4)oJOn7-yQLjPYf3*a(yREufwY_|F!W0 z;oCRJeE|n?O+9myiKdg|@Dx&&Ie`Vo80xDLdYZQxIraO%LNrAm4$COk@7tZJ{@PWk z9fA7_EU@L>2jEusqv%gyj(zn}Wwf+@%{mx|dHwCn5ow`g2UmDh%Tnm3-7Mr2_qm9D z8{Bc}^F1!V1mCadcCX0)A(tI3R<44b+yGUwF&p}YI8Bo0o zlqPaYcUS$>n1{%c?xzqg99@8cdgdV>rGVkOX4Jh$J9=t?dD2$&g!-%PN3aL|*5h?h z)5h`W7L#trfkVO};m@}6W~ynM@5>7bdhfM9(Yk0({}%y@j@nPbm7F-e>6hI_K7Ysd zef$P7Y4Kayw`n8R|5mz*KJD250{____K2Obo@pGS+T&bs_Pu+m;l1r~lqyE_`KMYD0tG(%{Odn%hQ&`aQt&i=}Q9T5K%*eamloGXZ%;9@C=?NGI&!`sl zV+5Zs1bc?AgpGCmBpv-{9QgZ4W5aJ9dVzgg(KQxGYaZLw6b7!Av1pYAAT!m}OqZ|1 zJ%a#=@MQuYo7RJx_8V^Z2g9<0LV@S$4&TbO**)-hc!aQ@l|%v|Cdrasx>LkMF!}QV z17G<(1?RgKMzP-CcxRY)n#S?C>d$5Ge1FhNL6>V~uojZrn;z$R%49Qt?lo%)bTa)Q zv|!0U?CNwS78wCy4k$i8sxkk6AZAlO)W%o!o93zWG*)8C=!BhW(n&9J40Eskh;X4o z^w6j^Nl`*nLK<%NGbTa|=9lkZIsITEc}Ch;X+41IZ6FX5662ku(hzF|lMJ*|QiP<~WPGs)8d2Y-d9-u4T~P|)pYB}B%k5>jZ<@(a0=<0}PV*Md62 zDd(?YLNsl3KofR|{SxB+g&GBa6t>jDbO7{W@|;q>wBAOlv9V`{o&Ze^&Q+FON+@2^ zlMCCm(s`Z9z?F_{VS{R zAN@{7z^y|#AjzwwM4VRNlX0(V^B8w1WxB2J7Z|jlm>>NtKc>QFlgj2>{ek}4<+UIh zN;s#jvh?|}Z`&+XdjT*l3uDv|8&{-VQ@m9qZ`k!_LVq*6Vi|s01lwLkh}fxN zX{|zaV&On>zAFItExe9>dJ6P>_GQ*0AEo7$60jjV2P4HZAXv4kWQD)RG*#LN5Tm^0 zY=4Dh2r~%cExDv{&I&vvfI+A!Ro=nwvmDQtgdrPC)uy_VURN&(=eFMZlCN(X-bD-5 zxBVE=Tw0gV=wIzkxH6HK2UQm*nq8u1b}x2;OpGuFX)Fdda0{UATS>rzMKk-|rbT_N zU9}0)`PwV3TDpfqLMd!j8`9jg5O+whl#z|EuRdk?jgX?N5B{EH-d@0BC*3vad5O%l z+J#<<`_=zQ(k)Inwy#^lpdjY4pfsfGr=nP8NUowqr_i*CBB39|l!lHJ!|wofWtbvQ z(r~B5P^QS0fCGUF59=xzb_eG`|AC*^9~@@h8fm}B)mR4;(4{aC@BFq+`@TU_C>L

n^F8qu3T&ybEZcdzo4AK9pVS#@nm9tjjg5>qb>gaHeGnAI$5H=wv<+@ z1QM<_SkkO+YG%9ysqd>s|CI&s0VEnUhZX`WatboRC)w6OMk$GA<2Lsln%aRX_{Jy5 z8ermZ!4Y_pf@G_GK#lov+BPs)>3p25_A zh=ia+^FSjT(!XcNPb+Z~`of9dLj#wrHnghf( z#4yIEH7HgYsHV22PWiMNJtC%S>>9)-fadmC-YfXZ1UHWw#ldGeVueEgWr>cN107h) zErD8GHh{@XLF11pI`Fl$_{0mdlE?J3G2;_0bY?w2U6`gdanxmVOSk_~TAyKocsJgP zcV}2*L=XfxmCYqnStG|c6CQP1FiV2jq$D&4=pnS7Af_}UTErjmA-Kcx3=HW{J%d&_ zcSF~x-P)x3TIWcjG$e)Fc+(*XocW!OWp~NAI~sw7>_u>VB0WC*-Et?7Id=j06kF#N z-Gr@18Egon(cO~Xbz+wAgL;ti1VvnO-m-N-)n_Vm+W||=a&T%Ds5+hzPm%yCRI@9v z%WCnM9Dli}2XZ!~I&+J5g+|1y%A)1cEgdt#4$-W2NyMgL3cs&jpiHJ4nuVk~eXf2_ z*06;uq_Gk5+|3uxVP>Minb?^ChQh=OF|Wu#X!SI{0dS@QCd#N*DMme zE{<0SOefNr8d!BVpl}Y|2#*i9+FLSr&>x*MpiXZBd;a4owRInu+q7BeA@)YUh*-SA zB@!--47&jWnpBVi(-!l_Tl&F(Sye)kyV2QRxSW4A-rs%Vls14#jutABK{5~%rvsrI zebsWcmi}ms>Q8##pJxOdV1eLNaz?`!86N|R#tx)p+CJr>R@poLWXFPD7V|-;Hc!=o z`yi`&b%5-~7U=9U(w4P9DmVL_3F8{JvvDC4{ub6+=iLS=ot-V^oT}3;J_IrvTG0Bq z?)uf%YX5%mirp)WU+%567puWF%z3B&$M5EZfOX}DJgiksbS=y;in4Sdc2E^fU55ll zxP)rr=+YV#LXGBDP%Uu@28-FZQ4z!Z+rfVTrHIG?M63tKqQ^*B0LYx_Mdz)uovY*0 zXfOcVp3=DoxY^mt>Fan9#?V2-W*kB+9k)45|GKhqXF#B6mnb?ldi}PZrT#6c{!TSq z082XBP(tc%9xj$LNViL=upFUtzCK&WG)<0GcfeyjV8u(OhILWtI*@lG@;Q?yie7RE z#Q<{-rYQxFxpDvoUAR0V_U8@AdF%%&j>}7AiGfj#T(e3pZ> zuY1lIUz5BAE>jAo?~vqM7^OR?j5qXE$`SJVU0A&er5vNVT;4yAC#n3cKXJ$#}U{NEVX&83mGw#4D>WsP$7P^T5N=I#; zfK?M?mJ&&tIlsJWQMP}v8+_J1Cu5%M@y?a#JFVV$g*1Frx)q;Wy;!sDmanEjfpEo) zw)87d=eseS-2{-hiQdsM9y*>q`JsKwd2p;Et{{uF5hk=Dx9^dd4_^j9(eB~36gNs9 zLyn}FF90YEUk=s46ZO@3TGl13EU=|_^!*(-fz`I7)wG#exOn3^_!@9t;d$F=o` z+CMEVE}Ung_Pz7X&8vgUylc?)DZmgD_+Kr&Ps^q>kxdW>o>3nSQbiAYn%#FDk*)phq3SNz)^W6C0{8@9#V(0Q01oz7hYa&LA~ zfFINnxFocN@}OpwMa#u~@x>jbIEj3^9({e-65cQ+TtG<0K={`egKnOZuepbLkm z{ba}*qyHFlJMdBX?ib1|pEY-TwE>!G`&nDbA8 z+NwOd7IAmEI6FB)>;2GMp;|^?+l9vI41m@h3sj;!eELpYQ#x7eqSu3VB<}^ZV6h@6 zk3^$y-zQq8t{~{Kl+44}Bw9Bzvn28Rfv<_!Xqg{hxeS!&7x*;x8HNIJyeYb9`4O`K z2ZJK79c@Zm0}$n-Re+Aag~=Xd-rViHPABNevt+~7P?HZzhkqr>476WFD06ri^mZyC zfySQS33EjJbl{@mnQJ1c5llO~{~_V{uRb6k%vwt&bhMYpmjBR5^0E|Wg*1`a1t{JF zyz66?G+r(s5#D#pAg%iNt>wxsUAy_xFzF(kOrkgknWNWX%LVG=>`Gm7&PY@>Y8h>wZCtl^Utio&&hb-C+_>YuV9r} z&3Owrr2fUhaJg&4(t$yg)lY>L%K(9g$K_X|79g3q1BJxyr)R49uYqUd$8GrcL6rEt z>kG--->N_TooG%sy4w2nu}MPaI-vWDwk)KC5sLTGCC!1xpEnD`e(qT9U-!xX_L2f- z3-}13{7`@as_KSChiF%uy%CEr2VYkfR87k4WiQ`JwqrLA42zR3mlq}6XZ>KrfNgrJNjMuT@ z1ZTW_jF(sj82{P;X+N;m@on2Tgb7_-7m~I}E&uic;eO@Lhgz}*@berULDm!C4oL={ zIZ2>CO@=ObGShav>A?W(XpTxId^R#35^f}*GNVE)ZMn4AZ?=yBGLdFsN*q{tav~rF zy3f1_)^{5oxR#o__ebeya4{>4u)(vK);1fBqAE?+WC z0Nv7}AK;R+?3OMcc>sUUuuy{Sck3LTh86wtiC6kPhT?L+y}bh$*Qhv5M=MyvMib65 z5|4{?>;&$ufl$$@7tay2@cqM>8hT}u+565&OKj$L>hii|>X=a;NTEp1X_!-{?{*fo zYX6}r^^9~&LA+C8-y{0INpm@oyUzGj30ud17b+|^@eeQ z6lL!DTPaBgTRira`P}iMKh)pp2mWTRF)zQ-LYLeYJl|<1ryWdI{QE8ZkAwH`e-sOb z@NXt%S-!Z`eINmmHZJduB;Kc-%~K#1A|i4FeiVbiM11fDDuk7~Mk)k0N-o6z`poU* z=L?^v`@dIoZvjdj)VH0X_*3&+B#&x$lm`zSUnUyj;*8Sgr5Xb3cqK>U>blPz4C%Sf#mh~B(@%Pol;#b$9dQM zwR47`pEMW_=*)5l1#`z_!Gk}CAR^)%5|KMTM8x4GzWs0{RVUSeCZL7wn*evV4VVH5 zh+1eKD1{=Cl60=jT~b{Y*0klD( zf?~V+7{YJ?OJJH>%=1!1CQ2sO{_fa;w3qxqj6;^C%^tJUKTW0+QA08qgzI@yySJ&o zh(I+N%>K>&efbHv7R1k`;}Fg1gDst^jGrPdxYyHEbqhH81vKP+o-C*TRYm;g3SZMj zOr(wF=oAwn2l8US45cjX~T*VL^REsPSQOm6-q3f~hAu&ZHmIK++k{E6@R&>4wktVLZvHcaT z(N|L|5&i(DP7!?fC(L0wz~tqN4@H#RRs1p5Ik znaUm5?fWx8`n?r<6IVoKQM)I)xY&BKtp6N%YFJo|DVdl3S7xC&)FRZ>VR5b+^~{a? zpZi#YLq9PL$$O>#>$m)SyZ*=DAm3m5eG!>_h%1LkK=p<2QTq{qyukhQO6FnJ{X^gPH^Rzed`KnChPPaOVT`-hf3fpvWLwf8?4ehloPzUmjI`ge3E{maN5_{%Pob@}1bhO{K z95vw@2>QA5EEvo|g`|2CJe$k}v-qJd|8I}_SayK+&G?)qgCs2xJbnCkQ{#nL>Zl@h zps%rpmoriyohv9qwN=jXr> zY{VEnX%o1{vViiX+8mgaeIaz>_FFsderlTttChfH_xueYwe4^21DbWl;t&=MTzwIk zA_kr50#RL_A*ZXu!IE$*CJ3e#Eo=MN)^i==)UBz(RdF*ok%$ z7=T>)Y^H}UU6J;LGR=j#u4Go4nL+4wMgUHgnu#K=bBz*|DC$+kOEIsWTM>3qg)Z znHp-GK?Uj>A@;~MWe?8?^1V`{kx@!xDlc7i8nXI3r0*p}tBnRc`#7{c6_?6-+darS zse!LDSSWmocg=kOEY+)p0%5{;G+GAQO>TjA(5IJQ8!<5CWSfxtJaM3GL_?S%3Ebq{ z*`}>4O0~1L-IA?OK8HteuBGn@a;=WkOlJQ1=Ks5^0%ZVTW4_j-AE8?I=*-rkV2Wfp zoB~s$V^9U8fKZfis~_cU5NYW!S)l)CUZ}ID6e|7~{T70_R*!WZPPPz1$q-36S5AaH znaU$^BGbA1Iq(pm;AqO>A5CMhqBP454>6HL@f;*fq=3F)5Hwk1UoHS}m;?}-Sx%PF zZV}3M1nTyRF!*c(?3H=;P|S6s2D!Djn1UhNj!=BbCK;mo-Q{K1=dqUW8gR?9}7(d0jXNGHfeHs3!qhb zH(2zi`hsorUbcX)ClBH%4794TGuXL^wiD~ZacY?Z-xA;09UrVL@!~IQMt8^(Z1CD8 z9xwo^zBoF$F&{&84p)Bz#2+CSV84AcdDelJUw7X&zLxkQC!-#Udk9Y3na_X_nG}G8 z#!Fv;JkM#gCHjl;O$1Kr^HN)AvPov5(V>*}0X`A4sLsW`3hp zCW6{P)5v2k|60WTzEc0kM*TbVk<>-RvA=x|>J(Z0Z!1z+Y2S8AEv=cFt8=yL9X=*; zS~nB`*XOOddX-8Wmu;uuws&!0Hj5s>+2KPVyWNu-!cC z1;!~+v#Vennh4mh$sn_25oQwB&8S)aRTor|8*`3B9Dp%o^)-v~9G!&!$3P0#kj0BY zT_=!{nF6!}GiUj)K~|$lX9)HNa4@Sqg^65h1TlghJ~4zDtsVp4^I6!mCD|$yYd2(w z|2SL@^!*K|^N)qv1F)&qKvkOrmUzk+GbkP zpwygvWI62K2*yU8|F-MV{T7#u#JT*-4GYFnoy&Z{B* zo5bP)cy!7Ou5ME?u9;@DYiUvoc?b26P4MI-Mhg1TSUF< zw?=a6NkYB?rPE7M`nN`B-p55-uS|0a7RsaR-4)+`cpof#PhS#m1l4F~NqCvdImuzm;5F88)6tE#8K9a80c=W~~MjL#3aThPm`fZ!B~m3$~byer(JNCYf^ zT-X>m%ZgUxE#TTkC&CPc!C-+xs%8jW=@>mJb4jqV*uY1>-yompP8F`M3+n!N0yImEd&Tg52uVj7Kuo{VOx4ttQzfK-I zU}ry+^%G_YP&@{Bsn#H$*COb2EV^M5i5ljW&=Im?+qEV0q^6NAkt86TtjGNpM}kd}NmY@D}DT%W#no zeC6V;0@XhQo0lIZWYiHP0yDO;mK$Ie4Kf#A-!tEaHQx#XrymA`#S3~!JO`MooVJuR zyvED)grv*-Nh-?ZT2r+XQFC{DFF$Z}S!Ub9AYWdlF3@|<7*IRIG5 z)TVwNe+-lq3UMMFD*1}!jR&3WOQSjc{A08#gFv(y`^Dw%MxeP4m!FNrl}2U^_Bt=AU991*D(s{Va=^nV>i+eK?xm9vEYvlu6S83S2iF~f^ANv{^ zQqDol9!yrQrq=`6xHj%<94PP#na&L19SE%i)@%O=OGmtKJ5$Fpyx^yp#-V43hCvi zO0_yd)(t(eB+uk8X>Y*{dNb+G`YSRifCj$-qDnLw_JBkrVHDWN`;G+Of2Xi0w)#bE zP!LV^1B04900gqZaujwO6Z2Mi+q}}6LR@|hw?#e?!L0anXUmW1g)95mKczod=y8S`Z)woh9ocsx}wht?}2xCigR zWSkl*IQj6N+EduB4TSia?tr1at(5RGuhWcq-aDE1Jn5VM(d_jSxoUH+j3bf>lf3`p zpZ{;%?DzYQmPBF6+bHFrl3oOkZJiWy>Y9OVPJ|}5VDDOUpb`mOe)bOu45Rw+@>mJy zqSx*AUQI}BGzEFy)^EJYSPoGW#qn{6rZH|-Omx_=N#H6$hSMQ6CL+}c+1p8S@_w@#o`8uW^iA%PT7fPFUT$OvB%Nv_;AlIG!ID9rHm$|VAoNPaE|k9FlYy+bff(O-5Rr!B zUk+9tGzG*__5h=@g>D1E8d$&rixFj0hUT$My_t8ZdAYdTi;YVY_>>n_kby8(`GtF3 zQ8l;W-zDxkk>a8V9!K6aFyzYUbxWp(D_n=~wStUD@TeftC7T>c2b zPTE;4j%Ht?X{YywHQ6ENNb&K|lXT{z@K9CpvA?(0|L-oxzt|5hm2i?;(-MSfaU&>a z!GBQpEp06QVtTp$jLqpM%aH6h0vR!Bdf#A--R7=Vk_})#e@;95K=49RN|K&D&-~BB zX9Qkr4+PO(SJu(chzBZmwiD2ZbgIUk8`eB15j0c8R=$5h9tTBL#w4Evel@|Hr|cMC@3wk|o}*3Z^(pHwc$((n}3=T6ICN zdP&x89Q67=Bk=g{OBUQIuCgMU3PT|v2b=JV@Ml%&fU}oC-a<1uPKeeEjGW6c=77Dr z_83qlQzn1PF8%ZDQFuV_|0OxMj%K*J^Sr)$WQmF}`k?B4T{gvKgi&V7A*8q+M85al z22&Gf+*Mzft@~t(Wfwb4e#v+b`7R6@a3%qhc?(C!jI=`$;f1(Pg))!&&HqTz{@)GJ zG(5bP0+vur_Xk*Uk4T?`+if`WIqIweBjO$~7pu`G)+919H3J9*<8r?JsyGc0UBat{ zc2km*hB6<*C!PK+d&y+T$cz!Z0F59UyF?;u86_4LZo19a%S}}ELnBiJNoJS_r@A)QK6_%s|qrb@L1_^;}=65&Tl$Cjj5{3U5AbkC?Z!)R1cBKgv zc8G~_fz?CqihpB}VC0ET2{M6=(G`yEuXv?y6Um}GFkyUK7ljBXkP!+dW0tlwxHC+c z>HWP55Frqf^Ygu|grW;cb`oJ491-m7Sbp~-mLh)nj^Zi%x#?!2`hi&^p3Cg#?(7=f@Cxf|-jPm=X<8M)4bhK(e?=lk1~^ z4APixxUi(QfcTUXoJ-6X=yKvPsqz-6#@@@-o7lrLEn%~>Dx)5ZV-WTBM7DkqVD9mo z4Pbbcq*Y<~4knYf(k;GF`4vK=t@8eQlU#FoI0O+s%2IOgF>2iJ!iDDveEsA1qzVlA zD!TkT6Ak}!*Z0b!l($8=(rlPg#3&e3&I2u_;n61MoK>2(ta_>L`k+daDJnk0>%C?u zNh1&a7w7tQ!ArB2%ss#rO9BI}2B~S@CQu(Vx<`OEo3jP!UODiYbzJ{A`0y$DqNi;n zklZ=g#V1B(csYD}!eLPjX8St>p#FdAc<}+Xmq2vgV4&?ioXEQ4Doh^UXkZICU@krn ziL&s%G3nII!ID3JEw(Oxpi^p}&DQGrzTd5^P`zvZH)$KRd%!qegh!rA|AFKKJI(+p z$p^#Ky8(X-HbSh|E8;G5qJr(A8*o1S~k%d^D&wf5@uYhno9QD zI_*&Igtj<`EN8li!9Yfg7w8B$2sW944=8CKj}G*IU01DP*LxV*X;L`E9Ryi5 zg*JOy3!+G2MH>#qTbSS^*Ghq z`R(obuf0x*O(1yva#j~K0I~q!_%)|ecP4bPrXo|r4Rltyz&dWZvg;8u&1Mu4&-S1v z(FqDsm(ep)reiQn*c$43*B?i`O6rlH0D2F9FriF)^1{$fRWuOtmcq~x&BoRp>(9M7K%aLX-SByOtlZ2mcn#j;jz~dh)yzKk%T5o0LrcapSo;N=o zzWgi-hcgNaw-S|Ii4lX``rivxk_yq-Uq%w?JQ|&hIOG9GuSC}APe1@=mxv^K0W^7F zhTBOX8WRPJA$u!YC09La+Wju~b>A>y|Y&MknQI?4<9b5D-Z){3tLTBmyFJc3mxHg)vpCWwn`sI`mROK5PPhx5EUKKN?fZ{+RZo99S;H-OhLi-Ytj7(S)O#+ftKF6nA zEQ$LE+wMj=NRQKtO?S@I$oTU2u=xX7u-@|r){>rUS#O>!I00sbK&+IKBVaakM|gc$ ze%rf(o|Tg?pEk1rkOc*lexfMAd;sn;i%WUp;4AH!tCIr1gAKx>k95k!0JS-+Qe+zC zM|W%%@D%)sok{|Vd@H7xWB3H`H-I*cCMj30ta|3-^?mk#E~L%}@RQwcCVfE5P#7V@ z0Y;UmZzidjCKgW?ue29oxyicIXieu_gFXed|nG53~CliIqS)K zg@zOJP3{H78udznKj)+9J*nrhYv0pmP5i3^H>gH%9u?>oZ((_gfs=y?_zWygcYr6A z1h|RGAZBeUqlh-v4H&WQ}d+^cGBIZKU6`yE+(?_C3v7(_w?)#yeGh+{fpxY^If&dE<_X6I> zc`%1hbYRjw^@v`%6KCOT6Y#d+yajsNLl@vjsOFSjKf|b;6h`I76Y)X_nR}yK8pttxBK~~y{+I?J3VmS%GPnR>P+^Zgw=Wv~$n3!d7 zD;lf?-WF9}7d-|$HBd0tk5%l`8Lj5stJ3~hzpG6b7AB1KL z@Et&}MylUIHZBf2RvUAuMDsnQ;u?4oGR3|j<-MJr`C^HlO^z54j}`UR2Cyj?zLzrj zd`yhcsk6&eNTm>F=P>Zu1&P^TwkOD`$YF=3@?pmXinDxH$@?AR0ec6GEXI_Pi@@-Z zsJN?pH_=z(;!vsCKjmNy)>6`DgWIXx_FB^Op$WH%lGA_C0T{YKjGeEvionOPp}H}6 zMK>WDXm$Ai$)flUfL8;t)G`9QthPyjhm&-Blfh0Y-elZzxov4H|Eru)hHnjx)@mVz z-@TAgL2nK?v6Z+S*}WMhjM{k0{>c={z^A}ry>Rj!1&X~q`TTgH+Uy3sR^QJ)<_2`7#E_0?Za0C`ArA_dh~=c_*xHnO^O&H@fa)^xpPTdRxr^Z}XbN^U<=t zxTq86gyZPFeT(w%(MP|OYIH?|k2MPb9Sx0d-+PLq+K zpd`WR_ul_?23&(%A8Koh-NPZY6niemzWYrEaY!70MEBSdE1E?(XshD*J0ElM_Db?5 z@HHtYECZni>M29RnW821Y<7jf(`$l`3J*2iVGfY?qXQ#=&Ts<9Hc__SSO?(HB_*f8 zlPPe3`E&wcOvWC-Qlz=Bn2Mt>R>Ny1YX}BEbM+m4WW+p_2oY)X7GG7gBXUM3VEM{h z!1Y6+0Mkqm)Z!o0G+`x{|6CA0O*irO%j4pz@2t4A@+UOg3+!vAM`+e^ox!o1$H9e^ zx~aPTqY6A22||3G{Woy>M60OIuZ)8aw+Vii86kM^?ybT_lxx-tnJeVuGHKF~_sGfG z!G9`A*lt@xL>y*`5Ko8_y6yBjo0hgs&kevX85@ZtWyM}Y*N7zIvDo?io#_>?rz1hm zyfL3?cTh9PAfP8pzsJ4{0~LSG;7O_)u;F*cXn$ck<{-SeTD+4|PY(g;G8i*=dk}U; zU2av^+OH-|&gsH@u`cr2uB+V;_1p~Vp0NKk*O_>am!XM1d6>`Dy#0DF7ClmuC6dqO z7Yj%eXt!{7oz?&ANDJ`lr`FS8{?O3p;|4s$1q>A$;SdO|h1V{C?K5zM*}pVdOq`1I zkwkJx#c7j0YH0BkxVgO|wTUG)c{>X*v|al!{Hb$e3icmE8LeNdt&+0a=9!m}Oorqs zB+?w^c~n|`1i0w667R+WkVv(D{g5sE%U=VoPq^@t8k#zBr}1u+X_E~w*hVb#A094K=;uC%?8XQ8JEY zRuOLG#ISx@e>WEZYf8+&JNZs3Cs7wlES6dEPT5&WHgMdU;QnLWs|CQi8^P#>@*2_n@LGweFm1#I2GxdtPGmv!$U0=6Wf8b zWEW}ZsO6!%-T%`~Rp6ncR>TYt-GopFAmO2L8{-l?CKw4=3xf){(i}K=a)Mid2B=m!fSKWZdWOkh=~1#-o{$&4$TdzxH z1umncnR7Dh8)->|(aY0}Sym2(Z4N^=FKCSVY zPEB$B#YUvdEh_r5$Wn;v3z{h|E6GuLa4=gtcHzktpP6oS3^PRbF}$EBEr1!NPeb0X z5XT&i14WIRj@ABxK+OA|RE$2NF4>m6IFd`P{KaDQl(OgFAbFBMoTCN* z6^`5ozYk`nVppI4%-#XU?x#scu|}ET7kHnFM$@ifWVq_nU51HzZR^0v>@DZME7!(q zUMz~FS0I~xy976IXkWSb3bLbd@ce;?v*ws142$^PuLFjWEzE_CnY};Y7(ks(q50|? zEmwP0$<2gZHde=Tz;|#1L>HaVka4*+4r^=o1m;Tu{=4-Yu;ey`8SgrREcV$~LF2Pv zQf(>7JlD_ttlAve0k;&iTS3I`z`?rO*=1)^E;)4Cbszi1Nlx0GZRLO! z-S1G}gxBoRHR7vq%4U;CyCrkk#uqbaFOUc2PyymUXM(PSR3(F9ixnU`_KjvmB!UbQ zSM+h{D_}e?cep|=mnZ+qt3(cXcb;vg&3VAu^u;-y{`elblFa(BdUZrL`_k*n9ot(2 z0F_*qBi5NP*RPF6N4EU?n;we$xw2?!gu2dyeOG%g7fFEeACo;dlsd$F?IL0hgXO{y z)KmLp9KSJ}yTR+jG5dhAR$s1#iWiQJ=@#!_xyAC-uKF@GCb_tce43xq^BgR!F9n|A z(rT8;K#+?9GYd=clbPYEb=}u1s@MT!2o?d46Bd~1=v7A`x-l;e9VoV~f1HNEB!RkK zhg~jHDbc$uwsd?XAoAA=JWlH|)928a=7q)DIRYBz) zAKK?9>+!ek#Nt9E!xS#vcoh_i%Pw)`gB!_BILE@*Vi#RifSf>xqhiVyU1v0|}$I6^P(>FnXJ)5GJ0;1^GeM$)`srJmyBl0{~$W z6W~i5YTWMi%0rTZ>3%n_e02%sV_iGpA6bbMqB@G)u=ZY*Mp#zF2h_;XTO;DYb3Hy< zOQ*W78#r=jOGrK=Vf6;;NKRnIkPLtP#mW%!cIxMd(EtFJ2hvoq7X{I6N^%^EPEGcv6YrDt-&)n!6EV=O6GDD(Sr-9kYgy1k)Sss1@&<*ONcQX#J^`EBv-glJvS^Si0NO15#^Z0=XX#T(n!IC*1m%@ z=llly5&XQ`+R8JgfTu`^*!aTX@bShtv9f-Nvw=wmXLsQWo3e8Hg^fj?@~(H^X+Jh( z@Sc`zr*9YLeeY|QJG%#6XZD@m3W_Rh!eCBhJopLXUXT4HV3EURdyT^p19qf%UfD}I zuxL@=`;Q<_zzMl=@n+9euzX9S^-}G&Dsv{D;at+zTo0_LmLxGXw%ZnHGczd*-o_9M z0t%TQ#2fJu%lO2^M_U*5FOu6dEv0$Cc%L^dR6J!wb40$fRa@xGQnp)o!IPARJ2w-`S{AA0=FJLeX2~SIW zwnktRdBRw`B73LB0R#iT7eIKbVKY&a(Q43ffM(E;p~CQyFH%6@UDRTo{l_V{WQMoN zqkK0fQERkC-KEDvcd4Ylr$zd&P6UhhlJs2X?chcMOtA~dw8oAWJCo=cLzn_5d{BT0 z*MkYe1;3i*j-Dsufxo-@s)o;MJ^Vbh`C=obT}mFBe|wQ}_okCw918*mkBHSP4VkiX zDPt(&ujU15!g?JK)#YhYhlGAQEWw&RByF1{n)N4UQ{|( z$~=8!>okQFH}`yKp(2%u^Mp%PD8%>fYVnHD#K2#H$z5f~xy&=o)`hW&li{&ncG_j1g3k&D?@zK; z-^+*j4F`b1a%GRis%5tzA#|xEB*#Hy-az8@oSp!vAfRXd3O)#T@ElFh1jHBI;&w$3)Hcgw)8++*4j@2)7oys8LO?#Z-EP@*<6=4kR)#mAGNoCj8 zl<*R;skOrtJpa@PROn$FdKP*kA6b(#lQ*2p`eFkjRgKPUeH>e_228&@0+$1g+uOLo z+FQV4w|LuP+lnkMdwm=du+IP|6{ot|WO2Xo=IriUGu@%NK3Y*po};RX!DTmB%d$k= zSjQUzaoAgdeA4z`Yp%37?(=A#=?G_IQabmeUoGy#fPDt%-+-oBZO@8T5DS+rR6=s$ zSE8B8RYvS1nO7SzE?95jtz_2&I!g!Z0cb;8n=rIr|8}(1`uJkVcVQkFCUsRB@*+4t zF1HxNTQlNNOLbcb^=T|@Xi$7T5-fO<`TpJ*p0075M2!kC7C6qpjL;dBzVynkVaXZt z+F-j_q7)*BF2W-dExpaMN)`OQ#f%UiDVC%_Jy>!qiB2cxa!VbZnvJITlXKlC@jU3% ziaSw5c6W9hEl5;tmx{&?3f1^KpP6(!{e4GfLjGN0P*(s_o$=kSlHQq)Y~bT#Ld z>!BlIyZ_@UzqUkwAwYE+WG3N;7Z>+$H+^q=%6x%|+a6F{ zirv+=-ju*19K2qShv{D%E~b8C_Bljr9RO5-dEiAX&Tt1THR?c;%{OG#<~3^OColE^ zx7`IiF29UilPc9!f1hz3p9Y>9pn8tdl%NDPe_g9q?u}}kzO=_u{&xJwM|N4kN#>&< z0L-y9aiRBl&5(hhdR1iZR%YG;nTj%xYC6liW9z$<=y3$66LF19*y*A6Iy* z4~mqzbv?hXX1S}Lotk}J=%OuU%Q_>vaFA>bkg5fh{+~hN-=9xB%gzq&zI>?bILLA9 zW}eQQh8sVws(qwcWRfKvXTkLBgDUP1@Q~tK?N0!&W#jR47fMN!LZ*~J*!eu{27eP# zksRUF9OG3aGbOORm|0Cdz9=jZP50r%&H%7oK9|a%GWN6oU0mP*K#UYPLvL|+xY=Ny ztWGYScG8!aQj$ryeKsXKq4!yjW>g>oDE?VpF|%h2wu&93pjb{((i~(rSFLx!WiQ+_ zywA>{IGk4Jab=8Jvtb-1dd;|lhyhWk;d;BXQl-H@X&AVmuuyKC4f?Vk_S-ro40wj+32 zpiuAc?|we(3OeY}gzVgdw5n3opeLZ ztfi)eHCqnw_gj3;tY&4a(ic+4+^sU6mVDl>elFJ_tVKt^L@$d!oMT?dQ>>WG<7krE zCo2kj!e-?FOQ&k>DPn8~TipGQjc4L7OBn9PXPC;$UDdV30-DwIn zRMVey>XmD=ue&t7XfUx$J|>y6+{?l?$*~Wkh@|E`ukMVW?dr~oh*WPQnnYD!QZo3*035mThvgiWH~Zb=F59Wp_AFDDs zhn6rQkhJf$IlI@1ySQhG>b+};3BAg8E}3R+{$av=_HJjA)ry(EFg}y?_CTCeG21hB z`6f&GA_K^71>vOnb={WV)h9>a>igL9VRE!t@O&G3c>j@R^^_i(*QXJ5E-z+MziiLa zjGJHXdmxwVkS3VaC%f@y7Bg=%L;hpl)2z39pY`m!rsfB^7FQg-#!}=DuCR=U$o>>s zNhpsz44C7>EeEI?;Hc(*jonkl`SZyj-D{zs35~o~^X*t+ft)kz1g+J%F@+D>hHeXM zx;erg1POET3;bi4h7%2+Nq-X7W+$6H`kF=fc6@8Ulot(Bxz27wUo0oN^GrcTdn&eu z2T*XH5|1nb!x>VIPr>mINN=~0Jsbpz@FcIIQ}aHN%b;>9mAo|Yndw>M)m}I=2c*S| z;P(a`-z;iMhdpXaM7%lfsci8Y95bokvh0f-tC>)9kg8jGqP8n5TT9f0f6L2u{F;mR zZISt8^A2^e*7-{>m}T&+5S2Uc@~i59vC>j8O}YF&baCNe)iMAxAnru4njx5Kk_r3Q$eN<4zm8|C{uf0Ckl7Fa$Yk_xyG8mp$;=%EdFdNhkM+)xKx#_s zbNy1~dtvyyo2n`!U#5Jfkh{`6wms95{7$`)c0D(C+En0M`v-Hscs2v z&vWsrWl1yo8`bL+$wzaCOeK&2PB&ETL=-#aL$H0hsuNEYdY zfu`v3StY}dNZMGf4Q)|9b5g>I@(1cK|D1tL2nKLLNNPW$S{qmhKF@XQJF3@SEnGPY z{ha!Rf*@Tw_QEHX@3NhQl>ftAX#nS=B?Do}uh*GtN4)L;>e7$N_WNKOzD6)ua;k4u z!mYmKll|Qez`BMRVMyzaOb#HL%pt>1H-8lAe`aUA(n$h6=xB8{IM!RbllAg3RG)Aj!2Ep;y7I$Ui0QnSp-F+Swu4TAO@)vg!oTQv-p z<&-4=hR2TQe7fh}7KYIEfp%q~+q_|9UwC`)$7NnAi4s@f$97fP>e~z}wjDWi!jzC=AfnvbLD3vW9xDC$nW3VdvuN`=8^(Zn3_*m_4}i9-$4_Lo0bL5l33E*Hx@78 zsN@j&3eJZ$`x8#;rkb?2Dv*D32cZA& zTwD0}N$DXwfMMd(zk9|K z>es%F;|ljlwOEFMylx)o7?gL7rZJ2X93rG0q8!Gzx z8CTOoJ{vuFW`^!T{syRX6D!(X@gm|E75<0L`n) z`LbBs14yhKZNI%T{d|J`yL0{bU(9#_rSIxkWjD@;*>{bSl&SF-tos<>@)-wY>9|Hr z7K8CH4Feibd-~TeZXgH6U6)VRCQScYF9uEJh5MPl{^B#C{41j6W(+y6)u)R~d^()d zz9V6JiA6~?^DVSfj9j-HT&;b!I#5$!WmoT9nd}QD{A#HaX!>;udoA;kubKKG@Eomo zH~TmFdpDNG)Rkxc2}(`hMdThvoihpO52L8{ zJ*B;5%LeN*ufd(=qlc8gH*544KfQy}wKt8$wfYRLKM|q{y@k~u25tRbekj>^!;4I4 zpC-x!0vNuw2ShoI2@A8B-;1u^<+?kjf>!zd*yb#r+pDquK4HkV>|WbHAn!VUG2dcV zBlkS7#&Win_2-JH&^ROgCkd`M3ttp`U?` zl1HibM*s2dEc2@d_Nl!a+MA}wO-o37b*qub9Qb`b-~hberb!kOpcZ=^yFPNwA~d0W z48wW2@N!R2#Z$lKXA}CKbjPk2*vq)iJ13+h6b(v^wfoVe=;yZru9Gg_cq=`-V zM(NR`XTD(Kd+}_)NAT>0YaeyO`6mM6x3HX)Rvx#0#@e-o!WsK9*`6O~LuaCboF$64 z<~4VjnBKkK>(BM=Q6G6Mqv`(?yc~(T)UHwOy2R7ajlmS;-O7&hLYL!xEOeYSbY9p! zQ9OIK02TDLp*xV+T#NEK`RsKNBlsA2AQ*Sp4tRq^2iJzJQ_ziEa{anJB)uESXykn? zc;Js2$nfX&RQvheb^~ZOuHYE3;E73 zB9HnM;QxYgAiSZCi>HkR+F{!<$!$td7U(?mWlK>oy!)SmQ&AE!bmY{WW10Iy*$G~< z{r#@ti<-CM?!SwN73|?fhO5~egPjuz{Wh9Q>_RduXP~Jqt6K`r(76tJ=`i~&*f}|m z)l3(tK~-sP+-ldyYae0EvY#@ByzD^LdvH&a-MaPW%<=93^KJ>Wv$~{#M}->A-;ne3 zUC5EZj`(IZpQxy!BfVVn!IxFxql(mH#Xfffch!!ljo=IO<}#ntqP@bR(xZu2LMOwb z$!lZK);n)5=EugyQo>5{ATG&JzbY!gYvJO%>&#j#psBP>7s$k^;tro|jY+6-*{owu zVcM1k9;-Ee05#y5>gVVN5viWp0fuOq&9`#T<6GC&tZubT)7EW(uL|uD%oWxZB=H`t z)|4W|J$jhqV3}g;*74Nq(}&2eDBo)%F5g?PT5#7i_Be8wy!)cC74$LE`Ey)Ay6S?0 z@8#GYa29kzCiOZ9p`cr0V%Q8xqL)~M{6WtoAilQkOTR>@(aO?L2Tck8_0|FGh;*WJ zdC;N1Q`&kPG-=gp?wke8*Mb$1Xfw8mBHDTYk!r0A3C{|nKHc^`-@92PGpC+a-ZBY6U_F_PPj>#sYVPUcZ!kM~R`O6CV>TD*Wr41Gjh*Hj zIhSNxdY++fwWpB?vg2#E0YwF@oO zymzzo?7m=ZSbw%t<_rsfvMrS5&?=a-u-OANjzJCAlH5rKW;6)uz2(CB7K;GI=tzs| z%EG~pB_@uxTt^58(UzN8%67}`Y1yWYy7zO}&lZu3CE&fVkd8b4s_1EeDcXqLmLj(& zcfBUtm&=oW&eec*%Y!Rl1y=CIWUYI~<#?W#wXCi8j*j=B94asG<KHTC*|9+;o6eKT{%qkM9xQbMQi6E> zkl&RntbGjeLx}#?Y&;bmK*gD*QCU)@b(ZY%Ljhx!ciBk*9W`&ZT&}hyceea;`Jj$y z{Ihzr#U+?_kyOm2@~}yS*UqAl?7DPL>myj{Rm(FkCKI)xuchlWD$uUEMLG&taYeA^76C5JF{&hNA=-dC^0( z+I*@$H;}|O5BzGR1+7${I8(~Vjcr9V7z#5){74X)B_JR;u`CwAn0brHZuR_!s+AwU@O4W2#T%&fWl&|LGSm z^*6F{Q3wdmK0kFCKa3Bg1?1fxG2e}H322xlDUX3m1>;U@_^lO>IiCfpf;uYV7}Osj z>z5Z>k+M50ChRGaJ%zs^9^=qSe8gSUiuM<+0}$#6g4SZsly|JURKrxRcGpzN4iq|b z5-=J5gwit6=A(Cnvk)w_I-c2gfKi82_iDWToo8b+RF8Xwx=piRzWz_I)hqo~Z=jU3 zwYUu0aUEUuLy z*`GzD_}LE$Bfso50umlw-B$~!(pP_rStUlv!V+7Un|b!h=&e-2a!ltQ(5A9b=pgmcol8o6dGL;e z5`Vx>Oju%DI_H3B+@V1#pXQQ*dUN(f{B-fWn`^`76XQ_xiwo?e*GN&+nZhd{n_vm$?3k&kPa0Dhu(y2!6Od zKhZx3czm9mq$)E8n8mx6R+>N_TJ}oj%dhMC#hbLnLGQEap7pHxn~TRgK0Qv~`=sF| z6JEI_#m!?&5G`BMDXTaZN_`tmS-duRTAW{Ytjs07%O`wgb7gz;p4Hd@1{3-ZAffPo zOa1Whze`WpnMz28CHU0x>xQy5MFU*6A*Q6tE;`zu7t0cafUo-bQH31=76)n~R zqRd7LoIO+b7eQju-aXQDNQbn}vmb2%d4%c&oT?wc0?Y>86&zNVen|k!-Tiz7NTB|| z%kvbjryPzCX+H37c7NhV;<~6G^8S9age+tSZlH|0V4>^ffPR=y!d@4%kA0i_I?eWq zkd+DJb>wiv;A>SIQeeRS&*k&K{wV^ld=oul-r}O<zV4M-~2mDEsPwD7Wox7#Sr*R8o*oR63MUdJvUH zy1N@BrAtB@1Vj)Ry1PLTL`6WlTcu;@F26l0;PD>s?|%Py-qAU;-@W(RYp;0Lvo2ck z9;`IfBxg;Ud%K9l;~6t9_P;$U1yP=W5hf6Q2IzFm@)pMGokMwXUaB~o@K_!vJ1e%2 zqUgv1Vi1mRsNH3QUgrV2)^)D`%{1E*$Ya?ylG>|^x89_^C^e&>NO6O%57`W{gGo^Q zs>6k|KTqDN3-H?$#Wl_LD{`y+rZiwTt=)}j=@P+=-?W3ro*iTSuBw|J3@p6c2Beps}Lwx zz+&*DVqGn2e|iT!GdsJb-#Mkd)CWI0rM)^zhB+};gL$3r@r|8~2nmyRnUz;@R5dj< zxi!U$YOD}%&yXBTPI8R4jm2b69kXd zoDj;+a9&xmBMcJ!j`2KiR|B7CNQz>@255n^7YOQ9RTHp7O++yU3`Tfc`f`$>_*oy5 z3uxG}c%@k$Ir>?QLqAB;f7f1rH5LOoJUpx=cvFB_0zm$KYa>u5n+wW)O-H>NJZlXIU3eQZa7L}IoXT!)lm&N@cv@zKpbk&3EoHt0rm?JXgbOM91&O zc&PN_J29d#oDKwkRivuh0;`(KA);6lioI|RzNg%{M_eZ1U>Gf14FhqZ*n3a3>jQxi z^uFQ9^NtuRs*6t~z0gPA?mgA)?iuAc>|tkU*z8F6%Z; zwZ6X3nrW{r{m!Q?1rKsio@5K6*Tupcmp+NX5^7kVFNCm)(0d(UMS(T$t^%nwA4&GR zq#?(-ISO-BHI)xhHu>BLQSTsnC*)Zpd-I6wVwpGc|Lcf>IQp66bekzou#3BWXU&Nf z$YS{5V|FFe@ZRG7rK4XKM#j9%!IM)6Yw zx!1aNrIfU!HU;P%uR1E)JQbW!C8MUuwRSS_*Srun;U?M9(w{x1b8TmM(~>2AZoow$ z^Z@}bD2bt>+MPNfoWU2}^!NA&y&Ik{UdffLGft-|S5{C^sC*b5;{KgGpq_Wwdyjp5 zk467;ho;IcmzOjvLUHE)*>eI=iotD-9kuk`wVv%{-jKb*baKUc6Gys~5<)#zTlVgF?|EG}v;BFW972z{Y$)vA)Rjjl9?j66l7twa zl6IBEt2W8rw@|Q}n6Z!bpPvl8x_US>b4I%V>656}(kE`&6ZBcv=)6pA(JBRVrlpVa zW#DRwIYb>s24mNzLO9q4lkS!PWr`qRQvdALFwo}QjFim>6q+6wT6NFUyeH&8YvW9t zxw32|IL_0MTf$vRTofv8DNO;ju{mhViam_|Feklcx&x};*NNbaue#S$OXqh#j#Ou% zMM$rtt@+Xr+xbB3R01Kg1gnWm7V|_XJ}gDz?mL8asQ&h%wN3(|$$hE*5#bru-47*V zL(9?n#bBL^Fe2Q>F#>hY_uveCNyTDKuY=7nel_c+QYQZ z^Ii^Gid;~C61W|Zj0N-mqMB8KjwHC>FL&FIs$Ts_a)>>wdp2wEYesUg6;=EWyZt+i zMk)iA;2-B|8uAtDsm6Lk_?=$(dW@DT8#zq}T(%>`GZbjh?$A*w>1cXhMO^pu9Z zAXM~Ut}iZBWXoW-qmtUcQo>J|S9zJWLXYPSD|T}&eoztljYkEERyQJaU2$)Uxio5)3n?HB!PUD0?qww5K2PbdAT+e<%1@TpodTyt{@t zs66+&u_U)ha$?4{5Z6AaA7@aju?Dcd`Y#LZcg-rk%5=WnXCsUvjcxEOMt66Ts@+yW z-9fKO)ke#$Tm0_s65Q*8)l9;7CHny_-zZhzS3j;P1dSx4WWA?sjJP2Gxv6k-_s#9? z{?f|gg7a1GJ>#>|!Z>QhBAEB2)6JR%_Ok;7NM*2x3ro+{4&^c0*-9AlVABC(p0=7( zobm&udlTbFKUFvX1w0?KQcxhvZ)i>DlcrUTgpY>}o6mTsu2@u~I3dW;IghQa3iYrn# zUoCv=fkZ8O6sQ$s<0hA>7mBJ)CQ=fMO9uoL8ld zzJmL6WWzfiC4~2Nq+&y$#7N&oBS&wyK*K{Y>re>wvSWq`j$Jm7b5*n~*_Px0BO@Zw zvUInI46;d3KtX8Y%AAduEBE4bA<+I#DmBO3pM8a%V{khxIDnIsaGzI-V>2$d%~(ms z@?~uThF#7EHGBISCytH!>~d7wC1~r=I58JhRaMnmX^_%Nb{p=mq&^UJ7y=R(M|mdH z#;k9UBXKLR3HA8s!!$nwqlWO7+J0}04Gz;sJT(;Q&-H?w?go?9O7EDFgJ%msPofC_K3RNAz;GOLm#}6@=4=<)0`IB zvJPqF6nQ$zeGlgs63uwR*ZRsf>J-&#%49-{8l%z|Hz-Cu12!zx;>bR!81NIt3t=7s`8zQlrZorv`!M=Cu?{PNkD z&km#=GIr01&v-#o=U)E`{2@Kwo?9KGJZq^rxhlO8TyNP-Wc19AtzXSWsEv5KNj3A$ z{KIz+bH2VB*TvsD>qG?tnAY?;gS%r-llf?|2tM0Wy|#1~7c~6#{`nH%(phx?UNUHo zot$={c;$!ic<5h@W;2NbjRV6i7{%DgGBLU;t!K()SHgn5$UY98IV!=i$>wow))+2w zE!{0ycP#2Y^Aw6lQz3-&jX|*?I5m*Xw7WErtX75MGR~Kl1pZCuPMAYK%l9=W!sW}D z6kQJ4*0QM9oG-HhQPDC{+^`#kfZ5{LKqD35PD6i6#o=$o`|wuHPxWAQ5Tu|Xv#-qI+_N>{MuQ!xg@ zOR(gRFG0Zw9(9V%WSF3S(O_~gCv8GIfJMI`*Z=7rdB_uhx?X=Id~z8S+74M&XZfye z!D}z!=;FT_{e&nTLVXcO7Ec%Yi7dtBjjZGwo~Qj*%7P2Zn$p?3x}|&s6tW={*IKx; zi^`OFIUjG<0MKjcVgfJI)+?#nUbH*CMJ|1<5_L!Na=6aAsU553)}HRHGKnW~Hd!WS zqptUt=qyGmp4WZ9bUpAS*wK0u?xbIph9$EW!}MCAX{F)`snl2ksYa6otG3eU`YP6F zxb6|&#yaaAw|iEL^P+O;n7F8HcrUsu1>9QrWvHM)+7Lx8ZA$>i)hYu@&U+8%9+Mny z96b0fKAA+=!S*_D>RpOS4So1hqpgii-<0>batomvuIW4f+qSm0Qvs=Wxf@CVU#{$3 zWhCC#l5JeqR~&u4+~^qU0Ix(_5zq`u~qu}di}BMptq}e+9*8dWJgu7W``J*_QUd4 zZF0e$<@Hdt4Sh<^My0`8ah$wu(6;DY))IAi8<489WfQRHvTN%<4+9Mvr)B_|I~CvO zUq%=@Yq~pGt&bYz_Wj{r0ZlTLbQy)vP)?|!E(dP^q!fbhx3nE&=F66on!Nc^|ot$TbzWF=bnY;hd-#QwYHE z$6ygGldr054jSB@bX~Sczm=lT6&*qN>s}p_fU%L^^a`^c)mSh3!wp&P#5?&d1UoA9!BBXw8nc(>skP#>lpA1`;} zLyEpKgTrY&Q?X1v-TM3U29bEO$p?4?5pt3;@_Hl-&N=$joA~Z2?up8I`wXF(z)a9c z#&wt7L0{mGaNwyWj7VS07aa56_Q_Pj>RG$;xr%<$_jutb3IsF{b|lL8mtNS5?W~8A z>E>#DKVP~O9Ika@FEejJ92wyzrMfF&B55XEY7=^K+NSsvAR?}4p-D%J08Zc9%=@lX z(a|$F+>-0NtE0>6FWV>lC@-}Cf_@>dCRs|jZxgp9BU3v3c>&$qM|(HvsRedl_(1U@ zQYnbowsk#(Y6V+aYIDo~h*VmU*FL z2||GkqGvo02D*SGauC$Rg7&bv)__+uU6n%Gj;SYb=pycENJScBHb$&pzv@wUsq&q< z7{OO`vos^Jg~7xw_U%}XY=j3MGGM!;b`vLfhF6SepTxr&~#z{AgkGa zZL-sXRrUqb!Y>_BH-I^CX7rIpH>;zQPPXcBAA?W^nFp>s<#|-0hDM=}n4Hq(fF#5j zC4B6x)R)jIk+CjGcdtGSuMl)c>LZ6QPKg!bT(?cgxHZbsUHUq2Zaxf89(ST z2FP@pJ44(HrG({XjmDtm*VEh+8@q*hQSQQVXE4!A-o(gwN&ku@p+HtKXU%qvx*e@8 zdM!R3<`EOgNs804y7YL8okpn*quukq-g-P%%GjFc&2>p&Y_J!0!$4NKI&)Uo{na=2J5-?|;yC-((D)k(iE!ExfF>f=YV zW;Oy}xfM~nKRFUW!o{{=E@^&jslunwY|PS3SkxA48`*>YJr%%eYi3Y?pJCaZWk zY(HhBR;j1rQVR*piApNiN}hBbz7u0^_qDLl`Q0XKZpVh@6(8T&3K>g3Pwx%2h!4PZ z4RYz9Eq-9Ejv7ajr6-nfvj(K)VNOn2BkD$Ky<+;M5#9-dRtu-`Qy84x<2kOARlhb* zkiX}5B5aajU|IZrSjNGmXc@ts+(I!{_1hV09s->0Q& zbpE;U-v~Rr9I~;mXP-Mt-5T;VqNjlO6n!Qk=qS}6nA>B?W<8ilE~d#dC?1;8-c@v$ zyjiQv-ntfLKcx9wThDZJjz>TB~C7qb%=9n8VD@QRh`kPJOC;!!9*Idx%4f7>B;!PbR_S^ zOj!pB?o~61QmUGbRHnmq?TNK|L9}a;;W}hLul80-O`I^qwcI_W9!_a7*lu=lnvFk0 z;|3|jQ87;fr_I)MBh8RNxN&T)@3zslEWP_Rte1|{aSwO3n+3+PF`v#YEp62c8h^|i zia4n4smSGV!LFh8g){HRVRB!{(C7 z@E)UVcy@3T2y+WUg$ECqcf@80#%<$+zn|V)zdZpJw=_3u)zWI-uSRv(G}h=Yh+Tvi z#L#SRY*YY_)kb^!kte<&d+9WS3`PS$&OvOw_4MaeR6)V3PbvTv%p`^;8=2Bd*ru5y z3x}lquTwX04endC6{>_Y*gNN8-6xFmZF5BdC#2WnqwkthY)Wgpu|?RcJicOd!_M0s z4Gx>VVe@pMA8uz`U`%{cn<;OzcRBa!m8Y2LJu@0x2|DuZ-A4_*x1ju)=d}!`M59`G zlL;2J6V!t4HdqKELfD>%onN}mhw$Y*EbBR%U-m`hGsrC09+HOTm#NVTiRks*IRVz3 zB&U9;c_0f*97ppCZ~fQE)HdydNS28X2>`Xzw;s80`hicLAw5X$Gp7cU;LIB&Q9tqc zC?22CHZCgQSR(k}l2uTV=k!bKVp&Pm1(2bsU=x&14g&X@+52GeUT@KNM+ysvzRS^4 zqF08D)UXB&eNZBZf<@O}Uj_K1adFP=mYY|GD|1m^Dc4%i6E#9Y@uGF=V^W)w?ih0H zzn-(sej`gD9>8XlP?A5?Uf@uyJ=M$GtlT!lhlNR7=G@m^YGzAYUS<(jmaIdu5M5Ke zMZtHh_5LwWZM=?}Do_M*T>-Vte91&(-&pqH4HO#BhOqPZ{oz7*$3BlSUdI_Xr>EJ| zrV)67vh&xRhQyVb-J#@CxDS;pNn7S1YK@;D<$$U3TS$BG%`Tidk2h;YUjlUt1ovJm zn+RjcX9(7LLIpA&i%`MWrPcM*DN>ks1jiMk-c4<|;JWt9?zPU2>u(dw56(Xc#-|g#*=^>A@2p#&k=oaPG;lO%rBmou=oo|H@~<-+Qi5$? z#Njd(&eM+NL5CU7;3k612D&gv3P|ls(a=o)j8=AVL$=_&&IJ}YquGO4JkI4`D5uQg z(!yv7C1F0nL7ctPNhuT_BH?5`zV(83pXr*Csd0zm4sQEF zAJR(RI*9MO-Caqq5jWn~yQZeYh6-$w;oOblv>MqfrSUH2Y~p%yp}~8%ZzA%mO6mo* z21`Sf+j+T$_)cSqCk8XpETf=69WAff8ZsFL@bJr|LN;s^bM+6Zd4(uesH@t~L4WEl zxIQYDQ0Hb4+1i3fiBEUmfflsG%WXl{Bm_!M!|V<+yQJhiv;Boq;zCBjK~d!sTHt=K zcu#;PRU?Klndg2P=1J8Roi>`Z7E!vUAebcv(_ibh_a!9+z>Lk=^5`}#TjjR4b>+7P z^hD`VUy?1EZcD#dO^ev0KQ;S*%;NZuT)LJ0 zalUWMZyU>eJ9!GfUAu3Zjz0A(E$pET-S{#2=qD$NY}s25^qm--nv=_4Xer#C~pT+csX; z;`vu`x@bs>I(nBIuvCly?$%KN!@bfQ3{XdSkr%vA^4fPUOTzuhu4l`i2WjayJSkB&!PTzbzwO7Z4uo6;(R%Zgqto`u#=FNL6+9I=>o} zP>e%rmxgI7a{|`&EmRkG=UOFa(!TJ5D4@aTrjy>^X!TtG$vP_!WWE#88UL&Ae zZdQB71(UTQOH#?E%g3>9Av*Y%zyf(f=&ekdIv+B2T=W<6;ZxcK9UNl-Z`E!By)<{w zS0X)A4ka@hjE^TXs23!rV)KO&x$E-zFG#I1qi2%sDuf&K?Z2{hja{k-YNnxNKAT>vzfDkFF1RHbz5jx0Pmm-gG1<@5gO>3xqJOwD8j(%u@;_b zRlLb%Z+m21(dSZraPNELyk8LjU!8hbCr{rl4?M}YR8@txMEanl%wE9wrSyJWWAIWa zo@7cJzwD_`kU7^$k`@)4ilpN#o zq&E>Ep07mM6co*la{i*KT4~@;c~x)8RQwrHgoQ>_gAlBVzW`l7Yad)d+e(D*N511H1ZMD<7_5<6`W)}@$nF^*;OWFdbpZm4^WUu8QllMR4l`C+C~W_6({7DfiF{c=!_ zZ=V!G$%{dr*2Ey(gXpzZ0bHTP_|7+iKuMJOdmNWYetv0&21js)Zh=CSfcV%I|GJs$u z*|o;?an^KleSLjWbz*ri9$Z%#^#SfJu@!zHkOF19o+_*?u^fL(KL$LR z^pNlu2aSD4Q>UwHYD=IA<_vcGK-=XX7>Uyv%TjByT?TPy*9E;eJj;}W+`;0U_3{Hy ztfKGra3520etFp*AjMp-KrhoUH#Jw-F36`(4@_$I-Z0^h%|DbZHqlyw*WyvC2j>Nz&iVW2FttM86%kTDUntg#D}$h#>< zve>E_*76Khyh^D9P`= zJmgoNAqEPdnl8|B-7C*h>PV-u)7pAMzUmP~(!7#ow*@3J6j840S!tA5#?qB$8YQZU z+~E#)kO8Bo-Tv>6xd2WV@#G0X$IQw)yEQoD-HG~u(EWXD-)!3@%+mk_@*K$CgvU7J zJxwNd#j^yRbK9rRSY$ObE7F)|iItxH5Gn%Y2N8f~qk2Jkeb;lbX#Z~EU8Dy2hyYU3 zCvQSu(Hnpa%e!yWCTq;MPl8(Kv2xUFhWP64;_!6zc^!_8smDG5Kq6vl_&Adm^K;jh z6({{h)KG6vug}6R*-*nq=|~(9PJ)E?FyZgWI4mXickog_&64e^1zE7^t28&8xc^l} zU8KIn>}+wnts(}XbNsK}Aw8A@Lj#YaBiC{eN5157VNJ62Ix^*W2#QF{SuX7d!y3?f z0;4?*bA$^4^p)QO(+9((+DNhf`e-OU5=1)!N*%tpWujoL_~ZiezrN_fezD`sKJ%w* zl`Ut^oRQ!cF)|q!%4@#|L60EpFpw<$0s#2+Zu1+1#qDXXEr6u4{v3r8HVc%H+3qr^7EvO+Fo;*1Bg-W$X9k-XE|K8 z&qrDg00wouGQYpD$24KbVb_nEuBu(Ji_)g)7$-JiAs&Dhsx>L!%`pYAwqkyeU=1yF z_YB&&BGVCQOj?7n?_#6CfKIvEgt~g)p;yM1UDux zE#Z#LC$R-XHJ9McD{>d58HDR4jlv<3fK?}6zw@@rBeHosXFT?XGzdU*GO*}->oy#3 z&hfqWOH08XK>E5qe$kvGlxs}-1Y$aaLDPkGnz6@Uhebg^?cifM6@SlAk()fPnaTtE z`mGAnj*gC;i{+}uWLlBX;X;C!R@c5jbG9gZbyEPNxm~=7UrC-ZcQLV>aps3cSJkLt z*P*HAsqTzjG-5W97{rN=JRaxAYr$BsX4SL8H+6=1RySVUm~(bbz$$#6fU+(=$7`D`x4&Q zZ|}KRibfGRbOBia^M{Q5`lzg-`75Yr!^L@(7+k{X=)_!Zp=Kdn{igVqe@ z@19{m_2jaf7YB>6+DI0jBO%jbm@wrU$I_rKK?+U}X2XoWcQi~3#!Yl)E8(?-zvWJj zf9=;kfT| z7I=pC$i^8vT)%cP)*a%rp~D!Ud4Ec4x3?(4*tk#?VQf5YIp336YU=Z=0N`I{eI2jk zP$TupL{hfJC*Z#6DqbQJ^gp?rWN*Mx+yOUZ(IRJLpX_B58IvYb(yLd+BxvvDO%Dj6 zzo!j-xDtklg)9MQ%>^b?`qn8;Ja*dTf{gkH>Bo;B7b=PUq^J3p8 zIpM1JgNK5rHoM0>6yS=Q^SD8gK~W3q1SAV_Q@r_39cAm5;#m(7v@C2q+R`B9bpZNJ z!_gI)PM#h_9!EzfCsDI_hdq_PaoWzF~K=`x(y zZC6R5b?+-@vjLC@-nW*Hr43maP10^|eEfnw{3l4=KNjCm3zg>_kt-^9EyWE;sPfKx zo&H}^NpS(yJV%F%_!sL9}(<-W$-2~WGi&LEhj4y5ywcO29uGrx`!>wXspl}XTx zE{sp@oLBn8C(Rvt!yhNwX0B$0Vs`&U#69|OJ6xu}?tfn$T?hfDJkAu_qmziQvUnXN zOxf(MKO!V1%4w~MDxh_%+jf+&Z&KPyOF#HBvJJU&=u1cq2yER+I(vh`l%L5MQxa8Z z-fqZQYgaCMKOf;ZwHmSc)2TukN@Go!lV>50Q;0aljUSLbI%LeFf4qMQ3tkBgI z4=Ys4J=`_)lggB=j3(xz>yg0GG&Wxomq}Jgyc+4ti#4D9TY=}F%11J&ZlxGKR~TEU zcc<{eiN_0jftg{K40!MMVOO9Q)UZeVq*>ku;QWhMDNqKC_V?eN7xx0KS9jcBI6|*0 zt#pC|;4B&FY8fFC!*`H8x$E5V651c39OBS+&KQKh>Q#WzLuQ-Pa%B#RmF?gU&$m+k z{MSQ*H0kym)G|{)>Z{x2^DNY(mr?|^Hr2@=`xPFJ=%80(D%s$puyjZeW-n)ok@01K zC$?o=05wNenSIG1u68Y=Pwrxn>+9JVl{g>a4^Z6{cMeh+t~{gcvfe68&KQ6wYWG4( z`PTONBy{uVPEj+#o%X8w`OH-XcfCp8JOJipl`y%Ja`fc#eT|Y zHu+V_Iu!&d%4?a8Rp3tR)uAeGUSDlYumtKe1|VvU>gfp?lqZ2u=XtK1ego7t#DM%H zWMJ0s2uUFYaG0&FvE?&vU|xj0kotG)8N7TJ)F$82 z(6C^BbD{J)su2FCc$=;!WR*Bw)uWiZ9px6}uGUqOw~!eJz$zv)5@&z(ro%Mt)J9`X zbceVUiByfrx*FwiiJHkQSd3Qn-o;7N>g^Li0#BBf%*oO8*+^*IMSTd~r;@wQvud=M zM4xE>KTij;q@b`?Q4B@8neq)l$vCfcdYmJhZR6ele5o~e4%I70lkO#+YJ{n$cxw@0 zQqWl09S40eC5DwNEVU|gqEFyd6dh;~g6QyvQuwpls7$5PgwqdEq#eacA7>8=`AlbA zWqlmy8C=A@G$+~^eyY0vc*>>M+)lK%Pe~pYhlEO#h3mB(MQf~$F1xo?7uyJp*Q6Jg2QO3*!D@ z(foCdeFa86{E=j{OqpU0qcW8|)ffv@R--7rSDg^~;m%nOvA-S@7+f7P7yr1&WZ}bF z5K_JJYn!HN0*InR1K^dN@hv6>ST+&f>>v_*Q#!t|6C(tUfws55@6xSal~$bc6@(Sq zHa9mbLB+uEWZLp$q`z?{a_ADU2KyaSqs%tAv9y!Y;vcmX|0Ot!ylb)u(G%)r6GXR6 z>~s_K%s4(0Im-@{6|x^|whms1N}1_u={(-hL}KE#a?tDOesPS|5MW<$X_feZnO_(0 zh^C6jP%j;b>K1ROO|VhXq4}G{f{A3v!I%hV$oM9!c49OG7*U$W-sj=RZ5}Hs;AhgU z^vFDpG$S^(wCn)n-g$-4?1?_Wk~;-X#Ur)ZY`YYIXVkCKJB*ers9kIO=Iafm&r8dt}TgG z{Z}I%+uN77KW_L-%I$~2V0ZzQhum*<42hV$eU^L#;6pi)>I?>t-%t&3eI)~-_iNs}YrqyfKBE_||Fk}$Rf)3G-kuK_ai!wRtC*C)=)GF|Lbz0nU43>Dx^eE%p=^hgR> zsLBMT2LOFrRcnRi_L%<|>?D*K=v}u`b9isUI0*|z9B}46`|)6?XhoN15eVCP(BfnQ zP-1b6pDpy%z+1UvHdJEDexFet#xGPf3V7>q7^P9dIfGO{^v%!4)^>MSS)E^~$N4?R zf6>hAn6p>vKy0HE0RvL<<~ivo$NiJ|w}(Fz_=D=JoVWAg?pe$Qf_ie2y}(IoEE&Lr z&4UEGhajkJbx&qSX)@-M26>7T2mTKq5&5xW1X49a{v!sABZ_|C|Mws;C~ZMDng&7T zV2C94V-QcZ1pN<4+44JaHv}47O=lg4IH6acn2pXR*Khr4UYr`o8R>NuBLPjr3zZ&O zYr#wShGe0#wpW!-Z+iFzNY-wK zuZePtko>G}c22QH+T(vX5vG&VV+M-hDbJqsO&T6YI>ctTv<(d#>*;#W3ziC2jO{9@ zF!r5RH&Zi(vP)(u`SC zhwW5?|6|W6|StF`>9 zeu^Fi_wGk|O;AS&cHg3B7_G`2F*o-F#71;fU}YzP*pr<-eJ`_XaN6}#Cf!cY{kR=|`m#?wx6>9Tjyt9+P*hI%kXn^zY`(Z`}f0@k1`SD@p z_-bzx-py{y#M;f=>=7+rQst6oju+*4@k8#b0E&+4y?KkscF&uq!a>XkqBD3PM84KB+iTcqz(Ct>iA7~LC-GGqVqAf(CXC-BFBY! z|1r#;3Jtc7VPj`km6(_~i%F&iSY$AyDE{XKyMA$?)`d&F;GyMJ>Jy;!pCkOon~PI1 zn~zjbdxf9@_g>tdQ%duH9MHoKPx4|Hm?ZgV9ypaLSxNsN>&q-n(f1<i1bSBU?TD>}Ux zPo9Vw;QlV!ralZH6ipOH>{3+lU%ZPyggG3NHIQCh%);UDxe?^_=4bu#gmhd(ssCdq z{+Q?KNB?ZVl>{!(Bp2-m{s_1f+5fsjTew75ucly>vHGgXJ^TycM=wcy^w|sx#7$ICLlF^zZ+VCuU_Z;(Nu)$3PmB=c5029pQv!I$k@Psht4w-Ln)x zHTmBbp{q)MbYj<@UjG07G$c|Nqh9PP#s$=(wAj4}=)ZsM4><-OJrvP=e0)>`QH3US zP>ZZGvZ#&u|3-rH=j;I`<0>@rhV~`ePVGS=s7;%_ogF9i+J`9Q1hD=7w?hoO3W+>R z>YaL_|0WSlgjR(T+Txp1SFtH1ulu8v=nF)8|HVx`nI$|9?Ok1B&KB3_7x%n#WSi2* zAYUC+md)g1+`wK$E}^vi7Zd69*uoYtWQk3~RC&!b!*XBR?e@LU4~cmQn=#Cpp+OaD zwIYy`_+Jj{(1SWpPk)4Y<*ssm$DLHqyCu$XzAgq;%HD7h?vmhYWAtfc{Es!__*}j|pY|?aP zX9OMobC*xn=|nXc-bBSZ5?*?dMi~22wJdy9dbdxdCMm8^IU znK%GvHky=_{g@u)znvl&2|6C;4h<_q3iVw+Rr!Vw#%x8-;p=QX91O3hCeT@>DW*kS zfOr^BdT6Qqw;wv$6Xr4q0SaDJQU`16V~NMXz7EeCFmGVKWWZBQ*=?Hh1{~6N0%4R; z8&~E2Pl&WZd9dC7ea2hLp-4iHqqzh|JJ27lfbZ=343nkXVZVhfAXk)((Rp`L?sqcM z>588`fli)8c)DDw=F0c@u9j`KY~t5xEu>=H>nduRYBuxQMMu`9ef{!9Gh#*u4BSfQ zjO^}E1*pV`${jc7FU@oTYSyoS%UKlJ&y@6b+@=3Xe5C3;-QT$|v9(U$-2b}w!KYN> zj-SwkcUpR!ys3(qAc(rzncr%kax}{icjls1iq;dw%GgSik#LyF_(G|&Fk<~ZAMo)6 zfV|wvexKZX{~;W31}L6TnAnFjBge$HJ|i;Fe_ z0zcsdpyung(kebEf|>@@1^jR8o-`iHF<#7Uw{IkK%1J1DGVy4;k?*MR>Dj->*MEB( zI5srAo~H>VNqZuT`u()gy~THP?DWbc@^3pT5_V>$Orv=rh3K{V7d}PqoiSbhA{Qs4h_}Hmz1V z@yi93k82Xa!!~>9toPv^97BGHsNqM*!@#*X>sPFIFA_nze6I;~GiqPU1BLa^abU<2 zd(ij2B%xNb9&*=dYw_TY(^6%6EI_sciWBeZsVEiemgQxA(7X)KU3V@m*4&P7f6%QG zFnH{FY8aMX{hy32WjRO7L(k{m-%(JKTp%no0_>&4RM##hyK5_G zivio>1F>_8mwi1{gXog8?m5=;H$XT&5%^r$rt-CJh|+O8z{FSNbg)XL>gM)#d5z^e zwKgh5G- z;=_YX2BP{4q^+Ev(tf9u)bO}Jqwi84&1>(ysAOQGM5OVH_Eb&z2=&)*cPAIzHarK?`_O2ZRYcR z%vG!ILl$m;jxhAaX#?|9QkLg_(!c*9dn@0Eop24avslLMeU2_FbvwYY(^(CPl!8)k}0DJe^td>w#bo$4E<)IPF(6-aN!I8V1$i{!DVCMMQ{ z<>g#$f6dX*+uvV(bhuy5dp1|^ll*f+zs>ER zkCv(znd_yV-oC|MR9j(oKV?chze3|KT4 zEI0_nQToXfw-~koB_o~M=Ky7!y!221Iz_aT-V`bc=) z@S88lDJU%LZOuI?S9cBh5ID}DxH$G*vzUZKJ7a$q`z0Y3VuhFIK^fbU4Y}#a`~@=J z$&Z1=U-=qbKIXP*Roaic_V<*ex7yB<_Y4gY-_5YojOD!=C-9{sv0-Vmba^kC#J(!| zh?j`hw18`(#8H6-?lwdJDd!)e@XzJ?B_Ok!ki-J2c+T9%y!+H+iw5>@zQhkzQpYFd zl%a`+u=38uge+QH`>IEL9wh4w+maOvEwP?qbc1v`nKuTjx#lJ}8Hs`pPPSg>`Xfs< zJgXAw`f`Uy-X1Nyr6So~d&xI59@%fVpJvm(xinfmynV?6ZXJQON?TdhBj0QzTe9(B zHH_UEbVaQEzBPU{K8b46&g1qXrC6Fhxj@J{CAsJR?XXSJ&=RXD5fIpUYesp05A>cV`j}Fg`pfD{Gsou?K z?K+1;DzfAOx~Z4WEr>N{=f6cny{Vv88t!u#%oYEPG0|9&o&Or)xa%t>7zOy@?JeF6 zO4>A6y)Yi#Fp?SB$dvK_*r~+had+Ic{qSh_<>jwot!qnF*b?LI&>3-i1986Ak)Hp1 zz3=H`MAr$GMs}p@-fDK1&E5GlEt|_>?9_kbRp|X7&*#tI@kBFS)o30oHV6SJ8>$*R zO#!?rTBH7+^Ooh~t^tHMg8cW4^e+v};2Qd6*XDn1@YVCSt@!>aESYy$aw$Gy6xaW~ z;8z}H?Z>%%8J9f}h^5{!jAkN@&JVIEnSrTXjJg1au#|r^|8|DzV5tA-{ow@PkxVUv zz^f23XIA?q)$L^RLzlI%+$7!)&!(vOcF%36yY02UPhEt8))CvIAl26pI?>g~cVU_J z%`(~3ryfp-AbZEpY`m)*m$yIZv~%|Iq;i)(^;UVa7Fc;|a;JNjL|Bh^+%V>osp3@(EUp z7(CHt|0=>rb=T2^CNc-`N%rebkzJQYB(Xk&6AvZ{)6J9eD=8^~xzmV|)g z63^D#%4wi%#o>6-VytVnFL!*B-E?HJY}rtRY`XpJO3}hZh%T2)^RtPmBCbWw8}t9K zvhNIQYU|cjH+w6hs34%y6zNq!Is_Gv4pO8AM0y9Qp#&l-AT3DmM7j_{Pv}IY2}lj0 zgx)(yFClQ3`<#2ed%p9WyVYMjkC4nY=Uk(_V~qDT#Ki8d}Gh7Zw)O4kU_S%jgM{3L@U8S$8ZVHJKw}Sirh|V9& z->h$J5*D1N1D%h|NB9ZC@RHju1K-kO^y`_um)hl%c2D{f#|vULx3HNRiRJ=WpDX{v z+x*-41X8Cw6716$PPFdK?*W|7$$9%S-b~-36jk>C$AQT9lYVYnMjWr@$X1x^7{LAS z0Gayyg>@}LSi^H?!DK^os=Z-0-hG`=H3kT-c*i_nENi2!j=rzRitv6xxUO{nBT@bK zhp*pF>|EKP$M=E|RMYdGRUCiBIOWyHcSKMXWf%h-;rsPVw(A76GcK>I-3t&~PM_R2 zf%tQ~q~18@^#ZEw8f};Y=rjdFcB5I*Yh7>ku}mw4CBGyrxNbJV$2nNGwzI?i^gS1& zzg`i;Hh1H=-##rx`&z8hQ-qaR;_G+U8QnE&z>I(Kj#Gw$j{r0a@yu);9Z-WL~scLg=rDAaESW zrHRqi15@Sbb43*!T27Clg>Lu#AorK5I2i%^gM}f7h z*Z6)0Ci`IE#!kzV8hDa$QnrcYM|1*uj(h^tH*ASFT5J*C3E;?McY~DDuk0C*)0~2Z{*7&5W5JGSr5o*jm?5Z*D%IE zAACrpi(QlTz0RfcES)acSmfYBzQ{~g$iQGL=A=MI zKj6y64E2c#-wKhc>!0s%m<^Ob_wTQptpmwnZbgq>#Z_|8j6KCrr|k&Tz~ErDPHUtW zU7DE89^qz{^?IH1U!Pjn>$cB0;roWKi+3Xs0ba?YwN4>YRwqgFSFCn|C(l~DA~(_@ zlMt$smgF=zgTzb#);o986md2|^vkeli||;?@C>F0Ilfmne1^rERe!>+`=+T<~&0n}9*T~d( zvk7bZ2Obk=A4+Njm_?Nah$aI*JU#l=q2_^>|+cDJuf?Uq z2iTK&k&UY`XnM1v-Mm|({0hQ!7ETV41c6BpYdNeOtB3x$(1Xz{bC{MIGnkn5XH z{l<-qz2y3tZ490Gxa=8u&y?Lk%%o0@RayCCf|;wEe= zV7~&^)x&{MLC-$aoB7zrZ2IiSsqSV7+nmo-pdv6%;v{m;oCIViwN{;aH`f&W0NLgW z+zl_)ME;>&LF3htQjZXtYhgXDzPv6@6VV=}m(9B)Oz)*6qx&SETu`Z~{kD)1e-AtPj5$U6loLzLHxVkwY@irT1;H>h(8+ds?Vv!@pOA0n;08MkG4;}v-pV=an{*g& z^G6ju6cPC&4Zaz3myNe0f>kRdO#T*Kx~#B7uzk}-@YoLMkI1+Wnn%3iRTH|aPjf7h z(MrmIv{Cm%$jY2fjH7DF5w9xMJEgeoAK5+CQZ5aWHIpFUCYts?R_+M|YhjpB`QJg@ z{zMEZS!p1LsB4(UK7>dc?$obOxMaWk+IPC;`33>Gz&g99Xz0Gi%tvld0Ppq&)J^+W zc`x&{>&pGLDD#S zp*vhW(dBo7dT6XH`a#dxGlT}yMMw|xBh*qLBdR3}`=r$T@qCb1`s(QRRKnfmsuz_x zn_7M;>zi$%)U7q^ASs--Y+j#Dv-V$~%s^m#gk3(n`)U-Ky568q%a)H#zKwGEEo7<@ zoSs2fs@K?Q<;yAPd0vh`DE8K$|D3|MT{!ROV&quj`aR(-iUW0%USHi*x@wSek}t0- znYO~82!}2$_2p`|Xi>cpv>*Ur1W_+$OEH$~es7utT@6s)sYQY5)88q(H0%}ok@nC( zMK|3NUr0(}^KJv(!^%_)W3QS-0G7a3A_N@*#bmZQ=`n1nQICR|BJsp;CJT?asrcnE=S*K4xgsr6jM+u67J08QGSN6AgazizqKyDt8gl zg$YK@bl()IMTT{oQU_b_p74eYh)d&$jFetC9lT1Rch(IU2H59(RuDP7@fd%`bCh(bB6tbQNl8QS|yPM1W;HFV>0ZDVD#R2AM(<-Un6RZ~C{G6j|| zodQwC6M=_Y9nS?m_BZmUyBEh^S5j!J2vT5SBRBSdA(o@y$ULREY>Vk#Ez#UXQlA?) z6_HiiX#Yjm*gB(dHwCnaQ#hI?^xN8}a)}p3x!G%f4P8}%v!wd9^NLw%Zyc1H%_dy% zT)hmN%LwxxhmwrN8iIC``tG0HfYAB&4S9oEDiU6;QCFF+TBrFGn!3DVxuRX#{EP}z zkS6V{>joWN(rQZIxIrFWT;6Hk!8=@ZBbIsksyGpXBS=Z?Z7UI_aL>g7T1F|G zI_u8kz)FXH%3CMR)S7cPN5?~Fv47`(E~$cc{j7+UwJPO=`#XlH?}{rrYQ~_mqn-z zQ&FGRaEtG&E80KTi8BNUCNb^^x9ug%T7M$tO*Q1j$$VL_2I36!Sc;`O_Y!Y~>oCtP zi|B*^0V-`Sq6UPPymWU;zt7c6Pt=)^kkrA#dPB>YUlO~w^feM>5l_Pyn=dp0Yh!;_ z0m8FWUG^`N*@|-wea*Y?Lg=sUwtDf9mM%1Fjk!b}RQDks6)DlOZ6NR_>>wwEXeg|q z`Xru_M_SuCPL_Rr2jc(mXal!#J5{zQKC?3;NaT;d-kJQl|2bvQ{Uzk$*<+pS@_+oZ zNxZ(~ap59mW#fG&>FVObz1@sHxNF^RzeMN{&NQV>%aX?9u=-A+gE_{D4|h4gi(C2w z!6FsVKFID)GY}tvt5fSd^ypJqBpw|3Q!D_oevbjBQ5-cwh{aGVfsJR#L`>ieJ_3FF z*Ht$_i!y(l1LW!#bM);bcg6mo!b)|OIOR}WQ{E*s^Jz_02DJn#J=l@4b8+fPSW&K9 zee73&a_V{_6ae+wry-B{X;%(CjIRRYn)r5_@Baa9(lw+ATDU3daoLVl8wY1({Q=L` zU^KH*2vdqjjT+%_DC34f=E%Lqpt)5(KEbY2-p)#@aCzRR=6A`}a*D@ha0AbE>@Vgr zhv)JtaS_WWxnfM#V4tzc=nPp21b4ZK%qO^#u8i=A@p$*@kvs52H9eAoV! z%p!`+-tVf1AKV%%=FlVJumR`nn6XfpNvo|LTb5Yh$)BKN)%n(um1EIf1hmVwN8Zvp z)bJemWXy6cyv(=vW7@)W)3vA+LlZUHTd^hgJrabWYhW(QR3^ z)++>4jF-{QWn%@Xq&da_8E(_qog08~nafzckN(jW8RA&O!RbI3;_L&xlvfe4L;v&} z=?n7-bLeHQH~0O&vb4;~p6&FEYX)pza|Q@YH{epv5P+PHj#^|2P;-0Bsv8EfQk9HW zu>ivJ2MS46sW&cK#q|Lxej9qoMzvqd*6g+{n)GDi`9sZnHiy z&fP)YB27y_xNpLVi;Zve2kR^(_pCff&p7HR;H!%i|z8ist5mu=lo|);T)N-J-N~75CbE59o}HxF-<<4W{E<%)^p!rf&Si4< zAlS|iBUs3Do30ocp`L)|O6zfCY|6t${dEl4O(;{YeGlhNuR)kKm3v-f^tn3UZB=_2 z32s$(&o=ig#(TnIJ#m}$@Jaa>F9)`CAYBpnpGLeoJCcRrNPDJ$94?`74k=uHqk zJ^lDl<30xf4Uh_m>n^Zayzg6zW60X@bdNy&2+H`#Z9-rx24q%4+$iB#BoA(!9nrI9 zkh%3d_=@xM*OXVa`vFugMYVGy>tcM^!21LVF4xKv!N;mg!r(V-@wK$^`A1P`qq9;q z8UGkCi2x4$sKPtHx>9atfjqZ7SB45B+=0mtXO4%EAOk!*!bH0I;NdpZ`Uk(IN+^n?Hrc1o4auKhtgUQ%lCp)_28!OU-EQlL%y z?3Phqw7qb*G(P1|bR_+3l%0c%L_4$aCx$jB-&}QI z#*;^1laJ5mS3~x(LtNngvD{{fd0uI#H}V6QGy$1bMl0-L>)@4bQs-4u$*a`y+G2CK zLS9AG)CMmXT)A=&U@%Ng>Eb*9o!vh*apgaHvv020v_7I^lJ%izwZKbOE`(A!j~9ag z{@w-vfCCy-qsWwU_xstt=5*h@`-IAqZ{ACqgWGe%lJlsf${do-}i=07f;uEPE`Xpy`7ip z0_OT`wiCTu?WlM5m$XpVY{<3QhisVr5}9w_1`^(<8OAzoMk9at416;y5R_>-V!kGm z%%JSG{~b4;Y@??3ky|E`Yp+SMZVL1?Vk zk&abA+)T=2>6x3*a|FmgJt;v4Fttm4**nDOOI&=yv5YvqZcr`DQ|v|6rRgD64^f(8 zq+q&se^2yET<&%(p~WD5b7?vFrsWx+<+#>J96y_`xIMnqxD{CkkmL(g554fii#)7f zEe1Hd=BP4Yr#=EogfuJzc_dJTOQ>WM(q3CF!KOrzfH+G>Xh`M&+QZzluX%LQDBy>y zqcnhvRQW6FxCQyXQj;l$H|*4Hft8&}i$jxiQJ*JNdD-&|XI`13 zBU#+>F*=jP7%SvgJMQwPHF?7wUc-Hr@_c+rRmO8ka{~=h?eyEOZa9d7P7lLw5&|M- z-Twm*k8-7G%NwC?TRh!*K3UO&9blh3$}JHOUDjof*vvR9wXNV{_~+8or#Fu{Py2p6 zJICthJ!$4_y*|Kg%@2}yx8LxVp{LpGJTcq@(7NJY5>U-)FH*QHmHafzi*fona zn-y0Ex9mOn+An6n0_&ctb1IGa^BN+4p?+0^jJkufWs?aitk5o}m{a99qkU z;Jxq5`89MuVGS{+ZI(C*0LErz0xB#BNXo)Ppp(fu`PGwtTcPC+q|vun_Z@!hw@3yM>ruK=T*Z$Xx*hW*^8CundfU_< zuQThuHOi@14N+tb62HsS`+H@Kf7yC@UkA>fY78p}ANQ}w+gARlnGbzn15^}ZisVvu z3TzS=T3-AFuCZW7*Sw=4)Z~&EaZR>^jOG-xm$o!}riDAuwbN?N?gQ<_4<>S|u#{As zH00es$3}Hb+Tl65;RKGcYm0Dx&We!Pxl$F-v>?ALd?uz@*C~)Z--?hXa7pz`UEQpk z6nK%$K%Y-!`(Bvi;61aPrsS}HBrF`|5?&&A5DGWL?eS3eJGcO)fHyz!#SIk1jf)*U zQ7O#c(qt$1Z;cKAGc@_wcDgmno2ET(^)6?z85J2BulDc-uWHm*^A-$a0u;y@v zqDyThoL_Ph7|p>I7uZ#$%AO5vly~y)bMQubNO`S!bS9Q~Y&ImSK6CAs5T@7%KTxK7 z$Y1|M8YVO#?A)2))D9A8@X&}UTP}r#)Y;>a&eLDVL^M*pd;`Q()PyWr9|C=Dt031- zU)g|6sk0Mz;J$uQUif5_;luA!Rdjw40do#Wi>R%Ae1vH>1p1Dm>74O%w{tTx1=M790(SOC$(eTtc6Kv~$cH`hy0b5Jd9yBotIj`r{?doa_CZra z$%vv`b)UVVdeGxF8gIGiH^E#MVY+WjwAj_{Wmr~$G2K@HmA2>hb^jkWtBc~plgSnf$S4}aZ9 z^~BTjH9ujS^U=kow?q2NDVOV*7*5`1h88!@WU)%c$jjCyMk2_>^o@NR!HwJKFkzLE zzg%iJgdk@p98~A=MgmGW4r}hmcn^Vd6)b)IG>Pe(83A5~EN^u3va4<3$Oa`|-dY%{ zepx||NuiEr?~^X$i##Glsf(G z30!LjWZZMd*c+O3Y~3v_ERo^3+&}M3I=-qgJ1b<@PX?KfPi)!XcS3j$Mpz;`6HrQI z(o{EF6v*lLu_yf(4n&5Gm*dW>TtEN{St3U_$qs{?pWlC4$sYdf>~L##+YBgzFDPh~ zur+EzXZD*-*8`jzkN$!g;RUF^B$B;2erNUd-Ih=-;wCKF*4i9@L zbJVp_r?u{93$_+^Sn<(U!!~7lRUDYxhgvt7~%lH{4ZA4$eDXd!nORqA4_Dxvpwx9jCrvg4j|>ep$4n z_*~YksO~V!{c?Gi0d_?=U&Bi=iovrJN}KyELgdxdIS77?LMMs`7l0v#jHjTl`g~F4 z+%1Et6;Tewl5U(u$r~ll2|rji5MY!Lwc6&gyH@~0xdVR#UC5tq7j*1+mt*eNU*?eS z6WtHwUWM7JWiYY$y?oQN0Oz!xyTG>M(it@qFd>p>Q5}jdNvkgmP78qopWovJ9{(!3 zqoPOoc@O%~s_$~LA`F2*qc&4+rQY7lAjVT^rqo=)?>jfuN99|4V=?i{d2FsCc`7|( zv){R#2PJIS&jN3B3+4tu-84}FB)*ad&K=Bwc}df!?=hVVX|qqSFyEn6mRH+6;#Knf zrjF2SJXDHZ@^z`1-kviMV{DTF)LBCUW`1=O~E1Fw2(2M zCN8}oFYj+O`wNJzSQ4lYI`6Mh_@BLg(`7peG`y&~H4}hvPwRu3(wkffcYc*}R+=l@ zSC{#m8}?c))9fzth6c6hRWP&RKfGTC3Oj1@TB3=?k9X3c+tu}#)EYPVYZne{Nf~RZ zRRm0d*BS-!`^E<&kBDc+4uQRNqxPe1=Id}hC;!4G%t!$m_Mtwvy^v1|B6_4I=(p44 zx$)7tznJ@s2s>-`C#^#A`48SQLnr-@I$=qKq1zgyrMQGH6{qz_XXlU=3xfKp@&ncW ziS$znJXC1Qc-Y~hace=ifTR@6@_DRH<}5mn#_r|r>&_HKLu=NTE1N;0jL%sw>->eV z4`*TpR~^l+N{4IR4@Nr_+aL5!xE}LUGD$B9Go{DXobjFB@q{Ae-DBA^#;lcH58H@L z%1lL)p!KhY!h~ksnGfge5+@TkkUtJ9wcVEj;<}X&;!kH;k+#_5DAv%_LO$?GwCgBl zQ!Q9E>D`Y{Mllg@|ECB2?=E(U{{lO2|8b_1)6p9BvDz!M&G7`WhM9oz>d!np<&`vd z#xYBkH>^N0AC#Zm@@u2J9Q{zmf0`prIe;hAsj+m>)p8UX6Kqlkb$gqw2-QQ}I2Gni zmWtr9UQGccaHpg0B2_gmanp{b`}-oWn1KY($U7B&2N`o@Dfi_5vT2ls zm#7|m3;g3EHPb$0s~{dIww{ud&2NUr# zC@oDHV+?YKjq$srK4$-seEHPr9=8(+!n){Q@)N}h|Ls`B57U6@J~jMz)Apn>bQS#l zNaa2QeL^$6qz8be|wk|D0C}Fpt@(QzPbe=d~n-n>8sX=cfJ_9GMI04|!SYZo}L<=^F9^{S1ks?bN>F!5o9S7Dv`(%Rgx zNEdZCpA?c&!&xx1BngE}0UE>Npym#B3M)>GTnExP#VEz>YrHOy&6U6@Tv6i^u zTGXgn(OS{zuxYRJX83Uc>2d|0LHvVMIroII4F*u&oW;HATK>+~ks{T&pQLUWdz~!M z`R;?A?>e#f7k7K1vt55x?V~(FEmN=MTkbH)iMEE9b7P!+Wg zmQR?e?v*t|A!gEay64>a<>?U60%xx6R1)YM7gfOg z3Q&+*s+9N6DckSEIP&8MMMnwB7h!jMFSTpzWivHD)x+$MGreUj3u9hJayk`d}EcbnLe{%?5!6V^$W)QZm&DJ(wGIy z{dFM}AGXB+Yu_LjC%ZvEt?)GQ8vVvXKvDopbZg-!`1)`n+0(Mj9!I>W{!&x$BOB^c zKg|3oh3>s%o)E#zbcxT9IC}jDifEtODq{~dan_4Llm0@w!smdCUu0}k(kdl)lgInO zojs$Cx^j#SD9V%)Q*3|+qI7Kp$E|dk)RxU?>ToA&cB{6A{h#0apKaeuM`Rban`uwhZ+brj zoRjVclJXEI?Jtx8{_abEq{(*IOf#vE^X9R^Al<0nFlAei1+SjxT9ubUs)?iVaLCob z4VG8COMUXM7Kg;rHS|z?MyAy!M_)CEZM?+!D^XbW@f){4IO=T8*_~FZ1K75AMj?TU zes3MjDQa&|(7_wG^?y9P)AERy^Pd5czx(6??DM1Xm#CR?kQbjJX+eOa+q`ISxH{)( z<`&`llG=qWne`zdR3v_SyG(O^IRB6rCa$k6rTW^E!YExts~{kif! z9DwyJqyLnnWDuY7+H~gs!KiuFB(+$OSMY7=wO;`A{$6vh30XgxObe8~u~ZVI*L7m& zX;cKvlDKjW(M4rn4J^LDHCdq9Z~T-L#KJiGxy*Pq#ly)=YvI1&$A2Fj z_}`)fUzR|(7EoA)K?M@k@};#^%`vhUu|PotW(DHOJjhZtH!KKua5J_P)@`*6JBbxt z4@4_f;V9kLx^7>o&QC9V#}IDwi3VaGe6@L{N(}`L z`McMnkkw?cd`C6m?PYZxZZlTt+8=G)b)zfB@deO0@5lQFw-_*NfQPrz96rB z7eU&)Xozd1Ch;9z4CZM-1Rc)t>f2EV)%U_4OH%-|eb7TuCT14a(5Syxvy|ew{_EG9 z;{*Gy;61Iu2^4m$c0k${M#%X48mV0H(mcksM~mlS%Os5fk3}k1ZK0zF zKhS3bOn%_w?6H=9Q77EoqOHBX?`RsM;k7%us~VC8n3o;K>^Y3i2OHwT&mS8^IokF_ zMoJMZLH!~tMqI!8+F3+C;?jCncIsA)Z?z$hD8i=IybpW?x!x<|JM}s688~)mOrFS< zhYNi|eNTH0`N;%+j%&hpn9>O>-eu!oh<6dxTO!i=2_@~_jG#Ni&*as$UNAtdflI#*K%gjudDAr$XJZSvP&;BTkgXfk(R%V$U z;#E=?b88Luq!SD6`(yPX+XpgWuAi6x1>*w7*~tUQGisVbuC2PR0W2W?Wmf4I zx*`vfY1=S2_Cqjx`bKR#i){z(;CT9!fjQXpg$31AL3jlw^5_SkJT&q1ZKM$q5uwXd z@4W$H)Edm!WUjJkS|E*Z|@6XmI75Kx%Ki53x)!J5f=&ID|CC)E!p}Qg?>(K9}>C29~si<&D zCp60PD10yRj)g_6B(O$umC%TO^RJ;z>a1B=A8`adWapr2E9pmwY#OXb=HNvCY<80| zV)d2qccw}|i2JreOSsaxO4wQ89QA>xK2SPs1p2$|W3Q->qc08y{cpDV-yXq(<2;$d zxH1A=m-6}{KM;vZ&1ll5ZVn|hvJWi0a{^)mWV$CgtqaK&d@2eehpC-d{P8>lRDoOh znJFh8b9!nr#2$KWPLL`dzx}HVXI)#!Nv#cpsI0_i`Y6M8$&RnOVDN0*(ffZ!!2Y$1 zugtGMYb^n&_5`Y@-cU47l^9(3n9YZFB<36y3841nb}Vp?J3*d~$n`>rI#v2|bBt5} ziEBEI&1{kBEY&2?c=jXPJEq%Nby(PKu5?ZZEcHOb4OKD3D}sdsW8Dce(V&17u8#Tz+cISv2_{=nYnv}N^(M)< z=Ac!I)$hDYeg_-=AM^4SE{rNc20|zqHH26SK+wZdDYv;#xEkMM4@<2=UVq<%jrkx= zf8)tU|1=?{g1le#bU)8Bt(xp)%c1ixN`^y0%||mIE7cV3K-9N_(07BKMz|M*rCc$G z6;RsQ@&Ue-fp-eDX$uvNrI^T;Sw8lRwiy(#U5K7Hy8s62+JZGygbYxfyLVxQa=VE9 zU#Ib(V`2aA2;qOfU3V|2Ch*p@>G$K3x?3HQG}bNVMT~=XTV^oZ{I1vqRr#lePcnO5 zyd==(YuW0_CPf;ZZ*mS_)OoER*8!Y;V38ZY&<**2j{?{n4ywSsyu6UVt}&g6z`6_# z;pHdnqUA=zKpX*`A25qpgGT?zPsvjMWRUKFKD{b7vf_lEaiyKiYXle(PwQki93iXE zcz-Q|{?DgoI3vqRj`nIbwWC*8pQ3o&oRU^8fSd%z9A{Ms9YQ%k??F6~{<#0|YnhLp z=h@@>_I~$dr^i&praKLBBD5cFCl=BNooP1CM_SK2=L{%u@u z?~izZ^zJl>HuraK)}twJ_EP8ZT5MrS$yph;^_loh0=qm_a4)6B6R@k@danRj!IfLD z&8vT8J711WDW&tBf;E_th%$NJV9^FYld$~uK}tm8_l~yheqg#3-Iep=2!_Uzv}-_K_iGy~l%G7r)JX6nYULtt5W{iZC zCKcP%o|S7mSxh@Q1GL%2+L&WL_96=y@ZT)}T&f6YH8%>m&NRFDD2gby+cEuWWc455 zVr}f_K0svEzpkr*z}{ERG;Gh|!iu>$Y2bXk>^2{?|X&^oMF)^`0l4iMB{Wezx; zh8I_hgrLrg|cSBQSn|;~60UdXMrHz#TGg#yN zEvI`fFhl+&;DS06cn#fpp6i>Shc{KT5S3Awv;{HKVP?WgkA12vs(U*qV8m5|#i0Xa!A#ehAeX@lqYB*CF;w;oK5y#T`0 z=NEtPx}+;l0nIHTKt^9`4h%X+{T-v7Rl$f=qbI)X1i|xKMpB)0L^P?==LvSCWu+2y zr0dvajQru!SfZbawdIlJ47*ISrbEtx)HzI-qMTM`?=)KA1-1tt30w;Ve&>7I)&dK}{{RG|gX1gO^8s>8v zeDGGrrORgh$BP(&wJ731&rZmqrnl+4gYc2U|M<9zGE%zV6CJiDVbd;L3)BY%h(&>( z$sdiEV4Bv*g`>_Lv3lk;9|yo`9mGJ*U}O0K8M4x_uSAx5)9-p+e}A0p(nzLxqjC7z zDFsYb5K*m3`j4+xIP?<&dusZe9yc&-AFRQFlnE=q*8xz|FdNjk%|jM@5NF8%4RAMu z_^YY({$lT~K0TOU;y~@qP(icsu1tigEqHY0!35OKb19aQHue5)E+IjNb4_i>5H?1K z0m92%d}fKU6g+&CkPkHsSgj(=6rqgRI++jHzG&4SeY*Gm_uc=^&-;P`A7-ipZ*q&{ z-)>t_Y9oAY7YE{n3UddJbAR zEL+|MfP0Gh)+n61N-*)j%I60}i_;9u|1F^Z|Gs1$9M|ooI+&k-A}4PP+Q}VRs4%kV z(qkkH(jAAjG`rf(&g+y74{JDd>KDCprwLa*?tk~duJKh?wX9?Q&tGcgEJEL&(-s~Q0a zw8hH^+*mpsKxLYc#NO#b-9j>x>JmlZQxq|13n|njR8L>HwKWf)DS+v;1Jdx{aQ3g( zs5q|=9(HmLQWC!x=V*k-3v>x&8Ty;mkI*9YLK=TQI$gr6$Y#^!8;;YK^TS5Zo@7>I z$}%URx%R1=uA(4@*aZp;lxz{+Wv5WD?9`ZNNOaU3#W*Mm+BN&py^aokS z7d7^}VDKrOYt?Y#OaOXxmSQmx6(ed|oKJmf9cop6GEF;^RBFYoBz4&@n?CdX=e*lJ*nMP6J-+(M+rfK9|LgsBd!R7UCTnx z0S$HU&D9F>zrPd?gmTJGWrQe4z?>3+hny#bRZw-ifRN#PhF3&>4UYKxn;#wAu)PnE zLdM|fj#WooVPk`C+bsbO`r6>4uG_%Jx~38A*o=85P1SgHih9`JTZEyTKozJ#s5O#u z{S|7MxymVn7rPhY-rDF!uoD#J_?<8RT&8?i{UtTAoRB%`h*W5D#9OzWRs+dm0CLvV z9+|VZ=zEzsV-Oy?`l=C%Aotvcf8)fL{19h%4Dn)c@Yf3grhqW~qWZ)7#VBze42MIA zXIbL|%3paUJ6*7Qk~&O>kpt^HJ0Uyw z4D0cBvqe2Cl}WuEU^YI`kj}6T@Y1Daf0VsBanpk=(#`xPQ(Mq_FWdsvv!YG1b6u#A zOuOGjx8H^#a8FlPdQlB*bHJ|>OMlA%@&~G!MNYbn(N%dq&n$^c9|SH@lSG$|=P(_? zkYuLz(*&yWOrJO%chYpnQ76(;A3p)plaJ>9Y|3(|-vg)9a9~yRjK>nmF2cUL21?c`XT8>5mFLG_;rnHQj1W72pwFYx|ujUmSDEG88~3fPgUsbLpK^ z1*#Y$%Rtvn1AtV`B*R8l@#9!g%-tNwW2E2S2`~!Lp^<-)@~3apFoo6iVD) zSNT(7zBRw4rO|vHh%V7vrA`<;@Pbm#&VbO*XOehLsf=ed3C3)}y}y%H^^%iyP~mcl zQbmgyOm9&Wj945~ojk{wt2!gY+X_%r@E)K3vjqA@?)KL?x!gAfa#~s&s~JlGDAJ1| z-^(bpEvMyOW0CiHK6?AkcZTjktG{JjJs1O3cA0Z`S+06ji`X*AQMP+&tJ%$9L~v1=bJ`&;H^OX041b2g9KPU7}Y zS5-L+fO;)u_Q+<7a;WmF4n*Y^mzjiqE>NP%;*Eyyg?Q>Y0@d%7`}@FKMmZ#0M>yqu zZ5RM9Nvj>m=tzEh>o;(Tz1`!Ir8_gkD=;#VsqP#W|${=dLb^RJhv4HW1mFK#C|f2h*Z41j_j zoqJX-*8XyKJJu}=B)s*ba&m5(S<9B678d=2fv(EQ*f^1%4vw@|6KDDzlQ}ia@=WbR zES`=yi@EWhluMY0cZLbW^cYJJG()YEFV4rX7wIO&(jXQzcdSsi+gjH}>6j(BBcp;7 z$JYuyJ0`9N{{s7pZ+@tc7_+|oA|4NZhzxn8)q{j~Gt0LY8wJmL~DEj#`BVVHQ8 z8JxLOMp12w;GgcEIoI=2YQiFwS5a3mvf;ZWPWbi5J9hzp z!?vnA&uYYNu{}(6C;#XxQf*apXC%qopO$(E9}&9934VvOei@u?6s=z7YUpnmFlwX+ zOE8@c+Z(B$A7qr!uW_LIRS5s*ZTX=7QI1TE4@Z~EgB0j=k?LOQ*>*541Eq?gioJ|e zYb51ZaTyZfktj?Le{I8TXL6hQZ-vxwlMC_h-NS&GQCPCYyl}mureei>$2ziomyUYg zl9Ib3TgE-{4!8(wU|PKghf^%J{+7`WxD>}Ty!^ge+dXbY;Aw-5h43Pu{<~O-$D#23 zZqx2VZNc2*S=CPuK}?9jjR*Z);h≪~!?Q>xTpyRe zp*zx%W8#ksSuvctlE34Csxex8Mq1yzT@|5mzP9%(o6aeZ@utqYuoAj zo!wnBBqQ*Q6?i~%w{mSgccBVHs~UppHYk(zdOV!xa+1dHSisqYN9ZRA`?mNCBZfP) zCRO?Goh99w8D$`fJ^H&8S--V)o#Y;sAM&#oDFQtf#-=5cy)Y{~7uY1v^>?z3hcXE`pBr^EzFIp#iCuau9ukGEwda0fR P{wXVH$QM6(`R4xs$(CXO literal 0 HcmV?d00001 diff --git a/LightRAG/README.md b/LightRAG/README.md new file mode 100644 index 00000000..376d1154 --- /dev/null +++ b/LightRAG/README.md @@ -0,0 +1,1978 @@ +

+ +
+ LightRAG Logo +
+ +# 🚀 LightRAG: Simple and Fast Retrieval-Augmented Generation + +
+ +
+
+
+ +
+
+

+ + + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+
+ +
+ +
+ +
+ +
+ LightRAG Diagram +
+ +--- +## 🎉 News +- [x] [2025.11.05]🎯📢Add **RAGAS-based** Evaluation Framework and **Langfuse** observability for LightRAG. +- [x] [2025.10.22]🎯📢Eliminate bottlenecks in processing **large-scale datasets**. +- [x] [2025.09.15]🎯📢Significantly enhances KG extraction accuracy for **small LLMs** like Qwen3-30B-A3B. +- [x] [2025.08.29]🎯📢**Reranker** is supported now , significantly boosting performance for mixed queries. +- [x] [2025.08.04]🎯📢**Document deletion** with KG regeneration to ensure query performance. +- [x] [2025.06.16]🎯📢Our team has released [RAG-Anything](https://github.com/HKUDS/RAG-Anything) an All-in-One Multimodal RAG System for seamless text, image, table, and equation processing. +- [X] [2025.06.05]🎯📢LightRAG now supports comprehensive multimodal data handling through [RAG-Anything](https://github.com/HKUDS/RAG-Anything) integration, enabling seamless document parsing and RAG capabilities across diverse formats including PDFs, images, Office documents, tables, and formulas. Please refer to the new [multimodal section](https://github.com/HKUDS/LightRAG/?tab=readme-ov-file#multimodal-document-processing-rag-anything-integration) for details. +- [X] [2025.03.18]🎯📢LightRAG now supports citation functionality, enabling proper source attribution. +- [X] [2025.02.05]🎯📢Our team has released [VideoRAG](https://github.com/HKUDS/VideoRAG) understanding extremely long-context videos. +- [X] [2025.01.13]🎯📢Our team has released [MiniRAG](https://github.com/HKUDS/MiniRAG) making RAG simpler with small models. +- [X] [2025.01.06]🎯📢You can now [use PostgreSQL for Storage](#using-postgresql-for-storage). +- [X] [2024.11.25]🎯📢LightRAG now supports seamless integration of [custom knowledge graphs](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#insert-custom-kg), empowering users to enhance the system with their own domain expertise. +- [X] [2024.11.19]🎯📢A comprehensive guide to LightRAG is now available on [LearnOpenCV](https://learnopencv.com/lightrag). Many thanks to the blog author. +- [X] [2024.11.11]🎯📢LightRAG now supports [deleting entities by their names](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#delete). +- [X] [2024.11.09]🎯📢Introducing the [LightRAG Gui](https://lightrag-gui.streamlit.app), which allows you to insert, query, visualize, and download LightRAG knowledge. +- [X] [2024.11.04]🎯📢You can now [use Neo4J for Storage](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#using-neo4j-for-storage). +- [X] [2024.10.29]🎯📢LightRAG now supports multiple file types, including PDF, DOC, PPT, and CSV via `textract`. +- [X] [2024.10.20]🎯📢We've added a new feature to LightRAG: Graph Visualization. +- [X] [2024.10.18]🎯📢We've added a link to a [LightRAG Introduction Video](https://youtu.be/oageL-1I0GE). Thanks to the author! +- [X] [2024.10.17]🎯📢We have created a [Discord channel](https://discord.gg/yF2MmDJyGJ)! Welcome to join for sharing and discussions! 🎉🎉 +- [X] [2024.10.16]🎯📢LightRAG now supports [Ollama models](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#quick-start)! +- [X] [2024.10.15]🎯📢LightRAG now supports [Hugging Face models](https://github.com/HKUDS/LightRAG?tab=readme-ov-file#quick-start)! + +
+ + Algorithm Flowchart + + +![LightRAG Indexing Flowchart](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-VectorDB-Json-KV-Store-Indexing-Flowchart-scaled.jpg) +*Figure 1: LightRAG Indexing Flowchart - Img Caption : [Source](https://learnopencv.com/lightrag/)* +![LightRAG Retrieval and Querying Flowchart](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-Querying-Flowchart-Dual-Level-Retrieval-Generation-Knowledge-Graphs-scaled.jpg) +*Figure 2: LightRAG Retrieval and Querying Flowchart - Img Caption : [Source](https://learnopencv.com/lightrag/)* + +
+ +## Installation + +> **💡 Using uv for Package Management**: This project uses [uv](https://docs.astral.sh/uv/) for fast and reliable Python package management. +> Install uv first: `curl -LsSf https://astral.sh/uv/install.sh | sh` (Unix/macOS) or `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"` (Windows) +> +> **Note**: You can also use pip if you prefer, but uv is recommended for better performance and more reliable dependency management. +> +> **📦 Offline Deployment**: For offline or air-gapped environments, see the [Offline Deployment Guide](./docs/OfflineDeployment.md) for instructions on pre-installing all dependencies and cache files. + +### Install LightRAG Server + +The LightRAG Server is designed to provide Web UI and API support. The Web UI facilitates document indexing, knowledge graph exploration, and a simple RAG query interface. LightRAG Server also provide an Ollama compatible interfaces, aiming to emulate LightRAG as an Ollama chat model. This allows AI chat bot, such as Open WebUI, to access LightRAG easily. + +* Install from PyPI + +```bash +# Using uv (recommended) +uv pip install "lightrag-hku[api]" +# Or using pip +# pip install "lightrag-hku[api]" + +cp env.example .env # Update the .env with your LLM and embedding configurations + +lightrag-server +``` + +* Installation from Source + +```bash +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG + +# Using uv (recommended) +# Note: uv sync automatically creates a virtual environment in .venv/ +uv sync --extra api +source .venv/bin/activate # Activate the virtual environment (Linux/macOS) +# Or on Windows: .venv\Scripts\activate + +# Or using pip with virtual environment +# python -m venv .venv +# source .venv/bin/activate # Windows: .venv\Scripts\activate +# pip install -e ".[api]" + +cp env.example .env # Update the .env with your LLM and embedding configurations + +# Build front-end artifacts +cd lightrag_webui +bun install --frozen-lockfile +bun run build +cd .. + +lightrag-server +``` + +* Launching the LightRAG Server with Docker Compose + +```bash +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG +cp env.example .env # Update the .env with your LLM and embedding configurations +# modify LLM and Embedding settings in .env +docker compose up +``` + +> Historical versions of LightRAG docker images can be found here: [LightRAG Docker Images]( https://github.com/HKUDS/LightRAG/pkgs/container/lightrag) + +### Install LightRAG Core + +* Install from source (Recommended) + +```bash +cd LightRAG +# Note: uv sync automatically creates a virtual environment in .venv/ +uv sync +source .venv/bin/activate # Activate the virtual environment (Linux/macOS) +# Or on Windows: .venv\Scripts\activate + +# Or: pip install -e . +``` + +* Install from PyPI + +```bash +uv pip install lightrag-hku +# Or: pip install lightrag-hku +``` + +## Quick Start + +### LLM and Technology Stack Requirements for LightRAG + +LightRAG's demands on the capabilities of Large Language Models (LLMs) are significantly higher than those of traditional RAG, as it requires the LLM to perform entity-relationship extraction tasks from documents. Configuring appropriate Embedding and Reranker models is also crucial for improving query performance. + +- **LLM Selection**: + - It is recommended to use an LLM with at least 32 billion parameters. + - The context length should be at least 32KB, with 64KB being recommended. + - It is not recommended to choose reasoning models during the document indexing stage. + - During the query stage, it is recommended to choose models with stronger capabilities than those used in the indexing stage to achieve better query results. +- **Embedding Model**: + - A high-performance Embedding model is essential for RAG. + - We recommend using mainstream multilingual Embedding models, such as: `BAAI/bge-m3` and `text-embedding-3-large`. + - **Important Note**: The Embedding model must be determined before document indexing, and the same model must be used during the document query phase. For certain storage solutions (e.g., PostgreSQL), the vector dimension must be defined upon initial table creation. Therefore, when changing embedding models, it is necessary to delete the existing vector-related tables and allow LightRAG to recreate them with the new dimensions. +- **Reranker Model Configuration**: + - Configuring a Reranker model can significantly enhance LightRAG's retrieval performance. + - When a Reranker model is enabled, it is recommended to set the "mix mode" as the default query mode. + - We recommend using mainstream Reranker models, such as: `BAAI/bge-reranker-v2-m3` or models provided by services like Jina. + +### Quick Start for LightRAG Server + +* For more information about LightRAG Server, please refer to [LightRAG Server](./lightrag/api/README.md). + +### Quick Start for LightRAG core + +To get started with LightRAG core, refer to the sample codes available in the `examples` folder. Additionally, a [video demo](https://www.youtube.com/watch?v=g21royNJ4fw) demonstration is provided to guide you through the local setup process. If you already possess an OpenAI API key, you can run the demo right away: + +```bash +### you should run the demo code with project folder +cd LightRAG +### provide your API-KEY for OpenAI +export OPENAI_API_KEY="sk-...your_opeai_key..." +### download the demo document of "A Christmas Carol" by Charles Dickens +curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt +### run the demo code +python examples/lightrag_openai_demo.py +``` + +For a streaming response implementation example, please see `examples/lightrag_openai_compatible_demo.py`. Prior to execution, ensure you modify the sample code's LLM and embedding configurations accordingly. + +**Note 1**: When running the demo program, please be aware that different test scripts may use different embedding models. If you switch to a different embedding model, you must clear the data directory (`./dickens`); otherwise, the program may encounter errors. If you wish to retain the LLM cache, you can preserve the `kv_store_llm_response_cache.json` file while clearing the data directory. + +**Note 2**: Only `lightrag_openai_demo.py` and `lightrag_openai_compatible_demo.py` are officially supported sample codes. Other sample files are community contributions that haven't undergone full testing and optimization. + +## Programing with LightRAG Core + +> ⚠️ **If you would like to integrate LightRAG into your project, we recommend utilizing the REST API provided by the LightRAG Server**. LightRAG Core is typically intended for embedded applications or for researchers who wish to conduct studies and evaluations. + +### ⚠️ Important: Initialization Requirements + +**LightRAG requires explicit initialization before use.** You must call both `await rag.initialize_storages()` and `await initialize_pipeline_status()` after creating a LightRAG instance, otherwise you will encounter errors like: + +- `AttributeError: __aenter__` - if storages are not initialized +- `KeyError: 'history_messages'` - if pipeline status is not initialized + +### A Simple Program + +Use the below Python snippet to initialize LightRAG, insert text to it, and perform queries: + +```python +import os +import asyncio +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import gpt_4o_mini_complete, gpt_4o_complete, openai_embed +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.utils import setup_logger + +setup_logger("lightrag", level="INFO") + +WORKING_DIR = "./rag_storage" +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + embedding_func=openai_embed, + llm_model_func=gpt_4o_mini_complete, + ) + # IMPORTANT: Both initialization calls are required! + await rag.initialize_storages() # Initialize storage backends + await initialize_pipeline_status() # Initialize processing pipeline + return rag + +async def main(): + try: + # Initialize RAG instance + rag = await initialize_rag() + await rag.ainsert("Your text") + + # Perform hybrid search + mode = "hybrid" + print( + await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode=mode) + ) + ) + + except Exception as e: + print(f"An error occurred: {e}") + finally: + if rag: + await rag.finalize_storages() + +if __name__ == "__main__": + asyncio.run(main()) +``` + +Important notes for the above snippet: + +- Export your OPENAI_API_KEY environment variable before running the script. +- This program uses the default storage settings for LightRAG, so all data will be persisted to WORKING_DIR/rag_storage. +- This program demonstrates only the simplest way to initialize a LightRAG object: Injecting the embedding and LLM functions, and initializing storage and pipeline status after creating the LightRAG object. + +### LightRAG init parameters + +A full list of LightRAG init parameters: + +
+ Parameters + +| **Parameter** | **Type** | **Explanation** | **Default** | +|--------------|----------|-----------------|-------------| +| **working_dir** | `str` | Directory where the cache will be stored | `lightrag_cache+timestamp` | +| **workspace** | str | Workspace name for data isolation between different LightRAG Instances | | +| **kv_storage** | `str` | Storage type for documents and text chunks. Supported types: `JsonKVStorage`,`PGKVStorage`,`RedisKVStorage`,`MongoKVStorage` | `JsonKVStorage` | +| **vector_storage** | `str` | Storage type for embedding vectors. Supported types: `NanoVectorDBStorage`,`PGVectorStorage`,`MilvusVectorDBStorage`,`ChromaVectorDBStorage`,`FaissVectorDBStorage`,`MongoVectorDBStorage`,`QdrantVectorDBStorage` | `NanoVectorDBStorage` | +| **graph_storage** | `str` | Storage type for graph edges and nodes. Supported types: `NetworkXStorage`,`Neo4JStorage`,`PGGraphStorage`,`AGEStorage` | `NetworkXStorage` | +| **doc_status_storage** | `str` | Storage type for documents process status. Supported types: `JsonDocStatusStorage`,`PGDocStatusStorage`,`MongoDocStatusStorage` | `JsonDocStatusStorage` | +| **chunk_token_size** | `int` | Maximum token size per chunk when splitting documents | `1200` | +| **chunk_overlap_token_size** | `int` | Overlap token size between two chunks when splitting documents | `100` | +| **tokenizer** | `Tokenizer` | The function used to convert text into tokens (numbers) and back using .encode() and .decode() functions following `TokenizerInterface` protocol. If you don't specify one, it will use the default Tiktoken tokenizer. | `TiktokenTokenizer` | +| **tiktoken_model_name** | `str` | If you're using the default Tiktoken tokenizer, this is the name of the specific Tiktoken model to use. This setting is ignored if you provide your own tokenizer. | `gpt-4o-mini` | +| **entity_extract_max_gleaning** | `int` | Number of loops in the entity extraction process, appending history messages | `1` | +| **node_embedding_algorithm** | `str` | Algorithm for node embedding (currently not used) | `node2vec` | +| **node2vec_params** | `dict` | Parameters for node embedding | `{"dimensions": 1536,"num_walks": 10,"walk_length": 40,"window_size": 2,"iterations": 3,"random_seed": 3,}` | +| **embedding_func** | `EmbeddingFunc` | Function to generate embedding vectors from text | `openai_embed` | +| **embedding_batch_num** | `int` | Maximum batch size for embedding processes (multiple texts sent per batch) | `32` | +| **embedding_func_max_async** | `int` | Maximum number of concurrent asynchronous embedding processes | `16` | +| **llm_model_func** | `callable` | Function for LLM generation | `gpt_4o_mini_complete` | +| **llm_model_name** | `str` | LLM model name for generation | `meta-llama/Llama-3.2-1B-Instruct` | +| **summary_context_size** | `int` | Maximum tokens send to LLM to generate summaries for entity relation merging | `10000`(configured by env var SUMMARY_CONTEXT_SIZE) | +| **summary_max_tokens** | `int` | Maximum token size for entity/relation description | `500`(configured by env var SUMMARY_MAX_TOKENS) | +| **llm_model_max_async** | `int` | Maximum number of concurrent asynchronous LLM processes | `4`(default value changed by env var MAX_ASYNC) | +| **llm_model_kwargs** | `dict` | Additional parameters for LLM generation | | +| **vector_db_storage_cls_kwargs** | `dict` | Additional parameters for vector database, like setting the threshold for nodes and relations retrieval | cosine_better_than_threshold: 0.2(default value changed by env var COSINE_THRESHOLD) | +| **enable_llm_cache** | `bool` | If `TRUE`, stores LLM results in cache; repeated prompts return cached responses | `TRUE` | +| **enable_llm_cache_for_entity_extract** | `bool` | If `TRUE`, stores LLM results in cache for entity extraction; Good for beginners to debug your application | `TRUE` | +| **addon_params** | `dict` | Additional parameters, e.g., `{"language": "Simplified Chinese", "entity_types": ["organization", "person", "location", "event"]}`: sets example limit, entiy/relation extraction output language | language: English` | +| **embedding_cache_config** | `dict` | Configuration for question-answer caching. Contains three parameters: `enabled`: Boolean value to enable/disable cache lookup functionality. When enabled, the system will check cached responses before generating new answers. `similarity_threshold`: Float value (0-1), similarity threshold. When a new question's similarity with a cached question exceeds this threshold, the cached answer will be returned directly without calling the LLM. `use_llm_check`: Boolean value to enable/disable LLM similarity verification. When enabled, LLM will be used as a secondary check to verify the similarity between questions before returning cached answers. | Default: `{"enabled": False, "similarity_threshold": 0.95, "use_llm_check": False}` | + +
+ +### Query Param + +Use QueryParam to control the behavior your query: + +```python +class QueryParam: + """Configuration parameters for query execution in LightRAG.""" + + mode: Literal["local", "global", "hybrid", "naive", "mix", "bypass"] = "global" + """Specifies the retrieval mode: + - "local": Focuses on context-dependent information. + - "global": Utilizes global knowledge. + - "hybrid": Combines local and global retrieval methods. + - "naive": Performs a basic search without advanced techniques. + - "mix": Integrates knowledge graph and vector retrieval. + """ + + only_need_context: bool = False + """If True, only returns the retrieved context without generating a response.""" + + only_need_prompt: bool = False + """If True, only returns the generated prompt without producing a response.""" + + response_type: str = "Multiple Paragraphs" + """Defines the response format. Examples: 'Multiple Paragraphs', 'Single Paragraph', 'Bullet Points'.""" + + stream: bool = False + """If True, enables streaming output for real-time responses.""" + + top_k: int = int(os.getenv("TOP_K", "60")) + """Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode.""" + + chunk_top_k: int = int(os.getenv("CHUNK_TOP_K", "20")) + """Number of text chunks to retrieve initially from vector search and keep after reranking. + If None, defaults to top_k value. + """ + + max_entity_tokens: int = int(os.getenv("MAX_ENTITY_TOKENS", "6000")) + """Maximum number of tokens allocated for entity context in unified token control system.""" + + max_relation_tokens: int = int(os.getenv("MAX_RELATION_TOKENS", "8000")) + """Maximum number of tokens allocated for relationship context in unified token control system.""" + + max_total_tokens: int = int(os.getenv("MAX_TOTAL_TOKENS", "30000")) + """Maximum total tokens budget for the entire query context (entities + relations + chunks + system prompt).""" + + # History mesages is only send to LLM for context, not used for retrieval + conversation_history: list[dict[str, str]] = field(default_factory=list) + """Stores past conversation history to maintain context. + Format: [{"role": "user/assistant", "content": "message"}]. + """ + + ids: list[str] | None = None + """List of ids to filter the results.""" + + model_func: Callable[..., object] | None = None + """Optional override for the LLM model function to use for this specific query. + If provided, this will be used instead of the global model function. + This allows using different models for different query modes. + """ + + user_prompt: str | None = None + """User-provided prompt for the query. + Addition instructions for LLM. If provided, this will be inject into the prompt template. + It's purpose is the let user customize the way LLM generate the response. + """ + + enable_rerank: bool = True + """Enable reranking for retrieved text chunks. If True but no rerank model is configured, a warning will be issued. + Default is True to enable reranking when rerank model is available. + """ +``` + +> default value of Top_k can be change by environment variables TOP_K. + +### LLM and Embedding Injection + +LightRAG requires the utilization of LLM and Embedding models to accomplish document indexing and querying tasks. During the initialization phase, it is necessary to inject the invocation methods of the relevant models into LightRAG: + +
+ Using Open AI-like APIs + +* LightRAG also supports Open AI-like chat/embeddings APIs: + +```python +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + return await openai_complete_if_cache( + "solar-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=os.getenv("UPSTAGE_API_KEY"), + base_url="https://api.upstage.ai/v1/solar", + **kwargs + ) + +async def embedding_func(texts: list[str]) -> np.ndarray: + return await openai_embed( + texts, + model="solar-embedding-1-large-query", + api_key=os.getenv("UPSTAGE_API_KEY"), + base_url="https://api.upstage.ai/v1/solar" + ) + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=4096, + func=embedding_func + ) + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag +``` + +
+ +
+ Using Hugging Face Models + +* If you want to use Hugging Face models, you only need to set LightRAG as follows: + +See `lightrag_hf_demo.py` + +```python +# Initialize LightRAG with Hugging Face model +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=hf_model_complete, # Use Hugging Face model for text generation + llm_model_name='meta-llama/Llama-3.1-8B-Instruct', # Model name from Hugging Face + # Use Hugging Face embedding function + embedding_func=EmbeddingFunc( + embedding_dim=384, + func=lambda texts: hf_embed( + texts, + tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2"), + embed_model=AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2") + ) + ), +) +``` + +
+ +
+ Using Ollama Models +**Overview** + +If you want to use Ollama models, you need to pull model you plan to use and embedding model, for example `nomic-embed-text`. + +Then you only need to set LightRAG as follows: + +```python +# Initialize LightRAG with Ollama model +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=ollama_model_complete, # Use Ollama model for text generation + llm_model_name='your_model_name', # Your model name + # Use Ollama embedding function + embedding_func=EmbeddingFunc( + embedding_dim=768, + func=lambda texts: ollama_embed( + texts, + embed_model="nomic-embed-text" + ) + ), +) +``` + +* **Increasing context size** + +In order for LightRAG to work context should be at least 32k tokens. By default Ollama models have context size of 8k. You can achieve this using one of two ways: + +* **Increasing the `num_ctx` parameter in Modelfile** + +1. Pull the model: + +```bash +ollama pull qwen2 +``` + +2. Display the model file: + +```bash +ollama show --modelfile qwen2 > Modelfile +``` + +3. Edit the Modelfile by adding the following line: + +```bash +PARAMETER num_ctx 32768 +``` + +4. Create the modified model: + +```bash +ollama create -f Modelfile qwen2m +``` + +* **Setup `num_ctx` via Ollama API** + +Tiy can use `llm_model_kwargs` param to configure ollama: + +```python +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=ollama_model_complete, # Use Ollama model for text generation + llm_model_name='your_model_name', # Your model name + llm_model_kwargs={"options": {"num_ctx": 32768}}, + # Use Ollama embedding function + embedding_func=EmbeddingFunc( + embedding_dim=768, + func=lambda texts: ollama_embed( + texts, + embed_model="nomic-embed-text" + ) + ), +) +``` + +* **Low RAM GPUs** + +In order to run this experiment on low RAM GPU you should select small model and tune context window (increasing context increase memory consumption). For example, running this ollama example on repurposed mining GPU with 6Gb of RAM required to set context size to 26k while using `gemma2:2b`. It was able to find 197 entities and 19 relations on `book.txt`. + +
+
+ LlamaIndex + +LightRAG supports integration with LlamaIndex (`llm/llama_index_impl.py`): + +- Integrates with OpenAI and other providers through LlamaIndex +- See [LlamaIndex Documentation](lightrag/llm/Readme.md) for detailed setup and examples + +**Example Usage** + +```python +# Using LlamaIndex with direct OpenAI access +import asyncio +from lightrag import LightRAG +from lightrag.llm.llama_index_impl import llama_index_complete_if_cache, llama_index_embed +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.llms.openai import OpenAI +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.utils import setup_logger + +# Setup log handler for LightRAG +setup_logger("lightrag", level="INFO") + +async def initialize_rag(): + rag = LightRAG( + working_dir="your/path", + llm_model_func=llama_index_complete_if_cache, # LlamaIndex-compatible completion function + embedding_func=EmbeddingFunc( # LlamaIndex-compatible embedding function + embedding_dim=1536, + func=lambda texts: llama_index_embed(texts, embed_model=embed_model) + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Perform naive search + print( + rag.query("What are the top themes in this story?", param=QueryParam(mode="naive")) + ) + + # Perform local search + print( + rag.query("What are the top themes in this story?", param=QueryParam(mode="local")) + ) + + # Perform global search + print( + rag.query("What are the top themes in this story?", param=QueryParam(mode="global")) + ) + + # Perform hybrid search + print( + rag.query("What are the top themes in this story?", param=QueryParam(mode="hybrid")) + ) + +if __name__ == "__main__": + main() +``` + +**For detailed documentation and examples, see:** + +- [LlamaIndex Documentation](lightrag/llm/Readme.md) +- [Direct OpenAI Example](examples/lightrag_llamaindex_direct_demo.py) +- [LiteLLM Proxy Example](examples/lightrag_llamaindex_litellm_demo.py) + +
+ +### Rerank Function Injection + +To enhance retrieval quality, documents can be re-ranked based on a more effective relevance scoring model. The `rerank.py` file provides three Reranker provider driver functions: + +* **Cohere / vLLM**: `cohere_rerank` +* **Jina AI**: `jina_rerank` +* **Aliyun**: `ali_rerank` + +You can inject one of these functions into the `rerank_model_func` attribute of the LightRAG object. This will enable LightRAG's query function to re-order retrieved text blocks using the injected function. For detailed usage, please refer to the `examples/rerank_example.py` file. + +### User Prompt vs. Query + +When using LightRAG for content queries, avoid combining the search process with unrelated output processing, as this significantly impacts query effectiveness. The `user_prompt` parameter in Query Param is specifically designed to address this issue — it does not participate in the RAG retrieval phase, but rather guides the LLM on how to process the retrieved results after the query is completed. Here's how to use it: + +```python +# Create query parameters +query_param = QueryParam( + mode = "hybrid", # Other modes:local, global, hybrid, mix, naive + user_prompt = "For diagrams, use mermaid format with English/Pinyin node names and Chinese display labels", +) + +# Query and process +response_default = rag.query( + "Please draw a character relationship diagram for Scrooge", + param=query_param +) +print(response_default) +``` + +### Insert + +
+ Basic Insert + +```python +# Basic Insert +rag.insert("Text") +``` + +
+ +
+ Batch Insert + +```python +# Basic Batch Insert: Insert multiple texts at once +rag.insert(["TEXT1", "TEXT2",...]) + +# Batch Insert with custom batch size configuration +rag = LightRAG( + ... + working_dir=WORKING_DIR, + max_parallel_insert = 4 +) + +rag.insert(["TEXT1", "TEXT2", "TEXT3", ...]) # Documents will be processed in batches of 4 +``` + +The `max_parallel_insert` parameter determines the number of documents processed concurrently in the document indexing pipeline. If unspecified, the default value is **2**. We recommend keeping this setting **below 10**, as the performance bottleneck typically lies with the LLM (Large Language Model) processing.The `max_parallel_insert` parameter determines the number of documents processed concurrently in the document indexing pipeline. If unspecified, the default value is **2**. We recommend keeping this setting **below 10**, as the performance bottleneck typically lies with the LLM (Large Language Model) processing. + +
+ +
+ Insert with ID + +If you want to provide your own IDs for your documents, number of documents and number of IDs must be the same. + +```python +# Insert single text, and provide ID for it +rag.insert("TEXT1", ids=["ID_FOR_TEXT1"]) + +# Insert multiple texts, and provide IDs for them +rag.insert(["TEXT1", "TEXT2",...], ids=["ID_FOR_TEXT1", "ID_FOR_TEXT2"]) +``` + +
+ +
+ Insert using Pipeline + +The `apipeline_enqueue_documents` and `apipeline_process_enqueue_documents` functions allow you to perform incremental insertion of documents into the graph. + +This is useful for scenarios where you want to process documents in the background while still allowing the main thread to continue executing. + +And using a routine to process new documents. + +```python +rag = LightRAG(..) + +await rag.apipeline_enqueue_documents(input) +# Your routine in loop +await rag.apipeline_process_enqueue_documents(input) +``` + +
+ +
+ Insert Multi-file Type Support + +The `textract` supports reading file types such as TXT, DOCX, PPTX, CSV, and PDF. + +```python +import textract + +file_path = 'TEXT.pdf' +text_content = textract.process(file_path) + +rag.insert(text_content.decode('utf-8')) +``` + +
+ +
+ Citation Functionality + +By providing file paths, the system ensures that sources can be traced back to their original documents. + +```python +# Define documents and their file paths +documents = ["Document content 1", "Document content 2"] +file_paths = ["path/to/doc1.txt", "path/to/doc2.txt"] + +# Insert documents with file paths +rag.insert(documents, file_paths=file_paths) +``` + +
+ +### Storage + +LightRAG uses 4 types of storage for different purposes: + +* KV_STORAGE: llm response cache, text chunks, document information +* VECTOR_STORAGE: entities vectors, relation vectors, chunks vectors +* GRAPH_STORAGE: entity relation graph +* DOC_STATUS_STORAGE: document indexing status + +Each storage type has several implementations: + +* KV_STORAGE supported implementations: + +``` +JsonKVStorage JsonFile (default) +PGKVStorage Postgres +RedisKVStorage Redis +MongoKVStorage MongoDB +``` + +* GRAPH_STORAGE supported implementations: + +``` +NetworkXStorage NetworkX (default) +Neo4JStorage Neo4J +PGGraphStorage PostgreSQL with AGE plugin +MemgraphStorage. Memgraph +``` + +> Testing has shown that Neo4J delivers superior performance in production environments compared to PostgreSQL with AGE plugin. + +* VECTOR_STORAGE supported implementations: + +``` +NanoVectorDBStorage NanoVector (default) +PGVectorStorage Postgres +MilvusVectorDBStorage Milvus +FaissVectorDBStorage Faiss +QdrantVectorDBStorage Qdrant +MongoVectorDBStorage MongoDB +``` + +* DOC_STATUS_STORAGE: supported implementations: + +``` +JsonDocStatusStorage JsonFile (default) +PGDocStatusStorage Postgres +MongoDocStatusStorage MongoDB +``` + +Example connection configurations for each storage type can be found in the `env.example` file. The database instance in the connection string needs to be created by you on the database server beforehand. LightRAG is only responsible for creating tables within the database instance, not for creating the database instance itself. If using Redis as storage, remember to configure automatic data persistence rules for Redis, otherwise data will be lost after the Redis service restarts. If using PostgreSQL, it is recommended to use version 16.6 or above. + +
+ Using Neo4J Storage + +* For production level scenarios you will most likely want to leverage an enterprise solution +* for KG storage. Running Neo4J in Docker is recommended for seamless local testing. +* See: https://hub.docker.com/_/neo4j + +```python +export NEO4J_URI="neo4j://localhost:7687" +export NEO4J_USERNAME="neo4j" +export NEO4J_PASSWORD="password" + +# Setup logger for LightRAG +setup_logger("lightrag", level="INFO") + +# When you launch the project be sure to override the default KG: NetworkX +# by specifying kg="Neo4JStorage". + +# Note: Default settings use NetworkX +# Initialize LightRAG with Neo4J implementation. +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=gpt_4o_mini_complete, # Use gpt_4o_mini_complete LLM model + graph_storage="Neo4JStorage", #<-----------override KG default + ) + + # Initialize database connections + await rag.initialize_storages() + # Initialize pipeline status for document processing + await initialize_pipeline_status() + + return rag +``` + +see test_neo4j.py for a working example. + +
+ +
+ Using PostgreSQL Storage + +For production level scenarios you will most likely want to leverage an enterprise solution. PostgreSQL can provide a one-stop solution for you as KV store, VectorDB (pgvector) and GraphDB (apache AGE). PostgreSQL version 16.6 or higher is supported. + +* PostgreSQL is lightweight,the whole binary distribution including all necessary plugins can be zipped to 40MB: Ref to [Windows Release](https://github.com/ShanGor/apache-age-windows/releases/tag/PG17%2Fv1.5.0-rc0) as it is easy to install for Linux/Mac. +* If you prefer docker, please start with this image if you are a beginner to avoid hiccups (DO read the overview): https://hub.docker.com/r/shangor/postgres-for-rag +* How to start? Ref to: [examples/lightrag_zhipu_postgres_demo.py](https://github.com/HKUDS/LightRAG/blob/main/examples/lightrag_zhipu_postgres_demo.py) +* For high-performance graph database requirements, Neo4j is recommended as Apache AGE's performance is not as competitive. + +
+ +
+ Using Faiss Storage +Before using Faiss vector database, you must manually install `faiss-cpu` or `faiss-gpu`. + +- Install the required dependencies: + +``` +pip install faiss-cpu +``` + +You can also install `faiss-gpu` if you have GPU support. + +- Here we are using `sentence-transformers` but you can also use `OpenAIEmbedding` model with `3072` dimensions. + +```python +async def embedding_func(texts: list[str]) -> np.ndarray: + model = SentenceTransformer('all-MiniLM-L6-v2') + embeddings = model.encode(texts, convert_to_numpy=True) + return embeddings + +# Initialize LightRAG with the LLM model function and embedding function +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=384, + func=embedding_func, + ), + vector_storage="FaissVectorDBStorage", + vector_db_storage_cls_kwargs={ + "cosine_better_than_threshold": 0.3 # Your desired threshold + } +) +``` + +
+ +
+ Using Memgraph for Storage + +* Memgraph is a high-performance, in-memory graph database compatible with the Neo4j Bolt protocol. +* You can run Memgraph locally using Docker for easy testing: +* See: https://memgraph.com/download + +```python +export MEMGRAPH_URI="bolt://localhost:7687" + +# Setup logger for LightRAG +setup_logger("lightrag", level="INFO") + +# When you launch the project, override the default KG: NetworkX +# by specifying kg="MemgraphStorage". + +# Note: Default settings use NetworkX +# Initialize LightRAG with Memgraph implementation. +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=gpt_4o_mini_complete, # Use gpt_4o_mini_complete LLM model + graph_storage="MemgraphStorage", #<-----------override KG default + ) + + # Initialize database connections + await rag.initialize_storages() + # Initialize pipeline status for document processing + await initialize_pipeline_status() + + return rag +``` + +
+ +
+ Using MongoDB Storage + +MongoDB provides a one-stop storage solution for LightRAG. MongoDB offers native KV storage and vector storage. LightRAG uses MongoDB collections to implement a simple graph storage. MongoDB's official vector search functionality (`$vectorSearch`) currently requires their official cloud service MongoDB Atlas. This functionality cannot be used on self-hosted MongoDB Community/Enterprise versions. + +
+ +
+ Using Redis Storage + +LightRAG supports using Redis as KV storage. When using Redis storage, attention should be paid to persistence configuration and memory usage configuration. The following is the recommended Redis configuration: + +``` +save 900 1 +save 300 10 +save 60 1000 +stop-writes-on-bgsave-error yes +maxmemory 4gb +maxmemory-policy noeviction +maxclients 500 +``` + +
+ +### Data Isolation Between LightRAG Instances + +The `workspace` parameter ensures data isolation between different LightRAG instances. Once initialized, the `workspace` is immutable and cannot be changed.Here is how workspaces are implemented for different types of storage: + +- **For local file-based databases, data isolation is achieved through workspace subdirectories:** `JsonKVStorage`, `JsonDocStatusStorage`, `NetworkXStorage`, `NanoVectorDBStorage`, `FaissVectorDBStorage`. +- **For databases that store data in collections, it's done by adding a workspace prefix to the collection name:** `RedisKVStorage`, `RedisDocStatusStorage`, `MilvusVectorDBStorage`, `MongoKVStorage`, `MongoDocStatusStorage`, `MongoVectorDBStorage`, `MongoGraphStorage`, `PGGraphStorage`. +- **For Qdrant vector database, data isolation is achieved through payload-based partitioning (Qdrant's recommended multitenancy approach):** `QdrantVectorDBStorage` uses shared collections with payload filtering for unlimited workspace scalability. +- **For relational databases, data isolation is achieved by adding a `workspace` field to the tables for logical data separation:** `PGKVStorage`, `PGVectorStorage`, `PGDocStatusStorage`. +- **For the Neo4j graph database, logical data isolation is achieved through labels:** `Neo4JStorage` + +To maintain compatibility with legacy data, the default workspace for PostgreSQL non-graph storage is `default` and, for PostgreSQL AGE graph storage is null, for Neo4j graph storage is `base` when no workspace is configured. For all external storages, the system provides dedicated workspace environment variables to override the common `WORKSPACE` environment variable configuration. These storage-specific workspace environment variables are: `REDIS_WORKSPACE`, `MILVUS_WORKSPACE`, `QDRANT_WORKSPACE`, `MONGODB_WORKSPACE`, `POSTGRES_WORKSPACE`, `NEO4J_WORKSPACE`. + +### AGENTS.md -- Guiding Coding Agents + +AGENTS.md is a simple, open format for guiding coding agents (https://agents.md/). It is a dedicated, predictable place to provide the context and instructions to help AI coding agents work on LightRAG project. Different AI coders should not maintain separate guidance files individually. If any AI coder cannot automatically recognize AGENTS.md, symbolic links can be used as a solution. After establishing symbolic links, you can prevent them from being committed to the Git repository by configuring your local `.gitignore_global`. + +## Edit Entities and Relations + +LightRAG now supports comprehensive knowledge graph management capabilities, allowing you to create, edit, and delete entities and relationships within your knowledge graph. + +
+ Create Entities and Relations + +```python +# Create new entity +entity = rag.create_entity("Google", { + "description": "Google is a multinational technology company specializing in internet-related services and products.", + "entity_type": "company" +}) + +# Create another entity +product = rag.create_entity("Gmail", { + "description": "Gmail is an email service developed by Google.", + "entity_type": "product" +}) + +# Create relation between entities +relation = rag.create_relation("Google", "Gmail", { + "description": "Google develops and operates Gmail.", + "keywords": "develops operates service", + "weight": 2.0 +}) +``` + +
+ +
+ Edit Entities and Relations + +```python +# Edit an existing entity +updated_entity = rag.edit_entity("Google", { + "description": "Google is a subsidiary of Alphabet Inc., founded in 1998.", + "entity_type": "tech_company" +}) + +# Rename an entity (with all its relationships properly migrated) +renamed_entity = rag.edit_entity("Gmail", { + "entity_name": "Google Mail", + "description": "Google Mail (formerly Gmail) is an email service." +}) + +# Edit a relation between entities +updated_relation = rag.edit_relation("Google", "Google Mail", { + "description": "Google created and maintains Google Mail service.", + "keywords": "creates maintains email service", + "weight": 3.0 +}) +``` + +All operations are available in both synchronous and asynchronous versions. The asynchronous versions have the prefix "a" (e.g., `acreate_entity`, `aedit_relation`). + +
+ +
+ Insert Custom KG + +```python +custom_kg = { + "chunks": [ + { + "content": "Alice and Bob are collaborating on quantum computing research.", + "source_id": "doc-1", + "file_path": "test_file", + } + ], + "entities": [ + { + "entity_name": "Alice", + "entity_type": "person", + "description": "Alice is a researcher specializing in quantum physics.", + "source_id": "doc-1", + "file_path": "test_file" + }, + { + "entity_name": "Bob", + "entity_type": "person", + "description": "Bob is a mathematician.", + "source_id": "doc-1", + "file_path": "test_file" + }, + { + "entity_name": "Quantum Computing", + "entity_type": "technology", + "description": "Quantum computing utilizes quantum mechanical phenomena for computation.", + "source_id": "doc-1", + "file_path": "test_file" + } + ], + "relationships": [ + { + "src_id": "Alice", + "tgt_id": "Bob", + "description": "Alice and Bob are research partners.", + "keywords": "collaboration research", + "weight": 1.0, + "source_id": "doc-1", + "file_path": "test_file" + }, + { + "src_id": "Alice", + "tgt_id": "Quantum Computing", + "description": "Alice conducts research on quantum computing.", + "keywords": "research expertise", + "weight": 1.0, + "source_id": "doc-1", + "file_path": "test_file" + }, + { + "src_id": "Bob", + "tgt_id": "Quantum Computing", + "description": "Bob researches quantum computing.", + "keywords": "research application", + "weight": 1.0, + "source_id": "doc-1", + "file_path": "test_file" + } + ] + } + +rag.insert_custom_kg(custom_kg) +``` + +
+ +
+ Other Entity and Relation Operations + +- **create_entity**: Creates a new entity with specified attributes +- **edit_entity**: Updates an existing entity's attributes or renames it + + +- **create_relation**: Creates a new relation between existing entities +- **edit_relation**: Updates an existing relation's attributes + +These operations maintain data consistency across both the graph database and vector database components, ensuring your knowledge graph remains coherent. + +
+ +## Delete Functions + +LightRAG provides comprehensive deletion capabilities, allowing you to delete documents, entities, and relationships. + +
+ Delete Entities + +You can delete entities by their name along with all associated relationships: + +```python +# Delete entity and all its relationships (synchronous version) +rag.delete_by_entity("Google") + +# Asynchronous version +await rag.adelete_by_entity("Google") +``` + +When deleting an entity: +- Removes the entity node from the knowledge graph +- Deletes all associated relationships +- Removes related embedding vectors from the vector database +- Maintains knowledge graph integrity + +
+ +
+ Delete Relations + +You can delete relationships between two specific entities: + +```python +# Delete relationship between two entities (synchronous version) +rag.delete_by_relation("Google", "Gmail") + +# Asynchronous version +await rag.adelete_by_relation("Google", "Gmail") +``` + +When deleting a relationship: +- Removes the specified relationship edge +- Deletes the relationship's embedding vector from the vector database +- Preserves both entity nodes and their other relationships + +
+ +
+ Delete by Document ID + +You can delete an entire document and all its related knowledge through document ID: + +```python +# Delete by document ID (asynchronous version) +await rag.adelete_by_doc_id("doc-12345") +``` + +Optimized processing when deleting by document ID: +- **Smart Cleanup**: Automatically identifies and removes entities and relationships that belong only to this document +- **Preserve Shared Knowledge**: If entities or relationships exist in other documents, they are preserved and their descriptions are rebuilt +- **Cache Optimization**: Clears related LLM cache to reduce storage overhead +- **Incremental Rebuilding**: Reconstructs affected entity and relationship descriptions from remaining documents + +The deletion process includes: +1. Delete all text chunks related to the document +2. Identify and delete entities and relationships that belong only to this document +3. Rebuild entities and relationships that still exist in other documents +4. Update all related vector indexes +5. Clean up document status records + +Note: Deletion by document ID is an asynchronous operation as it involves complex knowledge graph reconstruction processes. + +
+ +**Important Reminders:** + +1. **Irreversible Operations**: All deletion operations are irreversible, please use with caution +2. **Performance Considerations**: Deleting large amounts of data may take some time, especially deletion by document ID +3. **Data Consistency**: Deletion operations automatically maintain consistency between the knowledge graph and vector database +4. **Backup Recommendations**: Consider backing up data before performing important deletion operations + +**Batch Deletion Recommendations:** +- For batch deletion operations, consider using asynchronous methods for better performance +- For large-scale deletions, consider processing in batches to avoid excessive system load + +## Entity Merging + +
+ Merge Entities and Their Relationships + +LightRAG now supports merging multiple entities into a single entity, automatically handling all relationships: + +```python +# Basic entity merging +rag.merge_entities( + source_entities=["Artificial Intelligence", "AI", "Machine Intelligence"], + target_entity="AI Technology" +) +``` + +With custom merge strategy: + +```python +# Define custom merge strategy for different fields +rag.merge_entities( + source_entities=["John Smith", "Dr. Smith", "J. Smith"], + target_entity="John Smith", + merge_strategy={ + "description": "concatenate", # Combine all descriptions + "entity_type": "keep_first", # Keep the entity type from the first entity + "source_id": "join_unique" # Combine all unique source IDs + } +) +``` + +With custom target entity data: + +```python +# Specify exact values for the merged entity +rag.merge_entities( + source_entities=["New York", "NYC", "Big Apple"], + target_entity="New York City", + target_entity_data={ + "entity_type": "LOCATION", + "description": "New York City is the most populous city in the United States.", + } +) +``` + +Advanced usage combining both approaches: + +```python +# Merge company entities with both strategy and custom data +rag.merge_entities( + source_entities=["Microsoft Corp", "Microsoft Corporation", "MSFT"], + target_entity="Microsoft", + merge_strategy={ + "description": "concatenate", # Combine all descriptions + "source_id": "join_unique" # Combine source IDs + }, + target_entity_data={ + "entity_type": "ORGANIZATION", + } +) +``` + +When merging entities: + +* All relationships from source entities are redirected to the target entity +* Duplicate relationships are intelligently merged +* Self-relationships (loops) are prevented +* Source entities are removed after merging +* Relationship weights and attributes are preserved + +
+ +## Multimodal Document Processing (RAG-Anything Integration) + +LightRAG now seamlessly integrates with [RAG-Anything](https://github.com/HKUDS/RAG-Anything), a comprehensive **All-in-One Multimodal Document Processing RAG system** built specifically for LightRAG. RAG-Anything enables advanced parsing and retrieval-augmented generation (RAG) capabilities, allowing you to handle multimodal documents seamlessly and extract structured content—including text, images, tables, and formulas—from various document formats for integration into your RAG pipeline. + +**Key Features:** +- **End-to-End Multimodal Pipeline**: Complete workflow from document ingestion and parsing to intelligent multimodal query answering +- **Universal Document Support**: Seamless processing of PDFs, Office documents (DOC/DOCX/PPT/PPTX/XLS/XLSX), images, and diverse file formats +- **Specialized Content Analysis**: Dedicated processors for images, tables, mathematical equations, and heterogeneous content types +- **Multimodal Knowledge Graph**: Automatic entity extraction and cross-modal relationship discovery for enhanced understanding +- **Hybrid Intelligent Retrieval**: Advanced search capabilities spanning textual and multimodal content with contextual understanding + +**Quick Start:** +1. Install RAG-Anything: + ```bash + pip install raganything + ``` +2. Process multimodal documents: +
+ RAGAnything Usage Example + + ```python + import asyncio + from raganything import RAGAnything + from lightrag import LightRAG + from lightrag.llm.openai import openai_complete_if_cache, openai_embed + from lightrag.utils import EmbeddingFunc + import os + + async def load_existing_lightrag(): + # First, create or load an existing LightRAG instance + lightrag_working_dir = "./existing_lightrag_storage" + + # Check if previous LightRAG instance exists + if os.path.exists(lightrag_working_dir) and os.listdir(lightrag_working_dir): + print("✅ Found existing LightRAG instance, loading...") + else: + print("❌ No existing LightRAG instance found, will create new one") + + # Create/Load LightRAG instance with your configurations + lightrag_instance = LightRAG( + working_dir=lightrag_working_dir, + llm_model_func=lambda prompt, system_prompt=None, history_messages=[], **kwargs: openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key="your-api-key", + **kwargs, + ), + embedding_func=EmbeddingFunc( + embedding_dim=3072, + func=lambda texts: openai_embed( + texts, + model="text-embedding-3-large", + api_key=api_key, + base_url=base_url, + ), + ) + ) + + # Initialize storage (this will load existing data if available) + await lightrag_instance.initialize_storages() + + # Now initialize RAGAnything with the existing LightRAG instance + rag = RAGAnything( + lightrag=lightrag_instance, # Pass the existing LightRAG instance + # Only need vision model for multimodal processing + vision_model_func=lambda prompt, system_prompt=None, history_messages=[], image_data=None, **kwargs: openai_complete_if_cache( + "gpt-4o", + "", + system_prompt=None, + history_messages=[], + messages=[ + {"role": "system", "content": system_prompt} if system_prompt else None, + {"role": "user", "content": [ + {"type": "text", "text": prompt}, + {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_data}"}} + ]} if image_data else {"role": "user", "content": prompt} + ], + api_key="your-api-key", + **kwargs, + ) if image_data else openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key="your-api-key", + **kwargs, + ) + # Note: working_dir, llm_model_func, embedding_func, etc. are inherited from lightrag_instance + ) + + # Query the existing knowledge base + result = await rag.query_with_multimodal( + "What data has been processed in this LightRAG instance?", + mode="hybrid" + ) + print("Query result:", result) + + # Add new multimodal documents to the existing LightRAG instance + await rag.process_document_complete( + file_path="path/to/new/multimodal_document.pdf", + output_dir="./output" + ) + + if __name__ == "__main__": + asyncio.run(load_existing_lightrag()) + ``` +
+ +For detailed documentation and advanced usage, please refer to the [RAG-Anything repository](https://github.com/HKUDS/RAG-Anything). + +## Token Usage Tracking + +
+ Overview and Usage + +LightRAG provides a TokenTracker tool to monitor and manage token consumption by large language models. This feature is particularly useful for controlling API costs and optimizing performance. + +### Usage + +```python +from lightrag.utils import TokenTracker + +# Create TokenTracker instance +token_tracker = TokenTracker() + +# Method 1: Using context manager (Recommended) +# Suitable for scenarios requiring automatic token usage tracking +with token_tracker: + result1 = await llm_model_func("your question 1") + result2 = await llm_model_func("your question 2") + +# Method 2: Manually adding token usage records +# Suitable for scenarios requiring more granular control over token statistics +token_tracker.reset() + +rag.insert() + +rag.query("your question 1", param=QueryParam(mode="naive")) +rag.query("your question 2", param=QueryParam(mode="mix")) + +# Display total token usage (including insert and query operations) +print("Token usage:", token_tracker.get_usage()) +``` + +### Usage Tips +- Use context managers for long sessions or batch operations to automatically track all token consumption +- For scenarios requiring segmented statistics, use manual mode and call reset() when appropriate +- Regular checking of token usage helps detect abnormal consumption early +- Actively use this feature during development and testing to optimize production costs + +### Practical Examples +You can refer to these examples for implementing token tracking: +- `examples/lightrag_gemini_track_token_demo.py`: Token tracking example using Google Gemini model +- `examples/lightrag_siliconcloud_track_token_demo.py`: Token tracking example using SiliconCloud model + +These examples demonstrate how to effectively use the TokenTracker feature with different models and scenarios. + +
+ +## Data Export Functions + +### Overview + +LightRAG allows you to export your knowledge graph data in various formats for analysis, sharing, and backup purposes. The system supports exporting entities, relations, and relationship data. + +### Export Functions + +
+ Basic Usage + +```python +# Basic CSV export (default format) +rag.export_data("knowledge_graph.csv") + +# Specify any format +rag.export_data("output.xlsx", file_format="excel") +``` + +
+ +
+ Different File Formats supported + +```python +#Export data in CSV format +rag.export_data("graph_data.csv", file_format="csv") + +# Export data in Excel sheet +rag.export_data("graph_data.xlsx", file_format="excel") + +# Export data in markdown format +rag.export_data("graph_data.md", file_format="md") + +# Export data in Text +rag.export_data("graph_data.txt", file_format="txt") +``` +
+ +
+ Additional Options + +Include vector embeddings in the export (optional): + +```python +rag.export_data("complete_data.csv", include_vector_data=True) +``` +
+ +### Data Included in Export + +All exports include: + +* Entity information (names, IDs, metadata) +* Relation data (connections between entities) +* Relationship information from vector database + +## Cache + +
+ Clear Cache + +You can clear the LLM response cache with different modes: + +```python +# Clear all cache +await rag.aclear_cache() + +# Clear local mode cache +await rag.aclear_cache(modes=["local"]) + +# Clear extraction cache +await rag.aclear_cache(modes=["default"]) + +# Clear multiple modes +await rag.aclear_cache(modes=["local", "global", "hybrid"]) + +# Synchronous version +rag.clear_cache(modes=["local"]) +``` + +Valid modes are: + +- `"default"`: Extraction cache +- `"naive"`: Naive search cache +- `"local"`: Local search cache +- `"global"`: Global search cache +- `"hybrid"`: Hybrid search cache +- `"mix"`: Mix search cache + +
+ +## Troubleshooting + +### Common Initialization Errors + +If you encounter these errors when using LightRAG: + +1. **`AttributeError: __aenter__`** + - **Cause**: Storage backends not initialized + - **Solution**: Call `await rag.initialize_storages()` after creating the LightRAG instance + +2. **`KeyError: 'history_messages'`** + - **Cause**: Pipeline status not initialized + - **Solution**: Call `await initialize_pipeline_status()` after initializing storages + +3. **Both errors in sequence** + - **Cause**: Neither initialization method was called + - **Solution**: Always follow this pattern: + ```python + rag = LightRAG(...) + await rag.initialize_storages() + await initialize_pipeline_status() + ``` + +### Model Switching Issues + +When switching between different embedding models, you must clear the data directory to avoid errors. The only file you may want to preserve is `kv_store_llm_response_cache.json` if you wish to retain the LLM cache. + +## LightRAG API + +The LightRAG Server is designed to provide Web UI and API support. **For more information about LightRAG Server, please refer to [LightRAG Server](./lightrag/api/README.md).** + +## Graph Visualization + +The LightRAG Server offers a comprehensive knowledge graph visualization feature. It supports various gravity layouts, node queries, subgraph filtering, and more. **For more information about LightRAG Server, please refer to [LightRAG Server](./lightrag/api/README.md).** + +![iShot_2025-03-23_12.40.08](./README.assets/iShot_2025-03-23_12.40.08.png) + +## Langfuse observability integration + +Langfuse provides a drop-in replacement for the OpenAI client that automatically tracks all LLM interactions, enabling developers to monitor, debug, and optimize their RAG systems without code changes. + +### Installation with Langfuse option + +``` +pip install lightrag-hku +pip install lightrag-hku[observability] + +# Or install from souce code with debug mode enabled +pip install -e . +pip install -e ".[observability]" +``` + +### Config Langfuse env vars + +modify .env file: + +``` +## Langfuse Observability (Optional) +# LLM observability and tracing platform +# Install with: pip install lightrag-hku[observability] +# Sign up at: https://cloud.langfuse.com or self-host +LANGFUSE_SECRET_KEY="" +LANGFUSE_PUBLIC_KEY="" +LANGFUSE_HOST="https://cloud.langfuse.com" # or your self-hosted instance +LANGFUSE_ENABLE_TRACE=true +``` + +### Langfuse Usage + +Once installed and configured, Langfuse automatically traces all OpenAI LLM calls. Langfuse dashboard features include: + +- **Tracing**: View complete LLM call chains +- **Analytics**: Token usage, latency, cost metrics +- **Debugging**: Inspect prompts and responses +- **Evaluation**: Compare model outputs +- **Monitoring**: Real-time alerting + +### Important Notice + +**Note**: LightRAG currently only integrates OpenAI-compatible API calls with Langfuse. APIs such as Ollama, Azure, and AWS Bedrock are not yet supported for Langfuse observability. + +## RAGAS-based Evaluation + +**RAGAS** (Retrieval Augmented Generation Assessment) is a framework for reference-free evaluation of RAG systems using LLMs. There is an evaluation script based on RAGAS. For detailed information, please refer to [RAGAS-based Evaluation Framework](lightrag/evaluation/README.md). + +## Evaluation + +### Dataset + +The dataset used in LightRAG can be downloaded from [TommyChien/UltraDomain](https://huggingface.co/datasets/TommyChien/UltraDomain). + +### Generate Query + +LightRAG uses the following prompt to generate high-level queries, with the corresponding code in `examples/generate_query.py`. + +
+ Prompt + +```python +Given the following description of a dataset: + +{description} + +Please identify 5 potential users who would engage with this dataset. For each user, list 5 tasks they would perform with this dataset. Then, for each (user, task) combination, generate 5 questions that require a high-level understanding of the entire dataset. + +Output the results in the following structure: +- User 1: [user description] + - Task 1: [task description] + - Question 1: + - Question 2: + - Question 3: + - Question 4: + - Question 5: + - Task 2: [task description] + ... + - Task 5: [task description] +- User 2: [user description] + ... +- User 5: [user description] + ... +``` + +
+ +### Batch Eval + +To evaluate the performance of two RAG systems on high-level queries, LightRAG uses the following prompt, with the specific code available in `reproduce/batch_eval.py`. + +
+ Prompt + +```python +---Role--- +You are an expert tasked with evaluating two answers to the same question based on three criteria: **Comprehensiveness**, **Diversity**, and **Empowerment**. +---Goal--- +You will evaluate two answers to the same question based on three criteria: **Comprehensiveness**, **Diversity**, and **Empowerment**. + +- **Comprehensiveness**: How much detail does the answer provide to cover all aspects and details of the question? +- **Diversity**: How varied and rich is the answer in providing different perspectives and insights on the question? +- **Empowerment**: How well does the answer help the reader understand and make informed judgments about the topic? + +For each criterion, choose the better answer (either Answer 1 or Answer 2) and explain why. Then, select an overall winner based on these three categories. + +Here is the question: +{query} + +Here are the two answers: + +**Answer 1:** +{answer1} + +**Answer 2:** +{answer2} + +Evaluate both answers using the three criteria listed above and provide detailed explanations for each criterion. + +Output your evaluation in the following JSON format: + +{{ + "Comprehensiveness": {{ + "Winner": "[Answer 1 or Answer 2]", + "Explanation": "[Provide explanation here]" + }}, + "Empowerment": {{ + "Winner": "[Answer 1 or Answer 2]", + "Explanation": "[Provide explanation here]" + }}, + "Overall Winner": {{ + "Winner": "[Answer 1 or Answer 2]", + "Explanation": "[Summarize why this answer is the overall winner based on the three criteria]" + }} +}} +``` + +
+ +### Overall Performance Table + +| |**Agriculture**| |**CS**| |**Legal**| |**Mix**| | +|----------------------|---------------|------------|------|------------|---------|------------|-------|------------| +| |NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**|NaiveRAG|**LightRAG**| +|**Comprehensiveness**|32.4%|**67.6%**|38.4%|**61.6%**|16.4%|**83.6%**|38.8%|**61.2%**| +|**Diversity**|23.6%|**76.4%**|38.0%|**62.0%**|13.6%|**86.4%**|32.4%|**67.6%**| +|**Empowerment**|32.4%|**67.6%**|38.8%|**61.2%**|16.4%|**83.6%**|42.8%|**57.2%**| +|**Overall**|32.4%|**67.6%**|38.8%|**61.2%**|15.2%|**84.8%**|40.0%|**60.0%**| +| |RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**|RQ-RAG|**LightRAG**| +|**Comprehensiveness**|31.6%|**68.4%**|38.8%|**61.2%**|15.2%|**84.8%**|39.2%|**60.8%**| +|**Diversity**|29.2%|**70.8%**|39.2%|**60.8%**|11.6%|**88.4%**|30.8%|**69.2%**| +|**Empowerment**|31.6%|**68.4%**|36.4%|**63.6%**|15.2%|**84.8%**|42.4%|**57.6%**| +|**Overall**|32.4%|**67.6%**|38.0%|**62.0%**|14.4%|**85.6%**|40.0%|**60.0%**| +| |HyDE|**LightRAG**|HyDE|**LightRAG**|HyDE|**LightRAG**|HyDE|**LightRAG**| +|**Comprehensiveness**|26.0%|**74.0%**|41.6%|**58.4%**|26.8%|**73.2%**|40.4%|**59.6%**| +|**Diversity**|24.0%|**76.0%**|38.8%|**61.2%**|20.0%|**80.0%**|32.4%|**67.6%**| +|**Empowerment**|25.2%|**74.8%**|40.8%|**59.2%**|26.0%|**74.0%**|46.0%|**54.0%**| +|**Overall**|24.8%|**75.2%**|41.6%|**58.4%**|26.4%|**73.6%**|42.4%|**57.6%**| +| |GraphRAG|**LightRAG**|GraphRAG|**LightRAG**|GraphRAG|**LightRAG**|GraphRAG|**LightRAG**| +|**Comprehensiveness**|45.6%|**54.4%**|48.4%|**51.6%**|48.4%|**51.6%**|**50.4%**|49.6%| +|**Diversity**|22.8%|**77.2%**|40.8%|**59.2%**|26.4%|**73.6%**|36.0%|**64.0%**| +|**Empowerment**|41.2%|**58.8%**|45.2%|**54.8%**|43.6%|**56.4%**|**50.8%**|49.2%| +|**Overall**|45.2%|**54.8%**|48.0%|**52.0%**|47.2%|**52.8%**|**50.4%**|49.6%| + +## Reproduce + +All the code can be found in the `./reproduce` directory. + +### Step-0 Extract Unique Contexts + +First, we need to extract unique contexts in the datasets. + +
+ Code + +```python +def extract_unique_contexts(input_directory, output_directory): + + os.makedirs(output_directory, exist_ok=True) + + jsonl_files = glob.glob(os.path.join(input_directory, '*.jsonl')) + print(f"Found {len(jsonl_files)} JSONL files.") + + for file_path in jsonl_files: + filename = os.path.basename(file_path) + name, ext = os.path.splitext(filename) + output_filename = f"{name}_unique_contexts.json" + output_path = os.path.join(output_directory, output_filename) + + unique_contexts_dict = {} + + print(f"Processing file: {filename}") + + try: + with open(file_path, 'r', encoding='utf-8') as infile: + for line_number, line in enumerate(infile, start=1): + line = line.strip() + if not line: + continue + try: + json_obj = json.loads(line) + context = json_obj.get('context') + if context and context not in unique_contexts_dict: + unique_contexts_dict[context] = None + except json.JSONDecodeError as e: + print(f"JSON decoding error in file {filename} at line {line_number}: {e}") + except FileNotFoundError: + print(f"File not found: {filename}") + continue + except Exception as e: + print(f"An error occurred while processing file {filename}: {e}") + continue + + unique_contexts_list = list(unique_contexts_dict.keys()) + print(f"There are {len(unique_contexts_list)} unique `context` entries in the file {filename}.") + + try: + with open(output_path, 'w', encoding='utf-8') as outfile: + json.dump(unique_contexts_list, outfile, ensure_ascii=False, indent=4) + print(f"Unique `context` entries have been saved to: {output_filename}") + except Exception as e: + print(f"An error occurred while saving to the file {output_filename}: {e}") + + print("All files have been processed.") + +``` + +
+ +### Step-1 Insert Contexts + +For the extracted contexts, we insert them into the LightRAG system. + +
+ Code + +```python +def insert_text(rag, file_path): + with open(file_path, mode='r') as f: + unique_contexts = json.load(f) + + retries = 0 + max_retries = 3 + while retries < max_retries: + try: + rag.insert(unique_contexts) + break + except Exception as e: + retries += 1 + print(f"Insertion failed, retrying ({retries}/{max_retries}), error: {e}") + time.sleep(10) + if retries == max_retries: + print("Insertion failed after exceeding the maximum number of retries") +``` + +
+ +### Step-2 Generate Queries + +We extract tokens from the first and the second half of each context in the dataset, then combine them as dataset descriptions to generate queries. + +
+ Code + +```python +tokenizer = GPT2Tokenizer.from_pretrained('gpt2') + +def get_summary(context, tot_tokens=2000): + tokens = tokenizer.tokenize(context) + half_tokens = tot_tokens // 2 + + start_tokens = tokens[1000:1000 + half_tokens] + end_tokens = tokens[-(1000 + half_tokens):1000] + + summary_tokens = start_tokens + end_tokens + summary = tokenizer.convert_tokens_to_string(summary_tokens) + + return summary +``` + +
+ +### Step-3 Query + +For the queries generated in Step-2, we will extract them and query LightRAG. + +
+ Code + +```python +def extract_queries(file_path): + with open(file_path, 'r') as f: + data = f.read() + + data = data.replace('**', '') + + queries = re.findall(r'- Question \d+: (.+)', data) + + return queries +``` + +
+ +## 🔗 Related Projects + +*Ecosystem & Extensions* + + + +--- + +## ⭐ Star History + + + + + + Star History Chart + + + +## 🤝 Contribution + +
+ We thank all our contributors for their valuable contributions. +
+ + + +--- + + +## 📖 Citation + +```python +@article{guo2024lightrag, +title={LightRAG: Simple and Fast Retrieval-Augmented Generation}, +author={Zirui Guo and Lianghao Xia and Yanhua Yu and Tu Ao and Chao Huang}, +year={2024}, +eprint={2410.05779}, +archivePrefix={arXiv}, +primaryClass={cs.IR} +} +``` + +--- + +
+
+ +
+ +
+ +
+
+
+ + Thank you for visiting LightRAG! + +
+
+
diff --git a/LightRAG/SECURITY.md b/LightRAG/SECURITY.md new file mode 100644 index 00000000..1b61b5e9 --- /dev/null +++ b/LightRAG/SECURITY.md @@ -0,0 +1,18 @@ +# Reporting Security Issues + +The LightRAG team and community take security bugs seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +To report a security issue, please use the GitHub Security Advisory: [Report a Vulnerability](https://github.com/HKUDS/LightRAG/security/advisories/new) + +The LightRAG team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance. + +Report security bugs in third-party modules to the person or team maintaining the module. + +### Supported Versions + +The following versions currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 1.2.x | :x: | +| 1.3.x | :white_check_mark: | diff --git a/LightRAG/assets/logo.png b/LightRAG/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2d3a429174e82ee30db7d535368400818d7856 GIT binary patch literal 182929 zcmeFZhg(xw*FGF%l(7JIR0LFrbP#Du9}5tWA}G~>3IqXZ5{T5`IEoF>06{>CgffVL z(n)~WktPJh2qZ+LC6s`45=g#%g3t55zklJoUgvTqlXK2Kd#}C9z3#Pk?%P_MiEcTt z1qOqOBFxX&!C)fp(BD5dfp4yM9$NJC}1{=Q& zgXukm!6bs75ziZd3!AQ5nw^31p?`833X{M$n}f`qLtrp9S?I6O&3xl9@TCYEVRcr7 zwQ<`f-F?e8$+O@qp}-r~7lb-;G3j7<7~;%d7jE`V(!-+;VxsxKmb@KsW#7M*ULQNO zIZUM)v2E~A%&EPk)J6@1v(9QQq9Gvb-~EITF)<=)YBTja7Osm%FrE&c4Z7_$vvD*yNA z|0M8#68Jv}#5N8#hAI$+AW6gyrJNBFh~%+Xd!)6M|4BGec>RLLb}7MySm&5Ti?bII zq+D0Q|2ru;Gz#3wySn~56wwvE{(RHzlrq7C(m%$Ce*Wlh&mAiD^(On@F5{q}z1z*0gJNEl((FK>pCzY#5vFMhzHoV9gj9|g9c5ibRe7H4< z3FOI#XBq1gp)di9&3^^FKlo#UeL>Y_bf~P1maO*Fe?3srQ(CV_+yPyR{djp~eNO*4 zkHDLji~lN`B|VG)5d-{*fGMw!jMUW*9le>~MLgH_Mx)X5)AbmSs)&oS#68emv3IVn z50Nv0%Ud`q6*;4X@S}^kOVKw&m)~4{H7mHU^Wp-B8QnJNN?cpY3rVq)q9V;E<&j$1W_Qv=mL>KNtP??lgJTW}M)^@aQ*;ITWMbyk`@Mp; za7)MFg8i&}anDh{EC&Qy@TXS$KZ7I{cqAszBM`#=5uZ=9S8kh`hD9lJzOUbP^7qOT zo@Pmt9dXN!awWcVr>U+b!}SXjHU1BcOa=D^JcwLZ(!NqRnFbr&vUd;fZLwVZ1*MfS zZ`7B44~?vU-?y%0IVD}_`SYknFNCaARC;`g!w7bKfxmR>?*;h(h+$t&PgqMCo=&;I`e~ni8O2X4Ae5m~&yvNU zJ7amDB<-OOZ-OBeh9g|~o~WfitykuMrenlR=&#%gxBe(`+V$1D*89R}}nmp0# zBVvD>hl*1}AizJ*cy1bail$cg@F*Be&JA7tE2~EDwwU?@734%j(v%5rM}!Bm6v90RvuThJbl=e z&AE_|tB;)O^LN*@SJwMe@Pyh~?2tfzt`Qm{YqE}=xHMI0E;^iU-xYna-v3S_)u_2qer1U^ z)nx(a56sLAComP(AC#jAj3ZXTRb-P$l}p!wW~%hsQse4lwr_JsDw-kJ+|f2S?76gc zQ!W8|0`{>xG4O@pnWo2Hl5upAm>#;ccR?J&Wk3DvUvs!dxfOElM7OMLQU&EN=z-X) z9_xBidyy2DS$?Cpe3!Hro@`z|mmAr~jL^hRuSU%^Na|dw(*G?r>HkQrnDYHbqQO$C zIZtlSQr4>^)FNka@NME#q>hA?z+@F^Z^s#35+KFFEZIKrII+B}vaVFeE9k&z0&=MeLI4wgSl zEz%Pj+RkB*`kX~~v|qxFaWX?Ej;bY!34|~&{(A;P#~}xY)8c2R(PfEeyXx~C9gBAb z>Li)1I}Og(_m0rp-vo!qAn^r@si=tH%b&FEW|Lj~`*jKK;)1DR{~wzg#>y6TjTG{( z;tsAX3=S4oFsaa8uuk&6--fKzYAQ1oAaj0+EzIrc8Bh04N9xH$PeL~VgPK|QnqfYA zG1zAQ>8?I&qeRkxL$TGW^b$r88Rj?q$8~%zr-;<{OUS8Cd>G1LY4?nOm>?wX5)32> z|E(l9UO32;N7*(>$u)e+8hx9aKm-kUf4d70Q`4iyM^~n+SFZ5uTr#7A=U)qM2nzWv zOsR{-R*hy|k$rR57FT>j+cn$uUZ?LBykqG7@5u&hYR-}6S8NjIu9TKu*o1vQ*|owP z5{&cXn-dzk8J1(5#~Rf~G-KeZ?(b?kNL*p?X0lZDLBZ97TmKVt&KFND7m*qw6d8V_ zWtV3J&VU*Eay=HJ<4HIbNz#Qbq{J_O_m>Xx(x{_}Y(d=qQT^Xgf@*1B^?JCBmo0Ia zy}D^VG9S6TuF%XEzM-=_n~ka-muYuPek)^Cs}lD^Q;5CupF4;St!|2nW7(E z{EKKoq=aq#_W4lo zSl`39>kn_g>gm~3Be&L3vX)6Af19kXfeXA&4)s6LKDb7l)*|B$q|S>(ORhis`_0=6 z>`tx*;$m2hrR+s(&8pmf!DT0v-}-Ru{d-4mHfPd`$F$AAv3#3?6kJ!?xUR(}|H@Gc z183chwGE;|_tFLa_J2@DdUiIyUM^Kmlb`wa>AFP%ls54s*8AF8XMFl9uf)BXMQr zO2&V5PbIIKp*VjPr$n{V8!KYgs-r1oU?L`kf-w1}Bt2bkVpz_nvFlt%O675dp`1J$ zi$(s69{a{?VF*o5D7aT49Z9lwu8UgP+<{;9!hQL(-Q0<^dqJBmYvHqyr0TEc8@~BluN$ zoKd&0Xw*`$Uq=F6WoQeMC0BzM%kAEZgFP9(_Y2}rRMB1 z=a938P<+dA^z0oK84aJ^q3M4wz*!DMjmu~smC3sK^NXPX=UA@0m={ztcN8k{yhew( zH*GDns&81o?dyXCAf9{4ULNYf)C{=jnVN%fiWqF)=g-3uxu?Ml_ZHuifY#G#>Z8Xq z!;v+JLpRe{So+-9S6}^@1CZTsf37kXs{6TpHMD1ZIQwiIxLaitwE9>hyq8A@nkquj z@4IGQPIV~mXLue>gx<)+t4MM^FbzgT!rElui=HX<Fxac@0$0hofRA5$Kx&lp zQ6T0E8zsq^Wf?)fNebN3>9fFD4ryPFrbuO8EfC)(ZnL^qrWDBQ>>J3H=7_g{$vW9} zy*fsL^_7ViBidO=I~MzMgV6w!nG}AVAS`KDlv%j!rFS9Ni{7%b{d_GbA^fqpj-Hr} zD=Xg^MKpjx^-i~t@dZO;X3(0@@4kL@me1%V7Y&0;$LFYdEM}l723(;@1Lp>%oK=rp zi#I&PdkrOOcMs+26Fr?~`7PzYVoth&ShM6S6Gfum^>h3{4R_B@b4^zEbXxNJL{*aKD_FSyaoStmjl5qOXN=Zz(; z%xDA}c>6c6AwN7Xia{oi@t91pLoEXht~QV7XPF5m%I%Z(nwlAA1V|h3zSL5C2V%dm z<#>Pp3lQUadw@{ql>{p|rd{P#l_!$HI?tBac4i5-Ln)<>fv+?o%6{iKv>FAsYZsOZ zR^jwuq}6e)Do>N3|99pgXL9K(Kre;~0C(i51D{uja5?HD*IF8V6D{89&$eir*QZD| zyk*z>_O$4lK_XLeNKY`n)HRo@A8{)!CdAjb70(1|M{EX!O%)6=7v&;s1r9c zt5qZ;|H-ogBfQ7Tw|=A5%DB)AfvHeQV^#C5=k%Ze0U9cp%m4IkJ$!>hB0wW$f0IH zs86A)xA#{ls#%r2(GwLI424J$^!u-0@ja-kq$yVyUE}O}RXw21KNf)=S;7sE5D6lp z4oWM5XU!m`*bNNGq^Qb;C*5pAOd_te#uTIs>dEF=RL%^HVi4x4+7&x1F zj7Vt8oHUwGr9jkyZcW(K8+U}BJdr@Hleb9-0N>T_fR@4fI^mIsslldPaDJ0o_IS2~ zIzbSRXK&JbPTAM+FiqzSW?l~yX-&}h@))?*`9~lP{Kr%M5nEvc#xS8IP6%dF_9O2P znC$_!Mfvr~#P)d&M61NF68WdSg%#H)&$7!w4&K*nc*Se!ol_Qe8jA?ds)dj!<+N?712GNo5J8U}|eacg53U z%({@dt`A<=`NWqYBS+3av=}oGqFEFk0qiVN)%Rg*o6=YA}$k~K%ZXcPnuUwGvQc2mn>9$e4bQbG%g+6gY+z*0p@6=`0J5wCjy;DqyFW7seDU^# zhvvY(_wP@;89$7zycbwk+GD{c2hbO%O>2awyow21Eq*q}fBOC~7kD<4I;{h)I%&PG z1bvIq4@@uv80534xY({24%0J{IP9EGW1bh@_=>0JY&p{*XII;^tu|8? zFM4K|>RKTrVe$*`V$+tK6lTKl zw$66C?NJo*m{n8uE+`9lPy$rjwJZB9Cb{QFj_O0m!>q+alKgr%u4YQB`(w?jB)@rP zrcc*&Nl0O@Ce{)#K$VcW*`8y&#`2R8$O?IB-j(BmVCOMN7{y!p$zCtHXQPWr?Txkg)6qSi0CWG{gu8%xlIatvr|bU}asvg^!1c{fqh;4(N*it5_m{*Xh~5=4B; zbqBSQ9_zILv`DPo$=>MR3@D141o~FZ>*9b3P~3Nd`(TFz!HnSq)XNBBaHL=@ACVoU zU=|P9KrRjN)=$}Nw#_3pQ>6GjQ zK}IjwKN#$wF3BSw#}9}2_Zvjb^s^!+qL z1tP)y^%UT>|9i^^6+YLm^knE+$XnjiFfMEeUC0nnut%|EK=#RzsM zG$&%m8ttvzYi#ldk=GmkpV5@Lw@p3f*%SznlDg1~+PG{%0o=zDh?yWjcJ2pU zQe#?-E>T$bV+%l5+aC(ZpU#uw=H0)>1aWUskRIZ&=9kNZLw9 zVPVtsc1RX|e%F{kT;cu+>^JHm-VmjJZ+(@_msN4z`wHD;BJX*U_t0;-3TBwokU218y(P5WwDmqB4Xc1U|h4N-X3 z@yEA1@&Bz4=sVfNjg#$==r6O%ug_C(d=!v_YKJl;P=VJ1b5E_Ea5kIX0YcaVR9IM4 zrswoS_8b3`y1!0<2>T2!oy^U1-~`xL2K|MsH-MRi)=BX-{j zKRYSu0;5_l zX_zd*Q4wX_y4#e)03BAt5p#5$FGb4f-yQ+gC9qT&?C|6lXC3YX2*3qhheAX9d@WN< zXR7 zxfdV=J4n`&GBzd(nef*wWqvom9XNptki%G$YYl67hg^EVeiJ+g;^Hreb-L8TFA~JQ zjV8Y--1&o%R0zC7N;Q8Q3hQ$GBp?El$d^d{WiF1c(Xn=zq6*{e60A07=~Eo<#QVu4w4%OZ%133s=9gw2cPORbX=DKz|NK3&E+0CL5DH*)`X)&tA zE&qMVF-<;!ko^M$h$&nFiFal;ga9bIsV5*GeH;*;=!n6V>xXQI(LahyfvwD`5lw?n zWB4OBLBNOSHS z)1r>AWQR3gk0u09$>zEW&5K)`gSEuIn`!d=9WfOSEK$6|v#_>1m9tygXPW2k4(iiY(HJYnT9P4~83%#>tjrLc?upw>|fa>9k#STXL z94A;Zgqy&FwGP8|4f>G%yH#B8ePN8L`Nd4Q7H3b*nkJ#JY>FZ>N$zyCaga!hlGRd! zOV`OJzB$hVY#pUZIHw*0Z2*>qolj3NgbM}2 zUfGgtD@dvN|5}M-TnJY>9vU5mjjV?=g+@%~&6Td%ow~9+Dty?qW z&po+25!5GB?4INaK)&s9$k1vA)P4SqPV^}oGTa?&y>7s}8AJzV{zGWTb5&id$Kz24 z9D2JTdi{tHZf< zKab;=K*dy38QIv`bvF22|C}r}CA&Q|$Oe185VLJ`Afn?-rerEafdMjx(AqY+Ha<6X zH?Y2Aq9j_OJ)`E5sH-Ugx3pj^Y?3w!rQQz8D-u<~q`?dXh$ieW&;Brp{B;_tPu=-u zpwP}+Wg51}@GerT7;QZUJCS?d(?7+n|c@r&ceOeo7f3*WUD_OW zPl6fnKAoy&HF@)lL?B+b!9L8Ce>VRhO<7yqEH!NJd&iuE;|ss!Gg!{Z2qM+H_dAl1 zxZfmP;A~8;RE_3+N^o`aye@4-oE>_hKB{*iv2>E?B`jQmfw-4WQIJ>68mz?THA>e? zStBE{QCt~=xl1+rIjTg5;@+Yugb=zJL=IIHuTjlt&l*uuBu z=!roKugf4!h|LF(o(c;8g>ogVS^Mk;z|NB&8O6Xx1dJ%`&Tt9gJ++^IN-+bCT&cSx zvY5=hI@DgT-Krx7VXjU^h~c9zya4t@;Kc8It-TSvq>^E*fLyys9gwNJFfb9XJ1Ac#&U1!hY-X1) zJTUbu^>#I9q%@kUHk)xN9XYwQ`yL6D^mktXT@(i}hKI}FwlSPR(&RqxCzSJDV6Hhq zw0v~`hNW+$H1OmEpE?q)5!b@ydx}S6aWcu>tqe@sJH%8M1BiDx&ZV<_wXi52S6$ z=hefdzVC|Oo%uxWOZ9t`Tfl~0=}9)`2Ob2}rRi&D@a{k{MQTIN&2_=pjxN@TP5N|n zqC4_SN1rog$2Ua|Wf^8zKPm;F@h1IMW{f-b-)kIiAa5!DP;%(Rl_g%I_%T~K$S5*; zQ{_a>Y7V}q(?yJp0c{(K{xkOKx&t`Xe6(-LDcrtq?)?q7oAqgfZ{NOc9LU-MvyEa~ z0E2#R)R+|-RHn7oz4(lj9J<_M=ziFAJ%dGO}I* zx0@4tDZPQ%Abye?LcP^M5&0&{%ZUH9dQ8N;+E9tNY+w#!^a^h zT!L1MZfvN{_pp6TP({u#106h$U%9ubl9|&+%kf%tf zR9mF*eY8xcrGcE61gO*G$|R{;vsg2s&Aiuh#UY0FEbUWyo0~N7Rd0UwPQZ;7iAOBf zW*2E=3!`GzXJwqZY4=mgOcFt-k8-E_d$%Ea)H>94f1{Fz6oA{8-6* zuwjR~i77$$1#o_>M=<&F8#*AlWi5zw{V*~&L#aR7z5N5&N0B_%ciDE_v?VbRZ5bC| z+YdSlzK=O?-1nai!4#6IPru^Eow{*->PoF6JZtz0- zc-Pc+F{{*x`ld|KTJ;3w-Ek0b?BbT3M}XruM53QWPRN5)tCiNF+Pc^R!{7TY5OaxY zsYc3x49O*Agt$F?o4QrE=JY{m{B|qAUigm!vS7#IKnrSge@YE;E~@?g`0}?;^c0Yn zZ_jg+iT=47HQ|jjG$g`5Z$>Rropm&ycn#TL)EN$~u)R<_2Kq0&|G_Winz}j%2pLP0 zz33zI?yy%kL%77HOC_>hUlR$5waS}lu7MEs^kWnhh7#$aSJ7tw&>5}THD#pto$r0p z26D@R2313$A0%2EHM#!+=6&fyg+7rR2WWIxKn3tYX_M|)ps5U~ZMH=hdM>(632^_7 zIJ)!fczfeZxK9_7fm@Xn7H&1F3!Cyn5;G3R#ylzT(3i{HL8pkdzwi1WKgTvILS#r^ zb#YVXD^`$Uj?xfXm)Gd}ws!get1mEY<(XO6XXgS@jAHxAj*EZ` zEnxncBXiCsF*{8zB4wC-cy9!K6TcwuVR27$$J3&7uA;CLce|cl6f&uVsM+>{EajE0 za+%ei1G7V@*z{gT58#F+qE%om&(FQ5LJ?Jhggt!Ye^Z#wa6VRnX$&jA-?g5{l_aj8x1YCeE|IXhM=*ZOIC zjGd@k;hwsh$1Irr6`0=3ZBK~0adUZGg}BKiGI{9H78vm*+|is{OfIoEMLbXbIQET36|r#5zU~c%e>g7kX70XADYT8TFy_Mr9$~pG&Jqtb8|7 zKV|4rA)w%2fer;EMapCc0K>oXK=kAy!Wu~o8_>a*f@Ne6e8bI$Ha9+%Tgiz7ja`2e~`ypZ*Mj*ut=%dJfKU_>74Vp|g2@2E)? z_v>S(^t`+vih!KQT9)Pb1BHu>>6C=3)&|{@Qd3uGOM9FSRd^w?`j29;IeC!}-}{8W0f}z{2>>PksmaUBlifL)^yNd*soT34%V+pReYq)2lzW*UX|4G5zC*f$)~gx1bg( zKTl7tt8dkPQXSU;6PcN(OdxSCS$1{EHFVIkwT@l(23>V!?tmC>WFCWUwNGd`1IxKh zs}aj*(IVUD+n9S16`-CSdh=%g7ZB|m%FgwRO)qy`3Nf6~3AvnKxw7Lv?iLf5pr0() z>=45M94cU^WQGE=0he3=g51d14Q=tWsjGj(yOxJ`!Bdzxor4cqLZBTE3lf8~BajZO z<7OogVNaYs^oWYI&pTtdwUNADprO6Ms4N|Mt){S`gJIJ~-WLhM%p_Dq5V}?LTcyhi zqi*6bYCJR1T-YQIL~#jPXRvL0V_VgrT0Vc<&;x^|8jFbQfJx4g`3_1kME{PZNWU2+ zsfPAjI?!fgc-iP3ped zvR9U6WXyIXrHT+u;$HjE@I?p~O&~iojLvl}Fed0i-s-f`=T-o{`d33OJYWm@i+i41 z;SAloLMc`olPo#svieWI=($h&=G)J}v?!9qOwELt+Wr^o4A3;ngyy_%#QOzo3Nq3X-|{7+E&_>Hbsh#4oWNz_6l?l%r>@7 z;P!=dIOfdhKs{GgdcPLm$B928_D{$y{Afa*u1kx4Y1do>YOLx9_NUeB=>2K31W;J4 zq}G8#$GNDLR5@c^qSq}pAUg*fvv-PgW{-+5j-G9)i?*w7(CzQLp5i>x4!Ee;8_ngv z;w*`gXtSE(xvtXbd0zNwXNN`$P#s|6?X7!5gMbzKC4HEdV|7yu8{QfP7LXi^`?D*< zrV^T=kPoGCXms(Qf%{_522nRS0>%5v+yrA*x{<~vtgPHeeWeAfwF6-75OD*{_9)Mc zvXNdnCQ>&Vd6P6K*)C%cf#v3g)Lf*9nvnNPXVK1sdgv!ZY%S?%Zsd`tK8Ymb*PvuN z;~V-j4wSuqf^~K-L1iV7+PLG`JL%c{;2X@@+|1j_r zR6F89(ze?XAI~^j9(NXlwp_bGrCmpV{HbLb%y9Hx-ZCE>I#JC}?Oi>ITeAlUH_9WX zF?`9zf7TdOR_CGCAC4W~pXia_wMxvZAh;%^M#gkN8<;mbI6#KoJdt!jKY~1WGtKAr zh470|(5R)&8RNckvtRn&UJ)*3W$&3@%?Uq2%uxjfYMATN@Zx;2KQ`U7BUMX+-fcQv z>=37B@ascnB=kP0+llk#>({g)wy=9@}ujz_L=MV__74D3f2qb#6*U zJLweB3aU95vnQ~pSgxu?BMP}k3iboya1+4@7shXp*`OCMZ~xM2E@+MLgK|F^NG+a2H9k@_qKnAHTVJcX zYYqBjVyzYWW_pl7(KHMP z#5FSv?0|_ipOXQv$uZ5E$bIreit#{9$aWi8PO@8iLU#68v!h)6nHuy1XS+TR;ZBCj z#!KPB*ZQ=%bH^`L)+4>Wdqc?(kHU;*kBM005@PyMK%G>mCbp9py6Y@mX}<~7KwzN?!tJ4zF}afa0W7(SSuwoOe9h>St8VqQ zxzp-x4Zexp*&S`yOCX;d;filJaPIN}Z+SJwRZ|~jweo$W&krX4)zwLPZXD}|DyVnJ zxcPcG@KM0YyRtaLQkTrtzkU-FIh6o+4YC(cF1-Eb5Do<|TZ@u9=HK}~(ztPBW!}Zs zjsK3Utja)aRs?dki}`oJ(}up#pcj9T`N)uYRm!9%CfX-2XZ5Sm?aYys7z?m)~0*RjE88gWTJ!#wq@)ADdIzjPltG3cMP1EH?&DPWmOgQ z7wP?REfs2hJ*kC$w}z9$<|NY`XEhLoqv2|bPtrU`aRJ=-dk{BTv#+p^E_q_WnJ&xu z;0^RAcqq)HvC{r?uhb786Fxn3Y|yx+j}4(nq$`8%*xvKaKGOVe^WttiF+q z)CQFlQ0t8U)M!TJCczC|W>d^;Uia}dKhx*DUybisyA1i!{LvwTzFtYVd3s|#sO#4p z%_gsjKb!PC)&+kF6 zPCbil<0`pUooPRA$2Zyh6NQUY_f5dw7(~5JI z`^paXi;Zn_zxB5ZI0uzCY~#38^H;WHuO{Zgg@rl9~ZWuTTu!$bAb)=$Ria-91lW3#SuHNyqaslYf!x~|62 zhCueBp<9Zp2WZxINygra@&u? z(&^a>MP2kw*k8oZ{<3?ZMUDN7abJyD*_%xQ43x5-tolctmatQ3q1Yk&k^sI3!hQOk zeLFoUo9ZyHA*=w^*S7d9u|ph0#l>S>W}D8`%x}Qx9|RpaQ=@M9tynX!q*7T;%AQQ` zg48J}Wn+q&=y9$zfYS|AAWK3OV3W|<_rx^0-+??ua^1yqTnh@DzTf}~POzT6l+Hoi zH+H)C_i2y*D>=(;UoCLM`*DkynUl#GN$G zWlc-i+R=MbOqrV(2D49Y=t+qN~(mCNaex`A5CU#Ef!^9ev2T@Bmd_V=J4ZWwd} zCZ7Rb)gRYLx!)AF#9+J{EZ>QJw#noVXd^(2OS#YG%QF)=I=~H7P>eF!KLS74Xwfww zbC7OVH@t~1!aJt7Va+3KvF%Aj^lDYt8*4=1<4QFm0@pV0UDdaka7p2hh>Q5%vLZ8{ z@pr`q1E=Lj9??+IFiZXJQhA=mPXG1 zt~wO47aS@|KEK})ym;`gAIf`k>9v7I@1BVan}-P|byK|+tPf!Si%}J!DQWzo;T~o| z#&X}x%m+z=Y-~Wt65~Mtz*ajH=?*-`(8vjKO#ngR<)HUYxowp`71bv9nhHF9>EE=pb^>bg4bZw5{Fmx6aj92R#W3zW=&+oIw$Xt@MFRz9 z+;1~8i|S@FyVhS_2&&!Ep7^N7CI^lAgPLOlyI~fE2bI+VkaII2rD^TRs=!Q}8X4TF zMs#a_`!+FD=BMN8Xc2KI&y8l+)xO#b1V}ZFgVDeF_Ex~1(Po8hGC|r$xr0lXlk64W zg69BZPC;jeMg#nNo#hbo>ELXa;F#q6OBG4%^{g?zqE9H=vP{zwRC;pIEkTs&>aS%% zASZW3(`GHan84jBG}1{O&MD9dgtF_pb5wJeU39bxJHi{VGAyQ8PCqThd@%#~8m)z0 z>QjcSz%LfZPU&g_Z?n0__x3bSD?BRk-3v!pCMeIE*noC>?^27>U6~K>LYF2Ox?aiChur1jX*N zxM2_uZ1voJMm7#yLlsVZK8HTrRN`KN`cVYdyBFi!V8r>LlF@&3B@(XwZm~yX_L7a> zRHa`lxj?FR4=TbGeOlg%|J5>B=Ich~w=)-8Ko=4GVo4TfM{_FY$R1_ zil6`-mkLOb9e`Za#z{-iDT-#O{9eBnK9^I_@@nc834c}>#@q%P_D~W1JIUO@_OBw- zIzne4otCdH#(5E@Q|2Eq@kd@?33}I@FHi;a%!xsGEZiC z4atPoSVH-%w+3xt8YKVVOh~MWO>*UNyZ(X?zfdv+o(BOjqjgQa0Fnk}%m7O0A!X=jW3de5HKLNl@@w`MB zHdK&A{t*!eN+(clz@?;43KTe$h8G{R*&S{bqYplo5@8mytzT#gtW{vUX*|RLrr0h2 z#=+yDDl(EfwkYj0==$eaozX%1wjASa-~b)d9f}nO#;f}gOAiASYj30SZw79IkzfAN zPgnhvB|~(`^vrkixv>pVkydZMQ~C09LA)+qlhh=Ipj(3@sDk4=vY?abL_?piXx5Lc zXNP(>PF!{m){&{FPPSCU6MzHV4)-YoSQA58&-yIT(^s~ zG(+X}`Vo|`CJ#q}7D$t3h#nzoN%3*R;-s~*YC1SNLp}ga8f5d^uTBrd%a5%5kdQN$ zC+0KTKH%TOY&V2dbhTY99n`c4Uvt5E7I=dIyU+tp2Y;F_HL40^FgbN6xt7h@=l{Oa zJ|ZG^Fv1Ic=DfiBT6oQ%HI0$8-SGZv1)?}>T;%|AqP^0n!waR$>z-}R)~$41Gy9xE zJEqk#C&{m9j<)sDJBsMW706ko^-3>AB_>beW{dNO$Jiy=RNq2mAk;9ftt1v{f&Q!T z+*+lvV}pgAU4rsmV5*=o$H=pwU#gMFHEZA7Xt5WTV0O|vAGX_q@Y>5hYs?*AsYuM< zMhiUzeo~@S+TJ+0q=C?^M1f0HL<9w~@8gX2N&U^f;fMproxmXh-E`1GS13A~B!}$- zr;uAqWCB0~HH)R{0n)yTH2)`Pyr;KC=$_&W>4VCk zN5bfszW!2Cm0#R(*5Vh9HCd<$YJDl6peBUyEIud=5L{c{1COGRpR0b~^}*<2&=t^A zoxH@PFPzheno^GcG#Vlq54v#J&RKBJ#lFEosZ>+P`JEWhmY1c<8bA?A$u!m0)n^uP zv}K~w$V_MexpKPi#;Ruhh2}T$%I_YwKJt&d z#k;~+SsFRKK@+9ap(t#>qZ@ZK)WtlmCuu#fBAr4ZnPI+)hgW;?7 zX|Zo6U^f?*TQ+h_6`Xl+d)9iK4$M$HW7k~ z0KY4;aI3d>rOXVP;0SP~ofYE??cyOdHs&rn=yq;8y8xAQt?V0sP;3`Wm`~xs!UER! z+j;lZ&&K6M1AIN5CdWJ6+>sE#dK@S&Zd0$Xm)i}IGVE6Ap;CEsqV4Pm#R{o2m1XP? z&P|UIPH*|4K@rNdCBGYq(lSqZ`!i5qrRZnr7MaBjoYOd_F)c83nbTvHQL1;4E+Xh9 z?9>1`p+d8fQV~P#JKEVu63j^I%38y?T*Ijs@rdTjXoUAumNRZ&BR&?i5~y_h$zkub zaHZ$&k@)yDi@F^?(BU2gu8GLqHFrt;BBOL~MPS{Sjr9KBV1G2C47B8Q;4NxOYG=cX zUK7Y2#sL@hE3N*xh(oU}6sjbJy>{K*DUxu|`PUtg6~u);oOt|63-YJaV2tdx>op{-Q&-swW05j7R(sF*_*QVZet*4Mtn=)5=3VR0N0ER=c`#s$ z7sr-3X?#sI?v8ClcOi_84zc`n`E%emQ0_2wU~7eyfeAt%il|N5$}5Zq;y2OIsr+O+ z=V=UaAFG8-qFL?HT4{3tVS%4IqQ(#H3t`=q6bC-icWzla*| zQ8t?0J`}@WDw?g?&VtHXo_X8qYq#$RF)(@Gccu_V^C5^S#GL$>b+EyjWtAmHQrs!R< zJcyd<2dDXz;aGdL8D9gmS=(Bq2&u(dm^qTaeX=BRz|W8@1sDLHpg7Dd?(&s_g6iu< z7iJSJz@fQ($+r2xs=kDG1M+~F_ABX0$Hw4S0_E>#yH%$=XkumdjQ?nTXylamST5pO z%ifXr%_OSvMlRQ>u^OW@w=Wtec;i(KbDoHmpt>*io&Cj<3 ziZQLX>en4KyhBsM0|YI|mGRr%R)&!a^JyYvQE*9xq|pUnfu zKVwjzK;?WSImqlCKdHmA_l!>*Wy}T?o?kEsq?E$yc&r;Gq@J`Fv00x z=u|f-wNngi8kKuJK1Qy&Ug6(dp1C!*uAp|F;YNIgl*zpgahfcstT1rgHaD^{fL8ki z0I6(^Za!^BhU^!%*;p9%&kxc4vG9|`pP}=ax>32(&v$|(Ljhhb#q;X@r?s^%OcoqZ z{YBYPn{VoY4#`sI;-SMU`TcE^7X^3#-86*&J>MYlNwg@DspIatSj`QpZi;EfRse#1 z{>W-z-vn*0$rJ!4V*JH2UENnlh&h>RietUIVm*$xVsFedrbIxAgd+hq>)~jroK@3+ zdhb?(>mfMe4x}`oqlx@7+{t%RWo+CL^LimD5z(zWHc}Vu+LcC86^hX^s9(#@l??!= zP#f(*%i`_iW9SBdNAs0vzp7@wgp}PT=$B&b%HzQP*w4N4TO0@S&~(ZYZ4J>(nH%2x zMxz9&AD*8Vjr)FMpUFNz6YTwnOabY4Y+BYH`rm|aFP%GpWhuh*`@X(11VPd5%SOE= z;9kK=t2gHXTnNcqEyjH_t2q<2BMl>hFvFSH$u;`n6@Np>3?~K^8u}PDm245<1 zkT=>#x6@%C*EG~35;FfkrrtY{%J+>Q*VMbBMJg+03vrAxD~V%o*$PMYc5J2aMk&YM zGDG%?3jQv+(Qty6a4encr4t zLMz9gf4eiLu-A)d5}l;j1;XUh;YpyGwPK{K+4({@Q{rcU`<;2-=&wy;BUS%1$t=TM zmwFht-EmGFegZ6E7;gP3YHK#!ykOASI9zw$$SDIdqVya1rDj~cE;K(<4*!nb-nN*A zX0IOuqs9ZE1Kx&|Z|O;nt2dW_EK}99NnG@FnFErYYgN?j(nIs?V1TY_cBbh=^=tIz zz|6%F++`#T4Sy`12^iJlpFXZ1jp=5(%-HGRj<6$Q26I?pU{djnhm7k}R$^O{0F34{ z3zu~$it*IsP=v?LW+Bs;qP8Dw{auyxs&`~NsTN&Li(Fs4E*Z^xwrYF(2KuiO#h)Ik zE#G5LZytdLuvb6AGO-m}h{Q3SCk2>I;0`_2$UnW3vfalpuqdV_T5u_Z&#FkGKZDH| znJ`lV{+ChiuhfWjo=)DCg)V)&o#|`HRJkxZy}w+4^IA)Ax=BR9z@sTu(5&%4%c$Xw z@hXm;(RCJykmFc?-$2`W%&uw20!Fg};4Iqr{*UC+n?t%>yD5n6h56RBNbc6wGO`iA zw}^8r&=7eFnE4Kl4U#xXNKIXnXtDDcsT(QWw1~wnFUp z%Dqk)A=eqj)5c*9B&3F^criXNP#x>835XrT{vi$X z`%e8k&={ECTtnzrZ;lt8ecms-oH|{dtedZF-1eiw8<#18XYu5-5dSSVU3t17obO5g zAlNlXjX}uzEv;AS^f1roZkKO{L9trQL4&hob)%BF5VeYNmGzDv%piHDcKw4u1bMw; zt5z*b45TiZDbhxrz0^3u#ceAsc^yC4JmU6v{gm3()Lg9?k}u40?$a}NIgD(4p9yjw z^iS@QpfTzkjw#^ku57eM)N|ldWvM7|nFzma>A6XSD|sg7POM@=c=*GYtWHSNt>9Dg z83#=p72wnw@_4|{Cxnmk)MVHmltTb#NnIcGL^KJcO8}89B<%{oe5JsxTgxb5S^xQZ zDwAuL77&<>{zAe_Ba<52gE=%jWGwh7m*#&r(Z@3ta;1KMkwk{&5c)+qGT%lJk3f-JwLnkbuR7|~!UvrN{|e|)Kgz!6OEV;iWPUxzbz&yG9OM|= zGi5erLfy;c9?(UhV_p%oAE){9WFulQJ+mAjEW^*h!0`K7rrdpI$A}L*x(UQ>Z*W0% zkd}0ew7S&y3;I3GB?alo(v=$+7oX7u-f1a})UKBhyhT%lU=3-}S%VL(Bd8Vk*5NEO zkDAZu7mwROReL8_J1EoqW=;B5v?G0!OV|3#?u_f-(qP`PI+IQoyUxC^Tc#-H-j9f{ z!N5WPRJFf)S4*dy!Bt+YH*jsX-%!yP4ly!zcZ^uzOhDix#>@(hlD7QqZYUS+RszWFF-AC1Ief$a>({TF{TJ=z z5(J^t>`+Hb-MZ;rkuOYV)VUK=@QUw=_`&obi^qi%>u+xiyUOLRYNIncdGFQ>|Yqx8N%Oj+`UPhBw_6_Pwd&pt2GQ4c0cDl7MX8wqSXJIa2 z&u~&bu2Zka-w=1n*!c)7fpetuzkpiwJ&+^igG)!jeg&=7Z!gF0?0ki)_J1hs?ceOw z@yUyfuR0S=_(zbA)Xcxv6556^^IShs z_qOlWkajLvjRKWgmqR87Y1pZD z!0P@S<}slwbh3En_lj5kldlOKS8Jhn#;-HLq;m?UW|H_jw&+z14VjjuJ!N!a#+mo> zZR_8q8i5c6!gS2sYA-|`WLym#i*^N}^ThD|aqfocSQ5Q zUgCUOl!UNv!nf{@XoKvhX#95lyQ4CBe9l;cnTH2)yLV3I%VSCIjz!SZSS%)A;qN6k zsc;YP8nYSEF@j@9Qrxs((1o?fYznuihT6|c?e_yGE2%0jObo4&Gs6bHN~h4=pt1%%H94nH(Hq7GCk#GBtTU6b!nOxv?pu6C$YBA^$(91hQ{xf{UIkgphwn<7&^9cprr+fGg-mw$$AM* z8@4S03xW{8JzP)NAG8l~5In+v3RkI$6?4?2-#R$I{Lngq(KTvVicG*{wp!PI@gRU! zjcsbYv^~NUBgQ!I_gyRSnM?tqPjhK+=dmW3uYh?B)KlT^>lyT3MlrAI47+wS#7{oX z)=8{=oI7R+3RQaF>e*&r&K%*2+tSXLssAL>*aU)?%RWG-U~IO@HfMe?m-)@v%GAPD zcG!si|Ln&LXu|lE{aVBI0aYau&%SE71rA=?jp4OM+<3k@pj+#&N(;Wsl*enl68-yE zNb>3*-47M!0 zz14|v9y>Zl3mDITR$vZb#2Fkwd4FtQz432<@796HKuWh$TFWxGe40FXs)bFf8*`~j zV)eJl$?7SInUrF}e1W4hR_&WKr&lsvS7zJsnt#@>$5-VVelW+RYI z>kew>Zp*U%FSRoW>Wd<$n{o)BK~pNarHY%)j~jG8X{%L0CUHYQ-`HMyT<6!3qRdhF zuw*VD$HYi7zDds2*{!qbUy6H4-7tZ03EApxT$@)Css(G(9_sX@pBgF}WH?ayJ%IuN zA@lBD9ZLMkQF@Y9&44}o?@y4!G=K%NO|3+_X@*`RZFK4O8$AqfGj7IJ&G0{ zu!ZZXv6v#>HcM;od;jRxRrVFw#LTgSOlsOgKn9}j0F?P)RW+~vcoEQzmOC44c34Ab zF~j4}4%yrng&D!q$yeEYY#r4%jec53|Dq1V45<~pCZTFFbYXryb3^noe!MBc2;pI! z+WrKGwho-98zh9+440O+ESB|cmpsR-7*YsBlYySPbPi8mX&0 z#t`=AD0U|lC2PomOAGu{`0yw^&~&!QKiZsSk+laOs8na1@p3it5_DPBPmgA4_)d11O%2xgGpxw7rG_!QQTk_se z_uE>&9U}XeRu3%2lM6woWcIJY40Ki)u*BE4K$XQHcvOjY8r9_~)lmta`rGRGOu$5Z zHF&3fh>tVJpa#Bz_CH5bzmIXpZ!r^rG%(`mM^Y94#_+mvX|opW@pewK`{LV~OAM(< zHpV&o9{hp;_yr-OlrdjYajkyccz!(6OosD8pICM17@}knv3_Q*XrH;hNT1Mn3V8qS z%eO-XeeAUJb=x7f+!5t9xL~9vLAfPga9tydA+dYZ4W^>0Pmx3_-{bE4&lO$(8~wUF zz+*zv28t>cgn{m3FMgc_afFD7kiz%wBp~hlgBHXNeZ1pb>OD`5(8#|!)kWlWB84@lPflttRxs^Ob@D_4ih?qfCA^{r3*?PJPI zReRo_cIoP6+7^PEBeb3Vz8^8Xr(=7+mtwXOk6wlkxjt4xC zcc};Fp`|BpOS15D6_cuYOg^cfzGDA2-pZt&^rK3U0?rOO>vO-A%BW7t3E2 z|DbEl6mwj`iBi$OcxOhitmS$q8wvFKwqpOPcQVRO?X@x+CxZHPjRqo@dnA4M-y8E}5iF?o!*B)7}tuZ+h+LKbL&_#H?*UDDiSI8)V%l;Xwu&0dL ze~^Xqu@NYe<+m29wEec`qX`Z*jezfl89|g>UDf#Y&&gLRIxAq;tH3r@QuypiS!K_p#(`ewP-V z{GWTS@>?)laVoT(u0&iNETtH57$a#+{SaMqQupkNLx!@dk}IKC>>sS{~R zT+BSj_}!kzx@(~$gD2E-bFS;Oi3R4hRw|VVXt@Oc+Z*3p(0iqg)d~qumHI9wQLZYk zni28aN8HNB^N~qIFXHp8U+7msOyeo3100E)ahYXpt}#)yuDyA*2sOh7v$u^wZU2SQ zBrm^9<~j?!!DkkngcYmKxmvP4?<$45X46HtV}BpS(-49{T5}cxz5~H7!=P=Q^z4xT zFJ$)VTt_OaHSLd>A{^l49}f>G3FxfxkA%8qmojRKM%m0ilGNx5%eY?CqV(QN(r<0P z&u-YH$U%x1y-+_Q%*3eWvv~*Y45Okm1mZ%jl@}?Jh@%qy>nUx(vfVhcQLMlQ6H~iw zq&;Grl<|Siw zJfhbJugmF3+_Z*)jwR~{^(Rg(*g~A+4DeyENh8JRvi&^m-f2JL^?|h=NuR^RXJR0* zycP4RM>C{;Sy-4NVp{z1^w0Y@Z}BKM?{T+&VJ8A{&e%Mgs#9HZ&KBkWDr%pz^+6SU z0X_YzPQ08PiBlPRQ!um@p0yeS{m+@u39jjwMjYPnED``dX7QxS!DzJ!dJ`tXmrDE* ziLbawl|L)be!S6H=P5ahPWJ+we{|aZ71U*Azh)>dhKYK+Sp^k|+Dne`8((HrqZavY z&9={LW#)i z(HjC?V}V<7hF1<=1}a{GrBY}{6o`4TWT^fg(}vN7NABn|wHBNAPMeT?#X#AGCCYv> zpS9p2ospUn4y~LG8=qfa|1C)jm86+vG>&$4c0J~ZvP5svp(k{6W@khZ_Rj%& zGkk8z{n7d%N zw?U0h5y-h-rWCbrR91q{e?0u~c5u=4tlEbIPAQ6%h5W>0b89f=peP+wr1h5;vZ$JC z5epJ6V+e+Ypu(!4GLb{Cx=&(A?hhp-CIT!~RjnpMLk~9+5o|!zxy!V0-Cix6- zkn7>p#?51Fv$8-=Hlu@{dA&_`isy7JYtzGR{ah^=Z~1um*DLTv4+YK}sTuARhVeZ~ ze1<_mtM)zz5Wz&M=lfw&$d#mzuIHVU7OT194mw2{tzsMI;H*e&RC3Jg8jJWZunUZa z4!6gDIU7^EZjpfm1f!c!)TaDEw9|d>td0TK`yy(;8^J#wU`LYhw37wm02H25{}x^J zJYNYgY@Sf7{S7{H2!Va5A?1qEceLkH2OYWpsgxxM5BghKBg;=;X4}m;yn7mrqw}(H zsbnygKv_+OO!|=8R>=)w$rW1mbrfpg98g;ec_ zJ6lM0I=z_1WQeU~EzS1dPVf4d&z>lhs!xSgcx__ zGfF0z?0nWgQJW+NXFku8?4C`comYx}tC1oH3Cb=ql}Q028)xTcez+|(;-qs_ZseBs$tl>P~u3S8`cc>414_ej?0 zy_8Cdi*|QPIi_Lq4jzsqBcC(2Y>lpfkRz@=OzK@$!frM6dY+bL=p+M?NnqHff=97> z9t4s&Vcg=*S@=5`+7&?8pCfg#@uIvpf#I{0Arsm$M{rFwq#)QhIu=XVFgRd(L)fF8 zJ0DCh;zgj#vk;HOjZWIdslsVFU~{>-r^NdTwSMu_fJp``uGim@qP;6`=DJ?qV7{kf zIZeI_-{L<#SqCE2$c+$39mm9?EY_G2JzIks^L8cGJe{h28P~6eX?`TXQAFBWPtvo>iyuT z6IrRc&zWD?2IHVrqp}uc0Maf{EumjblkqN`zQVX8_Mx!%8 zdcXmf2B!0NVl!mEeQ5)r`{B_YDEvIKe#yth zb0ETZvF(OKtL%_*#oT8ofW#bqXLYEIzCU?Mx9OLQ=mf_hA3uGaIQ3T#nJ*;vSoc4# z*$M2Vtkkloaqtu^xD6>VaDe$j?BSswxZq?_3PXXM)xa-bqw1=N{oMgpvujhqm_?c> zrDH|J2p@i^u!-H(>Usv;z1!na_xN2;yP3X@s#+BEb8y_MQc_NKb9QakfQbyxrHP+M zDePUd@X|1?;qfhqN_WwI`Un}w#P`wIaH)@3w~}h6!fhHS_o7bA=c{lp-tKM#u$7Dq ztsE%+rpatB(i^2tx7N)SddpV1K96_6ZtWBq;mrhVvKB@VGq?p4jBQ#U?S9ZY|A zUNKTv^3)U)(yr;1xgM>sW-_83LalcLyI%pBhUBBs14CRAgekZ{6^Vu)rjrdC0##P2 z1V}C7RBq|9jXFOxv6;?ugsjA!lblO;_6eeIJT<*xfyRQH$F(LBzro(SM~xRac9^_y zoCZkfVzW`~eNor0IZf|9Icx_sQcWDzp90@k*7ft__}LQJ_VjI0(ysmgZ-L{;?FO{y$SLQ;6u{X%oIK0VuB*G&XN<0&R0gj*OwKW)7;`t?_qPV>K?9fg$+;_7W zN6gnSo~N_`hB zmVbV|ta`qoQ?8aK7-eN|;wrnM6_lyX5sUquz`EIckc=Uk(dFvM7$;B;>)Al2efBuY zw@Tx(*VhE$VZD$++140{15aghbtvod&yQ`nJ*lu7boAuscJBge@ZKFR%Hrosn=1%A zyOZUVdhT!NB2qk#8*DyKX|DPtI`zwd+jAvl;+gad?ESltu_O0+G*9#t9E3WpGF>@3n(m?V z4!3Qy72BeK0SvYW8hvS0S6+1zHCD%PB63x(E&lCoZPKp{ zCm{9#^<6k8dh65UoM`O)BXrlG#%k&TPgd;L!vpoaQp)>SikSpYKxOUin~Y#1>UtJA zuvPc$Z~K7X8rGc~(`6L+prKzaRg<2vhZ2KV_|doi=gpxRPeh((y4vX4AR`3)U)?ZC z=LhgTwOp`k0G>)#bmSt+GR%@fQELg1d;=Z?fKXT3*^>9gF48 z@Q`f5ZaXskN6pbUiSFS~WZZM9@Ct5DRAvgHo=r=sz3F{@>jjtu8`qAn37Zvhc9Kvt zfF6yaR*v=)?z|4X!~JO>v$%dGR_NFGL!un6NZP#(9tpYF#Q!2K$h?mkty-^#mC%&+ zN9}EC$-U=Vf%MxSpJ?C?kqA-GHw{5FA&wtkEkcX2LF^kfC{U3gF5ob(@*LG$o6FkH zOC_gF(a_+GTn9;Am5I6{Mcs*=x;ZRg=tUfR!6 z?<4|jyB~O$;Eu1SKUW54o~r1J*yjNPd#65aR;!fieP(9VRk zc7pm@+^jJKMX|@hcoQwKM~$NQ?JgbsFYObBI;Z1oVIlZP8Bi~P;-Twbxb3` z7V-G`de(w4a6nekiu}S31jiU%~{RJ3@Cw+`?WbVVK#d zQ+O+ud+gxGDKT@*R03XJAGBlB3Z~fb9vIA?3ZQQ$FT<-lk)$wja5r5%CSZram!h3n zkp-Sm_q|EIodKdzc_4^?5t-GrPZ^Fq7@`a|GR#-56|6~5JXyTxC|N^s$LZC}g%1z9 zRMW-9tQH?cYNzvr&VF3d=$Le{SAqy(dZ_DI4J+5fi-&0M%U)C;X`(vUwAeuD``LHQ zv7wnHr+#NV_(NLSho?_%OaJ}%)Q^B`LjUmE%*MoLdMCDR@9oK}$MB(1sI9i7t@)bT z7hNi&9Cj#Iha#lL8tc+|=j$0InoF}s5Z5EG&csp>1ga?iu zo4mMEs|#|Jy|AS}-*jwADW0s45hCKV4hQIYsEQ2lTaeG@G^S1%6{9fEKqFO2!!-+g zx7zK-GT%Gpd0hpkPJH@A7fywr#><|G$#}r1<&4Cwf!*4(>sn-0il;3CWnuJJK1B+~ z?~%2)GxV*Uf7dKESnoyY_rSeJ#=-H)lfK_6*eyczZV5)tdb=46f3zmYCF|kc$w`?U-dLrczKyP_8Ywfb z*GjSuY|c)B@i;6V#An}e!A2xsVlecuJ>i~}nF|}CCe)o+Hdu!u$VkKo=Is%}&7h6& zF*A;Ii+k3Z9PVtBs$0(^_04Lxar9VWHhMfU@LtE_whtNAx^efO8uyF!*K8#Z=-(+P z5%F-+dN*re94q`rFO3|uRo;h-CoBt&?O@y5QR~0b)-X@#_IMcU7T!v zRL=xSf*m!lPo_p*W*kRT%ouo&?4Xx-lmkwz{3- z(CqYA4!z^SO!1UNi+Sa(pR=~KHuavra&9nEel@aZ1 zcL=mqp20ma8$6jGIAzhdt`GT=aD+xBvV2x3H;q^2ueG!(uSdpT4t^HqK=kF{bWjn$kjIdoOq={j^p($adP8*>Y{l^$Y&d^vfKkL!9xm-DE@NfWq}9&Z_Y3Y}fNC zKaB4^(i$ocqLsVQ!#e1vaqGrW#xgtaagN+Rb|wmU&ZEQ)`+--O$OTSvc!++z1n1{b z+6uN|v(i6xpXk~ann#g4Gk${VHtXmQQ*sMtd|2TN@x=D6N;7fsoxway@$`3b1yeSe zEKmnO#R-;$Wi30C!%LaW6u!A8>g-28nz;Yo|6zh)BmOW&p4g=rV zfuEr;1(nomop9)@6vl1YOqa#nBd)qBSx%Gom+f_e*V-H z7d@-;ial3OxP5m5KHy#_KGWUS6LVOz}MJ zN)Wc${sIRq@9g?Xa*VTr=xaM^!%Oc*>233fF^{awWz-s@to=-mKF#a7VfD;>-#F}+ zNM`hxy8aWPX1Qt)>FG{N=F6POXEop(2vN?mlDqm0l=1No9%TB|S>EsBZqbo{Bzr=iZT2l^*W4{?p0@PhFj)gy*`{EZ z>Sq-=ntNEyw`Wr(ecxQD26*oAGR%J5CCBKSUbK{XH-!%Zz#?s3Obq7Duju2Q7Y;k_TH8hrVd&}HI81jN zp&gZ`AS9o_8#vfCU@eCpu9RXjP)<~MW%n$pW6Ks-UaI!J*m|+#@Lm0?5%Kg&SE&|! z+W83-0m(Vp^OjOw{*lm^8rx+-u{~bqo?Ytf?1`vmc;3GfYS!u@x?uR3R7as;zu@UI zewZAt@O5#~NXwP=J3tA%!M(W~2Q}W7;y*_J>=)d{! zA?*Kc#^c|ipTADyrCA5*YQ?#KIZ#oJFN2RB5tR_omh_=w!9ZeL`mb3snWXj)_}IR} zntFLX!IgLAPNJ!TC&2a!epZhE)3O-(LeXp703#s;2d5{6H7WNHZ1JwE^YJ2gZ?R-A z6@y`lSVfMn?}vhmkXvvpB3h|NF5mk=#AlqZ+1%iJ$4jr{NVq_uc6pw8LejD}yX|Jh zFF20&MkoG6V38bj3CyNO^wz+dUfD959RBS@{TUW1>!ETyB|*_zOZ$uo{gnp@1(LqZ z{Jo!D@+0fyCHUw*=>_Z$1qeu^JOZrq7%(B|lgE@`mY z5@k!CBWYaT>{h}IIjv2P;Ro@VeY^%DMS2=x*yiwKd~%@Vt~8ZGpSgSnjPJ>8)X-GV zep9Q)K(Qd=+9{rTRV>{decjB%0(ztEm|^}E3b-Sf@6HYjEGAO6zN2eB1jA zM0@5H>Rd|AoJy@V7)6cQ;-h$T$)ZMf)}OW>u@mR4y04H=Qrscv@887!eknIR zQZh~Glip$PzYPq9f}hS8=I)(P01r48y)FU?5#vgAywd*sKv1P?`jbpZ&RCGqdJEgp z+Lav~+k}mZSz@lQ-!+{#N<%@kwvupT58b?>ekp zmg}NTX*pJQ!(jhrqmSNrA(#aP`u<%la9*=^eDco>La|mu5}H4S$e{|wWrFeE!L>Zd zu?KFs_0YhNiY;$k@-LDGi%C0XXY9+53WkY1sps-RT+ISmSYaF6<)O7BT(#}^EWw4aLEC*w z0?%Buo>njHKN20jSvk~O-YK;KFOcQJtl3CI4xOuVLR8BsvMSto$-FSLDIi?#rK|NB zi?3Po8W0CtPosg;!yZ`tK>#wzhg~)V1MY?!NioDt-vN9^U0@zl9jI*HnGAIBq|*w` z%A8f5D)-P8aiTv13YL-3M#p#+3;i6{lZ=3(#_LDYyPtw_oq8CqImllTH zkC*oL$l1}vmeW38#4|^mO0>6^qb=(Wzk9Egz2A>pT3>n>W#y99H#{)(R&`%7LHyAcN2#$0#rq#*ap~QvFTE%Ab!5 ze2;Bxe}RB&(H7aJ*+pJht*)0xu3zqdisgJ+D)tYBntoG3ZPkLjCcdZS>NyVfh8wJN zNpO*D545!2T}HA>izi?CBG=D@5ppKX@`4qL5@c}5w9&E$uvz)uxYmPp2w7$-Ib7p& zUb?8bQhkUbO6Om~sl5J|&#&tV77iIjw4DCid$77uIHxPY2~|GZ@B4B!4g6>W!dL8b zpQh`1XtHM`i?ns%D)u zm7Z7duw*}KYAP3C1$EfJ;-(w5VvynnV&w(3;gz$95F9_mA?e831toAG)`>jIr0W87 zlFbFVjR!xU&YrUU$D`U;iAwXl6Vv&&Pt62iBT;;V9n8~_s!t=7ICWQO-0FfC7YRzE z`>)bqjgHUroU|Dk_1o76_tz4wBAUcvMZn6j5q-W5a6f!mB5%E@^f}O!;?6PQ;@*8T zA*IXob?l#ICFVhUxrYZTV|kJsB~%Hmr=`VGqf$yf70Ji!mg_19)^6q-8ZC5&v4raQuh8s}SJM^bnJ{ zhV85uC(?^qD>{A-9|sR2th?Q4!fiE_5|i1?l+-_3S3Y)NFNPmN1M*7U7e}klUMW0t zS9J}nMOd9CynXWc-Va8cD-{)ezGv$r^p#Bzmn$s9GsU>ZVC7`v%bQu)6~CN}Vzgem zSwY+cZ`G3#lY|b57hQVTbCr1Ora-mwaC1lqcjn_Sx{X@8Ph_c-6^I5Q!uJ zH#wDWBK-4?rr7O{ddcgt^d8?2J|qd;3io@1D#t%x|1FFxug5BG51!;=h$iw?H{y?) zg~|eH^CnYwHc9eQK;1Y=-D*&_WyEhlY3Qd_gue4A8^oW!lB=HNlGlA=lIp3?$6duX z*bWjNXGkuwJi6_v0)pp_I0pT|IvxGFwS9E>L>+UmC-$y~0xg2#OUwJ;+GtNmGnmSS z=D(Nl9*X>Q&8qKF#L%>7ECt0Jsa#Symz{i)SzTf1XKu*lT7^=6*jX2*Xd`8!m?1zt2 znlM&YOXCsQ#0|bf6s&i9t}07ky$s(F>y67T;T34!``%YT3>m%)&tQd3_;8uQ@Rn$@ z{qN*V4oEUS;%-%1y1U-cn_>*$5Dd%rl95G(Sl;m&REeZM%8njojP5J>IOlgY-a2Yi z>{?e;JhD!#vky%Z#CQZ`dk+j#iPgrKMpJw?(`eKmTFR*qv!fO(;hzL zw{A(CR4G7MEabDcCMR?teB25Lyy_kIFkh1ID88}rWzKztDi7T#xfXDJCi3xxUr>5C1BX7rcx5l{EF%n&#x%7EVJ{UVjEohCe!I zanQ&JE4jcJkes*K+6FE|D>*#e$}&Ds3S5SwD7q|_sby|q$nj?n^~G&bJNSq zr^^cL9h|+&XH_d%3DXye3tFgSWC-O?6(0Q#g+h5Vh3?*;6kt)CJBIQN1=lx%Dku}Rytde(0p>5F^ zWt&7<1aS=;NKc=`W5!y{|LiTn@uyHj!$B8lY&_+4k8@9@%LiFEBZi!CYlnIinK8iV z)Z3ciA`O_NNaMBuh$LYakexHhs)EY#>N|8Q26&~l6wP`At|JuIs){-ZzE4V?Ktzxi>#|&dyUc`2!`jau_voFVvoN2R)=$Rvxpd>)!q(U(#j5)fz z4~#8pR$~cW;l@&7W77Td`Fr-@FBDJBXNUTujI?$f9#R!_F{u{p{){_OwoF|{FGmmu zW0Qbtd64F$q-yvz606l2wl^iHqy&%g!_2;6`HvpiI#&C|FF<#`$*Q z8x{NODpvmLhGh;0_x5vNqqwu1=#-Xgc6YH3`--stKtb3uR;%Z=VEnT&FT_iFfUT7R zczWja-Fo$ChiUz5(%;N6^(o?FHkvegz5AC*rO;M*I#&gS!G0uwGr^}KF^tvd}LdwsN9%o z0*rXLrs3cqW~lmjSsy>~;ZJaplLTA|_%u%xyYxKq-U)}TrDdFb#OAGXG5(XHmFTsU z3%M2fVmnY)&L0r=+L`n_H;JS^vcN z$K>-1QmFh*>HL+Km$9}`n>=0lI(fVhKxTq?trDp*Y8YR`S6ulklMo)>GcX0$8GrmG zA^6lTQPYTAA>Q?!n<$nkqOUm954q^;gWz6^e9N!3u#|KEL)<4VP1-P&qmQzG7zLp7 zH=~Q@w_T2>#k_oJ>zkALh)m6Iw3DbWmjCmf4cKo{#9lO6R6p`b zRPq#Qyy=?NW_OlW2AQIA4V`_v<6m{?71I8H4^eEi!oyKYi);Dh-9q0K-0!6RF^u5uvRJ7<{`CH%qEE9P6(IbW*2x>v|%vNZtFF9m(pWRA`Irfg69A(X!-={F;_} zP5ialiE#LZ+_c66pHNUJ5RtgqEBw^1UBO#I*eQ0X@^eY@r=QO7puOu(mM=Jy0ok1n zG}X=9qbzbdF&LCUHHcj!mh8^0`>O8lo1_D4Q&YZF_ZXCW zCHaNQ6xk{~s-gzp(WrczJYF}?7_fQ*@thd&Nv5KKrmDhW)XPiqrJbGGujTb&zbqEw zU9(*^J*C^D;cp7|}GQoN0H{r|!E~}-oYgq;a=?l@c_df7O#uKR@ z!Dqe(Nwf=qeb?OqG4AMXjdXm(*-!rf`289_Q^#oZkT{))2OUMllfhC?A}+=JBK4|0 zx)eb{`DKe@X}qgEte!+~-s;gRe6 z5iCjsUd(J@M8my;k&UE>jeO%%H!Z92I}ic$1&6JHlstLd52AQ!{;Fl&5IgyJ+Qo`0 zQN|m&EJs&Hbm6io+?e9{4KlT==GINOm`B1Y{dL)rDHy@_nL`wB5Woz>s4=+pW#O7; z^I`IJ?22(EJ#;Y!r1*MGM~+kCO}J+1^7d(q=w(jux10arTcN(|DY^VH>7w>_-yqA2 zSEE#S>_Say7Ma6OKN7GxoNNbWvkdNdt+<5SqGf_$hR~4#PF|uXCbQjl5Oay*X|qkL zL&EO*yK6@VxKLTMswxvZP9LDhBi)QgN<@7DpQaC|som>`{)fb4=+nO%<65Z@g$~YuWV7AQeq}>LL?girXW#dJl0IwZmBR97W2s$-fATM0>Dh}`9U0du zh$~W8DInm$sb4BnRhISa-mom|sw(T=zh+bk?N zi95n(zeAG&mmg&ftYNNAu(F^D%y6#uwqLQoJNYvFfwuql5F)P=5^6^H+qusaU|eE5 zSnK7lMknQ{jSLs#dG3SF*elq;Sw#cd-r4+Nu2SUl4 zLdua-aFPc^w);z?gtqh|t_+{A>|c%(7quT*KX;H}>#LDvgcqRWHBEyO*WK8+{6)^l zxUNc`tHF1OA7#2RZB)$T)b>r+^xDb5@tt1`>9_G7pGcxY24eg6=6YGr<0KdQZ3MZ`en6i0y)ccYZvi-P7{ z{HX7xNI)34UN{o4!8uwPLOVA#qlP;DMTwHvG@AcB-&ESC`DPJzUFw>!S+R?N@q|gxwgIKWi3#5wRK-=!%*h4TNee zRx1Nig3cFXX828%h4pV`G%Ndi>iYdv2>Oq%m_XROw(HPnKg0 zHn=KYRajUhQtV>frcWhT?~Kt=iaWkx8eI#P1AJ9m9ejdri?IWm&Ct$@Ei;3S{rDLQ ztJUqLGr16l3|I+#vGY4o*b{ld@!GrJ`Z>7;A>_g3zn(;mTfRxsyKf*qR*VvVzaAg& z+)^B89%W1c5Q97;?=3+zPf9*Qp>_@f8FgGKVVJoP({WES;@)c$B%*e{Y;rGkTz@PiHn@w-uN}@(d zmr(wDghT+eXmRHWdDnV>0R(+Vka+8B)bMnPOyA~q_GL;o?DCa>_OF;7{`Dnf2enU| zT(EU4o5XV8M-wH<*ZszsPnW z46iUl^JItk39ayZ4ZymmuV*RavYBs+*e=F7By5!bqBdsR6-c!E`xJrE@9>)aPEZ3& znZ^8hft9-*c((9$dPGh|760Ov{oRer3=1jjxpV!O?MOACcJh(>y?%vFe-&E-C9Vf?+8wA3M_6f$fHs*8uu)VSe|H~7}v&N?Kj}EQHpmK z@L}vn_1=Ep5k@nw*>kNqrKA!onG;(^#D9?j=Asm`^87%WJgXb{haagkyA3*`%b#HV zeNT)hLLd0TK;fmyn3i?_&r1DX04O{)Pbh63C^Nml9rI}(+BuX28CX4Q#>W1m|J;QD z?j!kPnTZ@z%7iIaop#=J5W)L?7C+u=<0_Q0M7qf|xWEAO+Lak^Z%B>}uskNDwtB7yg|6lK2aDy}=La$l_4^V(k3D;RAK6hL8a z7+k*Rk;PhxKLYD=V#kUdwaf-s5`YyA%fg2$?S%jGwv3LGG^BKHp6Y1DQ1UJF-L<<} zrhlofbPn36`9P&!UeR5T2Q@1Q=b*tv=1a zKLHO~ID1Pp?;@CA6{~ME^1f+)fjbW#JTSILND5#`X(^7+O2Q9d@f}GNp#^?>ujl(& z=Apqs|5)q^>oC2fHT!`IK%NJ()n@!c;*B_R2|mnCDtt6G{(B#fxailurZW?ax5`m) ze~zVu^=8!P$TAi*`%)S`$^!4c5j1X-d~*C>*SFu-WVmWa;Q@t%H5HRHm6hH)p22DC zy@1m~lFLd3sm1N1JJp#dC1QJxMJyCri`KS}Sum_Vu5GhtMrU0y=Cb;T2h1cb{IkX_ zfkY$c;Dhii`S`bf@R#F7t^TaDN69g(j2V6rP;<5&G-)pOWS_O3h%ZVc9HCHU;f(IU z?ia-;b8s0oobi1TRbzqFsX zrh5alfhB4d27aragV&FN8_%Jb=s&1p=Ptw6qJ(;OqtC8m$l-!w;*fB)EIi<=dt7P_ z@_3?`u0|la9&PiuI~T)LlAw0iYoIH%0?9+Db!QFdT0Qbn7~@rcu=G^;+>DGBy8}#N zBYfP35&Xce)`?AHa`qNW5sCy(<#=MF zIw^t2bH-aPP0E%&MXTG?Qtsh)=>1DqhES0mTYfB|pT<}TU-6cdVlpSjfY!7GWDJuZ zjFIL5tc$bmemk(tpqKa6|K>sKcJ07$&>xp8s865aUx@jHh1k?Al|bC|AH*NtFeBBB zzR!%pHW#k6>Go9h=F<^@-c^6LSy?e_nFXyps{FI~;Ym;glhmc6-ekBC&?e4l)uuI4 z{0PME@J$DMATppUF1A!nLNeQ{T$k$lK3KF)3DbpjsLoI~UQi7haY zfjH>#;wqrZiclH_1A!zdRiUZ1lFCTDHqpItt<6;#jQceNn8;ZERJctliq&OW>H}AD zxbd}FKJrEI4BT4?=9lA*6n(7dA#sYx?$MOJ(99zQ@oy|geXqyP@4vuO&Z*Mqshk|W zj5q&M+4zom`)~R#}uJ4JxSZ+Q0i57NWpIq!EYBxlB z4)4|>TxP&Z+*m>!wgz+3?X_^K17kpcTCNC!<|t*5X^sarO6J5LW1yii!RK+H+yduP z3DDjV=6SJ{JwD#!=fpsLl0|}~)Db zmz?Z-#*?xy!_fXm!@aj#O)M|Q6s)%no-HV9DY#2_0HCl^HTGYj4S26s?C_2~#o+cM zI>ZhI@}FgeyhA&^H{?D23`|A8+}+N>@@?ABEXQ{=)FR#2*vJBu%D5Dp?CBuW)(p-) zB6MMoRU7VCj6T}njGW!^hBjW;*#+y~FD}pFYq=jOLOokuiPQ?7r%i02%eQs~-2t4b z=ZUEJWp-2(cz6>`UW8@c6&@3Hmu%&EgX^NGtvoeZ~j8M_Bsn9oy zIvF7&d(V(@5J|GKSB{lz$KK<)?$h(Up5Gt8*Z1}P{oLnse?Hge8t?1_9v$V%Dqhq(LEV>VR;g1EP1R}pZ@1$g$0-GGpx$1hgS~g4V2uYLex@1J4N=H z15bk6K(aLH{Kp?5_rN}V;5u-7W?`?hhD;-xtra{E%+e-`|Q5&s0e_rq~EI-d$WP`z-`mP2TSS-`r9x0rK-xp|J4RUxol7pe} z5~c;D@V`;}H^z96_DiDdfcxL8Zn55OT@F!5?D{5pQRzR}wQ`%MlRe;oj%4%+_Oqm9 zS}d7`t!id`xg5j3Io2G7by#GmJwEZ++d>p^K(K86=TT-Kwd||mZ&(O|@GmSkO`at3 zR%+}1tVr^|sYG*N^?lth{UcM@n&T0+=q<(?-eb0diM)>gIDL+$A`4<$v2TwO@+b_-9LZ! zW?GQZgxyhTsF4Nl);?JBCMSZ8DG0ND<3i^_SZnLPynBP?E+o&Ps@tjmo_vR0+4Q81 zh-n6m5o*j(l5uXqB$wuzo)?t4$LkLPZV)zkH6o!^xoa9$HNAQpQtR;#8DAcaryl32Nckr0 zttHgE!ABfdny@aSusHISFo_&|{_)|T*4w_L?C{TiukLP|C}En7N_0D<;6z0D)=m>? zxYf_7uo458PP5X&?m0C4E@O05OIy=LH>oXoa80qmt`Fiv4~IvBr3q5*ye944@c>_k zzWiw=poIVhL^3c>?1H~@7FNl&-!lRUduGr6Tn@JX8bCGiq6!v99k})*yMI} zRTn#(gri4nR1l$ok`wSvTLg=TLmts7VGhnP1kwu-nV`3W(l`U*!V1&tDG_%2Lw|=z zfZ&1l_1mItUS`!kVNl6v{dv6c``Gh6BDeWHr8Bc)ce)gzU2#;jq7QkT0#5N)X+?R& zr6nYBt66||w*vY^J?=SHg)bl>bYkW3#@d3yy{_h;z1N;_fKGo-QCxbq2)CavUEOo3 zGN-8MK!|ANCodZC?p>gS`gSBzLa0`*B_$=rZ-kJZ2_|EOP-)+r&Q(_8d`q*emgJF>DEZ(AGXu? zN-7(UyF6WoyAEwfcyaFA|0Q<0lVbgcGjKAzV5Viv``}usoCE;6`osRL+z?jR|M=7g zKi+|DH2TH(RvDK+~+VRt^2yqz zO3URB0r4IZ@RF9x@VInvAts`G%@s*UPD7&z;kI)VnY!ZFW;uVTf!kQ3fj-h@9SA5k z_K{f@^GO&wLQcA4{k>HyG#lx8h2IKtmmHDf_yZT_?xQn=^9VhF)#XEfv62%0Fkpff zFy6>+!aYv}X0BN#Vp=P$UNE=zFSXGaV&Jx|EZkU|oiQoY>R3Yp)LESp>!K&yB=G+- zl0O&;Nh~HXYi%s>zBhh!Cf5v!RItQQ-XP?ebO;Zrj~<$JrnnNvN%;WD5UrI3B|+M1 z;5>oA_HiVf{=dV3Z-R*ly|+DxPOkRAhBZFd=dZ%d58&-F#pg233NV3rFwNuXEyG^i z1lQDZ!+{%3c@;EeZxiLZLYSbN1V^hHRsqG!>$VZgjjO<7S8xRb9EXYsvNEmA!AT_{ z4tBx)RP7JFqwLQIY%pS?KN!ExtP!sQ_>;^jyVOuCfv?cESCo|-fTPvVD<+VkzBe?R zOJ4nK^Bqh_8xJS)401RNoOe$}((AZ0igi2)1EyY@vRE+W4NP_=cX9C-;1<}ORH^l5 zXQzlH?hBlI)vWvRBFvEsqW$FPlu11kV(g|y^M=|DB5@`QOZdzU;JK^g_Wum&+-!@J zDxT1#%Kvbr=u05j@*9c#ie{=3)zRM2T~C_!jb{DT1;vN7*JZFAu)x=>!xZGj=O{hZ z&de%6&ZDpf_1(p0$1{Q_^)8|_2L+cEe_hc_{k(t9f8hf0WEVexDd@W=bNAb->*d!L zt_#xbc(8!q`$KcR1=w&;1u2zr3|EWN+)I&_L9x}*?TWRaS+@Y{`iT%h=D7~Y{FgLo zFJwo=!N)%|0W}vKEH8F@lYDkMq+ovQ*((V0e}~{$adnrP7adXg_H}i^47jcf)7J*6 z3ZQdG=EUTB0U#_ijnr^OQgd7{Ar5os(uGSQN-f!5^e|MS#u@?YQj$G+%qE7O4?wkt zzf39n@7}(G($`Mm42wn8Jg0Oi{XH_28+l-!>jUfL34OF{)z5~w__o0Sz;~f_HgNX> zXgi;Om=@;pp9SCGshHmj_k{sI`FjTQY_f$y>}!bUpZKvaZojR~f#g&TC;JKE0BB#j zDI9rqZb(-PBPA4X;dzw8NJD}Cp|nE`p3TpMrD1#ghw3a5k38|$D}+LL)>tt=0O7H~ zB5OjRG8c~cyy5Hf&Ag$f4&^sL+VV-u)m6~=9>%GwZ)IU7BFfyHH@o7j|M?DrU^;DQ zCB^rqOAfGCc4kUSGrO>a5#q56$$%eZBrB8d+aq1zuxx-w%@2t!{UwS`X!A-f7jaAtSFl3|`Jh(z(^cr>($8g=g5>`wqcL?<9f?T|GU*$;kDX#I- z*w#CRaFY@T^P;Hzoh5mW=dp7`RH$?a%(Hi(n6pJkLZNC3m{vgTGO@6mdPbRsiwFmc z*5h40BRq{FZKVF_G~p1c#A)F3>MLA%+@?kC5-^Em@z7fB4!CX*E2>xNz7p80y8Rxw zECIcfE3!u{3q-T<6yF8>A4I`@#)ae=7mrl3yy-R*qSXL%J_}o@OhQe7tcrXuw-*J*x z&aroM8+`_Dg(FLQ$~)?5l~Swe%a<%Rcxf`oM#&5mU0jFOoM}9sSs#Ly=wYtP6z!>N z(v(ry!5_j5lV!TAPj& z*jq=W-5;b+-l58Wn+(28t4MpkO_yGGNex;VszLXzco_pB3rPTd`tj(&b>(^g z)kAk)Q2JQ|=4*-Jf9moXMqNE7M*O7711zPgt?^c&EAWL67vb{=6SI0@*t4l_V=& z*fGJ3zW)a<)1pRRj0#*uAoNlPTlXktA0iN8^H@)t>|0UgH-7T4K+%*Me_m@vx-q}b#rArIw`PS}0 zynp_e_KHK{5=c9$xz-aeT~a0$GcVl+yf<6|^o0~VMoFb_#YquCLA{WTT-1yifD%HD zRR*b%PGUt(J=xPytG9vYGVpcrMCcU+!8w1v-iligxS^Dy?1sD!_zz?bBKJl1hTqpR z%CMC@l-NB945&70;FQs9Cm^{&jaxthl!<;GC!RyoVMC8=YL=hqy4=d!;R@$}xH6O# znD~F${bsI8LQ}Tc@om>UoI#|G$Y?l*!W6P3V-k7PHtMkzjYnqP%i&{+Uiw1VHbFu> zHL&fGdy83Te8d0*B0II!X6TO*@dADx$7;vEE8d;m;EvV)$|!v=wKPN!kcuv#sokr1 z3}C*}f1x-?Uep6B)3tvIM+(OD0{QDFNw(r5Rr%}Es==mGsDHw7)=F{(o_^|YBM58r zDd5j+NkJ&g7rQB;;6X#Xg75K?-Ls6QRssC*ffeONq!l~v8xDxZuq|apU_TQ&t4MaE%Z1F_vab)-_IIR9oui2MM&^Rg)O(g z+g&(J3IdmcAnoW#;HOW;PKU3jp?`X8%+**V@p|~GG~j^y1w@#yKMh~2UwE>C*9nu- z?bw4CWqKZWvO%*q&$M?4l9rz$6_2jIXLYN#eyP4~_{w}8QV=UBWJyOjp&2{ySmuQx z6vgAGlc(^6qY61R*KdP3E?e7ZCzNTG-hc=VIfmEco8{nbmr3E^3J6)PCIl{6KS;-3 zKl74}2b5(QZ+%Y$PfsFoEFVk5@8ob|Zuxl1W)hbXkyl1#aoi78(;jk2tdUEf1mpbl>0PfslN@ixN$RMAs9Z*_k6+igQRyJLxN;X! zC64zwhFt}+^f5*4YG%%s9=S%br=@=q>lFX9c$jK~9-h03@)_G8DE`PZ@j3U5w<$s4z8} zQ9;0yv3O}ewbRn2jKWugdVas!9sOx}t|wtU(qEaYQEIEE|Wpi}RV6hN`2I=-|qjpAXJb z?&zEu3@|fOk8o>1p`L~S7w()pg%N!KllfcF4UiBrnRXyZ7A5iizQ{L$;9J^uTvL$% zeKo2^42bRkQO~n2|Wf`9wzm2e*euF5cC+v@VQY#RrL~{i9z(Fx*3~PXir2K zgAmU<+6(@8AmGNL(U#Z7OP-xd#9|eqn3H~ZNK0);0D-6*1AW>~6_xogrny+$V}fi2 zSHx&}84qYi&a z9UojlF+2MT8w12Ri{3e+EpVUvD{Oabd33!L#0P!JkqtHjw68J8xU&MwJWa*dybAX( z2lLbm4)+z(S$hj{mqIDO8mZ|}VUamMtT8QO&>XFxOvfNOaf_}6{q?+6$NpC-IQ;pT z`HBue885pd4|RoQvo}cT7M=iJb_Zx_8b>U#V(~S=YdXbsqrp=Gd7{M!W8O6$HamP5c+{ZjtPXuHQktQ02lC;#(|@wt(VWdiu3WQA%%P-4`k^ zqI`;6XQyTXRlEIA;1L;$2U?h61|-_7tV%}$tPw_*IwH{?Id&Xx(3~Vme@*8D;%ELx$EvZ#G4s=08dQpwNc>iQIJN<#O8@ps0e{$}$S=tp$y zxRIeI8h#q;Yk(CQ7A>9uCVj+DT27?fHev=(IOhLr@!S9IHOz&j@$dCa|X760{%!GQAaG5H(6? z;IpszXDZ+`YVg_Q;Kfh7oN1y6B=kx>40mce+dbBR((U~iY-N7DQwL!!?Wrq zU`k3*bE!(zB1l-xizxOgkWO3!mmKks?QIpBe`3XGeh55UTV*Ic#O5Qh=@LpxbuZD;f02@Fgj-fhYTJuQlhAX&Xpcp0Jw>-N!gy03 zs!2hj)xQ+<3sN32DN5d+@QhRJzS7BdIDo+EWEu-gQRAkRMano-&HJc=waeP%pppw! z-|qZl&U2@~{R%`4D>Bq3(8mp}DEcIID2(_j%OPMkA+1QyNN_*$=i)YiS8z;_lD(;z z%5oV{5Y3daUfYd4L%9!HDi@=|AMe})E(nZW#+Ln-Emdt_2~Q`>Ht!=4oF_63g3}Ps zpgkKHxZbQfihwC7l#QNfRBB!2c|VU|1fMp)WX8Gg!tCL5{}~zl>4tg^5qtR&Wu11NYljh2R0{R2TsIw9jGa0KnsU zgWVZ%9wv23A+_BF4zWQaCURHK-IVF&3l)`Mi5zo$8wWyj?@IkJDgZ8zyO9A}NIEgt zL)yZScFKR~Z~MMcG|w(-LwJ{Lwg)8&&=w3XMo}2a@`azq-*wLS3_%=QF*l@>jSTBZ z1W!LU&3oEA5KF0jEAhdq6)vb^)3zG8#KIenhfw-pkLhZ(>@`9nMZ-YO7G8y$m~i_D zeLoj2n$*6}3^0Zf$qKXx@rLnw_t?92hh{I)uvES&Cd+dXBiTQW})Mt zAV>q9Rm3C`qCWr~Tl*eY9}9NZVtx#o7x1Y`D3PHUFcADi(N{L@vXtuO)4q>1!}X;_ zJu{JnUqOuaI<*`^@&xma0|a=_xFfz~C0>zcDeWId0lF&lW7PRv4+5DT?-Zp@G9mrv zOk{85CmvHAEDJ%Q!vb$gi#}7M#&uk|96tXzdKcMg z{iI@hPidZ(e>@0r9qU_wy3T0wcds5tn{w_XwF9;Yzz76ByPG1^`F0Y)x&HuSWX&<} z-hD7Yesu7t;)o0_ZvoQU$K|?rF$zMrFL!<6AKH`72OF&QD$&^;TDrQ3!_0ieDu7H+ zDrvan97h?}a3XXUI@a%is(u#WKp^BtzyC$%phvUb2@czkWaEO(E~J7;!L`u)Uo(QN zi>;{3;9#qC@i>tKP#5s4(P8jsNl|9{keMR!-p`Kd`AJeN($8?w(`$MUdAi5@#^2s~ z$tk!65`7Hva($TbpKc6mOjV?rL?)puf)POeHKd6v|7Qb+Gibsg1@FQ^ZZkxSoNf-P zk2qfxJ^CGhK!i+|dUT{2}CC^9v#$qDG-A zAQB}Ud0bXCD~f1Q0p95bDeBBkUFv+@O>MbhPYjI+lKt`Xkn~X~%gK|0&Xl3HD79vd z0x+7`mVts#$glwbh5~y4+mQff>=HliG0^A!Bt0i+4MtP zeH^4p9u2&2SHZ8QO!C!u{3wo^<3s0|8Cp~5{qKu7iqbZ0evP=48c6{5;r|6)igQPg$@t02g!7wULux(5TslVk@59fIBg!(; zlg?eiN&6Msd{FL%uh_SGATFDZ>p=z@r+i zc4T0y9z}Bi9E8lw0EWhiSMPt5Wiy;%r>};71E-J?=!V!qT8=_}zi7aF>B9^={Nr10 zm}=zKILRWb6qFa%^>;}3E*5Aj?MPzl3Euv)4%a2eOUxyXCno`$MvWh95KkkiyZ}k} zHmdTvZLi+c1=C&PE>1h6^|)PCJ&Zaml=4kGr^gP>&u<)YDsS-uN$hW zb(tk#J_(1ox*#19WdD!r@HP(%_^;wgwp^TOq#-ziaDtIu!l0t$mroGFPNL(xa^v|p z6o0K@wyU8*Oh)JG<)VQj8-8gKc{x4!I+c_4%~yz zE9yhOm(O)i<^XsUU$=cAlX>^A{H5we9YI1BS| zQJMeD;==dl)0J!x&v^H|(LB}W4wzf$l-gTLlIP~V{T0eUn#eJ!L(x|Z)x34;G~^ig zjTJ{Sl;uSbdO)XDRTU{1>=0Iu318)BFHWvAro1vPfg6v=C%_u}LLO4|O$t1tFv@T< zldFEO?1ApW9$h7S7{t*x@Tt!^9}fdixdqrx*y)QFHA38;C^m}< zj3!YJsSY<8k+1BcE|XzEY6jIVK!Qw)t1xTZJ8`3cA_aKkr(QxW%&5c6$z%MrBBfRe zT9HNY*PTcj*cV802mY{!s5uk4>UA?*+@Hlyp|sckdhaUmLDS}Y29iT2rMqc7rp}jr zi7+=T;i2%~=SaT9GL1yh(};K3UW|S50$&6)L((5!IQx~NZ=JWJ8{v{6!3+1lzWaC` z2-a&_Q*@UMxr?t|XkOnxgGvEk^C98jh-Ekw*7;9GD?DJEr@@l^tOrWyb+Sm6B#r4pnAoy~ItKnJCPP^557(DAJs0_oM<_;4uq zfDBb4;QxXx*}3Fnb#F-GgQSf~_)w!(mETYo<;KbeZ zGdzRppB>l1#~b|SnkeZCF#STTY9-(F=TS&ayzhn`CYxvW8LPKu1&O8f|C z6x=7R2p~vcR~^%Vc?k9Fa;GaKq#1BJYX3Hw4(T3w1VPf5u>Ww#j`Zb(4+)YXU-qd{ zZm&TvV2smRTzJbZYBn{5Laa#Pl?$+6>MzNtG_ut^{r1Rf{@1VC7YIbQCKwJpQt&9p z@1N{|pyM}lwDv2#uB1B7y;Ri%h7BD^L!HnCSBobMNY$=`sHdQ)u9X^-Ea#6O_LN6< zURL1o0%DVQpFQD4)l^Tc%xZ-La`Tcqs(-SDxl-Cscl^&`-U7IHR$-N74r%(8(5*8% z;q)7*#mr0etZ-!htZiVDsyM(!Y#582qp=O*>QYjey&ux#ypXLbuyVVh22Uuu41u?M zPhzIPK3ShcZag z!2Y{C$iwL2&lDk&$Femny+OcLWKW>4ozzG2=<7(l$7O%w+A~1U6WFb453~@~AdxQN zH@v}#)pWAC)1WLJ6!mY1!fwmc9qy~0Aq{Zc5lgT}zOkyBiReyn=CeZuEfg^lPBL}C z9*1m9A>a+Yr69P^L4lCY-duD1g9uPICy0Y}0)6I-zjSu41qH+Oy>DVDkdB?&)BUhz2+IB?LC^eIUO34lY94!;k= zv%d;Eb>asc^3evVJ0!fQ(Bn2WId5OW*&Od9|C zAs_LW=~hBBya>I@P;Ib@}yLnmTZ{Wkpd42>g0-H6jO_G#z>7hN;!%=30r2Mfn3vD|Ek#JW z;JP^1n|($+LmjdJ(P@|MS)3G{RR06PmpQTFM9>IWdV&~x4$^-!AA?%%)g9EB!;~i+8sCXX0+esXu zUkeHRg)NMFj%7q8BtoZ+r8D#BQCw$-qzUoEh_H9e#UFJ?Kh!UW^kdp zv_!4QhPoxjW@egpX8K*+D!1*r12IYYkn`+ORM#snf*d9l={AG1BUb)^&;l7o@hI3Z z1%l1Qd?w504oDCM{xTLJ6Z2n;C-S9x#M!?%Hc+U%y%L{d>iBMdU82(ri%v=k-|Ev# zQ={hKWp}gub@$~P`tzs0lcy(t;+kgkeY?MUvD4y!U(k#{fNlsg(9I*e)p-4ud(djO z4cc>Idaoaf(rJX)Yzy_1Un47r`7gaosS9smitRZxW?K^`0s-Ap`weWS>$waHqoT!P z4a^9l3iA62stGEd`@qvVt)$f9+KcWr7Z~!$+VkA8bSnGZhZ-wuqxabEObMhSo_*V%;uE5>PM zVVwE?azfb?y!~Zb-xkacBQix~t_qr>uDHEl72`)S@cFLhnjNJ50>jwSMF&gbzg(wf zt5I8T2c&TY8Bn$i^XZIjQ>O{+AHICOKCL1zvbQ@q=!v=e(CD+O)Y6UVdSQm_z(be0 znj+AX@xo^ADYl&#h|#Zt&rRFjdQVskOt6uA-<>Zu|yO3Ni(V$ZAkdHElFd1X&@ee2!>JpE-<;jJGGqdWb{3?n#36; z?zEoE_vVh4)HL_>x8pCOv&L-IQJDr7@vC^^o1CXP5f1|{W|bOxjI+Hk-&EuaU(Wq1 zIRwgIPGnq5pX~qj{oMSc2w|X_gW@_J1FlCZ91yIxwbF(C&x#OtHSw-(Lnhf@cDVAk z>}GQW$j0U%zEa80 zt|5giAp`+fZ>0pOsCoRTNO`V7X9LaOyfw%$!VY13Zx^sRg_&>bc82Q|#eBn@XKc7IE3|zYclkty&!1-;O`HBDP=TD=<&c9KojeR5u^5BU!pnEN>h?Ry zh*nuck7;$*O1X0(DZ#=K=BwvAIS;1HC=x!3Kg7xHKkAGjd>dIi8Y7OjiM{VJZ?CyA zG->ui#h(-t#lSOb7_^NT01y3CCHZ(mBg+q@`tjMQ2 zdDUH&nlaP!?#X_qCD*^|dk~o|_~BWyQMo?y=*T-`X1cKph zZqeCzU}a2bmOPO;gbOG;+B(CtcL9ZcNXu1T38b~(0O4J}#sz7t3YY5eR>*2Z>4)1n z%efisr38Nba=3%ik*;#hnB-8e8{1PVnla+;y0%$f$Y>F4*`B7{p(UD-hExd`0!Fjm-_wzrzd9W=e6^%~i2lWk z4&Q^)=}GwwA+mhwo?Nk5uR@pp`{hB^sQ)1|k8BX=i0fiqw%ky)5`yt7nu}w+QRlf;UVbp@C zif8YI&whnnoBwZoD)WC)E59L-kJWxLGB@E;1)JKgWzo3e8~rS^)Fs2EmR4rCSpQ2@ z13i-O{Y1K?N*$jd&Mw#dP;Fv?e9fdDY|I&K>}epASt+T!1PFlEs&0_Zq)ZnaRR4v- zGeTb!wl^D6+I0Y&mR{bdR?qXr+t$+&aofv3#Mg%ps<7z9%kxxz{3S?9K@UP(qrVXo?bJKmT+Ky5}V+D%FLl~*nigBGW-a>5DE7Kd#&?A2i*Hj}X zEa5*^jCh9$xc7a`jOo(Wi8^wE7BDcGyar&5mY*$)6P~0rTGMQF}`s|Fho9 z?^A~l;@YrL2uzmwYk8u`B*i%u+h7&2f=p!iYev>3rB#KJxv5BqNhzQdU9xq*Iq?MMShx{tcwEqf$PWq6`*2|*9MC5u?U(Fdv|d3@%CQ{%}DbZ zvv(R?s`2}ur^OepP~Z7huv)c&J^-Z!S_INi{7P)9K^CHVPJfMbzqtA`z?e=x_x9Lc z^)v)3!kQnP^}N~`>UQDYO_e&QK!gDc|99zo@DhLi#%LZ858Ms82dC2ExdlUfBcs2c z)c2IOQcPQjM33UvZP5| z2uo+`7MK4dD9G&*6eu*jZR0oZbU%T84Fl0$z=HMEHrme7vFG`rmCuuLPrCY}^wiaZ z#UBnNzhRTG+gd(x`jkAtK!uIXySmF^ve2|A|Sj)N%B2%z}A?w({ z1SjMk;LjrD3vfg%cg)E0)d#8aCDfuPhIFqzZJK&ew~~6R`UxIt!4Y|I%CjlX$ygQH zS60)1-fQ{-i}_Xj!one`g)c0##%&(u43d_dz`NICk$s(V;p;? z9u)l1BzhSBYP{&_i}BlzY*Wwky8pPeLQGV4f{%KpUf8E9ZmT)XzCAGx{+*K>5ZW4%jOU)x;v6Z|ylP*M$03F<7VuM3!i8Eyb?$}tfH?E+<> z639YV+wu;8sGoVmgPh)eeu-62@lTi)hXEyHWluPN{~01jof3sX!fc}K^FunfS|#gT zTCWjKgxg@Gwx`aohF~iVZh6mKuh^5yx}DR$HF=;t8Sne7Cr4mN)^z%_3&H(5HRs%3 z6#0xHO-Dvrv|}ZV`CdNF#olA}!BJ!6x22&Sxpu!uGSj`pY6? z@ZpRzGt2uL-ShxSX!B4}d-^!0Mk2*p&%G-H)miq9$B0Y`aey9Qb|lpoYA2ku6K~hd zL~C5A{N`X849SxMjFicxz24x4?F#nYRf1Gi?_>VO>4gg7`_-+s_|z8+9*-N%pFDVA z6o0U5xHisdk^SXH{IC9^6m?;GJIANnH^^KU5`#6;;$c9tdz<%y&UUknTyEJD^$qK& z`%Md-4RY(Od+VhVk#k~<@^_?WFWs(=_%Q&x9(~)0OyL|5Fxnz(^YGFflLE*XS#Z@J zb$b4&*QSQOL*8Kis^})f{L2EK3(<{^Pyv?V$Nc=5_=QXHk`ZznW!CiOdKqDamAHfU zJm0+{9L%Qx^|_hF?wHMLXS|Pvs7)(xqrKefTR4^9!iU4^MiN}Uvo@Zd(~Ol;9^URT zblKmsiFASQL#|8`Q#cPcWxUt24zeO5B5;*|H6_r!W|K=%Y{*Q`-H|i+gFT`? ze|Yrn;f0#c`2DM9Pg;1SHb*Gbmpz~&5H!7=(RS?Z8H>G4+xdY%zklb$Jzkx)IJncm zzA;wl^Rc(`?}_r=<#@YLSxm&AHMs-#&I=smdUTCjbqpwj%#@ThQQTiR``eojfGOMu z_fQ3(6AdH83&Nz0+82`nHNBdsMVO$WZt1MO-BXHt!d?PfCBHY#=<@AoTlSBJrisGs z##^nzjSXz9@8nik^;CPvWfQXZmszF@n<@qPZQ2t#;2tTPe90H-_1qv-7)F|Vd^&mQ zgT!>NNx^gA;G>F#<1Ie>(yVI{LmIa1#igCAAm_?Ebq?B9NMHYH$1m-+GA`%d%P2`u z)R0^37k+k(#VX(b{Q2|L?n+zF`}j(Wdie$S$=HlE+4&K4bx%&InxUCNyH|oE1fR6{ zxQ}e7F)ag1EO(r9Q*RM7ry62qJtKU!JBjw|bH?v|a){oyOv*neZms=Cyh~Qo*ryn> zIf%=geuudZ0d8qeOj`)N>xVE1I}4gAK@zIbyV!0qK%(9?tyMQc`w+()PsHD#69zi} z{e#Vys{_3kY!(+|iC#*=9_4r{Z z;)73#4^k5!1SUQxZ+CxSN%X z7j=Xxo#)(p(Z2=;5(RQMqdYt-hE6Yh8P~$ErsTEv-LneFYqY6E-n0(}MT?FEy( z7wf0fd~03dV(k#Cjp8@IQLnwa^-(UPcWa3FJx;HRSe5${h(7+=2%m=Qwa<5W3vqOP zC`_bV3qd|dV{)wYECW|%n)cLwGBlXDHJJ+pJFG7mpBr+4kC@!oh$p0k`mA~rSaHc| za%*Q}T{>vr`@|A`dLg=cUq!#wmGVwEF_q7??ab9yY2dti|0k=RoyUugX(e?@H})N) z4E@s6Y!(R-5saBR^Y>g`e&=TB9mGe+3@7udeZ#*wv65vG6(M}4nlZL}U9KG}avpo!DItb1c@W_`3xN+C~ zif>IqhZl%Ge%4n4^WHnRUQ>h5^xg7VRbWcsWb@M+3!4yj@HuU?@m%{yVPvb{mc1_iHTg|`Z}A~!vW#$-@8wh+wTx> z>1qm`Oj&7N$xVN)&!5tH3x+v-uU6Jc2Csa)5bbET6f>;4x93Gq34k~xep_7WQVagu zq12EkEQ*1|ffmpn-Y9McOP-xw7<2%THcX{Z{ExM2A$5ls>9Z1Jedja5K2LTH7g<>& zJ$_|iU;xUOk5{LAuWj6URedPsxN@wWqfgerU|x4u#;}22XO>!Jq3g14M!lV_d+ETS zZ&FD~a95X0WpgyX$gZ{9P#viXby$UcmR7ol@W?aQ2b~H+EzKl+tt@6nbB)hqEWsemHX+|ZT@0yy;Lvs{Cu^6dee@*wLu17teh(B zyn*M=8#_li1I#=@M~utAAnzG^si(B6QTlF$*0qV2_dag~@~+A*`fa>JWZ^9>dUArc zRoI5{-yd5Tc7IEgtI|PqP!odI%X^m|fZ;*t03F>p*V$x&yj3`&z(6YeW_{a6YhP|i z$W!(w&F{c`gN2sma0B6LYj!`wgdrh9YVLDLh^74?@ODCu<*_DzdReD3I6?Uc^Q z9C{klHB5vJ#N&sgM*O_-q9wDxl;Sh->(Rg8FeD{)wE6t?<`(0-hUG;06?yp(_qg#* zaLkOigL`Ai^AVh>ILx{kv#{wsw5~6GR6R)B#Y(iziXAq;^X9<4lohk|Dj6bQibB*o4fdHwsK30Q}<_E zLnpTKp4ngJqr*ylsi_j_=7CKq`HrzJEn;iiJNq}<+-|!1(qF3YodT5ZI~zVU`7igR zFd0e`(x73XX~6G7?+3UH$W5D(!N?H!vP3sb%|O>u<j1Q|E6EUY$X1Up+ zB{$6IXA(IQi$YjN3jI9Js6pQ8F~z&1e>i8TP;N5cHIKV=8#J2Cbs!h%ZsfnH?6!D) zx>XupQz}Z+z<$<7%ykBPLb(Y4yef-|M2_#2hALXfwY}%H!PDPeInbg=818l*u>e{vHQs{V#gZ8SAsWz)p zngbjG2TZDmo;5f0{}S#Ulk|H?e?1b|oL2!H|T401U`B5<_&>%TsJfCS@n+DNPjO1g+-hVPsTu;ccEB#kUWHaZkT9+IuThz z=Ad$B&;TeM!HAtQI7hjXJC^Yn$LB&B=zj5aQy_hcr}il4{@ZM_o$(ai6|hhqy9aK$ zST#-6G)4o{LE$hpp7GDCfF~a2x9?1CfnP4XTNj9{Y>gI6-S;6TWw18-6rub?8Yedh zw>m2D(s4hkdH}V-qHB;Zu?WEl%m=$=A*-jU32 z;Dq6Ub&lF^Y;#CTIY5Uq3V`5mebx$&% z9#A3w9;|Ee#Uu}TokMR7VXLu<_0k91y?^%Ph!^B^P}=vvIq~6O65P^_^{;mv6T}yO zkk26f>D&@}%TRqqs(jpE;BHuby6h{Av|zn=c82kXy;e7d$7A!=DJW9xD-ZVn(D%ng zn`gl9T__rG`|h+B)YY*p2QJ=Z&CPa%^8h}^S80&d^8gS(X{)pdVPB)!-bl>gUA{7+ zD+*3g(md)!(0{iG#>TJ z!(O{vZQXe4iH?*FyY5Ue9`BYaIbu@g$JA8AjN&zyr5uOpt75SUuqbZ6iCA4-?9hbS zNYX$x)&5dwY53||gm7d}xFgHB2f{qy{p3=<#D+8&IWB&Cw8@DKIYMoQoKOf?9YA;k zP*c+jz=-@&sFc%hsYh_HNX-HOI2N0)2L?U81CDgbQ&!wJoZR`0J74fcN5sSA}={>kg_H9YVYgkSs~)GNZ~ z8M4r8z$jp8n60{C_oGRuLN_T%nfQ7hW>N&_md{A=_zopk4QpzPEOe0hiI@V3G0WHm zfUT$5q2p7?oQ3@t#5-jA;c)dCd67|lpuu?vTcLe^#`mW_IUwOLUck#J(m;vjGaXxC z))X<6X6m%3-e|G$l^P$KT?whF*!`cA-{ul_PoIv<;?tAMGpW{Jtf6S!D=NgaB;;1_ zml9Y9T_?hO?dAuHVL{vnJ`^batTOkXwz!i3!su+?L54U$M`}N*q&kUQI}+}rEO$7a zVGgMkPotfqX!ILcMqM~+PL1_|DWdOzib=K43+(sfAKm|6qx-bF!6>u(cH>?6E&lGT z3_XA!M`CfOtg>FqFT`HqW0Vb>+i|JdY9YE^l(|lGeRzKz+q68uDEDD*nD|I-{S|a4 z6y&O%EzrcJg}#uKy1FC_kk>C7ArT@4={PIW083vDQ4POL(KQwR$ET&$ezUywZoHCB zn?3Qr@VxP*#k$7*tMv5rv%jBIPsT2tQja8L#qZ5^6jrYP3{M4o_WUJ0Z*&T*FOrqb zU*ALz^19!<;>6cO>(084qrab3?@loUjq_B><}vYY4$g9IsVyDIl-62=p%uMzyaTYAH5?Q3xi3z za9^(r-SC|?ot&!L;aF_lEbY|V`3S=de=ZNyCjye|?VobLCpkl}I)!&;Sqq&V5rNGr zSPCGpR@`qnO(ge)QfL~nDQqCOZD*?H_MA<%QAzLQhUXngP$QzD(Q;r)_Y$}Y<}{<* z8khtbtQ+|UX2>NoO~^~n`Z#)ejteVIIYK8WQ<+&=_BK=i(txd`ruAdRb@@OT=$X zuf!i@Vgr*4t}nh|j38cdSzBLYL}{Dd&WV=L3xY{Y1?)+fX)Mf+>ytwkV-AMK^T3U8MG0`K-b9@p?(e;CDE|>PteQ8i)pOfW_jd@-ZG;zkVsP zi1;aYKu6#Ve4hiy{9KN;cI+ncf?IGDDAZClk8p4-#|MKexTe|-=l)KtoWJOfB`Z$Q2tAo&9KXNH0!>xmioBt@&UuXY?VHKn}YnwSvgW3M3?_i;_ zKg+PT!@|2!(6_EGzN<75kyJRp_@!&#ObR|gq?dZt_fCf*F=YOW==-QAxmZfS*ztRE ze$nrNJrPB?dbP`wVekeQ$o1pu{)edV4y5{x{=c>;+^n))WhG>UYbDo8k-bMDve&iu z$VG^ZC?iC1Ws|*3^H`m_V@427v@B91x=lbV)KhJZXGhXL)&XF(KSl6N#dNoAU zliX)_=om&nA9X5DD5Lrh`RledHjH`-z1Y*^M)m*>FA(k*H!2P|P+?%|)!QF?9CMYI zKdi0?6ib6}iB^2xQ{WePULG_VM0 zN6@2;EbG->2f(KBq$6uE1Jx4UuYpo5b+H$F!d_mUX`KgLe>(wC^7`q(QL(+W%8Kch z)cVAm8;l1v1O5gPEIt*D2SsikXEkUJ4i12s*&!!fibr-jnlwD8C$~JF#)zJO__MU+ z$s2XJ-QO$@gu^H%Mqsah?3=sKZn4IIE?WOvb<;%yfYs@-+0g;t53pkE7%Z6UqegGM zO)Y))cVM(``r-uu@_%i7@R}w7wZx!}#Va1BRiL{*_GME7s_8A(O&@~id!XyVq-0d< zK|+G-$majz&YFgmwmW}7nc3@vslv!fro-o?KGdE8oJxS2?x1o7(EW|ZL($c`=|%0p zdd+W%89Q&~575@kdGeJ0Q9eGkBbbK=*JPdC-L;RVud*(8Q<|_#AFs0PiW^KpHQ&@p zLhjx`O2+A*@j5Z~q_v@n*D1CgADOcl!b^1RMjM~I)c=;Ws+&50wK@>EWH;kg2@uh* zITWMi83*pT)W+-C))U)_er9IC?!-tR@eLPMUn(@6P2R7aeKY-9HA%|;0AmztXjp%* zz=%`0F4%z=&wLs4eNs{kZdh-mneW*%AD%U^0n-Vw3y6lkUS?R~Ht;`JM$uMbAKwBwH*7T4dH_dQTVqd&LH6TD`fl z%|FJRhry^vIjP#k{S^W3?i1{2Qy_`e2n+n&5ASi}+v3K^{s; zG5+pLKn<1woe$_hhu8t%Y6x|u?MOW!4aP+La`7_wTyoH!@T3G;BFz!o<^)uSY(!RO zM`=Kv<7DSFa1g59DcuQel{tk^MwM%E?)V6A(|r-H0=mEfMn+5-M-sFr7 zZX3tEHJ(r3C9FI?`keOD1!x$% zS{Eskw?hfK>xBcal@rt$1l1!j@C-Lsc)2REVAMm-=QO)D!unr8gbK`GJ+yEN{~3AMGqswUBQ@84&AXV5Q6@E$~U zUxAk2ddoFqXI{2mlaCvwhq-aX;iM$jAJ7pwVl8}AZi}%KRQ~q~??I_C7_JR$4bK#N z^Cp=7f&rZmGr`#DlZ5`i4SJ=jeVS*WMgJ+<o|O z;pas@KK10!d8DN)g}rPX13+!R?ZnWH_d|ouZ$YTAn!e*yZmp`7hx?Y=I`D$p=|DrW z=J|!aNv=0p%U+)L>ZGSn^+ru7eLVrO3wYyyD#LD=YbE%Dz9#-LxRuk>F9ONrir9Uqd|;+!3%0N`YAhl1jdFW_=5fnbfMtqT7;b9!~E z4NAI%w-mF+?;9?d1U)gR_)52_B3N0K!Cy|dMU|)m0NTF3;-mg!u|{G}`G-9Z&*qU^ z4LOxA`4kZCr)#PShuh!Bf;~Upum@8?OU?j>tsDmS#`w4-a|v*XfS=3>`X*il-n{^m zDb6DtWMhAp8GaDb3BNd6)=DA-=a!y6MO%mYvri@}!nBkgEMx~D7!7UaKsHM8Ab|Qh zZ?~Mw5I{I_m`46Z;Nhl})b}!bg5!%%sa?PGR9^j#`Q4D3Tj3sDmO}TW=Q}zoh>d?H zBAlecI$mK$K3flBO&@e1$@W`}jBP2uat zk*eVp20p!$$5%q}Smb%Bej6*E$@rOMgCw2NP6d*)>`S+_+1V4q4-&&*Wg{7yr(eF9 z1(6mLl19zV4O5XltBMWYnGY`D#nL1?oUON26Cn_PWFvnX(Gz@dNViZz?2i`|ys^Sa zplr7F8*ggNTxT`CG7KUc)6`jZibNc|z{sJ9vptgwCnz8pT%-ES?A>A{toG?aWqn(L z9iInjXy`LvF^9VHh9x8n7)1n;IuFWWc(^}y_XNKlMr$p^J@1_F1*a!9nl8oCtXJf= zj^cet@Xg6!nJv55{NxEDn5G2Z166ST}(4t*@go%K?I8}_@dXBe&KE9hG2sNpRss} z2Ki$TYG4c|?<>^g5UDNI-w-tVc=ybEm`Nx_MMu`1n8Us{@!n(9#s4t{C()2e6Cb)- zWV$g??~S?UasOs&oU&yj^12W^_x*-3IN?&iPT1H5J-WtCBEDRf$yz*95Jpz9v~>Ip zGUb$R!Dafkea*3w0xZ&_%ideh{B{FR$8+$U~#^OB5bBJw*9<=4E*ujg0-^q%{Za=k?W%d{0 zs-?+>as>S?FVb2!7MCKK-Il>T=+u9`ngSVXBxZJddr9Oy%WJLJFu_KC`D{$1#VyMU|*ySM0{*Y1U6;;2?QM4>473*dg|pAj}eH!V*a%+ zTM0cd;Y%MZ&KpKwxa_22pq(VGv$s)*SdqRG8z>cpkt}uMYrYY%qvC`v9yi3y=v@Oi zLNmoM0?5MNP6rZ}JrUKeTaPbJ4h_QBCFEdMVzIL=NVQE5M|};HszMPs?{9liq3`Hb#jjLb`P$=#?H5mhmy~3d0 zG@?Hk!~C%tWlKE78~qNpOw#Z?wwnf)X|sQ{ig3%lSHpku1g%8{)sRuyHi%UCM*koXE^)7Kxg=%TVMi!7Xf#_x4C?E3?b8&l1aqK=}VmEhc!bGg7zDN&9A4 zZSP1nRC&P}OS&L@_im<;|G7Mc##>gW3%=)^CI5HUckd9rvOt2;>YyZZ(S!40lKnB%^kN3%1{4A?cnOkG;l4w_)<(yNl*1!Pk=h zQj1e}KFl@=mIje1joXw5%$#W5Yd}>tL-}dC4RaU@RhCml_n||LZ_EF5_|cu0=`WXo z1W8AwpN{V zzB}*db1=8LZvmZT^+-#rF9ZCL4AE)sCLH-g9r-i&8b$@&ktASC1T+p?_hNG5zJS@Jv13@5V2gVPCbQ2g>>%wKVT0aT6e%Ymvm=8CkR?8T0{R z^fXlQaXUX}*?K?VF*!prTm25Y)XAcv!5d>Z^8I4M!y_@UzoRaBU1YRnTw*r^VdN-mE#U+f`< zqP$-&9Ehm~F>2-PB->={{|hUvoH2sc$sWyY0Un19$ruyG?|gf`%UnDLA;ROqi1UjL z0nPB|HfhM~yFg9mK*^qo`1#GOmji)iK>1r}^v3Eo?nUz|7r)Kk`~KSI3?t<(D{^~$ za~}CO62*-*_UxX5@Z+QlcKoa4#f=z@M97naZNaRwu(od(= zt1cJ=?z-%u+LTZ*Zny0BxOHwYTcwASvC7`2zL9|S*d#G0&6+PNe||{xEl4LR?Rlp! zy40mu8eL8Wy@=cX`GVLuK*G;#Vd!eTl*HMG#oiSf*;^g^$UE!DF#?6S!OHq$jtof4 z>3m|T?@L2(?@Y(S^cU{3Lf1B?KSpnIbr59ecW}Y7nN;q~E#vv1fWT@T@Y5Omwn*pb zlp2uyc67CWfid{H9bQC0wI~T)9(1@$H%||D<-k4u_^$@J1#$S?`zATI@}K`$d=yhR z7Ia-mi^04=p_;8CgkQ!<2krH18T;N>f3h4}Sgb4F*ku3kt+M5JBr1Jv^|g}G$LRk4 zhwknbS>@%lCMFv;c6M@}o?PSOhVPynJklBZop8K$QRV2M0N=oaz~S)0$;pNdFP@5O zPyFVpvx=)D83%`S<^1wJP1;Ct?)w{)$6`z#&vh}rwBhrl05YhZyh?F8x&n2~P&ow! zn)dd)x5ONIIiHSEw!MiFJpRZ1*kwm$W&J#<#o`Fm5R^K92B{Lk=turE_jz0M=SD6X zGpm#a{hjXr7FZ9SqpT;k_A5Mi4&Eu?M5c+5z1uoDo}V)-1hb!Qm|>mT?2%!g>Nl!~ zsUwfqZ7MGBVvV(bfcJi5>YsJ$4=Uh54G&*zm z?ZBN4|1?Wx(tl6k^N>VfxODoJhidI z{^7-0#0t0Z+lp%^(nBZMRGYK$7dBV3ax0C+#H)IWE&ucnr{`!Phs9B|i7pmJ9K&kH zE=0T8UPM943ngz^h0`~GZ3TD|QAk)m?3caLl{({#9<}$mJkkB+yV)mxx^l67JTE(N zI!{X<*y+=GJk}B9e^{y}CnSY7Cj@3T+9q7o@p z*6QmxzEO|XgWBW&_7zze28GoS6@;AjbY(x(y{~U%7_Z(pHRVOYtXomJ#_UU=97$n9 zPIc3+1EWD?`goG}lAe?Y-G!+(oL7cZ z;ZL%4V2%D-CPyqpO-4et|Gi}Yt+2baKB*f)q`sedj0Yp&)f$0T5o051v)9gVnerjCm7{PO7mH) zbaiOAb66LZcE}*{owK(kF-A@eVFLk&&LHtc`P^*ULAv6R?`{`itoWS8kMrH(K}>RQ zD+kTzAICJ<7ccj1X6mMONCh@_Vzhq6v_J5D+doCXJ$R79;680+SF_>V|793&YC9Q4 zrfD(%hXHE*GTnmyQp>;~@FNnHW#{-^=GGv!$G$b}*0nH!%6{eW$i;g@Su3CaU2x9T zj`-?x!6ZRQaHNu7$7%(%46&CFQ-iQ)Eo<7_L#F}xql=Nj`|Y9dsWEnW=ac;gbc6zg ziRAd8m^OY=-S99*d0|kFHK(Yr{irGM;ZmO@GvH>n_$XIA<0U#@5)-hPZLRS-o@Epc zIM2?eY@rmu?ky8oXF8;ZK+K;Q+-`i%IM8K*l$BsH@!YuKbvPZ03(X3sI#ebJvwp&R z`eFFHL{Kk`T*yDl+4n zKRgLoF^z8l=VNZ%?kfB{zgq8Z4ic*gUPwSxT%ex}rpWh!MaPYBPIe}lW*;v|P_%$< z@2A)4u(3C9+J4v`^3h1v7(Fjop7zb!^Bg94K=3e$jKn+m?oTgp+g;h!>m~vIByp#U`&3;M=S}c@Q)X$xL{8(6H zzy{Sw{-UQiv@;(%=pTq|N}<~m9RVkSG=A;J4^d)=Yq)=KJ=#7c-pm7$t zWv3&>jvHq!|HMlY3X31ZjyKV%A2bYJNUt{=R4DHx73=4(G_~+a7;6gA*kPQ_M*W6| z@Xog*qFn$7a%Qxtk#Kc?=8_^hDi;5_r8FPp5g+k{U-`>pXY8GpIn+#ds_%R=Z(Vet zPXBYj%?R0s#Jqoeth_hfyk?gWN`T}8s<}j#W2~W zr<0NN=w;(kCl^K}I>Er5%h{_Xm=RqLxb`bbnQ*lKFG-H-6Le-|h@Qy} zKn5f0YTL4pcMWS3CPuymiAtVW$?wiRv5)B@A%MIsA-?vNoY)_oojqR^u}85ZzCE0Y zuWKMCSxqBCAH&!^YQ zublTi&B~`TdmkmSmxS6igbn#$3wn(MB6L`z6|tB0=^S5gMn)z@hDm*mQV5lZB~{ED z{+xd^^4K2xKqCMbBtT+A)A?lCWNIu^&N=mo_$a_Gt{PqDpPCA(Aq-}Y4|$iL4#twg z9skmQ(^E850(F5*aGEA5=fI~t^P-}u9y7tsTY+)){2r~dy?nGr1`>3#CtY`)k5@$m z!rGdVqv_EWu_upz#qtQz%x=qJG>dBH)fI;dyQNzeJwq zt$=*gnOpX&Dei0G&IdB(&U0hZMLGK_qYaghJlXHd8n;?SL~;w%IQFeV&MW24C6!@J z9^Wg}pdtlsu)aRg>1`?hTg@N%q@N-Xfr-jLS)C`lq?Xk$5|&v{B3+9sk*=aaCZD{o z?}UHw;ISdHS5OEe;)4$H+ZchJ{G-pnZl!crtEXi?%&6nLj?jQ^hq7|>cb$jHQKx=7 zIIRM$Nhh4!;xvrc2k`k<_#52WWlo0*%RT%$Zbv$c4^z_#S^p%R(QDG|P4Bt1Wm8N^ zp80jLv@oI|mBuG`)OMNiSrwtZ;-h!#539lQSWIzp%BZM81nJGu7}iYXibhzrnUW*? zdrt7+Z$$R#V0ihJOn zZaBS<(;FODQzoQWFKVZJHPBk(XC^EbaX3N!yv$AF{EVFG@|pa~rtZyz^Z$xjI|W~fHQ-U|Ll0Vf^i-F1q{*yQ4D z{`Z{wEQ4}Bi2#x4iCEyZbkeop#gl10Qu{W_8J1CXhgI!v#b zUJJ2#-nr>i@Tm1!l-oe!eXgW=5{y;Sq`_+2F{tF}Ny302DnJV0sA#+r`U zIxZ<9LNx@1&FZd9WA?EpXA%zXD%Tw0<`h8x8_%A9u^fEI-aMjr?|UNyH&00=YwN55 zRoB#0K`6Cq)sHT*9v)o|9ibEN^wyzWSAz zJZDX^9_N<-^bNN1%=d^e=a|C!Y8ie6;Q@!9s!d6EX0AR^;T`9(Ck5>LU60z!IP* zB5)^z>g=7Ic-upv)kJ7_?WM%S_~uMtb~FaRm=!)Apr$UexNfLVNI!y^Te>)EODubA zknFNeA$k4BmP~tThap#2to?n7`i8Qy*&p+&5Wr`iE=YZ%6gPB_?3MU*QM& zF~*-~T7J8KcctEq`1zwf^;Zh_c0Ptu z{8Xr{yu~mRL)8&O;8;WSW0ts`#aBPSE5n{2?5)(odiJR4ibyf$CEiC>E2|Jt_=fMd zrZt)>6(GJ|t#YHz^LVy_-uM%ej*4u%8rxXP?I?Tv$XKe9SiUX%0Fi6TLgd6DAOwST zhl8P>^N4*$U{jw38XFi?cf%FfZwtTj_Z2a`D%3|`Qgy_Ovt{Bh$U!DCe@`FbN!<$( z5RYYHiXO=v*rEik@*m0qpP5akyS}b%4h*C?>7DWVG`{1SqT<&FysOC zh_9IZ_m_Kx!rB5d7RubLteU^1@Pghg4}3jdG*Q$W>9|0_7&Exzm=gsj{TeSR?}|6? zR&hB6MvN1>ct3s+3Gq88PD50hkTeB%2(Xq6s@+6~3(nvrx8VI+uo56&}I&M!o;wBh%h%9}IxIRzS$!jCnZWn9gAXa47@^Zb7=4p?opDA#xw=XY^<&^F+>-6jl%^Ni_K|Ej(tT6@=Jp5W;b>& z@9O+(vuU#BcP~Vi#v9$Mu9%G#!_3UyV2sDKeti)^L8K;gTl~n_{CKR*KDYe}CUt$o9|Lxu5(a z36Mtn8u!pCLmbW&YritzCkq6A`gMBhE+e@0$VrRI%}K zmyR@1FUxsO_q;tf%wT7H^J@OReyMWL$RRd{hwDd;26R;o4Nyv1KjF*m2$Jpn;l7pC zQnf_ZsHh-$irc}|YU0FOzSBgv;1$2&zkS`^jl=u-`lA)~WE`bEx+z=ys-KELE{qNz3q-dwd@t*NdJ>28Vk8&s zPSQ;EVq-IzAl%ad)n7EdoZA%79WH$8F~4n@t*gOjd+!BlscA6za8r?C?i71c-45yQ zriUCmc@HHgR|6Ka*nDxI|Mh5kz0p(m2i39dUklPKnO~>W0wFN^ zm^siuG4U&=S^9|d@>I{OfB?uE? zyTYSI>DRmjASiw7zqfVH^9l+sb1)Js=>QX?)?O5Y@RlEOyH*!?n(F9;Udc8mIBl;} zYOn%#?+DUR;Z&W>Xi-{QFZtl<{u;#uf;1W>M-c&tkp9kV)1&kJ!Wyq`?81Q1(T4U zI9)7DOlZMN6zD>8$Bak9m#6j2z9M$WsZ?Kj0PkkJz_(U_{;Ly+cfx!4?VshRk3%_h z(bW`>x00Ufs;lHL;z553`>lwunV~>NxP*mck+pFLw#G49L})U$14t<|lM|8nEu{1?PcMmXHtvQFAY`);|NEs5XJTySib=N{XnRX*27U7xQM#GEx1GqF`QIEF=A|F0QR; zEwvMoxt$t}3o&<$r7P>#rA=h>IHMCOoq(>?mDKicRs7MuNeg;O_NRs19Wp~tn56u~ z^K=qPJPc+VNm=*lo~Ri)GUrSK`x$Qr?u{tO)H>Z_bYT}La$gLO&9b3kUdQj%%_cl? zaruaK&5`ng0)|T)>4)9we)9@{NdA3qeuBR;Ur%Df5G~qU(f=&`Zv59NB^?$yL9(&4 z91ZCtAn6T8GRej1)dP>#+J`U?cGWEO=uMwhnJ;3B^lOm!bR8z64w%zdcIxGr!O+`V zvMi{M;4}sWhx>vS#DeZ$4^S6QVp z6;s|1Cy!vgyoOr1dfJY`XuVTwvSn`TT^ngGEGApS(jt+~Ya=1gJ_@dEP15Wqo*Ebg@mavYzQha*_Yib*GMZJ(*QN9spp~`M(OP{tcS{wxms=p`lNndRhgi zxL)|;x4w`0DGIR3tLN=_p;Fq>q-rQ!DxHOTQ2-|pp?P`7rm>-y#^d7*(Iam1Ox-^$ zUAvhE$ffaZ{=ikMzReAk>Yqd)k{71mJV7LierIfgHd~|J_LD}9qYk(Fh@=`f`U!~! z|BQs+U}jeKILcC}8+6fU_7RCWJoKEZsyC*Jgd`&Cbo6_32t zViVrNRbDmYL%xpt)qc#LQzvBO+hel>)bB93N+iz(ZMkTO0 z8K=w1fA=C&<16lOvE$RtywbCx(r8h+W4oz4LJ44JTBrobil3DuDb_w>Fln>j68VXr zOE$~9`(`l7`gu*}U@ShL|0;ik@PDVQoms?NeXwP^+O2P|6OHuXmHGr?CAnm$MZ2R= zt-*_JOYAM8qT|pWsKoJo@Tb5{2_`Em+49(UjmV$y3HRYIKqQj03hxCz@rIhWgv^R> z)vKFN)yL8Od&w;k19O3_NI$CSrH#qY8P(9TLQqAm9S({$;;na)vI zki#<7Wf#Qh=!o)F^vhk8J5Y{UBLvGbJ)cE)k{DEJac;-ZYp{A{^sZhtMEx>a&TFNK zd05Y#t%Pq=1!xl;b>Anx!MR?7Y`GstAU}&XTcsr>mWD{+p!F7(G?=O1!>2<(W{oMclp< zf|pqQI=MJe6rg={><}U}shZ0qrcNLD{EaHbQLT3Tm9ZMzzwLNWq?RAuam_-8p;JXb zw0>AUFvB=4PCQ$JOk@7|Acy8?I#4v=pfJDWXsW}oqbu?`YSGTjE5=(7pN`N;Sk(!Z z-Es@=-Z=_6_KRd|kN^y(C?pxf2S7lI&~|Z<-Q2C#N6&I$YQ8xGw`cr@jyU8Mj z8BZZDsKk8_WU;SzG=p9oE6PQqyi?Q98&4MYSPR(aN$=$g8qXcmJ!Rl@iWudQ*-1QqZF}UzymxngjY-8(C zNaQ(>%%}k^#Q+{vS!_JD+j2$>=-hFWhSq=!Pw}nuc7&{PI4Hk>hdq`dO|*c?v)wF@ z1=D_)*n`Tls%Au!m;Sj8yzfFRkQY!vYgmGc2R2YEqdh&?G_>2`%+s`rJnDCiG#8nL zXycD1{i@;NAdTTD9xEJlHv+HU?~CyZ@EGvk(_6zE4y*$-6lDhfYCOxZym0^E%4DivdXL4rVSM%4&N2mb2=c?Rj|;-&m~J6v zT8QRr`U@wtQsmP;@`O-stPdz`cYy0D#z=hI{_lDQhVhb%0o*Fl1`JuJ+3$N2M)&fy zXNuk$=5y=MZU1ygiw$!;pl5*xgmmcD&Cf z-jy(jH83wV7|b^v*r_ylVL1i#k$kJA{c@@E;{CLeCpr8h6$2^Fd44#UT?}EFW&IJ{ zff`X!&@)b>zz+OmZq%+tOq08GbhEMQNcnbuEG+EtaFP7Nr};3KzgA{~-s_+YLx@vd z=I1HTHc`LdWXw756&Yn_AS^pTuMNd_$3V6k^VeqUX;NMP!_w4n$)m>H5E1JaOUAXqi*^sg+I;2jd{F(! z;%Cvq1T>RALYe}T-?PTu+VM$8l6A*+cb5jzx8z;Iu?NjT_?~NUNfT%>E+&?Rf3s56<}D;(-3X?e?Z-PU{B_gO#rbs$ zds<^eaRahYjm$gmO;Yg2dH^PaGJjvNe0E{;dIpi9{B4bO`m&+GGY84ZYY*(Jhnx3fTpU5DQs!azWj?~8f^jW%(xMECq-|z4F zpIp%g&i+bai`ehVD&z3SCA9fy>U|QNj726Vce&`){DCX68XM}24B9e>l&R7N{yl6e z*3%J{vQCd6W5gYH!UeHsARyVLg6!=X9*C+JNX9#NN1{eMcSYYn{v1g)Yg$`wO*wFC zfr60J2mJB*+Q=c)3lAw)2}lYgiU8Xj+VnPEQH0zD(cZjlQqn=SK}6QNox?NfYgr~b z0f5{{h6DN2pDU0y_sX$YeL4_Fg%~umWau#pLNx-vZdo__@b~E5Go?;p?$6BkCy$FtKw@&Ih=w})K}UT{kC2aOJ%I^y7L_ipr0Wc7rhmx z>4T?>`RzzF%}OccYLe6<2OYOWZ7U80{Z(=kRVlYZgtM8Qf25(q2Rl6$S|k%T zb{NA^u6cl<%Ep!nXmFCSV^h8=+ae@IcM+7s^q+Zpa7ZxjY*FSO#1z7O@gMYGOVed< z5TS#lMdNKQ%59OQNIDo9#p3VkSKv_9w$P*Jwsd7yf4+);;tO=0vY-U|=yu27Hh4&2 zxU_hZ35Ew>MX|y_i4C@U7e@~cHJZ7adSRlZ^e?VRo=RhO_bi$%{+bSHkU^@1?t>H- z&gsA3gB)82i}JU5D=$;Yq#O~Y0nCLc0N47{ws0=E6)ABmd$MQ`dcbt z7ED-aProri;DD~=W-k6A3s^0Y8tTYup%8U4Vf}==A_YlkcKab;T~B06vg_-~^lRaq z2H*;mWW;z#QK8=i<8q=VmKlvj`zDD6(8gIcasr>HlvN|_8?!-x}n7!0aZrn?g*CgHO z@;7tiq46x@pn{$}adSh~po}fjb0`zyQ2~A6?1%_}CSmTGDQg4Hk}P3i(1-;uFYE}s z=4|_SpC@s;l4ss6^BRl~f4V65PQu81{&2msxwSaC@6jjQj9F}Z{*k*?K z0_WUct-*DyK*XL$tKJBU|9ip0@2= zxJy}E)*-{16QF*Z!g5J>59?@Yt*YOtdVzs_kK|jE;92F)lz7vMa z#Z4=7+8q%r2!j}S=AgSfiV+P&9OnW0q-;70gqEA)fu`vFU7KHa5w`(Z{P62%dDShP z!A-rxF%E1`a@(#bhc>A2bA934-u~BLa(Z~!LK4|DRz${WCIx6Do* zB4I+-p~$F5q+1=!si+l)F3W>u$hsZ4woAI`5ovSg5L5`xkE=s@l zu{~ZsB3TB^a^4rh@*xthe(V>;&xu&xN^$H<%*e<`a~waplQ3x&Aqh7`M~K^iT=cT@ zUZ22hhwP>PuehSx5g)I{4o$%`OJ%ap--xb;P^ho!42(zP@;Z$#z~VSk8a+;n;Ji2= z%D(-ww&yy)`%ekcZpQz>O5r&@fS=sC_2+0fGq)n5XPSXj-DY;-$Mv<%OAhUtx2yl6 zqRJ%qDvRzn^^A&5`$4OxPGOLl4%q-=&@oU<*u#EA_p66K<i!=1`vmWj#c>vdLip(7E%oFGq z5&h4$qwvQw;#$X_tP_?+v&;AL@TLRje~s=Gn)zP?sjfR}vKNp1mV}jNFh&B3c34jA z=Nrl@*Lp@xP7bS^Q2qT=j!LvY_J2>$)huszca~~>(<_Qd5sQk|w_yJ4ED_aNUy0#C zq5N8qcCoZAUBHkj(S8ix_e2B5Cy3J%{Ut9HgdvtMo;?7*_BkCWSTGfzxPSm4a=JUZ zCg!s^a5~95s4-A7HS6Vp!O4rGfJy6(@vE7=Oj!odOA+?{$6PUJ;WIk-Ek6N(ty8Uf zO+K;|@D;)HSxP-a%A)Bq**(#~lo6Avb@qwCE2FJrLr*d1&6;TdNetXLJ(iY^GopOp z6lQJzMi?I0lyc4|WX{qY8k znwKD5Z%X_roKz9d*9Lt3BMXZSK|r`m%>2X?DfKOq9O1$s6uYb=BoI?oB>-k5=GU2o z=#R8L6HAZdh!rOYJRN4p)s$>BQH`E!CExl9nt*9wTMkq;G+cD!rZH9RJ}832i>*NN zjH9VyuA5Qi12XiHKWp(=jVf$ zyW=DzDU6ICn1FxKoma0`JE_qfiiy`s$D;IrT)ugX;}l=Mr%%cgMl<$*IKQv8`%HZE z@#9Z_-ZQ^;_m~R8U^s?`cC>OeiyH>g}<&EwQnzk40Zg_txJ`Er+Vn z9(DHRZlj-l(s+s>Y)0By=mMpb^0$e(-_6--eW%+cpBR_vg&b?t^C6EL( zLK_~uJs3RAMf24;5dko?;dE_F-qUTet?9Coh~Cr-U;E7Svb+%c5X?z_E&cO+o;zyF z%sM^W8S$GN-q-?H;M^v=3(TaBc+gZB+I}?I#k2h-G8*^ZOMoc*j|%sEUQ!4CfPASrOE2sR~ri z4g_9i98h`OV_=RSnfG*er?_O3@HiNeT^rpfZa6gif&E^*wLdVtDhlc-iSOT6$|=NF zW7>Lr74jSVM}Nt=zNyan>U`+4m~V*VdJs?)Q`Z9g0pAj@EK@dil&gW-e}<>hOA z1O?urRtw-#)z5i#1HpqM+^d zn0LGU06*)w-9Y19QRPs=SRNc3RWFT}<;kAUA_;0U zd7tZg+#et3f9!iEHaO(M?Bm1oX1S=EMN^K~u!7;UiVF6Y_cxm z=t%ld-yGqg=bX185tR_f7k+)CR4qa8@w_3_+pGcSgt!%qv=_Jv@4m#+dvnqi*8PJM zL5Kd~K1R<2%;W$?cHgpyfX~wiLJ73E_jb!wIxM2Ti+b8%=DL%T*U~HOt%_$3_o6ZY;vj2h5ozRlpMo)y3! zO9C$OZcVlbEaH2mnuaq>={r7ChS?5z2i{U2ZhQl%d#fKl-Dh_4qU>=+gXwYPqGO6hV+$We4>t_7`s_E|E ze?Jd94Fo1zG0?!EW{wCKg8c(=7GYLR4JSpGNDn1Q*Wt4Rg0Rdt?KC1j4T{Kx<%#sp z7k2DzKaTA3#B-`)LR_S>uXcMvh(hbG?iE+ef6EWBl75>`7G8F=V?gV5d2)u1_@T4_${Oz>HURT!k5t9S;j#|mGdQW#>J z-Z1r??86C9cJ_LJ-{nygfavG=FJ?%VK?AP+piRja_=16r2c-CFK?#(NzZS-Ddy$0$n(Z*)@_**li)E_eBwfxxaSs6R3jf{31@K)0K!#wxoYZ=|<@X&jw&%vzcc*ShG!im*?cPhmCzc;D4zOY7d#ADe1{%EeWRh0e2GR z?9mrQn_h;mIpx3{>M^_Bh8z?|r0{PvJ5-z4N+)`*tlPI6IUQIYJox>3CYU6^QTmVP z^8@D=BCgM$U(8%>s!1q3utXgwuP{gb<~|vVCf%YAt6r95e>607Ps9B;*&}=x4Q)1J z6-4OpA8j{CkQ+|(ld?p%uU$Ig68P3Yh0YY=YQ=)OYP?0j9g^jOvS8ovw)hSJPY?Ce z+&2z=?(iP@ww_vM=04)k$O(L>#UF0-On>6QPh0+50%JdRkl5LC(8cHIvm{Bw6#=D` z75K{IsiXd1@{|q?+y95DFAs;ZeZzjn9$Cg35yrlh(#B+q5v9d8_K=8DvNTz;Oi~7A zDU|FJVX_mEHOZ1lg*H1WlPr-X%Xd9`f8Y1bKksq8$NRdU=YH<{TF&dd&TCDKRc-AG z-Q;bwp_Peu?-Til^}YCGzgl*f@~5vW!pC(HyGdz1XwJ=jD0(1t^*e`YT8@x)xCHKV zLZIIsnRXhLTKc24yPlbNyKIL_Tmm9k9CPr%uLL=x1)g#4uGiD(AUl)zKtJKEP$lPu zguMYu$DS!W52!7VHHx2oE!f;F6vCf&zjOx|GUQwTe5YK@?~c7&@=yO2rw{A)G@(>? zk7vU-4~x032Rdq~XfLRk@TZnDG`rTY^K*Kh{-GfykSedf!A$rw=qM)Brv~ZPRfRY| zIu0q@^rQB+#Gc{~XshlnEDp?W;G6X>AKQ(vozgVU0Kgo~2*~a?U4z78Pq3A=w&iH}O zP76EFMw4fMK8J9wSh=RP^*syZ`4qx<%WhR8MYF=jpp9nywK-O0oddl!@&G4|RNrf1 zTzUw>=mjRz!BXgVEk6Xoh=jVbLjq8RHVtk~Ny*jQ(4ow5cVn+Z<(3miGsbSaFz=&w z+>52oKPqYv?l~uRbLC7c&rt3oRiAwEweRV`{->X40ZH4_N%v&J2d^&n8^s7EK=ISe*u`xSe}0aeN#T^&svE%H(%xcx z<+EzoWABi!fmhxgO;YblKZXHmFOuJn?D_|{&%S?*U!A+Z(fQ--fdh(w+SAp8I(FKM z%=Q$eg_@nJWl*v__xQZl--|c-Z6Ykc!wnB~Q$N-fg6aJJ;sNvaXt~{EMqQGnjwgl_ z+6e^VSi=t~OhZgy5$8?!*(@5N_Bp5#`Y0>M>9Hur-^(aFcVk1KnC-235BEAo zsOk_netkGUM%hmhUB5-zI;fy^MxSSKOlh0XH)Qmc%Qvg3sRm(JyHFXUUv0~3g*9_~ zKUVKw$G zYn;*j|+e;kF(=3gxQv+R7e1^92!jWEm>7SZjv>20H}jQ|C)*c0d^0 zk#BQ*-v8iV43hc$xRRV8#RL7x#0xKm=SNSR*niE&RT8(M5F8?g3+D<>>I#+6>7HGn zh$bd$9#A+$AiqD=Wq1D5XZ94YS1xEjh|hsr(984u*>v4OpFe(IuF(tjK}|0*U#vbS zN6fc>fv9X%tWvkq^SArMn9KZ<_?o=2dHlFsMCof2{x=R$nfEpCw5}c`Q&-jcc8;Hx z2fujBetnZ}I}M@r|g&WDLp^p7`;o zD)2Z~Q$gg?v#x-jgy44{%=h+q&F?|3S-G|yAbxn#9y;7aA1LkAjgPUbT9}RU=ld#P7&?6->O?oQYvac z?GWg6;mU0g}o3=M}1$jDR$ zJeC(K-x-?LJo@(c2S2xKFY%q%)VjICxNW1THwGDS%O?C2ci9f;KU#PM$Yfl|vtJ*C zbpo~^8@0Lhmf?nOHv3jqL^gY?o0E$8-Dvi^?u!l_0WUrpB+PO3GwTkxTw=GAr@v{w#eM6(-=`lfntSP|fPPbOFzdlfFZ(Sp} zL-_Lz>LbfDtpZUdbD868Cr&oo!m*4dN6p(Qn6}C0va3Qo;mh7@15q zpn_LR7F<0Unm69mO`6#1cI_kn*hxbdxno`a%$;F^boux*Z{9TQX<@_TRYQJyZu8st z+cG*5RrGSKE!=tR0k_tYS>SBcLCK`~Q>VPT^;w5OO6)}aud*{u-thgz{6->Nfi<-q zdQFpOw{Bnzqp{F%psE7I0)&voOsg|F}VDM$c388747l>otf3;hGXX=)OcF^aw| zP9*Wt9f#r^Ao}h(C@NQ;QR>}%fi6v0enA>t#Hcmm4R*PeGNIg&01~k8^VyqE$EU0* zX63)ev%9oC?PCxAQ}$DA(2IP7yYMBewx6iru2p%bk}Yf1A?|b*jlVy|y;{V4hf7)> z-cBzN1JSOvnQWCc(YV%F-@w}J@tye&8zQ|0PntkbiehP>*Hr3q!m4tY%iZ7a)4|JJ zUntWTgyVWeZ|jehZKex*+{_d*ZfK87pSk(7gn9T`l=0W8RIk^c3K$^~qXb;~yzjiZ zG_ODB+gwtj){3XHMMw@Bm#qUw_xwRlq4uW&inG3kmTwMeRzW#;$X9>h{l*{z@;^lY?A zdBwSnYahMHpFi_iTk}8Ik#Gh_-9(y8{ZW1K%=dM8X@sXfS2v}z;L}) z4NHfxD`J*olap~VuaE_XXF)nS#o&4e%bWtmAhyD?&TdQG(*7t*T)QhA_=XR(K$4Bk z?%sfT(2;pb5m0(}eu9mON^bT86^DCmlM0YD1nzofHX*9tz4~-pz>mEY(c&Gv?T>!v z#_fyby2hxtD}-JDcb|9CFv5P5tW@~@wBQ5ws8M8ai3Nl=q=1%(2yZOeWh6IXVpt-kc?lz)vndm8qnkaAH+YuKJzeYSqWGo=u#davl}%L&i_UZp0vRzOjkq`w1AYWbE&SQDx?3iPuD=b84ib=D>7HS z!bgU+gUVG!dfWl`!g2}47p#F9gwOS z3<#5zwZ8YBOF#f)=}@3Hy7jPaGD$?_wqe%dw0A2HSSe^|-V5|z19MU)DZ1``6hWjK zRSMx0d=06Cv+1AEAB)-m9$w$JXJnxoO4A(ge!Lx(UuC#@5ib@%gOcORnc;;Z>u||A ztVO^fsmQlk(z^HV%4?lx20l(~;S*h&7W?!Y?}pbu&E(E-gMkmDoesNTr#5Ok=Pque zx)&nL9%6$~9paY;50`qf4b=F5ywS^O)5_P9WtZ#SB0O;GZSK|9)~jk#pLrgB9GPA_*VZSfY@8BO zH?%@8xc644W;!U6JLDtW6D)S>7`~sBK)GEGsjC8ZS{IEUlU@MAaFqDxKs1VI@l+@| ziZkx+#h<#mR!PpADX0nlaU=W}5fk_Z2WpO$p9Wcw_zK5g1;`Y<#;OHyAU zgTk!j(vqWH;C4yi>(yiu?_`X+5BYL1h$mqe_y9|1K5k~Vs)In8x7(8TER%L&{0V3y zQB<2txOAMIt7k{c0%b(9A|r_lnX#2fLvpWm=?Q^Hgt0hiGsy$pm|R34M{>O1^GLbW zzCwXauL93om3r;fRyC%*r@bS9h+1G~>~JD&tKGE%YHllj3;MRVCx_3pH12Fo_u24} z=3Pld9m4VU`$CS?<7K-X!pkdqw^j!8Qsz$UH@CCIz12Y6^UKB>wzYKURGzLq#_!0L zQ_CyBgB?m9G*7uIBImN)AGRgZVcpckhj#Ft2-i1QX}{DT6;@;Q}f%Gln*jHAnqb>2Hk4z z4vd}JgZM2|9ZRzfMZwIsx1ozb2;EGQi(wsOhg)B)EF$*TXY->0D8nEp`YVM+JaGC6 z9x^IbX%s~@ynq1!GSNS6ARST#XR)x>Ti$Rluj4lYn|R2b{sc%zrpLNfY1gxHx>Y&ofbXX(!Bd8 ztXRS7wP*32G=?fmq+g1X^Gf6TUq%4Zp;2}{h-duZxV94&F_a$3LHz3BcJel+(`b|8 zKsqACbD}$A-V;#YS9$Mt*-0I9H)?m!W#mT__BO+Td|G8SFr|Rfjm5gW%R1U{IfNs{ zi)Cnr?@1DOAo6TnP~Uo>BNdisFGL$vX-j#e=-}_(qSL16u6%kCQ_4@!N?L|$a73x3 zpzYJEwwUMb&@Bw0{m<&24Og)+`S52ycbgzvg&6|Jl_I}*Fw&kByr1tMxW+hqL8j%Eg2X<7Y?}1IERivBGmZ^ z*1S;#HcGrUY*33y6y?z=^zL6;Bw8QCVolB@X+HNA9w`dc-xK(Z^zd}@LGEV@7R@sE z@nLexGTP;Cd3e+dr;(2T2{uzuWB&lK0Q9| zg{DJ9sk}%~5NE8`)`nwrW%apnXVu`vYSLLF*gltgY$~b}><JcfcGejWme_-I z4~m~dA?FlRaVc{yd0&#qK|NN?2}0gUc}z zHo*UYXd+)bO0<5{dTTU%-{L)Eh%3gbwg`m&-LZVaB&uxOr^i?!ta_|TcUvH zCzr_Q(-wk7utWZCzrRI1!mL%m2{i6%x`}2JZ0I-2rK$Y6w&svld@4}~=vH3@iaFuJ zXW>)1H0jk(ef}NpC^i5l8crNk*b!jpHGES?BW=yc|JoGu>WEOJd!fng9sP@c6B01# ztJ2V79~q@`r2bd((S(EsW+8-IBV%bM{JQ6WvZ*2AMg#RmE^@PJI339as}831(q>Zx z_?mGBS1#j>XCAAUk?6|K*#p=>Ws!o7rz9?Fh8wixD&b-nbAdQ3HH8Z}vhVYZ5TtfV z@4kwLm@{!~=6^jsn8iVEjn!hu{^}0Vz5EPZc*EK5m_LGbNwFsxqlBPx$ye-GlJWe| z^Dd)HJ3YT8MK0EI%kS#^bru^pogdjed83q*!$bnK%*17I+}0D{!wY_tn;mj`8My#a z7sVT>JG|DTGRsnJ?Nf2|*^>2a160OmMkAh`aYObZII1 z&FVM5%MN|&j+q)=Epp?3pw9O|TO5WGn-CLfQ*0|4Vl-JaW|?MIe}^U}c8L0p5CAkH zpN%2Dtdhi-#1?>>+>N>A@Z6z13n5_is6yDLyk;0=t=#LG0N$Hw2W=+TOT0!qGWGSv z3TC>!zu@Lx1K-3B=o*LLf3?#TjBO$CJa`|ATX_VuUzMnavQFK7+kl<2!4oHi7Pf;g zxHI+^(ARptD!W}GmOsVBu^HPa=H?pzED3k~Y32BWDVd0We|~78kJ;!x!|O!M!a{@X zWlY4&!f8t)^YJ7qrG@$0bpIhU-UT46M)%ht}B~*bYLdO z*}(+eMq4q(3^rU+&t3y{MUevSc08*I&!qtkuPbVz%dF5?Ztblv5b|sC!XfvL2Mbf+ zPgx>Sojam|!DY;IlG5Av@BfL0Cc@Yl z?1Me*1EGq)f=ee}DU;{%0x6=z&ZOCozLjuzKPtHdg*`lucZ>EdGJi2ntqOXR&e~QS zR|nR6LUO@x9?md|6uB!n16mJt&YzzyvJVuKrUnm3v6x&p%+@^^F?MQ}MvH+QZ4osU z?fVCn>yO1>qT&1TO8$H(0$Zj;CUNUj!X9a}=4_{CzlB zXd9HsCJ2?D@N&Z?2y)`ZYHb6s-JJkCNz9IRRJ<#&eG+aPF2Pem}m$h=0 zV6VQ!{8JZ7s(126&h*_$N9|!qywVYHWY~opiuc82+e0#+AV1HfQm0Wqv?XLPKTVo- zyOi*s@vLzUC4h*1tnm*JMjR4TXgdH8o4aoE$l~&`>;OTG-y3jY0*ud^NTUuFs4C#* zZ@Om_NeG_PTT`)!HVb-c?jTjSgh z9Kj6?Blb@_@9HrO{e|`ii-c(od6lL433Yf_ppitQAw!y}eyi8K>{y@wssO4D1{}+a z?5B|o0`U}xW}YlRsW)b@JWoBb&oMK0#k+0z(kp9L3F?OMfs5nc3}4z(ppg!lsUlFn z9i)YaZ`wTg<5+C$@mDHHaS_pJj!apLG^7&q^u zZ#^VeXUCN!-@0zuFlkCxuF7_m;l12n=F$JrbTb7Y5aNYtF95v#XN-w)mVY19CeK1v zJDBfd{D*)`bzs@;^jswf)XFa0A??D|!}UHqJduP_bX&s%IINh8$<2SmxpoFY!L9l$ zo~`>Niu9pBMZY-1?x%<%oB+LlME~|Q=hCa%*r3JZeU#Cx;3v>*kQ&o^3T(ddlHWHa zXxge5Igp>ZCxiLt8C)lvd-IrWtC`@>L5Xe~guvrTXrqJq!VL%_e%wbH82Ng}S3y0) zt9-&g1er;@OCJ99R`w;gy{d5g#&t!@ zCuk|y6j3|bWk0jXd(+h39$0rw*eScqm?u#@&lm*FuD><=FL6Y_SU1@Vj>C@s<+y8) z2F299-y8wiQ-8?6@;%k&l*vg!&z5B(2&-HkF8WYQ#q-SdV?C|VG5!{H0u>c-(c?eeG-D3Oh#G6sM^q@^xpFFtY9ax zP*rynL$<5@rb-Oj@%+JTHKS`}YgEL`c;?=-5~Z*ldm621@ftId^*-(LeSKN#Mjnv) zJySZRhzrbMA`bNat}y_m&lZSVdE>aiRKd^x7IfFAp*9C2U((qvPFo4NCkyTgc=08{ zYY(7vboIB4jNW!+Z5Me2BYLis_WJ?-Rl3^+nzgg0ERN$0U>fQ}f0K&HP3ZBXmU>^J zJ|#`=$unOufqKmEvA6Lcl9vVlYIP38Bnq00JtH#osyuhVj+%rN^Gmif7H-$(YtV%+ zHh*zb{E=s$8mhmTCS=3Z>V;D~BA};w<$IH;0k^wHbYIkvJ=Xv6lP6^4S7bECIf9gE$J^KfSmp%W^4)pIo|9PM!cqfqxEjAZ ztu3H5x`wR9gN>Qwx>-|X1MG0hk?r>RG@7=6=Ql#oSDT%b(kyyDA?xpAp4U#Qm0ku6pa6FxP2DKI5-#9j zvu68V;gwv!-`|c(0h-d?KzQU1b3Gq1STx)cWA(jgJCG{xN~k&U-}Q)~fLYKX97+TO z3XN}ILbe~`-4gT#&oq97NYrzOSeTuB=&$E*SFs%TVCV-|q<{)C8jQ)I*Z&h=8mA8A z&8cu4s0`Ssf(u^#Z7oP9D@N2gRgU$KcmK|G#+kEp3G*dF;=DBPY!0!+Eu+O)zm_fd z(PY11RDoUPjbv%NgTWePcKR$Y7={5J?3I^JoE#Vkxl6M3!ny85`Sqm9-6QN4o{`0< z3fBrn3XS99Y3p)=qsOIj+9oLW78_G$;E5P6_7Tu@K0OSCH%FmtDt-rH`l8# zq}j~Q|GKi!f8z2YV2IBUue9G~f^w@|)E&`j@LSJwPdzSj$YVR}J2KW?(;ooY5d^=cw+TFbq46dnZItI#TLK0)A( z*qMwJfRF-5@C!`0j%Sypq9Kh(=l3M%b((h<#LD{u=9Mn>_h&=3I|s7grLPrh6%nP! zn9j$|=OG>}#V*gaFR;$kQ0yK>KBAh4fiPt{_D=6wRZ+7Nk}H^ctLBg}8rW&=!HGt% zQWt9ogAvN~!hE|~D-eDhcPr1dVET)A3y?9>nK_DsXJ?O%sr)Fni(37gKdc_TnB6FT zi~S}9R7i+ff&-LI=ahg^8yau;p~JN2K5FW(Uad&*dLKZ2@c~5Bl=+WoBdvCHW$UZ@ z@aM(AfQ!;VZL;mGnB3EBs?((>Z0~MpKBil!a5dBu(a&Gl1)G1+bwmd>f_jpgCx|Bz zffDroupuuEUZv{<&PCivx8`doJ`cf?IU!#b5umCwD^*6F@7dU6?`V= zNn5qkm zXyS6nB{W{Cu8yo(zX(0HRWhN|5*v}0$g{*|r75;3Xn`6{D>Cz?7X`(`i4*bUdWde352c+fL;iMo4VXbK?VEGpGUWa%j!~_mEuBV z?wNf<=7i~@j1fDy!V6J)MSKj{{6=V(=V<+s%^(J;GiLX>j+H;=irx%lxq>q1@U+r^ zg_pd*G+XO=XZjqeHCjZ&JeM%Vy8Fj_kE3fHFdz0y^I-%n_(aT-{iXwuga{4$+EP&- z4N=G`(5OBHm0x-JBhhvhPoF=ZS3{!UZ#TxCX^P|mwe}AVX%j(T@r>|?1yVA9lrQ@9 z1lAg+P*|kma@EBfu7ixoP(f#B1s$y;j4Q#xFgDlI#u#5rJcR0c_-fJ7Ni;)qk-ERcu?jY!Tf>w!ovaF zElMclunvqFAZ~=zSXft0i1nfyAPgJ82AQ~&emPI#i)}606iTQon%Q2TH$fiempQ*3 z0O4jp1{YGBWWwQq$R|6+8A4PJV&&UW&41)%W#=B9`xK41%}><@pK8EJdPJPB(E;Iq zadds;@#ESfs4w~o3KsR4Rs+PZ*IHHju3;8ha9Pj?6L_kb$$k6dJZMD)!*j=< z{>QP5z0aqd1^~x&C3+5~(LauAuhF3vXzry122mpkcX#An69FRtZ4wBY+&V`e?8jqF z9Q@L}dzIj0jZ^IEgV(lskaWx&?jE&ccchV`F~-E&50D|4NWzEl&&kU>7t&Wyb(mm* zEESW|j`NwIXH4);^s*v(yjNZIFkuuzmaC|;Yu3!bDfm=zm+z?T6!VS%_`N+kF;St1 zcK1H>W6Ej?jW%qJ;t4k;E{c&uFTGBj#DX>cIW_p?LKSUPJ=#Oy=*@ROX5@*Nxf=jj z6hm4i$q?(No`$&*RD{nTmtbh_P^h?Q<0`D&rI$crq4s;7o{+|lFDjz%a+|j5plW^1 z78*_gaz`~5&rjsEb_uMQ{wNOyXNfh*gg3ITMB{xK85bYqGK<7D#s@5p?BqC2O?ig- z(~C1h{s<341`l?AKvul+=r%TJd}FT$oJy)S4T4;vQ@+EV>ppiDLhtHOie0 zCteE4frNwF0S0H8C!@uBV%xUmPcy@$BI_I&pTQ3>_$Vsyr_()53kaj_P{x%ZcbIZC z#6+>F_YBRa?;U?^pSZSFx`dw0A|gJM8PJw1~Zf)XE3}6 z1fN`Mz;j?Z?Khj4)?4A^UIN*jdKah>=Eef@ao9{#K9M(E3vMJ!T#l_^O z$JV5Lh_mUDk!*Gc>o5(xI*AdERfYl9xH$V)rir;T%}y(o1l`Y=ttFkRY+r5D0(Z@C z(a}TOIw<&Z;vED^B!YKQu%)gtPBR(O-R&W^*k^p2||K0u`be}vntdB_C;<5o)vDUn?sTY*!D#WD|AbluB?@fo#fRePmqk=nWR9^oqORBgZp9uRbY)(xdDlgzf3 zCtmWbXj_mJ|FNCOyeCoJj>(IDyxbOxyf-J=Oke1#?X!SrupolTp0W7DZ)f$Poy^5G za2HO{8wlm@G`IGNo-g`YZ}5!WoodlO5Q()&z*{SF+?-EFw9cT5tHkB5@0+XeYo@uC zFA1Txi5-kH19I_`s*AI4r6@~lCQenzaEe0*IjofqfwoSP;vd%HddkR@X)kGXCwU*T zkt{=3>nv?=uO{|hkI21mST~(CSpWr@a;bs>vnQr`^IJCU45a7+6W~oZp3!J$l3@QQ zpPxvUy~B`lnQ__QB!{-1-dgIhd5J-jK)_T8 zmj%e3nB5aoy1l>o3vKTqHREJuzQ(yLHi_BqHH{4J*wnV+cbmM;bvhpGfQ;sspbzrn z%H&0z$W3#Py~M{GH_f2d4RWswr=@w<_hguW+mj3pF?hroQVLGXJlCp@g@88SU^U-* z6|>d4(6taz!Gd{v5oYIIC>8maom#d{Aa>?%ntT$zk!=@KS?k(`yni6asCI?*dQkkNO_isBo58W1>rXUD#+$KO_h?~*hwk81g z?8T;)98Jp6$c{9IBL1f|xhR5joZ>gk(16RBuL9zZS@m6ZikmNuWcMd#WxmFX#-&5a zK@u?lgBSK3Bzg9NKfH7q0xG?zNPI7&d}SvZ=a%y+QM)x41)<;w2YSFAS;ZTEH$fB;ovLk|<1xF*ZMF6DK{PV$ z27y7daC?zZoJ(5xIJt6b1BmDhldxF@dVJ##=_gY$Suy3Ed$!^1dJ|T2o;@4ALE8-A zTKg`XUVP(&tiFTKTx+SX-)(@rc|9Va6JxkSN3T^Vd9Opz*@hD`D=zhs7Rp(QhT)$Q~{hrW!QeU*P1 z)QkulkJv%y=r!`wCDn!J>__F$5KQ$p&$Q?x;hHL?SuJ=WFd}D`C#3*37yi`0Gd!Xd zH@|DYdN%;0r=BvHa<3M}l0;pt_4WHNU_E!KjX#BU4<=&UqGp=?o#shbt8j_W_Giyt zx+FhV%Tl)?17}J@f(o@1PHnXQx-kl4mKaui>7v3FM5ZqPG>wADW+HLG?5oIam{jC9 z*T(wr;f2Te==CiP`=CqGzms_e{5pA;K;xXTd`)@H>cTm?BOxdgUn`&V(}t$Fzt@`O zAXngXkf%Zm`W4VDKgc|$idqEVrj}(;Q-JA4tS;!$A zV5yk#C)~iV)6hu={LMU_C6s0|KZ%;yCE}u^17~89XAX zz+jeuWW^K$u8yTa4W1QUP%a(nPQmA(U<#dUdBi;P04Z`YX(?2e!d(_6AAX(qUX&z-v5T_w)Vxn-@*>B|F-$MZ_ zrvB*^w4XQvFSYFIt-Ab881aDP!+!`|cDm%;Zuuru=`j zzzm4OGOnWp=Q}x>ff7J4`0l@w3nf2>g@-hID`L+~F%&>kAttG^B7^|ZNPZ zkWlmk`2FR7f^tWYCUmw3go0gCq@A?c(u%t#Mu3PaV~ zT@0cDV5Il3zB{iXof3UG{`_mubx24!`)iE%#F%TF^OSVg@4EA;QherKno*W>$#?Hc z%H3$*3^|MP00|Y&-M9x&mT^qh_76)~v-{u)W@kn6Z!!-=C5H)uj4S1o%4bxk@eo2r zuO!&t2skp7u!G3JD7lk?r>s*ieqvn;H&_TTNaf-kyHwH+YN{!O9Rpnm^rzp&*h*oS z^GIye#k*w%e48(Ji>=VOSyNewaxoYG_r}I5%UN#Xngp4fhKE^0$#y~;ELTck5H`Sh z4r4!qaf_XY9%8KX zC)f7!vuhGfN=Eci0|wuK<#nG%Mu6W((qKOGZcfj~QQuPrHd>@-rei~=PUr-4WOzVu%A`SO`wcW~V+4q9k{hb&`~)Zo zY$uNv_%InJv!yL)_}d6XRbKpIuW|m}!;^Gl0%5IjWLFH(&SL!SCzKnKFyFW8oXc~< zlO=mUQA+ihlFb)XqWP+yP@S4bQ^t=ix0Bp|G0zj|qDlYHLrDUpo*w52H8>QmZ<4n9YvEKdTMqrp806)zaD`!5NHKD#C3JfzmT?Z|mgA5_A z2(#^Mstlj`!go}D34)heTaZH1$IYGnXA_0vuZrdYTxSc8Pu|e(;JPeXv%u%=u7b@w z%sIch7lpw|5;%6yZNT(>)o@8MbbD2ydsUV!j9kDF^2R$4@4W`gi_DbRl2OsLGMsAM_!&CmE<8wcGED%7PPO zsL&_2SU~P=!z#(n4#Jykjuj*>k*%NDzH^XwT?JYp-0mm<3C$q2XSZdQ*uYx%at>u* zs$YNd^y#^06K4`>2N`39({lFeJLACwb&PSaJ4%rcBKa6+PI3=z0HzY1&&|!fc0)#q zISJgtiz>`blNw#Zu5+`;wEi3}_CtN)i+vqlW1DrWoQxp44V?GBJP zD#6o0ER-kG^Y%*D`%Br%=Pl^$lIYjQsci0Y}{Zx?yPZRkI} z&l(nhG{80-itfn$cLLp@GPaqj)H2s~p&P^?OXZ+;-;#qzV?GSyb)sqOP@o<+XOF#4 zTsW^I6yDUlk(+Dv%_ba2U2VK)8gCZy@2#~a8}zUxC1#VJ^63RMe}Ba8|CGZLjnA>vW{ z`Cqzj#nq#8>L%4z9+J3J6IhDP1x_)nm@6g(N80Y$>~oSq`%8E3d{8*qfz$|-JD7Hx z2|UU#8?Q=0()b#G|0vgRAdc6fBDP|Y@@@~4M-3u}&Y<=wG{n-PSG;2_xeb`$qanPF z3jeL0FPC~%HhNo$Q!V%-3D5o|RpdP&*G2gZW9N}5Vr|Y7nnQQow3TKxP4% zOm}B)XM{9w!5yeFZ+cso^gtOvP76uwR0%ha=nyj|2Z$l-D*k^D7zIkA@-WWH)ZPRV z`md`Nb_7?-(3DG*D*`;4H?2lUFsmB(D<>uU5-vT$biAQ?$O$6Ua^kkomMn+js6X8=rr7YYXWwUJvv$p_>1JwuPaDuCrb38#)}9{? z)*~t2&@?N+gwi9zDjh183=y+@AD1>;B$&gmvc*Zs;VCS8DADlv!weC7E=LL}ajRAL zyLWr9Z4PEQOt}gwmCGeGd*^@7$dXVaMeRP;`29G0#IN)MFg@fVNhsv%J$ASKmlz9+JG(uK65}#86hc2D?f$~A%r{0UnTBJbn z3-AZ@RR)=c-uJ5KI#wZR%rp6v#p9<=wbdH{UfKiivf%I$kC+_rv;W>>+-k=Ek(nhe zX9K3<5uR6|>;_^LtbZ$C=;&!+ljo|y2(;>k;GcZp!4~xME-c+Zf&mARXEV*C8oe0) z^#}pjR+m|UWylX{d4gvPe{KfhCwprd&QB}#RXuPoEhst#H+Z`XXSWInC_}u+f;KU+ zER;VbncvU{<4ToU(f!BG9z!2~2C2TwGG00D_0yr8=pkYG%VHzRd%M!5rV zccjT7c_aSVRVCi;iEvJLw{q~C(`ZFLk^X9fVQ3BDK!e1WPNcu!@2RQo=aWQF<>(n< z_-$R=$p6a?7ZT{N`YZFU{%geLjiw^>4sFrRKqL!3Dton(d{wf=rOI9~B z(Rn=>H8cnTx!VK;5~mo)tWe{D6S^bvGyv!})H>4>;_V!rDAwC*K6?fk1pJ&|8UQ3; zyMtWFAcJ;nY(0VCtd0D|EaguqK+Rf~7$g|$iufm%osB4s(&o=~+z-P(h2mg@E1Dz8UWpNi#wJ>a1L6pkduAoU?ay&>eor`VmN0$qb-Oa|4q2{S z%ZoF$ru#RdERiYPiZGznYjVHyH=|^0vu0tmUN~+A)oXE>88pZn_XTsjq*L#M!5QQ| za@?%v6p9?KC!*nFkSzZTZ6!q!d%?q>@$x2GBOu!0R=7Q6O9LqI2^XsgKADJc!HIkK z=j|oW^FrvXd?TAC1nO{TWSXmOW9xn^$Fy2F(7_1auKa*VLAt!D&b8gx@i-FwRU(%d zevD4GXJ~-c<1x1SGbuDJ@C&&3U6s_iS!kU2Bd8mXU~BIyib@1=uxI!Q zG}fOjx#bSA*n%Z~N{m4eJ4z@V3jc;oVO|zs==LFgYdjG`38jPg6h%soWbWZUzo^*-XnUc4uNFH!RlRU ztXF0$l1es)CpieUP+nnADf@swEE}e~au;x^fSiB8+q4xLO4te9IpBFqb6g?md@32e zIR+nyU)Fca#ks3wKfOiv}1v^fXf08wP{zk4e$=IuBm7Ts#P zerk*K=YLB1DPZSV6nel?U;NKfe-DA$G%K0gc4C_{w!lc%tZYd{4`Te$1%&nwlv@tp zJh1X#c4Gx@!wD>jmJ&B>K8pOobiFY<^V@tuo2(&^o6E_Gql#`^dD?w)7WDN??_oUBGm7=b0F|N zAhJ_-5Hna|{l&?nm=0EBkJJeH*LRT}O!J*?c)$N)!ORuELxgDpW)!w_~%w;H~rB>D_?uwxI(qTD~Pt0q4y{ zPRCezq{hiN-C~@xCI%_QQM5Oy*CYw*aSn)(+qF(V?7CN@Ct2eR?2Ul^2Tm54oN%}R zNj70V)G9x-2hZ9q@uu|OF*Km%oyB}boi5Ac(ozorG7<4$Bm;3&6RNq!0<0J{wgyoI zL}Pe46BXfn?z+;yv=;qH$YK+IA;fP1^MM%}Tj=O3EKIX3*vo^>VE0P-a01jK%A6hd z)yEv!{;TZd;eCGiCOiiGRGfC3SML^zybpRHm4MxY`f6`w3vF$Y{xV&{BJ+Hp&Sl18 z2C~hBw1@;|Myun8?9;SKrOEdx8eiF zWa!U)*5iLhn1|YUOnPKHaSxDQ(S^B5s9U@9pId7OY3{&%35p%bue@KbN%$hQ++Rc?Wxd$B(f?}43{u%F78LE%D3)g1SYWY$+ov$%nQE5@* z^jJhZ^vGTxN-N^$H;PLir@QxJC~St=^LT!pS@zb^galG0IL!92krByz4V!qAo6wjQ z0$m;q7lEo^izpBL;XsN($gI@!nd{Zdl2PZ$Ct00C5dB{Nh=IqEW_%F~gDjqTo2v-y z;^(=0|8HHSJTSA)zIkI7je(iF(OcboMW;2ezc6|?4-;gqUC|Q5T-9h|zh$H4(0~RbGW2kK`H^WgX_xToH`}RuV z1iLb}M`lOy%O8{W-mT4FIT9)Bt|$iwN$ZD~&A`izRPWp$J=!s=kvgjO;BjOS=4JkG zQ%A~#e_yVXIE?c^VV4)3Y-X)}HK-lWx zS-4Rr#bNRornMAd8*l!L{#WydwSsDM^m6LxuN5$pR;|1yA$c#(UwCLUrIz;z*QrJR zB^COKw#_B=4m(T){13o^2`@lcO|_3VymFbDr=;^8cR{yXkj#BHnbNpT28K}V#uGvo zVV(??Lw%HI55w*k83G^|hh4{MU;C|ax^8@DYHxUQX{-ztg9?9Y7C8q@Yn7_9zEwva zhkn^%dhV-mR1frVF#&xLlc42>VWEF5t>F^vIAR#g!I-EFvTF5(L3EQv#asZy zf&Ue5IQ}n04gS{aKKfV&??OvRj9J->?)JRoNHtqAgKBe4%l%W2-^ab&th8xc65_2PnjVjqD#LVG^r(|- zPPg6yh@vizu+PS_`RK9uQ*%KFxJ|Ubo9fIx4kR|aLo5{vK13*DEM!)ZN@{bS`~rJl z3bj21-HdvrJ8f)RXY8Kp=>FIzoAbrR`_ywMI!nefNg|j!Qu|wdV0jzv57H?&5z@eWuC6qayfZMDAsXglsSx zRZ~Lbfu1d=E0uPQbTE5M6?ZNq|VgM$}A7{xGjt-QvmwbW(E*!X@}9tc-xU5e18(Du4K@6xuMGMJ-m(BM5>1~O5XRq#a$qt-)Vv0Pa z`Hkl1)}-41ltN#nT5eveeTe>fWC$kf_Qv2ISeVG4?Kw zX_ZjD%7Wup*~kw_7Nuk6P(_>MPAuZzhRe*RrIBuH`G|r5p-D6VoX3&rGKh}069RUD zU5($Fc3)(z-i3}jLpRG~PhNhi*7Er>M%t&KD7&&y`yg5{t{aK|e)^XcCTysB7TATf z$yHmXu5jJB2}Q-ks^0SvZY>q3ch7#Wa4^0(3L{4`YHz)q3sKKJ(yOlED{2sK<@(># z0EXKO6;}&nyw`dqqZZK0?GW~cZc23ht`5mhIwW`I2%$6PNS`#sH7-%3j^>i9wrJkd zev|6GwRxpOtf;mvfWWBA73+lyPzI)P|77(nUMC$GU2JIu`J&IwQKN2*3sAxO=`?+L zEilNAprjOmh%hcBr3w+mRC7bNspJwR4T1FnB(m&VvAJ|7b-;ki<{Rm?mlY}UmKsHW zCkHfd&84nG5wN}wlC1-I?QZ`F%ga=?vm9KDlNU_gHEIb5kEH9Ii(=;bXZU);Q?`h&&_eO7hegS@tNn&HP0D)$?rXV4s zb5)l4UD=_Dj$g8$4)|!*Yx7E9kMBR9uD*AAVzhD8z9PjxHSXfMF4wxjvq9%vu!s@H zntkXFO^4^A==|D;H;9L)=+{_7XG>cH-tP4`X|-3C$aLS08|&-YVz`wn*pxA~m94~- ztr>5s?cDSq{Skb5gsf<#jsxY%!kS$|2G)upphFYtBi z;jW7NqK9?w&b`dfD+UXAn2&fj+i*)}%E9y$` z`?3q$u3aS7xV$#m`}vDOjEbOFDcecR{14wHi)H@kFL!l9+mSIgib+d$>t)N}&p38IK&0v^1&$)$4Q@HZnV#z^6C!n$Sd4ePB# zVzd=53Gn&@hmhKeZ2gel?vj9Hk|Aoa>c%;8(49QfNyTGWKIA zP+IZUp+lBMCD9TO+1EWYWgji-pQ*z!6b8!Bu!HwE_#20N#m4U?^F`E6TU+wQXZ%A8~Ge85StR7I2wMuc{)udD-7}LQkEp zhQq7HC5$2-gKJ&Q$p_w~4t&P{CbTpPep0`%l*}ESB;ET zlW^YEv@|ZqOp?^v7wrN@%H#GDE(uz8VPS$6`Ax4FE0&A!*e=cscl~-qgt921`vGkYwIoygZorRh=!hyMfuN(Yp zfOJ*-QX`Yn?pr&H9sck=P@AMBVQJ+XZ^X1=D6J|-$#Cn}HCKZFayOZ|R}6N8U{W%* zL;qJ}JC_l+=Ha*g+f;V`YPq0O=y6`b{>|SeUj1~%l*Yyn-DfDSPe!b9b6fW{Bri+h zCaS}C;Jl5P4|d7Xv7zsg7 zVtjc=?&=WZ}l`-@0`S?1es_dqHLo*iL=ujn3WqU!uUAsTwqMdyF+$nLf{^7h^ zKzmWaJR7Voipv`b;IdbU^y{*`pxYUgJNgAj!<~f>{#`U@hPdz5%s11%H=z7=*xZPw zG;+AOq^WwdP;_kMJySxRpz6a)ttWK0a&fKeHd)as$Fbdqr|KMj zieKHhF+40&_Nryv9IMXQ@Eg-n=5di9H+Ko%%G7h|*a-vanp01ME1OLO&_jp@zhQhSTxo$BW=~gP0u>PqZn}ypQqB7j9)(w!`gN z45@k;mAmKXfcKigwQWsX79IzzF^c@ z^XOLK^#(_jFu$lWh0Ji$quGt)KKe%q7HogYB}sd_d+YQ3?WilF%G%!?cJ~r}@bP@m zx&K4do5w@_e(&RBmwl`yTT@gdm1N77kxCL~vQsL_zBKk-7=+}7v`|yFvG3U{iO3d4 z(bz>~CtLJ8PrX0i-@mU%FY|of_qnfg&UIbqe#V!YOZLtBPQ(fyEWxiTqUun?B0bAV4+z@zEzfC>kQHECOMH#>D{^!iI!6`~vo2W| zjb?W3HLEvIxsbbALZFWiJNIt!|9*0i@j~uWldx#1YRLsNw&DF6CsG%;R|arKE)nNQ zjHd&4!sBn9@(rE5tvc+T^2*HgUOBmr`z;m5Ye%9}RiUVvL$f)F@mW zG(W!ThM$|b+|#V2RJ{G^)^DYb)*9;aDOMrvB-D}zx{~AVLxPp?#)moI8E!3Zz>wFa zmJtPU#9K|d2Z@3)(@}56rV>%)1#Rh3=|gSllB~f05bd-N0WZBm9ryMZ{ay39NLt#5IjE03>T8>?@hc4Dc?F4@&;}#BOR@$>vmv)`q6UM0s>mrx*`ONlW zWaUh&J#P4Ny$+NJkvFU8X@2_wJA#2MdI?#yN6hEYXRlL>;*N7zMM@rF_8EE|C7Y|< za#;Q_cgnmeBpSM=JsbIfkZDQW3VFSXbL)kxDRN;OL4W$!d)+3qP#sl-!Z|90CCCq7zPx=A@7G@Siq=EvidQ~! zkJ9}tk*t<`GrJQyN21E`JE;Yz6Gfr*oe8nl8ZWbpoUF7j-XwM zo46T?^(Z4S>2E(w`QHxVVjLrAu3J~bYdxnAa;DdqcMJ`U_RWLWD&E}UOydc6tbn_Y zs?x&){=0BX6~VxZLUjh++^*A(>zjoaJmAX{S!nuqkGfI*&k5QLe_EG+1bl=4R(D^h z4(1EciDHy%&-ut>4dxqm6(>Jfote}%B-HJ}?j(1F5bLzYlR^m0`YQSpEk?-J7<@3z zDVs%hrVKQXW6VB*LqqlV@(FC{#N)|2Di`H;1kk6uqkdaeI}PMu=bjY;q@4ydxJ$T~ z3v7TRML5m?LMe;e=JR8ZlR@H8YIJv0I{kKD5t7b$?HOLPEcdxODVuYq z@>!IlBs^ zFvs=cO4c(`1i)R)rj? zvbLh>ykVh#9IZG+=$n9JGc5$C6J9|w9(Q+QhCZTT^%BbOMB31LwV3ha!q@|tw`+!? zv9_HRj8oKOIVFwEp$s z)~PLdzzthO7!?> zJyMAo9{3O`p}{9iVK*$j!dK59KLaI7ti@y@MudL99%|tp6yz9;ovK0l(2MtbW@KM+ z`<-C^;*L`ulyp1%SKtu2&~YHCnjlW-}Kp$h^}liT3-T^aNS|t9VSe1T03e~<`Q^#o*!PUzHrxTU+eyOg&eD%`li)5~*qkh8b z)dZasme^O{`y*{zrtePVsIm>S-Z-MSR`dBr9EbVg>Xrw*GRQxpqE<0W-6z-zR%?C@>C{@ea~->U|K$#& zdi2C6WIAB>>?U`H>A=pFYjUE2eQo| zD)hj+m*lig_$@4ba{-Og589Kh{(fYyp9jZV z`py^jxV|@YtL%|Y`1Ff$W-naZG?}a_$JQ`JXZvWj`gSx?wPX3z-{Rv3$VRaLG|UZ2 zTh=F^`UdAfDc^PL!&sgbV^7)Kk%W)dZi9a|_MeAbMLPOS|EavrCw{R%M~BU4s{8|w zdJb0|9ulp(M1QAe_zE&ePWheSg*}?QL_a(x;Zd zsb9+)(vy8-?~dSZzQ~PijOzF~ZTcMP7VgwcN}+>NQ<>y%_O&EEiEexYUpKk#r?!1o z-RdqhZbr}|$eU<$X&D>w#XYAR-wLYhBuuui)%;>e?ep{%XDZO>+_J)W8Lp-wkWAJb z{jfUnO}lkrbAYdsDaOek*C-X-=$c?in!XU(JiGDdixv_UpVxe?UP#t!C$L%KSJR}W zNA|$M5EcSxQ~42qlCs-=(P&-NvH2l#`dfysdnTPv7?djx9?y!9B%}4T8$aS(%86P} z8EYn3Sol{EU%Z)VNc^kv1^(=-C>^^+M8(jrebmsO@a8}zuU@}LT>C(giEFbfhv^+k zzPi-!^5VlRj%RpZk>eZQpQtIS|GSXjDPt-|Qdtj}x2N$FK(exQ)^r+8&Ffb;S055s z^?4ybtvLIriAmZ0d2ui`nR?6r2X-|#&+%g>3cEus$1JsDN8{gCg&yfYtsfjZj$IMB zaiq^@@TGk8cZ1c|`*mrmdphTXwie*g&Ht@dAc zIj$}z@`yjC%;F)&AT*~Ai%zdXGC=`7SBcZn?(0QI1Ry@;7EG+ zDELj3H!xwK@fqer`S@I8r`yZ8uz-uLy4(Hzr=w%HO8grsg9TI*YeT26gUfyitq+EY z)EvjZDy7d)Hu5OEEF+9hl3P29y)1NboVWuToxVqdIE^cMe*K46jlcZc!a?{PuNLgi zEPr^>*3F`;`VG=Fc%*FZj}!a4Zi&(>nmdwAuB)h4F6n}lev;_>Q0D8N;SP)&wYm9s zTKn_ryP3Bg&#ErUp<1Pp9zP2{>}1OCJd~?B)-Xknl16Q>9SzAvg2~!-q5_jYUEWYu z`^Q762bT$ID>9MT-^XX7nx3i! zHZTXtRsT)-o-!4s;G)wu|4r-GMS{0I*8>Z><{ZfUw=UB|E~!g{)Tgx%a*uB{r<_n- z_>Jbo0_@fc!FpQ5A;#>%2Op5CqpUvVv_75Aubp~j)OHNfyxM=OdEV1XfxI6Mt_fc4 z4i#~!tQJriYSLrZIaL<>!qHZX3%cq}ep+h@LZzY(oDV-`{ZO%rHeaoBUSb>4+rGj# zuP0H$Y25c8LBf3TlJ0rAUVi$UYK-HJ6zQ@9G(iGYPD8>JajbsRh*X#5imG}$x%X9B zIg${@HUg$sQSGG=4w9;r-ZCY7sz%Qd9J+OKaqC2nebYye9g2_6$o9{9Der}D`^S=8@k(Mjo_i)l@kn9WHh9J$*qw}RqNLSD)+B-GE zs3Mb4sCtLwb4uaOcPZYFqP*{p%_N9^U!)V5Mv- zxnI}&KCz$A6b~LB;ZXXayX|^r2Y+(Kg}_+YUB$rKF`WMK;$GU7ZfLb+`dX!BiMGz6 zp{=#nu75mHsZP+TbJ8}#BR$cE%qSRkQ&=6RhillfTQ$ZQ-}bM=u4Y`_``4O|&5||t zmGj7OV%Em`PN#svu20tBo`^(3UB%1=j;}7-#NK+=k+q{yV+nymd7~|Tll7y z+cNSu7k##&mP~fDJ``?DQF8TJvaMGB~8{7)mXWcz? z?$>v6XXt0OhI6Yw{4mcBT50^fP~r(fA@^I%O@}6{EeaR^5J3=Kx!w%PA@vUx4MtivO|e}_zpC%Z@Q&1gUD>}& z^71;)9`7W4?Wxz(yzU~ru+SFutAN*R{@Sl!Lu+E?PuBdxTqf-Aj_-pj2#zP$856v7 z2<-YL&>-otG%RqSbl^m3)}>vzm#Sz_X_>*Ayl6h~uhL)Djv zX&kTFSeAca9KoeOn}x{`tY=hzUlj%iom4P+A(%&MdyDlIOJL&Y$WvZ_HP)h?Gg<*< zq{6L={|c|xdK~wY*2y6ToMrwv-#(G_%vM;l#{tNEJ)Zah)Mx108Sv(FRsMIDlT5I^ zJQcvYtNB<-^A9OrX?Bc=M6K^UI*8f`f_lMEHh!x5lTrxLPKx=9DD4XG45Comu}RC) zNAeCANCxuVHAa;?8#oNntMkt0U$?%)H>T*HcmHstLd90V^bC33_Ed^+F$c!(9v$6J zSt0GfJ=entI_&o`UIml4>j2DqrjT-J&$B1Fe(aiUrfEmx<=~S_%ep9OiuCP%dR{eK zVGV3qVuy?(e`g#ZDIC$87ga9~<9sUb)4r<1* zLV0dwkXTAUtSWL6&Ug8))n7|-85kj7Z8S4A)1G4s={X5KSIql0!$~?f_9tWI51wkR z{D%<0(DBOxn`}EouG++7jZD(S;>(OL*E7Cot$KAiw2@>E$_2IzngszmxBP!UkZ-(y z`1g5-$NP%D6HUmHf$SkYT4cYB$d-|2BCqk(W}QY87qyk+ z>y^E<7&&crJUM{xg-r2oiY=(Fc76qawzqx3g{+OQhteO`E2hJYKd-moea?ekN`|Br zOUU358>dXlZDCDbIWiY8JZHtyAOPd*D@vy#cj-BJi_umL$^Q#E-%pzVcKYf*Zj(#;O;0&j$K^uk2Xs?kM3n z5XFN3u(Z*GM-4gyJUE9ctg36ID zDLR9+4|8Iq{%=si?ZdS90WAa7NM&g|y^V-q%(o{l>!$V?k|<}$peTHH&iM&}O<$$I z^zPh>*yHs?a^3r?^fTjMZk<}TiHELS9NQKPNaDXxBNvJ~gZsIFx4`S*3P8;yFR_dD z&$sZsQv(j*)NafrCB^?`EbQC`)+cclJyqA;gq)NeCdy=OE^kH8%UB{@k6y_28>CwQ zkD@gG`EX)+X`W32PhQS(fMlTnpX#fZWWVTLZ)A4`5Q`2$tPI*0&H@@hg%IuTTo>Cu zjW)l&yHjm3I>hM7}&}rzre+i$UT#1P}*h{xHS5pvr;LacY3Ps6MugMunh>q@2iVy-UfyZ zgf5q$(L@xfZci`y<;zGtGwogE4_~8G`1o&~%$oeNw;cU%O0U){RqQFvp7wOFToH#~ z;a}QVu@>`?4I(;xwdC+uU~?r+u2OGUoWtrtzuXnj2r37lIn9jhL2|mE>Z%j!FzAR! z>BpaGMN?u-5qzhAR~!}u#on&vIg;)<>$LBiPl*KtP3+3ex*^|6$>}XMK@tn(k=BN* z&P;`0tI`?gz)eG?`g58@aCOxoaV-kY9_F`RVVu>KB_+;pH@_3@8vn72rob-p`5iu> zFDn@!0;&QFU^oVK;aJgeg%g=tc|5kx0zibX;f-95U14{=F6RG?_?_iC?E31bHuc5V zw@y{RL)I(~0&JVhM3FEltZ-x?xfY_0E1IVU_kfAN(#k)oj_IGJ&3edU&;yt ztWrNH4(1rarGV0X&fna6*bqem8u#e;C;mtWam*yy88%L&CVMkDM{4o1BR}yFw_aBO z^kfe&BU7?3X8jRTfe3cAS~^?oW}UTE_Nk(O@@`z8_g*oALSUl8aH+9T=T6q>0}3U6 z|MCU{p~mBht(~9Rstl4EGxVj;*mqm5izl+#Q0v){JF9gR^-NI;(&TmVb&*p;hZig0Y4o5`$ts7f zjYicr@BYk`y3&t5uiNvd76S_ONr%hJWB(Yh8awgo#*pc1 zdgG-GO-|k5ykJ@eWzT6j8Rn1?=bWYf6I!8?)*F8F6}X97Bu9UAjXHdoJ7>NWaO}&X zj4>(n%O!T*`EperlHJmFx;Bj$C`Sx_CsIB;6~+QMBS((L8#;YR&t11Zp9QRR21P_j zV{=pNLSSQ6$kcUUUwtv+95louTl%ZWQhUkh3JJ3E* zMpZz|C5TO_n9|D>%^@rGB$tw+ZXZEtyy?}^H^u!f5b~KjG>{@P%={8ia5$qD9A=WH zyY0Cn+Yv^P-7J|)|2Fa(T(RBPB1dL|CiA>MY?>3vh@K@u5-QuR z8?{>Ihp^jIVm9sBX~{CuveTJi8CS3c3)|@(g>zy)J(Rp?o1F6RY*UdG>E4W}Rtxzp ziFoD1faFj*%2Rv^av^xtYMfXZd zj#VPaJQwQHd{lx20FJYV6*l?n8XjgThQ0Ko1!@=BkkkJBVkc)<#8hilm9ox~A4`w^ zvFpyL?9MaG@@8jyot*s>I)Y+wQ;UeHj zF*uMCTAi)!LsCoA_UcjK9Q-f|9u-hFR0kN^HBT^pSt5GGyh$`=SG? z7zixMrc$RF+QIoU4S%IHy)-9bjkb4CkkPGhqN?Cv{Gxf`6*BXidQCW>n4}CVRoOL-E z7536n_H=13$C>hs^GU7gRt!@zG^aOf!=2rq6(yW?W*3;^lG}s4hQ=XfMlrMgwNYov zHa79JWB-aC%Ger;63<&1X{p{d zvP@RaRn-7;d?PkW3^IW24N31=+!=&{N#u~(lEacTT5QjZM0tJoN*&vx@v(o>UE~GEdutA6Hbpk;9+qQ z!mtI^Q2+gmLB{^UH8~200=tUR0d!?eeV|EyRj6RZe5UH_sMZ^GcYW~LWb;Re>Zt+k zA+`+Jlh=yrxqh{3DW5q^l6mmwxE%asf-;d}rSHr8t+U*6CBJ|Fbf$glYXo7X-(Wja z?EA~3p(*1@%7{XkC|P9xs=Rf=N&E$XE^&2Ld#b_hF_dNUKhh5C0Vn&(p{Aorr~D?8 z8hW@wu75j+5-kC>#?upYX&YoSa3hGYwtMl(CA(SPlGU4zk>@SnoR8y<&)nSU3^eh) zdM_LEW2@FEdKd!-yES^ML`7!#AOvGEvPy>t9{HAZ*PC#4+Vp`Xa}wkSqj;2!vC)6p zf%D!ef6Ma0i@)JF4WvWTT{z%9SDz_#+N}(jR^Rdejg!KxU*LM3=0MfxdiBH(R6cvH z1snL0fkPqP=JLKd1ZMO%kSA>)VY#A)gR}kgUJkoVNNHJez3#ZySOU7&>0EM6(?R|2 z1W!`|=u^@7&|XTz>~W*IGx2Ziyu$1>hcXi+9a@uK*^Do{)iPV!!2(I)8^$c;mt~OS z#EC#tJ8k zaqQLl@sq5dTJKbjK=!$%4F)IsndTVwh47uwhfjk?Wxc48#NS9s`rrLEz28!J z*Bs`as>fMEVIh_rFPb2;1`?>hV84~lUSmklkE{I zG+?Wa1La{6_iqeHqplP>WlNy{IJmg{*+{Lh>4c;-&1!`~>jo3uhi=tVT;FbQAN}H1 zDc-@bAc&-;>}f>|GjL+fP`{!56aKwLS*b_Q&dJINm+njaEF+nD2eSeY+QqskX#gd3 zn`)p-eseayxyEf*-}!trtwgiJ+`wJSl(0EM=f@s?xWDIL&Z>-!@SHO*1A zS}5r>qMUYwyvx$O154p;Nrfxx{771awW4%(7QZIf{cG8>$n-?L9O{|3qo~URB8iIr2%fk~UPitGU3+CkVBta*Y@BJoQiRHLJ+^Tgiua&*LBDnMn`2ta$ zcc}(iGw-jajZ~!!z~dbeTt5ZE=RIyID`*L$GQ_^F(4d+CH#GTDgq1xk0pPH!8rU}z zC*V}bg_#bn5lp{qI%KOh-_RI-cGE(`1Jp7*R6XiMTUENxiYi{EvRZlh1w6MF6X2`i z>uDi}^(SN7U|D2j5?G_%w1VaNVtlzBA+U+axm-p{H--2AppV}UB)kSAp9eclpnTb{ zTZ#6vf~`pTg&KXQHPt|x{ALfc-W7?G{ZMcmF-0PYw757c6--C%!2kWQRcp|bb?*I% z-*VW$&!hfNywmr;%5HUI*Y=8&DiUJ4?QntaLCPD9@ims$mv z{%L3cakThf&NDZpd4)KvjvACZS)4Y*sseKS|E`ZL)%Bg?gET@;upe-_q12U_Gds^t z=G>T+##Ld9zW%m^_c)Hgw{HqD;CoeiR8&x%Y|3ZzBeZ3)2S`(+;2AnpTt6~XyX#2n zL+fhk=(J9t&cczK(lf7^Pp0r;aca2eg3^DlAr7zca;nsc!|G=w*5&2A%v|x@i|MOc zAYIlU3}J!o_am?BVCuTErV^h1ZJgns4-fvGCiaY>>CZV=|uzX>IA7X6LA z1CtBAt`L4&O-a()ZKxFh3Ae~8Uz-lg>RyPM=?KKA1paf#&rdE(mkY<1(ac(a46~IH z6%FTi?nTSDa>tF&ewG0TLz0ava9#b@U5Z`Hn{#05A$X!g^w5k}}Q-B#w zGzvoyOUl+Ky`M6_ndC#yhM6H2D1F&S#;chmSsVAIOH3JL0TcPF8;EFsVQ)EHmFop9 zG5TE^>RCIrhnOX3cTb*~^pPig>0DEM7^eS~U^~7y&_o`s8$KQ7#pO`LP5gaL9kL{* zs{$cKrgfmozRagr{0}k|^LDlj?tCs+y%-f_h*-pSk%i;s7lhp)H}0o-4WI;05_f95 zyB4_8kk^51q#s#Ty>*86t1VUIG=AgHM@~A0ek2#^9Xe%I0xj6)E5X40-4%;xz|)Z5 zoV+@7`9)c%l-1AS_a{8iLGs3)ojvSqDsV z$kb;=%Ha#>FM`o!brhu#2^nSsL_p>Va)PSj8_jSd*tWs}z2ukxoQY5F&u4a^4Mr z{Haet-@6W`c2h8KAYgon!W&)0lkf@oRMI(Y8<;IIB#F*1UzYId7I21$Q^}7${jx&d zJ|G*YIyj!X$8rZ-diJ^J>BW*Ryk0*)!`QC|WIWUG7RnU%U*muM@lWrp4k#6#a00$# z+1uBAJ8+GyP(zhES(9e1k@nuIp&?rY?H#q7y5kc;)wt;?)FK^mcN#ZQ2DWsH@Cp`@ zyTzYTX;Pp><+u8yO5NcW}i9x+weMWGS1NUYw;C{ zU9i|QOb5-DvR0ywx%~3Acr)@F0TjCH9RMG;=LI99Pa4ORGAzPDGweq-TiAYmvBUpL zNfXIf{Nx+q_yA>@-e3XvxMi|^W(*L}>>(?EX@T6=N#w;%%>IuJ!lEJy(%qw5j1vOi@_g#*fimQ%I0{+mB3 z=(fxM)K;36M0o0A;fDg^3I0RCoM3!#uVq@agQtt6$&K=eNap@&vPqTpdL`0>f;Xb= z&v#@wtn6n#bkls;CAPu1c5}VIGAPuDOz#~`&?xB#M7=zeJVd)>4Sd5x=~$k8==z3C zlDW{ckqv#4`-Ozg8sM)WPx}L`UH7udeqZ4P|DUeW^`d2~7BSrF{>uGxQW^T-76l!? zKXKU~5hf1+G!5ICB^77XWZjs+6WQwtJS$p7B%%P%AKq?ABLreFwoQZY$}#=`R>Zvp zkDWRAPXiO}oYjuDw$Dhm!5ZPPY7rxu?i@!~>-bStjC-T~lm)H{!hqejmHlFk-)|!ipMQ z9Ce4HE2{`72u_9-!(H_vdc+Zv^$Smju`|{vbWjXB{tt$9ZoFJt^P7F_?0>E2!h5co zd3*M8x9o`{e#1VWX{i(Xa<>?9w{qmcLMq-Zhu=%VCa!t>TsQ`S0IBEn9rqLao#qRiE^Os-uNf z^O*y+lL*s3N#s8w>JiWpI2f^8jeCEC4&G8O)E6%D8*2%zOs&%N}j zWVQh$(8Q|EdgsgotwXZa4?{uifz%U&U$0KY_R3iSYn+Cb%SyEE%+jbXnwXKWGuW;&6qNnZ;)Jh2`y?Wdkk!vz5v!W1;RnE$kP0BEBuUfA4sZ`C(D zn;aGYIFs9bbGL|DCwE6+RxSZZh6TCDA_n*SM3Qz{Gk(`#oAtfCAx}2=XZ)a1z)$*LsBL*vgQ_V-tFMypZNK6j3y6~9#-AR|r?L!<1LEyzmu0+M|#e@rY- zI`0M679%MTQNYI^r{_oe_5odBVok$Z@`CjNbRt%+R{}G1?n7XB&ZuLFP2P8;kk-$D zLJ>)P&WDUr#_oL<_>gIm#-3rPVD+XzzS117ysq))hEMU0yF+`+tBW`TAiZcS z;ufFps=rKVtvwXzV8>@r)(Kl2-l_AM zY0gw#Y}e?PP8{txj08@^OD}rOYynGmq(4K?+3LZ?`Z?sV+FfONusI=`p>p6crA<2G z;03Mm??Aqejj5f4$t85hOmz!E7G$hchGBV>q-?fK0#UWG>VV`wxp9*{NEN}1CCsKn zN9&(vByPVb_~kv^70wK6?gR(81Eu<<>N%05!FRHEv==EWT9o4!LVz^pdvg{t-eoMm zi9ABUnC#z=yC1d`H|ExBkJG(>!*w9IPMyA=N?kkL(fUk0BopPs?vZ!q^daqj)qvB8 zOr75ECM(tfltzdyruaRfqykR89BuDJ9)-PBp2JG&x{Hfz0r`*To*^YqYtp*zOaLY- zTx`m}fOxhSj%fWwi4rv!>mg0?yyM>GEiv}W<%xk0jHO^8(5Uu2E{C|>`e`nIvML2U z%D;a_M!u)TSJJD8&FwvVTc}RtK8UX;PL6zM+~uu}vjs)wtNho%10oml?%l-T@b!^H zGaUW@;dIfbTUrqgCeUgp<`d3sskhM&(# zuIhbn4Q7&B5)c9jd1_m1G@HDnw4AbY9;U* z24Pv@MlV0ed-t&7{jEGbht5MrvSY&-JM1>mw=M-gA84r#%Tx%e_%FwD|J&2}NqLQj zrY94fxj(^t_>f%wQ$^ZNfv90UxoO8eA=Y#p{H@8Y=}8eU2RTj;&MRZqzYPzsF9Y_x z0B7kzv}>wl$jw}3TW6uVq<1j90CJ3^OV+*{Q-19RY?VQ2Ts`^AZCgC~_ZcPl|2^249xrKg~q+$Ikl3F%xe?yGkCVS?G@Rj=c` zPO7TZa#H!D0FIV1?D#d5d!Cu3E?+XtP#GOJEp_Ut3d`!snl8c!uA24AK{Kv1zUvbC z$s$smY5V}L=%;9vd9x zs;X;ukm}x*jqTWTx*+@0fT~&9?9P(T>q<8{I+KQz8rZX1U01?`gIBs+6fYnYCCnvW zJyP0EH$IEHhCgGd=tq@iHjn}TQw2(J_Q}Fya?Qu(Q)v|(2kdZl_2XVBca#{LS*jyd zGj3#o5QWI7(0p_nq(^x996RH&ys+@dgfe*vTMo`}DeM9_(sm4sf^#|rIs>^RW47pj zV1EooiQjn`@BbHTe)Fw2|yZq(0icz=eV`fFLPm9vI8Q7~jO zB8sgC#P=h0`i?6STLIP<=X#p4&yvsn{yW2(x4TwXG+_3Fxp@s$dTrSiJDv@rwpL6` z$**%eQiu-g$b3pA7*#IAeD3iOxWNZ4C-~gi0;%tA-EHCzODYPUJk9y|wpI z7IREnjSe`}7q#m{`Q?Q!ttvPTq?KEjncTu6F z?eW6iEC1I+r_b(h-P##X@VZ!dafPT5D7be@rREWnu0#p2zn`UqnttLNlWEwJT^@fO z9{%l3(R;}EPY-@ElHW1oPxf*1^!%YQ!%aG$jCiu%K2lNTO?ynNeP0#rako%(E^%@z z8gUco2Gz6+81P=>2UZjPqi>9=! zZJqb`;Bib8(jqA%61!`5$l3|`?lCDtuC#7t-f@OjiDTk+xdRCrZ9~An2 zYI5!1@~Oj0SJrXrb#Ziq0%y!^w_o=}!F>dNb!$!VwE+BGxUkI262@vglNQUlFi)Zu z7r$f(^z@-)o{Q?WxPyY4Y?MGOx>^F@KaIhsBxfLZJ&- z<5NVA@<0EJNar6VfU81s&SCc8+1n0^-`!thebdAx`}E1u^~T7Q>PCc8A=Y~JInXs9 zjdQ&e#H{EF#}=)4!oToJS%JmQ?mX86tAeOxki?8N@Pnx!BpnO+5_kfp!J&z{f>!y9 zvU0OIp6v68aHnK!f$wd98S8+*+IIOq*^IpY+M$3{wH+`+z>bAJH@fw%@ z2I%!laNU}i4b|XBN=>xcXD3E9 zYLwVKnXCNN!mxf+P|!5#7=QF6omZwL$!Goq-#cCMdhv`+z~PWiB_c87IJ1GMQDQXI z%CGvoEPp$IQOC}&ZU_wLr~ip!roQ7zT*~GD{jOcsD&EPgsxuz@1itkzg4BbKNC5{3Q|@D2;?P*?^&LoRTh;Y z`pX`_S_v~gag??;@=r_GJh13M;XQE~RRDLU(v+IWnDBQd(C@r+n84*`XfE&mbT#4Xb9b|Q#(O_H^CE&w7?qQ^W2Hte z4yl0-4(VCZP3@Q1m{@~!Y#UEU^?gcCAF(22pJQZ9TK#C<*o|8hLO-K<(NLAcc#Uqo z(r$f{a;-9f4o%v8%>o+hJjx}6pyNF*2QhbZcX>Db>@M!TMA;?S1Y2YCqKY)$>h#U0 z7Y8%(Zm%VIm^FsoQFu&o^k>9HoWuL;?rQL_<9`JtY_p?&KxjUabmBf*_Zgx4!Bq^8 zs3zJubY*csb=-TOlZL~K04x2Zqu`3d3_p_!NhY<=kC^V?JTd&o*4lcs_*+SzQ&~P( z>O#Z_@npYGNDaAK^O+Sn;)?Vd(|hriVCJNiK$Sur2M&~*oAX8w7@{;&e~4M$+2YQo zwGY^D?YGraUvX39#QdSAP2Q}47~1xIsTI>Qlmjtv8-j{B+XSb=!uH;S7Ybad`R>@c zV~hFSSRBWY)pv#ua}7O1JtxuOOAmnj2sBR9EV=vD$nw+p^j{cRb&hQ`704ciPZsjL z9isW~H~%}^{yoiQi;U~v=<+ZPpre&)M+Pfkh`)X(abUuxFv`%7gp_J9y;bfgQ9#>1Y zsaDjp{>L4`-`VaD9p~*2K>XF*mQQ%}%d*eGofw=bC@>5%JOSx00l8==f_OZm6zVJH z9*5|o|D4AoYokW|t_VKZd77p3Gbf;v@gcd;8gDgONL@~dVD*XRy&(Mgxaf{M@%cc; zj=x1Ty?feVP;yqQrIq=1A9LZkXnBStFDtJ~ldyLTPD^Frut#OvY&$@nftx9k-P zy{~n`Kn5;I$W`XJGRNCB-(dAx--WZzAHtUnW zQ&Lm$Pl4N+8b&f1425 z!u`wyvyCW)PajSHQ=UBCiyDQBxAdFq3d8Q~02j#yc!8v7g$knu!Q!Z?Z~0HR>sBk} zLY2NMG+JU7FARJ8r^Pmjr^8h012cKu5ZWcW-on1+VgV2Vc!gsP-(W^VjZo`*VOrsq z2A^!+evvy|59cFZo^2(_)&iSy%PO?bVzx*o7$Orxx-g|^(3$jA?#;0Wv@_1^Cku;z zKi%Pl&$Y%~-rh33L+kV;)JQVS?@+Q%eM=RF1)?#8>dfZ&`rXW>7hY%KH_APzs)hkp z;14884z*19q}}!pXbWoSQ@IDD3Wq?Aj&A%Kk8&!RQw+jmMt%Zxh2L^p^?^z7CpG_O zBt8Iccvd?duE-L@95m&uh zeF&;-8XH>k#WQTq8#=tvMDyGAp>Ls{Z^kw}CX~L7?9ERQj3Q3;YCH@mCR|WKN&pX; z(Yud56=AAROXA8>jhuMRL?}^G9Of*VU0ryBHt-6-u;s%EzDSw;Hl^T4jYv(6*aTn~ z6a!YsiCPjtBKy53tbWR`-n2np;0ba;L{paxi0OCPn1_zIP2NY!ufzBvp*mI6RK#Hk zmSxBg@1a`mM(na8zn;2P;xdWmVT@HL;Nx07Z2deT`&XG+rW*>q zAr!&vHTaV&^IU`M8)Ld^1kCU%v|GP?U}%EKL4S`vyPIa404LX-*W!xTO=Y zD*6^^&X5&3%$sJ&=cXE>xwNHGRG)?n-HM+1W zR#ip0bza-^8EQBpd|#l0V=sIt?{f^Lg9)AZao3`?3h-UkN~o?whArB3@fp3tH^T9Y zDow6eJgJ}0fdRj?XUlwYSto7Juw$8j64C`4JX1Ka_4u%*s?-D8xbL}p&CQS8s?7pnLHu zoKu*mE5}dGKg^EYw&`tq+E42Hq1hd}1y}U8SB&Te3nT(FdhzcgAS=9^o0XW?Cj9Pw+q@i>*^(KN%^jOt$rLxa zYg9x!MlMV_^L3bzKum@F91pexwfd_rb770{S8Da>z() z;o1wb*-2jfgn7rzR^jRfx4t*jBa%TCa4I7Q*m?9r8MZOcz@_6vzV@1!ubYI^^@Xa{mfp-&?T6;)RP%WGP`S|cuR-^D}*3s-s zO8l(#*QxsUFe`WV5Zizg4N{OXP;(Hb>svKaIOA2*Op$_}VWk2&P$dyRF-vNYk(z+I zR+xF5HMUSjpZ|2@_zTgzFC%#D;3J?nTQ|=}fV~qgjvC-02sbuBqs=0IMMouubV!FXnuK5Ms1`(C&w>iN^w^wgWe`cfdS+&DYvrX2Jt*GzJX5wD^MLq3B__p|mfynBBiG(%Ok z2^xIO=c-B66&IoHr}LQs&pI*%%$l%#GR%q1%f)HXUQ79#E8eTWa$hk>cju)E+tFe|q@Lc`8u>TNUqN>Pa(omqpq0R>0+tRA z6R1_6nmc{^BX+@Gqio^^YM!anj(U0zZFA21tD>JLeCmb4$!Nx;#XiJu#E4gbDTL?D zmZp(oky8R-I1HFs25O%HDNr|*gZN=~@%u#8^CovNoc1PwFNITNU^NOs?fv=*DCnM89x_6Idw;VBiD2>j`Itiaf}p=VB5 z*`MF#t88U?h~4xhxOJ*Qi39@!;!WW%mwge(Dj$iw6nU$7-Wn|aHl(P>^J}Vx^v<*k zEZ8l<#aB+~cScJakwel59jBBr2xN8!GEiM)>?P0=aQHvuCV&F|?CIKDky(s5qYt6i z$Nti}JRs=o`-ofp3iA$MfOodlgP<#u94wC0o1ppshX$k32 z2QiQkhLo0;ZfOu0LJ$=NBuA;CyF*%#lJ0Ji?)uKnbwBUtZ=AjN8Aqbn;btSG1T?PGbLbY>bs{@UC{@GhNk}F0W|nT^K7lqAiXS+dCXO%UGWz=VGQyeW2Jevnn9RxKsAd zp$vZpo>oEQ&yofIdRq(Wf^B{^tsNr6gL~L^clkG>@w_WkEF{sf zxzVZy_c}Jf=)!bPfYxRXetYX^3}~WcS^`q7`_WRCUU#%u!HoLPy`(mM!H7i~Yde({ zYTCMPk9gL?cl?r>d}m|3g8W61oG}1VjN5MB%bGtgzfiR??v^AC^?9IpD&y^&=M*H# zSS!b{q^MSpz_t%ubvJ?wx!=BJUMr5wGAG@pdoI0wKE;CNzJI%}1SZyY#h3mTn&}1X zY^v3^3`_`MY_{BnyQBg=cc|bmlB_VigbN0+FTj3*2K`1RcAP;lXXJ~G(*#;jQo!9v zf)VAMs-dDM7V3RlZ&v@i`CMIg;TVL>p6g**9gBbH!dKdICAs8jpoX6`TkII~5<=Yt zk^loI0S`76v7#^ePc!CulS&?@ZL)n0Zjg(NeKOlL;__)W(0dVLLtBwxD8LK>^y$|- z1=iKG<&FRtBrNiP^%9Q^8Uh_3N!TmyyJpSM2#%sI^>>+>!`09D`P=sm|82igc(DJN zU-O0h(uL1e{jvz3p@tTg04xLF0w7$=xVYs00y*j=kn^B~0Toi&a@AR!oxX>uE)IgD zhw^0lccPkxiJT@&$#IUl{p%j%>bA9wUyfJBptzb2`|XfdIOM&1Q_C?Z3oB3&{si*^ zavI=*ym98?w4u;pBp8~eH6E{38!tQhka2BpgR$=A7DRk8bWug}GYSF+09U}*N zD;B?zIvIZSCMZ6e4kaSg>n<*umYa=RV*2X*tIm?w4-y-p=CazS&i#w0xEWW_`)E=m z>uEMc(9^%Z8hmzHz~t0KD7aYn&&)J`1abf1jPfH(U?1!FWhs9G7B$!FPlOXXzY-Zw)$rf@-Cz6BSnazWSxZnDoz_I{@+luN4?O18Af^gG*Ttz*O@eM}8l==yrPlIx9{tD;aH z%crZFH~{GqDOg*dZT+GZSZB^>LwR~5d13roZs06O*IqBqmZW}PiXD=~NumGqyF^A9 z`4v~LYJMAFx${tG@P;hl_;wVK(z$>G#{qVRYx?h~b$ONTQV?4OVZ%G44hq(M(AuhA z^PmgloPA!-_4Ia8Ikwhe1-YFjX}wzGEGo163Jx%2ex8pxo>7GjfodV*fGD#RC;M86}K@N8%#3`DEz2EJx^NByWgN$1H3EV< zR~736?5X=tI{znAC#VB7e|69oy{EV`;OH*N+I-h zoBB38*tiXfzOT1GdDB6#?R|F8UB4b&_-VUY51BnXEa@7NFf@9s(tT2M19)g8fO}rz z8Seh`^={bJn6#cmAQnM>mgwgLK!}W(qaYwd`x<;JwFpqgxGp#ON)ZZ(PI~_V9ow27 zZutq1AuP}M*w_Q0^~%K4{zc$3U?7}wuT!#N5}|||$cGkV?P+eR0)ZvZmChxIDdJuC zK8$}J^8^eEJfw@Ty{naM4utti*Y?WvE;W5j0QGedQ2U5rc7QR|UpetC0Eh;Hy2mRB6b{+# zbIa%Iwkl&z?@~;X_OHWZ6ht&Mvw@2<{)#nXGJk}wrwCwfZ5UzR=^T~n^>Af*Cno#dumiMlKuG`sH)a>2 zexF?wt`E_Mcb|gxG76ok^#-sO%l|uJ`9pDw-oDiYzonA`HLd9T8|}|Xhv1$s2Yaw$ z3;v1OqaixZ6q}>Dv>T=Bdv?mWd{{-@@1{5Ww25EYDWh60=2i-uPc9XhK6lzETf;L-NJcvJ@%iGue_uTR?t7*P=IZUx`A8|splkrp+Gv`Ex zNIjo%Xyy|v+!N;u!XS!NDe9Mf5`HEUYXhwWcD0vSJ}0LVTy7vYaS3l zc5`nXPzRq_0&T*!`6D)Wkly%O095IIHlSFLuZYV%mCVs^Nxla$k>Gt;xc+B!V1PW6 zsXG8&%$Z!>S7Ctnopo24kY|U> zFC(rz0eA!u4y(sosLJw+;t~XR_0{XisR#i42cacIVe=ygpxe|LvF_3TDF8#C^V1w_ zYsngzBWD#}q4W#sUrl&=#JQcJ7zG;sQd@W9Pd*)0M&1-t@}XExcW}4XHC<&Nal4hfZ!np z+w$}8+fXh(<=ZFvT`?92b*{lJA=p`<*QiRWz_!f#kQoGf?wcn8lt-*9?gjl_+C>+L zdH^tS@~Se)Z+X$)^>)C9VeZ|LseEc>O(1Yd?N3$C$AKY*Cm2m`xmW-DhN`wcE5L(+ zs#zSdJcW)d0fJf&@N@`!?HE_A)fbDji-&9qZEYas1o*}Sn#lPTQLGZ(^3Tt3S(c<9 z0YS`S&%t%y{|rcpqFF3MGCq%3*8{1ddK=0Yi5QutDkE7_gPhqwQk)%7vhw*Q|DNPZ{QvqRBmcxsIBX3bA=DX=&3;?ouQGxGt=nbR*|P_@c013y?vjMNl%F7R z<>l(s7u$~7fOc_N{~N@CS$DdPZe_>D+jGz* z@1z;hDei^EPX1BzH|8|#Zk1k zX?4HC2XVCPpfqTR=2YX1%kSqiCXx@tki29KJ2iapA$>>w;nA=sfLZgebBsZ_b*s09 zu|A|ARr;=u*@?W;GzbJpMD?4P6RiKfAaCwyDqGiFT6>0fK1>rmnXuYFzP|H5642Tx z8e(X~2FT@r~(@)F8kb=_V7y zMd;wv@(VpMityE*|1dk0s{N2WW%d=8^%>2$j&741bQ|QEKm`DK)>nx$6C*x6^hyAIBHEnl|K0N$5xGD4)fZ=op4 zP=$ch)JD7iP-9?uRp0C3�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 O/dev/null || echo "dev") + +echo "==================================" +echo " Multi-Architecture Docker Build" +echo "==================================" +echo "Image: ${IMAGE_NAME}:${TAG}" +echo "Version: ${VERSION}" +echo "Platforms: linux/amd64, linux/arm64" +echo "==================================" +echo "" + +# Check Docker login status (skip if CR_PAT is set for CI/CD) +if [ -z "$CR_PAT" ]; then + if ! docker info 2>/dev/null | grep -q "Username"; then + echo "⚠️ Warning: Not logged in to Docker registry" + echo "Please login first: docker login ghcr.io" + echo "Or set CR_PAT environment variable for automated login" + echo "" + read -p "Continue anyway? (y/n) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + fi +else + echo "Using CR_PAT environment variable for authentication" +fi + +# Check if buildx builder exists, create if not +if ! docker buildx ls | grep -q "desktop-linux"; then + echo "Creating buildx builder..." + docker buildx create --name desktop-linux --use + docker buildx inspect --bootstrap +else + echo "Using existing buildx builder: desktop-linux" + docker buildx use desktop-linux +fi + +echo "" +echo "Building and pushing multi-architecture image..." +echo "" + +# Build and push +docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --file ${DOCKERFILE} \ + --tag ${IMAGE_NAME}:${TAG} \ + --tag ${IMAGE_NAME}:${VERSION} \ + --push \ + . + +echo "" +echo "✓ Build and push complete!" +echo "" +echo "Images pushed:" +echo " - ${IMAGE_NAME}:${TAG}" +echo " - ${IMAGE_NAME}:${VERSION}" +echo "" +echo "Verifying multi-architecture manifest..." +echo "" + +# Verify +docker buildx imagetools inspect ${IMAGE_NAME}:${TAG} + +echo "" +echo "✓ Verification complete!" +echo "" +echo "Pull with: docker pull ${IMAGE_NAME}:${TAG}" diff --git a/LightRAG/docker-compose.yml b/LightRAG/docker-compose.yml new file mode 100644 index 00000000..da71faf8 --- /dev/null +++ b/LightRAG/docker-compose.yml @@ -0,0 +1,21 @@ +services: + lightrag: + container_name: lightrag + image: ghcr.io/hkuds/lightrag:latest + build: + context: . + dockerfile: Dockerfile + tags: + - ghcr.io/hkuds/lightrag:latest + ports: + - "${PORT:-9621}:9621" + volumes: + - ./data/rag_storage:/app/data/rag_storage + - ./data/inputs:/app/data/inputs + - ./config.ini:/app/config.ini + - ./.env:/app/.env + env_file: + - .env + restart: unless-stopped + extra_hosts: + - "host.docker.internal:host-gateway" diff --git a/LightRAG/docs/Algorithm.md b/LightRAG/docs/Algorithm.md new file mode 100644 index 00000000..992eed06 --- /dev/null +++ b/LightRAG/docs/Algorithm.md @@ -0,0 +1,4 @@ +![LightRAG Indexing Flowchart](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-VectorDB-Json-KV-Store-Indexing-Flowchart-scaled.jpg) +*Figure 1: LightRAG Indexing Flowchart - Img Caption : [Source](https://learnopencv.com/lightrag/)* +![LightRAG Retrieval and Querying Flowchart](https://learnopencv.com/wp-content/uploads/2024/11/LightRAG-Querying-Flowchart-Dual-Level-Retrieval-Generation-Knowledge-Graphs-scaled.jpg) +*Figure 2: LightRAG Retrieval and Querying Flowchart - Img Caption : [Source](https://learnopencv.com/lightrag/)* diff --git a/LightRAG/docs/DockerDeployment.md b/LightRAG/docs/DockerDeployment.md new file mode 100644 index 00000000..575359b4 --- /dev/null +++ b/LightRAG/docs/DockerDeployment.md @@ -0,0 +1,135 @@ +# LightRAG Docker Deployment + +A lightweight Knowledge Graph Retrieval-Augmented Generation system with multiple LLM backend support. + +## 🚀 Preparation + +### Clone the repository: + +```bash +# Linux/MacOS +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG +``` +```powershell +# Windows PowerShell +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG +``` + +### Configure your environment: + +```bash +# Linux/MacOS +cp .env.example .env +# Edit .env with your preferred configuration +``` +```powershell +# Windows PowerShell +Copy-Item .env.example .env +# Edit .env with your preferred configuration +``` + +LightRAG can be configured using environment variables in the `.env` file: + +**Server Configuration** + +- `HOST`: Server host (default: 0.0.0.0) +- `PORT`: Server port (default: 9621) + +**LLM Configuration** + +- `LLM_BINDING`: LLM backend to use (lollms/ollama/openai) +- `LLM_BINDING_HOST`: LLM server host URL +- `LLM_MODEL`: Model name to use + +**Embedding Configuration** + +- `EMBEDDING_BINDING`: Embedding backend (lollms/ollama/openai) +- `EMBEDDING_BINDING_HOST`: Embedding server host URL +- `EMBEDDING_MODEL`: Embedding model name + +**RAG Configuration** + +- `MAX_ASYNC`: Maximum async operations +- `MAX_TOKENS`: Maximum token size +- `EMBEDDING_DIM`: Embedding dimensions + +## 🐳 Docker Deployment + +Docker instructions work the same on all platforms with Docker Desktop installed. + +### Build Optimization + +The Dockerfile uses BuildKit cache mounts to significantly improve build performance: + +- **Automatic cache management**: BuildKit is automatically enabled via `# syntax=docker/dockerfile:1` directive +- **Faster rebuilds**: Only downloads changed dependencies when `uv.lock` or `bun.lock` files are modified +- **Efficient package caching**: UV and Bun package downloads are cached across builds +- **No manual configuration needed**: Works out of the box in Docker Compose and GitHub Actions + +### Start LightRAG server: + +```bash +docker compose up -d +``` + +LightRAG Server uses the following paths for data storage: + +``` +data/ +├── rag_storage/ # RAG data persistence +└── inputs/ # Input documents +``` + +### Updates + +To update the Docker container: +```bash +docker compose pull +docker compose down +docker compose up +``` + +### Offline deployment + +Software packages requiring `transformers`, `torch`, or `cuda` will is not preinstalled in the dokcer images. Consequently, document extraction tools such as Docling, as well as local LLM models like Hugging Face and LMDeploy, can not be used in an off line enviroment. These high-compute-resource-demanding services should not be integrated into LightRAG. Docling will be decoupled and deployed as a standalone service. + +## 📦 Build Docker Images + +### For local development and testing + +```bash +# Build and run with Docker Compose (BuildKit automatically enabled) +docker compose up --build + +# Or explicitly enable BuildKit if needed +DOCKER_BUILDKIT=1 docker compose up --build +``` + +**Note**: BuildKit is automatically enabled by the `# syntax=docker/dockerfile:1` directive in the Dockerfile, ensuring optimal caching performance. + +### For production release + + **multi-architecture build and push**: + +```bash +# Use the provided build script +./docker-build-push.sh +``` + +**The build script will**: + +- Check Docker registry login status +- Create/use buildx builder automatically +- Build for both AMD64 and ARM64 architectures +- Push to GitHub Container Registry (ghcr.io) +- Verify the multi-architecture manifest + +**Prerequisites**: + +Before building multi-architecture images, ensure you have: + +- Docker 20.10+ with Buildx support +- Sufficient disk space (20GB+ recommended for offline image) +- Registry access credentials (if pushing images) diff --git a/LightRAG/docs/FrontendBuildGuide.md b/LightRAG/docs/FrontendBuildGuide.md new file mode 100644 index 00000000..1e82c4f0 --- /dev/null +++ b/LightRAG/docs/FrontendBuildGuide.md @@ -0,0 +1,207 @@ +# Frontend Build Guide + +## Overview + +The LightRAG project includes a React-based WebUI frontend. This guide explains how frontend building works in different scenarios. + +## Key Principle + +- **Git Repository**: Frontend build results are **NOT** included (kept clean) +- **PyPI Package**: Frontend build results **ARE** included (ready to use) +- **Build Tool**: Uses **Bun** (not npm/yarn) + +## Installation Scenarios + +### 1. End Users (From PyPI) ✨ + +**Command:** +```bash +pip install lightrag-hku[api] +``` + +**What happens:** +- Frontend is already built and included in the package +- No additional steps needed +- Web interface works immediately + +--- + +### 2. Development Mode (Recommended for Contributors) 🔧 + +**Command:** +```bash +# Clone the repository +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG + +# Install in editable mode (no frontend build required yet) +pip install -e ".[api]" + +# Build frontend when needed (can be done anytime) +cd lightrag_webui +bun install --frozen-lockfile +bun run build +cd .. +``` + +**Advantages:** +- Install first, build later (flexible workflow) +- Changes take effect immediately (symlink mode) +- Frontend can be rebuilt anytime without reinstalling + +**How it works:** +- Creates symlinks to source directory +- Frontend build output goes to `lightrag/api/webui/` +- Changes are immediately visible in installed package + +--- + +### 3. Normal Installation (Testing Package Build) 📦 + +**Command:** +```bash +# Clone the repository +git clone https://github.com/HKUDS/LightRAG.git +cd LightRAG + +# ⚠️ MUST build frontend FIRST +cd lightrag_webui +bun install --frozen-lockfile +bun run build +cd .. + +# Now install +pip install ".[api]" +``` + +**What happens:** +- Frontend files are **copied** to site-packages +- Post-build modifications won't affect installed package +- Requires rebuild + reinstall to update + +**When to use:** +- Testing complete installation process +- Verifying package configuration +- Simulating PyPI user experience + +--- + +### 4. Creating Distribution Package 🚀 + +**Command:** +```bash +# Build frontend first +cd lightrag_webui +bun install --frozen-lockfile --production +bun run build +cd .. + +# Create distribution packages +python -m build + +# Output: dist/lightrag_hku-*.whl and dist/lightrag_hku-*.tar.gz +``` + +**What happens:** +- `setup.py` checks if frontend is built +- If missing, installation fails with helpful error message +- Generated package includes all frontend files + +--- + +## GitHub Actions (Automated Release) + +When creating a release on GitHub: + +1. **Automatically builds frontend** using Bun +2. **Verifies** build completed successfully +3. **Creates Python package** with frontend included +4. **Publishes to PyPI** using existing trusted publisher setup + +**No manual intervention required!** + +--- + +## Quick Reference + +| Scenario | Command | Frontend Required | Can Build After | +|----------|---------|-------------------|-----------------| +| From PyPI | `pip install lightrag-hku[api]` | Included | No (already installed) | +| Development | `pip install -e ".[api]"` | No | ✅ Yes (anytime) | +| Normal Install | `pip install ".[api]"` | ✅ Yes (before) | No (must reinstall) | +| Create Package | `python -m build` | ✅ Yes (before) | N/A | + +--- + +## Bun Installation + +If you don't have Bun installed: + +```bash +# macOS/Linux +curl -fsSL https://bun.sh/install | bash + +# Windows +powershell -c "irm bun.sh/install.ps1 | iex" +``` + +Official documentation: https://bun.sh + +--- + +## File Structure + +``` +LightRAG/ +├── lightrag_webui/ # Frontend source code +│ ├── src/ # React components +│ ├── package.json # Dependencies +│ └── vite.config.ts # Build configuration +│ └── outDir: ../lightrag/api/webui # Build output +│ +├── lightrag/ +│ └── api/ +│ └── webui/ # Frontend build output (gitignored) +│ ├── index.html # Built files (after running bun run build) +│ └── assets/ # Built assets +│ +├── setup.py # Build checks +├── pyproject.toml # Package configuration +└── .gitignore # Excludes lightrag/api/webui/* (except .gitkeep) +``` + +--- + +## Troubleshooting + +### Q: I installed in development mode but the web interface doesn't work + +**A:** Build the frontend: +```bash +cd lightrag_webui && bun run build +``` + +### Q: I built the frontend but it's not in my installed package + +**A:** You probably used `pip install .` after building. Either: +- Use `pip install -e ".[api]"` for development +- Or reinstall: `pip uninstall lightrag-hku && pip install ".[api]"` + +### Q: Where are the built frontend files? + +**A:** In `lightrag/api/webui/` after running `bun run build` + +### Q: Can I use npm or yarn instead of Bun? + +**A:** The project is configured for Bun. While npm/yarn might work, Bun is recommended per project standards. + +--- + +## Summary + +✅ **PyPI users**: No action needed, frontend included +✅ **Developers**: Use `pip install -e ".[api]"`, build frontend when needed +✅ **CI/CD**: Automatic build in GitHub Actions +✅ **Git**: Frontend build output never committed + +For questions or issues, please open a GitHub issue. diff --git a/LightRAG/docs/LightRAG_concurrent_explain.md b/LightRAG/docs/LightRAG_concurrent_explain.md new file mode 100644 index 00000000..8551ad26 --- /dev/null +++ b/LightRAG/docs/LightRAG_concurrent_explain.md @@ -0,0 +1,114 @@ +## LightRAG Multi-Document Processing: Concurrent Control Strategy + +LightRAG employs a multi-layered concurrent control strategy when processing multiple documents. This article provides an in-depth analysis of the concurrent control mechanisms at document level, chunk level, and LLM request level, helping you understand why specific concurrent behaviors occur. + +### 1. Document-Level Concurrent Control + +**Control Parameter**: `max_parallel_insert` + +This parameter controls the number of documents processed simultaneously. The purpose is to prevent excessive parallelism from overwhelming system resources, which could lead to extended processing times for individual files. Document-level concurrency is governed by the `max_parallel_insert` attribute within LightRAG, which defaults to 2 and is configurable via the `MAX_PARALLEL_INSERT` environment variable. `max_parallel_insert` is recommended to be set between 2 and 10, typically `llm_model_max_async/3`. Setting this value too high can increase the likelihood of naming conflicts among entities and relationships across different documents during the merge phase, thereby reducing its overall efficiency. + +### 2. Chunk-Level Concurrent Control + +**Control Parameter**: `llm_model_max_async` + +This parameter controls the number of chunks processed simultaneously in the extraction stage within a document. The purpose is to prevent a high volume of concurrent requests from monopolizing LLM processing resources, which would impede the efficient parallel processing of multiple files. Chunk-Level Concurrent Control is governed by the `llm_model_max_async` attribute within LightRAG, which defaults to 4 and is configurable via the `MAX_ASYNC` environment variable. The purpose of this parameter is to fully leverage the LLM's concurrency capabilities when processing individual documents. + +In the `extract_entities` function, **each document independently creates** its own chunk semaphore. Since each document independently creates chunk semaphores, the theoretical chunk concurrency of the system is: +$$ +ChunkConcurrency = Max Parallel Insert × LLM Model Max Async +$$ +For example: +- `max_parallel_insert = 2` (process 2 documents simultaneously) +- `llm_model_max_async = 4` (maximum 4 chunk concurrency per document) +- Theoretical chunk-level concurrent: 2 × 4 = 8 + +### 3. Graph-Level Concurrent Control + +**Control Parameter**: `llm_model_max_async * 2` + +This parameter controls the number of entities and relations processed simultaneously in the merging stage within a document. The purpose is to prevent a high volume of concurrent requests from monopolizing LLM processing resources, which would impede the efficient parallel processing of multiple files. Graph-level concurrency is governed by the `llm_model_max_async` attribute within LightRAG, which defaults to 4 and is configurable via the `MAX_ASYNC` environment variable. Graph-level parallelism control parameters are equally applicable to managing parallelism during the entity relationship reconstruction phase after document deletion. + +Given that the entity relationship merging phase doesn't necessitate LLM interaction for every operation, its parallelism is set at double the LLM's parallelism. This optimizes machine utilization while concurrently preventing excessive queuing resource contention for the LLM. + +### 4. LLM-Level Concurrent Control + +**Control Parameter**: `llm_model_max_async` + +This parameter governs the **concurrent volume** of LLM requests dispatched by the entire LightRAG system, encompassing the document extraction stage, merging stage, and user query handling. + +LLM request prioritization is managed via a global priority queue, which **systematically prioritizes user queries** over merging-related requests, and merging-related requests over extraction-related requests. This strategic prioritization **minimizes user query latency**. + +LLM-level concurrency is governed by the `llm_model_max_async` attribute within LightRAG, which defaults to 4 and is configurable via the `MAX_ASYNC` environment variable. + +### 5. Complete Concurrent Hierarchy Diagram + +```mermaid +graph TD +classDef doc fill:#e6f3ff,stroke:#5b9bd5,stroke-width:2px; +classDef chunk fill:#fbe5d6,stroke:#ed7d31,stroke-width:1px; +classDef merge fill:#e2f0d9,stroke:#70ad47,stroke-width:2px; + +A["Multiple Documents
max_parallel_insert = 2"] --> A1 +A --> B1 + +A1[DocA: split to n chunks] --> A_chunk; +B1[DocB: split to m chunks] --> B_chunk; + +subgraph A_chunk[Extraction Stage] + A_chunk_title[Entity Relation Extraction
llm_model_max_async = 4]; + A_chunk_title --> A_chunk1[Chunk A1]:::chunk; + A_chunk_title --> A_chunk2[Chunk A2]:::chunk; + A_chunk_title --> A_chunk3[Chunk A3]:::chunk; + A_chunk_title --> A_chunk4[Chunk A4]:::chunk; + A_chunk1 & A_chunk2 & A_chunk3 & A_chunk4 --> A_chunk_done([Extraction Complete]); +end + +subgraph B_chunk[Extraction Stage] + B_chunk_title[Entity Relation Extraction
llm_model_max_async = 4]; + B_chunk_title --> B_chunk1[Chunk B1]:::chunk; + B_chunk_title --> B_chunk2[Chunk B2]:::chunk; + B_chunk_title --> B_chunk3[Chunk B3]:::chunk; + B_chunk_title --> B_chunk4[Chunk B4]:::chunk; + B_chunk1 & B_chunk2 & B_chunk3 & B_chunk4 --> B_chunk_done([Extraction Complete]); +end +A_chunk -.->|LLM Request| LLM_Queue; + +A_chunk --> A_merge; +B_chunk --> B_merge; + +subgraph A_merge[Merge Stage] + A_merge_title[Entity Relation Merging
llm_model_max_async * 2 = 8]; + A_merge_title --> A1_entity[Ent a1]:::merge; + A_merge_title --> A2_entity[Ent a2]:::merge; + A_merge_title --> A3_entity[Rel a3]:::merge; + A_merge_title --> A4_entity[Rel a4]:::merge; + A1_entity & A2_entity & A3_entity & A4_entity --> A_done([Merge Complete]) +end + +subgraph B_merge[Merge Stage] + B_merge_title[Entity Relation Merging
llm_model_max_async * 2 = 8]; + B_merge_title --> B1_entity[Ent b1]:::merge; + B_merge_title --> B2_entity[Ent b2]:::merge; + B_merge_title --> B3_entity[Rel b3]:::merge; + B_merge_title --> B4_entity[Rel b4]:::merge; + B1_entity & B2_entity & B3_entity & B4_entity --> B_done([Merge Complete]) +end + +A_merge -.->|LLM Request| LLM_Queue["LLM Request Prioritized Queue
llm_model_max_async = 4"]; +B_merge -.->|LLM Request| LLM_Queue; +B_chunk -.->|LLM Request| LLM_Queue; + +``` + +> The extraction and merge stages share a global prioritized LLM queue, regulated by `llm_model_max_async`. While numerous entity and relation extraction and merging operations may be "actively processing", **only a limited number will concurrently execute LLM requests** the remainder will be queued and awaiting their turn. + +### 6. Performance Optimization Recommendations + +* **Increase LLM Concurrent Setting based on the capabilities of your LLM server or API provider** + +During the file processing phase, the performance and concurrency capabilities of the LLM are critical bottlenecks. When deploying LLMs locally, the service's concurrency capacity must adequately account for the context length requirements of LightRAG. LightRAG recommends that LLMs support a minimum context length of 32KB; therefore, server concurrency should be calculated based on this benchmark. For API providers, LightRAG will retry requests up to three times if the client's request is rejected due to concurrent request limits. Backend logs can be used to determine if LLM retries are occurring, thereby indicating whether `MAX_ASYNC` has exceeded the API provider's limits. + +* **Align Parallel Document Insertion Settings with LLM Concurrency Configurations** + +The recommended number of parallel document processing tasks is 1/4 of the LLM's concurrency, with a minimum of 2 and a maximum of 10. Setting a higher number of parallel document processing tasks typically does not accelerate overall document processing speed, as even a small number of concurrently processed documents can fully utilize the LLM's parallel processing capabilities. Excessive parallel document processing can significantly increase the processing time for each individual document. Since LightRAG commits processing results on a file-by-file basis, a large number of concurrent files would necessitate caching a substantial amount of data. In the event of a system error, all documents in the middle stage would require reprocessing, thereby increasing error handling costs. For instance, setting `MAX_PARALLEL_INSERT` to 3 is appropriate when `MAX_ASYNC` is configured to 12. diff --git a/LightRAG/docs/OfflineDeployment.md b/LightRAG/docs/OfflineDeployment.md new file mode 100644 index 00000000..e186dda0 --- /dev/null +++ b/LightRAG/docs/OfflineDeployment.md @@ -0,0 +1,317 @@ +# LightRAG Offline Deployment Guide + +This guide provides comprehensive instructions for deploying LightRAG in offline environments where internet access is limited or unavailable. + +If you deploy LightRAG using Docker, there is no need to refer to this document, as the LightRAG Docker image is pre-configured for offline operation. + +> Software packages requiring `transformers`, `torch`, or `cuda` will not be included in the offline dependency group. Consequently, document extraction tools such as Docling, as well as local LLM models like Hugging Face and LMDeploy, are outside the scope of offline installation support. These high-compute-resource-demanding services should not be integrated into LightRAG. Docling will be decoupled and deployed as a standalone service. + +## Table of Contents + +- [Overview](#overview) +- [Quick Start](#quick-start) +- [Layered Dependencies](#layered-dependencies) +- [Tiktoken Cache Management](#tiktoken-cache-management) +- [Complete Offline Deployment Workflow](#complete-offline-deployment-workflow) +- [Troubleshooting](#troubleshooting) + +## Overview + +LightRAG uses dynamic package installation (`pipmaster`) for optional features based on file types and configurations. In offline environments, these dynamic installations will fail. This guide shows you how to pre-install all necessary dependencies and cache files. + +### What Gets Dynamically Installed? + +LightRAG dynamically installs packages for: + +- **Storage Backends**: `redis`, `neo4j`, `pymilvus`, `pymongo`, `asyncpg`, `qdrant-client` +- **LLM Providers**: `openai`, `anthropic`, `ollama`, `zhipuai`, `aioboto3`, `voyageai`, `llama-index`, `lmdeploy`, `transformers`, `torch` +- **Tiktoken Models**: BPE encoding models downloaded from OpenAI CDN + +**Note**: Document processing dependencies (`pypdf`, `python-docx`, `python-pptx`, `openpyxl`) are now pre-installed with the `api` extras group and no longer require dynamic installation. + +## Quick Start + +### Option 1: Using pip with Offline Extras + +```bash +# Online environment: Install all offline dependencies +pip install lightrag-hku[offline] + +# Download tiktoken cache +lightrag-download-cache + +# Create offline package +pip download lightrag-hku[offline] -d ./offline-packages +tar -czf lightrag-offline.tar.gz ./offline-packages ~/.tiktoken_cache + +# Transfer to offline server +scp lightrag-offline.tar.gz user@offline-server:/path/to/ + +# Offline environment: Install +tar -xzf lightrag-offline.tar.gz +pip install --no-index --find-links=./offline-packages lightrag-hku[offline] +export TIKTOKEN_CACHE_DIR=~/.tiktoken_cache +``` + +### Option 2: Using Requirements Files + +```bash +# Online environment: Download packages +pip download -r requirements-offline.txt -d ./packages + +# Transfer to offline server +tar -czf packages.tar.gz ./packages +scp packages.tar.gz user@offline-server:/path/to/ + +# Offline environment: Install +tar -xzf packages.tar.gz +pip install --no-index --find-links=./packages -r requirements-offline.txt +``` + +## Layered Dependencies + +LightRAG provides flexible dependency groups for different use cases: + +### Available Dependency Groups + +| Group | Description | Use Case | +|-------|-------------|----------| +| `api` | API server + document processing | FastAPI server with PDF, DOCX, PPTX, XLSX support | +| `offline-storage` | Storage backends | Redis, Neo4j, MongoDB, PostgreSQL, etc. | +| `offline-llm` | LLM providers | OpenAI, Anthropic, Ollama, etc. | +| `offline` | Complete offline package | API + Storage + LLM (all features) | + +**Note**: Document processing (PDF, DOCX, PPTX, XLSX) is included in the `api` extras group. The previous `offline-docs` group has been merged into `api` for better integration. + +> Software packages requiring `transformers`, `torch`, or `cuda` will not be included in the offline dependency group. + +### Installation Examples + +```bash +# Install API with document processing +pip install lightrag-hku[api] + +# Install API and storage backends +pip install lightrag-hku[api,offline-storage] + +# Install all offline dependencies (recommended for offline deployment) +pip install lightrag-hku[offline] +``` + +### Using Individual Requirements Files + +```bash +# Storage backends only +pip install -r requirements-offline-storage.txt + +# LLM providers only +pip install -r requirements-offline-llm.txt + +# All offline dependencies +pip install -r requirements-offline.txt +``` + +## Tiktoken Cache Management + +Tiktoken downloads BPE encoding models on first use. In offline environments, you must pre-download these models. + +### Using the CLI Command + +After installing LightRAG, use the built-in command: + +```bash +# Download to default location (~/.tiktoken_cache) +lightrag-download-cache + +# Download to specific directory +lightrag-download-cache --cache-dir ./tiktoken_cache + +# Download specific models only +lightrag-download-cache --models gpt-4o-mini gpt-4 +``` + +### Default Models Downloaded + +- `gpt-4o-mini` (LightRAG default) +- `gpt-4o` +- `gpt-4` +- `gpt-3.5-turbo` +- `text-embedding-ada-002` +- `text-embedding-3-small` +- `text-embedding-3-large` + +### Setting Cache Location in Offline Environment + +```bash +# Option 1: Environment variable (temporary) +export TIKTOKEN_CACHE_DIR=/path/to/tiktoken_cache + +# Option 2: Add to ~/.bashrc or ~/.zshrc (persistent) +echo 'export TIKTOKEN_CACHE_DIR=~/.tiktoken_cache' >> ~/.bashrc +source ~/.bashrc + +# Option 3: Copy to default location +cp -r /path/to/tiktoken_cache ~/.tiktoken_cache/ +``` + +## Complete Offline Deployment Workflow + +### Step 1: Prepare in Online Environment + +```bash +# 1. Install LightRAG with offline dependencies +pip install lightrag-hku[offline] + +# 2. Download tiktoken cache +lightrag-download-cache --cache-dir ./offline_cache/tiktoken + +# 3. Download all Python packages +pip download lightrag-hku[offline] -d ./offline_cache/packages + +# 4. Create archive for transfer +tar -czf lightrag-offline-complete.tar.gz ./offline_cache + +# 5. Verify contents +tar -tzf lightrag-offline-complete.tar.gz | head -20 +``` + +### Step 2: Transfer to Offline Environment + +```bash +# Using scp +scp lightrag-offline-complete.tar.gz user@offline-server:/tmp/ + +# Or using USB/physical media +# Copy lightrag-offline-complete.tar.gz to USB drive +``` + +### Step 3: Install in Offline Environment + +```bash +# 1. Extract archive +cd /tmp +tar -xzf lightrag-offline-complete.tar.gz + +# 2. Install Python packages +pip install --no-index \ + --find-links=/tmp/offline_cache/packages \ + lightrag-hku[offline] + +# 3. Set up tiktoken cache +mkdir -p ~/.tiktoken_cache +cp -r /tmp/offline_cache/tiktoken/* ~/.tiktoken_cache/ +export TIKTOKEN_CACHE_DIR=~/.tiktoken_cache + +# 4. Add to shell profile for persistence +echo 'export TIKTOKEN_CACHE_DIR=~/.tiktoken_cache' >> ~/.bashrc +``` + +### Step 4: Verify Installation + +```bash +# Test Python import +python -c "from lightrag import LightRAG; print('✓ LightRAG imported')" + +# Test tiktoken +python -c "from lightrag.utils import TiktokenTokenizer; t = TiktokenTokenizer(); print('✓ Tiktoken working')" + +# Test optional dependencies (if installed) +python -c "import docling; print('✓ Docling available')" +python -c "import redis; print('✓ Redis available')" +``` + +## Troubleshooting + +### Issue: Tiktoken fails with network error + +**Problem**: `Unable to load tokenizer for model gpt-4o-mini` + +**Solution**: +```bash +# Ensure TIKTOKEN_CACHE_DIR is set +echo $TIKTOKEN_CACHE_DIR + +# Verify cache files exist +ls -la ~/.tiktoken_cache/ + +# If empty, you need to download cache in online environment first +``` + +### Issue: Dynamic package installation fails + +**Problem**: `Error installing package xxx` + +**Solution**: +```bash +# Pre-install the specific package you need +# For API with document processing: +pip install lightrag-hku[api] + +# For storage backends: +pip install lightrag-hku[offline-storage] + +# For LLM providers: +pip install lightrag-hku[offline-llm] +``` + +### Issue: Missing dependencies at runtime + +**Problem**: `ModuleNotFoundError: No module named 'xxx'` + +**Solution**: +```bash +# Check what you have installed +pip list | grep -i xxx + +# Install missing component +pip install lightrag-hku[offline] # Install all offline deps +``` + +### Issue: Permission denied on tiktoken cache + +**Problem**: `PermissionError: [Errno 13] Permission denied` + +**Solution**: +```bash +# Ensure cache directory has correct permissions +chmod 755 ~/.tiktoken_cache +chmod 644 ~/.tiktoken_cache/* + +# Or use a user-writable directory +export TIKTOKEN_CACHE_DIR=~/my_tiktoken_cache +mkdir -p ~/my_tiktoken_cache +``` + +## Best Practices + +1. **Test in Online Environment First**: Always test your complete setup in an online environment before going offline. + +2. **Keep Cache Updated**: Periodically update your offline cache when new models are released. + +3. **Document Your Setup**: Keep notes on which optional dependencies you actually need. + +4. **Version Pinning**: Consider pinning specific versions in production: + ```bash + pip freeze > requirements-production.txt + ``` + +5. **Minimal Installation**: Only install what you need: + ```bash + # If you only need API with document processing + pip install lightrag-hku[api] + # Then manually add specific LLM: pip install openai + ``` + +## Additional Resources + +- [LightRAG GitHub Repository](https://github.com/HKUDS/LightRAG) +- [Docker Deployment Guide](./DockerDeployment.md) +- [API Documentation](../lightrag/api/README.md) + +## Support + +If you encounter issues not covered in this guide: + +1. Check the [GitHub Issues](https://github.com/HKUDS/LightRAG/issues) +2. Review the [project documentation](../README.md) +3. Create a new issue with your offline deployment details diff --git a/LightRAG/docs/UV_LOCK_GUIDE.md b/LightRAG/docs/UV_LOCK_GUIDE.md new file mode 100644 index 00000000..f098e01f --- /dev/null +++ b/LightRAG/docs/UV_LOCK_GUIDE.md @@ -0,0 +1,170 @@ +# uv.lock Update Guide + +## What is uv.lock? + +`uv.lock` is uv's lock file. It captures the exact version of every dependency, including transitive ones, much like: +- Node.js `package-lock.json` +- Rust `Cargo.lock` +- Python Poetry `poetry.lock` + +Keeping `uv.lock` in version control guarantees that everyone installs the same dependency set. + +## When does uv.lock change? + +### Situations where it does *not* change automatically + +- Running `uv sync --frozen` +- Building Docker images that call `uv sync --frozen` +- Editing source code without touching dependency metadata + +### Situations where it will change + +1. **`uv lock` or `uv lock --upgrade`** + + ```bash + uv lock # Resolve according to current constraints + uv lock --upgrade # Re-resolve and upgrade to the newest compatible releases + ``` + + Use these commands after modifying `pyproject.toml`, when you want fresh dependency versions, or if the lock file was deleted or corrupted. + +2. **`uv add`** + + ```bash + uv add requests # Adds the dependency and updates both files + uv add --dev pytest # Adds a dev dependency + ``` + + `uv add` edits `pyproject.toml` and refreshes `uv.lock` in one step. + +3. **`uv remove`** + + ```bash + uv remove requests + ``` + + This removes the dependency from `pyproject.toml` and rewrites `uv.lock`. + +4. **`uv sync` without `--frozen`** + + ```bash + uv sync + ``` + + Normally this only installs what is already locked. However, if `pyproject.toml` and `uv.lock` disagree or the lock file is missing, uv will regenerate and update `uv.lock`. In CI and production builds you should prefer `uv sync --frozen` to prevent unintended updates. + +## Example workflows + +### Scenario 1: Add a new dependency + +```bash +# Recommended: let uv handle both files +uv add fastapi +git add pyproject.toml uv.lock +git commit -m "Add fastapi dependency" + +# Manual alternative +# 1. Edit pyproject.toml +# 2. Regenerate the lock file +uv lock +git add pyproject.toml uv.lock +git commit -m "Add fastapi dependency" +``` + +### Scenario 2: Relax or tighten a version constraint + +```bash +# 1. Edit the requirement in pyproject.toml, +# e.g. openai>=1.0.0,<2.0.0 -> openai>=1.5.0,<2.0.0 + +# 2. Re-resolve the lock file +uv lock + +# 3. Commit both files +git add pyproject.toml uv.lock +git commit -m "Update openai to >=1.5.0" +``` + +### Scenario 3: Upgrade everything to the newest compatible versions + +```bash +uv lock --upgrade +git diff uv.lock +git add uv.lock +git commit -m "Upgrade dependencies to latest compatible versions" +``` + +### Scenario 4: Teammate syncing the project + +```bash +git pull # Fetch latest code and lock file +uv sync --frozen # Install exactly what uv.lock specifies +``` + +## Using uv.lock in Docker + +```dockerfile +RUN uv sync --frozen --no-dev --extra api +``` + +`--frozen` guarantees reproducible builds because uv will refuse to deviate from the locked versions. +`--extra api` install API server + +## Generating a lock file that includes offline dependencies + +If you need `uv.lock` to capture the optional offline stacks, regenerate it with the relevant extras enabled: + +```bash +uv lock --extra api --extra offline +``` + +This command resolves the base project requirements plus both the `api` and `offline` optional dependency sets, ensuring downstream `uv sync --frozen --extra api --extra offline` installs work without further resolution. + +## Frequently asked questions + +- **`uv.lock` is almost 1 MB. Does that matter?** + No. The file is read only during dependency resolution. + +- **Should we commit `uv.lock`?** + Yes. Commit it so collaborators and CI jobs share the same dependency graph. + +- **Deleted the lock file by accident?** + Run `uv lock` to regenerate it from `pyproject.toml`. + +- **Can `uv.lock` and `requirements.txt` coexist?** + They can, but maintaining both is redundant. Prefer relying on `uv.lock` alone whenever possible. + +- **How do I inspect locked versions?** + ```bash + uv tree + grep -A5 'name = "openai"' uv.lock + ``` + +## Best practices + +### Recommended + +1. Commit `uv.lock` alongside `pyproject.toml`. +2. Use `uv sync --frozen` in CI, Docker, and other reproducible environments. +3. Use plain `uv sync` during local development if you want uv to reconcile the lock for you. +4. Run `uv lock --upgrade` periodically to pick up the latest compatible releases. +5. Regenerate the lock file immediately after changing dependency constraints. + +### Avoid + +1. Running `uv sync` without `--frozen` in CI or production pipelines. +2. Editing `uv.lock` by hand—uv will overwrite manual edits. +3. Ignoring lock file diffs in code reviews—unexpected dependency changes can break builds. + +## Summary + +| Command | Updates `uv.lock` | Typical use | +|-----------------------|-------------------|-------------------------------------------| +| `uv lock` | ✅ Yes | After editing constraints | +| `uv lock --upgrade` | ✅ Yes | Upgrade to the newest compatible versions | +| `uv add ` | ✅ Yes | Add a dependency | +| `uv remove ` | ✅ Yes | Remove a dependency | +| `uv sync` | ⚠️ Maybe | Local development; can regenerate the lock | +| `uv sync --frozen` | ❌ No | CI/CD, Docker, reproducible builds | + +Remember: `uv.lock` only changes when you run a command that tells it to. Keep it in sync with your project and commit it whenever it changes. diff --git a/LightRAG/env.example b/LightRAG/env.example new file mode 100644 index 00000000..60aaf0ed --- /dev/null +++ b/LightRAG/env.example @@ -0,0 +1,464 @@ +### This is sample file of .env + +########################### +### Server Configuration +########################### +HOST=0.0.0.0 +PORT=9621 +WEBUI_TITLE='My Graph KB' +WEBUI_DESCRIPTION="Simple and Fast Graph Based RAG System" +# WORKERS=2 +### gunicorn worker timeout(as default LLM request timeout if LLM_TIMEOUT is not set) +# TIMEOUT=150 +# CORS_ORIGINS=http://localhost:3000,http://localhost:8080 + +### Optional SSL Configuration +# SSL=true +# SSL_CERTFILE=/path/to/cert.pem +# SSL_KEYFILE=/path/to/key.pem + +### Directory Configuration (defaults to current working directory) +### Default value is ./inputs and ./rag_storage +# INPUT_DIR= +# WORKING_DIR= + +### Tiktoken cache directory (Store cached files in this folder for offline deployment) +# TIKTOKEN_CACHE_DIR=/app/data/tiktoken + +### Ollama Emulating Model and Tag +# OLLAMA_EMULATING_MODEL_NAME=lightrag +OLLAMA_EMULATING_MODEL_TAG=latest + +### Max nodes for graph retrieval (Ensure WebUI local settings are also updated, which is limited to this value) +# MAX_GRAPH_NODES=1000 + +### Logging level +# LOG_LEVEL=INFO +# VERBOSE=False +# LOG_MAX_BYTES=10485760 +# LOG_BACKUP_COUNT=5 +### Logfile location (defaults to current working directory) +# LOG_DIR=/path/to/log/directory + +##################################### +### Login and API-Key Configuration +##################################### +# AUTH_ACCOUNTS='admin:admin123,user1:pass456' +# TOKEN_SECRET=Your-Key-For-LightRAG-API-Server +# TOKEN_EXPIRE_HOURS=48 +# GUEST_TOKEN_EXPIRE_HOURS=24 +# JWT_ALGORITHM=HS256 + +### API-Key to access LightRAG Server API +### Use this key in HTTP requests with the 'X-API-Key' header +### Example: curl -H "X-API-Key: your-secure-api-key-here" http://localhost:9621/query +# LIGHTRAG_API_KEY=your-secure-api-key-here +# WHITELIST_PATHS=/health,/api/* + +###################################################################################### +### Query Configuration +### +### How to control the context length sent to LLM: +### MAX_ENTITY_TOKENS + MAX_RELATION_TOKENS < MAX_TOTAL_TOKENS +### Chunk_Tokens = MAX_TOTAL_TOKENS - Actual_Entity_Tokens - Actual_Relation_Tokens +###################################################################################### +# LLM response cache for query (Not valid for streaming response) +ENABLE_LLM_CACHE=true +# COSINE_THRESHOLD=0.2 +### Number of entities or relations retrieved from KG +# TOP_K=40 +### Maximum number or chunks for naive vector search +# CHUNK_TOP_K=20 +### control the actual entities send to LLM +# MAX_ENTITY_TOKENS=6000 +### control the actual relations send to LLM +# MAX_RELATION_TOKENS=8000 +### control the maximum tokens send to LLM (include entities, relations and chunks) +# MAX_TOTAL_TOKENS=30000 + +### chunk selection strategies +### VECTOR: Pick KG chunks by vector similarity, delivered chunks to the LLM aligning more closely with naive retrieval +### WEIGHT: Pick KG chunks by entity and chunk weight, delivered more solely KG related chunks to the LLM +### If reranking is enabled, the impact of chunk selection strategies will be diminished. +# KG_CHUNK_PICK_METHOD=VECTOR + +######################################################### +### Reranking configuration +### RERANK_BINDING type: null, cohere, jina, aliyun +### For rerank model deployed by vLLM use cohere binding +######################################################### +RERANK_BINDING=null +### Enable rerank by default in query params when RERANK_BINDING is not null +# RERANK_BY_DEFAULT=True +### rerank score chunk filter(set to 0.0 to keep all chunks, 0.6 or above if LLM is not strong enough) +# MIN_RERANK_SCORE=0.0 + +### For local deployment with vLLM +# RERANK_MODEL=BAAI/bge-reranker-v2-m3 +# RERANK_BINDING_HOST=http://localhost:8000/v1/rerank +# RERANK_BINDING_API_KEY=your_rerank_api_key_here + +### Default value for Cohere AI +# RERANK_MODEL=rerank-v3.5 +# RERANK_BINDING_HOST=https://api.cohere.com/v2/rerank +# RERANK_BINDING_API_KEY=your_rerank_api_key_here + +### Default value for Jina AI +# RERANK_MODEL=jina-reranker-v2-base-multilingual +# RERANK_BINDING_HOST=https://api.jina.ai/v1/rerank +# RERANK_BINDING_API_KEY=your_rerank_api_key_here + +### Default value for Aliyun +# RERANK_MODEL=gte-rerank-v2 +# RERANK_BINDING_HOST=https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank +# RERANK_BINDING_API_KEY=your_rerank_api_key_here + +######################################## +### Document processing configuration +######################################## +ENABLE_LLM_CACHE_FOR_EXTRACT=true + +### Document processing output language: English, Chinese, French, German ... +SUMMARY_LANGUAGE=English + +### PDF decryption password for protected PDF files +# PDF_DECRYPT_PASSWORD=your_pdf_password_here + +### Entity types that the LLM will attempt to recognize +# ENTITY_TYPES='["Person", "Creature", "Organization", "Location", "Event", "Concept", "Method", "Content", "Data", "Artifact", "NaturalObject"]' + +### Chunk size for document splitting, 500~1500 is recommended +# CHUNK_SIZE=1200 +# CHUNK_OVERLAP_SIZE=100 + +### Number of summary segments or tokens to trigger LLM summary on entity/relation merge (at least 3 is recommended) +# FORCE_LLM_SUMMARY_ON_MERGE=8 +### Max description token size to trigger LLM summary +# SUMMARY_MAX_TOKENS = 1200 +### Recommended LLM summary output length in tokens +# SUMMARY_LENGTH_RECOMMENDED_=600 +### Maximum context size sent to LLM for description summary +# SUMMARY_CONTEXT_SIZE=12000 + +### control the maximum chunk_ids stored in vector and graph db +# MAX_SOURCE_IDS_PER_ENTITY=300 +# MAX_SOURCE_IDS_PER_RELATION=300 +### control chunk_ids limitation method: FIFO, KEEP +### FIFO: First in first out +### KEEP: Keep oldest (less merge action and faster) +# SOURCE_IDS_LIMIT_METHOD=FIFO + +# Maximum number of file paths stored in entity/relation file_path field (For displayed only, does not affect query performance) +# MAX_FILE_PATHS=100 + +### maximum number of related chunks per source entity or relation +### The chunk picker uses this value to determine the total number of chunks selected from KG(knowledge graph) +### Higher values increase re-ranking time +# RELATED_CHUNK_NUMBER=5 + +############################### +### Concurrency Configuration +############################### +### Max concurrency requests of LLM (for both query and document processing) +MAX_ASYNC=4 +### Number of parallel processing documents(between 2~10, MAX_ASYNC/3 is recommended) +MAX_PARALLEL_INSERT=2 +### Max concurrency requests for Embedding +# EMBEDDING_FUNC_MAX_ASYNC=8 +### Num of chunks send to Embedding in single request +# EMBEDDING_BATCH_NUM=10 + +########################################################################### +### LLM Configuration +### LLM_BINDING type: openai, ollama, lollms, azure_openai, aws_bedrock, gemini +### LLM_BINDING_HOST: host only for Ollama, endpoint for other LLM service +### If LightRAG deployed in Docker: +### uses host.docker.internal instead of localhost in LLM_BINDING_HOST +########################################################################### +### LLM request timeout setting for all llm (0 means no timeout for Ollma) +# LLM_TIMEOUT=180 + +LLM_BINDING=openai +LLM_MODEL=gpt-4o +LLM_BINDING_HOST=https://api.openai.com/v1 +LLM_BINDING_API_KEY=your_api_key + +### Env vars for Azure openai +# AZURE_OPENAI_API_VERSION=2024-08-01-preview +# AZURE_OPENAI_DEPLOYMENT=gpt-4o + +### Openrouter example +# LLM_MODEL=google/gemini-2.5-flash +# LLM_BINDING_HOST=https://openrouter.ai/api/v1 +# LLM_BINDING_API_KEY=your_api_key +# LLM_BINDING=openai + +### Gemini example +# LLM_BINDING=gemini +# LLM_MODEL=gemini-flash-latest +# LLM_BINDING_API_KEY=your_gemini_api_key +# LLM_BINDING_HOST=https://generativelanguage.googleapis.com + +### use the following command to see all support options for OpenAI, azure_openai or OpenRouter +### lightrag-server --llm-binding gemini --help +### Gemini Specific Parameters +# GEMINI_LLM_MAX_OUTPUT_TOKENS=9000 +# GEMINI_LLM_TEMPERATURE=0.7 +### Enable Thinking +# GEMINI_LLM_THINKING_CONFIG='{"thinking_budget": -1, "include_thoughts": true}' +### Disable Thinking +# GEMINI_LLM_THINKING_CONFIG='{"thinking_budget": 0, "include_thoughts": false}' + +### use the following command to see all support options for OpenAI, azure_openai or OpenRouter +### lightrag-server --llm-binding openai --help +### OpenAI Specific Parameters +# OPENAI_LLM_REASONING_EFFORT=minimal +### OpenRouter Specific Parameters +# OPENAI_LLM_EXTRA_BODY='{"reasoning": {"enabled": false}}' +### Qwen3 Specific Parameters deploy by vLLM +# OPENAI_LLM_EXTRA_BODY='{"chat_template_kwargs": {"enable_thinking": false}}' + +### OpenAI Compatible API Specific Parameters +### Increased temperature values may mitigate infinite inference loops in certain LLM, such as Qwen3-30B. +# OPENAI_LLM_TEMPERATURE=0.9 +### Set the max_tokens to mitigate endless output of some LLM (less than LLM_TIMEOUT * llm_output_tokens/second, i.e. 9000 = 180s * 50 tokens/s) +### Typically, max_tokens does not include prompt content +### For vLLM/SGLang deployed models, or most of OpenAI compatible API provider +# OPENAI_LLM_MAX_TOKENS=9000 +### For OpenAI o1-mini or newer modles utilizes max_completion_tokens instead of max_tokens +OPENAI_LLM_MAX_COMPLETION_TOKENS=9000 + +### use the following command to see all support options for Ollama LLM +### lightrag-server --llm-binding ollama --help +### Ollama Server Specific Parameters +### OLLAMA_LLM_NUM_CTX must be provided, and should at least larger than MAX_TOTAL_TOKENS + 2000 +OLLAMA_LLM_NUM_CTX=32768 +### Set the max_output_tokens to mitigate endless output of some LLM (less than LLM_TIMEOUT * llm_output_tokens/second, i.e. 9000 = 180s * 50 tokens/s) +# OLLAMA_LLM_NUM_PREDICT=9000 +### Stop sequences for Ollama LLM +# OLLAMA_LLM_STOP='["
", "<|EOT|>"]' + +### Bedrock Specific Parameters +# BEDROCK_LLM_TEMPERATURE=1.0 + +####################################################################################### +### Embedding Configuration (Should not be changed after the first file processed) +### EMBEDDING_BINDING: ollama, openai, azure_openai, jina, lollms, aws_bedrock +### EMBEDDING_BINDING_HOST: host only for Ollama, endpoint for other Embedding service +### If LightRAG deployed in Docker: +### uses host.docker.internal instead of localhost in EMBEDDING_BINDING_HOST +####################################################################################### +# EMBEDDING_TIMEOUT=30 + +### Control whether to send embedding_dim parameter to embedding API +### IMPORTANT: Jina ALWAYS sends dimension parameter (API requirement) - this setting is ignored for Jina +### For OpenAI: Set to 'true' to enable dynamic dimension adjustment +### For OpenAI: Set to 'false' (default) to disable sending dimension parameter +### Note: Automatically ignored for backends that don't support dimension parameter (e.g., Ollama) + +# Ollama embedding +# EMBEDDING_BINDING=ollama +# EMBEDDING_MODEL=bge-m3:latest +# EMBEDDING_DIM=1024 +# EMBEDDING_BINDING_API_KEY=your_api_key +### If LightRAG deployed in Docker uses host.docker.internal instead of localhost +# EMBEDDING_BINDING_HOST=http://localhost:11434 + +### OpenAI compatible embedding +EMBEDDING_BINDING=openai +EMBEDDING_MODEL=text-embedding-3-large +EMBEDDING_DIM=3072 +EMBEDDING_SEND_DIM=false +EMBEDDING_TOKEN_LIMIT=8192 +EMBEDDING_BINDING_HOST=https://api.openai.com/v1 +EMBEDDING_BINDING_API_KEY=your_api_key + +### Optional for Azure +# AZURE_EMBEDDING_DEPLOYMENT=text-embedding-3-large +# AZURE_EMBEDDING_API_VERSION=2023-05-15 +# AZURE_EMBEDDING_ENDPOINT=your_endpoint +# AZURE_EMBEDDING_API_KEY=your_api_key + +### Gemini embedding +# EMBEDDING_BINDING=gemini +# EMBEDDING_MODEL=gemini-embedding-001 +# EMBEDDING_DIM=1536 +# EMBEDDING_TOKEN_LIMIT=2048 +# EMBEDDING_BINDING_HOST=https://generativelanguage.googleapis.com +# EMBEDDING_BINDING_API_KEY=your_api_key +### Gemini embedding requires sending dimension to server +# EMBEDDING_SEND_DIM=true + +### Jina AI Embedding +# EMBEDDING_BINDING=jina +# EMBEDDING_BINDING_HOST=https://api.jina.ai/v1/embeddings +# EMBEDDING_MODEL=jina-embeddings-v4 +# EMBEDDING_DIM=2048 +# EMBEDDING_BINDING_API_KEY=your_api_key + +### Optional for Ollama embedding +OLLAMA_EMBEDDING_NUM_CTX=8192 +### use the following command to see all support options for Ollama embedding +### lightrag-server --embedding-binding ollama --help + +#################################################################### +### WORKSPACE sets workspace name for all storage types +### for the purpose of isolating data from LightRAG instances. +### Valid workspace name constraints: a-z, A-Z, 0-9, and _ +#################################################################### +# WORKSPACE=space1 + +############################ +### Data storage selection +############################ +### Default storage (Recommended for small scale deployment) +# LIGHTRAG_KV_STORAGE=JsonKVStorage +# LIGHTRAG_DOC_STATUS_STORAGE=JsonDocStatusStorage +# LIGHTRAG_GRAPH_STORAGE=NetworkXStorage +# LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage + +### Redis Storage (Recommended for production deployment) +# LIGHTRAG_KV_STORAGE=RedisKVStorage +# LIGHTRAG_DOC_STATUS_STORAGE=RedisDocStatusStorage + +### Vector Storage (Recommended for production deployment) +# LIGHTRAG_VECTOR_STORAGE=MilvusVectorDBStorage +# LIGHTRAG_VECTOR_STORAGE=QdrantVectorDBStorage +# LIGHTRAG_VECTOR_STORAGE=FaissVectorDBStorage + +### Graph Storage (Recommended for production deployment) +# LIGHTRAG_GRAPH_STORAGE=Neo4JStorage +# LIGHTRAG_GRAPH_STORAGE=MemgraphStorage + +### PostgreSQL +# LIGHTRAG_KV_STORAGE=PGKVStorage +# LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage +# LIGHTRAG_GRAPH_STORAGE=PGGraphStorage +# LIGHTRAG_VECTOR_STORAGE=PGVectorStorage + +### MongoDB (Vector storage only available on Atlas Cloud) +# LIGHTRAG_KV_STORAGE=MongoKVStorage +# LIGHTRAG_DOC_STATUS_STORAGE=MongoDocStatusStorage +# LIGHTRAG_GRAPH_STORAGE=MongoGraphStorage +# LIGHTRAG_VECTOR_STORAGE=MongoVectorDBStorage + +### PostgreSQL Configuration +POSTGRES_HOST=localhost +POSTGRES_PORT=5432 +POSTGRES_USER=your_username +POSTGRES_PASSWORD='your_password' +POSTGRES_DATABASE=your_database +POSTGRES_MAX_CONNECTIONS=12 +# POSTGRES_WORKSPACE=forced_workspace_name + +### PostgreSQL Vector Storage Configuration +### Vector storage type: HNSW, IVFFlat +POSTGRES_VECTOR_INDEX_TYPE=HNSW +POSTGRES_HNSW_M=16 +POSTGRES_HNSW_EF=200 +POSTGRES_IVFFLAT_LISTS=100 + +### PostgreSQL Connection Retry Configuration (Network Robustness) +### Number of retry attempts (1-10, default: 3) +### Initial retry backoff in seconds (0.1-5.0, default: 0.5) +### Maximum retry backoff in seconds (backoff-60.0, default: 5.0) +### Connection pool close timeout in seconds (1.0-30.0, default: 5.0) +# POSTGRES_CONNECTION_RETRIES=3 +# POSTGRES_CONNECTION_RETRY_BACKOFF=0.5 +# POSTGRES_CONNECTION_RETRY_BACKOFF_MAX=5.0 +# POSTGRES_POOL_CLOSE_TIMEOUT=5.0 + +### PostgreSQL SSL Configuration (Optional) +# POSTGRES_SSL_MODE=require +# POSTGRES_SSL_CERT=/path/to/client-cert.pem +# POSTGRES_SSL_KEY=/path/to/client-key.pem +# POSTGRES_SSL_ROOT_CERT=/path/to/ca-cert.pem +# POSTGRES_SSL_CRL=/path/to/crl.pem + +### PostgreSQL Server Settings (for Supabase Supavisor) +# Use this to pass extra options to the PostgreSQL connection string. +# For Supabase, you might need to set it like this: +# POSTGRES_SERVER_SETTINGS="options=reference%3D[project-ref]" + +# Default is 100 set to 0 to disable +# POSTGRES_STATEMENT_CACHE_SIZE=100 + +### Neo4j Configuration +NEO4J_URI=neo4j+s://xxxxxxxx.databases.neo4j.io +NEO4J_USERNAME=neo4j +NEO4J_PASSWORD='your_password' +NEO4J_DATABASE=neo4j +NEO4J_MAX_CONNECTION_POOL_SIZE=100 +NEO4J_CONNECTION_TIMEOUT=30 +NEO4J_CONNECTION_ACQUISITION_TIMEOUT=30 +NEO4J_MAX_TRANSACTION_RETRY_TIME=30 +NEO4J_MAX_CONNECTION_LIFETIME=300 +NEO4J_LIVENESS_CHECK_TIMEOUT=30 +NEO4J_KEEP_ALIVE=true +# NEO4J_WORKSPACE=forced_workspace_name + +### MongoDB Configuration +MONGO_URI=mongodb://root:root@localhost:27017/ +#MONGO_URI=mongodb+srv://xxxx +MONGO_DATABASE=LightRAG +# MONGODB_WORKSPACE=forced_workspace_name + +### Milvus Configuration +MILVUS_URI=http://localhost:19530 +MILVUS_DB_NAME=lightrag +# MILVUS_USER=root +# MILVUS_PASSWORD=your_password +# MILVUS_TOKEN=your_token +# MILVUS_WORKSPACE=forced_workspace_name + +### Qdrant +QDRANT_URL=http://localhost:6333 +# QDRANT_API_KEY=your-api-key +# QDRANT_WORKSPACE=forced_workspace_name + +### Redis +REDIS_URI=redis://localhost:6379 +REDIS_SOCKET_TIMEOUT=30 +REDIS_CONNECT_TIMEOUT=10 +REDIS_MAX_CONNECTIONS=100 +REDIS_RETRY_ATTEMPTS=3 +# REDIS_WORKSPACE=forced_workspace_name + +### Memgraph Configuration +MEMGRAPH_URI=bolt://localhost:7687 +MEMGRAPH_USERNAME= +MEMGRAPH_PASSWORD= +MEMGRAPH_DATABASE=memgraph +# MEMGRAPH_WORKSPACE=forced_workspace_name + +############################ +### Evaluation Configuration +############################ +### RAGAS evaluation models (used for RAG quality assessment) +### ⚠️ IMPORTANT: Both LLM and Embedding endpoints MUST be OpenAI-compatible +### Default uses OpenAI models for evaluation + +### LLM Configuration for Evaluation +# EVAL_LLM_MODEL=gpt-4o-mini +### API key for LLM evaluation (fallback to OPENAI_API_KEY if not set) +# EVAL_LLM_BINDING_API_KEY=your_api_key +### Custom OpenAI-compatible endpoint for LLM evaluation (optional) +# EVAL_LLM_BINDING_HOST=https://api.openai.com/v1 + +### Embedding Configuration for Evaluation +# EVAL_EMBEDDING_MODEL=text-embedding-3-large +### API key for embeddings (fallback: EVAL_LLM_BINDING_API_KEY -> OPENAI_API_KEY) +# EVAL_EMBEDDING_BINDING_API_KEY=your_embedding_api_key +### Custom OpenAI-compatible endpoint for embeddings (fallback: EVAL_LLM_BINDING_HOST) +# EVAL_EMBEDDING_BINDING_HOST=https://api.openai.com/v1 + +### Performance Tuning +### Number of concurrent test case evaluations +### Lower values reduce API rate limit issues but increase evaluation time +# EVAL_MAX_CONCURRENT=2 +### TOP_K query parameter of LightRAG (default: 10) +### Number of entities or relations retrieved from KG +# EVAL_QUERY_TOP_K=10 +### LLM request retry and timeout settings for evaluation +# EVAL_LLM_MAX_RETRIES=5 +# EVAL_LLM_TIMEOUT=180 diff --git a/LightRAG/env.ollama-binding-options.example b/LightRAG/env.ollama-binding-options.example new file mode 100644 index 00000000..f3c8181e --- /dev/null +++ b/LightRAG/env.ollama-binding-options.example @@ -0,0 +1,195 @@ +################################################################################ +# Autogenerated .env entries list for LightRAG binding options +# +# To generate run: +# $ python -m lightrag.llm.binding_options +################################################################################ +# ollama_embedding -- Context window size (number of tokens) +# OLLAMA_EMBEDDING_NUM_CTX=4096 + +# ollama_embedding -- Maximum number of tokens to predict +# OLLAMA_EMBEDDING_NUM_PREDICT=128 + +# ollama_embedding -- Number of tokens to keep from the initial prompt +# OLLAMA_EMBEDDING_NUM_KEEP=0 + +# ollama_embedding -- Random seed for generation (-1 for random) +# OLLAMA_EMBEDDING_SEED=-1 + +# ollama_embedding -- Controls randomness (0.0-2.0, higher = more creative) +# OLLAMA_EMBEDDING_TEMPERATURE=0.8 + +# ollama_embedding -- Top-k sampling parameter (0 = disabled) +# OLLAMA_EMBEDDING_TOP_K=40 + +# ollama_embedding -- Top-p (nucleus) sampling parameter (0.0-1.0) +# OLLAMA_EMBEDDING_TOP_P=0.9 + +# ollama_embedding -- Tail free sampling parameter (1.0 = disabled) +# OLLAMA_EMBEDDING_TFS_Z=1.0 + +# ollama_embedding -- Typical probability mass (1.0 = disabled) +# OLLAMA_EMBEDDING_TYPICAL_P=1.0 + +# ollama_embedding -- Minimum probability threshold (0.0 = disabled) +# OLLAMA_EMBEDDING_MIN_P=0.0 + +# ollama_embedding -- Number of tokens to consider for repetition penalty +# OLLAMA_EMBEDDING_REPEAT_LAST_N=64 + +# ollama_embedding -- Penalty for repetition (1.0 = no penalty) +# OLLAMA_EMBEDDING_REPEAT_PENALTY=1.1 + +# ollama_embedding -- Penalty for token presence (-2.0 to 2.0) +# OLLAMA_EMBEDDING_PRESENCE_PENALTY=0.0 + +# ollama_embedding -- Penalty for token frequency (-2.0 to 2.0) +# OLLAMA_EMBEDDING_FREQUENCY_PENALTY=0.0 + +# ollama_embedding -- Mirostat sampling algorithm (0=disabled, 1=Mirostat 1.0, 2=Mirostat 2.0) +# OLLAMA_EMBEDDING_MIROSTAT=0 + +# ollama_embedding -- Mirostat target entropy +# OLLAMA_EMBEDDING_MIROSTAT_TAU=5.0 + +# ollama_embedding -- Mirostat learning rate +# OLLAMA_EMBEDDING_MIROSTAT_ETA=0.1 + +# ollama_embedding -- Enable NUMA optimization +# OLLAMA_EMBEDDING_NUMA=False + +# ollama_embedding -- Batch size for processing +# OLLAMA_EMBEDDING_NUM_BATCH=512 + +# ollama_embedding -- Number of GPUs to use (-1 for auto) +# OLLAMA_EMBEDDING_NUM_GPU=-1 + +# ollama_embedding -- Main GPU index +# OLLAMA_EMBEDDING_MAIN_GPU=0 + +# ollama_embedding -- Optimize for low VRAM +# OLLAMA_EMBEDDING_LOW_VRAM=False + +# ollama_embedding -- Number of CPU threads (0 for auto) +# OLLAMA_EMBEDDING_NUM_THREAD=0 + +# ollama_embedding -- Use half-precision for key/value cache +# OLLAMA_EMBEDDING_F16_KV=True + +# ollama_embedding -- Return logits for all tokens +# OLLAMA_EMBEDDING_LOGITS_ALL=False + +# ollama_embedding -- Only load vocabulary +# OLLAMA_EMBEDDING_VOCAB_ONLY=False + +# ollama_embedding -- Use memory mapping for model files +# OLLAMA_EMBEDDING_USE_MMAP=True + +# ollama_embedding -- Lock model in memory +# OLLAMA_EMBEDDING_USE_MLOCK=False + +# ollama_embedding -- Only use for embeddings +# OLLAMA_EMBEDDING_EMBEDDING_ONLY=False + +# ollama_embedding -- Penalize newline tokens +# OLLAMA_EMBEDDING_PENALIZE_NEWLINE=True + +# ollama_embedding -- Stop sequences (comma-separated string) +# OLLAMA_EMBEDDING_STOP= + +# ollama_llm -- Context window size (number of tokens) +# OLLAMA_LLM_NUM_CTX=4096 + +# ollama_llm -- Maximum number of tokens to predict +# OLLAMA_LLM_NUM_PREDICT=128 + +# ollama_llm -- Number of tokens to keep from the initial prompt +# OLLAMA_LLM_NUM_KEEP=0 + +# ollama_llm -- Random seed for generation (-1 for random) +# OLLAMA_LLM_SEED=-1 + +# ollama_llm -- Controls randomness (0.0-2.0, higher = more creative) +# OLLAMA_LLM_TEMPERATURE=0.8 + +# ollama_llm -- Top-k sampling parameter (0 = disabled) +# OLLAMA_LLM_TOP_K=40 + +# ollama_llm -- Top-p (nucleus) sampling parameter (0.0-1.0) +# OLLAMA_LLM_TOP_P=0.9 + +# ollama_llm -- Tail free sampling parameter (1.0 = disabled) +# OLLAMA_LLM_TFS_Z=1.0 + +# ollama_llm -- Typical probability mass (1.0 = disabled) +# OLLAMA_LLM_TYPICAL_P=1.0 + +# ollama_llm -- Minimum probability threshold (0.0 = disabled) +# OLLAMA_LLM_MIN_P=0.0 + +# ollama_llm -- Number of tokens to consider for repetition penalty +# OLLAMA_LLM_REPEAT_LAST_N=64 + +# ollama_llm -- Penalty for repetition (1.0 = no penalty) +# OLLAMA_LLM_REPEAT_PENALTY=1.1 + +# ollama_llm -- Penalty for token presence (-2.0 to 2.0) +# OLLAMA_LLM_PRESENCE_PENALTY=0.0 + +# ollama_llm -- Penalty for token frequency (-2.0 to 2.0) +# OLLAMA_LLM_FREQUENCY_PENALTY=0.0 + +# ollama_llm -- Mirostat sampling algorithm (0=disabled, 1=Mirostat 1.0, 2=Mirostat 2.0) +# OLLAMA_LLM_MIROSTAT=0 + +# ollama_llm -- Mirostat target entropy +# OLLAMA_LLM_MIROSTAT_TAU=5.0 + +# ollama_llm -- Mirostat learning rate +# OLLAMA_LLM_MIROSTAT_ETA=0.1 + +# ollama_llm -- Enable NUMA optimization +# OLLAMA_LLM_NUMA=False + +# ollama_llm -- Batch size for processing +# OLLAMA_LLM_NUM_BATCH=512 + +# ollama_llm -- Number of GPUs to use (-1 for auto) +# OLLAMA_LLM_NUM_GPU=-1 + +# ollama_llm -- Main GPU index +# OLLAMA_LLM_MAIN_GPU=0 + +# ollama_llm -- Optimize for low VRAM +# OLLAMA_LLM_LOW_VRAM=False + +# ollama_llm -- Number of CPU threads (0 for auto) +# OLLAMA_LLM_NUM_THREAD=0 + +# ollama_llm -- Use half-precision for key/value cache +# OLLAMA_LLM_F16_KV=True + +# ollama_llm -- Return logits for all tokens +# OLLAMA_LLM_LOGITS_ALL=False + +# ollama_llm -- Only load vocabulary +# OLLAMA_LLM_VOCAB_ONLY=False + +# ollama_llm -- Use memory mapping for model files +# OLLAMA_LLM_USE_MMAP=True + +# ollama_llm -- Lock model in memory +# OLLAMA_LLM_USE_MLOCK=False + +# ollama_llm -- Only use for embeddings +# OLLAMA_LLM_EMBEDDING_ONLY=False + +# ollama_llm -- Penalize newline tokens +# OLLAMA_LLM_PENALIZE_NEWLINE=True + +# ollama_llm -- Stop sequences (comma-separated string) +# OLLAMA_LLM_STOP= + +# +# End of .env entries for LightRAG binding options +################################################################################ diff --git a/LightRAG/examples/generate_query.py b/LightRAG/examples/generate_query.py new file mode 100644 index 00000000..705b23d3 --- /dev/null +++ b/LightRAG/examples/generate_query.py @@ -0,0 +1,55 @@ +from openai import OpenAI + +# os.environ["OPENAI_API_KEY"] = "" + + +def openai_complete_if_cache( + model="gpt-4o-mini", prompt=None, system_prompt=None, history_messages=[], **kwargs +) -> str: + openai_client = OpenAI() + + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + response = openai_client.chat.completions.create( + model=model, messages=messages, **kwargs + ) + return response.choices[0].message.content + + +if __name__ == "__main__": + description = "" + prompt = f""" + Given the following description of a dataset: + + {description} + + Please identify 5 potential users who would engage with this dataset. For each user, list 5 tasks they would perform with this dataset. Then, for each (user, task) combination, generate 5 questions that require a high-level understanding of the entire dataset. + + Output the results in the following structure: + - User 1: [user description] + - Task 1: [task description] + - Question 1: + - Question 2: + - Question 3: + - Question 4: + - Question 5: + - Task 2: [task description] + ... + - Task 5: [task description] + - User 2: [user description] + ... + - User 5: [user description] + ... + """ + + result = openai_complete_if_cache(model="gpt-4o-mini", prompt=prompt) + + file_path = "./queries.txt" + with open(file_path, "w") as file: + file.write(result) + + print(f"Queries written to {file_path}") diff --git a/LightRAG/examples/graph_visual_with_html.py b/LightRAG/examples/graph_visual_with_html.py new file mode 100644 index 00000000..56ed43cc --- /dev/null +++ b/LightRAG/examples/graph_visual_with_html.py @@ -0,0 +1,34 @@ +import pipmaster as pm + +if not pm.is_installed("pyvis"): + pm.install("pyvis") +if not pm.is_installed("networkx"): + pm.install("networkx") + +import networkx as nx +from pyvis.network import Network +import random + +# Load the GraphML file +G = nx.read_graphml("./dickens/graph_chunk_entity_relation.graphml") + +# Create a Pyvis network +net = Network(height="100vh", notebook=True) + +# Convert NetworkX graph to Pyvis network +net.from_nx(G) + + +# Add colors and title to nodes +for node in net.nodes: + node["color"] = "#{:06x}".format(random.randint(0, 0xFFFFFF)) + if "description" in node: + node["title"] = node["description"] + +# Add title to edges +for edge in net.edges: + if "description" in edge: + edge["title"] = edge["description"] + +# Save and display the network +net.show("knowledge_graph.html") diff --git a/LightRAG/examples/graph_visual_with_neo4j.py b/LightRAG/examples/graph_visual_with_neo4j.py new file mode 100644 index 00000000..b1fc9438 --- /dev/null +++ b/LightRAG/examples/graph_visual_with_neo4j.py @@ -0,0 +1,186 @@ +import os +import json +import xml.etree.ElementTree as ET +from neo4j import GraphDatabase + +# Constants +WORKING_DIR = "./dickens" +BATCH_SIZE_NODES = 500 +BATCH_SIZE_EDGES = 100 + +# Neo4j connection credentials +NEO4J_URI = "bolt://localhost:7687" +NEO4J_USERNAME = "neo4j" +NEO4J_PASSWORD = "your_password" + + +def xml_to_json(xml_file): + try: + tree = ET.parse(xml_file) + root = tree.getroot() + + # Print the root element's tag and attributes to confirm the file has been correctly loaded + print(f"Root element: {root.tag}") + print(f"Root attributes: {root.attrib}") + + data = {"nodes": [], "edges": []} + + # Use namespace + namespace = {"": "http://graphml.graphdrawing.org/xmlns"} + + for node in root.findall(".//node", namespace): + node_data = { + "id": node.get("id").strip('"'), + "entity_type": node.find("./data[@key='d1']", namespace).text.strip('"') + if node.find("./data[@key='d1']", namespace) is not None + else "", + "description": node.find("./data[@key='d2']", namespace).text + if node.find("./data[@key='d2']", namespace) is not None + else "", + "source_id": node.find("./data[@key='d3']", namespace).text + if node.find("./data[@key='d3']", namespace) is not None + else "", + } + data["nodes"].append(node_data) + + for edge in root.findall(".//edge", namespace): + edge_data = { + "source": edge.get("source").strip('"'), + "target": edge.get("target").strip('"'), + "weight": float(edge.find("./data[@key='d5']", namespace).text) + if edge.find("./data[@key='d5']", namespace) is not None + else 0.0, + "description": edge.find("./data[@key='d6']", namespace).text + if edge.find("./data[@key='d6']", namespace) is not None + else "", + "keywords": edge.find("./data[@key='d9']", namespace).text + if edge.find("./data[@key='d9']", namespace) is not None + else "", + "source_id": edge.find("./data[@key='d8']", namespace).text + if edge.find("./data[@key='d8']", namespace) is not None + else "", + } + data["edges"].append(edge_data) + + # Print the number of nodes and edges found + print(f"Found {len(data['nodes'])} nodes and {len(data['edges'])} edges") + + return data + except ET.ParseError as e: + print(f"Error parsing XML file: {e}") + return None + except Exception as e: + print(f"An error occurred: {e}") + return None + + +def convert_xml_to_json(xml_path, output_path): + """Converts XML file to JSON and saves the output.""" + if not os.path.exists(xml_path): + print(f"Error: File not found - {xml_path}") + return None + + json_data = xml_to_json(xml_path) + if json_data: + with open(output_path, "w", encoding="utf-8") as f: + json.dump(json_data, f, ensure_ascii=False, indent=2) + print(f"JSON file created: {output_path}") + return json_data + else: + print("Failed to create JSON data") + return None + + +def process_in_batches(tx, query, data, batch_size): + """Process data in batches and execute the given query.""" + for i in range(0, len(data), batch_size): + batch = data[i : i + batch_size] + tx.run(query, {"nodes": batch} if "nodes" in query else {"edges": batch}) + + +def main(): + # Paths + xml_file = os.path.join(WORKING_DIR, "graph_chunk_entity_relation.graphml") + json_file = os.path.join(WORKING_DIR, "graph_data.json") + + # Convert XML to JSON + json_data = convert_xml_to_json(xml_file, json_file) + if json_data is None: + return + + # Load nodes and edges + nodes = json_data.get("nodes", []) + edges = json_data.get("edges", []) + + # Neo4j queries + create_nodes_query = """ + UNWIND $nodes AS node + MERGE (e:Entity {id: node.id}) + SET e.entity_type = node.entity_type, + e.description = node.description, + e.source_id = node.source_id, + e.displayName = node.id + REMOVE e:Entity + WITH e, node + CALL apoc.create.addLabels(e, [node.id]) YIELD node AS labeledNode + RETURN count(*) + """ + + create_edges_query = """ + UNWIND $edges AS edge + MATCH (source {id: edge.source}) + MATCH (target {id: edge.target}) + WITH source, target, edge, + CASE + WHEN edge.keywords CONTAINS 'lead' THEN 'lead' + WHEN edge.keywords CONTAINS 'participate' THEN 'participate' + WHEN edge.keywords CONTAINS 'uses' THEN 'uses' + WHEN edge.keywords CONTAINS 'located' THEN 'located' + WHEN edge.keywords CONTAINS 'occurs' THEN 'occurs' + ELSE REPLACE(SPLIT(edge.keywords, ',')[0], '\"', '') + END AS relType + CALL apoc.create.relationship(source, relType, { + weight: edge.weight, + description: edge.description, + keywords: edge.keywords, + source_id: edge.source_id + }, target) YIELD rel + RETURN count(*) + """ + + set_displayname_and_labels_query = """ + MATCH (n) + SET n.displayName = n.id + WITH n + CALL apoc.create.setLabels(n, [n.entity_type]) YIELD node + RETURN count(*) + """ + + # Create a Neo4j driver + driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD)) + + try: + # Execute queries in batches + with driver.session() as session: + # Insert nodes in batches + session.execute_write( + process_in_batches, create_nodes_query, nodes, BATCH_SIZE_NODES + ) + + # Insert edges in batches + session.execute_write( + process_in_batches, create_edges_query, edges, BATCH_SIZE_EDGES + ) + + # Set displayName and labels + session.run(set_displayname_and_labels_query) + + except Exception as e: + print(f"Error occurred: {e}") + + finally: + driver.close() + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/insert_custom_kg.py b/LightRAG/examples/insert_custom_kg.py new file mode 100644 index 00000000..db489c96 --- /dev/null +++ b/LightRAG/examples/insert_custom_kg.py @@ -0,0 +1,115 @@ +import os +from lightrag import LightRAG +from lightrag.llm.openai import gpt_4o_mini_complete +######### +# Uncomment the below two lines if running in a jupyter notebook to handle the async nature of rag.insert() +# import nest_asyncio +# nest_asyncio.apply() +######### + +WORKING_DIR = "./custom_kg" + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + +rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=gpt_4o_mini_complete, # Use gpt_4o_mini_complete LLM model + # llm_model_func=gpt_4o_complete # Optionally, use a stronger model +) + +custom_kg = { + "entities": [ + { + "entity_name": "CompanyA", + "entity_type": "Organization", + "description": "A major technology company", + "source_id": "Source1", + }, + { + "entity_name": "ProductX", + "entity_type": "Product", + "description": "A popular product developed by CompanyA", + "source_id": "Source1", + }, + { + "entity_name": "PersonA", + "entity_type": "Person", + "description": "A renowned researcher in AI", + "source_id": "Source2", + }, + { + "entity_name": "UniversityB", + "entity_type": "Organization", + "description": "A leading university specializing in technology and sciences", + "source_id": "Source2", + }, + { + "entity_name": "CityC", + "entity_type": "Location", + "description": "A large metropolitan city known for its culture and economy", + "source_id": "Source3", + }, + { + "entity_name": "EventY", + "entity_type": "Event", + "description": "An annual technology conference held in CityC", + "source_id": "Source3", + }, + ], + "relationships": [ + { + "src_id": "CompanyA", + "tgt_id": "ProductX", + "description": "CompanyA develops ProductX", + "keywords": "develop, produce", + "weight": 1.0, + "source_id": "Source1", + }, + { + "src_id": "PersonA", + "tgt_id": "UniversityB", + "description": "PersonA works at UniversityB", + "keywords": "employment, affiliation", + "weight": 0.9, + "source_id": "Source2", + }, + { + "src_id": "CityC", + "tgt_id": "EventY", + "description": "EventY is hosted in CityC", + "keywords": "host, location", + "weight": 0.8, + "source_id": "Source3", + }, + ], + "chunks": [ + { + "content": "ProductX, developed by CompanyA, has revolutionized the market with its cutting-edge features.", + "source_id": "Source1", + "source_chunk_index": 0, + }, + { + "content": "One outstanding feature of ProductX is its advanced AI capabilities.", + "source_id": "Source1", + "chunk_order_index": 1, + }, + { + "content": "PersonA is a prominent researcher at UniversityB, focusing on artificial intelligence and machine learning.", + "source_id": "Source2", + "source_chunk_index": 0, + }, + { + "content": "EventY, held in CityC, attracts technology enthusiasts and companies from around the globe.", + "source_id": "Source3", + "source_chunk_index": 0, + }, + { + "content": "None", + "source_id": "UNKNOWN", + "source_chunk_index": 0, + }, + ], +} + +rag.insert_custom_kg(custom_kg) diff --git a/LightRAG/examples/lightrag_azure_openai_demo.py b/LightRAG/examples/lightrag_azure_openai_demo.py new file mode 100644 index 00000000..c101383d --- /dev/null +++ b/LightRAG/examples/lightrag_azure_openai_demo.py @@ -0,0 +1,126 @@ +import os +import asyncio +from lightrag import LightRAG, QueryParam +from lightrag.utils import EmbeddingFunc +import numpy as np +from dotenv import load_dotenv +import logging +from openai import AzureOpenAI +from lightrag.kg.shared_storage import initialize_pipeline_status + +logging.basicConfig(level=logging.INFO) + +load_dotenv() + +AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION") +AZURE_OPENAI_DEPLOYMENT = os.getenv("AZURE_OPENAI_DEPLOYMENT") +AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY") +AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT") + +AZURE_EMBEDDING_DEPLOYMENT = os.getenv("AZURE_EMBEDDING_DEPLOYMENT") +AZURE_EMBEDDING_API_VERSION = os.getenv("AZURE_EMBEDDING_API_VERSION") + +WORKING_DIR = "./dickens" + +if os.path.exists(WORKING_DIR): + import shutil + + shutil.rmtree(WORKING_DIR) + +os.mkdir(WORKING_DIR) + + +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + client = AzureOpenAI( + api_key=AZURE_OPENAI_API_KEY, + api_version=AZURE_OPENAI_API_VERSION, + azure_endpoint=AZURE_OPENAI_ENDPOINT, + ) + + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + if history_messages: + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + chat_completion = client.chat.completions.create( + model=AZURE_OPENAI_DEPLOYMENT, # model = "deployment_name". + messages=messages, + temperature=kwargs.get("temperature", 0), + top_p=kwargs.get("top_p", 1), + n=kwargs.get("n", 1), + ) + return chat_completion.choices[0].message.content + + +async def embedding_func(texts: list[str]) -> np.ndarray: + client = AzureOpenAI( + api_key=AZURE_OPENAI_API_KEY, + api_version=AZURE_EMBEDDING_API_VERSION, + azure_endpoint=AZURE_OPENAI_ENDPOINT, + ) + embedding = client.embeddings.create(model=AZURE_EMBEDDING_DEPLOYMENT, input=texts) + + embeddings = [item.embedding for item in embedding.data] + return np.array(embeddings) + + +async def test_funcs(): + result = await llm_model_func("How are you?") + print("Resposta do llm_model_func: ", result) + + result = await embedding_func(["How are you?"]) + print("Resultado do embedding_func: ", result.shape) + print("Dimensão da embedding: ", result.shape[1]) + + +asyncio.run(test_funcs()) + +embedding_dimension = 3072 + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=8192, + func=embedding_func, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + rag = asyncio.run(initialize_rag()) + + book1 = open("./book_1.txt", encoding="utf-8") + book2 = open("./book_2.txt", encoding="utf-8") + + rag.insert([book1.read(), book2.read()]) + + query_text = "What are the main themes?" + + print("Result (Naive):") + print(rag.query(query_text, param=QueryParam(mode="naive"))) + + print("\nResult (Local):") + print(rag.query(query_text, param=QueryParam(mode="local"))) + + print("\nResult (Global):") + print(rag.query(query_text, param=QueryParam(mode="global"))) + + print("\nResult (Hybrid):") + print(rag.query(query_text, param=QueryParam(mode="hybrid"))) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/lightrag_ollama_demo.py b/LightRAG/examples/lightrag_ollama_demo.py new file mode 100644 index 00000000..18fcc790 --- /dev/null +++ b/LightRAG/examples/lightrag_ollama_demo.py @@ -0,0 +1,217 @@ +import asyncio +import os +import inspect +import logging +import logging.config +from lightrag import LightRAG, QueryParam +from lightrag.llm.ollama import ollama_model_complete, ollama_embed +from lightrag.utils import EmbeddingFunc, logger, set_verbose_debug +from lightrag.kg.shared_storage import initialize_pipeline_status + +from dotenv import load_dotenv + +load_dotenv(dotenv_path=".env", override=False) + +WORKING_DIR = "./dickens" + + +def configure_logging(): + """Configure logging for the application""" + + # Reset any existing handlers to ensure clean configuration + for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "lightrag"]: + logger_instance = logging.getLogger(logger_name) + logger_instance.handlers = [] + logger_instance.filters = [] + + # Get log directory path from environment variable or use current directory + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath(os.path.join(log_dir, "lightrag_ollama_demo.log")) + + print(f"\nLightRAG compatible demo log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_file_path), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = int(os.getenv("LOG_MAX_BYTES", 10485760)) # Default 10MB + log_backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5)) # Default 5 backups + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, + } + ) + + # Set the logger level to INFO + logger.setLevel(logging.INFO) + # Enable verbose debug if needed + set_verbose_debug(os.getenv("VERBOSE_DEBUG", "false").lower() == "true") + + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=ollama_model_complete, + llm_model_name=os.getenv("LLM_MODEL", "qwen2.5-coder:7b"), + summary_max_tokens=8192, + llm_model_kwargs={ + "host": os.getenv("LLM_BINDING_HOST", "http://localhost:11434"), + "options": {"num_ctx": 8192}, + "timeout": int(os.getenv("TIMEOUT", "300")), + }, + embedding_func=EmbeddingFunc( + embedding_dim=int(os.getenv("EMBEDDING_DIM", "1024")), + max_token_size=int(os.getenv("MAX_EMBED_TOKENS", "8192")), + func=lambda texts: ollama_embed( + texts, + embed_model=os.getenv("EMBEDDING_MODEL", "bge-m3:latest"), + host=os.getenv("EMBEDDING_BINDING_HOST", "http://localhost:11434"), + ), + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def print_stream(stream): + async for chunk in stream: + print(chunk, end="", flush=True) + + +async def main(): + try: + # Clear old data files + files_to_delete = [ + "graph_chunk_entity_relation.graphml", + "kv_store_doc_status.json", + "kv_store_full_docs.json", + "kv_store_text_chunks.json", + "vdb_chunks.json", + "vdb_entities.json", + "vdb_relationships.json", + ] + + for file in files_to_delete: + file_path = os.path.join(WORKING_DIR, file) + if os.path.exists(file_path): + os.remove(file_path) + print(f"Deleting old file:: {file_path}") + + # Initialize RAG instance + rag = await initialize_rag() + + # Test embedding function + test_text = ["This is a test string for embedding."] + embedding = await rag.embedding_func(test_text) + embedding_dim = embedding.shape[1] + print("\n=======================") + print("Test embedding function") + print("========================") + print(f"Test dict: {test_text}") + print(f"Detected embedding dimension: {embedding_dim}\n\n") + + with open("./book.txt", "r", encoding="utf-8") as f: + await rag.ainsert(f.read()) + + # Perform naive search + print("\n=====================") + print("Query mode: naive") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="naive", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform local search + print("\n=====================") + print("Query mode: local") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="local", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform global search + print("\n=====================") + print("Query mode: global") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="global", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform hybrid search + print("\n=====================") + print("Query mode: hybrid") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="hybrid", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + except Exception as e: + print(f"An error occurred: {e}") + finally: + if rag: + await rag.llm_response_cache.index_done_callback() + await rag.finalize_storages() + + +if __name__ == "__main__": + # Configure logging before running the main function + configure_logging() + asyncio.run(main()) + print("\nDone!") diff --git a/LightRAG/examples/lightrag_openai_compatible_demo.py b/LightRAG/examples/lightrag_openai_compatible_demo.py new file mode 100644 index 00000000..15187d25 --- /dev/null +++ b/LightRAG/examples/lightrag_openai_compatible_demo.py @@ -0,0 +1,227 @@ +import os +import asyncio +import inspect +import logging +import logging.config +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import openai_complete_if_cache +from lightrag.llm.ollama import ollama_embed +from lightrag.utils import EmbeddingFunc, logger, set_verbose_debug +from lightrag.kg.shared_storage import initialize_pipeline_status + +from dotenv import load_dotenv + +load_dotenv(dotenv_path=".env", override=False) + +WORKING_DIR = "./dickens" + + +def configure_logging(): + """Configure logging for the application""" + + # Reset any existing handlers to ensure clean configuration + for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "lightrag"]: + logger_instance = logging.getLogger(logger_name) + logger_instance.handlers = [] + logger_instance.filters = [] + + # Get log directory path from environment variable or use current directory + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath( + os.path.join(log_dir, "lightrag_compatible_demo.log") + ) + + print(f"\nLightRAG compatible demo log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_dir), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = int(os.getenv("LOG_MAX_BYTES", 10485760)) # Default 10MB + log_backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5)) # Default 5 backups + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, + } + ) + + # Set the logger level to INFO + logger.setLevel(logging.INFO) + # Enable verbose debug if needed + set_verbose_debug(os.getenv("VERBOSE_DEBUG", "false").lower() == "true") + + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + return await openai_complete_if_cache( + os.getenv("LLM_MODEL", "deepseek-chat"), + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=os.getenv("LLM_BINDING_API_KEY") or os.getenv("OPENAI_API_KEY"), + base_url=os.getenv("LLM_BINDING_HOST", "https://api.deepseek.com"), + **kwargs, + ) + + +async def print_stream(stream): + async for chunk in stream: + if chunk: + print(chunk, end="", flush=True) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=int(os.getenv("EMBEDDING_DIM", "1024")), + max_token_size=int(os.getenv("MAX_EMBED_TOKENS", "8192")), + func=lambda texts: ollama_embed( + texts, + embed_model=os.getenv("EMBEDDING_MODEL", "bge-m3:latest"), + host=os.getenv("EMBEDDING_BINDING_HOST", "http://localhost:11434"), + ), + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def main(): + try: + # Clear old data files + files_to_delete = [ + "graph_chunk_entity_relation.graphml", + "kv_store_doc_status.json", + "kv_store_full_docs.json", + "kv_store_text_chunks.json", + "vdb_chunks.json", + "vdb_entities.json", + "vdb_relationships.json", + ] + + for file in files_to_delete: + file_path = os.path.join(WORKING_DIR, file) + if os.path.exists(file_path): + os.remove(file_path) + print(f"Deleting old file:: {file_path}") + + # Initialize RAG instance + rag = await initialize_rag() + + # Test embedding function + test_text = ["This is a test string for embedding."] + embedding = await rag.embedding_func(test_text) + embedding_dim = embedding.shape[1] + print("\n=======================") + print("Test embedding function") + print("========================") + print(f"Test dict: {test_text}") + print(f"Detected embedding dimension: {embedding_dim}\n\n") + + with open("./book.txt", "r", encoding="utf-8") as f: + await rag.ainsert(f.read()) + + # Perform naive search + print("\n=====================") + print("Query mode: naive") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="naive", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform local search + print("\n=====================") + print("Query mode: local") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="local", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform global search + print("\n=====================") + print("Query mode: global") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="global", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform hybrid search + print("\n=====================") + print("Query mode: hybrid") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="hybrid", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + except Exception as e: + print(f"An error occurred: {e}") + finally: + if rag: + await rag.finalize_storages() + + +if __name__ == "__main__": + # Configure logging before running the main function + configure_logging() + asyncio.run(main()) + print("\nDone!") diff --git a/LightRAG/examples/lightrag_openai_demo.py b/LightRAG/examples/lightrag_openai_demo.py new file mode 100644 index 00000000..fa0b37f1 --- /dev/null +++ b/LightRAG/examples/lightrag_openai_demo.py @@ -0,0 +1,189 @@ +import os +import asyncio +import logging +import logging.config +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import gpt_4o_mini_complete, openai_embed +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.utils import logger, set_verbose_debug + +WORKING_DIR = "./dickens" + + +def configure_logging(): + """Configure logging for the application""" + + # Reset any existing handlers to ensure clean configuration + for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "lightrag"]: + logger_instance = logging.getLogger(logger_name) + logger_instance.handlers = [] + logger_instance.filters = [] + + # Get log directory path from environment variable or use current directory + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath(os.path.join(log_dir, "lightrag_demo.log")) + + print(f"\nLightRAG demo log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_dir), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = int(os.getenv("LOG_MAX_BYTES", 10485760)) # Default 10MB + log_backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5)) # Default 5 backups + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, + } + ) + + # Set the logger level to INFO + logger.setLevel(logging.INFO) + # Enable verbose debug if needed + set_verbose_debug(os.getenv("VERBOSE_DEBUG", "false").lower() == "true") + + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + embedding_func=openai_embed, + llm_model_func=gpt_4o_mini_complete, + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def main(): + # Check if OPENAI_API_KEY environment variable exists + if not os.getenv("OPENAI_API_KEY"): + print( + "Error: OPENAI_API_KEY environment variable is not set. Please set this variable before running the program." + ) + print("You can set the environment variable by running:") + print(" export OPENAI_API_KEY='your-openai-api-key'") + return # Exit the async function + + try: + # Clear old data files + files_to_delete = [ + "graph_chunk_entity_relation.graphml", + "kv_store_doc_status.json", + "kv_store_full_docs.json", + "kv_store_text_chunks.json", + "vdb_chunks.json", + "vdb_entities.json", + "vdb_relationships.json", + ] + + for file in files_to_delete: + file_path = os.path.join(WORKING_DIR, file) + if os.path.exists(file_path): + os.remove(file_path) + print(f"Deleting old file:: {file_path}") + + # Initialize RAG instance + rag = await initialize_rag() + + # Test embedding function + test_text = ["This is a test string for embedding."] + embedding = await rag.embedding_func(test_text) + embedding_dim = embedding.shape[1] + print("\n=======================") + print("Test embedding function") + print("========================") + print(f"Test dict: {test_text}") + print(f"Detected embedding dimension: {embedding_dim}\n\n") + + with open("./book.txt", "r", encoding="utf-8") as f: + await rag.ainsert(f.read()) + + # Perform naive search + print("\n=====================") + print("Query mode: naive") + print("=====================") + print( + await rag.aquery( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + # Perform local search + print("\n=====================") + print("Query mode: local") + print("=====================") + print( + await rag.aquery( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + # Perform global search + print("\n=====================") + print("Query mode: global") + print("=====================") + print( + await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="global"), + ) + ) + + # Perform hybrid search + print("\n=====================") + print("Query mode: hybrid") + print("=====================") + print( + await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="hybrid"), + ) + ) + except Exception as e: + print(f"An error occurred: {e}") + finally: + if rag: + await rag.finalize_storages() + + +if __name__ == "__main__": + # Configure logging before running the main function + configure_logging() + asyncio.run(main()) + print("\nDone!") diff --git a/LightRAG/examples/lightrag_openai_mongodb_graph_demo.py b/LightRAG/examples/lightrag_openai_mongodb_graph_demo.py new file mode 100644 index 00000000..67c51892 --- /dev/null +++ b/LightRAG/examples/lightrag_openai_mongodb_graph_demo.py @@ -0,0 +1,107 @@ +import os +import asyncio +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import gpt_4o_mini_complete, openai_embed +from lightrag.utils import EmbeddingFunc +import numpy as np +from lightrag.kg.shared_storage import initialize_pipeline_status + +######### +# Uncomment the below two lines if running in a jupyter notebook to handle the async nature of rag.insert() +# import nest_asyncio +# nest_asyncio.apply() +######### +WORKING_DIR = "./mongodb_test_dir" +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +os.environ["OPENAI_API_KEY"] = "sk-" +os.environ["MONGO_URI"] = "mongodb://0.0.0.0:27017/?directConnection=true" +os.environ["MONGO_DATABASE"] = "LightRAG" +os.environ["MONGO_KG_COLLECTION"] = "MDB_KG" + +# Embedding Configuration and Functions +EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "text-embedding-3-large") +EMBEDDING_MAX_TOKEN_SIZE = int(os.environ.get("EMBEDDING_MAX_TOKEN_SIZE", 8192)) + + +async def embedding_func(texts: list[str]) -> np.ndarray: + return await openai_embed( + texts, + model=EMBEDDING_MODEL, + ) + + +async def get_embedding_dimension(): + test_text = ["This is a test sentence."] + embedding = await embedding_func(test_text) + return embedding.shape[1] + + +async def create_embedding_function_instance(): + # Get embedding dimension + embedding_dimension = await get_embedding_dimension() + # Create embedding function instance + return EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=EMBEDDING_MAX_TOKEN_SIZE, + func=embedding_func, + ) + + +async def initialize_rag(): + embedding_func_instance = await create_embedding_function_instance() + + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=gpt_4o_mini_complete, + embedding_func=embedding_func_instance, + graph_storage="MongoGraphStorage", + log_level="DEBUG", + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Perform naive search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + # Perform local search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + # Perform global search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + # Perform hybrid search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/modalprocessors_example.py b/LightRAG/examples/modalprocessors_example.py new file mode 100644 index 00000000..b25c12c2 --- /dev/null +++ b/LightRAG/examples/modalprocessors_example.py @@ -0,0 +1,229 @@ +""" +Example of directly using modal processors + +This example demonstrates how to use LightRAG's modal processors directly without going through MinerU. +""" + +import asyncio +import argparse +from lightrag.llm.openai import openai_complete_if_cache, openai_embed +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag import LightRAG +from lightrag.utils import EmbeddingFunc +from raganything.modalprocessors import ( + ImageModalProcessor, + TableModalProcessor, + EquationModalProcessor, +) + +WORKING_DIR = "./rag_storage" + + +def get_llm_model_func(api_key: str, base_url: str = None): + return ( + lambda prompt, + system_prompt=None, + history_messages=[], + **kwargs: openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=api_key, + base_url=base_url, + **kwargs, + ) + ) + + +def get_vision_model_func(api_key: str, base_url: str = None): + return ( + lambda prompt, + system_prompt=None, + history_messages=[], + image_data=None, + **kwargs: openai_complete_if_cache( + "gpt-4o", + "", + system_prompt=None, + history_messages=[], + messages=[ + {"role": "system", "content": system_prompt} if system_prompt else None, + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{image_data}" + }, + }, + ], + } + if image_data + else {"role": "user", "content": prompt}, + ], + api_key=api_key, + base_url=base_url, + **kwargs, + ) + if image_data + else openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=api_key, + base_url=base_url, + **kwargs, + ) + ) + + +async def process_image_example(lightrag: LightRAG, vision_model_func): + """Example of processing an image""" + # Create image processor + image_processor = ImageModalProcessor( + lightrag=lightrag, modal_caption_func=vision_model_func + ) + + # Prepare image content + image_content = { + "img_path": "image.jpg", + "img_caption": ["Example image caption"], + "img_footnote": ["Example image footnote"], + } + + # Process image + description, entity_info = await image_processor.process_multimodal_content( + modal_content=image_content, + content_type="image", + file_path="image_example.jpg", + entity_name="Example Image", + ) + + print("Image Processing Results:") + print(f"Description: {description}") + print(f"Entity Info: {entity_info}") + + +async def process_table_example(lightrag: LightRAG, llm_model_func): + """Example of processing a table""" + # Create table processor + table_processor = TableModalProcessor( + lightrag=lightrag, modal_caption_func=llm_model_func + ) + + # Prepare table content + table_content = { + "table_body": """ + | Name | Age | Occupation | + |------|-----|------------| + | John | 25 | Engineer | + | Mary | 30 | Designer | + """, + "table_caption": ["Employee Information Table"], + "table_footnote": ["Data updated as of 2024"], + } + + # Process table + description, entity_info = await table_processor.process_multimodal_content( + modal_content=table_content, + content_type="table", + file_path="table_example.md", + entity_name="Employee Table", + ) + + print("\nTable Processing Results:") + print(f"Description: {description}") + print(f"Entity Info: {entity_info}") + + +async def process_equation_example(lightrag: LightRAG, llm_model_func): + """Example of processing a mathematical equation""" + # Create equation processor + equation_processor = EquationModalProcessor( + lightrag=lightrag, modal_caption_func=llm_model_func + ) + + # Prepare equation content + equation_content = {"text": "E = mc^2", "text_format": "LaTeX"} + + # Process equation + description, entity_info = await equation_processor.process_multimodal_content( + modal_content=equation_content, + content_type="equation", + file_path="equation_example.txt", + entity_name="Mass-Energy Equivalence", + ) + + print("\nEquation Processing Results:") + print(f"Description: {description}") + print(f"Entity Info: {entity_info}") + + +async def initialize_rag(api_key: str, base_url: str = None): + rag = LightRAG( + working_dir=WORKING_DIR, + embedding_func=EmbeddingFunc( + embedding_dim=3072, + max_token_size=8192, + func=lambda texts: openai_embed( + texts, + model="text-embedding-3-large", + api_key=api_key, + base_url=base_url, + ), + ), + llm_model_func=lambda prompt, + system_prompt=None, + history_messages=[], + **kwargs: openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=api_key, + base_url=base_url, + **kwargs, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + """Main function to run the example""" + parser = argparse.ArgumentParser(description="Modal Processors Example") + parser.add_argument("--api-key", required=True, help="OpenAI API key") + parser.add_argument("--base-url", help="Optional base URL for API") + parser.add_argument( + "--working-dir", "-w", default=WORKING_DIR, help="Working directory path" + ) + + args = parser.parse_args() + + # Run examples + asyncio.run(main_async(args.api_key, args.base_url)) + + +async def main_async(api_key: str, base_url: str = None): + # Initialize LightRAG + lightrag = await initialize_rag(api_key, base_url) + + # Get model functions + llm_model_func = get_llm_model_func(api_key, base_url) + vision_model_func = get_vision_model_func(api_key, base_url) + + # Run examples + await process_image_example(lightrag, vision_model_func) + await process_table_example(lightrag, llm_model_func) + await process_equation_example(lightrag, llm_model_func) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/raganything_example.py b/LightRAG/examples/raganything_example.py new file mode 100644 index 00000000..f61274a8 --- /dev/null +++ b/LightRAG/examples/raganything_example.py @@ -0,0 +1,286 @@ +#!/usr/bin/env python +""" +Example script demonstrating the integration of MinerU parser with RAGAnything + +This example shows how to: +1. Process parsed documents with RAGAnything +2. Perform multimodal queries on the processed documents +3. Handle different types of content (text, images, tables) +""" + +import os +import argparse +import asyncio +import logging +import logging.config +from pathlib import Path + +# Add project root directory to Python path +import sys + +sys.path.append(str(Path(__file__).parent.parent)) + +from lightrag.llm.openai import openai_complete_if_cache, openai_embed +from lightrag.utils import EmbeddingFunc, logger, set_verbose_debug +from raganything import RAGAnything, RAGAnythingConfig + + +def configure_logging(): + """Configure logging for the application""" + # Get log directory path from environment variable or use current directory + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath(os.path.join(log_dir, "raganything_example.log")) + + print(f"\nRAGAnything example log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_dir), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = int(os.getenv("LOG_MAX_BYTES", 10485760)) # Default 10MB + log_backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5)) # Default 5 backups + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, + } + ) + + # Set the logger level to INFO + logger.setLevel(logging.INFO) + # Enable verbose debug if needed + set_verbose_debug(os.getenv("VERBOSE", "false").lower() == "true") + + +async def process_with_rag( + file_path: str, + output_dir: str, + api_key: str, + base_url: str = None, + working_dir: str = None, +): + """ + Process document with RAGAnything + + Args: + file_path: Path to the document + output_dir: Output directory for RAG results + api_key: OpenAI API key + base_url: Optional base URL for API + working_dir: Working directory for RAG storage + """ + try: + # Create RAGAnything configuration + config = RAGAnythingConfig( + working_dir=working_dir or "./rag_storage", + mineru_parse_method="auto", + enable_image_processing=True, + enable_table_processing=True, + enable_equation_processing=True, + ) + + # Define LLM model function + def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs): + return openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=api_key, + base_url=base_url, + **kwargs, + ) + + # Define vision model function for image processing + def vision_model_func( + prompt, system_prompt=None, history_messages=[], image_data=None, **kwargs + ): + if image_data: + return openai_complete_if_cache( + "gpt-4o", + "", + system_prompt=None, + history_messages=[], + messages=[ + {"role": "system", "content": system_prompt} + if system_prompt + else None, + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{image_data}" + }, + }, + ], + } + if image_data + else {"role": "user", "content": prompt}, + ], + api_key=api_key, + base_url=base_url, + **kwargs, + ) + else: + return llm_model_func(prompt, system_prompt, history_messages, **kwargs) + + # Define embedding function + embedding_func = EmbeddingFunc( + embedding_dim=3072, + max_token_size=8192, + func=lambda texts: openai_embed( + texts, + model="text-embedding-3-large", + api_key=api_key, + base_url=base_url, + ), + ) + + # Initialize RAGAnything with new dataclass structure + rag = RAGAnything( + config=config, + llm_model_func=llm_model_func, + vision_model_func=vision_model_func, + embedding_func=embedding_func, + ) + + # Process document + await rag.process_document_complete( + file_path=file_path, output_dir=output_dir, parse_method="auto" + ) + + # Example queries - demonstrating different query approaches + logger.info("\nQuerying processed document:") + + # 1. Pure text queries using aquery() + text_queries = [ + "What is the main content of the document?", + "What are the key topics discussed?", + ] + + for query in text_queries: + logger.info(f"\n[Text Query]: {query}") + result = await rag.aquery(query, mode="hybrid") + logger.info(f"Answer: {result}") + + # 2. Multimodal query with specific multimodal content using aquery_with_multimodal() + logger.info( + "\n[Multimodal Query]: Analyzing performance data in context of document" + ) + multimodal_result = await rag.aquery_with_multimodal( + "Compare this performance data with any similar results mentioned in the document", + multimodal_content=[ + { + "type": "table", + "table_data": """Method,Accuracy,Processing_Time + RAGAnything,95.2%,120ms + Traditional_RAG,87.3%,180ms + Baseline,82.1%,200ms""", + "table_caption": "Performance comparison results", + } + ], + mode="hybrid", + ) + logger.info(f"Answer: {multimodal_result}") + + # 3. Another multimodal query with equation content + logger.info("\n[Multimodal Query]: Mathematical formula analysis") + equation_result = await rag.aquery_with_multimodal( + "Explain this formula and relate it to any mathematical concepts in the document", + multimodal_content=[ + { + "type": "equation", + "latex": "F1 = 2 \\cdot \\frac{precision \\cdot recall}{precision + recall}", + "equation_caption": "F1-score calculation formula", + } + ], + mode="hybrid", + ) + logger.info(f"Answer: {equation_result}") + + except Exception as e: + logger.error(f"Error processing with RAG: {str(e)}") + import traceback + + logger.error(traceback.format_exc()) + + +def main(): + """Main function to run the example""" + parser = argparse.ArgumentParser(description="MinerU RAG Example") + parser.add_argument("file_path", help="Path to the document to process") + parser.add_argument( + "--working_dir", "-w", default="./rag_storage", help="Working directory path" + ) + parser.add_argument( + "--output", "-o", default="./output", help="Output directory path" + ) + parser.add_argument( + "--api-key", + default=os.getenv("OPENAI_API_KEY"), + help="OpenAI API key (defaults to OPENAI_API_KEY env var)", + ) + parser.add_argument("--base-url", help="Optional base URL for API") + + args = parser.parse_args() + + # Check if API key is provided + if not args.api_key: + logger.error("Error: OpenAI API key is required") + logger.error("Set OPENAI_API_KEY environment variable or use --api-key option") + return + + # Create output directory if specified + if args.output: + os.makedirs(args.output, exist_ok=True) + + # Process with RAG + asyncio.run( + process_with_rag( + args.file_path, args.output, args.api_key, args.base_url, args.working_dir + ) + ) + + +if __name__ == "__main__": + # Configure logging first + configure_logging() + + print("RAGAnything Example") + print("=" * 30) + print("Processing document with multimodal RAG pipeline") + print("=" * 30) + + main() diff --git a/LightRAG/examples/rerank_example.py b/LightRAG/examples/rerank_example.py new file mode 100644 index 00000000..c7db6656 --- /dev/null +++ b/LightRAG/examples/rerank_example.py @@ -0,0 +1,232 @@ +""" +LightRAG Rerank Integration Example + +This example demonstrates how to use rerank functionality with LightRAG +to improve retrieval quality across different query modes. + +Configuration Required: +1. Set your OpenAI LLM API key and base URL with env vars + LLM_MODEL + LLM_BINDING_HOST + LLM_BINDING_API_KEY +2. Set your OpenAI embedding API key and base URL with env vars: + EMBEDDING_MODEL + EMBEDDING_DIM + EMBEDDING_BINDING_HOST + EMBEDDING_BINDING_API_KEY +3. Set your vLLM deployed AI rerank model setting with env vars: + RERANK_MODEL + RERANK_BINDING_HOST + RERANK_BINDING_API_KEY + +Note: Rerank is controlled per query via the 'enable_rerank' parameter (default: True) +""" + +import asyncio +import os +import numpy as np + +from lightrag import LightRAG, QueryParam +from lightrag.llm.openai import openai_complete_if_cache, openai_embed +from lightrag.utils import EmbeddingFunc, setup_logger +from lightrag.kg.shared_storage import initialize_pipeline_status + +from functools import partial +from lightrag.rerank import cohere_rerank + +# Set up your working directory +WORKING_DIR = "./test_rerank" +setup_logger("test_rerank") + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], **kwargs +) -> str: + return await openai_complete_if_cache( + os.getenv("LLM_MODEL"), + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=os.getenv("LLM_BINDING_API_KEY"), + base_url=os.getenv("LLM_BINDING_HOST"), + **kwargs, + ) + + +async def embedding_func(texts: list[str]) -> np.ndarray: + return await openai_embed( + texts, + model=os.getenv("EMBEDDING_MODEL"), + api_key=os.getenv("EMBEDDING_BINDING_API_KEY"), + base_url=os.getenv("EMBEDDING_BINDING_HOST"), + ) + + +rerank_model_func = partial( + cohere_rerank, + model=os.getenv("RERANK_MODEL"), + api_key=os.getenv("RERANK_BINDING_API_KEY"), + base_url=os.getenv("RERANK_BINDING_HOST"), +) + + +async def create_rag_with_rerank(): + """Create LightRAG instance with rerank configuration""" + + # Get embedding dimension + test_embedding = await embedding_func(["test"]) + embedding_dim = test_embedding.shape[1] + print(f"Detected embedding dimension: {embedding_dim}") + + # Method 1: Using custom rerank function + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dim, + max_token_size=8192, + func=embedding_func, + ), + # Rerank Configuration - provide the rerank function + rerank_model_func=rerank_model_func, + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def test_rerank_with_different_settings(): + """ + Test rerank functionality with different enable_rerank settings + """ + print("\n\n🚀 Setting up LightRAG with Rerank functionality...") + + rag = await create_rag_with_rerank() + + # Insert sample documents + sample_docs = [ + "Reranking improves retrieval quality by re-ordering documents based on relevance.", + "LightRAG is a powerful retrieval-augmented generation system with multiple query modes.", + "Vector databases enable efficient similarity search in high-dimensional embedding spaces.", + "Natural language processing has evolved with large language models and transformers.", + "Machine learning algorithms can learn patterns from data without explicit programming.", + ] + + print("📄 Inserting sample documents...") + await rag.ainsert(sample_docs) + + query = "How does reranking improve retrieval quality?" + print(f"\n🔍 Testing query: '{query}'") + print("=" * 80) + + # Test with rerank enabled (default) + print("\n📊 Testing with enable_rerank=True (default):") + result_with_rerank = await rag.aquery( + query, + param=QueryParam( + mode="naive", + top_k=10, + chunk_top_k=5, + enable_rerank=True, # Explicitly enable rerank + ), + ) + print(f" Result length: {len(result_with_rerank)} characters") + print(f" Preview: {result_with_rerank[:100]}...") + + # Test with rerank disabled + print("\n📊 Testing with enable_rerank=False:") + result_without_rerank = await rag.aquery( + query, + param=QueryParam( + mode="naive", + top_k=10, + chunk_top_k=5, + enable_rerank=False, # Disable rerank + ), + ) + print(f" Result length: {len(result_without_rerank)} characters") + print(f" Preview: {result_without_rerank[:100]}...") + + # Test with default settings (enable_rerank defaults to True) + print("\n📊 Testing with default settings (enable_rerank defaults to True):") + result_default = await rag.aquery( + query, param=QueryParam(mode="naive", top_k=10, chunk_top_k=5) + ) + print(f" Result length: {len(result_default)} characters") + print(f" Preview: {result_default[:100]}...") + + +async def test_direct_rerank(): + """Test rerank function directly""" + print("\n🔧 Direct Rerank API Test") + print("=" * 40) + + documents = [ + "Vector search finds semantically similar documents", + "LightRAG supports advanced reranking capabilities", + "Reranking significantly improves retrieval quality", + "Natural language processing with modern transformers", + "The quick brown fox jumps over the lazy dog", + ] + + query = "rerank improve quality" + print(f"Query: '{query}'") + print(f"Documents: {len(documents)}") + + try: + reranked_results = await rerank_model_func( + query=query, + documents=documents, + top_n=4, + ) + + print("\n✅ Rerank Results:") + i = 0 + for result in reranked_results: + index = result["index"] + score = result["relevance_score"] + content = documents[index] + print(f" {index}. Score: {score:.4f} | {content}...") + i += 1 + + except Exception as e: + print(f"❌ Rerank failed: {e}") + + +async def main(): + """Main example function""" + print("🎯 LightRAG Rerank Integration Example") + print("=" * 60) + + try: + # Test direct rerank + await test_direct_rerank() + + # Test rerank with different enable_rerank settings + await test_rerank_with_different_settings() + + print("\n✅ Example completed successfully!") + print("\n💡 Key Points:") + print(" ✓ Rerank is now controlled per query via 'enable_rerank' parameter") + print(" ✓ Default value for enable_rerank is True") + print(" ✓ Rerank function is configured at LightRAG initialization") + print(" ✓ Per-query enable_rerank setting overrides default behavior") + print( + " ✓ If enable_rerank=True but no rerank model is configured, a warning is issued" + ) + print(" ✓ Monitor API usage and costs when using rerank services") + + except Exception as e: + print(f"\n❌ Example failed: {e}") + import traceback + + traceback.print_exc() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/LightRAG/examples/unofficial-sample/copy_llm_cache_to_another_storage.py b/LightRAG/examples/unofficial-sample/copy_llm_cache_to_another_storage.py new file mode 100644 index 00000000..1671b5d5 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/copy_llm_cache_to_another_storage.py @@ -0,0 +1,114 @@ +""" +Sometimes you need to switch a storage solution, but you want to save LLM token and time. +This handy script helps you to copy the LLM caches from one storage solution to another. +(Not all the storage impl are supported) +""" + +import asyncio +import logging +import os +from dotenv import load_dotenv + +from lightrag.kg.postgres_impl import PostgreSQLDB, PGKVStorage +from lightrag.kg.json_kv_impl import JsonKVStorage +from lightrag.namespace import NameSpace + +load_dotenv() +ROOT_DIR = os.environ.get("ROOT_DIR") +WORKING_DIR = f"{ROOT_DIR}/dickens" + +logging.basicConfig(format="%(levelname)s:%(message)s", level=logging.INFO) + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + +# AGE +os.environ["AGE_GRAPH_NAME"] = "chinese" + +postgres_db = PostgreSQLDB( + config={ + "host": "localhost", + "port": 15432, + "user": "rag", + "password": "rag", + "database": "r2", + } +) + + +async def copy_from_postgres_to_json(): + await postgres_db.initdb() + + from_llm_response_cache = PGKVStorage( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + global_config={"embedding_batch_num": 6}, + embedding_func=None, + db=postgres_db, + ) + + to_llm_response_cache = JsonKVStorage( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + global_config={"working_dir": WORKING_DIR}, + embedding_func=None, + ) + + # Get all cache data using the new flattened structure + all_data = await from_llm_response_cache.get_all() + + # Convert flattened data to hierarchical structure for JsonKVStorage + kv = {} + for flattened_key, cache_entry in all_data.items(): + # Parse flattened key: {mode}:{cache_type}:{hash} + parts = flattened_key.split(":", 2) + if len(parts) == 3: + mode, cache_type, hash_value = parts + if mode not in kv: + kv[mode] = {} + kv[mode][hash_value] = cache_entry + print(f"Copying {flattened_key} -> {mode}[{hash_value}]") + else: + print(f"Skipping invalid key format: {flattened_key}") + + await to_llm_response_cache.upsert(kv) + await to_llm_response_cache.index_done_callback() + print("Mission accomplished!") + + +async def copy_from_json_to_postgres(): + await postgres_db.initdb() + + from_llm_response_cache = JsonKVStorage( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + global_config={"working_dir": WORKING_DIR}, + embedding_func=None, + ) + + to_llm_response_cache = PGKVStorage( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + global_config={"embedding_batch_num": 6}, + embedding_func=None, + db=postgres_db, + ) + + # Get all cache data from JsonKVStorage (hierarchical structure) + all_data = await from_llm_response_cache.get_all() + + # Convert hierarchical data to flattened structure for PGKVStorage + flattened_data = {} + for mode, mode_data in all_data.items(): + print(f"Processing mode: {mode}") + for hash_value, cache_entry in mode_data.items(): + # Determine cache_type from cache entry or use default + cache_type = cache_entry.get("cache_type", "extract") + # Create flattened key: {mode}:{cache_type}:{hash} + flattened_key = f"{mode}:{cache_type}:{hash_value}" + flattened_data[flattened_key] = cache_entry + print(f"\tConverting {mode}[{hash_value}] -> {flattened_key}") + + # Upsert the flattened data + await to_llm_response_cache.upsert(flattened_data) + print("Mission accomplished!") + + +if __name__ == "__main__": + asyncio.run(copy_from_json_to_postgres()) diff --git a/LightRAG/examples/unofficial-sample/lightrag_bedrock_demo.py b/LightRAG/examples/unofficial-sample/lightrag_bedrock_demo.py new file mode 100644 index 00000000..c7f41677 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_bedrock_demo.py @@ -0,0 +1,59 @@ +""" +LightRAG meets Amazon Bedrock ⛰️ +""" + +import os +import logging + +from lightrag import LightRAG, QueryParam +from lightrag.llm.bedrock import bedrock_complete, bedrock_embed +from lightrag.utils import EmbeddingFunc +from lightrag.kg.shared_storage import initialize_pipeline_status + +import asyncio +import nest_asyncio + +nest_asyncio.apply() + +logging.getLogger("aiobotocore").setLevel(logging.WARNING) + +WORKING_DIR = "./dickens" +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=bedrock_complete, + llm_model_name="Anthropic Claude 3 Haiku // Amazon Bedrock", + embedding_func=EmbeddingFunc( + embedding_dim=1024, max_token_size=8192, func=bedrock_embed + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + for mode in ["naive", "local", "global", "hybrid"]: + print("\n+-" + "-" * len(mode) + "-+") + print(f"| {mode.capitalize()} |") + print("+-" + "-" * len(mode) + "-+\n") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode=mode) + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_cloudflare_demo.py b/LightRAG/examples/unofficial-sample/lightrag_cloudflare_demo.py new file mode 100644 index 00000000..b53e6714 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_cloudflare_demo.py @@ -0,0 +1,357 @@ +import asyncio +import os +import inspect +import logging +import logging.config +from lightrag import LightRAG, QueryParam +from lightrag.utils import EmbeddingFunc, logger, set_verbose_debug +from lightrag.kg.shared_storage import initialize_pipeline_status + +import requests +import numpy as np +from dotenv import load_dotenv + +"""This code is a modified version of lightrag_openai_demo.py""" + +# ideally, as always, env! +load_dotenv(dotenv_path=".env", override=False) + + +""" ----========= IMPORTANT CHANGE THIS! =========---- """ +cloudflare_api_key = "YOUR_API_KEY" +account_id = "YOUR_ACCOUNT ID" # This is unique to your Cloudflare account + +# Authomatically changes +api_base_url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/" + + +# choose an embedding model +EMBEDDING_MODEL = "@cf/baai/bge-m3" +# choose a generative model +LLM_MODEL = "@cf/meta/llama-3.2-3b-instruct" + +WORKING_DIR = "../dickens" # you can change output as desired + + +# Cloudflare init +class CloudflareWorker: + def __init__( + self, + cloudflare_api_key: str, + api_base_url: str, + llm_model_name: str, + embedding_model_name: str, + max_tokens: int = 4080, + max_response_tokens: int = 4080, + ): + self.cloudflare_api_key = cloudflare_api_key + self.api_base_url = api_base_url + self.llm_model_name = llm_model_name + self.embedding_model_name = embedding_model_name + self.max_tokens = max_tokens + self.max_response_tokens = max_response_tokens + + async def _send_request(self, model_name: str, input_: dict, debug_log: str): + headers = {"Authorization": f"Bearer {self.cloudflare_api_key}"} + + print(f""" + data sent to Cloudflare + ~~~~~~~~~~~ + {debug_log} + """) + + try: + response_raw = requests.post( + f"{self.api_base_url}{model_name}", headers=headers, json=input_ + ).json() + print(f""" + Cloudflare worker responded with: + ~~~~~~~~~~~ + {str(response_raw)} + """) + result = response_raw.get("result", {}) + + if "data" in result: # Embedding case + return np.array(result["data"]) + + if "response" in result: # LLM response + return result["response"] + + raise ValueError("Unexpected Cloudflare response format") + + except Exception as e: + print(f""" + Cloudflare API returned: + ~~~~~~~~~ + Error: {e} + """) + input("Press Enter to continue...") + return None + + async def query(self, prompt, system_prompt: str = "", **kwargs) -> str: + # since no caching is used and we don't want to mess with everything lightrag, pop the kwarg it is + kwargs.pop("hashing_kv", None) + + message = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": prompt}, + ] + + input_ = { + "messages": message, + "max_tokens": self.max_tokens, + "response_token_limit": self.max_response_tokens, + } + + return await self._send_request( + self.llm_model_name, + input_, + debug_log=f"\n- model used {self.llm_model_name}\n- system prompt: {system_prompt}\n- query: {prompt}", + ) + + async def embedding_chunk(self, texts: list[str]) -> np.ndarray: + print(f""" + TEXT inputted + ~~~~~ + {texts} + """) + + input_ = { + "text": texts, + "max_tokens": self.max_tokens, + "response_token_limit": self.max_response_tokens, + } + + return await self._send_request( + self.embedding_model_name, + input_, + debug_log=f"\n-llm model name {self.embedding_model_name}\n- texts: {texts}", + ) + + +def configure_logging(): + """Configure logging for the application""" + + # Reset any existing handlers to ensure clean configuration + for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "lightrag"]: + logger_instance = logging.getLogger(logger_name) + logger_instance.handlers = [] + logger_instance.filters = [] + + # Get log directory path from environment variable or use current directory + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath( + os.path.join(log_dir, "lightrag_cloudflare_worker_demo.log") + ) + + print(f"\nLightRAG compatible demo log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_file_path), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = int(os.getenv("LOG_MAX_BYTES", 10485760)) # Default 10MB + log_backup_count = int(os.getenv("LOG_BACKUP_COUNT", 5)) # Default 5 backups + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + }, + } + ) + + # Set the logger level to INFO + logger.setLevel(logging.INFO) + # Enable verbose debug if needed + set_verbose_debug(os.getenv("VERBOSE_DEBUG", "false").lower() == "true") + + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def initialize_rag(): + cloudflare_worker = CloudflareWorker( + cloudflare_api_key=cloudflare_api_key, + api_base_url=api_base_url, + embedding_model_name=EMBEDDING_MODEL, + llm_model_name=LLM_MODEL, + ) + + rag = LightRAG( + working_dir=WORKING_DIR, + max_parallel_insert=2, + llm_model_func=cloudflare_worker.query, + llm_model_name=os.getenv("LLM_MODEL", LLM_MODEL), + summary_max_tokens=4080, + embedding_func=EmbeddingFunc( + embedding_dim=int(os.getenv("EMBEDDING_DIM", "1024")), + max_token_size=int(os.getenv("MAX_EMBED_TOKENS", "2048")), + func=lambda texts: cloudflare_worker.embedding_chunk( + texts, + ), + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def print_stream(stream): + async for chunk in stream: + print(chunk, end="", flush=True) + + +async def main(): + try: + # Clear old data files + files_to_delete = [ + "graph_chunk_entity_relation.graphml", + "kv_store_doc_status.json", + "kv_store_full_docs.json", + "kv_store_text_chunks.json", + "vdb_chunks.json", + "vdb_entities.json", + "vdb_relationships.json", + ] + + for file in files_to_delete: + file_path = os.path.join(WORKING_DIR, file) + if os.path.exists(file_path): + os.remove(file_path) + print(f"Deleting old file:: {file_path}") + + # Initialize RAG instance + rag = await initialize_rag() + + # Test embedding function + test_text = ["This is a test string for embedding."] + embedding = await rag.embedding_func(test_text) + embedding_dim = embedding.shape[1] + print("\n=======================") + print("Test embedding function") + print("========================") + print(f"Test dict: {test_text}") + print(f"Detected embedding dimension: {embedding_dim}\n\n") + + # Locate the location of what is needed to be added to the knowledge + # Can add several simultaneously by modifying code + with open("./book.txt", "r", encoding="utf-8") as f: + await rag.ainsert(f.read()) + + # Perform naive search + print("\n=====================") + print("Query mode: naive") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="naive", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform local search + print("\n=====================") + print("Query mode: local") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="local", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform global search + print("\n=====================") + print("Query mode: global") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="global", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + # Perform hybrid search + print("\n=====================") + print("Query mode: hybrid") + print("=====================") + resp = await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="hybrid", stream=True), + ) + if inspect.isasyncgen(resp): + await print_stream(resp) + else: + print(resp) + + """ FOR TESTING (if you want to test straight away, after building. Uncomment this part""" + + """ + print("\n" + "=" * 60) + print("AI ASSISTANT READY!") + print("Ask questions about (your uploaded) regulations") + print("Type 'quit' to exit") + print("=" * 60) + + while True: + question = input("\n🔥 Your question: ") + + if question.lower() in ['quit', 'exit', 'bye']: + break + + print("\nThinking...") + response = await rag.aquery(question, param=QueryParam(mode="hybrid")) + print(f"\nAnswer: {response}") + + """ + + except Exception as e: + print(f"An error occurred: {e}") + finally: + if rag: + await rag.llm_response_cache.index_done_callback() + await rag.finalize_storages() + + +if __name__ == "__main__": + # Configure logging before running the main function + configure_logging() + asyncio.run(main()) + print("\nDone!") diff --git a/LightRAG/examples/unofficial-sample/lightrag_hf_demo.py b/LightRAG/examples/unofficial-sample/lightrag_hf_demo.py new file mode 100644 index 00000000..f2abbb2f --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_hf_demo.py @@ -0,0 +1,82 @@ +import os + +from lightrag import LightRAG, QueryParam +from lightrag.llm.hf import hf_model_complete, hf_embed +from lightrag.utils import EmbeddingFunc +from transformers import AutoModel, AutoTokenizer +from lightrag.kg.shared_storage import initialize_pipeline_status + +import asyncio +import nest_asyncio + +nest_asyncio.apply() + +WORKING_DIR = "./dickens" + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=hf_model_complete, + llm_model_name="meta-llama/Llama-3.1-8B-Instruct", + embedding_func=EmbeddingFunc( + embedding_dim=384, + max_token_size=5000, + func=lambda texts: hf_embed( + texts, + tokenizer=AutoTokenizer.from_pretrained( + "sentence-transformers/all-MiniLM-L6-v2" + ), + embed_model=AutoModel.from_pretrained( + "sentence-transformers/all-MiniLM-L6-v2" + ), + ), + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Perform naive search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + # Perform local search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + # Perform global search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + # Perform hybrid search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_llamaindex_direct_demo.py b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_direct_demo.py new file mode 100644 index 00000000..0aec465e --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_direct_demo.py @@ -0,0 +1,143 @@ +import asyncio +import os + +import nest_asyncio +from llama_index.embeddings.openai import OpenAIEmbedding +from llama_index.llms.openai import OpenAI + +from lightrag import LightRAG, QueryParam +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.llm.llama_index_impl import ( + llama_index_complete_if_cache, + llama_index_embed, +) +from lightrag.utils import EmbeddingFunc + +nest_asyncio.apply() + +# Configure working directory +WORKING_DIR = "./index_default" +print(f"WORKING_DIR: {WORKING_DIR}") + +# Model configuration +LLM_MODEL = os.environ.get("LLM_MODEL", "gpt-4") +print(f"LLM_MODEL: {LLM_MODEL}") +EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "text-embedding-3-large") +print(f"EMBEDDING_MODEL: {EMBEDDING_MODEL}") +EMBEDDING_MAX_TOKEN_SIZE = int(os.environ.get("EMBEDDING_MAX_TOKEN_SIZE", 8192)) +print(f"EMBEDDING_MAX_TOKEN_SIZE: {EMBEDDING_MAX_TOKEN_SIZE}") + +# OpenAI configuration +OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "your-api-key-here") + +if not os.path.exists(WORKING_DIR): + print(f"Creating working directory: {WORKING_DIR}") + os.mkdir(WORKING_DIR) + + +# Initialize LLM function +async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs): + try: + # Initialize OpenAI if not in kwargs + if "llm_instance" not in kwargs: + llm_instance = OpenAI( + model=LLM_MODEL, + api_key=OPENAI_API_KEY, + temperature=0.7, + ) + kwargs["llm_instance"] = llm_instance + + response = await llama_index_complete_if_cache( + kwargs["llm_instance"], + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + **kwargs, + ) + return response + except Exception as e: + print(f"LLM request failed: {str(e)}") + raise + + +# Initialize embedding function +async def embedding_func(texts): + try: + embed_model = OpenAIEmbedding( + model=EMBEDDING_MODEL, + api_key=OPENAI_API_KEY, + ) + return await llama_index_embed(texts, embed_model=embed_model) + except Exception as e: + print(f"Embedding failed: {str(e)}") + raise + + +# Get embedding dimension +async def get_embedding_dim(): + test_text = ["This is a test sentence."] + embedding = await embedding_func(test_text) + embedding_dim = embedding.shape[1] + print(f"embedding_dim={embedding_dim}") + return embedding_dim + + +async def initialize_rag(): + embedding_dimension = await get_embedding_dim() + + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=EMBEDDING_MAX_TOKEN_SIZE, + func=embedding_func, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + # Insert example text + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Test different query modes + print("\nNaive Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + print("\nLocal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + print("\nGlobal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + print("\nHybrid Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_demo.py b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_demo.py new file mode 100644 index 00000000..957bdd8a --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_demo.py @@ -0,0 +1,145 @@ +import asyncio +import os + +import nest_asyncio +from llama_index.embeddings.litellm import LiteLLMEmbedding +from llama_index.llms.litellm import LiteLLM + +from lightrag import LightRAG, QueryParam +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.llm.llama_index_impl import ( + llama_index_complete_if_cache, + llama_index_embed, +) +from lightrag.utils import EmbeddingFunc + +nest_asyncio.apply() + +# Configure working directory +WORKING_DIR = "./index_default" +print(f"WORKING_DIR: {WORKING_DIR}") + +# Model configuration +LLM_MODEL = os.environ.get("LLM_MODEL", "gpt-4") +print(f"LLM_MODEL: {LLM_MODEL}") +EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "text-embedding-3-large") +print(f"EMBEDDING_MODEL: {EMBEDDING_MODEL}") +EMBEDDING_MAX_TOKEN_SIZE = int(os.environ.get("EMBEDDING_MAX_TOKEN_SIZE", 8192)) +print(f"EMBEDDING_MAX_TOKEN_SIZE: {EMBEDDING_MAX_TOKEN_SIZE}") + +# LiteLLM configuration +LITELLM_URL = os.environ.get("LITELLM_URL", "http://localhost:4000") +print(f"LITELLM_URL: {LITELLM_URL}") +LITELLM_KEY = os.environ.get("LITELLM_KEY", "sk-1234") + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +# Initialize LLM function +async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs): + try: + # Initialize LiteLLM if not in kwargs + if "llm_instance" not in kwargs: + llm_instance = LiteLLM( + model=f"openai/{LLM_MODEL}", # Format: "provider/model_name" + api_base=LITELLM_URL, + api_key=LITELLM_KEY, + temperature=0.7, + ) + kwargs["llm_instance"] = llm_instance + + response = await llama_index_complete_if_cache( + kwargs["llm_instance"], + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + ) + return response + except Exception as e: + print(f"LLM request failed: {str(e)}") + raise + + +# Initialize embedding function +async def embedding_func(texts): + try: + embed_model = LiteLLMEmbedding( + model_name=f"openai/{EMBEDDING_MODEL}", + api_base=LITELLM_URL, + api_key=LITELLM_KEY, + ) + return await llama_index_embed(texts, embed_model=embed_model) + except Exception as e: + print(f"Embedding failed: {str(e)}") + raise + + +# Get embedding dimension +async def get_embedding_dim(): + test_text = ["This is a test sentence."] + embedding = await embedding_func(test_text) + embedding_dim = embedding.shape[1] + print(f"embedding_dim={embedding_dim}") + return embedding_dim + + +async def initialize_rag(): + embedding_dimension = await get_embedding_dim() + + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=EMBEDDING_MAX_TOKEN_SIZE, + func=embedding_func, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + # Insert example text + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Test different query modes + print("\nNaive Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + print("\nLocal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + print("\nGlobal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + print("\nHybrid Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_opik_demo.py b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_opik_demo.py new file mode 100644 index 00000000..001bf988 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_llamaindex_litellm_opik_demo.py @@ -0,0 +1,156 @@ +import asyncio +import os + +import nest_asyncio +from llama_index.embeddings.litellm import LiteLLMEmbedding +from llama_index.llms.litellm import LiteLLM + +from lightrag import LightRAG, QueryParam +from lightrag.kg.shared_storage import initialize_pipeline_status +from lightrag.llm.llama_index_impl import ( + llama_index_complete_if_cache, + llama_index_embed, +) +from lightrag.utils import EmbeddingFunc + +nest_asyncio.apply() + +# Configure working directory +WORKING_DIR = "./index_default" +print(f"WORKING_DIR: {WORKING_DIR}") + +# Model configuration +LLM_MODEL = os.environ.get("LLM_MODEL", "gemma-3-4b") +print(f"LLM_MODEL: {LLM_MODEL}") +EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "arctic-embed") +print(f"EMBEDDING_MODEL: {EMBEDDING_MODEL}") +EMBEDDING_MAX_TOKEN_SIZE = int(os.environ.get("EMBEDDING_MAX_TOKEN_SIZE", 8192)) +print(f"EMBEDDING_MAX_TOKEN_SIZE: {EMBEDDING_MAX_TOKEN_SIZE}") + +# LiteLLM configuration +LITELLM_URL = os.environ.get("LITELLM_URL", "http://localhost:4000") +print(f"LITELLM_URL: {LITELLM_URL}") +LITELLM_KEY = os.environ.get("LITELLM_KEY", "sk-4JdvGFKqSA3S0k_5p0xufw") + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +# Initialize LLM function +async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs): + try: + # Initialize LiteLLM if not in kwargs + if "llm_instance" not in kwargs: + llm_instance = LiteLLM( + model=f"openai/{LLM_MODEL}", # Format: "provider/model_name" + api_base=LITELLM_URL, + api_key=LITELLM_KEY, + temperature=0.7, + ) + kwargs["llm_instance"] = llm_instance + + chat_kwargs = {} + chat_kwargs["litellm_params"] = { + "metadata": { + "opik": { + "project_name": "lightrag_llamaindex_litellm_opik_demo", + "tags": ["lightrag", "litellm"], + } + } + } + + response = await llama_index_complete_if_cache( + kwargs["llm_instance"], + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + chat_kwargs=chat_kwargs, + ) + return response + except Exception as e: + print(f"LLM request failed: {str(e)}") + raise + + +# Initialize embedding function +async def embedding_func(texts): + try: + embed_model = LiteLLMEmbedding( + model_name=f"openai/{EMBEDDING_MODEL}", + api_base=LITELLM_URL, + api_key=LITELLM_KEY, + ) + return await llama_index_embed(texts, embed_model=embed_model) + except Exception as e: + print(f"Embedding failed: {str(e)}") + raise + + +# Get embedding dimension +async def get_embedding_dim(): + test_text = ["This is a test sentence."] + embedding = await embedding_func(test_text) + embedding_dim = embedding.shape[1] + print(f"embedding_dim={embedding_dim}") + return embedding_dim + + +async def initialize_rag(): + embedding_dimension = await get_embedding_dim() + + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=EMBEDDING_MAX_TOKEN_SIZE, + func=embedding_func, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + # Insert example text + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Test different query modes + print("\nNaive Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + print("\nLocal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + print("\nGlobal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + print("\nHybrid Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_lmdeploy_demo.py b/LightRAG/examples/unofficial-sample/lightrag_lmdeploy_demo.py new file mode 100644 index 00000000..ba118fc9 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_lmdeploy_demo.py @@ -0,0 +1,110 @@ +import os + +from lightrag import LightRAG, QueryParam +from lightrag.llm.lmdeploy import lmdeploy_model_if_cache +from lightrag.llm.hf import hf_embed +from lightrag.utils import EmbeddingFunc +from transformers import AutoModel, AutoTokenizer +from lightrag.kg.shared_storage import initialize_pipeline_status + +import asyncio +import nest_asyncio + +nest_asyncio.apply() + +WORKING_DIR = "./dickens" + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + + +async def lmdeploy_model_complete( + prompt=None, + system_prompt=None, + history_messages=[], + keyword_extraction=False, + **kwargs, +) -> str: + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + return await lmdeploy_model_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + ## please specify chat_template if your local path does not follow original HF file name, + ## or model_name is a pytorch model on huggingface.co, + ## you can refer to https://github.com/InternLM/lmdeploy/blob/main/lmdeploy/model.py + ## for a list of chat_template available in lmdeploy. + chat_template="llama3", + # model_format ='awq', # if you are using awq quantization model. + # quant_policy=8, # if you want to use online kv cache, 4=kv int4, 8=kv int8. + **kwargs, + ) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=lmdeploy_model_complete, + llm_model_name="meta-llama/Llama-3.1-8B-Instruct", # please use definite path for local model + embedding_func=EmbeddingFunc( + embedding_dim=384, + max_token_size=5000, + func=lambda texts: hf_embed( + texts, + tokenizer=AutoTokenizer.from_pretrained( + "sentence-transformers/all-MiniLM-L6-v2" + ), + embed_model=AutoModel.from_pretrained( + "sentence-transformers/all-MiniLM-L6-v2" + ), + ), + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + # Insert example text + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Test different query modes + print("\nNaive Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + print("\nLocal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + print("\nGlobal Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + print("\nHybrid Search:") + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/examples/unofficial-sample/lightrag_nvidia_demo.py b/LightRAG/examples/unofficial-sample/lightrag_nvidia_demo.py new file mode 100644 index 00000000..97cfc38a --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_nvidia_demo.py @@ -0,0 +1,171 @@ +import os +import asyncio +import nest_asyncio + +from lightrag import LightRAG, QueryParam +from lightrag.llm import ( + openai_complete_if_cache, + nvidia_openai_embed, +) +from lightrag.utils import EmbeddingFunc +import numpy as np +from lightrag.kg.shared_storage import initialize_pipeline_status + +# for custom llm_model_func +from lightrag.utils import locate_json_string_body_from_string + +nest_asyncio.apply() + +WORKING_DIR = "./dickens" + +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) + +# some method to use your API key (choose one) +# NVIDIA_OPENAI_API_KEY = os.getenv("NVIDIA_OPENAI_API_KEY") +NVIDIA_OPENAI_API_KEY = "nvapi-xxxx" # your api key + +# using pre-defined function for nvidia LLM API. OpenAI compatible +# llm_model_func = nvidia_openai_complete + + +# If you trying to make custom llm_model_func to use llm model on NVIDIA API like other example: +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + result = await openai_complete_if_cache( + "nvidia/llama-3.1-nemotron-70b-instruct", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=NVIDIA_OPENAI_API_KEY, + base_url="https://integrate.api.nvidia.com/v1", + **kwargs, + ) + if keyword_extraction: + return locate_json_string_body_from_string(result) + return result + + +# custom embedding +nvidia_embed_model = "nvidia/nv-embedqa-e5-v5" + + +async def indexing_embedding_func(texts: list[str]) -> np.ndarray: + return await nvidia_openai_embed( + texts, + model=nvidia_embed_model, # maximum 512 token + # model="nvidia/llama-3.2-nv-embedqa-1b-v1", + api_key=NVIDIA_OPENAI_API_KEY, + base_url="https://integrate.api.nvidia.com/v1", + input_type="passage", + trunc="END", # handling on server side if input token is longer than maximum token + encode="float", + ) + + +async def query_embedding_func(texts: list[str]) -> np.ndarray: + return await nvidia_openai_embed( + texts, + model=nvidia_embed_model, # maximum 512 token + # model="nvidia/llama-3.2-nv-embedqa-1b-v1", + api_key=NVIDIA_OPENAI_API_KEY, + base_url="https://integrate.api.nvidia.com/v1", + input_type="query", + trunc="END", # handling on server side if input token is longer than maximum token + encode="float", + ) + + +# dimension are same +async def get_embedding_dim(): + test_text = ["This is a test sentence."] + embedding = await indexing_embedding_func(test_text) + embedding_dim = embedding.shape[1] + return embedding_dim + + +# function test +async def test_funcs(): + result = await llm_model_func("How are you?") + print("llm_model_func: ", result) + + result = await indexing_embedding_func(["How are you?"]) + print("embedding_func: ", result) + + +# asyncio.run(test_funcs()) + + +async def initialize_rag(): + embedding_dimension = await get_embedding_dim() + print(f"Detected embedding dimension: {embedding_dimension}") + + # lightRAG class during indexing + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + # llm_model_name="meta/llama3-70b-instruct", #un comment if + embedding_func=EmbeddingFunc( + embedding_dim=embedding_dimension, + max_token_size=512, # maximum token size, somehow it's still exceed maximum number of token + # so truncate (trunc) parameter on embedding_func will handle it and try to examine the tokenizer used in LightRAG + # so you can adjust to be able to fit the NVIDIA model (future work) + func=indexing_embedding_func, + ), + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +async def main(): + try: + # Initialize RAG instance + rag = await initialize_rag() + + # reading file + with open("./book.txt", "r", encoding="utf-8") as f: + await rag.ainsert(f.read()) + + # Perform naive search + print("==============Naive===============") + print( + await rag.aquery( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + # Perform local search + print("==============local===============") + print( + await rag.aquery( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + # Perform global search + print("==============global===============") + print( + await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="global"), + ) + ) + + # Perform hybrid search + print("==============hybrid===============") + print( + await rag.aquery( + "What are the top themes in this story?", + param=QueryParam(mode="hybrid"), + ) + ) + except Exception as e: + print(f"An error occurred: {e}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/LightRAG/examples/unofficial-sample/lightrag_openai_neo4j_milvus_redis_demo.py b/LightRAG/examples/unofficial-sample/lightrag_openai_neo4j_milvus_redis_demo.py new file mode 100644 index 00000000..00845796 --- /dev/null +++ b/LightRAG/examples/unofficial-sample/lightrag_openai_neo4j_milvus_redis_demo.py @@ -0,0 +1,112 @@ +import os +import asyncio +from lightrag import LightRAG, QueryParam +from lightrag.llm.ollama import ollama_embed, openai_complete_if_cache +from lightrag.utils import EmbeddingFunc +from lightrag.kg.shared_storage import initialize_pipeline_status + +# WorkingDir +ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +WORKING_DIR = os.path.join(ROOT_DIR, "myKG") +if not os.path.exists(WORKING_DIR): + os.mkdir(WORKING_DIR) +print(f"WorkingDir: {WORKING_DIR}") + +# redis +os.environ["REDIS_URI"] = "redis://localhost:6379" + +# neo4j +BATCH_SIZE_NODES = 500 +BATCH_SIZE_EDGES = 100 +os.environ["NEO4J_URI"] = "neo4j://localhost:7687" +os.environ["NEO4J_USERNAME"] = "neo4j" +os.environ["NEO4J_PASSWORD"] = "12345678" + +# milvus +os.environ["MILVUS_URI"] = "http://localhost:19530" +os.environ["MILVUS_USER"] = "root" +os.environ["MILVUS_PASSWORD"] = "Milvus" +os.environ["MILVUS_DB_NAME"] = "lightrag" + + +async def llm_model_func( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + return await openai_complete_if_cache( + "deepseek-chat", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key="", + base_url="", + **kwargs, + ) + + +embedding_func = EmbeddingFunc( + embedding_dim=768, + max_token_size=512, + func=lambda texts: ollama_embed( + texts, embed_model="shaw/dmeta-embedding-zh", host="http://117.50.173.35:11434" + ), +) + + +async def initialize_rag(): + rag = LightRAG( + working_dir=WORKING_DIR, + llm_model_func=llm_model_func, + summary_max_tokens=10000, + embedding_func=embedding_func, + chunk_token_size=512, + chunk_overlap_token_size=256, + kv_storage="RedisKVStorage", + graph_storage="Neo4JStorage", + vector_storage="MilvusVectorDBStorage", + doc_status_storage="RedisKVStorage", + ) + + await rag.initialize_storages() + await initialize_pipeline_status() + + return rag + + +def main(): + # Initialize RAG instance + rag = asyncio.run(initialize_rag()) + + with open("./book.txt", "r", encoding="utf-8") as f: + rag.insert(f.read()) + + # Perform naive search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="naive") + ) + ) + + # Perform local search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="local") + ) + ) + + # Perform global search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="global") + ) + ) + + # Perform hybrid search + print( + rag.query( + "What are the top themes in this story?", param=QueryParam(mode="hybrid") + ) + ) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/k8s-deploy/README-zh.md b/LightRAG/k8s-deploy/README-zh.md new file mode 100644 index 00000000..e5eb697d --- /dev/null +++ b/LightRAG/k8s-deploy/README-zh.md @@ -0,0 +1,191 @@ +# LightRAG Helm Chart + +这是用于在Kubernetes集群上部署LightRAG服务的Helm chart。 + +LightRAG有两种推荐的部署方法: +1. **轻量级部署**:使用内置轻量级存储,适合测试和小规模使用 +2. **生产环境部署**:使用外部数据库(如PostgreSQL和Neo4J),适合生产环境和大规模使用 + +> 如果您想要部署过程的视频演示,可以查看[bilibili](https://www.bilibili.com/video/BV1bUJazBEq2/)上的视频教程,对于喜欢视觉指导的用户可能会有所帮助。 + +## 前提条件 + +确保安装和配置了以下工具: + +* **Kubernetes集群** + * 需要一个运行中的Kubernetes集群。 + * 对于本地开发或演示,可以使用[Minikube](https://minikube.sigs.k8s.io/docs/start/)(需要≥2个CPU,≥4GB内存,以及Docker/VM驱动支持)。 + * 任何标准的云端或本地Kubernetes集群(EKS、GKE、AKS等)也可以使用。 + +* **kubectl** + * Kubernetes命令行工具,用于管理集群。 + * 按照官方指南安装:[安装和设置kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)。 + +* **Helm**(v3.x+) + * Kubernetes包管理器,用于安装LightRAG。 + * 通过官方指南安装:[安装Helm](https://helm.sh/docs/intro/install/)。 + +## 轻量级部署(无需外部数据库) + +这种部署选项使用内置的轻量级存储组件,非常适合测试、演示或小规模使用场景。无需外部数据库配置。 + +您可以使用提供的便捷脚本或直接使用Helm命令部署LightRAG。两种方法都配置了`lightrag/values.yaml`文件中定义的相同环境变量。 + +### 使用便捷脚本(推荐): + +```bash +export OPENAI_API_BASE=<您的OPENAI_API_BASE> +export OPENAI_API_KEY=<您的OPENAI_API_KEY> +bash ./install_lightrag_dev.sh +``` + +### 或直接使用Helm: + +```bash +# 您可以覆盖任何想要的环境参数 +helm upgrade --install lightrag ./lightrag \ + --namespace rag \ + --set-string env.LIGHTRAG_KV_STORAGE=JsonKVStorage \ + --set-string env.LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage \ + --set-string env.LIGHTRAG_GRAPH_STORAGE=NetworkXStorage \ + --set-string env.LIGHTRAG_DOC_STATUS_STORAGE=JsonDocStatusStorage \ + --set-string env.LLM_BINDING=openai \ + --set-string env.LLM_MODEL=gpt-4o-mini \ + --set-string env.LLM_BINDING_HOST=$OPENAI_API_BASE \ + --set-string env.LLM_BINDING_API_KEY=$OPENAI_API_KEY \ + --set-string env.EMBEDDING_BINDING=openai \ + --set-string env.EMBEDDING_MODEL=text-embedding-ada-002 \ + --set-string env.EMBEDDING_DIM=1536 \ + --set-string env.EMBEDDING_BINDING_API_KEY=$OPENAI_API_KEY +``` + +### 访问应用程序: + +```bash +# 1. 在终端中运行此端口转发命令: +kubectl --namespace rag port-forward svc/lightrag-dev 9621:9621 + +# 2. 当命令运行时,打开浏览器并导航到: +# http://localhost:9621 +``` + +## 生产环境部署(使用外部数据库) + +### 1. 安装数据库 +> 如果您已经准备好了数据库,可以跳过此步骤。详细信息可以在:[README.md](databases%2FREADME.md)中找到。 + +我们推荐使用KubeBlocks进行数据库部署。KubeBlocks是一个云原生数据库操作符,可以轻松地在Kubernetes上以生产规模运行任何数据库。 + +首先,安装KubeBlocks和KubeBlocks-Addons(如已安装可跳过): +```bash +bash ./databases/01-prepare.sh +``` + +然后安装所需的数据库。默认情况下,这将安装PostgreSQL和Neo4J,但您可以修改[00-config.sh](databases%2F00-config.sh)以根据需要选择不同的数据库: +```bash +bash ./databases/02-install-database.sh +``` + +验证集群是否正在运行: +```bash +kubectl get clusters -n rag +# 预期输出: +# NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE +# neo4j-cluster Delete Running 39s +# pg-cluster postgresql Delete Running 42s + +kubectl get po -n rag +# 预期输出: +# NAME READY STATUS RESTARTS AGE +# neo4j-cluster-neo4j-0 1/1 Running 0 58s +# pg-cluster-postgresql-0 4/4 Running 0 59s +# pg-cluster-postgresql-1 4/4 Running 0 59s +``` + +### 2. 安装LightRAG + +LightRAG及其数据库部署在同一Kubernetes集群中,使配置变得简单。 +安装脚本会自动从KubeBlocks获取所有数据库连接信息,无需手动设置数据库凭证: + +```bash +export OPENAI_API_BASE=<您的OPENAI_API_BASE> +export OPENAI_API_KEY=<您的OPENAI_API_KEY> +bash ./install_lightrag.sh +``` + +### 访问应用程序: + +```bash +# 1. 在终端中运行此端口转发命令: +kubectl --namespace rag port-forward svc/lightrag 9621:9621 + +# 2. 当命令运行时,打开浏览器并导航到: +# http://localhost:9621 +``` + +## 配置 + +### 修改资源配置 + +您可以通过修改`values.yaml`文件来配置LightRAG的资源使用: + +```yaml +replicaCount: 1 # 副本数量,可根据需要增加 + +resources: + limits: + cpu: 1000m # CPU限制,可根据需要调整 + memory: 2Gi # 内存限制,可根据需要调整 + requests: + cpu: 500m # CPU请求,可根据需要调整 + memory: 1Gi # 内存请求,可根据需要调整 +``` + +### 修改持久存储 + +```yaml +persistence: + enabled: true + ragStorage: + size: 10Gi # RAG存储大小,可根据需要调整 + inputs: + size: 5Gi # 输入数据存储大小,可根据需要调整 +``` + +### 配置环境变量 + +`values.yaml`文件中的`env`部分包含LightRAG的所有环境配置,类似于`.env`文件。当使用helm upgrade或helm install命令时,可以使用--set标志覆盖这些变量。 + +```yaml +env: + HOST: 0.0.0.0 + PORT: 9621 + WEBUI_TITLE: Graph RAG Engine + WEBUI_DESCRIPTION: Simple and Fast Graph Based RAG System + + # LLM配置 + LLM_BINDING: openai # LLM服务提供商 + LLM_MODEL: gpt-4o-mini # LLM模型 + LLM_BINDING_HOST: # API基础URL(可选) + LLM_BINDING_API_KEY: # API密钥 + + # 嵌入配置 + EMBEDDING_BINDING: openai # 嵌入服务提供商 + EMBEDDING_MODEL: text-embedding-ada-002 # 嵌入模型 + EMBEDDING_DIM: 1536 # 嵌入维度 + EMBEDDING_BINDING_API_KEY: # API密钥 + + # 存储配置 + LIGHTRAG_KV_STORAGE: PGKVStorage # 键值存储类型 + LIGHTRAG_VECTOR_STORAGE: PGVectorStorage # 向量存储类型 + LIGHTRAG_GRAPH_STORAGE: Neo4JStorage # 图存储类型 + LIGHTRAG_DOC_STATUS_STORAGE: PGDocStatusStorage # 文档状态存储类型 +``` + +## 注意事项 + +- 在部署前确保设置了所有必要的环境变量(API密钥和数据库密码) +- 出于安全原因,建议使用环境变量传递敏感信息,而不是直接写入脚本或values文件 +- 轻量级部署适合测试和小规模使用,但数据持久性和性能可能有限 +- 生产环境部署(PostgreSQL + Neo4J)推荐用于生产环境和大规模使用 +- 有关更多自定义配置,请参考LightRAG官方文档 diff --git a/LightRAG/k8s-deploy/README.md b/LightRAG/k8s-deploy/README.md new file mode 100644 index 00000000..cc1f2720 --- /dev/null +++ b/LightRAG/k8s-deploy/README.md @@ -0,0 +1,191 @@ +# LightRAG Helm Chart + +This is the Helm chart for LightRAG, used to deploy LightRAG services on a Kubernetes cluster. + +There are two recommended deployment methods for LightRAG: +1. **Lightweight Deployment**: Using built-in lightweight storage, suitable for testing and small-scale usage +2. **Production Deployment**: Using external databases (such as PostgreSQL and Neo4J), suitable for production environments and large-scale usage + +> If you'd like a video walkthrough of the deployment process, feel free to check out this optional [video tutorial](https://youtu.be/JW1z7fzeKTw?si=vPzukqqwmdzq9Q4q) on YouTube. It might help clarify some steps for those who prefer visual guidance. + +## Prerequisites + +Make sure the following tools are installed and configured: + +* **Kubernetes cluster** + * A running Kubernetes cluster is required. + * For local development or demos you can use [Minikube](https://minikube.sigs.k8s.io/docs/start/) (needs ≥ 2 CPUs, ≥ 4 GB RAM, and Docker/VM-driver support). + * Any standard cloud or on-premises Kubernetes cluster (EKS, GKE, AKS, etc.) also works. + +* **kubectl** + * The Kubernetes command-line tool for managing your cluster. + * Follow the official guide: [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl). + +* **Helm** (v3.x+) + * Kubernetes package manager used to install LightRAG. + * Install it via the official instructions: [Installing Helm](https://helm.sh/docs/intro/install/). + +## Lightweight Deployment (No External Databases Required) + +This deployment option uses built-in lightweight storage components that are perfect for testing, demos, or small-scale usage scenarios. No external database configuration is required. + +You can deploy LightRAG using either the provided convenience script or direct Helm commands. Both methods configure the same environment variables defined in the `lightrag/values.yaml` file. + +### Using the convenience script (recommended): + +```bash +export OPENAI_API_BASE= +export OPENAI_API_KEY= +bash ./install_lightrag_dev.sh +``` + +### Or using Helm directly: + +```bash +# You can override any env param you want +helm upgrade --install lightrag ./lightrag \ + --namespace rag \ + --set-string env.LIGHTRAG_KV_STORAGE=JsonKVStorage \ + --set-string env.LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage \ + --set-string env.LIGHTRAG_GRAPH_STORAGE=NetworkXStorage \ + --set-string env.LIGHTRAG_DOC_STATUS_STORAGE=JsonDocStatusStorage \ + --set-string env.LLM_BINDING=openai \ + --set-string env.LLM_MODEL=gpt-4o-mini \ + --set-string env.LLM_BINDING_HOST=$OPENAI_API_BASE \ + --set-string env.LLM_BINDING_API_KEY=$OPENAI_API_KEY \ + --set-string env.EMBEDDING_BINDING=openai \ + --set-string env.EMBEDDING_MODEL=text-embedding-ada-002 \ + --set-string env.EMBEDDING_DIM=1536 \ + --set-string env.EMBEDDING_BINDING_API_KEY=$OPENAI_API_KEY +``` + +### Accessing the application: + +```bash +# 1. Run this port-forward command in your terminal: +kubectl --namespace rag port-forward svc/lightrag-dev 9621:9621 + +# 2. While the command is running, open your browser and navigate to: +# http://localhost:9621 +``` + +## Production Deployment (Using External Databases) + +### 1. Install Databases +> You can skip this step if you've already prepared databases. Detailed information can be found in: [README.md](databases%2FREADME.md). + +We recommend KubeBlocks for database deployment. KubeBlocks is a cloud-native database operator that makes it easy to run any database on Kubernetes at production scale. + +First, install KubeBlocks and KubeBlocks-Addons (skip if already installed): +```bash +bash ./databases/01-prepare.sh +``` + +Then install the required databases. By default, this will install PostgreSQL and Neo4J, but you can modify [00-config.sh](databases%2F00-config.sh) to select different databases based on your needs: +```bash +bash ./databases/02-install-database.sh +``` + +Verify that the clusters are up and running: +```bash +kubectl get clusters -n rag +# Expected output: +# NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE +# neo4j-cluster Delete Running 39s +# pg-cluster postgresql Delete Running 42s + +kubectl get po -n rag +# Expected output: +# NAME READY STATUS RESTARTS AGE +# neo4j-cluster-neo4j-0 1/1 Running 0 58s +# pg-cluster-postgresql-0 4/4 Running 0 59s +# pg-cluster-postgresql-1 4/4 Running 0 59s +``` + +### 2. Install LightRAG + +LightRAG and its databases are deployed within the same Kubernetes cluster, making configuration straightforward. +The installation script automatically retrieves all database connection information from KubeBlocks, eliminating the need to manually set database credentials: + +```bash +export OPENAI_API_BASE= +export OPENAI_API_KEY= +bash ./install_lightrag.sh +``` + +### Accessing the application: + +```bash +# 1. Run this port-forward command in your terminal: +kubectl --namespace rag port-forward svc/lightrag 9621:9621 + +# 2. While the command is running, open your browser and navigate to: +# http://localhost:9621 +``` + +## Configuration + +### Modifying Resource Configuration + +You can configure LightRAG's resource usage by modifying the `values.yaml` file: + +```yaml +replicaCount: 1 # Number of replicas, can be increased as needed + +resources: + limits: + cpu: 1000m # CPU limit, can be adjusted as needed + memory: 2Gi # Memory limit, can be adjusted as needed + requests: + cpu: 500m # CPU request, can be adjusted as needed + memory: 1Gi # Memory request, can be adjusted as needed +``` + +### Modifying Persistent Storage + +```yaml +persistence: + enabled: true + ragStorage: + size: 10Gi # RAG storage size, can be adjusted as needed + inputs: + size: 5Gi # Input data storage size, can be adjusted as needed +``` + +### Configuring Environment Variables + +The `env` section in the `values.yaml` file contains all environment configurations for LightRAG, similar to a `.env` file. When using helm upgrade or helm install commands, you can override these with the --set flag. + +```yaml +env: + HOST: 0.0.0.0 + PORT: 9621 + WEBUI_TITLE: Graph RAG Engine + WEBUI_DESCRIPTION: Simple and Fast Graph Based RAG System + + # LLM Configuration + LLM_BINDING: openai # LLM service provider + LLM_MODEL: gpt-4o-mini # LLM model + LLM_BINDING_HOST: # API base URL (optional) + LLM_BINDING_API_KEY: # API key + + # Embedding Configuration + EMBEDDING_BINDING: openai # Embedding service provider + EMBEDDING_MODEL: text-embedding-ada-002 # Embedding model + EMBEDDING_DIM: 1536 # Embedding dimension + EMBEDDING_BINDING_API_KEY: # API key + + # Storage Configuration + LIGHTRAG_KV_STORAGE: PGKVStorage # Key-value storage type + LIGHTRAG_VECTOR_STORAGE: PGVectorStorage # Vector storage type + LIGHTRAG_GRAPH_STORAGE: Neo4JStorage # Graph storage type + LIGHTRAG_DOC_STATUS_STORAGE: PGDocStatusStorage # Document status storage type +``` + +## Notes + +- Ensure all necessary environment variables (API keys and database passwords) are set before deployment +- For security reasons, it's recommended to pass sensitive information using environment variables rather than writing them directly in scripts or values files +- Lightweight deployment is suitable for testing and small-scale usage, but data persistence and performance may be limited +- Production deployment (PostgreSQL + Neo4J) is recommended for production environments and large-scale usage +- For more customized configurations, please refer to the official LightRAG documentation diff --git a/LightRAG/k8s-deploy/databases/00-config.sh b/LightRAG/k8s-deploy/databases/00-config.sh new file mode 100644 index 00000000..9431a3d3 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/00-config.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +source "$DATABASE_SCRIPT_DIR/scripts/common.sh" + +# Namespace configuration +NAMESPACE="rag" +# version +KB_VERSION="1.0.0-beta.48" +ADDON_CLUSTER_CHART_VERSION="1.0.0-alpha.0" +# Helm repository +HELM_REPO="https://apecloud.github.io/helm-charts" + +# Set to true to enable the database, false to disable +ENABLE_POSTGRESQL=true +ENABLE_REDIS=false +ENABLE_QDRANT=false +ENABLE_NEO4J=true +ENABLE_ELASTICSEARCH=false +ENABLE_MONGODB=false diff --git a/LightRAG/k8s-deploy/databases/01-prepare.sh b/LightRAG/k8s-deploy/databases/01-prepare.sh new file mode 100644 index 00000000..f43257a4 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/01-prepare.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +check_dependencies + +# Check if KubeBlocks is already installed, install it if it is not. +source "$DATABASE_SCRIPT_DIR/install-kubeblocks.sh" + +# Create namespaces +print "Creating namespaces..." +kubectl create namespace $NAMESPACE 2>/dev/null || true + +# Install database addons +print "Installing KubeBlocks database addons..." + +# Add and update Helm repository +print "Adding and updating KubeBlocks Helm repository..." +helm repo add kubeblocks $HELM_REPO +helm repo update +# Install database addons based on configuration +[ "$ENABLE_POSTGRESQL" = true ] && print "Installing PostgreSQL addon..." && helm upgrade --install kb-addon-postgresql kubeblocks/postgresql --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_REDIS" = true ] && print "Installing Redis addon..." && helm upgrade --install kb-addon-redis kubeblocks/redis --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_ELASTICSEARCH" = true ] && print "Installing Elasticsearch addon..." && helm upgrade --install kb-addon-elasticsearch kubeblocks/elasticsearch --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_QDRANT" = true ] && print "Installing Qdrant addon..." && helm upgrade --install kb-addon-qdrant kubeblocks/qdrant --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_MONGODB" = true ] && print "Installing MongoDB addon..." && helm upgrade --install kb-addon-mongodb kubeblocks/mongodb --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_NEO4J" = true ] && print "Installing Neo4j addon..." && helm upgrade --install kb-addon-neo4j kubeblocks/neo4j --namespace kb-system --version $ADDON_CLUSTER_CHART_VERSION + +print_success "KubeBlocks database addons installation completed!" +print "Now you can run 02-install-database.sh to install database clusters" diff --git a/LightRAG/k8s-deploy/databases/02-install-database.sh b/LightRAG/k8s-deploy/databases/02-install-database.sh new file mode 100644 index 00000000..f19a08d7 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/02-install-database.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +print "Installing database clusters..." + +# Install database clusters based on configuration +[ "$ENABLE_POSTGRESQL" = true ] && print "Installing PostgreSQL cluster..." && helm upgrade --install pg-cluster kubeblocks/postgresql-cluster -f "$DATABASE_SCRIPT_DIR/postgresql/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_REDIS" = true ] && print "Installing Redis cluster..." && helm upgrade --install redis-cluster kubeblocks/redis-cluster -f "$DATABASE_SCRIPT_DIR/redis/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_ELASTICSEARCH" = true ] && print "Installing Elasticsearch cluster..." && helm upgrade --install es-cluster kubeblocks/elasticsearch-cluster -f "$DATABASE_SCRIPT_DIR/elasticsearch/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_QDRANT" = true ] && print "Installing Qdrant cluster..." && helm upgrade --install qdrant-cluster kubeblocks/qdrant-cluster -f "$DATABASE_SCRIPT_DIR/qdrant/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_MONGODB" = true ] && print "Installing MongoDB cluster..." && helm upgrade --install mongodb-cluster kubeblocks/mongodb-cluster -f "$DATABASE_SCRIPT_DIR/mongodb/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION +[ "$ENABLE_NEO4J" = true ] && print "Installing Neo4j cluster..." && helm upgrade --install neo4j-cluster kubeblocks/neo4j-cluster -f "$DATABASE_SCRIPT_DIR/neo4j/values.yaml" --namespace $NAMESPACE --version $ADDON_CLUSTER_CHART_VERSION + +# Wait for databases to be ready +print "Waiting for databases to be ready..." +TIMEOUT=600 # Set timeout to 10 minutes +START_TIME=$(date +%s) + +while true; do + CURRENT_TIME=$(date +%s) + ELAPSED=$((CURRENT_TIME - START_TIME)) + + if [ $ELAPSED -gt $TIMEOUT ]; then + print_error "Timeout waiting for databases to be ready. Please check database status manually and try again" + exit 1 + fi + + # Build wait conditions for enabled databases + WAIT_CONDITIONS=() + [ "$ENABLE_POSTGRESQL" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=pg-cluster -n $NAMESPACE --timeout=10s") + [ "$ENABLE_REDIS" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=redis-cluster -n $NAMESPACE --timeout=10s") + [ "$ENABLE_ELASTICSEARCH" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=es-cluster -n $NAMESPACE --timeout=10s") + [ "$ENABLE_QDRANT" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=qdrant-cluster -n $NAMESPACE --timeout=10s") + [ "$ENABLE_MONGODB" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=mongodb-cluster -n $NAMESPACE --timeout=10s") + [ "$ENABLE_NEO4J" = true ] && WAIT_CONDITIONS+=("kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=neo4j-cluster -n $NAMESPACE --timeout=10s") + + # Check if all enabled databases are ready + ALL_READY=true + for CONDITION in "${WAIT_CONDITIONS[@]}"; do + if ! eval "$CONDITION &> /dev/null"; then + ALL_READY=false + break + fi + done + + if [ "$ALL_READY" = true ]; then + print "All database pods are ready, continuing with deployment..." + break + fi + + print "Waiting for database pods to be ready (${ELAPSED}s elapsed)..." + sleep 10 +done + +print_success "Database clusters installation completed!" +print "Use the following command to check the status of installed clusters:" +print "kubectl get clusters -n $NAMESPACE" diff --git a/LightRAG/k8s-deploy/databases/03-uninstall-database.sh b/LightRAG/k8s-deploy/databases/03-uninstall-database.sh new file mode 100644 index 00000000..be0503c5 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/03-uninstall-database.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +print "Uninstalling database clusters..." + +# Uninstall database clusters based on configuration +[ "$ENABLE_POSTGRESQL" = true ] && print "Uninstalling PostgreSQL cluster..." && helm uninstall pg-cluster --namespace $NAMESPACE 2>/dev/null || true +[ "$ENABLE_REDIS" = true ] && print "Uninstalling Redis cluster..." && helm uninstall redis-cluster --namespace $NAMESPACE 2>/dev/null || true +[ "$ENABLE_ELASTICSEARCH" = true ] && print "Uninstalling Elasticsearch cluster..." && helm uninstall es-cluster --namespace $NAMESPACE 2>/dev/null || true +[ "$ENABLE_QDRANT" = true ] && print "Uninstalling Qdrant cluster..." && helm uninstall qdrant-cluster --namespace $NAMESPACE 2>/dev/null || true +[ "$ENABLE_MONGODB" = true ] && print "Uninstalling MongoDB cluster..." && helm uninstall mongodb-cluster --namespace $NAMESPACE 2>/dev/null || true +[ "$ENABLE_NEO4J" = true ] && print "Uninstalling Neo4j cluster..." && helm uninstall neo4j-cluster --namespace $NAMESPACE 2>/dev/null || true + +print_success "Database clusters uninstalled" +print "To uninstall database addons and KubeBlocks, run 04-cleanup.sh" diff --git a/LightRAG/k8s-deploy/databases/04-cleanup.sh b/LightRAG/k8s-deploy/databases/04-cleanup.sh new file mode 100644 index 00000000..12493501 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/04-cleanup.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +print "Uninstalling KubeBlocks database addons..." + +# Uninstall database addons based on configuration +[ "$ENABLE_POSTGRESQL" = true ] && print "Uninstalling PostgreSQL addon..." && helm uninstall kb-addon-postgresql --namespace kb-system 2>/dev/null || true +[ "$ENABLE_REDIS" = true ] && print "Uninstalling Redis addon..." && helm uninstall kb-addon-redis --namespace kb-system 2>/dev/null || true +[ "$ENABLE_ELASTICSEARCH" = true ] && print "Uninstalling Elasticsearch addon..." && helm uninstall kb-addon-elasticsearch --namespace kb-system 2>/dev/null || true +[ "$ENABLE_QDRANT" = true ] && print "Uninstalling Qdrant addon..." && helm uninstall kb-addon-qdrant --namespace kb-system 2>/dev/null || true +[ "$ENABLE_MONGODB" = true ] && print "Uninstalling MongoDB addon..." && helm uninstall kb-addon-mongodb --namespace kb-system 2>/dev/null || true +[ "$ENABLE_NEO4J" = true ] && print "Uninstalling Neo4j addon..." && helm uninstall kb-addon-neo4j --namespace kb-system 2>/dev/null || true + +print_success "Database addons uninstallation completed!" + +source "$DATABASE_SCRIPT_DIR/uninstall-kubeblocks.sh" + +kubectl delete namespace $NAMESPACE +kubectl delete namespace kb-system + +print_success "KubeBlocks uninstallation completed!" diff --git a/LightRAG/k8s-deploy/databases/README.md b/LightRAG/k8s-deploy/databases/README.md new file mode 100644 index 00000000..1e0002d0 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/README.md @@ -0,0 +1,170 @@ +# Using KubeBlocks to Deploy and Manage Databases + +Learn how to quickly deploy and manage various databases in a Kubernetes (K8s) environment through KubeBlocks. + +## Introduction to KubeBlocks + +KubeBlocks is a production-ready, open-source toolkit that runs any database--SQL, NoSQL, vector, or document--on Kubernetes. +It scales smoothly from quick dev tests to full production clusters, making it a solid choice for RAG workloads like FastGPT that need several data stores working together. + +## Prerequisites + +Make sure the following tools are installed and configured: + +* **Kubernetes cluster** + * A running Kubernetes cluster is required. + * For local development or demos you can use [Minikube](https://minikube.sigs.k8s.io/docs/start/) (needs ≥ 2 CPUs, ≥ 4 GB RAM, and Docker/VM-driver support). + * Any standard cloud or on-premises Kubernetes cluster (EKS, GKE, AKS, etc.) also works. + +* **kubectl** + * The Kubernetes command-line interface. + * Follow the official guide: [Install and Set Up kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl). + +* **Helm** (v3.x+) + * Kubernetes package manager used by the scripts below. + * Install it via the official instructions: [Installing Helm](https://helm.sh/docs/intro/install/). + +## Installing + +1. **Configure the databases you want** + Edit `00-config.sh` file. Based on your requirements, set the variable to `true` for the databases you want to install. + For example, to install PostgreSQL and Neo4j: + + ```bash + ENABLE_POSTGRESQL=true + ENABLE_REDIS=false + ENABLE_ELASTICSEARCH=false + ENABLE_QDRANT=false + ENABLE_MONGODB=false + ENABLE_NEO4J=true + ``` + +2. **Prepare the environment and install KubeBlocks add-ons** + + ```bash + bash ./01-prepare.sh + ``` + + *What the script does* + `01-prepare.sh` performs basic pre-checks (Helm, kubectl, cluster reachability), adds the KubeBlocks Helm repo, and installs any core CRDs or controllers that KubeBlocks itself needs. It also installs the addons for every database you enabled in `00-config.sh`, but **does not** create the actual database clusters yet. + +3. **(Optional) Modify database settings** + Before deployment you can edit the `values.yaml` file inside each `/` directory to change `version`, `replicas`, `CPU`, `memory`, `storage size`, etc. + +4. **Install the database clusters** + + ```bash + bash ./02-install-database.sh + ``` + + *What the script does* + `02-install-database.sh` **actually deploys the chosen databases to Kubernetes**. + + When the script completes, confirm that the clusters are up. It may take a few minutes for all the clusters to become ready, + especially if this is the first time running the script as Kubernetes needs to pull container images from registries. + You can monitor the progress using the following commands: + + ```bash + kubectl get clusters -n rag + NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE + es-cluster Delete Running 11m + mongodb-cluster mongodb Delete Running 11m + pg-cluster postgresql Delete Running 11m + qdrant-cluster qdrant Delete Running 11m + redis-cluster redis Delete Running 11m + ``` + + You can see all the Database `Pods` created by KubeBlocks. + Initially, you might see pods in `ContainerCreating` or `Pending` status - this is normal while images are being pulled and containers are starting up. + Wait until all pods show `Running` status: + + ```bash + kubectl get po -n rag + NAME READY STATUS RESTARTS AGE + es-cluster-mdit-0 2/2 Running 0 11m + mongodb-cluster-mongodb-0 2/2 Running 0 11m + pg-cluster-postgresql-0 4/4 Running 0 11m + pg-cluster-postgresql-1 4/4 Running 0 11m + qdrant-cluster-qdrant-0 2/2 Running 0 11m + redis-cluster-redis-0 2/2 Running 0 11m + ``` + + You can also check the detailed status of a specific pod if it's taking longer than expected: + + ```bash + kubectl describe pod -n rag + ``` + +## Connect to Databases + +To connect to your databases, follow these steps to identify available accounts, retrieve credentials, and establish connections: + +### 1. List Available Database Clusters + +First, view the database clusters running in your namespace: + +```bash +kubectl get cluster -n rag +``` + +### 2. Retrieve Authentication Credentials + +For PostgreSQL, retrieve the username and password from Kubernetes secrets: + +```bash +# Get PostgreSQL username +kubectl get secrets -n rag pg-cluster-postgresql-account-postgres -o jsonpath='{.data.username}' | base64 -d +# Get PostgreSQL password +kubectl get secrets -n rag pg-cluster-postgresql-account-postgres -o jsonpath='{.data.password}' | base64 -d +``` + +If you have trouble finding the correct secret name, list all secrets: + +```bash +kubectl get secrets -n rag +``` + +### 3. Port Forward to Local Machine + +Use port forwarding to access PostgreSQL from your local machine: + +```bash +# Forward PostgreSQL port (5432) to your local machine +# You can see all services with: kubectl get svc -n rag +kubectl port-forward -n rag svc/pg-cluster-postgresql-postgresql 5432:5432 +``` + +### 4. Connect Using Database Client + +Now you can connect using your preferred PostgreSQL client with the retrieved credentials: + +```bash +# Example: connecting with psql +export PGUSER=$(kubectl get secrets -n rag pg-cluster-postgresql-account-postgres -o jsonpath='{.data.username}' | base64 -d) +export PGPASSWORD=$(kubectl get secrets -n rag pg-cluster-postgresql-account-postgres -o jsonpath='{.data.password}' | base64 -d) +psql -h localhost -p 5432 -U $PGUSER +``` + +Keep the port-forwarding terminal running while you're connecting to the database. + + +## Uninstalling + +1. **Remove the database clusters** + + ```bash + bash ./03-uninstall-database.sh + ``` + + The script deletes the database clusters that were enabled in `00-config.sh`. + +2. **Clean up KubeBlocks add-ons** + + ```bash + bash ./04-cleanup.sh + ``` + + This removes the addons installed by `01-prepare.sh`. + +## Reference +* [Kubeblocks Documentation](https://kubeblocks.io/docs/preview/user_docs/overview/introduction) diff --git a/LightRAG/k8s-deploy/databases/elasticsearch/values.yaml b/LightRAG/k8s-deploy/databases/elasticsearch/values.yaml new file mode 100644 index 00000000..4563ad2c --- /dev/null +++ b/LightRAG/k8s-deploy/databases/elasticsearch/values.yaml @@ -0,0 +1,36 @@ +## description: The version of ElasticSearch. +## default: 8.8.2 +version: "8.8.2" + +## description: Mode for ElasticSearch +## default: multi-node +## one of: [single-node, multi-node] +mode: single-node + +## description: The number of replicas, for single-node mode, the replicas is 1, for multi-node mode, the default replicas is 3. +## default: 1 +## minimum: 1 +## maximum: 5 +replicas: 1 + +## description: CPU cores. +## default: 1 +## minimum: 0.5 +## maximum: 64 +cpu: 1 + +## description: Memory, the unit is Gi. +## default: 2 +## minimum: 1 +## maximum: 1000 +memory: 2 + +## description: Storage size, the unit is Gi. +## default: 20 +## minimum: 1 +## maximum: 10000 +storage: 5 + +extra: + terminationPolicy: Delete + disableExporter: true diff --git a/LightRAG/k8s-deploy/databases/install-kubeblocks.sh b/LightRAG/k8s-deploy/databases/install-kubeblocks.sh new file mode 100644 index 00000000..838413ac --- /dev/null +++ b/LightRAG/k8s-deploy/databases/install-kubeblocks.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +# Check dependencies +check_dependencies + +# Function for installing KubeBlocks +install_kubeblocks() { + print "Ready to install KubeBlocks." + + # Install CSI Snapshotter CRDs + kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml + kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml + kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml + + # Add and update Piraeus repository + helm repo add piraeus-charts https://piraeus.io/helm-charts/ + helm repo update + + # Install snapshot controller + helm install snapshot-controller piraeus-charts/snapshot-controller -n kb-system --create-namespace + kubectl wait --for=condition=ready pods -l app.kubernetes.io/name=snapshot-controller -n kb-system --timeout=60s + print_success "snapshot-controller installation complete!" + + # Install KubeBlocks CRDs + kubectl create -f https://github.com/apecloud/kubeblocks/releases/download/v${KB_VERSION}/kubeblocks_crds.yaml + + # Add and update KubeBlocks repository + helm repo add kubeblocks $HELM_REPO + helm repo update + + # Install KubeBlocks + helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace --version=${KB_VERSION} + + # Verify installation + print "Waiting for KubeBlocks to be ready..." + kubectl wait --for=condition=ready pods -l app.kubernetes.io/instance=kubeblocks -n kb-system --timeout=120s + print_success "KubeBlocks installation complete!" +} + +# Check if KubeBlocks is already installed +print "Checking if KubeBlocks is already installed in kb-system namespace..." +if kubectl get namespace kb-system &>/dev/null && kubectl get deployment kubeblocks -n kb-system &>/dev/null; then + print_success "KubeBlocks is already installed in kb-system namespace." +else + # Call the function to install KubeBlocks + install_kubeblocks +fi diff --git a/LightRAG/k8s-deploy/databases/mongodb/values.yaml b/LightRAG/k8s-deploy/databases/mongodb/values.yaml new file mode 100644 index 00000000..e4840a32 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/mongodb/values.yaml @@ -0,0 +1,34 @@ +## description: Cluster version. +## default: 6.0.16 +## one of: [8.0.8, 8.0.6, 8.0.4, 7.0.19, 7.0.16, 7.0.12, 6.0.22, 6.0.20, 6.0.16, 5.0.30, 5.0.28, 4.4.29, 4.2.24, 4.0.28] +version: 6.0.16 + +## description: Cluster topology mode. +## default: standalone +## one of: [standalone, replicaset] +mode: standalone + +## description: CPU cores. +## default: 0.5 +## minimum: 0.5 +## maximum: 64 +cpu: 1 + +## description: Memory, the unit is Gi. +## default: 0.5 +## minimum: 0.5 +## maximum: 1000 +memory: 1 + +## description: Storage size, the unit is Gi. +## default: 20 +## minimum: 1 +## maximum: 10000 +storage: 20 + +## default: enabled +## one of: [enabled, disabled] +hostnetwork: "disabled" + +extra: + terminationPolicy: Delete diff --git a/LightRAG/k8s-deploy/databases/neo4j/values.yaml b/LightRAG/k8s-deploy/databases/neo4j/values.yaml new file mode 100644 index 00000000..2e26479a --- /dev/null +++ b/LightRAG/k8s-deploy/databases/neo4j/values.yaml @@ -0,0 +1,46 @@ +# Version +# description: Cluster version. +# default: 5.26.5 +# one of: [5.26.5, 4.4.42] +version: 5.26.5 + +# Mode +# description: Cluster topology mode. +# default: singlealone +# one of: [singlealone] +mode: singlealone + +# CPU +# description: CPU cores. +# default: 2 +# minimum: 2 +# maximum: 64 +cpu: 2 + +# Memory(Gi) +# description: Memory, the unit is Gi. +# default: 2 +# minimum: 2 +# maximum: 1000 +memory: 4 + +# Storage(Gi) +# description: Storage size, the unit is Gi. +# default: 20 +# minimum: 1 +# maximum: 10000 +storage: 20 + +# Replicas +# description: The number of replicas, for standalone mode, the replicas is 1, for replicaset mode, the default replicas is 3. +# default: 1 +# minimum: 1 +# maximum: 5 +replicas: 1 + +# Storage Class Name +# description: Storage class name of the data volume +storageClassName: "" + +extra: + terminationPolicy: Delete diff --git a/LightRAG/k8s-deploy/databases/postgresql/values.yaml b/LightRAG/k8s-deploy/databases/postgresql/values.yaml new file mode 100644 index 00000000..d706593b --- /dev/null +++ b/LightRAG/k8s-deploy/databases/postgresql/values.yaml @@ -0,0 +1,33 @@ +## description: service version. +## default: 15.7.0 +version: 16.4.0 + +## mode postgresql cluster topology mode replication +mode: replication + +## description: The number of replicas, for standalone mode, the replicas is 1, for replication mode, the default replicas is 2. +## default: 1 +## minimum: 1 +## maximum: 5 +replicas: 2 + +## description: CPU cores. +## default: 0.5 +## minimum: 0.5 +## maximum: 64 +cpu: 1 + +## description: Memory, the unit is Gi. +## default: 0.5 +## minimum: 0.5 +## maximum: 1000 +memory: 1 + +## description: Storage size, the unit is Gi. +## default: 20 +## minimum: 1 +## maximum: 10000 +storage: 5 + +## terminationPolicy define Cluster termination policy. One of DoNotTerminate, Delete, WipeOut. +terminationPolicy: Delete diff --git a/LightRAG/k8s-deploy/databases/qdrant/values.yaml b/LightRAG/k8s-deploy/databases/qdrant/values.yaml new file mode 100644 index 00000000..c49d9960 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/qdrant/values.yaml @@ -0,0 +1,31 @@ +## description: The version of Qdrant. +## default: 1.10.0 +version: 1.10.0 + +## description: The number of replicas. +## default: 1 +## minimum: 1 +## maximum: 16 +replicas: 1 + +## description: CPU cores. +## default: 1 +## minimum: 0.5 +## maximum: 64 +cpu: 1 + +## description: Memory, the unit is Gi. +## default: 2 +## minimum: 0.5 +## maximum: 1000 +memory: 1 + +## description: Storage size, the unit is Gi. +## default: 20 +## minimum: 1 +## maximum: 10000 +storage: 20 + +## customized default values to override kblib chart's values +extra: + terminationPolicy: Delete diff --git a/LightRAG/k8s-deploy/databases/redis/values.yaml b/LightRAG/k8s-deploy/databases/redis/values.yaml new file mode 100644 index 00000000..356e35f7 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/redis/values.yaml @@ -0,0 +1,34 @@ +## description: Cluster version. +## default: 7.2.7 +version: 7.2.7 + +## description: Cluster topology mode. +## default: replication +## one of: [standalone, replication, cluster, replication-twemproxy] +mode: standalone + +## description: The number of replicas, for standalone mode, the replicas is 1, for replication mode, the default replicas is 2. +## default: 1 +## minimum: 1 +## maximum: 5 +replicas: 1 + +## description: CPU cores. +## default: 0.5 +## minimum: 0.5 +## maximum: 64 +cpu: 0.5 + +## description: Memory, the unit is Gi. +## default: 0.5 +## minimum: 0.5 +## maximum: 1000 +memory: 1 + +## description: Storage size, the unit is Gi. +## default: 20 +## minimum: 1 +## maximum: 10000 +storage: 20 +extra: + disableExporter: true diff --git a/LightRAG/k8s-deploy/databases/scripts/common.sh b/LightRAG/k8s-deploy/databases/scripts/common.sh new file mode 100644 index 00000000..3ffb4b08 --- /dev/null +++ b/LightRAG/k8s-deploy/databases/scripts/common.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +print_title() { + echo "============================================" + echo "$1" + echo "============================================" +} + +print_success() { + echo "✅ $1" +} + +print_error() { + echo "❌ $1" +} + +print_warning() { + echo "⚠️ $1" +} + +print_info() { + echo "🔹 $1" +} + +print() { + echo "$1" +} + +# Check dependencies +check_dependencies(){ + print "Checking dependencies..." + command -v kubectl >/dev/null 2>&1 || { print "Error: kubectl command not found"; exit 1; } + command -v helm >/dev/null 2>&1 || { print "Error: helm command not found"; exit 1; } + + # Check if Kubernetes is available + print "Checking if Kubernetes is available..." + kubectl cluster-info &>/dev/null + if [ $? -ne 0 ]; then + print "Error: Kubernetes cluster is not accessible. Please ensure you have proper access to a Kubernetes cluster." + exit 1 + fi + print_success "Kubernetes cluster is accessible." +} diff --git a/LightRAG/k8s-deploy/databases/uninstall-kubeblocks.sh b/LightRAG/k8s-deploy/databases/uninstall-kubeblocks.sh new file mode 100644 index 00000000..3b5ffd1f --- /dev/null +++ b/LightRAG/k8s-deploy/databases/uninstall-kubeblocks.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Get the directory where this script is located +DATABASE_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +# Load configuration file +source "$DATABASE_SCRIPT_DIR/00-config.sh" + +# Check dependencies +print "Checking dependencies..." +command -v kubectl >/dev/null 2>&1 || { print "Error: kubectl command not found"; exit 1; } +command -v helm >/dev/null 2>&1 || { print "Error: helm command not found"; exit 1; } + +print "Checking if Kubernetes is available..." +if ! kubectl cluster-info &>/dev/null; then + print "Error: Kubernetes cluster is not accessible. Please ensure you have proper access to a Kubernetes cluster." + exit 1 +fi + +print "Checking if KubeBlocks is installed in kb-system namespace..." +if ! kubectl get namespace kb-system &>/dev/null; then + print "KubeBlocks is not installed in kb-system namespace." + exit 0 +fi + +# Function for uninstalling KubeBlocks +uninstall_kubeblocks() { + print "Uninstalling KubeBlocks..." + + # Uninstall KubeBlocks Helm chart + helm uninstall kubeblocks -n kb-system + + # Uninstall snapshot controller + helm uninstall snapshot-controller -n kb-system + + # Delete KubeBlocks CRDs + kubectl delete -f https://github.com/apecloud/kubeblocks/releases/download/v${KB_VERSION}/kubeblocks_crds.yaml --ignore-not-found=true + + # Delete CSI Snapshotter CRDs + kubectl delete -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml --ignore-not-found=true + kubectl delete -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml --ignore-not-found=true + kubectl delete -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v8.2.0/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml --ignore-not-found=true + + # Delete the kb-system namespace + print "Waiting for resources to be removed..." + kubectl delete namespace kb-system --timeout=180s + + print "KubeBlocks has been successfully uninstalled!" +} + +# Call the function to uninstall KubeBlocks +uninstall_kubeblocks diff --git a/LightRAG/k8s-deploy/install_lightrag.sh b/LightRAG/k8s-deploy/install_lightrag.sh new file mode 100644 index 00000000..763521e7 --- /dev/null +++ b/LightRAG/k8s-deploy/install_lightrag.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +NAMESPACE=rag + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +if [ -z "$OPENAI_API_KEY" ]; then + echo "OPENAI_API_KEY environment variable is not set" + read -s -p "Enter your OpenAI API key: " OPENAI_API_KEY + if [ -z "$OPENAI_API_KEY" ]; then + echo "Error: OPENAI_API_KEY must be provided" + exit 1 + fi + export OPENAI_API_KEY=$OPENAI_API_KEY +fi + +if [ -z "$OPENAI_API_BASE" ]; then + echo "OPENAI_API_BASE environment variable is not set, will use default value" + read -p "Enter OpenAI API base URL (press Enter to skip if not needed): " OPENAI_API_BASE + export OPENAI_API_BASE=$OPENAI_API_BASE +fi + +# Install KubeBlocks (if not already installed) +bash "$SCRIPT_DIR/databases/01-prepare.sh" + +# Install database clusters +bash "$SCRIPT_DIR/databases/02-install-database.sh" + +# Create vector extension in PostgreSQL if enabled +print "Waiting for PostgreSQL pods to be ready..." +if kubectl wait --for=condition=ready pods -l kubeblocks.io/role=primary,app.kubernetes.io/instance=pg-cluster -n $NAMESPACE --timeout=300s; then + print "Creating vector extension in PostgreSQL..." + kubectl exec -it $(kubectl get pods -l kubeblocks.io/role=primary,app.kubernetes.io/instance=pg-cluster -n $NAMESPACE -o name) -n $NAMESPACE -- psql -c "CREATE EXTENSION vector;" + print_success "Vector extension created successfully." +else + print "Warning: PostgreSQL pods not ready within timeout. Vector extension not created." +fi + +# Get database passwords from Kubernetes secrets +echo "Retrieving database credentials from Kubernetes secrets..." +POSTGRES_PASSWORD=$(kubectl get secrets -n rag pg-cluster-postgresql-account-postgres -o jsonpath='{.data.password}' | base64 -d) +if [ -z "$POSTGRES_PASSWORD" ]; then + echo "Error: Could not retrieve PostgreSQL password. Make sure PostgreSQL is deployed and the secret exists." + exit 1 +fi +export POSTGRES_PASSWORD=$POSTGRES_PASSWORD + +NEO4J_PASSWORD=$(kubectl get secrets -n rag neo4j-cluster-neo4j-account-neo4j -o jsonpath='{.data.password}' | base64 -d) +if [ -z "$NEO4J_PASSWORD" ]; then + echo "Error: Could not retrieve Neo4J password. Make sure Neo4J is deployed and the secret exists." + exit 1 +fi +export NEO4J_PASSWORD=$NEO4J_PASSWORD + +#REDIS_PASSWORD=$(kubectl get secrets -n rag redis-cluster-redis-account-default -o jsonpath='{.data.password}' | base64 -d) +#if [ -z "$REDIS_PASSWORD" ]; then +# echo "Error: Could not retrieve Redis password. Make sure Redis is deployed and the secret exists." +# exit 1 +#fi +#export REDIS_PASSWORD=$REDIS_PASSWORD + +echo "Deploying production LightRAG (using external databases)..." + +if ! kubectl get namespace rag &> /dev/null; then + echo "creating namespace 'rag'..." + kubectl create namespace rag +fi + +helm upgrade --install lightrag $SCRIPT_DIR/lightrag \ + --namespace $NAMESPACE \ + --set-string env.POSTGRES_PASSWORD=$POSTGRES_PASSWORD \ + --set-string env.NEO4J_PASSWORD=$NEO4J_PASSWORD \ + --set-string env.LLM_BINDING=openai \ + --set-string env.LLM_MODEL=gpt-4o-mini \ + --set-string env.LLM_BINDING_HOST=$OPENAI_API_BASE \ + --set-string env.LLM_BINDING_API_KEY=$OPENAI_API_KEY \ + --set-string env.EMBEDDING_BINDING=openai \ + --set-string env.EMBEDDING_MODEL=text-embedding-ada-002 \ + --set-string env.EMBEDDING_DIM=1536 \ + --set-string env.EMBEDDING_BINDING_API_KEY=$OPENAI_API_KEY +# --set-string env.REDIS_URI="redis://default:${REDIS_PASSWORD}@redis-cluster-redis-redis:6379" + +# Wait for LightRAG pod to be ready +echo "" +echo "Waiting for lightrag pod to be ready..." +kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=lightrag --timeout=300s -n rag +echo "lightrag pod is ready" +echo "" +echo "Running Port-Forward:" +echo " kubectl --namespace rag port-forward svc/lightrag 9621:9621" +echo "===========================================" +echo "" +echo "✅ You can visit LightRAG at: http://localhost:9621" +echo "" +kubectl --namespace rag port-forward svc/lightrag 9621:9621 diff --git a/LightRAG/k8s-deploy/install_lightrag_dev.sh b/LightRAG/k8s-deploy/install_lightrag_dev.sh new file mode 100644 index 00000000..3316f8a2 --- /dev/null +++ b/LightRAG/k8s-deploy/install_lightrag_dev.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +NAMESPACE=rag + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +check_dependencies(){ + echo "Checking dependencies..." + command -v kubectl >/dev/null 2>&1 || { echo "Error: kubectl command not found"; exit 1; } + command -v helm >/dev/null 2>&1 || { echo "Error: helm command not found"; exit 1; } + + # Check if Kubernetes is available + echo "Checking if Kubernetes is available..." + kubectl cluster-info &>/dev/null + if [ $? -ne 0 ]; then + echo "Error: Kubernetes cluster is not accessible. Please ensure you have proper access to a Kubernetes cluster." + exit 1 + fi + echo "Kubernetes cluster is accessible." +} + +check_dependencies + +if [ -z "$OPENAI_API_KEY" ]; then + echo "OPENAI_API_KEY environment variable is not set" + read -s -p "Enter your OpenAI API key: " OPENAI_API_KEY + if [ -z "$OPENAI_API_KEY" ]; then + echo "Error: OPENAI_API_KEY must be provided" + exit 1 + fi + export OPENAI_API_KEY=$OPENAI_API_KEY +fi + +if [ -z "$OPENAI_API_BASE" ]; then + echo "OPENAI_API_BASE environment variable is not set, will use default value" + read -p "Enter OpenAI API base URL (press Enter to skip if not needed): " OPENAI_API_BASE + export OPENAI_API_BASE=$OPENAI_API_BASE +fi + +required_env_vars=("OPENAI_API_BASE" "OPENAI_API_KEY") + +for var in "${required_env_vars[@]}"; do + if [ -z "${!var}" ]; then + echo "Error: $var environment variable is not set" + exit 1 + fi +done + +if ! kubectl get namespace rag &> /dev/null; then + echo "creating namespace 'rag'..." + kubectl create namespace rag +fi + +helm upgrade --install lightrag-dev $SCRIPT_DIR/lightrag \ + --namespace rag \ + --set-string env.LIGHTRAG_KV_STORAGE=JsonKVStorage \ + --set-string env.LIGHTRAG_VECTOR_STORAGE=NanoVectorDBStorage \ + --set-string env.LIGHTRAG_GRAPH_STORAGE=NetworkXStorage \ + --set-string env.LIGHTRAG_DOC_STATUS_STORAGE=JsonDocStatusStorage \ + --set-string env.LLM_BINDING=openai \ + --set-string env.LLM_MODEL=gpt-4o-mini \ + --set-string env.LLM_BINDING_HOST=$OPENAI_API_BASE \ + --set-string env.LLM_BINDING_API_KEY=$OPENAI_API_KEY \ + --set-string env.EMBEDDING_BINDING=openai \ + --set-string env.EMBEDDING_MODEL=text-embedding-ada-002 \ + --set-string env.EMBEDDING_DIM=1536 \ + --set-string env.EMBEDDING_BINDING_API_KEY=$OPENAI_API_KEY + +# Wait for LightRAG pod to be ready +echo "" +echo "Waiting for lightrag-dev pod to be ready..." +kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=lightrag-dev --timeout=300s -n rag +echo "lightrag-dev pod is ready" +echo "" +echo "Running Port-Forward:" +echo " kubectl --namespace rag port-forward svc/lightrag-dev 9621:9621" +echo "===========================================" +echo "" +echo "✅ You can visit LightRAG at: http://localhost:9621" +echo "" +kubectl --namespace rag port-forward svc/lightrag-dev 9621:9621 diff --git a/LightRAG/k8s-deploy/lightrag/.helmignore b/LightRAG/k8s-deploy/lightrag/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/LightRAG/k8s-deploy/lightrag/Chart.yaml b/LightRAG/k8s-deploy/lightrag/Chart.yaml new file mode 100644 index 00000000..8f6af573 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/Chart.yaml @@ -0,0 +1,10 @@ +apiVersion: v2 +name: lightrag +description: A Helm chart for LightRAG, an efficient and lightweight RAG system +type: application +version: 0.1.1 +appVersion: "1.0.0" +maintainers: + - name: LightRAG Team + - name: earayu + email: earayu@gmail.com diff --git a/LightRAG/k8s-deploy/lightrag/templates/NOTES.txt b/LightRAG/k8s-deploy/lightrag/templates/NOTES.txt new file mode 100644 index 00000000..6b81aca0 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/NOTES.txt @@ -0,0 +1,38 @@ +=========================================== + LightRAG has been successfully deployed! +=========================================== + +View application logs: + kubectl logs -f --namespace {{ .Release.Namespace }} deploy/{{ include "lightrag.fullname" . }} + +=========================================== + +Access the application: +{{- if contains "NodePort" .Values.service.type }} + Run these commands to get access information: + ----------------------------------------- + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "lightrag.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo "LightRAG is accessible at: http://$NODE_IP:$NODE_PORT" + ----------------------------------------- +{{- else if contains "LoadBalancer" .Values.service.type }} + Run these commands to get access information (external IP may take a minute to assign): + ----------------------------------------- + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "lightrag.fullname" . }} --template "{{ "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" }}") + echo "LightRAG is accessible at: http://$SERVICE_IP:{{ .Values.service.port }}" + ----------------------------------------- + If SERVICE_IP is empty, retry the command or check service status with: + kubectl get svc --namespace {{ .Release.Namespace }} {{ include "lightrag.fullname" . }} +{{- else if contains "ClusterIP" .Values.service.type }} + For development environments, to access LightRAG from your local machine: + + 1. Run this port-forward command in your terminal: + kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "lightrag.fullname" . }} {{ .Values.service.port }}:{{ .Values.env.PORT }} + + 2. While the command is running, open your browser and navigate to: + http://localhost:{{ .Values.service.port }} + + Note: To stop port-forwarding, press Ctrl+C in the terminal. +{{- end }} + +=========================================== diff --git a/LightRAG/k8s-deploy/lightrag/templates/_helpers.tpl b/LightRAG/k8s-deploy/lightrag/templates/_helpers.tpl new file mode 100644 index 00000000..2b2c23ae --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/_helpers.tpl @@ -0,0 +1,42 @@ +{{/* +Application name +*/}} +{{- define "lightrag.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Full application name +*/}} +{{- define "lightrag.fullname" -}} +{{- default .Release.Name .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "lightrag.labels" -}} +app.kubernetes.io/name: {{ include "lightrag.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "lightrag.selectorLabels" -}} +app.kubernetes.io/name: {{ include "lightrag.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +.env file content +*/}} +{{- define "lightrag.envContent" -}} +{{- $first := true -}} +{{- range $key, $val := .Values.env -}} +{{- if not $first -}}{{- "\n" -}}{{- end -}} +{{- $first = false -}} +{{ $key }}={{ $val }} +{{- end -}} +{{- end -}} diff --git a/LightRAG/k8s-deploy/lightrag/templates/deployment.yaml b/LightRAG/k8s-deploy/lightrag/templates/deployment.yaml new file mode 100644 index 00000000..d8dcfc34 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/deployment.yaml @@ -0,0 +1,81 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "lightrag.fullname" . }} + labels: + {{- include "lightrag.labels" . | nindent 4 }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "lightrag.selectorLabels" . | nindent 6 }} + template: + metadata: + annotations: + checksum/config: {{ include "lightrag.envContent" . | sha256sum }} + labels: + {{- include "lightrag.selectorLabels" . | nindent 8 }} + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: {{ .Values.env.PORT }} + protocol: TCP + readinessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 2 + successThreshold: 1 + failureThreshold: 3 + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - name: rag-storage + mountPath: /app/data/rag_storage + - name: inputs + mountPath: /app/data/inputs + - name: env-file + mountPath: /app/.env + subPath: .env + {{- $envFrom := default (dict) .Values.envFrom }} + {{- $envFromEntries := list }} + {{- range (default (list) (index $envFrom "secrets")) }} + {{- $envFromEntries = append $envFromEntries (dict "secretRef" (dict "name" .name)) }} + {{- end }} + {{- range (default (list) (index $envFrom "configmaps")) }} + {{- $envFromEntries = append $envFromEntries (dict "configMapRef" (dict "name" .name)) }} + {{- end }} + {{- if gt (len $envFromEntries) 0 }} + envFrom: +{{- toYaml $envFromEntries | nindent 12 }} + {{- end }} + {{- with .Values.image.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: env-file + secret: + secretName: {{ include "lightrag.fullname" . }}-env + {{- if .Values.persistence.enabled }} + - name: rag-storage + persistentVolumeClaim: + claimName: {{ include "lightrag.fullname" . }}-rag-storage + - name: inputs + persistentVolumeClaim: + claimName: {{ include "lightrag.fullname" . }}-inputs + {{- else }} + - name: rag-storage + emptyDir: {} + - name: inputs + emptyDir: {} + {{- end }} + + strategy: + {{- toYaml .Values.updateStrategy | nindent 4 }} diff --git a/LightRAG/k8s-deploy/lightrag/templates/pvc.yaml b/LightRAG/k8s-deploy/lightrag/templates/pvc.yaml new file mode 100644 index 00000000..570474bc --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/pvc.yaml @@ -0,0 +1,28 @@ +{{- if .Values.persistence.enabled }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "lightrag.fullname" . }}-rag-storage + labels: + {{- include "lightrag.labels" . | nindent 4 }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.persistence.ragStorage.size }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "lightrag.fullname" . }}-inputs + labels: + {{- include "lightrag.labels" . | nindent 4 }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.persistence.inputs.size }} +{{- end }} diff --git a/LightRAG/k8s-deploy/lightrag/templates/secret.yaml b/LightRAG/k8s-deploy/lightrag/templates/secret.yaml new file mode 100644 index 00000000..8f403ab8 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/secret.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "lightrag.fullname" . }}-env + labels: + {{- include "lightrag.labels" . | nindent 4 }} +type: Opaque +stringData: + .env: |- + {{- include "lightrag.envContent" . | nindent 4 }} diff --git a/LightRAG/k8s-deploy/lightrag/templates/service.yaml b/LightRAG/k8s-deploy/lightrag/templates/service.yaml new file mode 100644 index 00000000..e5525e18 --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "lightrag.fullname" . }} + labels: + {{- include "lightrag.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.env.PORT }} + protocol: TCP + name: http + selector: + {{- include "lightrag.selectorLabels" . | nindent 4 }} diff --git a/LightRAG/k8s-deploy/lightrag/values.yaml b/LightRAG/k8s-deploy/lightrag/values.yaml new file mode 100644 index 00000000..d8057d1e --- /dev/null +++ b/LightRAG/k8s-deploy/lightrag/values.yaml @@ -0,0 +1,82 @@ +replicaCount: 1 + +image: + repository: ghcr.io/hkuds/lightrag + tag: latest + # Optionally specify imagePullSecrets if your image is in a private registry + # example: + # imagePullSecrets: + # - name: my-registry-secret + imagePullSecrets: [] + +# Specify a deployment strategy +# example: +# updateStrategy: +# type: RollingUpdate +# rollingUpdate: +# maxUnavailable: 25% +# maxSurge: 25% +# Default for now should be Recreate as any RollingUpdate will cause issues with +# multiple instances trying to access the same persistent storage if not using RWX volumes. +updateStrategy: + type: Recreate + +service: + type: ClusterIP + port: 9621 + +resources: + limits: + cpu: 1000m + memory: 2Gi + requests: + cpu: 500m + memory: 1Gi + +persistence: + enabled: true + ragStorage: + size: 10Gi + inputs: + size: 5Gi + +# Allow specifying additional environment variables from ConfigMaps or Secrets created outside of this chart +envFrom: + configmaps: [] + # - name: my-shiny-configmap-1 + secrets: [] + # - name: my-shiny-secret-1 + +env: + HOST: 0.0.0.0 + PORT: 9621 + WEBUI_TITLE: Graph RAG Engine + WEBUI_DESCRIPTION: Simple and Fast Graph Based RAG System + LLM_BINDING: openai + LLM_MODEL: gpt-4o-mini + LLM_BINDING_HOST: + LLM_BINDING_API_KEY: + EMBEDDING_BINDING: openai + EMBEDDING_MODEL: text-embedding-ada-002 + EMBEDDING_DIM: 1536 + EMBEDDING_BINDING_API_KEY: + LIGHTRAG_KV_STORAGE: PGKVStorage + LIGHTRAG_VECTOR_STORAGE: PGVectorStorage + # LIGHTRAG_KV_STORAGE: RedisKVStorage + # LIGHTRAG_VECTOR_STORAGE: QdrantVectorDBStorage + LIGHTRAG_GRAPH_STORAGE: Neo4JStorage + LIGHTRAG_DOC_STATUS_STORAGE: PGDocStatusStorage + # Replace with your POSTGRES credentials + POSTGRES_HOST: pg-cluster-postgresql-postgresql + POSTGRES_PORT: 5432 + POSTGRES_USER: postgres + POSTGRES_PASSWORD: + POSTGRES_DATABASE: postgres + POSTGRES_WORKSPACE: default + # Replace with your NEO4J credentials + NEO4J_URI: neo4j://neo4j-cluster-neo4j:7687 + NEO4J_USERNAME: neo4j + NEO4J_PASSWORD: + # Replace with your Qdrant credentials + QDRANT_URL: http://qdrant-cluster-qdrant-qdrant:6333 + # REDIS_URI: redis://default:${REDIS_PASSWORD}@redis-cluster-redis-redis:6379 diff --git a/LightRAG/k8s-deploy/uninstall_lightrag.sh b/LightRAG/k8s-deploy/uninstall_lightrag.sh new file mode 100644 index 00000000..e4806b77 --- /dev/null +++ b/LightRAG/k8s-deploy/uninstall_lightrag.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +NAMESPACE=rag +helm uninstall lightrag --namespace $NAMESPACE diff --git a/LightRAG/k8s-deploy/uninstall_lightrag_dev.sh b/LightRAG/k8s-deploy/uninstall_lightrag_dev.sh new file mode 100644 index 00000000..cac01abd --- /dev/null +++ b/LightRAG/k8s-deploy/uninstall_lightrag_dev.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +NAMESPACE=rag +helm uninstall lightrag-dev --namespace $NAMESPACE diff --git a/LightRAG/lightrag.service.example b/LightRAG/lightrag.service.example new file mode 100644 index 00000000..e99198d1 --- /dev/null +++ b/LightRAG/lightrag.service.example @@ -0,0 +1,30 @@ +[Unit] +Description=LightRAG XYJ Service +After=network.target + +[Service] +Type=simple +User=netman +# Memory settings +MemoryHigh=8G +MemoryMax=12G + +# Set the LightRAG installation directory (change this to match your installation path) +Environment="LIGHTRAG_HOME=/home/netman/lightrag-xyj" + +# Set Environment to your Python virtual environment +Environment="PATH=${LIGHTRAG_HOME}/.venv/bin" +WorkingDirectory=${LIGHTRAG_HOME} +ExecStart=${LIGHTRAG_HOME}/.venv/bin/lightrag-server +# ExecStart=${LIGHTRAG_HOME}/.venv/bin/lightrag-gunicorn + +# Kill mode require ExecStart must be gunicorn or unvicorn main process +KillMode=process +ExecStop=/bin/kill -s TERM $MAINPID +TimeoutStopSec=60 + +Restart=always +RestartSec=30 + +[Install] +WantedBy=multi-user.target diff --git a/LightRAG/lightrag/__init__.py b/LightRAG/lightrag/__init__.py new file mode 100644 index 00000000..dc7c97b0 --- /dev/null +++ b/LightRAG/lightrag/__init__.py @@ -0,0 +1,5 @@ +from .lightrag import LightRAG as LightRAG, QueryParam as QueryParam + +__version__ = "1.4.9.9" +__author__ = "Zirui Guo" +__url__ = "https://github.com/HKUDS/LightRAG" diff --git a/LightRAG/lightrag/api/.gitignore b/LightRAG/lightrag/api/.gitignore new file mode 100644 index 00000000..8cb6821a --- /dev/null +++ b/LightRAG/lightrag/api/.gitignore @@ -0,0 +1,2 @@ +inputs +rag_storage diff --git a/LightRAG/lightrag/api/README-zh.md b/LightRAG/lightrag/api/README-zh.md new file mode 100644 index 00000000..3b12f265 --- /dev/null +++ b/LightRAG/lightrag/api/README-zh.md @@ -0,0 +1,626 @@ +# LightRAG 服务器和 WebUI + +LightRAG 服务器旨在提供 Web 界面和 API 支持。Web 界面便于文档索引、知识图谱探索和简单的 RAG 查询界面。LightRAG 服务器还提供了与 Ollama 兼容的接口,旨在将 LightRAG 模拟为 Ollama 聊天模型。这使得 AI 聊天机器人(如 Open WebUI)可以轻松访问 LightRAG。 + +![image-20250323122538997](./README.assets/image-20250323122538997.png) + +![image-20250323122754387](./README.assets/image-20250323122754387.png) + +![image-20250323123011220](./README.assets/image-20250323123011220.png) + +## 入门指南 + +### 安装 + +* 从 PyPI 安装 + +```bash +# 使用 uv (推荐) +uv pip install "lightrag-hku[api]" + +# 或使用 pip +# pip install "lightrag-hku[api]" +``` + +* 从源代码安装 + +```bash +# 克隆仓库 +git clone https://github.com/HKUDS/lightrag.git + +# 进入仓库目录 +cd lightrag + +# 使用 uv (推荐) +# 注意: uv sync 会自动在 .venv/ 目录创建虚拟环境 +uv sync --extra api +source .venv/bin/activate # 激活虚拟环境 (Linux/macOS) +# Windows 系统: .venv\Scripts\activate + +# 或使用 pip 与虚拟环境 +# python -m venv .venv +# source .venv/bin/activate # Windows: .venv\Scripts\activate +# pip install -e ".[api]" + +# 构建前端代码 +cd lightrag_webui +bun install --frozen-lockfile +bun run build +cd .. +``` + +### 启动 LightRAG 服务器前的准备 + +LightRAG 需要同时集成 LLM(大型语言模型)和嵌入模型以有效执行文档索引和查询操作。在首次部署 LightRAG 服务器之前,必须配置 LLM 和嵌入模型的设置。LightRAG 支持绑定到各种 LLM/嵌入后端: + +* ollama +* lollms +* openai 或 openai 兼容 +* azure_openai +* aws_bedrock + +建议使用环境变量来配置 LightRAG 服务器。项目根目录中有一个名为 `env.example` 的示例环境变量文件。请将此文件复制到启动目录并重命名为 `.env`。之后,您可以在 `.env` 文件中修改与 LLM 和嵌入模型相关的参数。需要注意的是,LightRAG 服务器每次启动时都会将 `.env` 中的环境变量加载到系统环境变量中。**LightRAG 服务器会优先使用系统环境变量中的设置**。 + +> 由于安装了 Python 扩展的 VS Code 可能会在集成终端中自动加载 .env 文件,请在每次修改 .env 文件后打开新的终端会话。 + +以下是 LLM 和嵌入模型的一些常见设置示例: + +* OpenAI LLM + Ollama 嵌入 + +``` +LLM_BINDING=openai +LLM_MODEL=gpt-4o +LLM_BINDING_HOST=https://api.openai.com/v1 +LLM_BINDING_API_KEY=your_api_key + +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +# EMBEDDING_BINDING_API_KEY=your_api_key +``` + +* Ollama LLM + Ollama 嵌入 + +``` +LLM_BINDING=ollama +LLM_MODEL=mistral-nemo:latest +LLM_BINDING_HOST=http://localhost:11434 +# LLM_BINDING_API_KEY=your_api_key +### Ollama 服务器上下文 token 数(必须大于 MAX_TOTAL_TOKENS+2000) +OLLAMA_LLM_NUM_CTX=8192 + +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +# EMBEDDING_BINDING_API_KEY=your_api_key +``` + +> **重要提示**:在文档索引前必须确定使用的Embedding模型,且在文档查询阶段必须沿用与索引阶段相同的模型。有些存储(例如PostgreSQL)在首次建立数表的时候需要确定向量维度,因此更换Embedding模型后需要删除向量相关库表,以便让LightRAG重建新的库表。 + +### 启动 LightRAG 服务器 + +LightRAG 服务器支持两种运行模式: +* 简单高效的 Uvicorn 模式 + +``` +lightrag-server +``` +* 多进程 Gunicorn + Uvicorn 模式(生产模式,不支持 Windows 环境) + +``` +lightrag-gunicorn --workers 4 +``` +启动LightRAG的时候,当前工作目录必须含有`.env`配置文件。**要求将.env文件置于启动目录中是经过特意设计的**。 这样做的目的是支持用户同时启动多个LightRAG实例,并为不同实例配置不同的.env文件。**修改.env文件后,您需要重新打开终端以使新设置生效**。 这是因为每次启动时,LightRAG Server会将.env文件中的环境变量加载至系统环境变量,且系统环境变量的设置具有更高优先级。 + +启动时可以通过命令行参数覆盖`.env`文件中的配置。常用的命令行参数包括: + +- `--host`:服务器监听地址(默认:0.0.0.0) +- `--port`:服务器监听端口(默认:9621) +- `--timeout`:LLM 请求超时时间(默认:150 秒) +- `--log-level`:日志级别(默认:INFO) +- `--working-dir`:数据库持久化目录(默认:./rag_storage) +- `--input-dir`:上传文件存放目录(默认:./inputs) +- `--workspace`: 工作空间名称,用于逻辑上隔离多个LightRAG实例之间的数据(默认:空) + +### 使用 Docker 启动 LightRAG 服务器 + +使用 Docker Compose 是部署和运行 LightRAG Server 最便捷的方式。 +- 创建一个项目目录。 +- 将 LightRAG 仓库中的 `docker-compose.yml` 文件复制到您的项目目录中。 +- 准备 `.env` 文件:复制示例文件 [`env.example`](https://ai.znipower.com:5013/c/env.example) 创建自定义的 `.env` 文件,并根据您的具体需求配置 LLM 和嵌入参数。 + +* 通过以下命令启动 LightRAG 服务器: + +```shell +docker compose up +# 如果希望启动后让程序退到后台运行,需要在命令的最后添加 -d 参数 +``` +> 可以通过以下链接获取官方的docker compose文件:[docker-compose.yml]( https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml) 。如需获取LightRAG的历史版本镜像,可以访问以下链接: [LightRAG Docker Images]( https://github.com/HKUDS/LightRAG/pkgs/container/lightrag). 如需获取更多关于docker部署的信息,请参阅 [DockerDeployment.md](./../../docs/DockerDeployment.md). + +### 离线部署 + +官方的 LightRAG Docker 镜像完全兼容离线或隔离网络环境。如需搭建自己的离线部署环境,请参考 [离线部署指南](./../../docs/OfflineDeployment.md)。 + +### 启动多个LightRAG实例 + +有两种方式可以启动多个LightRAG实例。第一种方式是为每个实例配置一个完全独立的工作环境。此时需要为每个实例创建一个独立的工作目录,然后在这个工作目录上放置一个当前实例专用的`.env`配置文件。不同实例的配置文件中的服务器监听端口不能重复,然后在工作目录上执行 lightrag-server 启动服务即可。 + +第二种方式是所有实例共享一套相同的`.env`配置文件,然后通过命令行参数来为每个实例指定不同的服务器监听端口和工作空间。你可以在同一个工作目录中通过不同的命令行参数启动多个LightRAG实例。例如: + +``` +# 启动实例1 +lightrag-server --port 9621 --workspace space1 + +# 启动实例2 +lightrag-server --port 9622 --workspace space2 +``` + +工作空间的作用是实现不同实例之间的数据隔离。因此不同实例之间的`workspace`参数必须不同,否则会导致数据混乱,数据将会被破坏。 + +通过 Docker Compose 启动多个 LightRAG 实例时,只需在 `docker-compose.yml` 中为每个容器指定不同的 `WORKSPACE` 和 `PORT` 环境变量即可。即使所有实例共享同一个 `.env` 文件,Compose 中定义的容器环境变量也会优先覆盖 `.env` 文件中的同名设置,从而确保每个实例拥有独立的配置。 + +### LightRAG实例间的数据隔离 + +每个实例配置一个独立的工作目录和专用`.env`配置文件通常能够保证内存数据库中的本地持久化文件保存在各自的工作目录,实现数据的相互隔离。LightRAG默认存储全部都是内存数据库,通过这种方式进行数据隔离是没有问题的。但是如果使用的是外部数据库,如果不同实例访问的是同一个数据库实例,就需要通过配置工作空间来实现数据隔离,否则不同实例的数据将会出现冲突并被破坏。 + +命令行的 workspace 参数和`.env`文件中的环境变量`WORKSPACE` 都可以用于指定当前实例的工作空间名字,命令行参数的优先级别更高。下面是不同类型的存储实现工作空间的方式: + +- **对于本地基于文件的数据库,数据隔离通过工作空间子目录实现:** JsonKVStorage, JsonDocStatusStorage, NetworkXStorage, NanoVectorDBStorage, FaissVectorDBStorage。 +- **对于将数据存储在集合(collection)中的数据库,通过在集合名称前添加工作空间前缀来实现:** RedisKVStorage, RedisDocStatusStorage, MilvusVectorDBStorage, QdrantVectorDBStorage, MongoKVStorage, MongoDocStatusStorage, MongoVectorDBStorage, MongoGraphStorage, PGGraphStorage。 +- **对于关系型数据库,数据隔离通过向表中添加 `workspace` 字段进行数据的逻辑隔离:** PGKVStorage, PGVectorStorage, PGDocStatusStorage。 + +* **对于Neo4j图数据库,通过label来实现数据的逻辑隔离**:Neo4JStorage + +为了保持对遗留数据的兼容,在未配置工作空间时PostgreSQL的默认工作空间为`default`,Neo4j的默认工作空间为`base`。对于所有的外部存储,系统都提供了专用的工作空间环境变量,用于覆盖公共的 `WORKSPACE`环境变量配置。这些适用于指定存储类型的工作空间环境变量为:`REDIS_WORKSPACE`, `MILVUS_WORKSPACE`, `QDRANT_WORKSPACE`, `MONGODB_WORKSPACE`, `POSTGRES_WORKSPACE`, `NEO4J_WORKSPACE`。 + +### Gunicorn + Uvicorn 的多工作进程 + +LightRAG 服务器可以在 `Gunicorn + Uvicorn` 预加载模式下运行。Gunicorn 的多工作进程(多进程)功能可以防止文档索引任务阻塞 RAG 查询。使用 CPU 密集型文档提取工具(如 docling)在纯 Uvicorn 模式下可能会导致整个系统被阻塞。 + +虽然 LightRAG 服务器使用一个工作进程来处理文档索引流程,但通过 Uvicorn 的异步任务支持,可以并行处理多个文件。文档索引速度的瓶颈主要在于 LLM。如果您的 LLM 支持高并发,您可以通过增加 LLM 的并发级别来加速文档索引。以下是几个与并发处理相关的环境变量及其默认值: + +``` +### 工作进程数,数字不大于 (2 x 核心数) + 1 +WORKERS=2 +### 一批中并行处理的文件数 +MAX_PARALLEL_INSERT=2 +# LLM 的最大并发请求数 +MAX_ASYNC=4 +``` + +### 将 Lightrag 安装为 Linux 服务 + +从示例文件 `lightrag.service.example` 创建您的服务文件 `lightrag.service`。修改服务文件中的服务启动定义: + +```text +# Set Enviroment to your Python virtual enviroment +Environment="PATH=/home/netman/lightrag-xyj/venv/bin" +WorkingDirectory=/home/netman/lightrag-xyj +# ExecStart=/home/netman/lightrag-xyj/venv/bin/lightrag-server +ExecStart=/home/netman/lightrag-xyj/venv/bin/lightrag-gunicorn +``` +> ExecStart命令必须是 lightrag-gunicorn 或 lightrag-server 中的一个,不能使用其它脚本包裹它们。因为停止服务必须要求主进程必须是这两个进程。 + +安装 LightRAG 服务。如果您的系统是 Ubuntu,以下命令将生效: + +```shell +sudo cp lightrag.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl start lightrag.service +sudo systemctl status lightrag.service +sudo systemctl enable lightrag.service +``` + +## Ollama 模拟 + +我们为 LightRAG 提供了 Ollama 兼容接口,旨在将 LightRAG 模拟为 Ollama 聊天模型。这使得支持 Ollama 的 AI 聊天前端(如 Open WebUI)可以轻松访问 LightRAG。 + +### 将 Open WebUI 连接到 LightRAG + +启动 lightrag-server 后,您可以在 Open WebUI 管理面板中添加 Ollama 类型的连接。然后,一个名为 `lightrag:latest` 的模型将出现在 Open WebUI 的模型管理界面中。用户随后可以通过聊天界面向 LightRAG 发送查询。对于这种用例,最好将 LightRAG 安装为服务。 + +Open WebUI 使用 LLM 来执行会话标题和会话关键词生成任务。因此,Ollama 聊天补全 API 会检测并将 OpenWebUI 会话相关请求直接转发给底层 LLM。Open WebUI 的截图: + +![image-20250323194750379](./README.assets/image-20250323194750379.png) + +### 在聊天中选择查询模式 + +如果您从 LightRAG 的 Ollama 接口发送消息(查询),默认查询模式是 `hybrid`。您可以通过发送带有查询前缀的消息来选择查询模式。 + +查询字符串中的查询前缀可以决定使用哪种 LightRAG 查询模式来生成响应。支持的前缀包括: + +``` +/local +/global +/hybrid +/naive +/mix + +/bypass +/context +/localcontext +/globalcontext +/hybridcontext +/naivecontext +/mixcontext +``` + +例如,聊天消息 "/mix 唐僧有几个徒弟" 将触发 LightRAG 的混合模式查询。没有查询前缀的聊天消息默认会触发混合模式查询。 + +"/bypass" 不是 LightRAG 查询模式,它会告诉 API 服务器将查询连同聊天历史直接传递给底层 LLM。因此用户可以使用 LLM 基于聊天历史回答问题。如果您使用 Open WebUI 作为前端,您可以直接切换到普通 LLM 模型,而不是使用 /bypass 前缀。 + +"/context" 也不是 LightRAG 查询模式,它会告诉 LightRAG 只返回为 LLM 准备的上下文信息。您可以检查上下文是否符合您的需求,或者自行处理上下文。 + +### 在聊天中添加用户提示词 + +使用LightRAG进行内容查询时,应避免将搜索过程与无关的输出处理相结合,这会显著影响查询效果。用户提示(user prompt)正是为解决这一问题而设计 -- 它不参与RAG检索阶段,而是在查询完成后指导大语言模型(LLM)如何处理检索结果。我们可以在查询前缀末尾添加方括号,从而向LLM传递用户提示词: + +``` +/[使用mermaid格式画图] 请画出 Scrooge 的人物关系图谱 +/mix[使用mermaid格式画图] 请画出 Scrooge 的人物关系图谱 +``` + +## API 密钥和认证 + +默认情况下,LightRAG 服务器可以在没有任何认证的情况下访问。我们可以使用 API 密钥或账户凭证配置服务器以确保其安全。 + +* API 密钥 + +``` +LIGHTRAG_API_KEY=your-secure-api-key-here +WHITELIST_PATHS=/health,/api/* +``` + +> 健康检查和 Ollama 模拟端点默认不进行 API 密钥检查。为了安全原因,如果不需要提供Ollama服务,应该把`/api/*`从WHITELIST_PATHS中移除。 + +API Key使用的请求头是 `X-API-Key` 。以下是使用API访问LightRAG Server的一个例子: + +``` +curl -X 'POST' \ + 'http://localhost:9621/documents/scan' \ + -H 'accept: application/json' \ + -H 'X-API-Key: your-secure-api-key-here-123' \ + -d '' +``` + +* 账户凭证(Web 界面需要登录后才能访问) + +LightRAG API 服务器使用基于 HS256 算法的 JWT 认证。要启用安全访问控制,需要以下环境变量: + +```bash +# JWT 认证 +AUTH_ACCOUNTS='admin:admin123,user1:pass456' +TOKEN_SECRET='your-key' +TOKEN_EXPIRE_HOURS=4 +``` + +> 目前仅支持配置一个管理员账户和密码。尚未开发和实现完整的账户系统。 + +如果未配置账户凭证,Web 界面将以访客身份访问系统。因此,即使仅配置了 API 密钥,所有 API 仍然可以通过访客账户访问,这仍然不安全。因此,要保护 API,需要同时配置这两种认证方法。 + +## Azure OpenAI 后端配置 + +可以使用以下 Azure CLI 命令创建 Azure OpenAI API(您需要先从 [https://docs.microsoft.com/en-us/cli/azure/install-azure-cli](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) 安装 Azure CLI): + +```bash +# 根据需要更改资源组名称、位置和 OpenAI 资源名称 +RESOURCE_GROUP_NAME=LightRAG +LOCATION=swedencentral +RESOURCE_NAME=LightRAG-OpenAI + +az login +az group create --name $RESOURCE_GROUP_NAME --location $LOCATION +az cognitiveservices account create --name $RESOURCE_NAME --resource-group $RESOURCE_GROUP_NAME --kind OpenAI --sku S0 --location swedencentral +az cognitiveservices account deployment create --resource-group $RESOURCE_GROUP_NAME --model-format OpenAI --name $RESOURCE_NAME --deployment-name gpt-4o --model-name gpt-4o --model-version "2024-08-06" --sku-capacity 100 --sku-name "Standard" +az cognitiveservices account deployment create --resource-group $RESOURCE_GROUP_NAME --model-format OpenAI --name $RESOURCE_NAME --deployment-name text-embedding-3-large --model-name text-embedding-3-large --model-version "1" --sku-capacity 80 --sku-name "Standard" +az cognitiveservices account show --name $RESOURCE_NAME --resource-group $RESOURCE_GROUP_NAME --query "properties.endpoint" +az cognitiveservices account keys list --name $RESOURCE_NAME -g $RESOURCE_GROUP_NAME +``` + +最后一个命令的输出将提供 OpenAI API 的端点和密钥。您可以使用这些值在 `.env` 文件中设置环境变量。 + +``` +# .env 中的 Azure OpenAI 配置 +LLM_BINDING=azure_openai +LLM_BINDING_HOST=your-azure-endpoint +LLM_MODEL=your-model-deployment-name +LLM_BINDING_API_KEY=your-azure-api-key +### API Version可选,默认为最新版本 +AZURE_OPENAI_API_VERSION=2024-08-01-preview + +### 如果使用 Azure OpenAI 进行嵌入 +EMBEDDING_BINDING=azure_openai +EMBEDDING_MODEL=your-embedding-deployment-name +``` + +## LightRAG 服务器详细配置 + +API 服务器可以通过三种方式配置(优先级从高到低): + +* 命令行参数 +* 环境变量或 .env 文件 +* Config.ini(仅用于存储配置) + +大多数配置都有默认设置,详细信息请查看示例文件:`.env.example`。数据存储配置也可以通过 config.ini 设置。为方便起见,提供了示例文件 `config.ini.example`。 + +### 支持的 LLM 和嵌入后端 + +LightRAG 支持绑定到各种 LLM/嵌入后端: + +* ollama +* openai (含openai 兼容) +* azure_openai +* lollms +* aws_bedrock + +使用环境变量 `LLM_BINDING` 或 CLI 参数 `--llm-binding` 选择 LLM 后端类型。使用环境变量 `EMBEDDING_BINDING` 或 CLI 参数 `--embedding-binding` 选择嵌入后端类型。 + +LLM和Embedding配置例子请查看项目根目录的 env.example 文件。OpenAI和Ollama兼容LLM接口的支持的完整配置选型可以通过一下命令查看: + +``` +lightrag-server --llm-binding openai --help +lightrag-server --llm-binding ollama --help +lightrag-server --embedding-binding ollama --help +``` + +> 请使用openai兼容方式访问OpenRouter、vLLM或SLang部署的LLM。可以通过 `OPENAI_LLM_EXTRA_BODY` 环境变量给OpenRouter、vLLM或SGLang推理框架传递额外的参数,实现推理模式的关闭或者其它个性化控制。 + +设置 `max_tokens` 参数旨在**防止在实体关系提取阶段出现LLM 响应输出过长或无休止的循环输出的问题**。设置 `max_tokens` 参数的目的是在超时发生之前截断 LLM 输出,从而防止文档提取失败。这解决了某些包含大量实体和关系的文本块(例如表格或引文)可能导致 LLM 产生过长甚至无限循环输出的问题。此设置对于本地部署的小参数模型尤为重要。`max_tokens` 值可以通过以下公式计算: + +``` +# For vLLM/SGLang doployed models, or most of OpenAI compatible API provider +OPENAI_LLM_MAX_TOKENS=9000 + +# For Ollama Deployed Modeles +OLLAMA_LLM_NUM_PREDICT=9000 + +# For OpenAI o1-mini or newer modles +OPENAI_LLM_MAX_COMPLETION_TOKENS=9000 +``` + +### 实体提取配置 + +* ENABLE_LLM_CACHE_FOR_EXTRACT:为实体提取启用 LLM 缓存(默认:true) + +在测试环境中将 `ENABLE_LLM_CACHE_FOR_EXTRACT` 设置为 true 以减少 LLM 调用成本是很常见的做法。 + +### 支持的存储类型 + +LightRAG 使用 4 种类型的存储用于不同目的: + +* KV_STORAGE:llm 响应缓存、文本块、文档信息 +* VECTOR_STORAGE:实体向量、关系向量、块向量 +* GRAPH_STORAGE:实体关系图 +* DOC_STATUS_STORAGE:文档索引状态 + +每种存储类型都有多种存储实现方式。LightRAG Server默认的存储实现为内存数据库,数据通过文件持久化保存到WORKING_DIR目录。LightRAG还支持PostgreSQL、MongoDB、FAISS、Milvus、Qdrant、Neo4j、Memgraph和Redis等存储实现方式。详细的存储支持方式请参考根目录下的`README.md`文件中关于存储的相关内容。 + +您可以通过环境变量选择存储实现。例如,在首次启动 API 服务器之前,您可以将以下环境变量设置为特定的存储实现名称: + +``` +LIGHTRAG_KV_STORAGE=PGKVStorage +LIGHTRAG_VECTOR_STORAGE=PGVectorStorage +LIGHTRAG_GRAPH_STORAGE=PGGraphStorage +LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage +``` + +在向 LightRAG 添加文档后,您不能更改存储实现选择。目前尚不支持从一个存储实现迁移到另一个存储实现。更多配置信息请阅读示例 `env.exampl`e文件。 + +### 在不同存储类型之间迁移LLM缓存 + +当LightRAG更换存储实现方式的时候,可以LLM缓存从就的存储迁移到新的存储。先以后在新的存储上重新上传文件时,将利用利用原有存储的LLM缓存大幅度加快文件处理的速度。LLM缓存迁移工具的使用方法请参考[README_MIGRATE_LLM_CACHE.md](../tools/README_MIGRATE_LLM_CACHE.md) + +### LightRag API 服务器命令行选项 + +| 参数 | 默认值 | 描述 | +|-----------|---------|-------------| +| --host | 0.0.0.0 | 服务器主机 | +| --port | 9621 | 服务器端口 | +| --working-dir | ./rag_storage | RAG 存储的工作目录 | +| --input-dir | ./inputs | 包含输入文档的目录 | +| --max-async | 4 | 最大异步操作数 | +| --log-level | INFO | 日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL) | +| --verbose | - | 详细调试输出(True、False) | +| --key | None | 用于认证的 API 密钥。保护 lightrag 服务器免受未授权访问 | +| --ssl | False | 启用 HTTPS | +| --ssl-certfile | None | SSL 证书文件路径(如果启用 --ssl 则必需) | +| --ssl-keyfile | None | SSL 私钥文件路径(如果启用 --ssl 则必需) | +| --llm-binding | ollama | LLM 绑定类型(lollms、ollama、openai、openai-ollama、azure_openai、aws_bedrock) | +| --embedding-binding | ollama | 嵌入绑定类型(lollms、ollama、openai、azure_openai、aws_bedrock) | + +### Reranking 配置 + +Reranking 查询召回的块可以显著提高检索质量,它通过基于优化的相关性评分模型对文档重新排序。LightRAG 目前支持以下 rerank 提供商: + +- **Cohere / vLLM**:提供与 Cohere AI 的 `v2/rerank` 端点的完整 API 集成。由于 vLLM 提供了与 Cohere 兼容的 reranker API,因此也支持所有通过 vLLM 部署的 reranker 模型。 +- **Jina AI**:提供与所有 Jina rerank 模型的完全实现兼容性。 +- **阿里云**:具有旨在支持阿里云 rerank API 格式的自定义实现。 + +Rerank 提供商通过 `.env` 文件进行配置。以下是使用 vLLM 本地部署的 rerank 模型的示例配置: + +``` +RERANK_BINDING=cohere +RERANK_MODEL=BAAI/bge-reranker-v2-m3 +RERANK_BINDING_HOST=http://localhost:8000/v1/rerank +RERANK_BINDING_API_KEY=your_rerank_api_key_here +``` + +以下是使用阿里云提供的 Reranker 服务的示例配置: + +``` +RERANK_BINDING=aliyun +RERANK_MODEL=gte-rerank-v2 +RERANK_BINDING_HOST=https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank +RERANK_BINDING_API_KEY=your_rerank_api_key_here +``` + +有关完整的 reranker 配置示例,请参阅 `env.example` 文件。 + +### 启用 Reranking + +可以按查询启用或禁用 Reranking。 + +`/query` 和 `/query/stream` API 端点包含一个 `enable_rerank` 参数,默认设置为 `true`,用于控制当前查询是否激活 reranking。要将 `enable_rerank` 参数的默认值更改为 `false`,请设置以下环境变量: + +``` +RERANK_BY_DEFAULT=False +``` + +### .env 文件示例 + +```bash +### Server Configuration +# HOST=0.0.0.0 +PORT=9621 +WORKERS=2 + +### Settings for document indexing +ENABLE_LLM_CACHE_FOR_EXTRACT=true +SUMMARY_LANGUAGE=Chinese +MAX_PARALLEL_INSERT=2 + +### LLM Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal) +TIMEOUT=150 +MAX_ASYNC=4 + +LLM_BINDING=openai +LLM_MODEL=gpt-4o-mini +LLM_BINDING_HOST=https://api.openai.com/v1 +LLM_BINDING_API_KEY=your-api-key + +### Embedding Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal) +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 + +### For JWT Auth +# AUTH_ACCOUNTS='admin:admin123,user1:pass456' +# TOKEN_SECRET=your-key-for-LightRAG-API-Server-xxx +# TOKEN_EXPIRE_HOURS=48 + +# LIGHTRAG_API_KEY=your-secure-api-key-here-123 +# WHITELIST_PATHS=/api/* +# WHITELIST_PATHS=/health,/api/* +``` + +#### 使用 ollama 默认本地服务器作为 llm 和嵌入后端运行 Lightrag 服务器 + +Ollama 是 llm 和嵌入的默认后端,因此默认情况下您可以不带参数运行 lightrag-server,将使用默认值。确保已安装 ollama 并且正在运行,且默认模型已安装在 ollama 上。 + +```bash +# 使用 ollama 运行 lightrag,llm 使用 mistral-nemo:latest,嵌入使用 bge-m3:latest +lightrag-server + +# 使用认证密钥 +lightrag-server --key my-key +``` + +#### 使用 lollms 默认本地服务器作为 llm 和嵌入后端运行 Lightrag 服务器 + +```bash +# 使用 lollms 运行 lightrag,llm 使用 mistral-nemo:latest,嵌入使用 bge-m3:latest +# 在 .env 或 config.ini 中配置 LLM_BINDING=lollms 和 EMBEDDING_BINDING=lollms +lightrag-server + +# 使用认证密钥 +lightrag-server --key my-key +``` + +#### 使用 openai 服务器作为 llm 和嵌入后端运行 Lightrag 服务器 + +```bash +# 使用 openai 运行 lightrag,llm 使用 GPT-4o-mini,嵌入使用 text-embedding-3-small +# 在 .env 或 config.ini 中配置: +# LLM_BINDING=openai +# LLM_MODEL=GPT-4o-mini +# EMBEDDING_BINDING=openai +# EMBEDDING_MODEL=text-embedding-3-small +lightrag-server + +# 使用认证密钥 +lightrag-server --key my-key +``` + +#### 使用 azure openai 服务器作为 llm 和嵌入后端运行 Lightrag 服务器 + +```bash +# 使用 azure_openai 运行 lightrag +# 在 .env 或 config.ini 中配置: +# LLM_BINDING=azure_openai +# LLM_MODEL=your-model +# EMBEDDING_BINDING=azure_openai +# EMBEDDING_MODEL=your-embedding-model +lightrag-server + +# 使用认证密钥 +lightrag-server --key my-key +``` + +**重要说明:** +- 对于 LoLLMs:确保指定的模型已安装在您的 LoLLMs 实例中 +- 对于 Ollama:确保指定的模型已安装在您的 Ollama 实例中 +- 对于 OpenAI:确保您已设置 OPENAI_API_KEY 环境变量 +- 对于 Azure OpenAI:按照先决条件部分所述构建和配置您的服务器 + +要获取任何服务器的帮助,使用 --help 标志: +```bash +lightrag-server --help +``` + +注意:如果您不需要 API 功能,可以使用以下命令安装不带 API 支持的基本包: +```bash +pip install lightrag-hku +``` + +## 文档和块处理逻辑说明 + +LightRAG 中的文档处理流程有些复杂,分为两个主要阶段:提取阶段(实体和关系提取)和合并阶段(实体和关系合并)。有两个关键参数控制流程并发性:并行处理的最大文件数(`MAX_PARALLEL_INSERT`)和最大并发 LLM 请求数(`MAX_ASYNC`)。工作流程描述如下: + +1. `MAX_ASYNC` 限制系统中并发 LLM 请求的总数,包括查询、提取和合并的请求。LLM 请求具有不同的优先级:查询操作优先级最高,其次是合并,然后是提取。 +2. `MAX_PARALLEL_INSERT` 控制提取阶段并行处理的文件数量。`MAX_PARALLEL_INSERT`建议设置为2~10之间,通常设置为 `MAX_ASYNC/3`,设置太大会导致合并阶段不同文档之间实体和关系重名的机会增大,降低合并阶段的效率。 +3. 在单个文件中,来自不同文本块的实体和关系提取是并发处理的,并发度由 `MAX_ASYNC` 设置。只有在处理完 `MAX_ASYNC` 个文本块后,系统才会继续处理同一文件中的下一批文本块。 +4. 当一个文件完成实体和关系提后,将进入实体和关系合并阶段。这一阶段也会并发处理多个实体和关系,其并发度同样是由 `MAX_ASYNC` 控制。 +5. 合并阶段的 LLM 请求的优先级别高于提取阶段,目的是让进入合并阶段的文件尽快完成处理,并让处理结果尽快更新到向量数据库中。 +6. 为防止竞争条件,合并阶段会避免并发处理同一个实体或关系,当多个文件中都涉及同一个实体或关系需要合并的时候他们会串行执行。 +7. 每个文件在流程中被视为一个原子处理单元。只有当其所有文本块都完成提取和合并后,文件才会被标记为成功处理。如果在处理过程中发生任何错误,整个文件将被标记为失败,并且必须重新处理。 +8. 当由于错误而重新处理文件时,由于 LLM 缓存,先前处理的文本块可以快速跳过。尽管 LLM 缓存在合并阶段也会被利用,但合并顺序的不一致可能会限制其在此阶段的有效性。 +9. 如果在提取过程中发生错误,系统不会保留任何中间结果。如果在合并过程中发生错误,已合并的实体和关系可能会被保留;当重新处理同一文件时,重新提取的实体和关系将与现有实体和关系合并,而不会影响查询结果。 +10. 在合并阶段结束时,所有实体和关系数据都会在向量数据库中更新。如果此时发生错误,某些更新可能会被保留。但是,下一次处理尝试将覆盖先前结果,确保成功重新处理的文件不会影响未来查询结果的完整性。 + +大型文件应分割成较小的片段以启用增量处理。可以通过在 Web UI 上按“扫描”按钮来启动失败文件的重新处理。 + +## API 端点 + +所有服务器(LoLLMs、Ollama、OpenAI 和 Azure OpenAI)都为 RAG 功能提供相同的 REST API 端点。当 API 服务器运行时,访问: + +- Swagger UI:http://localhost:9621/docs +- ReDoc:http://localhost:9621/redoc + +您可以使用提供的 curl 命令或通过 Swagger UI 界面测试 API 端点。确保: + +1. 启动适当的后端服务(LoLLMs、Ollama 或 OpenAI) +2. 启动 RAG 服务器 +3. 使用文档管理端点上传一些文档 +4. 使用查询端点查询系统 +5. 如果在输入目录中放入新文件,触发文档扫描 + +## 异步文档索引与进度跟踪 + +LightRAG采用异步文档索引机制,便于前端监控和查询文档处理进度。用户通过指定端点上传文件或插入文本时,系统将返回唯一的跟踪ID,以便实时监控处理进度。 + +**支持生成跟踪ID的API端点:** +* `/documents/upload` +* `/documents/text` +* `/documents/texts` + +**文档处理状态查询端点:** +* `/track_status/{track_id}` + +该端点提供全面的状态信息,包括: +* 文档处理状态(待处理/处理中/已处理/失败) +* 内容摘要和元数据 +* 处理失败时的错误信息 +* 创建和更新时间戳 diff --git a/LightRAG/lightrag/api/README.assets/image-20250323122538997.png b/LightRAG/lightrag/api/README.assets/image-20250323122538997.png new file mode 100644 index 0000000000000000000000000000000000000000..38743f7ea0922c419678b898f0875d146be4e146 GIT binary patch literal 383459 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%0A1q@8Sx5NTn-h08@Wj8sB*uENZp7dk7 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%0A4Wm^Ldyp!nAiUNVxK4RQB75T(hb*0tf@zaQ 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 literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag/api/README.assets/image-20250323122754387.png b/LightRAG/lightrag/api/README.assets/image-20250323122754387.png new file mode 100644 index 0000000000000000000000000000000000000000..4c91829ca0c190eccac6d99fcc1edd43d97c89de GIT binary patch literal 365491 zcmb@uby!>N(mo0l3X~#+A}uZjiWYY(UW&VWaW5{x-QA%`fkJT)PLbjiCs@%U!5tFL z>i&M;?>c+G?>>LLJzNWtYmuxxndhFFd+wPeLP0pC^Rb7X-7Yv!Y2czw>WJX8e8#6rwMT{7D_x zPn};?l$O5n9}0$necB#Tw6t4Mk6#>(Ka`iAptJ}gF<`>+?dr@LG2_H!Sik?quc(BJ`ot`;lq#)1n7vi!W4kX<3zPCkFk&Ypf$F;msKE z@r~=%MCL^KgKp83Y)Z^nsjvKA9~A4H-{LbV#Dr%XQG%HKqB+dEo$yA6&FK^!E9pZy zx_v4^rBreBRJMUr!2yv(#$5MrQVyXBg#};V3k@qMs zYS8hrS)=2Wrc?3p_+RvDTo>0`O0pt3#jkF51Vp+Fj=?^;Q%cuxvr=b zH5*%!khJp&0CkzY&!#d++$outql#4dh9M#L1Z3|QZDL1u>#R^2qmpe*%R^%wh)BGN z@a&6-o5yB!k0^hjOKJNJ6`kBFjv?gNG~SM@al z=#wmpw~-Ye2H$b3F7^qOd#-g zA*3T<7(F5hU_3_dpg;)rm%+hE?6U28^n!x;s}C7HvYgm!dQ_WkDJ9ItAblfpUNo$r z4-=2a{4v&^G-KHZq2{BW2WcAN_#ji`ApfL%A`$YDLVWOPZ72yP?ItFQsId}fGIFu# zZah(DajZAFQ0OhNY5ERlJGy$4{Xi%R$}EuXbLVF*|W#l_g(ioKS1_LX^ z^ryBXzaSxtzuel4BfcI6xqsFg$1(mj_tK-zz%U$tdP>f3XfrFPgvQo%dzb{WIT4Y4VEMrI0sr&MI_#-nzOa^v-M*(L z9j33fgetgZ9}RcYnoQN4RTs~{J0Lq?JMcWPvlY3d#tJL^NyN*e_l5;MEkZY3Hv|%C z^DU>}_2;dlxQCztszc0GkMw%WwV=;yKMpto{5kw_2l+!pzQh|EUR)&f@5pSQ(v@WA z6?tWw#XJ;HEU=gjs9gM9kGW>Ja=13Qc5G%Xb0-cyQF6Mx45Kah`ib=O z@+aTPA9E&F==B=bT$aldFK2TLpykXHEK~N=9baLRVU>9KNyT*vCE7a)EK+mt+*=O? zm+e}2Tn!Z`)7SYzc#3U@e!jlCFcM;Hw`>pb0-smzVeS(DLfw@+=h@Gj0ojRi9CHnF z&Ko)YFzSl8{$)qcxn$%qbo@#`X{;dXm-@NOxfr!jp%Hb)q(Y%W;WN`vr);Mhr@|9z zyhQXVno+YLS@8G#vQJjcR-dfecYQeuUQ99d+9qj-EmZUM3U>R1c-GxugmMS<(i=^4 zkm)Ef`7mwkOzSMwe$!@Wu48J_F=z_>s#n2YVO>$F-8)-3`*#29tiEcE>T*eB$*cmj zkrGmEduq35=VfQrXx!M>INIoN@E)27on3I9_ib{oAzV0W1g+&C;;btjOza(xO%5gO zXl-~5N31{pRsXH5Z})3mLtU3=)|o!x7rEx)CuweJ4wd$mDszwL5P4Lao;NYuFTcn9 z@Z1IetUzFPdE7U`JL}E@TQg2Du9pntx#;o1^YF@tErw10jonqfFsmtR<(xtlnM134 z7(@3H;|zAaNkAp6YNvgv!ka< z*x?wZSRN#nBfwD_Mlr|Hh{;H%$o>!8<%NO;y6w`DpJRN9f%3943wft0#NWSeVHG>8G!L9b+wp%vR-7j2)XbwvfDV! zmePw&r^^p2d>3ZXAhd`W-y+%^8Q)FRl6&_`$VF(|K3jkuGv)Amh_l63hTP+J~vOYftIz@=?O^&eksL?je+M3?vLc?Qrcu-FX8`wdVS2_h&YfV|^3r z(|u66_o>NDyR1(b7MqgmIc;{2`Y!wM`^ZyYG1)Lrvc6{6)g`NM>riV^(^+iqap}9v zdn1Al+SA*ucRm|BGQY1K-n!gM*)r5T(a?u4{M`AHC#_lX^-yo4^#ep_N#|ryVBcpJ zTCP-1U;0azyraYFk+1kdC^qqqZJXMzUW+fDRg$f$qPmv)@Q0~U8y?WtvCas|lEidT3zjW@Bvm-uk*oNcr(-yUSV_LE*$}UZi zg|u^|ZONza;@y;bTKRyV`wdL1#KvNZtI39WZn>(-O@5!>vv;RIBMZ*My0pI3>MXGC zHkZ>Z;10HMyIR^>^>tGGcm##r-%(>nl9`aF3aR+2-Dn*-LCI4=oR`g)*}pE1+HYyL zzXu5$td^IwD0W_^2^I>L``BN%9foW~H3oDA?6X?59e`eWa-FuGD>jHUwbgjIoU^WW zR$|d&U3R8)koq?5wU6DklV^+6V@qNR!P8+*X3YmlVO7G(Mif>_?1nn;D*A zhp(&RogyToWTYvM#Y;8H2x9mOa*x)Q4G`#M5tJrdvN=tC8p-f1@4bzpyFlwFH{S2{ z5G_Sxe3(q~9Q^R<2<6&&hty&xRT|df?ps$&gjxe(R$Htb*zo`$gUk zsPrz6V6cuq2($=7WClG&`GA`G3Lvqz=325Jzw5Rm`RV-$ef-#_ud@9*dQ&n;3u(*HgJgCPIW|K3OG`Tfumv!6u3 z4Z5R@whICR0k8&wSBSDIG{*=Cq6o4QVrm|U2RW$O>U|dj*mC;uvFEiPkulKd^HrWd zuW^qFpEs4W1;x}zFtNQftzgUi7T6!DC4*KFo=+tidEOy+)XsEJI}Gx>g0=`;b$A;t zARQb!Tnm2K9?7`$by$VuT!D8|lM-`=QVzCUE@(uN{_#;9-PN7gnwLmB!fdtATvmlq znT0Il|4)y6OSEL7PbUd1(?U!80!wFvqr(Y>@d)Vu_@EEyWj+^LI%5ngy_b1DM)rk^ z^owUf{?s45V;V;ZJYKc+RdFuGx7Bgao$Q<{3rh!B_D*oU3Vuoab4$|1a|RR;91>i3 zT!u!v*m~zqoc?_NonUSWg|sOj_V#COz(2JrupRjlIP|5Zz;)KeUROGqj(PKbtCtkA zsNHzAe}t+v4~L&<(IMhe{L_P;3@HTv7cE3Y`@sVYn8IYtonEq5l25b1^wl1!%=hd5 z;327hetC)jTuF)-hz^Hhu7hnrMnG%+)HM}t$*e5O*(#XOrD1{x=Xw&}FEdlnD_Y{qW zVTk!jr-$h`n>fj;H@@Nn@@jg-{Gy`b#{JPVP5E}M-+C?;%}6ec75)IYj@Rfk)Lk)K z#O3ntFNRCmJ4wlj9qH_-A^4ViOY&(H zxcrFw=bJW!6j1Pdy8k6(1@lPdLGNPk!7svc`2ox!j73)Kih}2z1ZEXlzJZH@wwIp+ z7lUkn;eBWtkn0~`9XC|`C=3#rmHp?DssfLm;l#FJBlreoA;|Xf41b!;Y)ZIhae5$+ zuqX}`9o*NTOzImN82+L678!U%YjA#}gk4Sl1ox)c#sc(vYLr)-*-nYbKaXuByU39e zOg47xD;_nAL5sKzySRw}=bdrtISo8NiB^A(G-oz|c7|Pxx=Nwu#PTQ>Y)t%t@!tsqyp1wHL+B%>D-|02+y=9Q^WO*B8ef|ExMGTV&hv_OC^z;* z>Lo$Rw~w0c_FEl0g$#ry{fzyrr4RFl?M*ZO`Nqqv4ZgyWb0nVK{(WKH|9fHVVc1#N zjpPCbb*lVlhjfQ{p=Vi8(=^v0zpPHIP6<2y&)Z_K`WU`{ZuI!B1aXRI33l;{RE-|O za5oTXGHyf2O=tqvOP-Or20}HOtoNO73_F(%2dH4&VEZ&z@y1b>0b;p3o5LgG@k;2) zX|>bFg{ia>VjU6l_rh+=ET(wCp8=b*roz}wa%vOICK~~le;&ms0;rQj(+9Z+$;P)Gn)cmZ z&>XbtUpAr4B-M2D(BJGlJ$14(rqY?~)|BZN8Ju%Cn`6td!(gP_v$(ptk}bj_7q}Uy zgWPYK`M`X&|0MUI(Zxp_apzWb3T3oHi8cCJdKPWLhqJ&7!Zxfrs|8Cz`3|+~a}uzi z`};;MSMca>L+B4@-a%llknz<}{=`+fk!{|A8&=B-Uj6y^e-H?9f<$}XYOfNB!EkF9 zgxy~BLR^_`4jr!M@Gj1-#7Vy&lGh+VUPOu|^a0WC+D>puhL_7VuHzf)cnG}p((93^BcoH5{l+>t(70e8?J&2I(x87<4PUJE zOea5(G4_LV4=mh{A6jHQiu!*27)zA;pSw=Hzc@uD@9g^X;knfhb5Qosx_vS81}m~z zX$Tkg*%^Qcu*hP3plw3x{lmsB4V9PtH&oSI*l%RtS!ZpZEC$_Ae{Ki4u zy+fHHEopnW?{Fg?{>Ky=cw(O-MXKX05TQ+78<`FGO7-nBA*NsCT>!9#H9&;n&Pt?> z`DStCGh~W5#8vvJ=XVRP;HMyPrTHk-t>NY@@D}+Z2vc_FI4x+;n0r3sPf!#46iJLq zr*pItVtydHpGjw}3K|W%waVHS6K=#bFQRymiE5I!6KfF)EmJN& zZQ-aKSU1#~(UQ!D3Cujne$Tm^S#Q5nvuG=l`p;7>0OU~7Ql;6a7pdbv9t3 z&#S32LW9x+W`D$XJkXINEMSe*t#)&@+w&=@2{sFWi}&77SGIJL@5zWk69^o#RyBR^ zTZD2UpON(DjPOkw%Cc4mDhC+vAPu?iD?7BXhjiwa9Ohbc=yXE!XuW*^43^9LrYHSD zsq;KnG+&h4VZNFhLRNJEtcVTY)(;j9 z?P@{^ZKXcdZVy_<+>luI#LJjzst44C1GhigFf8T(iph#q0wApDD9|c?<9SAob9T4T zsAUc!-V>7@aEJ5+*BHA&fBh?Sz;#$<$fis38?|iEt?TUQA+mEukb08;9}JSrJNuHo zVzkjl+vVe2t;ki=4MdqWdQ`-(f`2g{V1Rt3SXns-9kK0!%Q{cZ@fU7ga)ufq=JkbS zW_6I?jB$}p!@lWeIAZ!|@1K-*j=#`K?WaYkCF zivAQYq=>rV`{Z1u@^+bpib~pmOWVm6Rk#G-^jpt0<}Wqg42!wW9~A97*@{suP-F@D zFXvh=9F@3ky1h8NwsQk_j$U5f0dc`iz*fdDYZl54df_VH*tv-N9iZO{HM`>fJd+j& z_)DK>ehclnUAX+036g)ia>Hn2-|5L6$^~|ARWj7H&?fn68cBg)zdYGu!FpOE_-Ows4lhlqx5|mg?Ls!Wj zg3EjdQ^Kw_hQYaa=c){6jC(^}9VQFk&!X%ezelgL``jaX&NVVd3JrWais$eQQ(q6 zwry#a)D?YNsIU0BqCE-3SBL!9$i8lI;)inr5=^5mHh}=H#Rb+`hyx)CK*9u;O-Kd)ndQg%2w5JySFng z@^JrQiV(?=X7l!VF32a)2L`LJY!QlG3_N|4WhcFm_t8glq#TQ3X{I#?Vs|pM2&AB) zlf?;pk?P8cTb@-Pms;7*N{z2NhSany4i15TLURyt>Cq6W*~b>@EXLhcKfk~6et^SD z(%IDLE7q5Ov(2Npt$C=MP-z9XfMWeq5rJJD!5$O*tHoHI%O)#*muo9NjaY85P-&&9 zRh9_09gp#6?-ybx?PXhTxkcY3oh2N}9%wOqv%pF3g2_`m?Qz@nJ%?hI2a!(qvZErUS8Q zz&_kjO7@BV(Ylnfk@K~ob5*O-6V-2rt+$;UzG}RXL#r(xwU^e$TjaX&HEx2;jOWp< zZ|s`7R}TZ^um)0J!ROOJk_`DBV|;({>cpjhJCbPS`IjYL`@I4jg+KcJpZEujBR%@& z_V!^WyZI1lyVu3->`1wCL=7_Yz;LgRoi`91-R#qHWWK#gH%p@ixM2==xO)O;+;rQ+ zZ+uy5k_%ixdiSj3QcPVHyrrc2nVEI!uiMKAX-?Vu{|NpR0RpV zDcSmGoC{hy6}6TdZC>ytQa_J&O z{+t^g`(O4?DHUyVbMu{oLhR=Dx|0$XSv@N^s~kVK*$`_f-Emad;v@fjI>8$ZLyJK#4vd8;O~@mWn+o3~rB zsW8{(o^8-IRA)|aU{Vk229P2sUX27?q_hNJw=wjP-x(>;83=r{y|!-NMlbfDN1YFF z)5u7eBHsSrqOdqe)XlBY%z`{WzPVmxa>+0O2MrH5Y$3`_1?w#mjpHDCFnVO~L6}cK zc097oS~YH$w^&~!{z&1vu|6u@UyEaU2r>nWFtmP(B~RG*R#?1;^|?Y3mcO4!r~H16 zGkDZcN?$b~xR2p!KZTA4rDOc)QDKMd4jQI@xyDyH*Nc(APk{OLc%mQIVRv=(^ej+C z&MQqC=ps)jvy$-= z{z_l{C5?cnL2W%(>D$D1gVKXiW@-k`o8^+uN+roRRw<5*Ht^BPMO1kA7nXtmEuZXSc`qmD zE%X=@A6cBoCJm;4Z>OUv0`6Q)9AZOA+)mKh1VISYG_rE;ev_niAr;#^*(BPW6(9>V zMPs_r{(a$0e}PgHe_4I%FlNIQV2l&&VXu`Uu)&QWZiJU z1ZDwgsNh?wj~3L>hCoSRLhC=<*lfv@RmnUz6CMYlV#DW25H!T-{@c5RBIA^$7p(t) zGr52y#Y82)xy7E&lVWVn#Ne6lt>D+Pc$XZEjgj!Z&qwkXDMQp2 ziMJPi+>2f82fHYuui zkx|hss8j)oatMTkYcK>t;x!ne>?-TK!^&o7U>6E#x>j4F5@`qi%IIW*{S6TEGBdrp zZK~R5r_P-kYCGVK`WFp;S&I$jjfIB}s^p^^4RYz#yrrh`@^rN>*L|lKO=X?iM8mJI zeobx&dmH_ik~5zZZ*Xkv^KlucNcWO%!n10WKpe~hI4fS6hx+9uRaVfW-=1QN=VFq~G`t7`!-{xx8Utm7xEPcM8NTgcZVLc>WRou6qqf44}t=W$`qe?c@cfM}WNnIDa;hhfN(LH^9Rg7I0@hEN?Xk}1dcz<#TU zA{=3R++&UX9Wf0H6x}?UAfdB%diO5!!Ho5^wMosoDw8u0d#+)IWJmtc(<|KjkD=m1`i@WhVDEAcRXlYvwO5Gre( zq7ctt1fQ^M1S*0wRzm{{hW^#UnR3k|0kgq)FHejUOG{?r$i`Xjs_#iwhH-2PueQ_0 zde-x?fEL1`;iJWi0B&X*5rMhdefK+Plc6O=YFI$T-y0ZcPwC;wCjkGYU_-(|TTjT! zVszn{do>$j@IQ-Np*!~bbVO=Sfc$%bIFkOILDH0;{@UlwPe=Q;@LZw~=S7y+4P#Z? z>06GRJsZ~#;L2N_hLD+tDiKXk!`*(h^g>{8AHS#)8JFlpen+gB@0tljdDg2%D&{5T zc}zFMU!u*w@^!K`QcKH9@M>r#?xV!nqlrov~i9Z_-;fi8pK$wzmLLrdBt11!c+}NG_Ut`;o3r z3ER$BA3oNRge3fbRE`0)@}eOknbet&>W}r;<^7*CN)pHv453}uT>+1XYS!(VmS=?=EaOsV=haNJ=Cb2iG=1^D!#2Ra49&&I zft_{wO~d?emBw{I%f%=v__yBszc0Fk z{JzWNUzuGd9AT9ew?~5RFYXvXo!k|Og0WRI5GuPr`?bhnRhZqV3xRIkihZ~brO~wC z=hZ6cp`A&$QI8DdlV0zz%926(uKg&MRA3VbVF^I7JbZhxZ@$qlpO~nkus2gqhe^zx zjHf85tRMmm@s%nUPS>qHj>`4-o%9ZQ@@$tyqCbY1C-j4x$x5`>9;O}h(3cu@@7ydp zRYQm+-{IoVpBsM+C1g{p zoK%||4rRh1Ip&|!p%vqco;0j{pBiFF?;4i;?nrAtjJ|9$8cksV#Y61DT%S5nTy+|( zQ_L&`jN5Z488jYHGJm9a$XvZ)rM4693UGX1t zD7+@<0F*}R8p-{xyCueh3_ znqMFPL@z`bIN2Bwh?`OnP&e?qd1WX#T%u50uI$e6##&#S?xqdzap zv})ET8_yE7R&weL$#ic+7#aFsx{SIkHmi(MJGG!!p|k!#CHI+lhF>^!xC|am!GECB z)OSspuGDAz>6GYdy9y^#Bt*;PvDZ7Qslm}0NW+g6i5Yw>L#omnbVapCi0iR8vJv7^8EMb_n zbHw;-H`}u!7a(>5f{EJA$$%`o)4D{-@YU*rQGxVTD(HU0wPh_3<6}B|5;mDn%t$&L z^`Re^vzy+4${_-bj0}jqbqo@nQp?8yA2hh?^VdYaz0I=2z(ZOTCZfyO%;;rhQuvS` zc)dvcqjr1DLn=c5E5#%7FT!F4COLPTI$^Byrw$Rw#k`67 zY}G0S1_4vFa|XBFmu%1N4CTuoCf930*jw(M-fs@w7}USe{0=rBMl*-}5g%dZQp)mm>dT8Ab z9fDmwoCytJMT|1JWs!uY=#gTBu`JPSuHi!6j}vVmMIs8#*!mF2ePHXY^DDG zCZOdyAGKc%ietkJ#&}KrshMK+f_0y)JvYKQ+aBd;Z9T)x!c=fTb_lL~a?9}MqT~_^ z!65qr&E(oA^gO5;h&I@_q4U^L*VJc@6A>OkK53gC7yN%v&vun@gnWBBAWSGqpOSq25X*+PPIg``SvW@bGI=6-NXu@FT(EWO1 z6u0woIUy{U4j#JU2(>onRSk<*cIC5ak*~MR;fJmY?G~f6VRj+9jkeG5%l4=)50?x3 zf}MS;&-Z4A@iIw74oY&ptlz@oo|k-2Dj5W7i*4;OKssVf(|0Qy_?)5-c9X1`;s(W* zD}GkYJB)13^EpMo8Fe`PrvAupuIqLrgChqHmlAZx;oT35>l7-D-SIhIqhvSk3C{lz zhq)ngcaUd({_Ej8AOty7mh$;fd5rgH{Y?nkM0Rvc$?>K5XyC&0T2^+_G+T*>J6^Pm zTIp4Bff|G6%7W%>H_1X;7HR9i>6S{7&bwDlLb;v$T0Iy?BrZ8>Z@i^%ea@I}%r?%& zI|{?5#u7}wNOe#^;u};CwQs*u8j33`YPI{|?`qejaDLU(-P5dK(ZxPUSOCwZ4_Gf` zWvNe3kaz4?KlZBBObO`FNcab5r?@M>$sT_7`~(;GE7=@;srjs+lhxooZ;&YEdy?7O8Kup`~|$$M#VW zCDrw8orN5`(l}nKh!5X}U>>;f^)uNg#UcjjyOH)hF}9Y`_un>#Z8Q`brpEz|+DZJh zaw6`9pY9dWW_XueUrx>~9$zij}F?h4O7) z7>+yx?SkEo5{id425Zk#wj1&opgJY8I#IOBsGm-xhpq;fniSbJDiYLfX615pxQfkn zRLgWrG&;nie`NJa53;%t4$11rrIlCliVV4&ZQBK&sH&FBw6``CE^fSVRLbfwX<#zQ z{OMCR+31R4HT9*X?#jcrcQGo+cwVpmKZ;Ho#kB$Ql63kf3E~sgE6p~FqnR^X%^R^P zKo2I_>zOf$g#fQ61B(*=Xnn8TboH2yBtYdkGkN|IXG?-LYXrTnemW}-tAb28}b zowEKryUMWUd7}`)XP2K=DxPGqu_CX$;^QjQle4$>$*hsEk&3G9TIjLdq-x;~a&u8;Odz5caDsd1?Jzb{FAn zGFHI0aXUbp_|fb{jW_Z+%u~M!`@8`pJjS=fbml8{B`Wgr-zuE^if4cpkqVGeKFHV@ z%e~~_-Ia8|D5q(3494BiySJO$ax5+1V$^(ga@+^=;OF%&PUb{G0!Q~TlRE9YoU4w# z7qK03zDKS5O+P+~qqeL^GLoit!l3%j2Q@iG7UQ{lD%NL0-lsviZ(3g6DD64iZq#347W?`;p;%{f(QFOo#OV~Hk zZgPbS%>!HbX(atz_HnG1*;^PJ+>RC)K@U5qhnWWf0Q;b6TJcDEcG6fqs=Vcik(ODm z=3FehAwxsv+O==>ZO8EYRg$0Ed(6GLBx$l{`7FF4IykSqFxibr+|hMJQqHa94t6}p zEzOmjg43IGrdU8j{D0HR04mD-rrAg?Ee(y-7VtR1%_RhVY-3v0JF}BgafeTg$?{b` zH1C0g#b&m`RbvtC&I&YY-O;r!KIs#71hKZezhYRUPSUyULbILUVZY$5 z1|>MyE;XZ{_F{|hZE)KyO4v73Uf#I1p^$)l=x%OyUR3JdUD_?PW4sFT=c7u?;IQx} zxH}u?z{4fDlbp{LJ7oy}R`0yU;Q0VkcfQ^A9XX;bL1~$k`ghWeBWiSg>^|CJAc5@y zL{=0J8jIVDDu;xUJa|%tR!xt@9;}IC(NU8V*vP*2p^!tKW({O z+|L%63_=YQxAxlq+SFiqID6Juf{FPEHFrybwd1%aip1%JxoOE7{yA@5BGpZx7U$jC zZ{`AU!MxM;C=k9x918|INVT|W5&CgZL>-$D zp?ARVnh=LGbn(8W^T@bdTx-owH#@cZmSfSh0Pr_f7mLt$Ky!l<^`&zdq#NPhq5PX#4dv^)G zNYqOga!(Mvot6tgT9LR!NjNO8>fDKpEGJi&kKLbEc**nS=wn#*RaI3R^I6Ow&t$Mn zPcQts7EFs4@vMv}AvwYEVh*FKgIYvB#*f7{HfCGSr~O@pFC^7E6_c1}cmw1$gO3l! zlzk4rx{%ORi=naGa=R|Ufj;XCpi(|0Iciz1nRz)ZN2|iEx=ZCht}k&uDSfe*P`Z1` z0=jpq^|@T2hp5qP`EIjV-e&lZhxL3;W!4=81PdCAJm1et-bXpxV?Hxa1ZeKaO^|kX zUnsA>pgdNGmbc(T~+w0bjI@gK=380Y#3^srwqN*s&^4w3J? z8O=E)J&=wg)1UwO?)}5X{@kz}t0Z#o0LhdX9DX&o)F5)TbSCvwaFp+n^vCtzT%(av zse~3>!MzE)y+{EcbqurpR5(`@x{wBEY~dhH5W`O56a^5uSzCYMzTo;|o83T#@cvyS zx`T0GM?toGccr2DepOJxqHRI-0ybEF*i8gn0af-qZjw~CH=m04eKYV3pLMBj1yQL} z#nrRo0!5|J2cJ&mBwEneX^Np?8A6l#Q3U{3qV#%UN50nGy!-D(qB1EKvYz>a7|Sb+^N%*AAVqSf7)=w6SYmy}m3* zKwBG~IVc&PlqQF|_3Ds;?$LL`4gdz?1l1t|N|o}1fn4~}!=VdSL;Z5z+*e&qfWq&x zH94%V=ozysk$J4SZx1DD3fj#-)S3?$0U81sSpNmvx+-`t`R;s|8jtq9BhUlk8)4i1Arb1%+1 zO*@ieNqh24o048fXB{V*ZKF4_wmasZ3qfg`JVzHXrPS^lr-VultP|L*{?@Qe->=oWSGPr-!rX@Xj)z$g;2x5>f{~J+;#as6;ybv9Lz1 z0@~K3YEdNVHvu*;FLBV`a*18vbe$&9k_3xT1be-q3$R4OA5KXV$jUvmnon$(&ec0H z3{YBDpwnu`C`#Vc5Cc zP6b{J$A|m%CBA%}25Q|3NU8Fp?w~R=+-hnCh(NlqZzy`JbE;jWw*6dX%uVdCcX8N$ zo!MMAjrThurb}}d?yE2(d%`7yOiruK6Z4RNSE?y85vVYz#lV0LYK+IJHNiWYE2Iky z#;E^xEf88L7aH}s>SbL`IUbM2_z=@)blb*SRY1WW9o zk=7^kP^hpLh#LZ>vQ$vT&+9d)6 z&0#_sq0_-$j_Splif9*|WaOvC{%Dr=@myrrhR<1)SFV^5Eit z!@zv(zAsj;-K#;Uz=Q}=Z%tWpu}8b=E26GZp~I-Hy`WO2(&r)GIvE!Sou8#yu%5{kn+S0rV={fe`SV5R zNF109Vhrywx4*d5eeCV0{KdE*mZA-@dARR-rpjuNNjXsO0KE;vkNmr;;5jSe()S|m zI@)cggy|~7afzg?HHGlf2>sS<3e1-hEPfw}D|#-W0wl)l&U#L9V5*-4`!io8$JChS zx~QWnXo2 zNV!;~2W>NYRJ-QtkG-LTq^)lpCiu|%2gv3s^&JXyG@bef zLRP$*h;s^=HXrSMOb&46Z_yoPcjxmqT96StR4jXqUo1a!8_UPYBTbNjRxdLnUmd7w z-Iz+CzBe=k(=}hoZK!oN-1KxMc?%E1X(-_X*;-S*nyZLs$dXsnm8j2Yh7id+gU zmy+-e|Hw8s@>8)Ph8I5oH{P+Mg$b_;+re6;C3Q{kxs~|r7=3s7oItaiN(`r!c5yBT z)@-!rhXb7#2M2X;MIp=Q4%V|Z`(46xk*prClDeRqFPV!yQ}|Ur=|wVeyBB3Oc&8i; zkEU90G0K%sdyP3Zn=Y@n6Tc0!&(bmE&#>&qWSof?YSA8Z;kFuJ7gLH1EV3cKNFMTh zYkWSy+i3{bRtq+%514~(yI$&L$>j)jxlK;$3-+v6&*>Jv<0^Ll+Bjw~;Gj#hd&gY} z&Ke@7wHsN9EnA#e&~5dUA6;qJnKhSOQPh_%pQzEH<{3Jr>U~-Tst#W3P~V#zGx)*5 zGn|~WD~oY=XHi7No}`Bhaa$tZRWP=$Z8s{;6L-#CcCaZ5lGA)aiHK zV(U2WXal=VIAcUkrf1v@!WRD680oSEkl)ohJG9W9kqlEfK_<(bK9Ab%l}N9hqMTfk zra^=Rzgr96qj*Y`$Flq~Nz; zp0;RT{N<@K+Zel=QuLAJDK7k0iY6+bgk|xw`KDyXM}wM>K1n{Ywwh`L8W33x+4ch^ zgWqg;q{UIBUV?J_TYPCXy($wpK6%P0A#$daZ90p`w|BIT4J3x`8BeX2ri7Z~wm>vZ z%m!^*3Ibo74p!O)K4yf6MjdYod1aIA;g$c46*xQ&kA!vLoaBPwAyUnP+{aO@ogn2| zr!DLbiJ*xE1>QDHxs3r3Vc&ir1`Cb^(_0GK)CWXJKW6Uu(6|&LY3s{4ckNXKA+;aj8@^(JrZoQ^~M{i!NGlf-AZ#^|1op2 zcKqxYyFV$3YA!j3P#l(TSAZS^-UM6C0Aoofw*>JF}gK$~tZz$_(DCO+FPSPOqsqgj;{ zBl^LABd}A}(C_A`@=l&dpV4J!jOSTaNelOL9PRbmVU}b7?Yuq3aU$>$eB(0e;Au?* z&oUC1=&K_KI}s!JVITAWP%X-76<5AOBDUK$Y_HxZ6H_{p3Ew~ZI%FCLThW_<1+;jp zY#vE9bw8(A6jKw!SA{M%Op$nX+JkwwJkJP-5GRpJmMXMWT^ip^UjV(qxcj@+Jfahq zGk;7m_9I6|&Y&YfoFD{fvvJ7A9^TZCHM(0LF5K?c zu}LV|FH3j*J--%JtsbbI=(N_Hl>GoCHtdb5qOVg}QV)7pLGPD3B)|fE!Hd`pM4O8S z`e!*sFB0zaTL&_o4lLw0=TNTSc zI$hY{b&BSSqn)DQNww-FND63kHn4l1a_+dOr|2zm>k*?18ichmMUrwR4-+X|#lpS>nTTF4K^a0|sEwe7GeC7afx zwLRNm{Q;@uuL6q&jeYd^8Kt22E9A%rD5$h82>>eK$P&L;|C;Kp^mEq#7-b8%Mh0e4 ztO9AxS`i7>ufmUNY&16uRu~Xl6Rz9kat8oGcT}=Af#Y>JNPVJAAi%?;C-~b~?gSk* zwRmOwCBJ5PbSYS7C!1sN89||-_a(`bC`77&kA3)>=~4by!(W?L4#OkEu-eDae>q*u zbiT`X|L!tL-{(R4R_!3lHl~-Gg!J|dpnLa8Gn=3L3h-nb^YpRyv%(d%R;g+>*3NID zYuFiCy&hvtkUO}1!fWWx%@=P74U{hUZaI>}_E3F*!SlnZz&DOYgnkQjmIW@5s1>sb zJ|>uSPm;%B>U{8nrH#U3&fXwmbci?_o9|q!=b_vspI4yLj}*SeFJ?_Uxf#AaapI&&)ENcjK$?WY7@)- z)zKW&AVPWDv-$x4kY6q9OUR@}gf%SX6Q0#*?0e!Tu{c6vPcMd9T?Ao~ ztw7uJoL-r2yKB{r+~-XXiLgbwYa9M6hEVKpJis(?%`=cBR;lrnS*+Uo2gSFNeaAtT zfM&OmSL}28-J){v-M}2lBnr?qP$`$)!MPTExG(=yVDj`D&;T=fPeAFgb=$g+bQ0*H z6YAK^H5(Qhey?mU9TYt_6dPM9l+>aTao8>=>s^orT3b%6kS0qF>&wP)ybP?6+h8{2 zg|yPh(P#4VLhrvBfPTodSDPN-#e~l(5NS&GRV#8&THwits|ZeqR|iS-5j{%qIH zBhuYn5aQebk|Tr!_2&=-+J!%xxV}R)?&?K!9Q@uu^;=k|F-Sux0iZq1-P4p zO5aYOp%W#hUn4@3*qR?m$KIEZhKUZ5D}~gx&Fz2O-ld>KwoW5CWryzvS3f+1MzIn` zLFx}_Iv3`djF#q^8i;2o-If(j^H)2Ta98T2B zgYXi^o>mGXX3m5x6$pRummAX4HAo_peTYb&@Jbu{pfq|2BUccDi>9}Y;RkLnpYh|d zOLh+BBq;JZ$x%srm|d8t3_{iUaGeQP?JEnv`b9#d&x9 z>e^=dlfg8Ney#6vdYRlphom2&ukBXrxnkHsqtANgCSPmng6)}MVm_5FyR8ueoTEoY zR?H@4Sh$tL^t4Avz`xS&j_7*4H;QKSxGRyXV}T zR&q;|3c74?N0kGsL=s~?o!r39UJdl@!qE3f#u;e68|!~Z5)b0)rjBzTH{MBk zr>jfcypwRWzT zberh0>kE_kF>kjx8TnBJ3hmx2>k_j|eW;YqaJkapj!GFFpUb%ap}V=eaYBJ2av2bJ z(%458o-Rr|oO^da3s}pa3MOWulfWbju64RxgLdaz%?cGVMC2j75Ayh~&VJ~&BF8)L zQ@u}8KGy?Cc46%FN;EHKrl>N#(TShrOn+KkB{(QO5%b>)QSg^WW5X1FFbgnsa=R-% z-UMh2$$I5-zm&+hTCi70{}-?nvdc=Tkh7>FKvL+AdhytfOhQuM=X3%n0-q=J2AI!Y z$*Gr7-H44=7=W#(tFm7i!pB)tXn0nL*-RO7sHo)Ly)mI%t8-Y?bmX|~4o~#5FUL;m z#ae}Gn-wb2)X60oVlJC9k01V;dy4x)q0I(`txBJ~zd@Z{Uk7 zI9g>B8A_d0mS~90cw!xf5(p9^AC+lP;B{bZ z>ZVHKEH^Cr|M=UB^}JV7&>PJc+tnG*XmkY46@pUpd=Oe`lyeapO|q zxoJJ07yIRdTU?H+kp;lLv>JgYZuYiePb)TSs56Pm^ zJNm|U)sNl|y}{`!vB<js(czq5NEmeivrZ#X8D%HPR>ep+@PwrPk71K-F~j2?+J0+(9-R~j)2Ng zn&w*CL;Bza%_lyn(RCrq{&Z005*8~6#lGA02-U8PmKH|6wp>d&q%r+3nmklF3p`b^ z;p5m6 zUM%AE(CWlReN2GDLhC>>0YUGBIuWhWPrJc`;Zmb~yY9{m*-8Z_%NeJ~zkaGl5nufh zxryQ*j2)(;`uh0YG=mrmLA3TJ3btr(Un8JWpp>qeWe&`_x~VfitpABm$69816vPM#FiMUz!anY{ zo3NC5xN@d=)IYQQ+Cc!jG+QDQb{5Zl=k7_g4HN){as#_1Rlko^ONAI`Z%F76el<~dQOs|b68~)4DbEjRw??XN2oWjQk znpIrezwiy9rWW}v31Zs{fya$lP>|CogG;SoEi?A*q3ejuW)o_f7;oz3eFi~$|1JWU z5Xr}j)W3pvf{5F(j0G75^kTWN;(9cHJF2Py@bGb!3cGAH#xm%^lw44=L^G0P;Cv13G}FOD?B`$k?rZZ0_1p>4GWCBR2?r*2jpA74 zd0AJSrn!nd{Phhba1pt32+fMB$G2yRch{kfUkQJmbI~)WMtsqr$hl(q&inAbj)TLf zR`9+rt;Xd{XrPAn+%Tat>T`Jf#6ot-IhX#tjr6Y&t3`L?%Fj{+(IZrnlWvdFax z9YI7_+kQ@mYVu2p`Z=Ka=pUrTV(Vv~9D`W7CS47>40TWZwJmQxGuL7xO5XF zkl0)qNjs4C?Or(ZUj3NA*zTT9Z2Y3&9u{0Z_I0Sjr;G~UbOA&S-6D*c@N^4^`yBJ_ zT}0p}AU(thRKskBwO{r1mDKn$EloNLcR5xwHP`t@p~V94I_2;R zS`Dx%9RtyMmF9Nb9Kt!**SSMT>aqyh^K>7{drA6`%Wmg6Cwc=>;9ZGNH1wXQd=A`0 zLa)OPpY*dhOVpI9LN-^!-_%QxTm(anSJs(drY+llW+Hnr&GVC1s=K ztAzZ{GM&qVx(l%~neg7tw;}iK3{(Xna$g!QE>_Wta`!q3jhf9&T6aV-MEsNRo{aK*&nry$ zI@0R<0u;AMB*)hZ40jZmf`xhgu3Y5^k!`pqgGu33>jYn{rnn>=zl>@B#s(C5F11Sr z&GO^H{th%L+Fg2M!1wqkV@DeSEO~Gdxjvv{4wyBUNEp2gJ8yABY4Km~R$bcxW=g*p zq*-=`W7xA-zooH{KC5MF+wD+rbBFP)AjqeqiYP+GBLcZeAd5S6*5DlFM*^HP&8iu? zSjO`&RPWZjyPbrJ&Kj$lEgfZe^byO$TMUHYokN};9X zH=U-^zrSwPzNq*<XGYJN}>bqYq`W%R5BLI+#rGzvGtO$%d`HiUD&!jznhupuf zM=mBg7Dazau0I}3m$RMay6AVF`r=(I;X_H34YJt-M)d$3)eC2H6H|Jwn9Lpr#dfp4 z%4l;e_9>mqm`As1bL`_sU-(8C+viDIp2o_OqFIHyQ$bU{Rf-oTDP?+X?8B6m$ZrKL zk{It#Fs1SrncebybVweQo=hEOqRH8u%<(q0S^BbG0e}2Lp)2=^dXS0sR-f>HIV#`A zk{`;k&b9a?jtfGEm=G!a$aDgT-}Od#Slx0M2ba6OR0a7R%Yj~Ms-e_G=&tj{gD1}M z94{xaq%?G#Ek2nnfNR=GK|bM?vi3juW=~TxT|Wr|l!3U=9BBOq1A~cE8^ljvmB$yD zktEl|+5^jq>VxyW8Sojoa8`ymhPpwRXe5*yen?l|BrI(LupLHoRvm3OyjoW$!rgW- zVt{+9ms5`rAoK-~7cGbNe*bnm+l=+2zieP2f~$0hRPaYsm)^Xx_CEEO&dO49G`1hk za3~1n-EPy{@Rsi0y6)aEqC2X(mq?rPzA0s}l$v}Vj5z?a0l%vnny&lA=VW_80a{ZA4b5ZUVx8}{NPAVU2TSnwl5A@5c zjn|l;Lu>2qT8*6=r&DmVI$7Nx`LZPT;b9|RwpxeEuXG^}Ib5ug{~!_4Ucp%)!%?fw z9YISENFH4sbK6iTpwyZm>moKG-^mpT@{f?z_+eqoKIfy+2Fv`~OPT3aQ#FxQ+7Gq? zU5}WOit)Aoxm*I2od37kcJ7)33bI}yQU0;PifqL~Pd%c}R?zgU50uzn%+E@_I`z78 zXf!S1mCgpy%YP(!Sbnj-tdynujRlycZRt@hDn82%=ovtG&9DM3?`?N|pv^o!?ym$H z99}kCAVjQ3pW;r-&7Q@R3e*W9+; zB$(|bAfS&w-$c)ruTgrRiu6%Zt)hLd&*&ezn?$!cSQoGQb1IS*1<*ch^^kmOtN$qY zjoVJdJECwW!JzYn>**)*I5qNy$>jgSJMbukRwKp`Iwp)RJ?BKXF~f?2^G^ZLA%P-~ zr$MgDtv`X&xrdERbjeV94x0%=}GC$jSx$^Cph-s^HN*1j@M`9}dTL9R!E%$HZzd5?Om zc|AHF>Kv`;daZp$rXla{;DHp@Dh-;?g(mKAOtyuvt-o&Te}8555-xq|R}!L@oUH@H*xng$4)!#eK0-2%8~{Jq4U0jcgCZg{D!@-a z8Xn@;0+p6RGz?T{Gr?jLmKz-vT2z-U6TZbiS$WX%m|sv(ZvL5=SQn?D&3OB_z-5}U z+tNL>0=BNNO0@`x?~f!UOwR4Z8v%x_R*qL^nVD-oL5WP#HQjvxToVhx&8d1hnZ`NP z0-&-@?&VT(SI&uktyrIkC3ItaY`8N;y4URB$y+VyJDSY4r^m6)?j0jhOcCfmuWxNr zr&>04nx5?1u#if@oBO0==Pji>8(3*SaZ`{!d1sOLJf4+W@StyoyT-jTLCr>XkY0(0 zWzeBs#-D4vJPCSsJJy+{xG=d($>kh)+BSSgGV3|}=hiBo5Ok8IvwTMbNL6Wg+;um6 zR>&UtuCd-knJuMa_DzV;EEOBB)~r#$>o{F@Af?(Ny!OK>cA%4Jh~U>?Nl(Zci)BxG^nB1ofPttyRcSW!3#VZ-+imDIH(ratha(O;)*trfzlxli>Q9@ff9 zAGU3zaLgCXZ_Eu-(FN^MD$+@zZ8#pF{H@hXBk{29|oqdmKFMORb0`qg1Sy)(m2a)(i`=Q+Pt zT6WjB>l39LD;8ji8QKCL&o({_+s%XPe=G_}NPW8PB<&`_LMo&}eD&$2=Cr%?ij4a5 z=ZAqXlXp7O7KFM|ysOml4#2{RDA$$XH;M>mEQn&jv=wbvVS!ECs2MP)Of8K116+>- za;gxb(j#+Q?eUc&$!JF@v_)ioLSy9K89m5+_C#1|+%(WTv)Q=1<`|IRKu1sm`R$(eFd_{_7@-mHlUYZ(x1u}HRWWh- z0hCQFS@#occlu-n@&)$|%FdETdaUVua92@1?qg6&eH95YzcA>(s>37UTW!5{-lw6) zWSyp8RqVV9Vee)>-CK{wj_CX(kC%G;o5YQiiG`?F^^|1hx7 zDFOo^Uf9EE?#bFlDWj02&XqWDt!rR6s#L(SC!omdtMIkL(+Tvq z(2zQXy;u1r>nT8Q7^kcaf9fK&RZCVgS)syTg7K_T1|fJ>HmYg|LX!gmyCchcN49)4 z)1wAiZRzT!>ZVIMUxZ}o;MZ7bnYhI`*y>#zT{*J`N5wOxwZb7ATqQA`KX?9ATP5N7?O7SIb5SkE21YB7c1&z$m3h z>5E)l{25#_;HJ$1z%@1r!^tlIpbLkRei>YJ0XV+0+8>jBJ3B)jyzwZC*588w^74;l zzH#m0?~$Qm0K%rFPBMZ5EY+_7SmMp(qh}?gKAm9v2ZRx^QgaXd^dkaSL2XIe(I+?V zBou20jN%o_ES;vfEE$6-MXJ+=50N2yr2KG-*l^mq!peCNIqMmxP$V_`l%wLPO3OLv@3ViS~hCp4I9(?$I1frbTUTi9`0@J6{y*~54z~*->aP?UunY! zR%?t^*AgQvHYNk7J)81{6_KL@e>e7X-njgM$rm(c)1=x05EqU>k}v8mG!2xml^8(cJ_u_q<5q8@@b?}?4{2X zQD94V?B0uN@7Bix$_d{h%CQZ^sRfK4uiS#V5ih5l2FTunuR3a3OJ4ozBBO$6H6AJVvlz@+0igOzF@+?3=?PtIkTu8HB--?31P?QJTODFoEpJ3-yvf+DDF7MpUU z*T;|L1YSq=gqUMYDo4{I>K?UmIUALfaXILc(I}?a;ZboO%iNx82r^ zd`F8^S)+>{gSv$sBuBBB5IF@s^~`|!s>dAyRg7ttgUNi0-6H@+fzJ2D%1~Lotz83l z-ASgViQi$b&3?a%UT)kpJR8TvXF@YFVydPWm3Ko$=W8}Uj8+$z8fWmljPKIV(AYEUbT0=QBw z!^>0>2GMD0uVcuJBM=wmRlpztffq)FVX~i0cqWmEDebHfhBJH4!@W|OjyXRiQixDq zb801W88JJ+Phgt9_TWyh@qTWOeU|xCDQ1rS{>UxsF zM^)?fK@IoKm{=fmX+Jg3K3z8`1y}~CY{>WiE0hVXVWPzFXfS~j znWtI4)W%V7JF}ys75`Ert%>s=fN&7KT~O$9>!r7`)|ZN)9sd{M7pVrDJ)FDB;*EMs zNo0Dvi?Nciad$wJ0pzORjl(MbzJB`|%iJKAm0qBjYGO!0X};8ctG-b^-bjaD zSpL!id0V(I?TL-L0ih-?#yw-M`r;0osiUd`O>Bh5g-*@8y%*#0pN^wFJQ$`oxz-Em z``0&qx1uK|k^o13PpG|Z zV|<@!szA9|CJ~@Gb3?Dj(1V<>Z+$-5s$6SWb>vE6te%F#+FJdT<3-$9sL3vvXEQk> zX}pZ&Ad4#{)DxRbIU8n~dN5f?rgnp4Y?@=I(}q0KYk$;fBs~3WAMpdA)`kRcHWzx(KPz3ItPEx}q^h%y}5t&5`8`?X%T zu};43JlJ{k$fvgoNErKha@#!4$^Kh1A6yG3?L&LJS90>?= z^Ox;z{^_{<&IJN9tZ2h}d$fZq=}mKvAWVNnGbnK#zv)Ug;5EYFt*rb^@;=*RciWwe z2Z)+pk444zG#x-CHXlf;{M;RO!&d{Chmr+QmO60HYLFo?1O|k<=sZ9TuZRq~z*AR` zIAG0E^+h9~jVzY{TN6cqH}>+y;NYNpE9eWS>^s&dSN`Z_-CD&X+@M zOxw&aCif$)!-Ui1Iy-z*ZDIqq>}Gt{oq$ZB=Dt`Fb?}RG7~Nw^gHG#L**NCCYXD#o zEyeXnV6DaBgYHHrvwul&!ir#a((Qs&`yYS{N^Kkh#9OISHp-~P~E8V)>Pr zE!DjApP`hRx4|Uh@Lv{Z$^A=Qx(|!geYG)W z0Yh-V7xO^Ex_V6Tf%80pqpzkuQ7O4J6bE(DY5*zJUzn>(x37Nk9^FJTsY3)DQ z5AcGN?vlR5N+_A3p+eBHLxAI0#&OqJt2vP=-C^6;*IE7Dtr68vOa-2h^62J1hdvY> z7rs8HCg3=2Z8NvDygvBts$Utg#>G)#Qs9_q9c>-*vY|#PT_kj&)>;U4ePEf4X3F&b z3e&0Cn4B?o+M+~Yf1cgB)H(>aeXAvwlGJ|SM*q9FYgb~lncR+MbRwowfV47U@(tNs zyP%7YFnVZgTlNU-Y)l)!3v8!MA$;={6lI6HpdDI)+Ri+O1Sy+!$ zS68>oFZFh=)+VD2Fa3|i->#=jM47TEJppu6`|_|W8Wnhl;CQXHvNe7+3iO-RS&P(> z0zl!cyL$E^qW4)(#f5CAjnU8c)qO%~UhL1*G@o}-V@zA1xFz(ad?FX|O2gF-5r8T< zwtM#{EWLXv$uWKe8Y>(k5$RlL3FkmwTW+muCvrdVWh)r797uX5aW(P{E93vW*>(Hr zm5d1KEj+Tf|NPHK3EOKRb;Us@Prl&*z^4~* zM5>$4q@-jmBX{2TsbN#Ut&lly&N zuU*BWwO*X~jXu_Os_PhsbgjC%kxtu-*j|z7BB$wxe%xn z4!^dSmZ}SJ7fly{A zu(R_W8dtgWC0A*&$xTm1NVl;2=jql60+}wdwz=tZj$us|bclZ@pD>e(;|<1|v+%c$ z>9fD6MIjT-N*{sqSBCF(>wfTB>s{XH4^>^T(Op-;Me8u8+;uxJMB5KPF(@|`dU^LI-TVo2Bq(uvH(|`gL#qhHM{+090S!|6Mmmeo55C6QWh1$U}~Qu{Xh#}=^{scR*a;Gtj(w^%Wl(j2j1Q z6MNxJ%VQb{q#h~M+m$vNT{g=HUtOOAM$dlOBE%9>%r}nxdbO$Hs?W`O*nS7f>0}F= zJ0=j`&WnQ^k!_uwB#P6B+_wXST;6zyNU+k`KDhBl%g7JWT*-R%)p%<-+dbuO+Ck%{ zee&z&KUwDE*GXowe^{e$=GE^B%^3cEYvftS(giwzv%==xeTI*{3jx2a#mo}7*2h=s zQWSR|?6D2C-PBXV#WuEBOXn#__nP81`7F3&6Vf2C-;%>Z`VVjP{_Mt zg*UtEt~W^QuMc9HhJXx!KSVwBc3KndXTKG@86UH?oM;xO?u{0=Sn-?L?Z8YmmiiUT zOW@XM0qZFNmFkv~;QalhC;!@#FsYc`);;wALdQ06bz`=V`xav)5PxAAI(ywY$&I6Zyl-B`6J$^Rtx^fjSH1yC?6Jc&Q zxd!2`#>k3J{Smi1-k;Fq{KgJRBbYC+@456bhs`7ed)1{6*G5~_8I|kr>3Y8ln;Suq zSf_qBXTunq&SqM2*GL+cXTf1xU*3p38lEt(Ksmxi>z7?dn92o6kFmXh-}`NF+PH6X zQy5!rp}ED!ihDkdUcSyxg_%drxDWrRUujyP^w{M1_id<$?+w!2V0N1x1ZZA(HJhz# z8&R5+PwzblB;cfTmg}0ctP|=ieO|7Sj~m%7bl%*->GHuE?iNM!T_+9O=bh^hd+7!> zzT`Z)bW-Z?IR5pU8?NXks1Xbufz*1m!O2mJnN4ZW1uK2KIO<2nMX@k9;d%6w-78X} z$V8aIM!1)&Rb zI{IRI(6w6geogCn5l3;gL>)j-^}RXTv_JCZAAehSJ&;WR`9SF%r@`@C zdVZ#P&ZRFA3|heazjafE5nsf8?*%a4e}l`so=rP|tJFIz+7BY_-$)R`rD+6gt;Bm6 znK`uX@;=|8;CfoB5os{CLYzWbGNg!e$i1utf|hiF)G;&L%2;4gEK&Flz)DG`B)faO zG~?KHZs@i_WTkv!h51JNpSjn3*)hMy=JaJM;xhCHC#wyyU;B zzK+f>km~+Z#;n~EKXo$oP&cfFMGr2QLtv1cVS2SiGJ%lboY zPkZ!woVs5!HJPZQiQOcloGGWc$Ly2G~*`a-=7 zJy*T$>4k96Uidj6_n$pBu-pE+b5bY>xzewK&%$))~7xD1j7u2u4ny< z>u>*ppfUKwwdvbAD8M{=Gy<1i0WaRDB$ch~=1oznXI^DP9M3g!3# zrHN-DA2qQy2s)r{QTH4xP&6MaK-6be$Y0@Ba-;6)BYG6We^mh~oIg#vWSiOj_HZ|w z1bKef?i<8G_5v{i#_cA@fR69Yd;laI%%?%Op3gVARkH~Kehpix%?fVppICcc1IE@S zw_rN!3gbzhx?(Z)a$lcPqECjfz5G!6CQV|9YnP>AuiB8~+}!0OVdDZYS%bMV>j?UL z1trE&WuJHAhZOQBMlXMO0L@)G;W_W60D}jIMq7>d&DV8R)@b3)SN5hOwQzFSQH;I= zRI64@mdi#=VR9Yy{f!!XLpl-hH3vQvW~rg#wnQ)qVS>4db!Bi)VMrb35O}`LeG8o! zfr~vOSS{A}&rm({5^ic+Zo%EPMUy?!Uvng;J~*nY4r+VxOMTUjo%4QBH34nvrh<@H zt}rgu;oTtpr_||Hr`;X1Pa`VTdYhTF;_(tGDit7~d~v8i{11NV@>{62yC1&Cj}NCF zOzJtjTIB0Mm(=R`OeH(8D)9f1(wi8*Btz>P`WP413Wy^Hj+(IQuGg~%1U_k&nWfQ`JD8cU(4w%A`+@kZAG6oX5lCG6z5&x?_Fn#$#Im{A0R;XMfLs+OpdeiO< z9Ln*GSGTdTdsBtpz}fi-HvzLPZo?5cGl<-vGY@`tvjdNjaS2JAEjD`k9gz02@R0H| zX1C$!)}6aaE^9qa%_OW(9mf>gC|V{$HadS@;lLQIbSm!PO$G@emDcgdv_T99hx45Y z32)2V_-if9P=@aW!m8+Ea^Dg!UAtm!1KbS=$zJ)Ghb8dgx0L{{ui2L^-gM+RR7^EiPW>?e|YK z^Bim>Dl5i{sUxXXG($C{7b)vvMP) zX^uHm|YF)a8>F&LjSS#h0!%uAEHEWpnE4sP;N_k(GqQQtN7lP%(lS?Fe4-&`LP zguA6K?&&;f(r!GjvpGtCuJ5Zi#ptuFfpQrNeg>VZoQPoLnFzwzH5NCBI-v!fty6Pb z`eCqXpxe64IM6N*AD5++Y|g+&lTW!BJ+}6ad5@LaqB=jXbKBesl3@Jq4L-n zZhIKYe6Dln)9kX+<9V@9Y*O8UFJ^p^QpLOh)qTeaM0vAm~SsJM5HS?QFj0EPLdQfLFXIr`9 z$|uc{TjASk%3|zL+;x}zCxsB*;;nCNSo(OsoqRm(VTj>fIB2L*mzI>8+ppJ|&BR z9KFjr+fK<-!+{fIS`we$1fB?n==P3h^ zgl1a<1Ex1*wBJ_CdIk6p=2zaXyZSao+Sk>#moxxA2ud_y?$oPFBPW$;7R+;|DnHx{ zqjLxn{O$kmW{b?_R!i7N9Yx&YVv%YAU=LjgPO)!X|NTj-+a9Frb`i$$yMH)4pe3dx zwNR=&P|#waTA+3(bDwdlD(r5-P2vj=w868^zi}!im3POh&3s(=3o<{3Q$6bn25Q7> z$@%^O|0b^YrAWbQZCf=IMq)0eEv4_&!POrVxo3T8j zuCU{tW`pu;K&X>;n)BWSwDVLtB7p=5gRPbOFZ5X;-~XHNI935 z`n{ZT*U4y_SJ7VQ(xPGJxMMIVMU*wuf zI^9fRa@AR|IRg5jy=pN2(y->pW@^Pbyc#+f2t#*XaPgXKE+(5z8rOlBGZO6=B3i&Q z2B!ziwc9Redo>v!OUb^EAF$?KVj-@OB01~+OPGdU52ms$yJxr!+Lm=*2gqp2{R{gi zRAY?DEuVuJX1O0%3%~&z-<;>&B)CvLXxxm7`+vIi9ls`e)X;P_8$Krx3wB@ZIS!r` zZ!?n)_~Y)LHsokA4a?tcrXsYiboW3|XLo0E_j?=qaHtzU{e&!Tuh7Q(Um5zVF013^ zdSahEcgqW6YOWZ1P<zq)J2;0xwY#-ToJ8+B+o%5w_NMAUc&x79C)GWCLON9{^kkuag;S@&K~2SBHno3o zeg^%j(!Z8AgXlk505Zb^kLMdtM*G($w2Vqe7cx9ooY3GfVpP+eyCl4Ao!Shw=>R;C z@&|uga_q+AY;VSl3*4l1@7_H`ex(RfKECOa;<>(c32DpL{_HXidv33yb8&JqkaY>n z@7^Tx5@ScZI31@=LQ?x1@Q3;b7uGfIx%Y270wK|WMIW6r5rB#J3gY}|!4(C@%CN;Lz;I%sRN z8r5d6@{{41GmtYH(Z;>}uxXx{`=*%a(c*dwd+^{U1VIcx{*7BhbGIed+v)z{#2xIU z9FU3q-x~DdVTe z6D-)-hck{(v3qW#;I>29p1|_x#Pc7z6K}y~QMsz7DX!Mj`YF%zk>cEf_%zNBHncp? zy$3Zo-hdx_eb}dBzhHK>ZvQFZ=xO0&o$#pW$IqJAavRB=WXrREwThN8#+=_)QNFzgtDH5xb z?+uOGblX%diaysB%@s8&H@&f4?1!UpE?tE=@pX09ZYXoqpV^C4SowW(egkrt6ffH!TW6C#OPxK=)4g@BueUewF zN+>rJ6oW#r=5Fw^)MUHO=4`Ir-xw*-zJHsDDr7Vnad)&P*nj^hb_uTNsNi?s7 z#9_CLjg8H>*2y3u8bTcQdRySIjP3oYddW-tyq=_FfmDYGsE4PQsrdl3UHY@3i zu2ue`vIjS*sc@^cL-MeDo}eNJbE2l?j9w@?JBPNup68BpRYScfz+Hd!q-4^jtBfYW zy!*eZ!3*Uq_>!X+x*rMgOUg`7=L9Ttm7>^-)f~!i{a_&ZEhB=BCxB+!Tj0l;>_D zoBPTBw`Bb1yCRL-cF4OGy?NRi^ON5YJ46r3%7O-tJCWa%Aw(p-6@vi zw`siBi(VLseXMEaQqeaFD!Ci(M$pvdP5l~cH>I}LcWU%r_Fb6%uzOO=fL>7DZo9wP zZ#r(kfgTHl;Q7ea0Q6v75~FS5ISM(Y1dQu#k@X0@-;s09{RgP^jXA$yLMD}0!>tCp zE1-yf?~woVtf_xAR)f^TVJ=^9ie^j}zU>AR^^LZe^gl$hzm{CRo@(WmcZU5)>cRWh zO!t4LyIBH+bZ+CS$H+yjgpUS#xho`b%h?MpU#1exR%<)+$-Wt-=>r6lHv`OvATJbq z8wj+G0;C1mL6O~8!ut(oyVWW)Ar%ns+<4Bcj+I}(q-kGHKFg(hT+&Z2x<_;0hq4niDqI+!q!HD0K$Dg<> z5)n()m;8PDt?~zglnlv5qaWO~#~%GsyW-#HgW&rjsmH;6qz~7VTNAy)#cJ(K6c(F* zHyhE)GT8GEQnd`rE7(vzF2A>GUzd$LA-{!}!xj@8%g_>8WB%V)(DydruJU)?pVQ&x z<+bgdM$o)Ae#^}V8J;_NV<8jLWV?kZ2V2A^753Y>>^3;zhNH9!O{?v*SQG=gYek-B zwY6W|pq1A*CE8vVIXmfu2zebp6~5l9`J)@?_3!=p|0>5{-qzu30xUwC4z^@oN!GN) zRSEn&NP_N%Igo1i#KmJDKHFTZMLT?Nh??8C#E_nkApAei$-gz1w{P%HdiG^xWL922 z)-qvC>5JU?HmHpkKJP^F+Wn!MvC!vUGGOXexdx;`eg_Q9GouH(w-@+1?G`GHB!o}L z)fCt-oc@Ml3x+fQt4#dw-#kI}dehLF@CQeX+7C8j7lHU@I^yvMw+sb$dR7Ni|9@Wc zqZe8KhqJE^i*j4v-Xe{JA|PD~N-EtgAOeE)kkUPLN{N7ibO}g_bT`NVN_WH1sdPxg zz`(cI=j`yDefBxO?~i?5sO*_{t#_>_@8`ZX7KgL^4D0jacyLMU)?6eeE~SK(HeIN@ z4N9jNn+5115)+xOqy*~MXx9k!*u`_7d3ZGq{{d9^(@$?w#IAedF)82r)S*Yp=HY4B z4K7g~+JQ5jU0>qB}t6In^yKEj5BUV$ZCqw72C` z$j7Xq%6L9gnh&qSt)aZn0voixV!}5E z;8?R}8=d~WFX)t>T+<_G!fIRm?Q8$}g4BoynhJ|7(lmGKrqb8gBsT(Wci-bL(P~oc z`48Ry zC9wQU)RP-}msE~ncYd>szuvE$2iJtDGkFWu3;YZVRX4LnRa51r*uO3g8NUzv_oLII zL_?thS{!7bVjAci3B=O$a8@_`8x&VJ9@oGlJwltm();=%=}6Fj{@!b- zhWFA|a=2s*)IusPYBaN3wL==IT9XKn;=g;<-@nq3CgQy&$B*0oGi5lamYKeR*JoHu z#b13GD3K`?!V?Gu&25qaIEGiUT`_6;!s6<&ukh7t!Cu|)^G5%vnsK#}1UT1_J~`^F zV-lRZ-bKNetnG`WUq$|OX#e@We%P3I85z|K9uSMCdE?Y5r3voljZ%a?+o7$GhKxY( zgi&2XmBU=!c-0_MW7&EE55I-OdF>kNdh#!+^&2yieb?y!WG;R|v8PR2Fcf~4DalJk zLb>n!%AgeAU-@4*1?(RK8t4*ib$&|RynZGP9K(rZE5t&HSx9Hxyrkl(xhnbRXVf>v zXwXp*9%;om2t-;jAz1SrCqG@VW(u5DGc4q$g5IJ9!|$z(1^@J z&JXX;zFx)u`R@Muf+VjAzm18KIIOr6Rh|#IPk?!ww?tfAcrA|?Ic1R;1$0PcIxTYR z@6})Pk*WNVp4pA5`c&+4`*25JALHQgi`S#2V)f02FS%o3nxxlIEh~M!$Hw3oe~zPn zy~W(LY3Wy24Wg_ZNgkT?;`#K!>##pt=ijcK=Cyj3@)T93`}d_lDlCD@bvwt0nvEi- zdBASq{ks$nrow!A(Gopk65Ci@jN`5pYCPG<+o=V(6D+Pb#nOne@5)`bn5I#fWaNqx zc~WRB3&D7zC?ECd)7`VrX~no6!*DFu;bx~|>dGGxYaA$;swy=6{7(+bd47U_fdlH7 zcGylJP%`(}=Ga5EH}|0pO#NFS8T(PweB9h8KD06 z<2@hYi%xxjs-maYK=Kh49Kc{SE}EQcMo2+>#uwLVo5aSIvMnkx3K8?KIs}}STD1*t zfHxTJdy!n{TXKQiVEs{De9edwKP9VuIj&ft{fR!f3mhnjV<4lsh{Sxrp>4wak6rlV zMXKtF^(&CvzWs(ce$WxV>(P*CVE>(3d+g88|IeFX$dIN+GCWK^NvME^7Jy1;#LyqM zs4FHZ;W0Fd%dM&TQr|xSqdvNfjEgH|lDL@Ba%m>%f|lSJ3c|IR*G9nU>*9d@C5Nq6 z-K|S-8|w)M;J)9!-OalV50Odom-^{aS_b*n4aHrgs^J)#`;k(%Y13;`K*KTr%KkNB zu6AaA!OHSKx;y;U|8bTCbF4#U7&`>?Zgsv`=D_kpu+A%X@~`bgg^zog_LTXBVCNex2^?Iz*BnWkU= z4?4E_SFbOWO1JN(FpEl2_~Fti^`q)Uj8j&5QraE=1d027Q3UuX9G2CEAFFE$=N zdNin)$w7r!*}4AJun`?NXPkjp@41OMH1aJp}yfR?QftmT#bUmO~6 zFVNAZV-G6`0?~sjTdkCDylUk>k$M6D>(3?-zDB~~)V#X&mi1=~`R89(`s|yM?c%ri z>J%uW;aAoaO>`Y`2fkkTetu6cKihH%}cbBJsisdK~Jq* z+mYgjbIB4uMJmkCe!m~r|GL7#-hZ@7|LyZQQ6TB#`jwjCC0AJ5!zxcU zlwnwdf8i1S%bs0B&AWf)rZo#PxOZakw+dC}(KVBw{Qkbtg0~-@l*;9)ez6TEo z=A5rBIjD!PS-)z1^xf3#|NfDO%HRl-J#-;@w>0Q$U@s)Xbb$5OX6tV@D@_rzrmKbQ zzRPGZxAA6H`>;4ei;CGQ&cBC6|Mg%vKLI%b0etkuix=r6S1%Q*ewNo`$*Id0xs#MTLg=uTSxB`>4c-M#g1M<1uX6N_KxtuGJO-qkQ;v z(alrpuY$k-^7&%PH~HLtqzT7?=!u*OY+6Wg@Z$CzEaLVVNr|Ap+2{Xo%+{mCBqUy$ zM`-2~TMgTlDu(<`T=lcf`L}iYiV^*~P)H@;qese4(=&NBwK+x7C46}>Yl{E#{{M2V zbit5>V=S#StX=zQa5dgwYU0g~?(TRPOsKP;y~Ly{Bp7c@US^yb1dN(Aj~OdT`(Y4Si!|syx5@?GHX=hrL?>qh zwEr4s{`9bKNc@_b==kl#8k72uy=2;s_jmVB2JruB{Bn{|u&}W7;=ngQ9vXVCu+3B| zji=73JV{NtuF%}NJBCTzK1F|P=>n*%()07zE{n1}el*KjC;5xtI<`4Mb&jmh?Fe?y z^M@O=Hb!& z-l{}l*o}; zvI7liJMD(0`bU4b5Tz>L<@bC0)Pkh}9M$BLf1Om)CGFtYn`)u8^zw6re=#e7Ny(02$#^oI}D%&anv7@O%uI5iJHqYw8&O<-9>r-!H6 zJ|qZndH-WF+hXArIyi@KDh>3kv2)ns3}PT)%8{x_0WKcOxlMF~phq{{4#4 z7l*xCN$7lss93llYa9@(n?1Px5eK%h&jnD2{PyiK9}_)v#{Xt5&QHV|{Rei|nksvG zZaBW(I>^!Zic<~!13i1FCdPc7kzt*+)inNqGeJ+6j*$^=obT{TlWQ|yBRE{W;kl!# z$M>z6nA=G^LuYK-L?e-84S=x>ZpS$8b%4gDP(1py^6|zKYGj51KB$W+U&Gy9pZm;% zoWeh5P71coXX>_4)AZUOaIMS z$fHl2>kPml+HiFR#GVf|$ZVu?Y6QL%{9cTek`*iVEllk_;7s&Z$FV^qu#vel7b+Dz zrsLk!QB^f&CboLdKTGzjyZShiD(rbQ$!ZnBG)*lL&MOz0@-3dxj)wUhW#4yT~_L-PFvTUAksQJb(d~b$9G)q!I+&rj0dFMhz_X|eMpfu z`(aVM4|L={0mr-f<%!!Um@TEg;DpQp)A~AYJ6yV&`@Q?TSi_8yhleD41!<^PsRAkx z`1=ZoEG&mt*cKLLbINf4^K-7Jin$z7*}u5ydZ48RB$Q@fJp4VuThtWeR7Xto&K;B| zd$)zC4%3u^(jo{_^))r`#EXi7L^oGPIIKD&-VHvMqbyBv990DBi4~~Ra}A!XZ^pd$ z_9_;wXjDH$4i2CvW>m6Qg^1ln<9b=#uVsUv7+c}^!K7D+$&YzF=7qU@8l zH5bs4x8b*Cok)(0BhIe>qz$Tv3fGWRaQH8*y~V{?gXWN%?w1!|I&T$TB!2in5js<% zfclXktzS!{Rx`C5@!^l_@@LciTZ}_=bG*(~f4~rzJWDy3PxiIoZ@(nAMKI9SiqPtt zlMvlFT~RaD@o$;rlK=4jy?Ky8QT1=e?mN<6jf9*>zVN$@#4$LF0w~+uU+NiD&9u`u z*4fP+9IrR_JbC&w^SS+ff@7;tUx4jdDdF)_+;B|#*PQ>S^dsh8+T4TJ>Ipc7P8wr~ zo^{FC2y2&NT z$=R%@z-3P7`bV^98S1M?swX;ps=aC^atR9#vm$=%-y-0o7UHanOVR$1(u(ZsGZoD{ zH8FL8pUi=|@j;um^7T}B6Z87Qqb(p-lKnbCu2%^qsv+xqN;hJ9Y=!S{j~OPTlBVW2 zFOB78GviNn%Ah&;+gq(vr8(eCHkCan*LO|~e9Ns$L3Ven#2&`|Yf((9M)dJxKSo^% ziL}=)uX+2IfwPUntbzY>oJf#sOU)Mn<;@hA_u9{(RU$z>sNHO8-R9RL2@5g$3+wjV z2KaSgQ}9KQREXDe7(Tx>*Nc&E_j_qKCjbQ)wS%s$^i(91rzV?N!B@lh@}aa+b=k0L zX>68Rs>u6?jClDbGHbFEz@xk-eA8y-dvPl}Cr9=cA>mza?t9a=34vmTL<1`oBGrfd z+j$P~N&oc!P&oN@69|a>&dlIx*cX#IuxnPTJd5BO7-8f;#il>+ zNfVCwot8OJJx98d{(i)nc^0uzX@2bp`N2WevE;1UE1Rq6Q}%! z_j`aK7JvqV@>g-V$W0Qiauipc9L?)(lU(5+d(qx)CG(v!o^&jIQrVrw^%CQ?nY;^h zwn}wvM)P7Tz@*glN@8Y4hC7CeH+uhybIJfN;g=v%0{$Z`#$iah6smFKKeMC zJLkSaNy=gT<^~y8j*C;Gp0qp-BclvJ%_x-DqjT6!CqzX?-Ym6&x8Yi7UHW7AJcK&n z%A>(sYWQDIPwNa`WfSg%iV+nRToxlakx~c+5nH_XVJ%W(sY?hQ_zFzq_^|fzABObj zgZtC!{U+~~ycky3YP8R{o-2J?R({;+2NOy{d(*0HzD>i*tyWgXk@|S-An&CWx+p^_@VR#U}V1{1geMLL+3TPV3%L`@F3dp}&WQjf11W-62GX&QjuY zmuzyx*c--$8-su6p%M_DH>*2XPEz^y4e?U%`i4W!R=aMfhr3eFEkl;zfzI z6&@H2Zo~tC%L7=psn>nWA}B<+239=0z5Q|_1?h(|*oDm!f0*6B`AKOXWuKTW{_#`w zu9SKc5~5JkXO-`@wlA(9Raxx2BvczDaM{MtdU?7=H=iB8SuV=2w>i&KShWG=ox~8Q z$G5PEJ-I5)jE6pTI`nckJ{-jgvCa;{7nK8IpzIuOKjt~`4S`gl0}!t0bnF*4^DooT zb*==n*xF$th*b`Fen02sUOdLt6we+eP+JW$ZhDP1i%g^f3d+!WrP8DC^~bZ}`39wd zGdja|Jgg2VK+1tZ^&AGIy{4ve(BA<9p}X-q4y9bS)8k2csnQje`BjPM*L=~1z?_z~ zWUI-<2KnAtq4pLq9t=Z3c-dkW=B}0h5Fga7{Z>5u3N>{M83=zmW&dU#{`s#o+o)p& zQ+J0=*&dF*J)Ugf?zFs{ELar_(1fzl1#MBY54lZa4Y|b<>qMWqnC;xeCAOM#N%HpM z^-5vUtAYgLiu4?@rV#9goM)uRzSX5tYi=#d$q*4;EF67V+v!I52zk1i5e~?Uic4dI zDm^uH4;@c8^r?SDEt)vj>ejhr$?Z0S|5_c6CRVzDjFvU`#M-b~OeLf~IXhhx*A_AL zt&_b)t;DV6O@@N=q&&OM%dQ7T$eGZy-4ON$DS)YZI@OO{PN3C<0VN9OX8`lFILm3B0N8zJ` z11FV)nt;N)$soC%d+q3WoFq3a2m|yIvw*TC8W=uVAZ}RiOe&rxbnRHjwI8_`XD0Hy z_5aPn{vH_o>4XBNk9QLx#$(g1Ro4q4T+x0=&nGL2HdY0aWcPb}%*~;cla+Dl46-oO zErtY6pIqyi1{IO>Z`%BZV$}Q&N^@iz89wbNr`&X+Md_ddT!-BjIVX8oEnC9ZVz;|^ z&*9>f#4UYs4yf}00$N)vt-SL($soK~Fw*zj`+SMhcx}i85LO@TY2*bxeR+vIE(4k* zY4oW)Hi<0y4H7_3m5QrAYuntw{^H!d>iKS(`1S7qqgtF>q-xO!E@dQeP!rC`Sl9fD zQjfBz3mR}!`1$>w(l~95DF7LG>odcPF6QE{u2^Q9dCmC2uGT|Voq~9?fh=kd!x<3o z72ga9@UwF?HO)EzR%x<|b*owb*_DbJ@OctI&)d2#KQ`RGf<}SxBHgn%}_E`=VnR~YB8V%EnjAfBrPYIq;YDfg&+qdF-FYUcSEQe^W_Up zX*CKpCEIL04vutASqWM29@QO9TGcbXH%sO&8cJUT!v^;5K=B(EH44~&q62ZsyDpGt z^}=h>e#8WBr{6W2p2HC9`2fYs8<4C)NC@`S;`%4_BC80AjT}U167x7T}eJB zWS7ccy09x{%U@Uo96{|>8Qe9zUXH`W8}Kr~&;Z890)hpd%z;ut%;k$bK(Xo2a#QAg zyLsVh3gGTE5V?VReop>O)|>`R1jdT{4WU&G72y!2+D$)Po2>O(!)foN zz!l-`?1~8&Nisc4F)SLTa~>ZW8_4V6iUj4)1R?h_8T+MB-j3_|=cBW!LZ|MvYguz@ z_YJCDcSI5dU5kJqd7mn>CuX+(%xyHxb!*auDtyZ&3A~D%xR`ZS7Q+lGkDOBLr?M2t zf#hT)?(6;}-YW@oc2FdUihd?C(Ff1#0u5jnnB$6KRAS;f4yJ`<)sFcud(I!<9^B}nzwTeWR?`(Qxyigdm;ghV^2r$>4yS4Dg-A{Pl>h~#=aft)(i!(8jX?^ za(zfjvU1e`6OWBhKz&#SZ3CJg<RL| zFXk%N5c~$_!DJzj6Zrd~F*6S*v}wl~;p2=t-m1Rq-6hRLQG#Hu+RaAxzeJIZo1%|LU zU57rc)Mwf@B6&JHFsacGiLp63OnY|qOoktp+Z-;YUL3r#D_@_f04HP|=g2Zm-M@wG z##olP9bl2tQtBZDSQ+zYwuTh-Ik zgRRDd2M@)g6u5FuTP#TXW?+SzS&2(65X(TiF4YY*)8wbCp-@upb#qd|BPmk;J@d8E z{GjT_%}wjmy>2M%?5DZVzw=`;>_>2{(_bo|fcM#0aPoj1lz0XTL zYnpZ095-!xlg!-kRRH!0-CehC{?-2D88D?~&HDt%YNl4CM!mnqzrvAXC)O zK~e`n$J>PFWrRNxm9sG5tp$2(#T<^0kG^vJDKhwrJN4VY0$k(!YP;H6vU5F)(T@of zkJ4NVGY1+r9<7$HK5ETdAR%A#$H1SYwAhxHY%PM=D=RBo3n;y+5 zrY77`YUHB|MEevaTUO`63}Ovr*FWB9t9D&yPujS;VQ`1DhKG7A4tl9(r9OAXKX=%bQMa)1tPa1 zt1)V5{w3%%PRM-JEl5if12hvBBJ&g#v=+%ElMW6JJ@_^bJ)bc$foqBawZ_k~VD2>> z(yHZ^=RoA=;QHl%iYjRUY=xK=OQ+Ps;8L&hLi6B`$oYZxppgJf|1fw*?e_J?U^z7( z{@!uW@7(8O)1hEU z_*Tlpcc;RD)U}Uq>4y7qLiUwtya@}D(9`QsvM6VTaFfXjsKT3~++?RwHPLv$!r0+^ z?fMMemF7YRySII)t0);g*}UVK8;F$Z4R&*sGhl0jnMR;?q;NP!{Z`$5EGzcYN)OgMPn^dVcLB98o+!*Gv#N-F6P#tY%&`{>U0C0i zmp#;cw5#69-)~gQkDJ}_zZjr}d^JQ8%tNH5Ka=AMZh|w0wN_QOe^7g;$bx$*fpev! zFS*svq*`aCkJ9AFyk92zJLj35h9s&g4$t8%Ee^vLS_`cf;xlUqrD4f6iYK>TK@M?gU&sS4z}{6j6bH8!SmJzCcn7jh2o z9B8^E<+XZP1E!#|yMycG-h)xBwYse5*=PvhhnKe19Xb{5^d9F*d(7h#1BFI` zMX&e3xnWV`MS$U(x9IOSJd?OAqGWyyr|KD8$~wJLXB1ia;0SZSa-qE2(qMRw8I1Sj zd8}7}8T-LBrBcOVgB>sxykQ=Yi2jQ4S&C+^QmO3;V06KpyZ|iH-vWYXZWKy*9MAX= z7aA8-11mq>n^)dkCZzASfVNWuh3y7{PwDIE>4|s}&EV0!YE($%XK|<@=HFUmVKOVr zb?G8;y(DtHVJc7*vmTIq?ptLHvFk>B_`m|(js}SBcu+_Z9Np|+;kY}c}#wg_QqI)XU)Ig_W9MJ427OW7m zh}_*SrV}!3dGkgTkJI!vM!I^D&duE|couGvR=IQoV%@5^8w>)ig>H0cnT76eKTFsP z#QMB-w7nr~-f>VdET_&j_8mxltI^pN3^!M*DDr1cV<#?*C5d=_=GAJhkfE@D?K&sA zm#?o2mGH^mRA_E@u8&==1rf1Ug?Xv#31m%!dTu~_f4LWC;$%DvI~6~!RcS;$SF_@N zN&Yr2Dr(UttEA)$dH8{BzIrQB+@Z`(YVVU$Yan?SXv|z*e0~m~ZDaU^lLt_#d_rp1 zY1u)!_H8#{8EH99Q8iA+#CA3(9P4MCR|oXM1T5cxfNnPnWmkE*oj}Vag)MtD;;9v= z@{NBfx%lOiOt`HJIY@DNL@}{6*Bb!elqb{~_lcGBf>Ai-i+ESBX)pnWE9Qw4_|CjU zGoNt7K9ov$h{_0Flw6+)0%>OLD%1;=c?IJ?&AR?g&aYb<-=gk7QwdW zbm`-Lw`q}Sk&N16O`9po5WyRzOL^8m}iX zo5bU4YcHnA{7bdDG9sxdf>u&Kjg8NE#ioPzBki}m3XtWv=f@H=9TDfq&}X^_23}*Y zKPbb_JxQe|g7^ij$A}pk?m`WMgXM}(v=jV~pfZvLgO(N+794i-3mj&BLUlN}D?l93 zb-7vmy2U7yQY#D)%rHz(ed=KYLa&l|6dmQ=VE9N*I+W?++PlDbKvrqZbnRIsH5VB2 zqz4Z3(ZW)ei+ds6%OCUjF0iNZiXUGXz!SMTqd+9oUANwRXaUf&BpeqEvuyE8unkJx-M}cRi#|kGq$0QX{iAmD zgw;n3jEtQ_nSRvEU{b4D-33oK{_I~Z;a^5mN{y(XsycDqHfpq{kD^A9*wuPa=wUT} zb-(#Gv-*?^xPh$dXRJ_Bw(tx|ja-1{8B}LygU)F7gCvy@2(skw=o!l(7se1&EGc~U zh6J`iY1e-{Xci=<4oW5CNWTC!lI;djp*yzT&eaID;=bO9k%<6(ECZ;m%Zq?^v&9z0}m$zLrM#&JV zDi#*F`IUux>f59Fb*I13Z~#Jo_W6AAx!$De$tj^|{xQ4qK<~4ot$S;0YvM^PEG$vr zEKFID6$vlDUl89vR0Livm*(XsjYn=kutTpzQ?lKIxp1vvs?v&{S-qePIaMzxczc!11Phe*ps6i0OWqG`5MJMUu)Q0>Ot(| zu>l1$f9is4y$3+&<2Wv~?TtExGa!;PvE^E9Zfa_J11)DFFR&E_lupDIQ=nV{2RSWv z;_|k+3B0FAOsV==YJ;tVY7m*nT&-g~mTzAyh@(ZVeTU|*9fGP)eDA(vD3{fkJecEW zy0mVizdHc<>CdF|pgDrB+Yhx_&)PAGCJND^x>lenK^{6;0u(2*g6+(->Rjrvii{6hzVm?jl4Own#6~cG1dBKPF~P^qiWuU*({lea#^~GCC)BRsuRu z&*=^}$EH3z=aa{RlByf^OW4~W>B%Y^RuATUZm8Z%ii_{(*BlGoww=ZEHTPuu=_h=j0fv&fyojxC5;geJ>C9_y?ot64a#*3F7$azlOm@ok^DVu)m*SKm{(?nv zrRX8t+0ik#eICsM94W4_UA}r@)K~u?+1Ygchp$~EQ?0KGW$uWzYzebi&&#Ve2I$Jv zP4lmO(B0m1c87msoc)ap;9BL6>Tb5W5g#~tKQDXDRn+1N1ef*VL9+677H(N~!DG@z z{^EKvbyg58`ftur=d=`1n~R)&b0p3kv z8&2(lYjx-AZuTgBJ!Cl~>$$h9u8R`R&A2!PW*_E3T{_y&NyWn2seJa&bJGolvAqZy z!N9Z}bwrUXkYk-ZJiyxZxpXzjtX9@gA9y&<*)Oz2*$3Ey?}C)1zoeQm^`!)Z{QG%U zL7>?N6{4q?L>#lT@%jK+v@YOfwtL}`ha2$j1hW((E><$vFu`p;XgNe&MY3;UlC}C= zoP&cb0UH+j9W)9KiPxrU%Xy1N_0y@YX*)AtdE8 zkAMeN&oT+qBxq;1}{%&G%&+I+VVL*7UNF@iQE9OP?5Cv;T5LfqVHpo=&uC+f{R<5bR~Plfqa z;k{je)7E6=&{PgHGmx@jTx@)aBsDv)>5&B7(em!#Z?-tVm5c|C&&0eT|1BgCTigLm z*ms~v5a5mmh6dqNvjJl6NKiv-N+Riv1ks@hbFSrm%_&eLpyM=sc{LDz=#uXR)Fe7~wkmIMs4kDp2XyGFRp8Nztu%baw79h^s~kpzU4> z5aCuW7*;R3p&B`sc6KjbhXp8cgxf*KKj^2~Oz|*SPf1;sYm#_ucxJ6K0Vv?&F%wr2 z?O^~8iFW%I^J0{OJ1p`E%IC`kd|MMQbtp>^n*NfB+Bo z*HZgmGfuX=zP@@~X57gE9RzXNlX6o98yb;&_a>}GM|<=w^JzVC)EuPd=yiwTr_!Nv z#R8jgMsI%0F#mAmfBH$O8Vx(dJAzd(1m@8Pd3#7b5`!V#~lO+oux zvTOFF5#Ngg%-W4-yl(A|L+>LUmUedHiW`z?p^aye=ZJU>SxZa%i)QT-;_!k;qrsI- zr98N|tV|5yY=|}fs;J#~{b%Lft7XZ8u1@7oDI3maWgI46Z@?rXeCjS;2APxLnOQFk zS(WnJGx@n#6?2;1tbn+k+lChIF(WT89Ch5K6VRK5fqHL|TzxHIcK=R&d6KQGaor9O z1#8Dvsc5KsfF2D@a`53CDDc#uEl5j;l36raB!iEZD_w7M!%hvo2;vkeYfkZ=a?uoB>uDIYpseDe_f#*F2o^2(?GYskcMpU(6;R!Agz@KnIW?s~Z_<>{ts34-HkOLjC z5@;EvfYT3F<)fUyU_b}Yywh6)>OMm?_Df|Nd2Kp{Oa(-*4mBQ=iS3LPK26XD3gVf( z`g8s|j%pQ$4eHmo2hwXi%C)l!76kS;c;OWsWr6P{rxLlXBpKB}k`@kDidPpdXA=?d z8%F4_bFL+^Cx|mp?b1y;l3< zS!;aY<;;ocUbkZij?rVIRO^2XllhrrZB8b$?s%OfVBz$~fUpxoEn({>10jduNhFVE zL2cx{ZuKtT3$Kr(m1Gm!uO2_GN2Y*Oi>gmy#Da`vEUP&1vyF-;F=hmy^BkC*4zO&MmR>bk`f|z+h;jqNozODy1xNh zribQ4xMYm??zw+8OeWp(uEATySu_eqK0VlJp^Qe)*R7dk&2G*Jr?RDLZa?XNAxm9U1HK~rpX0rrfNXMq!*6)`? zH|83xrmA;hK=ZRWul9;PFl8)S7I9qIo=x-)kaw7wZFnlzfP&FS+xOFsyzP$iTaaC`wb>_s9@mf68T{-A9wae z>O(Hw6r>UPPJ@r}*0KcuA-uI)&t5uin#Yg16cKvoAJDTjAwL-GrTax}wej9lXd-hO zHD;Y#P2T4V3$nYJv21DSi%;1uGkaUiAJ4U4*!v`dmcrnMqeLps<&{iI_{W}0z6<&Z zr^E<}9BdT2c|Yv?AL$IlZ%T=aml(p!L$VFwb)sgE(eQ=qFkNmE-BeZdZum7 z0(vdrhVR9!XtJ7XKz@tUwgtj8co+9{Et;nQnCl(&wRjX%2X6auDnTsmJge36y`yo-dEAPzPhQr!$nbdqrnBOxq@)cN z&wlfOML@nLn1729U!8rdc*C^!RxeL|AgHb-Mbwq=Uz&~;A)E6QMWzsXTvLb!&5?L- zpOQxQ)zZ_`(^mX)Yju9xdpw9*I$Byiu9^Z?W@hk<^*Jq(ps+A@{4rJGj!tu55M`Tw zM!c9I+TS$~l%DwUHyU?VOn5T6->&;7F3?vLrBPe!T}UxZP0!mVk&wxDCa?B`=!yL4 zhI2f>Zb2n>KM@qiTi|{2>Ue|AZf~V`ZMm9KpY4v`UN!0 zE$5^%p7FJDjwZWC`6tNub4J`d8yTi#^*Hy4k8^WPE{9{dxtqxNif0P|e^u9OKW?Q0 z@q&2$i)z?jSN_LQi?aj%PK4}PmAd=(n5nj$T;4gLMA-w5_3U-|Iy{_H&7dFXA(Pc$ zyC#Fl#jon)1v!?cCemZoJGq%u)o#0njCaRBJ6q*rn>lh4?P%|W%p`K}Bbj?iIYlaY z)lOFX$Dauw-X64A=}RsH4VXcK8BnydRU8F1keUtV|)!kwh0vtAxeuvpABBm;bpL_11(0!GZw<^%y=5Mh^kk!5jb;q%It6y2E-Bx!ZMijr67UGPF18aY6g;RXS#7jy ziYIjyKHJ&;189;*_v5qx`knfjVwpthnF4RS6Th5o-I^SKo}^&*lqm0~u6GHJ-;!!Y zyJqm;#d9K(tvPJUm(OWLFJR-Fyx%@tW5{2mxJ}1tGg%Skh>jQ0Z|2RqPs|cSOQOR> zf=6yxq$t^%tFHc7+l;yS<5}F;!8mhq?dW@u!r&5FrKV4Em1isL=X%s1!4m8zL{US! zYiS{o2LR?6*G}bm)g=}td;=*neyfJ%@PuE6$YveB!{xr7oBfi>O5Ke>@PzfD?KE<4 z#?`U+g6vDO;ITGgNx9&F)MeuZH!x)9(e-j32Yj;$_{;JDIaoL_pRTqzBG&-GsaQZP ziaaWil-cqtRnYNiM2{~Gg0KoOBHwojPgVz=7NvmAqr?V zM!kQ3e`BmLI+R>Re!dEpqFrHb+k}`+cNSE&7DZp;ze7&Wj6@{UiJq5yK}g1+>Yft)9sHEN*1PpW5F9n%|Rw9sndY?{1v!3OSC4QPxRiFDf)* zB-=?Gz7%EiwvGF{K+jL<_Wk=pH1Wb^Y7NOF&xIBa@z!otqV^Rxe(&&6**7`cmUv=) zi;YrSrt6W6^y%napK!ola~Z|kin3lG3u@Nhf+gnRBh#Ju)9&(n+=Z(uvf2zD-##_A z$RgiIrQX*`@SY&~HNf#LEg?gq>%hc{aY_&|io>v9F;npco*{$m8%7yJA1UZ)XLcDk^ za!!Ktp^rvAHY9+x(_ zw3}Z8x^{FbweTYO&6(G?q=LXwl4Emjh1H_j4tovqaChWL69A`O01YQ|yLfGRt%=>r#Y(D%;s`lRZ zNR6s)dbsNO+t00MXWmb$ba+J+j*N-a2KNE^r)CZ8)PQqsy6V7pmp$L{Tguxh^=Iep^pbiNOklYOxE;CK$H@%HUow!?8HP4^nLw}3nV+I1a2 zoHsV4zW50<5rAt?jeAl(3U{fgVG9f<65D5lRBBRlpBVOiaJ$08Npx8dkz>GpXv7 zC(lgEre`AJLHFQ6F2~GCWwAOPC_2uX>U+%q_(zbj$#>a;!|SHe455WGbJ(pW&Uv&i zaJPwX--fiCX{kl*KRz29uy;R}ID;#d&6dy99czkyx(yla-Vmg{k{RvtpcFd6;F(DT6I(exGNhQ##&qBMwfH~Y9oDuP^HIps3vuvEtvcH z?lWeo{2dlC?G{S0SJhJlB{j2GcaG2zE{*mKw6v{KuU67OE8?#Hh~o<26bcXjT> zlu!>;aw`voYc&$m4bNH*3wzp5WVU(S-xXR+^{jvUCS@_-p4~O&HL@&&OVW6{j#KtR zGPnRzKc*wMqDWb==v^qEX?SIndCEENITt=J_447C*MZE+HMiMXnPk75<{7fQ(|=Qj zVgatjMUlC%G=$RO?fgX%(307~!S>PlW27g@MP|qsoq5OQ-uWhKtF7Lih zvh0c7l5BLfQ%)Us4qp4MJYmaUYHG7r|8gEfM<5GI0!DnwnQVGg1$E zT(~#PT$pK*@#Fc?k?!H#$jjPQkvXMOD%Y3U=2|5}Q@I8oqFu%MYK7H^VVhGsIT&(* z!5Q=+B4{e%TGbEcj$gONiKNtNv^7@FXyv!#iPSbo$&5yaH%@JQ&}SyARt%0v_u3FV zdkyr^@A|zmu3bsPr_-wf3g}-E%!-*G4{7#OzVKOX9H+>wB2t=A1TsrxrJsSER z>V2eqU(O;TQmXeEEe*_ytZ}M!`Mw%f&)jTNd2kIE-)FB=X8An`x;n=SEz}SDo2C3) z!LTM~n3(4K1}x?K0Rd-)B&YKqG6XzrhO;VjRSQ;bNLMbd!-)HcD6V-GSuuNTW2{gd z1pi%~j3W5UsrtCOkJ)iwf$*{&?t$LvxO&2cR0ww6Sqt`&M^MzWZDRTzp(yLH;X@=; z&bjF;B=%(Lu@*;x{`GP%-~>;-BvbnNQ%;S zW5Sj7K^Wt#Ik^pHOU>Dd8?AYI1+N~Od#>aQqlQqjg5v=oy?K)Jlg#Wcdv{0e8rj@>j_4*46OjWfsp7mK*TR4V8%i6QA8~_u%jBwo>31 zBY4}>kk|f1e#FI{u}`SCS&Vl4^L_MU9qqm*dM@-ynQ8eq5ZVgX6p(wLZp~lhkDUev z_is}&(ibR|jxkpS|L7$0C+oCmk3~L6AtTXS8U8(b!H*_mP&;C_P}J?u#(u0}I zq3XFddfxvvl_meQaZG! z!nal$@-e#S{{{<^)`unKw%)0YfA47{xylEt%Xac9uco#>^kUMTk|K2XB(9NXY{KIL z)vS3`*2P+@L@auzGDY>1LMa}bUkOU;7b=zv^KoIjM@rI(QzQRu+gWx#`1Z` z_AV?BZ_{eH>}o>3)m+5MaC>vyUsb1gte!%Ph{bNu*)l#J0f#WvOFwi4>_~D~sfpR+ z`%*lLNR^cS2Tb@)Q~7U|h+tuh)r!bmS2d*v72t-=PfsF zAht@9nG_~5v_}}09Yv(zhEHZc&WCW5ya@xGM|5ahIoSZ}^>tjTesULy7H|+9*jQWS z5%l6jGCW}iYU|tQ=+~vgFAhGA!@Y3i7*+|+w0CgJ822A1ON}y0-)XY>%JI$l%=w>A z%9TZ0sYOrLKEf+guMUg4aU<9R*L6Af)6nn=0$=(HZ~D8rIZ@_Ic0#Ks!`ro`KBde1 zXW!=yelyHtvQblRhn%VHHGI-YYJ@~aE`M0un6AP8b`7NnYO=mC8j5Y)jJ+2;yYyvi z(-jjB*Ti`=WhB(1Nzyv_7hdM@X`utwmdZ`^au`G%Be@sf6P*VY%!M!O_XeGea!Slz ztJli}&L@!;gQGL4aw^8JG$q`jHx#iRyeGCfjFtE0i$|z_BxkgHGjqeK41?D&(DG9U?HX1yzVI^#aG@5B33$a9ch`KnvAPgYK` zjtHZO_dABKEeZ`fnRrJZ-BwD~`lKyA8O2R4M`eTRGvlSB6y9Z9(MBPk}NPK`z9 z=jh&>bM&OiHv1_qL8{T1xpVhnmenUX8=t#`&>GhI=z-clA@^LyEor<>F6 zwpy5R4M&q%lKb-$Vd1rjcMOWsl6gInG!FW2j*L6HdzT*M@%AC1DpE!En>SNZ>DjKo zqqJK&n1zcFpH{^1Cy`!5*6KIfQoV$ETEA#yvvM6ej6}pZ0b_!2mI$+1NgLe?o5#D*5%oE|tw6w~=4#AhY{nADQa) z)rA=zE{Y?E63YUrbA+V5Za=wo&4Re@rC3a`^#;Y9%0jE)+CC2wu+jUK>U@{ZxTdQ= zboR986_8G*<$K?PDF3jiTWXCI+yAu28h3xvLd@NbM^lX*3uViq2YSeldVl+il2RW7 zU!-tGc1xg_e1`;@-yUw}6BGq?QM00}>KXR}mgJ?x2-B-|Ay)G3e{U&fJv&j|X!f{( zGDLUQK#GBZoCf)FZ}T+u&gvSwW(n8MO6t8pbY#Y9cP5K{w`fUp+f~w7+4gx{F3~g) z8Q&%(BGPt^EPDsYTL9Z$;6#5sIvQ!)sc;JWfYssgu40FyEpxbV+QdaR>L4*nh#K3M zblfDO>Nej2oE!Y%s9x-KbHeAwt^5Dz!oo@qDyn`)A11B$0PkhUc4{ES`5s#3y+r?7 zN&I>g)<8vhnFxRP#z*AcV{LP}vYJwQW;~}ls6}~$Ew3Ee?A0u|N$rS2P?FX^H{PFk zUU_+yS>kG*NXCJ6b8{~yhM5#cZ&`_EW6{Fm@Yo9B2fXRs#HUlre=t2+LF@Q%>hv7XVD5bZj_ijdnh)a|^imUu z9CBLom5ysA!)idOAzp&f~o9xs?0o` zf^nC0m4h7^4?Onp^h~``X+4T7MsZMi-vj?*9r=jyyrMx#TIATzs>i=N&NvZlOJ$P) zyG7x*Nj(8Fqp3bYF7*wX4{J`bz323EH`hdPPWLlwaSz9jMm5!F}?y1?#5aXpEZb=XbVmJ_k9*a0Dau>qtTiADR>jh86I%+7c~(Kc;dY zSF;>tA0eX*Y|bc4Ms^pp4^W@hggji`qR|mqdsWfv%K#lIP4U9YetTrkVTr-;N6kUi zFU0sxn+$!DN<6wRp7Atm#h8ux5L%bPKiIIOIjPHD_%QKQm9QWl8!nz<{s=j>Lei<2 zM`Pi-UU-#`0A#{aD|nJdmU6Y>cqg ziaj`+!Nb`7QPCbWXEim)*hkj)+T)`IBJy#U7(Xm=AQ~OKWL8hIQ~dGVg4Ao8ubb3b zatATFwAg@EYM@ow(Pz#c6p8zF%s)1V>0IXF^xK}OelI8GUSbvdj#>Mp(kJfL*UO*# zt9@?mtr!q#=9qPl1+x31V3wHU`X65yQz`VFk9@4iJu|j1@yi!WANjlGxz`vnZ+a(v zs{}@T!6u!j8(`kl&S}d=p{$bfOP>#o)gC6?KBtq6?CNKh=3T2{3sGFo=&(C#p{`nV z8zG%U`3QD)-w^x z<*li+Xm9U0qrnx#`Onb{jp|*+Tj|ES#nX+wj4#Ptf?JFiXeukYbPc2k9d_nwV?Qm7 z>f;_KloAViIF=PHyX^_nu$=n+N|!Ecua9;kr9aBiUi{7pbl@$2^~!!_F~@E5_#?cU zPR;Seo0&CoD+66h*5G@i{GMCR_UcO`HuVwRe(r+!d@}i``#&TZ_QgG_k)lN&29WnS z+HAY%Xl#AlYm)J#cC*m_!qu!UBF7FRV;7?AqLr$G5TmqbhRtN$scXqu7IMHSvXln+ zBJN2$tK1ET(Q~p2y5SmrWL9QozC?6MhBuyJnru`eq=$z-)tyRb!_K9ABHxni4MkwRxVcFwPEz0ej_w2g+&{gmcX?omY?3YOirHZIC zy>mn?PIiy$6NvP*krx!qqP|hQhpFPv6pZ2(*!7<0 z@nTfe^z*%Er^E_W#?MOZnN657@P{^H-jw0d`d6mS*G}O(dRcDp4)~=&3!;8ts*l;> zn>8aBe!6e@R=xIIf3P~X8!2mtIVLTncZR|W7@esuZ#;BY-o7hpYHE)Mi|Ja$V~gjt z-^q|-XNjC;WE|vnGw(x(Ajkei=(~Hj`-a5Fw`3`=Dxn)4+o=6ztI$>BOL5z1?Ol_4 zJQ=GL)dAs;ulLWrg~;pfWGp?^9f+%D6y>w;5cj{oravFSG!n|DAdf? ze?$|1%74!iAGSRd z97|)oP~Rq0nJ=;$uSeFhb3$&ZT`zBDRF~E^E^)OhDzz8tUI&R#fD+-%K#|6u%ISZt zbJAP-ve)zHsby}qHxrpOG-jE_r12iyx_vw7ij-_X>`>yPD;@mcySw`}M-d+%A5AI7rfizxLw+7xMr!^+ zKstVdOY-!YGndf{e`fmmu`W&MYa+75EsWtN2WEYTNWhP#XAR zqN2Y0mWOFNJJb5}YbxGTuvU-TNd=wZ@6%-P)^ar-ILKkXxBEG&x>B>v zEamOuXM6^fre@jTnzO+k+!F@{Or{h1mOq%!GaJGp18n zTJ7*=hke8Mz0kdOZ+b>D)L~!@p;a6vH6fKD351c>wh808LEWOj3*4b-CW?1<(lT_E8jp^~{ilKGviDNHEUEF1 z>V$-ZGj%1&@u$u;P42_mx=xQmd%H?+0Uhf`yyWyVuJV(=MjN}et>%@X^ns?5Ei~<# zrNQ;s;!~Sn?a*zF?INCjrkv_3ypj?~#PvAoA&b^@_U+Veeao0}7y-|;ioF74k% zrQyeU`s<#F3t%sZ9QC1pm=hSUz8FJFdP_wtu`606g}xiFMCGvm^bUraj6a%pGUmEk zPS%wiyyxGt0heb^`&h_WlNjai17REohU<_f+O3Mngy_5N+CL+n#>=+MArzOJ-G8_0 zFXpsAqlQ`Xb9B3eRVD^rLs6%MJd1@edsB4fTqaS9 z^l9SJ;**Rc>oobndSAg4>=%IAP=WSlh~}15Bi7hjS=m;syRo!%c81p}933J4r&Un< zmR{p|5EUJ*qjNIkTT^FuWBT`w;@^+BWfH}#M?lSGIrAEiEay%zvevEJhYP=5w?(&A zw++r=Ib(O(#f`2*5Epdglade{_nps^5B2(rQaz27NIcp_S~5- z?9;lbDHE@_5-OZm@}^B?K8bhD=qNw67fB|IV2PNYk2>O~Aq#P0y@4)Bg;)rl#Be4P zsA7|Q3j$3sfyY zl7v#zC0)u+^z)cmpFDHDQj=0vA?=v$*AKvv<=-2cmev|8uLs^#q(-7VT>h@K@|Bqf zJ6OE*{jRA_yqZgS(aq=V8MKXL!yn4OmJQc+c`mRvYWkOB;XiZij@^qj-0Em+A&=(j`wtSq_W#n2z6hD_7VNO{NUrV~zB@-cye z-H89o;^HletOsellb^G1$Ma%}!k8*^$5rR~`72Yd*V4TdS^R%K{%ed8SU}PJ`n0+f-L~RrgW{zvv6;()ncDYh8I%PoIW_cc@NDQi z`{xtMjqwOkw@3~jK78@~`5Q~E`Y+up4GJhd|04DJhgm9J#tsY&jFNIOudAs!&})_D z$i=OIyqlhpQQuo(^SdQ!I&iuR;bS)2(WH>F&)lC*c^IwRbrs5eX9|=AL|8VT(1O~x zgDG}_P+BlwYp8qW2YZGVu3Zd1|MP>s(%0E9UaXWP)`H0j{uF7x&FBUH6)#o;MNS!}Igr;N!&86w_q=vr?Z+(^~+++jKTpnbmGrOaU|QJ9>@p?LC3g zhdBm*{Lg^N^tPk?Evc7V6Ho1T`!Dc4XK{iSCj-0os&u0T8p6KNt$wk#-1~dA+iB$9 z1Xn&>#Jk8!Rfof!IBb)}epA{adActPI6V5P$R1?NF4{K4lgSNFTI*>tWlx^;;2SG# zrg&F37kypTo?$#@Zfi=-%E~IR#58X66t*SKhfk$)ZG^k6?SaEF@88R;?F)bA5l?=) zObnahH-$qTSEpys&E*$Rj_S)n=2SI_kCYI{r=KBHuZNgTc1!1z+sBYSlTbaf=65#! z%OQZ$wz~rtbM{!HXZ`j$+39q$GNawrq3`lXLn#$JlKlxi6fdRkJFW!3BATiG-F`+e z9Mm$Bc`x#??V`D9zFvLbIT%Oq3+YoxR84XWKPe-XlA3CB{0z~>m!zFJG?yu;=!2<+ zJU&+>SUjY!9wuSeurC>OU{rSWj=)m;+Ai;YY3X`(H>Isy(b8lp@z&DK{*)*OGuxXt zU7$SZSCCk|aFT*Td6rl2cf4Yg=}!Bsb%g`EUalT2Nf`9oyB}Zn(aKho_kff~|49b? zMD$48-d%PA%s@9b`k6|E{DTK?BtAqW@v5n+*8To|VdzqfoSn93ffuLpX@xVL^zpd* zBYlP(*evJKyHd%Ox`Op~q}Wz>^p%TXh=daxYht{xy(Ci8-7Tx#o2k7ZLiaam+u!#1 z`&UjLIMaJzN@fQ8A}RCAs^!s6>&x3)tTCK|6?wbuEP+uZKW5p+#{9Xi*$Z4bcP_He z9$#H8L!+_b5kM`OywS00V9)U1(Uy1tg(MS2Z7i3rI46w4r3`ofiRE1AP&cMp4z4rk z%+e~pfgX4$E18qKoo}ZpoXl&f#Y6r+J`$tds<5Jc#Lw{-78abxV;gwe+S@MzSXka7mfoUB`4EUQ&@E?ZvJ0%Vu&a^n7 zezWrObgmM4Y~@Byf5p51>N=h1TVO=QmNkalLxzT7=F?`+`^;h4pL7a;is|?jiCg&7 zfIU(r3E-Lo4ralJiT-l+zkc{0>`uB=7!gQIyx?o8Q}E=5^+xJ%EXCJ_v%_T;KTS?P z>+*t!+GaU?9|Y3&-U$~Qu}!U{z13Z zWMF7h)tAre{#Lmr7~b{NpRK^neDI_M0ghsOw$9QVGc75qJR20IC;iElONc%+Dm!<{JolP{F4PQUVxj;C-a0{ z;@{`Xne_N`PtTwf>e7$Ca^BqRqH z%MQB=y-!n5FG*`Y;7;$0Sbw}t=b_io&bP%5&C z@{y)R@~27DWOwDw9FPCK>;Km-Vrb-viG>^-iq`}5Hlov~xDW05v61{&u@Kvd5?~b% zP7$M~gKlk%ad=m&RcXu6BE#4FfXKdJ#_J0Ce|qY;c5DFR#s(>d-v0RMFT@)k4s&Xv zk2E&2#lXxglR~hwfq~Qsc{a^U3RtFdWxMhad4@L)2vxa%Jkq}w`==l9vmAV^sYyta zOr!mvkrs7M&2~Uv?c)Em@&~&qJQT+mLJr^lK_-Sx7vbm8 zkFJ&ne)(6R{zJ%sw8kSTKpdm9K%IH?-&R3<3mX%p+AMcBmWMBDW+l~RlTe2uPV_HcXhYFCEP6z$d$t+Zp?QS3gw-OPsKkP z2Ih-=>ow0mxd8<#0%GYCsLnx_?nMT&D1zTFdon>yQxk*bX#k(6!z8T9>LbdZ7wYGe z8i5TvO0d=cgjZ)o)xM+lTNUcSu09~n*xA$bNXbA$eSLl6LfW-Gzpl+cme#1m>Dh}c zA!DFiYIuKfGF_VCkCDHQLIfaJQm(EQge!-p?G}Ojcx;y#r!!}>6Hn;ob|V^xk(cLWy;p+`E=>4&!0bk1?rSRszZf8UCke#`|Z#e9l(ZsWss*EJb4~e z+zaO%5A@?M6VMRv_w#T1vE% z;QnFXr58W{m7hG}_2Xd3i-wq&jEYJ=G`(7-!LTJ;4aQ>rLFJ-~DFp??HMn4NL{y;)OL6NzjKUmD8WxvsG zEH57f*~VCOjx zlTC|LXsEI9vm%@nxFx6iOALg?#7GdI|2X5ngZnLuSY4eF!&@rxpX^~uEwPUayK1_- zx4t1=Ivk%%>;#F|c&e#^fq`r62(C9Rcfgr{+}dAa=D28VivZxk#k2|`W-bMFT@~+? z;LV!>Pk};gYc3{e<-&{6eeOTF0Av+JS}+ChU7pqvS5-|dlj+-@qM)GL4~pquu14Jm_ydp6znlH zG<5y&36!B0dN^@7;$O)x|6ONLgoAEp4zqS!%;($4@1MyZ`Yl~p-m(H#{>7DOl**st zm2EgEelM0u!hoGpRYvI2)V^`DuuYRpx--b1ol7SrNG?Cx-a)255_sX|wZai!)TsF` zE5dIcBk4pgHeP*`)o_3gX1Q5FN@$+946Wdp8Z)=>r2TYkG;(W#Ii{fS3~l zRt~%}BzKC#9qDAolXC z02K#YHL#6H^yU~c!pQGi{4>1;={joKU8S7gc8-P?wpw=xpX*){pZ^3kj`UKooq99j z^DTiL>MH(Azd>!BV*pch5#qEFC3V2j=An9i8E+=AbB3WFHtIYeAAD!KYQRgKnX{g> zB;S$>RMpk>Y1QPqPjZxkZ)mI}7gW_v_b3D8A*3OE=P9${Kw*RK#zHj(V$b}g4EyqD z%Rr?sFEY)PrrA+Lc89;dWmx2Xe1p zZ0}#1ps0UA9VRQ?)r7{dGj0s-G;?IpPsNAj+))pGMn_R{;`qO!LE+j5y{Zr_(hMt z^bGburzcAVu)3ckV~efHH=j~p|1tu@dAd&`WfY79VK%(!%v1cbOTY$5%~-N&NE>Hk zPGGY-^MJ3(t}W(8F|A@QvuedH3|nHz>xo6RDI~M?Sg7UW%{52&eV!@BX!-T&46#sq z_h!&+&x!h=Umz0r#Y^km5Y%&QrCwA6n-dh!<#do!i;IzNewX0#9%G%=l+J1UcVFcL(f7IIYwqO6>Rc9VP#4_GNp6LP%893xlVE z$u&k@q$Gkf06&Vecnb7Vl z*>SkokzG^C1xhf&Nn@{sSB_803?!md!d=PLcNRzKG5jA_rCte7 zO~dTh>uB%U^BJ1Wtidc-I-&&`GiHG|hH-{K?eW|qFq*@Lt5zO5#e;reI*_cmb6$|V z=X!F<_P%wX&bD7U+)~bHJ90$+Vy$U?EVBMYZApZ4z%EW~?w7jLf28 z2~Q>05!E=0Qx&N50+DEXC5~dr8+-zd~bJ9^XsN z%^sAi`c0z#tAFe;aW1wOGf!5jboXnri_p03nJX*Gw{>r#zd-Dz)Vh9alq=DLE&se2 z7-P*y7~++SueV(r61*2DlelV=qwJ`7VYQ!4bhdcIa3HbKPG^#;CtE-GvATMoIv(Eg zxN)Hzo4)+SxgH=#sE1y918@h1d|t}aXp~RPU$Pc`r`(@vILJ#Yx%rxiq4++PXvpVj zvbaEKVZ2YAo^GR+YYwXly)7iP-f;NJg~ z4rAdwp^oTW@M8aDWcmc?v;wR7x1u9^VNf?{mibBn@NM&(D^57T%9-VDeyMLTCZyt~ z=G)oKP`1a6wjZ3uC$~$s+n8aKUb8Hcinq+yVwVnM(nf4#DVVk1(xAZOZ4TkcxalY* zw@`j`F$5+|H;v#_X-sy+YZxz$x5oBHNtYspDtcqZ!VSoacGiK2DzuV8F`s>Lq!H}C ztW;32aQQR5delq(@9RW^H3veJ3`lib6O`*8lEGgO63oQB!UaYX^`=zdE^~6gv4lbs zaD>jp8sc?=sb{T`dEl^mly}Vug6yhkvqqM#+S&esdcM-$1SyMZuo?;X>{7UQHW%CS z7F)qlQbKLait2%=Z#7+;dIyn!k48emLNe``Jl^Xg_^@pbp0+D8-=b`GB7)kG{Xf0%UK zKO=0G2P59CPMO(}0vxQ?e+mb zU^uS~6y;9Kxj>!s>Z)3@MHTQ(?*v9jENt^`uMuX@K-Dnca&A_Scdjt%)dKK!z=R%A zlTB#r$Nc^vHp55FoZd{D4wrdsmT1iLfj=d5E8tswHzNBmrk``Ns)7KXDPbune){5Tw&2Dy&ArANh|;mQ7Sn0fL5C`KHpd8~KJ>z_N`S(^ z^dYzR7+PT;V2Zc{EYiT7Aqb?==Sas9_b_D9>SZot_f()Sd23pyHQaGKZ$e}Kqv<=~ z4;A%SwqN!O1lIVA&_XsrqL_5MwyVSZ;PXq`;@j^xrSmb7?qNWL+RmP}o=y`)L>QaA zXe70<0mAu48$52?L1lzd9}I7j_=NL6v{8$!h8Psr?l9--^RcSJ;3G_|@@AH8b+ z>@}N(o`*LV$z6>N-lnNOW2qOoxBbwQW?ruA+Y8=1w5H*8dh9^laIafBab3rCKsPy0 z9?E4Sz`c5<9}J1Bs3mkbnhKi=mysym`brWI52YcZ3p>>h7Ix6qQ&Q-BIozp11`JJyOJs3sb5Q>iLCwv}&BBBW#eqYX-yFN;w9w={b`LQ(P zGovHNZBkaf3&8&6KUB_Wb|d?pg?OD1;*0HSza!j?^$Hvh61ufkPf7*`QS{2p)alk- zV>Qj~H^R5;T}kjQ-xg^C==uT;%>(94g}~U(H$~0wAALH-q!CcM48lVfAh4~-Z+i1+ z5!7!6$Cxc%b!(375EpM4Bm?*Fo($htug==Mln-3Pq&05`s4lJTbN;431i`v`?E!>WRy$GyQMvkbT3K|fpsRC{o{CL%;@ z3(Y4YOLZw!CQ<@%+75`{1IURP6l8V85@mJ_kl?<6VFaRXnSA*)3&_PJI5wu8V@qJ* zUUI;3XD^fEkZXBE^eP|Rv?RF@2*vdJ^E+*Q0(anAU?Tq@ZHP55X3JPq-lbl)cv1=% z@dFOh?znk11NA<<=@n$Ny>2xyR2yoI=uNsl(iS9ry?8c% zDpUl5SEJFuzl`cQ#iACi(pSk5-C45ND3||gPsKfOEM|HyLQhjeNKDKhxa%q!*NUiYj5WyaN^UdZ_|x&y+eF-z6B#;nC<^0`vu z2o#PrPRrMVYL5p(*Gj&4^NX-{OT_gT!$;LCLHuayG^@j=m8Oy=hFBq^FGEvI8yFRv zS?64Vm6O8*XxT;^D2ywHOv>?YIX_}KedVKBAfKZ%;T7cAB-p=^KGXg62~s72!(k5S z%b1cv`+lZx{>8=JN&3>tHjWFxe7h8bs?8}?`G4bi{%L2w{)!vj{BoD+&G+d+(#>ah z(5g_pzohFgpcL-schMrw3|t~cu1dQrx&PcMiRWIQH^)aRNvLbz`7255tdb~mx8*$p z>c1`*yBV4SC?G|(LmVu`lU?Wsq5z8%!im)WNK8p%u5dB?$f;``IQr&CDuee$huh9_ zNGzwWWedp7_N{BtrrN!}2dP2f>cECcr<7U@fLK71ga#BnSQK?W<`upT>AMF35+$ia z7^iuHf=R8G<|>G_2_8DUTK~D$XT+NiS=$mh7ObxmkEJsgTm6#MJZ+U`^joR(z$rjC z87-m_j?;g48QdD$Umo7IVf&+X^P^zqoPS=t$GZ`#2fh$n29%Bh0pkf@@wDFRs;atx zt1>|-BlN`H1RhC+6s7wos zVqAz6sr7XUj?MXU@VEQ?kkeOB3=*F@b(vH?8wG5~(>=$%A#04XoByy8^+*YC(1s0R zx7o<1{IJujz$%5oa)4YyP7V1K6Io8EZLU!_Y&HZcb51q!+D0%bBOB(2${S)a`3sD< zHyPN>fSF7!+*%3tN;Fu)C(^~$H1Be6BkJdSul8+9mLN_Yd!^Y(KCe5>5_NH0?AFR- z@5b%BwHs+`h4!ASHe0m~wnaRKDLEA8MLa3q1B=T^$D4I$oacWjC;cw^$-S@A9*f{D z*J+IkY&KCRS()vB*dw4&?pQ!mjDGv zm@OhIYN4)PUZ<4#EK4S3Td}RJ?I!IRU8$*{FNo>x9tw;pjaWI*k)m88^b~KY*%r>5 zSEf#9o!t{>X&Pjg6&?wNX~WesNzUY{v0F;;{P~DA3)|4uXnW7Bf}TO!;3nOSuAapK zZ;b(a7GHDOKTb>huEl~TN!JS8(-+U5U-335P(cv?u~@xZ)fV$T=d%Z<2U99t5GEg_{ZvDl6{e8@ z!$m;h<6q^}e_i=sO+$wbCV7nLPL@ro2h8cG1uF$heH;%(OW~6QKiA6suO9_zQrv;B zLi1BGSZekiuQ2$7DTY@2`}*aKx(%-o6FEH zq0+DK^~i1Rd-@YvWr30q{N|~vX#%m)(Z=seO zpkjQ9dpLJ@Ovw)`vggkDL5q!qkhuu~d}!51@{uzOQ@mx%TsOL*WE z){oiPUN~u}ppDy~S;8v_`RA{co;&mvR-`+ks&9Z#Y>U4@%5mhUMg8-W{Pj~B z&}+sFLTWJLk=SzIT2SOtQTQ;_nIEWPoMmEq?SH=9&iR)jFthh4BF}y;{{JZ}`o~p= zHm71B)G92ppbLhY>Nk7+$bj_7|HIMZKkJKAR_6XGA1x~`{t*YWmx`8wl5`gR^pE~? zIQ92~MV<$Q$xJNdzbi_bhNk6|0BtiOIr$spL zqj=>jPHwW)>KYT1eKGs-r@vZ` z8@BwxY=*>hj4qp-c90{z#^5@HgbvMkj7|RIl>T)#{_wpB(L*k-u7R5|()4i8p!Q~N z@IAa2E5!khxX*+%E3@p3jAG!_3uUhU$I9;C3)W%dY_mN10zRETtqJ8r#^{Lw0tp@P zx+_p_ad|GCL986ZZ}MLr^>4?1_5?1opthUmjCGD8HKzXcn&6BWK&q5w-iC$Eb~#M{ z&witW${CQjcVuM)4w6jS-NJpS`>FQ;ahD4a1-*B`T5IoHyY;C#x92xKpWi?JB@uqW zbYvtFP1#vlrB~jl@$~)qJ*ovF{@}*00M!xwJe*)e7{j@?PH8nL?9{FOj0_bi}aN%mr0Qv4n zpe9wo0Q3zwUw9jmMugSRX)I3;jzDR_7ri`Hub-mV@rB7#Wx^IVJs+FvR_u!XbccY3$*x;e~lmmZ1aSKf)xEpFbqJpbTcil4#_yiMYCYSf4+@DmUaoaPsmp7?ndKp3p|4Zma z!2h-1TBK<7VI89(y=O%sofZ-24^25%Nlg}>Mw0F^dX9wrERD{D!Ox&4c8$coU4#wz zwEC18N{M7VUqgCZgDIG*RS!tbLbnxIUWGF-?T62NJL@UH9R4m!AVI$%M_7)UXC|{4 z)S7NxGaGM7w=hP&fA_BTAoUV!J+S}yahPgwq3VJm$1FA%BfmEKZpISygK9t5?z{ns z6Tj?0^RGt4TpWsd4GLM?A@2h3vSmjd%Qt@Pc{v8>)9~;`8k&R#-8ROz&_DFg3&s0S zM#l+Izg9!8FRnRmKhdFVISVPCV13+ulHfyyofe<=gpQ*OOMHO4S&2%-CasM8z1U7i zkKofDXdg70$T30fDC^u<)7(ZMI*qiWhLtgtE0^s9)P;fUemzi7)hKL~XSo57lnhcWKISNd0La^vpDXJiJxu&Pq^7ej3(FMpZI8N}4)^?8$v_yr#OL?-?2RHaz4o$iFxzRsl;jF5Ms^I{U=(kq!B;r?2FmP zzwW=hdf@x$)D1gsXf5y12=jfq{vMbtg@7>qxiX9YU&!n=YCu4o1JdL8{~ zw$p3_HAm?kibBgdrIOVg%Z?oqiaO(!g?BvCBb-80%`;P=5OE%wY{_-dw$wGp^%W+Y z4&$+XV&OnMEXl$;Z~t`CE&5qs4X z{&8qKE;<9E@U7KenH{D`tP6N#iwBRIPxO>#eH~8hAjU#aMU)V9-W??9sO4gx-l~eI z9=Hz|F?KjO1KIyNG)~n)3klPDXSl;>p9?1iPVU|d=g&v= zc_(nU3wd)j)mH-#qmh>sZs45};4?EVSD`Uzuo$d@6N6+XH$` zu}S513MJ4<12M~##~^PjDvlXNiYpZD2QC^zD(7y5Ba1r~UpH2$l^ zg52U1*msmSr@>wrl?sfP7|6vVsdL++ta{xl7OkI*pfdMrV~&CvmScru8e^9ClUs>{ znhI^W{Yrcf$N;C*6N+(bV;3xr?Wpj+>m56*JG9(2_zEcJ4=&oFm%Ch>7KQds_)ryH z@}VxdfSI;%GY8E?93#g3@iHfr&H|S?8Vc=*u|Wllgu46DPCCc6A-B;qDA|Hyu%jPP zhIg*f$!E%X@oncGuLd>yn=pE%iySoX3LQOt(E>f_9x31^ugs+EAwQWlXx1)*>=H7Q zE6DgZ!RUg^3{Wz*R9fPx^lj0|sPGbY^A8!$=L~F>)i3kYEJ3IY= zjn5LabZKl2Qxu#}lcvn3R#fhNEW?D{TJnFzIpKhgJ@>2cbDktvo5|?}oCIUdT*=O? zi~DjR>G5qy|8MP$M(-fgdqHW^7buz0pf@xKl50IKipx9o@3MfkyuKs8Jw!Zh7D&(V zP5VIBKoysr?X87u;1qKR_oK4Kbh~vELK-ia&fd__(5SN*0ag1h=2n1dg+qp_vb)keIuYH1?ZoiF0USKfA2^G z<*96mtgczfL}A@M-5c#hVjLrnGekFF3#?a?dA$L|64vwHa*oix?1AG3s_4twu%qRT zN}HB97llV^sl(H6w2i&kF22x0f9+bES-c-YSQkCu`7A37kIce({lqLVSL?r>DNU1` zM{ABYFowPZ-O-9bM%~eg_u+5e36ps2OFKy9|L*JX-q|J0Uhy$bd@C8G5nna_HvkaY zl8Qu8g@?P?vN5BO0}OiKWj&mAV6z_E&tyL>L&rIueJqx*IEd46cko2!*vt%CYyX?& zR{WDPNNBU zx#F4mAj(Km57;G2wmzdGB1xXs>78ndsmI8q6rt0JL+xOkN|WX~CNAZ{)p*>OYpdQ6 zKpO)CP8wUFcOVtNS~Ax7P-UABA?0nDKXE&;ZPq@vIZ~jRX-mI9h>BJwnda)-gd~gv zq3IgvAdEH0tlpE9j453EbiuS2#5!uB%b@e*?zX2udAEh%N4Oh3`CW;Rd(z)YciTOQ z=S@N>*)3EaDrlQTS`ZC_xL{JnHdOw;Or>}1}@`K=siHa-L)ySc`b zW^~5J##A5eder@cS4BdeCa_0eUx(v6umqHM)emgjg?h8=L0w3HC2ziLX!QQxYV@|q zf`()0c&^WzH|~ZEX}}7gA2zpQT3mtujq)Up5F5Q1z`Egsx7-@mw-1s!eanCL{W>_X zwsdbg29fPNXbm^cz>M@l#Sl`Z$VUaFY5Shcq^2h43=+`I$uF}gD>u&!XCB?c^D2?^D3FZuxBWxu?io%dDLShKSDd6#u4fj6-7gg;|>n5A=>G@Tn-7@wgR zb{A}RVaqpeBBPZDJBF{4$JJbF9trR*#R~JeUv+nf5Z*40B z_ON!ET`6)oZgccv?Xx#7A_p!!ZYR8hqPswLw)U_b_Q~V!+6RjQG)jG4bW*jGYlu=2 z3`3R<)ge=Xtu^G0o-s^qtK7}YGpk`6r{se27K3*b^q4dU3dE?r+I_ie z0p!iO0^BRz!xN|LL^;&US1kL@a|)V|mG~S@J$mX|#Y(>=MNUF;@_@q^pYVKb+_sX{ zB4Pcun7heGC+j^=vE`W`x{!Fyfv8dwHDfoEYasjIUeK)(YN-)xG%ar8G1& zeXMS$O`em{7H*A4duR1FJJ!b>MdtK6;eOk;7y|K17%0Zhxjjd?hJA6Ou;kSzqciz& zsRG_jAO2yS`Oj)%ySy~HUF-ZU6w}IaGMHZ%Ppc}vW?XP|sRw`iS>$%{RHNdKrIO*~ z*n|W3^D~D3<35fkQ6m7k!`i`#>HH}ahxTChA2g8>wZ%2Y+`mJ zYj_4EcDIAYLi5jkK22ZK>XNY36jl_eV|*Y51x+<(nR95szNODOtUg%nz7$swZ}9$cKkgreUDIp1BTj{zNRsG}F@c5eVCC z%)InVmAc54cR8Y<-vZSGVKQ+d>z2)lJE8;0h;{JDmx*N=Ur49OXK^OnNOC1n-qh!s zFWnop?C=S?zG+;u0TUYDT(hzz>?=&H-S}M7;sra~`=>!TgGITv+b~t5k(7F@agff@2!@v z`Q`yhentkZ?{~Ci9Xr3(zaCWDvHQ6trLYIh7R8^I{W~M)yuqJh2;%MIPYTh*XZS!i z_Uc*>(%KEbU;GTa^%lhO_c}e7^|=p8pj8&2XCEa(#2d=z=)gQjjZqU}i|2g@Quo0c zN4e)C=;hKY92SEIs}d-@UrG^%sSH?COr%;YPFZIM-Bt35r#CG zPQh`|e)U#8Ky)IsG#o0L=L~JrO1Ns4ZLG+B%P3F`rp_!OA@I zuHEu5?qTApCjt6yZp%Tk=f*(PMQbOUN|HlvwKLr6(_IozDXGWGr{p?4S5bz1s7G!y zsNNzJT}oVBD&N)wDc9B#V}9!V&So>wO6Z(I+vqYF4wMD7%TWb$#a*MUGjhfd^yjNA zGz41qGCHmwUJc*|b;DVLgbRodIo6A;&*~r&0R2GW|%L>D?TfA5`z-w5i8yQe3{pYktQ}GEoGkK%>g100UPG= zzpKss-Y4P`65OTSWKY}U+R)%g+5SMZ^N$_Aw3K+AD3tTOWD;%L%W}}Xwxqm2CjJ~M zrel1_ke_F&#+$GcA|?eY4?Q%(Nu2R`rst!aoMe<`l5g+ zJCbt&pvO_md-oe0IUjCRw!muiu~aKGT()Gpz5DYs!}-hf^vfP>T++C`+U*u;(C_cr zPht1*M$91wuwAeFjjQji%G<*6>z+3LV*eCEe0E}D-gYR-q^zI@x4mZo-FlhvZsZJf zuDcKtM1$q{Tpi#Zl-oB5(biU5%Uv^39>t+1gW1HQ;l(KvvMektvF;u1@5OSs<_hce z9Uw8kFwJVS6sNU4U_0j(J4{VVN~*@^QJEHATfE@W9y9>+Os;}@ZLdngUmiWcriiv0*1U|&U5KG(cX z4tnZ{b?j(FaC`zc|BraGiDVw+v0sWVTXM?qw7t9;D$GVK70Ta!PWp09=d#J^pOb&* zCZgvlCpVT;lv@(6rP7S)C(}R7Zpa?6F-dF$_IolZO+*4IDIz7Q&q}#KEc_bDV=w7Z zl^gazW}Qj4(xXX{n5?7$L1lEJDj+KvABr6y_E-?)Lq{ft6{vi`=2~pXkl5!N=D59n zXA|J)sXVKFOhH{0P&7C`+8%hHV6uU!L<=-NU-sM1@nJmmeeu;AO7A=DH|;t<*7{Jt zKN3hi{c5BEYyWA2f+`+W=dqrZ_VDcnQQq|!>A^$sLiNQw3l(&<^!kb)M=*YhV)LV5 z^7*B{Ji}XjI|~jaJ6k)wAX1*kCt0@uK4jvp_o<9?4dEt~#9vcgGg~a8Qwz;`OG-|R zSE5uYBeOt`;raI8<=L|>61dNfQp_d@jO(T{UlQlm>9};Gl4p7Ulc}#mlH(>=6jVqN z9$ZKB_7uwClm`*w#)8iRxW16Gv;N%D;Sa#3l`)9Bl=RUMMmla#PfbnDykr}=C;L`s z6i~7gK*1M5}Lt+D<5x>{imv$bNv zdS{{x3Ia5J@Y0^0NF)7%kWy)UxGOFe{{Zi~Ujg2_}p&f5>S%+Aw}H;aP|R-9_G4+aTX)?@k%0 zy`JK*tc!8B50VY%$|$zy_qQ@6jGi7eYdjR07;0QK!Ehx>sI0ae;_cytYr0&D(S{H8 zSuSS}K1*omQd}jmU1}BFN{}7~0nb{D7s}a;i}upX3i}pQ@d%cJ=B6#)w!ITUA~7M| zEC-*z!rxTX{Nx9G{r!Ut3U%%jFTCB~|K8)p5bCA#Jp$QO5ZaUjg4Dg`AFL>FzrU`Y3m7J2TM!*}5 zE0xe_ZB!77^)5Cy8{5X+Ff!4SlTzzEakhA|sXz|~5e$^ZWcaqxU1a)@*eBPeK1>UA z6cQ4e2Azm>C^xhi6fLt#WIY}vW>iwe0I7l@y6ygcW<`;uOGLz0J|0Q^VEe;M1 zhNJ0=Onq0GkGjD}s%~?|28h3Ucn%d5L<$_zj-RsG zCt`f$^*K~Z_i#-mG4;dc+i_Ji@9ez4NB+?aY>*&$D7!9J94FJo53^@1xkYGQ2nX_|9JjD>i$IMIhmA|Es&O{#rLyHhCCU0-j5(Vw+1bd6-IKGeJTcG& z0fIq3(t`n=jS}s2hZ@MkR^EGGFUb-&*4E3G4g5nV6IIhjSyr%yU)?+;FnPp&*XHQi z6Ic|Nkg{xRoY4~s3r`Jb{#CHNb8#N-e^tU(w&G=T2sP54;&Zmla9V$PY`eK27i*M? zT}*nSOT92x_jn9T0JW$F<>p;Alg_APkH%v{h$;T@0S|NO+DtYYwBDQ zup}Qr=zh@PxwHdoq~Rjyrw@LvygViqY6%6QY?$n+8?YYhmvu!Ac7OcvRP}n(+e;xy z1XH41GrlG}_eiQ_Vv0aUYZ`_G>X*dNWDmNMIFyq+tPS~Ag>UpBV~rNT(krN|NbP_7 z4*P@7At%1YhG|c9Y+cdd&i1p(QqEEE2L4~z0h|>G!QBO9wcs>0-+DaRr;UhE_#={B zODzHtv*ER6bM|u&3PAR+KN;eU<{2=VM(v;-=tlN6z3En46(L7=t9cu198%-kT53-V z@0>8$NJvPKE#2bf+L&g{d-Wy7af__|m7Peh?AZEZ_|AB7R@+Pi-`5+%^MKzO!-aI| zUXr2Zc*811@6#qO!kJdphd+CTukBT5@^cYq(+tMrAMk6sy5mkYPnB2lU94ES7whap%$6d7jPB!{3mQ*FYgpA9~}2F(1;E=&DPn`J=;$-We2 zK8eoH@P1Fa^FQdra=Ax)an`vC5Rvi>x!@7$F>#1eZ7j_e9gCJp$yVe2Qi7gLjFPC} zdmB_dll`!NI7U}oB2Kp5Uvb5>V5w~`wl5_@rF{L+;lokOwS)j>m&_aoTagZpJS|>_ z8$FV~{HV{Ku0Mp&7% zx{(_;GPbTgfyxf0pHrX?n5mF>bJnLgf36M~mkn|LP8m@>JST@Y7ddQ`)Qy?eD5>9%Y#c53ER8ZC_9; zL4=7^Fs`;c1h>Wr-gob37nR!uZiQ+i(jLIfEXlUcgF8?MP1L6=lAs2(Yfz^KJU-xJzwwFJMnL&AO92CH!eCW)t!Hka_Onv z%!9PuuIDwf=KzB8e%YvC0mw}k5+2jM1>?SJqobp3Dt$JzKwI6?$pv=;&?`+VJ@1cO zT3QA}&l*PL4jtoC^fI(9St=lJo5cpoWmv)T%>Tl@NIPdI48vaQ$N}hnRAwfa(Nhom ziZD`%O==Al=m22&Zr~*Jo(72@BQPds;#B|D(%avfIw^#a42N#EI;?uCof*X1mNuRb z<@l1;iL(pZphpGUPx|Rbn5?&HALqB3teb7s9gV6BTX#@gBD|G!#S%umI4XM7>cV;# zk`!HDs%}Slzv8|YAY{F5^UB)#Tt2d>A>8bjA5Te(y2igi7gEpDY* z9i6-LzAh|&ChZSfPcDa(8Fh9bA}^NK)T&cYk&iI)&^kU<89S0z-*9m2sjv2_-!wtI zyQJzZwdP0*FP3gsFvx#kWUu|+(eO9-k&L37kz2E8*Pam4B*V{|FY(noQ?h_y7Eui0 z4}1&s-a{k%dto$)-}TUpU-!+VUz(_WvFqRZbB8N@vaX~rb9v^Qlremc3UUf4+gY_! zkRgse3(TZm!8`5~q#ro$t3cvK{kp;2;blI3j_R#N#l@#-n1f*XPlIc^6#F>HeuL{k z#_WC@*7FlZyqNC zl@IOTloy0sm5kEU*;Ea#GK!*pRcxgd^F@E7C)TYmU8b?=yO;6X2WDR+gTv0Y2S;*g zCYn@ON65NVUE*hTC6h^>)FH>8Yx(qP(CYx7=44DCM;j8($n!*OdHu%s2GF1Q2#6ZX z*Q{Pdi`0fQLgm?tqeBJqrT=N+U){!^Z~uclR^)TPsrnhFGOEuZ5&U}lb&tR}x{oM% zmpt?#ukivy-U9;z$D@3ObBcBw`RS} zYzzu^4uiDPh;K0+|F-Oo^q?N^tLU>+&uj?_$rsE!pDmrI;=kcU>swoU-pbO_K^cK4 z^BB5jr+`;GFn&0{ufiCnr8Qdckv(Yp#FK1g%ObgZ@3i8cNxvG-1Hzb9ClFb-Z3i*G zIR=0DPV*p54!eh)nfcSan}NrWb4J~NC8Z_#HLH3GOj%X+A;HPF@6MHW=2IA%&DvMh zH41mG6iG+!Z}@vjblj7SYoQ$`wI;(4n{0mRK~BSB6}O#l_}eyp`?2>jWJYWy9Gxln zcKJ_gR@bcf)0s&jl$rsZLBY^Wxn3!D7U9f{3}@&A=iTK>*Vy3n$$w{~Le|la2gX&G zyFbigpa4vk8~T#oT#&KZszLoj@uq*%z9hTk1KCgR9)D(rc4e94Q{#S@TQj>^U6Ulo zCNSi9hD<3|7GYb^F#2+3ef{J@gL3?p?b!Y2p@DSJ9Hk0rkI@eZS;WIxf+d*Q*h-Di zPd@&ATS#P%Bv7viBD1v8(ZMk*BRmEtss_Uk(cvF;kh?2i15!qGM+QfTz#>C%6B9im zd*FLdxUp{~(B5eowWmR+BkX9>_Z*Uw#=b!-ZXf5CBNWWSOYMKIQR19mKe^ex&<*!f zs!2>t)D&o9ezd;R_X(3!2-xNV01A$YY?JQ3f_nP$K_x(}sqArfT+NVXT=ncaRY$mu zg#)KD+08QJi{G_2cN95jKgzAGt@T%)_*3ZEv15`q-i7;*Z1pV@b<$Cqab=w}zVxIR z1RWjSG^&1W-REtFl>8WqafN{eS5&S$o3wmm2kxeCf*Q{C>0@spP#j!1Ke4VdnKM}-ROhpu{>B;RkA_F1a81ej8oL@?@7^18J^bo-I?9` zT{taSnIbZ2nPtK2%(gkGmnAE+7!R_Roe6sh=ZNNoJ|S`$Y}=*PDsMu#x6lk6i!5He|YA7Bl`@^!Xk|M3~#ndN1~P9%qEyL5*H zRaY;2LFSu9Xt_!5K6mM-qw(%arM5_uwcXP14ENSG^_><(UNQ1Kxvx=5N~(15Sb~9T z(O+XNuf`e3V;H|i2084d#+(GvXo^wZZab}S3MNmDyEm&7)8Y1SO8%EcI0zv1jn<^N zEOm?DI8_A56qa=@e57Wz>ki7Nesv7F`I*Kh^2w8u%}I-?w%YSDp`j{8C^~M|Z)Yh_ z4+)G=1_IPmK6QsaB#{M)qWR@%-`?_xO+6geXhtWoq>NYj@>~e0yHGK+FJ$C26astF z(Fz9P7hAnHr16PowyroExpLs1u1RgP@i!-bO6A?OBRc(<7`3w{Zx-zdmBGSBgLi*6Qiv6iP ze)|gY$fx=(4a;$=`z(_5fWnJ@YHxy~n-FqyEp6AA&H0Y@_H)M?uqC31Ifx%WrxiRP zczwfW>W#y9XEbN;ez`lhB};Qf{_EppDLj2(U67GI?aboBf_p@2*$upL#l+;vn&+RAzhej5F;jw~ zGoKtk{_|<0j(*X$mX@FRQo!9#3G!=lI!?B}PaOsWR?VwL!ZJ1smJZ+dU(e+Bi5-t4 zSJ0dciAb|V(>w|Up0Sbr^4fvnG;*e|?f3u0vG)Epukzbt{_P`u=~>m0Fk=&VxMpiT zizUal%eeC^t0t!Iz{83yLcYquuWHMu&FY={$L?hG9xfFTSTj{;$v>an!{4_K@4~NsT{N0f3w)TXOQ0Ts1-uiMz+rJ|RTY~A z1(v+sOuWO*0UujkXxApq6bnIA-Z>;kM5wxBEm0Rgp0q6Z+fPwLe8#%0Z#XeGTj)?mka0&FAiHd1jqA)%U@ zouKV{>ES8(R6_#kU zlo;jJ0hNC)X%qDr8+JfUW@*2ooqNxAQlmwJy!;gU?%Q%*v{J2?TgL+bqRwvCWEbO~ zne~4hInrGVFC=eGp26L%De(b#gEDA#5g>*qCcM*2+;yrY_*YN^ph-O&lpwkm@_T1h z&tPI~qm60VgoEMMMBfcmyb3^mTZm>sQp#?n#I9nX#96{NHf<85W?y>QqwJFqt-hcK z-n$zVt)JfhaP0Dvr-4z1?p;laoBFtpEO<5E+U!=d7pDAcfN76$W;vc;c4K8INB%}P zK`mPR1Z#9$+vpM~+$}YG_l;p@z^>ca*3oR8)o~cv=JQLYVDJu18FT{G#Yy|UWD;!p z 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

@ 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 DG%`hx literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag/api/README.assets/image-20250323123011220.png b/LightRAG/lightrag/api/README.assets/image-20250323123011220.png new file mode 100644 index 0000000000000000000000000000000000000000..c05ec62fa7ead9a3d7a0148058f692eb87d8d08b GIT binary patch literal 543237 zcmbrm1ymec+64*(f&~j6++Bmay9IX=+}&M+y9c-65ZoofJ-9Tkp`r1{<@LQY^S?EB zX5L%trdRcN}t8z0X%2siGu}g7gjv3JMBERz^Y<3JMtu3JR_h;Wgw8;s&)H z6ckdumAJTythhL-inD{cm8}^RluTr5I=s5t;oHC$9|t}}CiJKj74gJ%7#YNZFlHj# zP)ZTfP&@?sLUQt&OQII0QJh(Z+qP6=P;J>)NrLycCu1x?cpEgD9uC3EHCBE=JktT5;I*?H0iTd(_(z!dX z{xcR6`d+EC63KzGvl5ZX8!tv`t}n6dL{Ko9W2s+XiR4DzAKrDka-iv~hjeAIU=`^{ z)O)zQqmt}#r7-=(Lma($9G@e(D1KqGs350F&#KuxHyjMzWEoG5XhnXW+PU3GVoFjx z{w|W5O@3M{J+naIiF$;?uS3MlW{HVc znM=dQlw^T%O4!)#4vKOao_s3sAd{}+Vxi#Dc0yepxrZ}eFr8eLkhJp+ z3g|Ue$R;;TIw)O|Cy!F?N0typ3b6N&F}5SVcUG#2Rn7iH%}r??3{9{Lg;Aj@0{`ik zZ~)W=?B(Td>^B!m$ZU3M^h(&G&|avqHyuFxX>9z#a4H;r}th||o<_ff)7 zn*$_7M0QzMVVN+FuDnpi7Rf?`vQQ~aP_5dN$+DM2et36iI0=DBKcV<~p)#P5KfWRi zVmO2CCWQ(OltD*M>b32Cg-=RQ?MqAxD=$h%3vcsXN(H4k#NZ;0$U<-n1Gig8upXD zjIbiGq98|w=!(IWknfd2aC^Rw3JV8RS4ej+g2HFckA6#p%^{hr$f#i^TRM(>0=Ue9 z@|*LH*!svMfmxgH&#-T~R$ui5hocA5l5zAS)QM&w5JXBOC2~kaF-nal$Q9#QiRdPx z?o!W$bV>=CIO5TNj;s6bX&lVvghy=7Y|dtm{qP6^<0itaBa|YeE?j6NF z1q|UGVsCy(Z@1kF_|o~me};O-dVbwa@)DUZ!Ai;V76x$ymaQN|MRrMaic||(MIwxPC>~YgeV86#s8?{Y^NtH{bpkGustbD66p|M<{KR-~xSuv#1 zp%Fe;W{ql{XuWJ*Id@%Ypz2c)r^T&>rgBi3UUsS~T)8eSSw^kSl`3r@wWcVj3|j29 zV&&j@m-%k*9Xux==WEV+&K%Ai&I6kT%iN#G1!Np9@4~4Is|$#}t`+!A&ny~SAvS7S zb6T$be7BHW2&!cI$vkU6*IoT28D4{#pIp+QRH}23$Sk!e=h1#5ux8hO;AW&eow3au z#$94NxtA-X z9IGEaN6)AXk|ztJe`#E~T!~T$7Ja11oK`AQD#9@N?3C?P=Tvk~ftiFjOF3a0BHJ;N zUtVCb?EoL5Pz1j&o)^neEA!1pTKwDFt3I?(1$} z*7xhMGc_=_=o+>JSL;`?S6Nrp==3erEQlRdFBquRsjZbpl`bfOn#lm)Y%lD9cHVYY z&7YbFnkSkajuk*jpoL|(CBGJrI^5;c=77!o6ZCDBCl>E8rbKe%()=?jc zREA^(#TN=uN*ZUs-6C44xz)0buRC9*6>Bq}8CS^KS=%W-zk5$(9xy(n-Lu45hqleQ zZR!L%r$2wcbF>|f`G`sX*845!EiRRz?2O`D>L$vaf zv3_jtdM|a)Nb6kF;CXrLpdwFNtF-z=f2Z9Xpu4JjzQTXxy8xK=oug0TYcj#YAdBGFFEoYKEKwSS}^HZer|4=D68HN-H+s?k)@GWip!(=Y+U*OZOd&>Qh5Fx{j%F;IFp6hgh zB7sU@``gZwu$}1Upx&S(7K_f~04guei}ow!CgGOOI!~7?mW`eoRBF`gp44t4zZPKE zq2>v8gAsb5}Z9)CBbua^+}DZ{hPJolJG^@ezlFyRC-QL1Cf zYTXAYQEVmoSDR~wP_(j8D${M*945Za#F&_4wjg6#izB|zSP{Ler3F!?b5x&j$1|JA>a;X41gl(U`139>_Ul+kg4g2I7}0f!1& zR+aJ$3Q7b@Rzg(W6Z$v@{-cKE^p@McTz^?`{S9;0k!A*{x_?t z6_%x{l0J9(f`|!Fe|HmMBXcY+BbNSvxr@^T#+hG)TU3Oh6#2Vb0ym7L)JOd#xb`7$ zzaj7E&aOAhS+FvJe|Hl>AhZcOt;;py3Ed0(!0OYu;M%y47^3v*@7^!OP$C7Cj*SvM z(l)snq_{XA>_lrQdWI%X&yBqce@Xn^8;4j7{e93Q&hh?@=XDU)?$WhD(4Glh98+1F z3%|Yn1Kba@-y1V^f*zZL{exu42bCSE>>KR}%S)e0&!OnW4P@5Zr>>nkrQaBOLJ#Z( z{djCkKe-zW21F=!D)?K(}QF5?&C4k&T*WTp%Z zAK>E*62uleV~DC9imzqtxFQ~}8-~m?|E}jljGcdm9-$GFMdCj_7_mScscU%uI*y>S zjLQ)!?{jAiez}7^z%PfmKz0 zGie7anl)N|kx?-h{vykiUC+0=3$?2+S#{*#bDPVCW%#|t6ASS?(hfmG0snRXb?>T6 zuZQ39d8$+q|44HaBAVf;sS}HaJenSN;jF93IclMG0dBuelYYhul%rp4yHbn3T zlBsT+2CSnwJ~xux5KP&}w`6bZ4Dbs-{r#xO|MqqmH?hjiae6R%?qm_CQZWrZz9+9X z1~cX0YrIX>BYN{7zf?j`-rCgXS7!}AcI)kaoBnqG&6a-0*V<##`;l&h_lbW$^E*)` zSR~qVWmxXqHa#qdHndFWh3Dll4HL)LR()qddp9)2J)WlJWYhT+^4R6>V1RSdBwabQ z!ZNIUJly57Y{!`Vx4#<-5laXrF|=9K&ak6}S^Dt*K3KHP+OphwWtJ1MjI;fw;P_mil?gx`a6d^2L#a*M<$CPcGMp= zfIUmQb@#c%PLt58@9tI>zcC6*l~x4UNSmkQY1?)84*PV`-Wq_JLza;sF@f(>l82Ho z$q)`@t{b61nCIh@Zx@#X(d=?_zH^nodw@fpHt?)2*+ZaXLN9J;5s>co_j3SgkR!}F zf?3g>H(;k6&@F0KB~&)iJodpG;_e;-hqx&Z;2UtP*44Ypp1iz8oO1h?Wi!H1gY^2{ zb$5rg>&xbXxLq(}J^lf0z~f-lOxVQV2QMNpLa@d-!`}Dz;OGJKhb6N&4vQs>Z7pkh z@$*vvG&jnQfZ^>IZcSmM^QxDGXE8ltBVml{KgT4=AZ;^rAMD#{=kK@a1TdzONILGEdPKRE@$#xVzxLRaUl*)$xv<4b>pSi;L50P?@qZYDCL zbnr=-;PH9B1-rGuMw%HYwZDzd%ZrBu3f@MIG=qG{uIN*V!3C-CQeyC9r`_Q4y~$0( zc=v#(uOEDV;@>Y-ay&t0h1$`|ltvC&1}$TFlQj>i1JqtBBv$DH!&5dl3!rC9@r#Bq zUFT;haHQn%yJ)npSNF?q9mn8Qu92dqhr38cXP-C1S!*XuMRBG#mz4yi$HIn29kFJ= zvKyQ^IrG_Lx~l_VHWREn$r{pO57l-CMoD@Qyo$L1@xNuBP7DOBVc@5b69av_?Ba>@QJMB=bC02 zm?arI_J~Cq)iwL%`dvKb(P2=%VEW=o^%#$+yH(53)rxWX!`*Pk_;0y23bgQa)gq31 z3rIDMP@2MQSM_?O3rs3pCw~G8=Swp3DH~YZ2V;{s*vB6gT9#R!Zy->e9AoMu?4UlccRNN%ntd-r8t38Db`gnIXwfn!yLq<)#3a zwa5(ibUsgI0|_kDFQU2im`?3A!bci~94kp1oZT;hEzPXrsis&+s@C{56DFFAVkrH@ zn|>NW+^h^&5DEH02HYMByE)V zQ(5vp-TN8+S&z2O@hxkACMVuOF&*H#vmu};mSG3rrJ^$^)mL#ubC;WejH<$pxj{P(HXG+59?G7Ej{+v`E&U|bqGS7NEtW`V&6Ys zId*r*0-b`BA&JU;DWQ|A9ALN34otEQs2fN+Xf|RrnGOH@SvraxI(>;V?iC`?0`N3y zoJ^=Dhu>z9#s$C`89F*x+?b+%>as!gn}rf z<4k`IZXV>s_C2^f*uD3Np;h%DWJxbkRPgo?BX)U)I36QI=QrWbt*D-A!7F;4rgGbYA&}&uLc^ zJQ}gDsH&=J4-z)LYrZ9(cE<0FybvRB>9#lMRRg!}66-#A(dgwq4A*d};z497I#i!{ zy*)2JueK#`j;dt{Bg=@`v;joxlN@sz;W;1*+o9Ux(!r#wvjP%O<<%uv0l_a|Ym;!> zua@&YwLvT^*c8#)=!gDWEF?ih0JgD}$K`arOISIJ3p63*cdsz(CrQd!xGLk;F>w@c zwgky>wTxW+@sN7RKccH2Y>WY3iBr99h8Xb{V#GMEjx zYh*lqvuRKTSJaVG>%7i|t|-qSt$is0UeMNP=wMo!q`Jf9U{cHH`uL7+pkJi_cQh^) zbl7|i(0t{h#m^eCzKR1!j%rPOwTI;a^Ohn;L{L&^_cs7&`(VQ4+zDLAzhsu4T(e{c zsk7ax*JE~BEivr^riA6vqeL4c$uu_$A0mz9Wn{`=C@_DcT0tQaqQL0r=ya4SX1Pl* z)))lLT*_h@D=_U@dL`7_-7rK?OoHko1>S@xx$~Ni+}W&csJpy00SZ&6nT6a> zn&9ULi0Oua3O>5JE7c<-BQK>#ZIO*JPXELC^JU%+kB_TnW@geeAjeYxhZAKUL?kcJ z+bsWC@Mx1@Z*%l1^O}7PT+3B?Vh3ES5CQ|lV2DdJ4re^iIJWD&nR!_LdebSaFglf* z)%O;1a-(|ptxhviN~a>Fmywnf$8DJh}mK!*QQ?HM7(j0mY2G*~Q1{ zedd4=pz+NZ8@&G^|BfqguKY)<(@t)+Vb?vCr78J;71e^0#7HS9#LY|zzXrAz3v3A} z{W(A6+-=dJiT!73$^Auld;jyU-ybOB!g|506U7@gY+F z$N2@`KcQj%H_S7n&n0pCqhU{Yt=*4Qn||wEV#W@F0Tu_Ai3pn~#NlWp3m>8}$0?Fn z0RJV$k+Q(jtC#(}Ua_eKH3z&rlawlCk{25PGNvl9MfL%;gJ_Cq@R`?WIp)Vq)@p!=DB>Z$WRwXmw-ngYbn(^c4ph;Fx)xO1RtW2KIINE2x@?ZuvD+K~!`|S^CA0W=J z)on5qhg+#t>yJon{=fW1WbJ8H@gJ)K5K|G?W=3c9Qd0nej zi3(ETXTPCa%8b7k%xB7)_&`yV@b2&MfXKj6q_e_&>0$iY=n4xp~Dacv=PeW@T2i zm_KcqFN5(-vR~U%Q!{PF?KaRm;K;OTvv-i(jZy!2ng)`^1>M9!H5JyGNc3c6t`+kA z{YfNG8ctH^Whw=o^akx5pZ?Ry5=2Db4u4@c8_lmV=y)!ssSE3c*vf8tRJ#;pvRHDQ z4&ZXYcPpm24Pz`cGO2rBf*^QQZaRv1^)z>W>40=g9-lV=_`OhR62Hb1&PDypwsn>A zK&Ah6UvCjq6!hQbn*Gz~L_Uy{78+w<_B0;SG(G-YD0D^8KVl>Qws%I{Wcl)XzQCA5 zqek5dvl>r6C?g|y+vKX)R5>d%vt$&4%WQGKFaIZfjN%VcMR~{ZtLP?8O5qEKRjrUV zLU0k)t%x`Q-7?61`2^Fn#jm)^gFcw12|mf0u`R~xVTG&5IiZ#3)4^m;t!A|@*jI<` zfAAgJ6Igb3_PGLa{DCJ{FW-N%L={Sehy*;|{{CU36%J7*Q`2qo^GEEjlFjppQKvP4 zv4{waa&5?L;C^jND{lHD<_ouzu0k)h|2q6lJdC9#n?>&V3XKjmWfH7Ro?&}wN*p%l z1QcnDhue8Of>9-;HLa2IdmIV8V?bH#471oLfU>Q7oO?%HeNJ|Bp8tJ0@<2b=yZ^2i z$-xB0#Pm^Zv3kY)Yv{iamyC^5&Tq;5$Oihuo--M;kwX!PYDv79mTPN&v~4HV(LVz^ zOa-O{Q`S3r?`@uI7ntk7<;nnZ7`_z2CGnAK>k>Od-NgVw@hIjl&Wa2!S>_Yz|xg>~u zAl>Zhg$I}WsLtnBg-Cw7(>Ecb3S2}pl=iQ!6>HypTgUiJ&?zA>At3V~7Tkx;j|}7D z@*(@+)|f^T<^R0QTr<7^Y=2j%;Y>l>Op{#C$YI${Dtt%-`sH9-n(aJVEgCZYKcwP; zRFSke?V1GE%|$^aS5oOUfcP9xp#NbzeMD0;BD$LJ!JU8Br66)?k;37qGZ(kPIC76S`i@%^fs2Wq zU%&BrwCyMU)7byFOwn6M4P|FL5QS}HQQKFN(_~A#@(yrJtwrr; zFi4vkVRDZc^~C4-hwzMInGU~F%=mPyKN`2O`8|Y%R-;1Q3h#g6K}wAL{9;N$fPm&d zFjS$4NNC=$hbf2!Nq+wwGB0#z-0`9YnUQ^@Ht`FJA$hJjG38(302UHViCcwA!4EiZ zw!+F(w`I5K`6#9`X1}hs+vqjDaKZ6?8rn4I$BS>!kFUY5S4XdK0de(n@>En*;LDir z^nd-lzfKPXCqqgabBX{1gS?rUS;aVojq-CZa+}>ztp;4`1{6U9rQTG3j#-oP?qN^WKi6(P%JN)PRs-^^I=7R2=HT0Vv$}arl=Z_j~C^b5Ym~^J>b1<+@GQ z_=|W0YhI9a4ICmFDsOW+sE8%tu9(PbDGLo%t#AjeR2X)7S3q!3g~zF3h4p;J01;e# zEfm5gjLB0sNTu8Nu0I4G?POMMxF)$X^FunjCg~q^HIKwL@!oUD5ts-&a4n$}j)(l~ z=;m9;*lly3_r(Z}^1`>#mAJ63?A$tK!DK$&l9LVVwD$X6F0i_bL^1Qq;n`N7_4V;` zg+YgVh4Da?M z`Pg@yql6FgEL~OYZbx6AA2t@%FZU;6QM_wW2)HbvkImI;)k@>!u;UoeO&PK$L~0s`{mDFqS~JN#Xzz5s~M)K9xaBNC!EJ23T)t^$C})jtQX| zuthO)jiJZLJ9r5qkX2!P<%0`Z=yFczS)!6AIi%rTi4o-Gy@PdPMB*jK6mHwrYdZPZ zu45l86cZcnjvZDat-rHWCtUG8Q-P&!|N2-Xl3?vwjNp z%J%o>1_LW=%hH(S&5I8j8#RDmv+OmKX_VuJ9VWANsL~Qqq^@DF;0Aw=DvjD>2C=v{ z(ndFH9xvP1DEQhHK^9rg&KE%bUkRi0d8(3!0%eV5&yX+Nj&(a%7}LHZg-qp+hX5n@ zHh7GUtLWr~)4^jJ3~$E9!0*n2{eBgM$7JAz94|LW8_Aw)x$UKDRlMV@IPhMzB+_fL z-f<2}@VeZOWhP*lMzme}_MxPtqymC1G7}ymm}3LbIjoY53l%A5p#Q%KJ4989%Rqpv z;O4U+N|2-TdEp&qe=J_N{byzV7eJ;hhb2XjvR-M7eAbhz)^AfKqd&jc8;ceEg% zyo84li$=s(rdexPgbrIzSqd3Ph07FCK6;nVTUVQdY?rw9<9c}%8^ox{&1?w3R-OH- zsMYhtrK9)-YbN;lVyu==*VO|&$?s4OdD_6}GacI<1Z!5BPkg}!ds3;os}C8UklqUt zl`k!fip?Fgd>}Oz?%`r7&u8oO4+49_4%D;0F;6c!X2Y{Ni=DiMbj_M^VY*$-lnRFX@#?1y}4uRwEr`|N+ z;`W_w(|S$?3<7B7_+2lz8**C<1E2}Q);ezHj7BSC@we6! zZ_E(hMSSUmP^{*ks?*1h#&iTD>{_HN*J(B5&VJb@enG|=C@|L^?xU!_liCcnis z)0pySxm-O^x4Qh^9w5-<{IY=Old8boT_d-DIax&guX*_++XQu@508$ruaP-ELBfA- zaj=5(X>q~p{OeAf3;I>}R1 zi-9HIIM)eja=SM8_AzK-9_6PkSEjhgPpMxO`L!@=4v-X^`a`_Yz-9ljAlGvnv3l`- z8Wz-fFHbz3b$%00@>k%!_>Fl+(Mijh1T=IbpEwOA&j=V3EVHd~-?G?$aMg9=D`?KevvJz4AMTY_kTL-W)S4aBt{5b*La z3#{olQLi(UWb?VUo!#JP&gDnQ+LMR$9%v1@_)l;ymPcaJ+;eu=;=SA*yp%}AKO6ep zAF}$vp$H}a7r-G$4sELqQEgBKT)U);-oAZoc7o~n76cmw7t|O2J_jI_#%!Q_dXs`G zP*YV!aqpM1)hK=GK^X11m1*%@bPWPH#BC?ZPioQRgz{e!tzGrJ#7-xE^yf})wq4dY z@Bv{#T|=`ttskyI)g}EM zc1oqUwWbaWWT{@1u1QN9MUJ{Y^Ohy{a!5JyJk{1}ZZ8)Y)_nyzVJ>xSHS{H7OyKyh zxIF6t2InQZ0jz7~xI@8@{A}+pzlqHiU+gjTU!DH=>GA86+u5e5M!Rd~Hy7$Ue`R96 zlr0I^gC5!F9fp|y7p_A3?hfG1?+T4PAPAxbXloN>D*nS6NzY*&;`Lkj}D0=Cd++$Tt!g z;SASOA)FFvJ8wdh8BNMMZv?ih+P@ak^+Po^E2Gi!t&~t$<)~}E*Gq1guSWj-g^FWw zdmCsL?Z3Ntkn1BQc-AW}r5=NRqbzjinHX&ujs9Zf%k~32)0@g88f=_ylAS6|?4{0R z*s0z1bgjn*Cgi=S6zQ1~deHB>2QqYPS$pztA;n)#^{9-1-gJUQ!FQJjm9t7m73)5y zYpsP^@UdEWAe%)8b?GbFF5rAc1--`hi}rGtMXhePajI@&yKc`lCZz3}j-IMbbm_IF zz)<%~FLY|Nb&hU>eNlx@*B9%g8I}189l@_;>m+<)Piz5od?mAyK;RgBD0sQuE&RuA zWF)paNSE`+N)i4y(X4jsYTb4L#f=$q@g~c(sxRDjwsC^G8~NA4AMrSF{|frgF>gUF zR(#fCmY46#xKC!(s&%p5ejpB2PUi6c+R)ni02h2eqXZ+F+6&PRDjcvgtT8n3vpN7|pVi7FR=*1f*bth6B?jufv1WO=Dn&;FRl z@6alr=38<2AhTB4;tf%W%^c z>@rS~o9LF*3b~k{H<@@{#@nG)S!GLhOE>>z_#Er7Q>|3VdbPFgJ}S*s!vLA28rLaN zs3utdafl?qxRA%lW336J^!rF$ywE*Q;S|JRW%A5zJcVf8!?hjuA0^n>$mLI$8-_dx zm(HoK!HX0-Q4z=d+GOk}D^1c}g1hfioB3SXYqf4>=LQb)@Gp@Xt_1gmZhy&h9>s^% z2o=ps5PcvMU2_AtRp=z&){L(-c;tCsu5C?zISv|2XDPMsIFw^rS8Sg6v$e;YaZbh zZbu7QaIUB88W6(tw8ZokebN@0kD^Pt`*zzVJp-@sA&HclIaFCE(Qsy^>1aNIjN}Np zlOhjxwaF&^9oMmopGBM6yp9Dpl1|k!@paz-0ZfGPYQ3?+B~P8|EATOp?M`VwSISSl zl)m6;5`_OSXD}u-F-wR!lb!({CEamnOe4P}7ZY(vtXyt5XxDsrIBhU_iv`#ysDZ8; z-RcXUU`h=~(JS)4IVpG{a&Dg=CI5GpDMAS&9`0X!0~Yhn$a3iBO|nt23wXY)24-61 z&U+~6mQY;!7or<97Z*dao8ilKrU~jzMP-fpl;BMjU1>>4`B5#2>4^XuF#-~u)o=n@ zaoLTFkYiIpfl*I`LgO|vbL-EDD2FaE7pKV}2d3=G;jkEKP`aVF4!onMR@dW2G}3gT zyx7dcRAFkEJC2w!B^`labxm|Hp51ncb1|h!?+~*z&}3ybUE`p2%$Rb@$|=3DsgHkn zs99d;NK-!5P5A?lH9F>t$==Icy!pq&*!8~nTW^nXF2ZP zkJUT*Ig=O90j*YoF(=XNhkHE|e&cQWREBcQl_qs?GBD!={i^$R1>U*<=VtH=I`8dB zKsT@o5yn`8T58vnQXd4KIU=c`o9)Y!&opTe@?y~nYqFk}7`L9?uLhP|7?pDt_$y z91E;&Sx3XfMV_~KrpH`ZIrho}=89Usk<0&a%JBWsU)UcsZ1=+n|169h zIyrEkbIolrXOiehI-WRZaVtvU#gqw~S ziX}L0Boit9V|i=0%NwkIv+B~qwl#VAayujpGEaMjAmVT}6(D2+V`J#KHDEng_5$aL z!{XAc*{pv3K{l?!pc#!1(tH~qL)NyYb(crv+$K@|@ng^Tr(;q7jQ(0C;I4EZbe0D? zCd+!qw1QTtJ~mjQ;ZkFM23x^&TW2|V`!lw6*@~GYhd+m=rlU*e;{^lrGy^%7@bywr zcLB)h!fLMU12CM#U;UPJwZ$P1ad{mg*SUe37R&nkC1!=}zC1LWbFZ?>aN4bK07Xgf z2O(Ugtov?X@4b*%(N15B%_8$X5WEg--HCG>Z~y4_5~iwX*P&2VgfvI{rDY8^z9|G%mT9Cf76A z`vKGv^911=PAe)hii#ST)CwvVkXC6k7CCHz(>y=k6^uQxMr6It7WwR!kL9}cjPr!v zd4>k_a0k~;tc*r&a$WcP(&po*gO61!&8YryIZExU{@Ykh!g}BQM&O>*r)HI%zARR6 z6c6;1WLzh1Jm$A&&#YTDAlFk1q|1WEYCR+<2ifH1=4hVHi0dTBZa{!qM@AXCSc0++ zc%xbgjzF2Isjl1RmGVm`OzO&Ki)+Vq{;%S_c@W^kiv8C%)jJue9yntE+u9n8^DOJ9 zdz5?k#o75zFXZfIPMZb#2)YOG*xke~N4*FPRUlL$2ZY|59>^TcS60?^-?RID=r%D9 zf-QX88-}0fyNybpkd#za)4ENrQLaj*^#VTPw%(X>+YC%##mws)ORt^tNtnLTGV5k7f(nU=b@wCikB9 zOkEh2WO{MASHPZf&Hy?2l`_JZ#`KgvSr&1w3nP;IyV%|0EsR z8$4 z=Z8}i*MMII@bi!*$oaw8tT_m=`aHclz$d+#KhO#7EhG`rz4e)(iHkwaz-@jW*oP*p zf@|RVsZPN87mgs}>qv>?STRPs8A-l}yYE9b>HchcX2uuJ(SBy4>owm1Xg%(ABY2{1 zw?vnZXNinpeITB+f_{T766aEez@{sb#< z*1Pcoc0fLjao%Ayy3ZGb7q{SyOyT)g5!%H3I|Nz#(p*6wDQv8rKA+ye%lWIr_t`ZO zC&*jOgEl|&gM@21B}qCZN(poUf(+vRH&6U z#}RW+XP&iee62twQkqG8@4|fH_O1c>@Q^>26yHlsEV$dUx!ro{TM*7@*tI(3$say0 z6o{H>!rVIWETXDv(1oTVe0J>!>334kKrYvBb2b+`%_tL3XbE_Mo>ecA!zK!%pwV47 z_oK<6@Mb|McL(Y2|B%!F_T@{v+yP7|EXa1QlDqFC#`%ITD^8)VACIJ0W|_N`7<>Y z)uCU)jClY&E|?;f*+8o2)W-YZW4Bv5wLX~q zX@S#Osa{?c=8>K?#p2*_*8X&z<+_{A?aCUiqJEBu>FYJ97WveFE?5x^K$vFn{><2P(2AT)M+(C^omQJNKBDiUx*`o(iijbRU#8p(Ot2= z#DCpg=Wo%9T9KiS-gJ9Z?J`$0{t7r)EX*tI=G}w?9AkP8p2CTAQ}2)iYjinl%&%98 zTZ4l@))$l5qb%EO{UfcfOq$qvH$ot^k5)oViZ3O#Jna}6PDixMu7pxUw}pafxwPlf zRbp?nWUO+wvPA`DR7>mfrbI$2SM9^&0926(e5* z()^*TgfnWsg5)&#QNvG}R*!DK!e`SVy z<^UfPd76E*@iJ_cE9CdJ{p^QJ&VLBx&#*Hynwg(HZ=@fkk#&yd%1w}31KWy=xB7%R z!=t*sLce<5ib^211yPL;H^ko0=Zn75$P=>Q0nyRX0h<=Z5@U&ql%XGnAh|dZ1CxUF z;OcPJZF9UvD3@aymbvGV-9WHVa)2BE!#Q{njpME)-O#uLdx%|$S_GCbWhbKq#Z30w z@`$pG?M=g&yRa6orf6NInryjNkISMy}CuSs!*l1_nc2`K-;MK{#smMstsxWO}_h{ECLd@qle*yLC~nBAShumgDkLO+gb z+C5Hd;QCrZm%BbgfRI9-faM`Og>S$onFyt`O_LW@{P6el%YMpQ7GPdMTb-q!zQ4|2 z@bdiq+ROd@I{1aw5qg!xW5TNSz$0`-hb?Lk?%jf_@3`l#Rf<7&fY}_&@7NYyed4727nCR?(YxED8);Kz}q7=Hk4 zoN$?)=6&ju`V}3tNZ_(qQ)>N5!ANb;VMfcyZ`P^jZvSZh@ebK7bU!;fdpbhqEriSk zSp%AzFn;+z-)Y5>YVnDS_zhsEmvPyx_VkoIeS2PenAa+D-HpF9cHYb3_n3PivatCc z=Oc{%V;`bX@^>o>oCn;CoowCP%NA_JDupnMRE5w6JF^`_wAd^28@=XeIu`A3GRWaL zna)L0DB$%UB10CChEM8X>z^Z`5LRB+?dLN@nd|uX*;e*ZVDv!VS2V& zZOv1pv_uF7rKG4U8~C2zHPd~IxnYIfeCs4dc)kib1BZnB67YN{WAZu#;%O@S*}g+@ zuAs}*Q;T=Zh9ZsE$;v0cZijTygNPr`GubSEHem?k)`icuII#E$6ir}3db_3{k^tGr z$epz<;UwKgUEqZWUG3ZkEyMyAA)^G+bxGKJ5`R34(1k(EC+MQens$YaE~e#rdY7%X zn})aB;15O4g|Tw*5yj^M6c^5rpM_W;bg^AOAgE2%vu}GYJAIPUJDs+Du^KYw{AP$N zJr3x0?qd~on(bc!c1u}Q0MmH17ZBJkcmxN3#;Wz3UJR*DYM`S75REtC32s~zv{-zn zQpVEgtBI9PPM3^~ZW`X@7twIj=eficnHd{U(4Od1>7dyEoINLM{T0G0>H_CyxL23r zf+g`|-PNvZc21Q^+uwWM1Bu*3_J#vk6gSo_P6<1Mx5y&u=qLY_?YGChps3z+qHnKH z7U-XUu2WHtqXsC~0&9Ma+GJBMj#WKs{MJ_dH4HhOClB#9=4j(Z0gjAqJ?oZnfH&`} zV%9D`nvkC37PQb%!Wq%n|20hf<5_w191)0yGd{5KR-4Q_{ugnFNBBu_NLOIFyqnd( zehVNeVSg&GR9hVwOk=6Uw6w1^J^l$4B2p;^#V(VF4zL5XQ#t(c z!N!3RWCs3sd;33b0rmv8{r#`tQQ3n8AdtTT&wG|i7-6YH^5i|%9hecBA3l}>8xz+OjOv{)3vAU)xcq38L=T7+vhSp?prXc zu|z9+D@3Ll|Loc0&r8sRXR+NMNqvtty3S!WLs=^uozxNTHxkBcB_56nns=EJJo0`+ z$n$dwTn0eT$#*Kc-w!>nRdZ2N1t4ekIA%ufM`KzJwIJtY*v+xZK5aY&phiR4-b9!9 zP7%GD?|D8C^D1FA^!Ji(5aAp_*4lG8p01lcvAsKjik?*SE+Rj7`d}$7()Z zvWmk6YcgfwxfI5|b{oqdo9nG)aaDQ~9UyQQ_-s*jklSvw)%x_d|2t$2tBrek;A8?h zxWEH-;V-RKaVSBTlSijf`_TXmAIw6g&b$4G?jQW;291`H@7Q-SDdaG-a>Nw`>{nqo zHdM~UB{U*-pKnca*O)fOX1`9n!NfFyEYA=K`G&5$D$O3@y``r9j3&X|_u0?BFu2g3 z#OnkohB(4Irl>YK^y|*EA4hzAwvMJrMgcj6 z+yfiaLs=BJqw}Vc`Iv?tr=6Dt6!pPSSNmD;K*1b(wpyWlSM_Hs?MB4zJ^QHrX!!m?tg|F6&3{3CS`NGhM$~ zCjcUhbPA!jD`nqS_5tjr8;`j+e3hkdz$ALU7Mh zcp=q2f3L`*PGddoE~|JwU@}CqvEZBDXgNLioy}wr(pt4B23q0$&IRe;$XeW5%KJAB zSPnKQj!3)*!=Ly6(Dl_(QMT*eiZs&QNK1EzG)PE;bVx{d zhjfEMHwe<*E#2J=FmyKzHN^LL_C9AF-?P8}fVG%;^1iR@R~L!>4duS5tq%QH3OxT# zxZT}5f~Ut*d>4vX!ks&h)3zJP>a_LeprA*6ae_f3gTB>kqygE zC9A{4iJQto@&>47`ZtWbyl^QJq$P;G)i3Nb!3e1(=M?w8o)8ZRw47_2JWV!^o7l*% zWt(?xv)T6HTFPo^Og*8<{uSQaGSOPK{6moAv53#R{A2L1B~3JZ4Cw!nPt(n*&L$bgs^4M_%ZqQVFqStefUPRpMZU4gwcT#W8+VUpK896klxnLy zUK1_{H8QgAvN=9eyWw9p}D7!y3z<2D~5(1JFA{eDudEFV>nK^uCFTLsm5L9!(P?ap3g2?6Zu-1*=Z9HODhxbL3&kZj zEuJpxo7a{_%-i*V(NMNn!w+r6MYpU_SKRrIL#FWn4^LOolhKiNRnh07X#)b`Ui{e&ddmAQOGt zCpjPiI}#`xPWF1zvP6?v9q5>@9vBrQO;W4}zQ!qHTHDN**F{7gK~lIrS6i(L$piH+NH;Kp0+(#znd)CtBr ziD07mGl9o53HKK;lFha&%^^?GOBSm^9wO%{*zp*04{bLhPQJeaJ_FJ*R6$A6&}8EM zDAxA5td|;Hxp(j}ZH}AfT53V?oiCAXWRB2*1#+1OE>TTwT7j5Sd)PYHd{mk1qfabV zR~7Xc@ag&OKQzo934tu9@;rcF?*O=Umq7JyC%{6oOK7^r`FVfJEcPq$_$Bnzzcfhg zf&Z+_qf)ZV;*WA|nof&-(xY0mlrOnmliPWe_@ctSQ}f# z_Oc}z5@3=D-F6+;;I5~-*BiQyZnN^&41K@S!96lQe&%qo`2PNZq3GNmrQI$TS#VD@v^ep z@67%Ek1MRKyeuV%h@H@Rg|+gj;bo|L;ipsTmQrN$q?lG)RQ@obj$&B?+r^SjtTVP^ zm|<_e2p`v~Wz?aQ32B3`E3#5Wgk7ML1#kLbdV0VZK9(@SJ9ie4cR&#wYVJ(ch9xRQah5h-2t(H=g4Q>g+Prztw&utQLGJKkIcKuk#A zlFVhJiasSfU&t&SGwR=8A5)prJ>PB`8wZ+n6b|f7G}m?fb~#$8x~G=eqNfPgc3uy` z7q}!F?m{}&N%>*Q$Ic}Y6*j&>-GiROoF?@#q!9i4vmL#zqsJUsFC81YdJWJ~BJzn-Ih$;Mo*cLXeq6VX? zR$2}#(S%k9!tl0d>N3a3We>?e0)!~Qh+I}P6PWQv6Z$RJe1RL}{^{Ahzd#vH0O42; zSGtmM|A&;v5E3VdhMim@_aEW@#;*cyug8ZFqAI;S(Uhn!rc)-zg=RUWPx56|~cst!BkI2Hm{Io^+lq zo;WRXJzNe{(DMyJH#oSr*pY;S5))Z(d}-JWBkk}nTUu&(oNXSlECTFsU2 zb4k3r-!Cu}fNT$|#mH9JELNkHcwXZ1eUne)mUldwLW23-8|8ehF(%s4K_%TAGNa8K zoJc7k&egraKtDDz!et^WICTP$_JlQ!n#q)LyLW-2uuzOKdE_>_lZn%a$iA7MGQ6Z3 z9zSE}&dZB7J-e;1IuTCUAw0G^0)ZPdGa4MxgU6PAQ(tzM@hT-MnTi1T@!n*Yq%(Kn z@xr*foy~-^R!mR8wc!q~Gy09DiY;WmpjKy)NY-|d^g zdT@QL47go*ma(FBTaW&Hzkq5+0)1t-R)*ndsSY%o9v@G&<;J~LwP8lrt(YmK2XthW}- zu6fZnT_?%`@#qKD%V83+ix{~T60!5Is6R#<2|8@^C#=u1@i03Y&C{*hvxk<2t!JG} z{1L6L>u!oC-`5RhqM%`1iDVx5jf;YhOz0Yii!{;-dG9y1<}Gx(lJP4VhV;GncJmbByZ{tyKnQPLf7^eoV@kEU>r^V|6B zQq$3;39$72-sKl*IR8?3+k+kF?&GZXdpD94fOd1(|DooSq@%!$T)&%;K(|($TNEG& zdM4G&jR}n!B=@_;>@Nf4yGl)b_(ztVhPpp!#ASvwvgk(NCH0<;g* zRtc5hByOe@@W`)^(?>h`Mx_wDg*^vI(ffk^27$zlHs8P{ARTB$a7?9a^T1bIH6uL?sC}^c*`mjcJI(we?^c#;GI|7d?LzR#$CHr^lb%8JjY+ z#P-j~;jvlXIErd}~?OBVExxW7oNGQXvLi>h%W znvuR+bkW5&{=@mjUwa!xfDhFd#Gh_UH5LuAQ#znzAk^=WtFyvloP@oK>mAo^)^qCt zVvqUg5GD?*Hb$iK+xB^V_k1c^Jl&P%{?96FS+#7;)S zGluO9X_d;l&Z=};x5+2{*la)JUEQ^QdYB-~XQH^uM9kR2Af{B4SbKQ9$pN2-Co`%P zVFIbbN7vSqc+nC^fQHfy?qzFRN4=9-stfNoi;VZdFv0W0ymn4PENxffG73!6k~zYM zr6OagZxp(%Uz>0vHXgTClzkO|QoiT{V7Hw6 z@u`S=9EV6exBt$d`7xxSMtr6Jh6Yl!Pv)N!>k}PJ4T18{f||Y$dbb%TnpC8)TBL@cm4W;B zbN$jE#v*-E_Z0Vf!rddw@>ED_(UC%Id{ za{to}(_Xko3|uOXs_+O$7a-{%`lE9C_wTt`aTBMSX(Q?U{N9~dB-3^lO`ovOK+fZ| zff>z58G@$gb8vcJg$soTL`O~lXN;KXAUg%w_dKR1z(x#&mMlEUmEym4}BZ`qDan}PLj?Bl*63@K}^aMS#4XX*< zbVNe_3&teE2B+Ge{68@#IvYj zuHjag=qUA;puhk59yhn zTBF-4QS0}`w9?f4)mSn!!&Q(TuRbr??(kakrO76+;S&!p)pb&~#>e+*R-{w*L}0j4 zdft3+Y7Lafc)ygprSh|HZ!g@O-0c*&oROGHD%vfh_((Qay&Q7wVIrU*;4V zca_PvpXV0KhffL+R%wMb3v}XFRuLqz=M;Q0I`vF0>s$sEf7&vU%&cfq-#5RdblL=V zg(LRjtMX=!T1X>UVaKmmI(lNGUQrug3JD9Zl;Wxk9M3d4%d{NCS4qQiREoOiVdh%u z#=mwfHSAhR)@iWIHy?F6?d^1rTa61q)Kv|Fhxo?*bTYen!m&$P%oh9Zf-=%JnTd_{ z9(u2odX-k8AMFwQC=xcY+U)A^1wj;({eF#;Ou><3RHW$JH_WB^&^X>V?~A}0WoP`8 zfHLZR>`Rlw>>0^Z$Q_NYWekKwAU>x2>%hy$i7=^wucjIJxrV$VKX6jkmFt;!6S&r2IA>tr{j%*tLxBINS#s`iKlZWdDY`;tUmF8K! z@TXzcj>3Yhr)9iOLRu9t`28Q zc`Qx06b=32!aF!}%Fz+6gX6R!-a+Uc&WE&#I;|EiFk`EiVrP0_wVr%InBp7RU$ES%%5`e&9@8OkA2i* zjh3QCXS9Bbr(KolaH-7eu~U?LYVG~7q@?XjW$kF}nC?*Nrgq&pFH?tNg9^1)39N#< zf3|0>T>wa%d{l7Z=o#x?tzWk}WXfNZZJNSs&ewf)&0Cy4({(GsSjc%Y=`Y+I5=1y0|)eW%J!NfFTwirn}^{c0TW6npx*@%b}_r;Ez7|cA>r4QRlgVG)V3if`aAMfwjyNl7hfv!xw z=zG(E!JK)AIR$KD_$s4TC~PkVK@>)VVp^h($5Iz2jsz2Y6$_>Aum{G8bSl^&3URUb zdLybrp4}vtTjHVBuT9q_a&J(q2p|uYxEw$h-JyzZ8dr^TQIX)pAl56VX|6w#J# z9+L7rP}%l=(j=k61DV`t{= zBwW_BKQ)MDlTss=tM!YDJDZq{h1`fa$KyZ)+YalJJ<|E@-}LJl%Iwxnf8+)+2<7He zVA|LExj`=;?an(^@QR`bhQAY8I-bijvm{v=8NAI&pAMDn4j1qV1UOpP;;98p9Nr>j z-Gq7fjCd}mVVk#rZ`Mg;rnlc!y^L{Ajk`8nJ9scw0*PfLeSb%z&5K(`?*-HCO>WOHzL1{U-JF3)erqw#ko;6&++n&&>>Au6-9sCG7EjNq$N_xuk@e$@OQ6|Kd2h|oHrpI(bsQentqU*3WP(6&L()t8ioq( zk)#bxzU@RH$4F{)KB{<4=2Os4_4t1J2IwT2*}V(D8TAss^xm7uiA^Th00E4w2H@pq zo5GPQ9;KoWHRqX!Svz_a#}#UrmNoi1p{C`#zbt!-Vc-gg))fdYBh?@-_v&E0dktA{ z9zfI~3#TBAvXPe1mU#bw;@v4SEc*diK(N^HQr%z_kZaPHEeztBQCOA6%ehP#2p@?L$*}p2!z=5rwwix3M z+<=QpJOmk-6FS;Lv32opop#3zb4Bj2h&ex0i!`}_6txZ%M{h-n6PZwu0@(*VEp9IK zoribcGUPkHN~rhB(5ZC^8Mc`GJ|W6Nv_HUufs6lXsa{zBad-9x)l@R!4z$8s#E?lZ zcs`az{(3Xx$J0Obv2gOgy@&6MHA<3^&`B0fQyWv;Wx41*L1<(`g;>~($>GUU2$YE% zi4+gRG1{jSITP(ulRE*j!MDr;URQDDvSr!`xhS#ZqLV^OB27O9PFtUPbr5F?KCn`y zimR`ni<0aJ;b!?b|MF^0?;=WW04nR?FPrE5n67u$qvL@Zd+BwzVB_X3c zUYhjLvV6%Jn7vTswHWEfy~6=hOcJI3K8q~U-krO4s5()WAhDu;%n`OXoJp_F1+I?q z^2>o1qs6n(<5_#lA-j^{_Ko+7_zUvq`Pjcl>AyV?BV zw}1kQtoI&_A=dvv@GptwR>C_cr|Q+qyIDjQz|F*-#Dek?jZQIj3o)|e)mcer#k%&nw9(Z9@%49zw-OFjQv zv*>oIN!7=Yv%B!zDzjlc{9HH`yn_-R@dim3?!BRkj;8}|+z5g4xlRqi?-;R9>tW>I ziU<3n34eCv72HO8u2*_qnunD5UVN91eHfylx0^4wP0qfpn|~@PZ`vUuMH*xlB4t|> znx6r%2!~mfst%@ZqPTDCwQ2$cV(h`?x(z4F;Vw}#V&J}-Z2PiiJ((lVKV@?}Jmj#r zW7*HQd`IB}x_{@S|^Z}+h>u64%1t+}#PIM-2p!5!bHe0N+WFENFO z-@?2lI^0w;RS`Une(cda=%9b{&15f^@y277qY>M;heC4UHB0yK)Wu1(+M1tFBZ0c6 z1y4Um98RsmMt`Q!Y*;htgP$f0&%uQ=GPueihQY69_yLt@W*(p2{TdQ7pyMZVFZKTV zSp9{xZbd&JE==Q) z?7rM#W~0k;ke3#k|4#8fmfN#;7GEF7r-2UY8hi6fHA8^E6PZG(kF=x`e?Q4V$gjvi z*u546G~2C+TYX5wV{$PIc;4X|N2z6s|Wva^z;6JPd2p z37)k0{N@}#&7$}^ftcS9V43;NaI6x_O6`jLn}y0o)EjN0{-see zSLnft*m;AMyEtD?>i6vnTTcgeMccJgQEIEpKF2*cTmy(hVSu|>*-wrByWys%g#`oz z>Ii79TEM!cBGcZc4><*cNeHjq>{`#^sRA?D)-AYQ_GG-k7FDYqphCOGb@<&q;LQ;r z^>uGtMX)M-MO!~Xxe@Ru@&Fmgmq`X(VYz@WH^1H%^vmzb(_|U363lKsf_^W4qoD+@ zt>proIHy+oQ|aI)z;t;47^~IHhRM=Uyfb=ns{(-rUIYdjc-rxtNfpa#5{Bj2#BN{| zXNyyztzEC#>Nc{wd#W#^o}~@jyDE0s!h(Xn+=`=*dg8M6R5E~KuO59xf9-1mZ~ttB0`V`!kQXTX1rQ||W` zZ6BzURmX)cZ5Gaj?)OXu7{=q;!}zRbo_&tb3C{DM2dK~mwczS(LA0gNhr7$!8*tpD z$|vz>2Sn!qo`cOq~yiFMS$w;P842wH^(jo&NQ20_h*8-+W5m2| zU%;*}57cMVz$cKB&*;{kp;LU}u?OVJk;5~^8qUnhqnOeyM7|7=L%OC?z7vYcBS3_u z->%vj5t_~3Uv-7Z=N$~u+&2?o_TB|!FUfI_12XWp*hN~B zlYlKj&G-IlW?X-3@5tkL@$K89a{ZX1*XK>lv?7-ys|Q!pEzS2EoOn=4jBFYC!#TJp zwc~Mb65X$SLQ5nxRiv2ibcfF9{>6A$sY!FYcy`5L#kP94z#!8$8KHDHqcox>v-)WR z0u;iJVH!{`Ge^dd$xE<+aZir$TFawD-Is%Z?;c0)?{ufeY{8s$Ni<$iNXR zV&EJd*HJMn7<`+DxoF^3$Ec)4)K+FP!WWZzrxI@>vHytt>}h^yMz?shx?*?jW`CLj zJu>4+QJ@7=bN(3N>`=+DI<~zQ&Xq=ibf)$q*L>*8iC}|d*~b_@xt6t6c#K{=ZJ!o5 z5hpfvp%vDLF;oO@RJ5lanoL%kg_kiZR~UWm2UH6p>^4x~HJU-9bAd=Z&!ur&=S~DD z$^0GC@|7R}h)qegkHkRTobT}WcLn=WLEg1Z@O}(8MHf6`BlXMVS02yYZG4U5wl^W> zdb0fSR8XGTuw5^PTvQ320nI;3k;&c6-rfgYa6b>bF6Ya+^os{T^-&CfisjmLfs0#z z-d>Aem6n2@6)LqJuideefy{|!pp{poXs3!Hg_iF4h6<{NmWr{F_G(P5tME!M(oL+X z)9X1-IaI$cOXz&|x6v)ow9z+p@{@)9Vvx_m61hTszC(pW>2<)sMz@_*+*TjpIZU~z z@V=R*R5Ama8bBPr-aO6nDS?ppsUXX*`2K327?W4yCB_QvhB6`8s{|y@KGp5nrCOEM zO;0Ww=JMbN;PJMSS3sgkaYZ|_zaGFtS5#pg$9U}LC+#b>dafE-_zuMv9pr@d@f~iQ zW77}UtFs7_EzXfVt=#MqsMxvMmRXJO*bOt$jDi!(Kr^TfvFhEYgg*_E&qA%;wZ+@* zuQ+$K7bc*kYBQos#dAa8=g3>zsX#-=$tjz<4=5`tSPbUg7Tp$3$Gpi^8dmvr+_%CGt2_voK2Lx6$3x%;Yd)5qzccC_7DczTzYDCx%=0m+)BKPhc0+ERyU;ns8b!l~Yf%Na)8@#S2 z3o_^d=d0rbMrWBJ`904jtkpOWBjXg2du*G(9`;3zgztA(Sr!zqvCnSwil%^5xu51} zAFlzuSY0OJz#)&_@~2X)ZVvXI_4=UgEi_WJ`3wxw3?pss9zki6c??P)K_0fBWLU^n;BskPjRJU?zg(L1aTv`{~B)J@;1bGcjfCLdxcr|Ge; z>M2)D<#O3zHEb96Z}6V~7={1^7M8}saf%_X7E{}&hf_T$h*3W2=^!1&+@GQRaPC-A zYevf;1?w_h*>6$E2vvtEr3H(@WE)?YGwJxKTCYp1{6W~(JxABDcoD|_96v~%^OF)vVA1ewSwQxCIfO6lrg?BG??dvnnDi_RIANK@I zcsb`lKT3LS{2l@1i1nscVZ-kubjcFg;*FDLkC#Y`EyR!Zp}-a_V%723mA*5UVMvB? zPV!ehOR)`G-g<#dRU99%Ub(jPYxE63&>LuZdgjdnh!lwZV3 z=k>6sMu6ISBWjaFQz4qO&wYn7-O}3ZqvX{ZkJf9JqVV|lUL4_uQ@)gFI;k&BG6?!@ zv}#h8v?~=+p`WV*CkX6Li(81;9jisVQi6JK8;m;94}N@DCPnd^)U99cPjDX^PL5mKTeT&SO z2l2Cd$a@>Rc3nt?rpQMp%6zAxtA^~W{N%L?Gh1=9uas)q-?4MRL|!_4ZN zx8=_@tm3FLB$q9KleC}AH+T_O{22U<$ctl`d@DUeowgs#r_CDrsv|2YRN%d_)LopY zR*^7KFjH;+Fxx>uQ^4O~A%z*N(e@4CLYX+NGbE@=&-i8+hE*i{FpzMQ(5R zGcaYYM|;eG`!_>qkzQ=zN%KG^Y`0APSa#%O8`JRKsG#+<{lo%h9(K;lctvL!0Jb2U z_xYs^+EV~=UtfbZ-tHxxN65L#Zj8|pS;MTXS){sngfdx7Y614`1~Yu>(3TI^1Gv$= zvXxS{$zO`zy6BM=yVcsU)oXxV#vLAit*K)>@o@A8-6fjava;nK*i1*CFjoC<*KJJ2 zv_z_@{Ow!Wg*ADu8p=%-@23c_2I;bh9j&K-#l+l_-uoWE`u~ddS;0=o&D3fQqFM0879I+!|bM+%C8WvHR`NpU9Nxg*`;5i zuqwDDWC?q@IB&%F1RWZ;*tg#)`40<^AnCMu#nex54t``E!p5?Q)516K$n1iINjwHT zECtb8=GW4H{|0Kn+bK%1#w*6I#UMbd+uueNED`j}FrPa=O^X@UfD(<4-k<1bd)sbq z;*_2)o#YA&@Xz^RKDn>LCuPs!fxEDr5SSG*+w3ATB#oX3pZzMzEnTAJ&^ZNS7iz+q z?+cRDS7Xm8s7anTLS+Oqqy~n6GD?i+e)^Ok62^U(rg0ppq1eijNN}4mD=N!n(WDv` zo%Z=9CkYcZd851pWTh`*%#F>i0uHo238XqLXpoWlIC#J#i;@9>A#SBDKbeEviWqA}Ekp*9O1A>?U5ri(Sz>)}ya#9Cna zaI%mt1v0JrX9Di>``LJ3TK+NqB0uU|r4w-dr&7lZBUS?nZ7|3Vvt)eY!KC5o}g00ImA1P|6Va25hQ(7Vz zg}s~vp=)Est*oHg{jm6YI>WnOx3mC1#JcH&vmjrwp>(dCOdIL>!kA29l0jNd@!sL< zZ}p8n%si~+C6#I~zT7r7B`63u?>=V}@lItx1$%oIXm{cLRmRM<)%EP?{&$+zODtKI zmxx`VsL%>$jPZUZI+9Ev@JpW5_e!Olt(4+*?spn_@l#H)Z^JvWqlG*<)5mhh!?0xR z4ZOw>6#SBJR5FK~yi-tHO-9X97bJ6qJk_VLRuXqTd1RlY+Gv-ZDPxhV=oy_q0IVvaVt$PT*JQv0Rg-V^nMwyn5B zv{o6A5p&keFlko~gpbll*e;P!uR7J(tlYn2)_#=pefE`Y42?}i!Zw&B#e9S@{c(j=MFc`Xr@+@J83N@NuP}{#8vw;}d1Iw^ zG#U*^Y(`IYzTtGyE3~vfy%h*RTYde`ax%AQf8zeUpN1vp^X?d_UQiJ`hSAlYOvWy* zxPf*+Xfja0&9-NltO{+UEx_Sl@oJ9b3k5aens|apJwJIrl3qFs4xE$wx*#xb>HiYk zN=#)#OzU{Ku%?O~8!Y-H*yivwQNP2b%_9j|A)d1Z|i30zLaApL-Ci#W1Nl(y@ zKzHMi=yR!Cuk_tiyYGN=iv=$KYwPK{YF?LyCpBM8K$cu3 zaq}|+anhPspfSvEk}tFemL$7SnjA&Oo@O;xlSadZ5ITvHVu4Yq1r! zogIWW1@0ESvo+C%fwgPimku%XbTARh3EquNtD(-_#G)mSWC`5J%?fV(&gw+RU(OV@ z{6?R$be6oqZT zK18A8X2CQL!Sj}KI?(K=WuT7sWaqfOy3#kKLqrUN=bH{HpHdufvDejJP99|@o3V+c z6R-)!Azs3}>^nvC4v?V4d{N2}$HhWU1QM&X$xju0Nj0T=WPlLs6To6OrEPt^!mkK} za4o2|uBGaJN;-dc0uv?YzT#Ggc`Z(0-9lVJXj6d)B4<>jR;}q{IhgA7Rq!HqrMu2* zcK&tGG8>(|a7v+DYgXv*uEY;2HfwZVVJ#2t-I&=gbUQe6v%T{DI5~U9{}^wI>v!IG z3C+sCw{mn*e!V&P>gLVgYZPMQ7eon@d?0Cvz1_s*CoBQeVosc5JkZi z9$Pf^esc0V5tvTfERo&4{SgDFT!~7HsO!p?CVblG!C$7_b~8c4B!*o)wo9Lad#lkf zX_%^>AX*;vc#E1k!%7*k>WB08%0M_oK0mdjFJ)K#<(HeMC>8cfp0{@oKT|`5FeAURQjx;jFwih^V>!ZBLUj zw{Fg#j1Y}f@W*Fw&yAz1{Kh5s{0IxJ4#Z~s&|baV8HJ851|ROYVxaq9O_IbWb=~2bpZcYm5^;#?gP2xX4-UCaVy2xfcA%+8#6g&6W@6l^9 zj5V>t@3GlSXH>o}AqVLm1nw9U8Aw{zQd(0Q_k-5WfM0FaC`D6G(9M;BB7m)tHzQAl zc4?au-tl)aFmjMj(CWi{c}5JxJorxE^z{|rY3pjU&s%5x7uTPEji3h{ZE0N2EVhJN z*tL|ZSh%iy*HXwtu0uLZ^Yc@TS!yX*q7nSW1p}{~s$P!$%|ctK{cd-jstbJY9w5+W zKpgVeBNp7+@)Vo;`etAVU7eJf+Abfeu|@%3o~5?(aI~4@ZnIVGJ`);P=2p3xb$#ky z+=7P#a-WM!dsa2ta0T1n>pvEUOq=8rK;H#3i`(=(dk!;Dja{Fl4IWm~+RYymFsa2$ z5Cepr?^SlyR|hD_9)ItmHqF{dR^_w9-@Mh=cMq^eT#iHWytUjbRR_lnU`@d9QRZ3D zuV8PI-zfLvEL(+t3hhvT@M37ksj25CALxUm{L>CfpB^q*h4-MwkFi%ZPqf@~d!wz& zfJ&zS|0`MA~{%2cM9 zzro#)>i>oz!PI)tx-33OS7?*uyNQ7WWYb(@>Va7 zZzKFHG(!X@7l^Bgub1TzFwy-C`KAKhcz=!(s#G8ueXQN$wNP_j;l~RO+H2zbS@_=&ySN@Mn#gswM2t0)v)>;r?$BF-aY({Ith5D@{Lr=End!SO zvn151ZMoaK^Wj$;UH3P*T6%c^%VOoa9`Y)B!gJuOwE{t@!_M~h8y)qqP89m-Kj2ue zwA;HBw~Yw>S->!l!@j2j1Ple^UISVtS=T*>#uA^4lQ1O~#60gC5fFj>nO#FghI^X( z8XBE~*3l(Y)1n`G)_y4J*@yPf+ppe3C2Wx5mDr$E4fH>}yBfgJbY zPNJD6moC)z)%hNDfSc!z6LLBfG_%SKi(5VW`8ztyzj-;_DF`+*RBGdRc!3_r2J4&& zKYpy;lhIO&65M?83mz}*B{@)Km6Tc;SFO}vR7j)`^j`Ha1VyI6{`^b#{;m&`fY0Ge zDxYKE{dySO0oY%w2xL#5>A0&+L>Jt71>_4lwzmL2cHINug1u#GL+hhCZ5Pa|34A&1 z4)*OQ&R;GEbsZp(5tuQF0BgR?l1Bg(2&uks8XoZ8*ncRGYVf?1Yu`o%+kXxl^qWk) zwW0t$JRtsXuqc|HKVc>KUc#k|24KgK?!HQm*PkkKGKmhy+PwJ^U#NcDz8oXYHt^&B zl#!j+?+*lhU+qPRm^TEWS^bpJXL6)D9~bpM+{Y|w?m9{UENzEHcu9xo=XXouvTB@< zxi;inmX-A^TwO zzumUT{U20-95RCsg8Y+agZQ~iKJCE12$`)sN3OChB=^mP+|U=;6)h_9FR zn{$07v%Qru$PBi}K7{b#=b~XTe9OF+L`4TRgwO=-AN}q7gx|EnHFC6#fq~+H$x+94 z9ZT)#SQ&r@xHf)&_n`;1de+n{wT^{9QDF78_&Aa>Jp(!d%NHKNM!A6p#l7)3?+Fq? z0;>VJoh1kX=EtAZg){RuRtqW}!ggBpbtzYK;8GJ}AgUcbMnx_FeIz~5SVBg9h{LCuhY-h@0V?l<<{qob z>wr4_%E0a$g^riV3p}m|x(9&sFHlR@y}StU*dlMK#DObw8fX{_iXRxfw=`97D*>7QJ_#NTaHzlxYZlqWhclkO2=@ zgDv%jNhf6MPHu*S=6BDw3=6+5+;AkLh-CR-vG4WZ!^*UwC^*mo|O=+sF z^AAF&!N43?@YTqVUR>4w_neuwKi!Y*GKF6oylV>N`TnpW7YC(Q%1-4$6#tvnG5hx7 zHO}?nJouCEawC4NSQuIPG`&>|qZ7a0$10PM%*lN&xR{hiK&4Dz`t=w@{>$RrD%U^e zD*A&xz2(}PbabN(I!D|Sv)t5M)?uJwos(woV7YMV0BnA?i%nAB&N+l(+W9*-_}Y;k z?sl^(pT10j?n_dw_fcyaydSmWuBX$|Z8vUoQ`s;dOx`Lz_{j^te$p1jM52nljnYfR z6+6#9?QfR8lu+=2uC8dr91V4`|4hQTe7c(cQ10B*-45*kOwjx=X+Xe$o$85G6;BoIXWXQ%?7r z59a^(P>cVn#OcWba$&orY*|-TI0WZ_wEh|4n`mXA01pm?+sIu8;P!lr^aEw}TBn*v zAVp-lMq58mQ=iK0TZ1K%QxUq?Pt zN%(WG10^+!^vngO+0795?7gDy=pfHPSyAY*r%n?l_GTWCFoHkZ1|=+yLS+=IvGC6; zyACD4XV$GRH0}=wt&?y(!QpFir{W)?87%qTsN zaD@FsI`;2hzna4exCwR9(ED94I`-wVG3{%XCjZnd)h;S~5oVDUWHtfh{Qg?}$R_xo z|6f@M29@aOM6&h~%Q9@y5BO%wYX)u7c3@1`43PMi3ka7;g)bj{47mW6U4HU{#IKJv zzy6ev9Pn&OERPyd)eRmd^rncMxL%#%(RpGo;HwILi@nm@3W#E)ufP1@SoOb8-`9Fg>aFSj`6Q=v!zXd>jLgYlVbzohr zyYrkb)GSK{vWEP09Q5W}BL10D`R^;E44{AZV1pHhZiqSFC2;aWl;cviaSJ&l2*0h4 zfT0p2r$CRT@@KZs{Sy?<>gnOm>So1VOW5m5S%!S2hy***_h2oIT;B#JpPrs2F??Z+ z+3jmqaFo%4f!CwoA!3dH$GK+U1+>x@eJ|apU=IVxMw$;m4Tce%{2pf%+)i6&w>+~#PfM$sn;lC=+fES2>>TxVQ5|Fx{q!wf0MF45UWvM*2xk`NN+S7}8 zzt@MPurMrvG9PhQkG0hy`%i9LO{N@~%h3S(ZbnvC#l^+NjE4V*vApT6ro6Ae_w-wc zyBU*LakjC{wc`zuYc$Hy^~-c-oqV5!JpZnCffp-ait5EW_rF#j=-$sR2AEO=eD}}& zA>h-3ApQ00=G)`^a}bOX?C(VrY zSh^fXd=n_J8BJD|>p=V;&OF{41_vkUaCrO&00GKk1ssDeabWx2usf16FUd~@B-`|1 zV6d|%;^0_}m?@TE=VbGhv4jo2hU?vTS4^h*=fMxC!^q*_y!xmDV;W(~8q-1fgs}Ax z-1m}Z^wU(rJ79yKrOO&o0R(L7fUP)&{Txm0bi-lu6p-Z|Z2kB!MGI~zk&Yo6q-FVw zn)`V3vBIM(F`+ErP+WCL@=jJMHFiC6Dn;JyD&cKf4Erx^DY2C#M{E) zj@+Es2){86Nb#+<$wGC`(t&A=6Mv*Tl8`%2SeyL+90pz;AE^j6EG0>-+e4!>9&;zb z`U3;jDobdtyj&i&jAy?@j#z_0IPULfoy5?PUj{~M!vFZsgNrL1&_W-08O z-0!#-Csg%!4+D8D(eqTUN1mVld2{IPVT~&5g3D)W8}i@Mv%GmF{SVal-*a06E@UVe zOJ>?p5=0w?O#l5U^ecw!&pF6M2zoJcYRS z)ae@x9Xu70UkXTZP=K)s>hI}}`M+np9sB~WcY90xlIuS_0AFB--~*11WF6%e2l$=; zd#X^1+>6`~cV=1xs{NXajGQ0hEi@Ql9iG=jzIzWbGO#2loKdjAG{Rd3P5;$#{A*ms zyU!T1yY?@A1X*GPzx4n6ivHs=2Vh|g3>IkzE=0foZ+XO5CYY(tAR50)25*JgHud31 z$ah!SUum7N4&b#X%)_4R$Ar#;jO&8FdiNzmO7pLO;i7*Y&g^(ZWo5nh*`5Ude9-=N z4D>7k>FMd=Z!4o(SU3OYxMAgg<6(D4es*)KKTvzbsFTrz7@_yfaHPIC!C&TW^micl zl!kCc~5sZ}zc;tn`}%^#Wy17#`Hmzi=IB^Swf6TD;h&#HAK<;7EmWh| zRbVmS6D0fdB$32MK@Ddif@P{0f`)pvxD{FJ(m@Qe66V#Oz3bu^fFpw+dF6ite}VdQ zB%HA3E(lbMLSP_}W(JqvzA7~w0cya1Ov@ijn@R}P=z8NPF>zbl?db@Wv(%sSPOJ=; z+H}7OACf{9OpQWA`?G++5y~0O8-S z6j=c{P*8c8p9qZ4B)k0x_MZcmgbau6Ev|uqyjvR_92`@s9h8S6LerYgUy)lg7sFfo zG)z@nuZ{by3g?ehIk@YTYCR9ci$HCv5CIo69%xRZqi`O(*} zov?yn{`0A1yChx*m|*=+zL+RK?rYapfaU;`D|k0t!ux=n1NY<)inq8L1S-iOPVE%z zsE`?IqI)`Y(nJV_0%v^;n27zv-p_d%LvG+icv+=X_Ri)V=_=>KeYiyk16t3qymebK~F0Ccb-$6=zD4yoBm4ze0&o0u;5@sh&;_Z%9IS!*NlH0HE|E& zu<0X!zlP9bp0Vs!r1Es$dpt)D;dEn$osQv2N7hB)!hLPXs)f{#LKsdIJc7AeXKng#b0j0zpSTRMLgNfxp%;4o@yfG{x@*kA7p@k|2Ga3 zK~j);*kus!9m0Y(yrs+<#VK}URV`=<9 z@1ha`WS>>a#DiIrv$EbfIWd>XCp&4_+0j3%F@b!v)YEtw83Jue{U-4vAvLw+_yj!) zv$(oig@Ev2T$d=qSda6)_&?q*E*^n-OJ0}-y;DWVu!d&mnoNCWEvRM@BpTCEXYL~Nc>Oj;QxL4WhLOozx1q-^)+HIi%Y;E8#@9KSPd(Z zUKUJ>=N@#vto>LLUV!oW+5Bm3b#67U+(XPiErA&w>~u6D;$>dUnENP~fWYwd2|%+x zQRu^SS~vM`!gs;T$!@p(0Gnrw%;cL5j1)Y;c3LbPIyWokvW zS7Hk`=sv45Pi0^_K}VbL4##;K7~=@uF>nqKgLBf zRqoycrtrFh5?TUPE;r?nYF=V1e#SSsjBAMfU~&_1kIU#W<>3B* z9bLb6{-00mzmAQ4#Hn^41elzqq3Q39t#B}r&VXSn_IozM|KqQN`x39~HR&zjF{%U$ zFyAjD3UTdhSGCG+s%26izv4C$Z-QgT@MySEGSy8e$5L19FlQpbglP!OlTF&Q%FJ@> z=~=1rvAO_@!PEceLxIW|u5l2>_eu=D&T)-FDB4?g7UA9qd#i@RrHA6L(`kql7Nf5l z>&zPP-k0?E+bFf`7Rj3E^+4>ucw7~6 zpybNTG@Ez9I(?@xwUT>^5*DT%v&F~&^uvqG zbQ>ZhR}+5u-BhA*MAh()To`jbx?E&EDva}l!BTpegL&~5EiF-a`1VU}Qh;;slb&SM z2-@VTcn^&uzu`F5SgO@utNXXd&L3YU-GifHWoKg2z$Tn0&o*DfNK^Q0i%oAH&o?{P z(OLq1ft2)wtf0S^c7hBHyt`4j2WX-z#;jDKR@kpqc&5&?Rys=L6wyy5P$m0_7L~Xh`SoqT{+lq=uLb_swSRu-V(1cP%RsvOH8bB4sHj5lsJV8I zLFSd2XgV;^9LoHRnN;MTJD4sNW=C(j-Jvv6m9fAs#fxNB&Apd0R>9?mM~u$GtB3L` zZB|njreeH|B__Gi52DtWI)pe@N%NZT2Os^*y?^^a;7ck4xUEddWy0&`t-pSsAOS;? zESZH8QJrMy>)Vk~&&ADCK|lG|z$a0_PPdl^u8O~z_9@A3+&%Dc#!o6*^N6Li>5Rg~ zAKt2^~>2klY`*_e}s;M_;C5Ea;H9$vQg$@V*U^? zWtE-omJ(j?z1$As(jH8hI{d{Y=%0WiN*>ihj2FprqW%ldZvdh+&S z&p@+gXgvo3b1CRl8vI-GO-&TWm8$}^U{r>DU(3CO>babd*$0#e$LIXoFQ?wXM%EMC;C0dLF zoPH$X*AsxUAs4HeUi-*zQ8xLBNUSER4AW!? znM*0FEV5_qe@fW@%kmVBLl~cXaAze}{Lgbu5HGC6PAZF4xlb0Gf%e_r9xKq0B$yka z|I3h&V2dtB@sqed-g)`9litQ{k=?i^g@9Qjtbwm+{-Lx=o2g75Yf!yI2I^UHI>oFG+vkJ)j>*jUc&SPBYk#T$fDBh0 zc!(!EcD${^9MOVFAGmO}mQ$qJBONhpV6?bQWMUJ-@AF;HIidf0^8dx96ZNF-@~u90 zD)P+!;{Yp?$}Q9-nC@>(Y~kbJ7(>tki1sB#kzbb*ee;jIH%>3ReQ9%TYk$Xj#VxHu zhJP9m5a%UWdYbl^IsIR53WEy5*7M+^;bbG>KbGW>04z$Z(JHoj$$j9CtG|6w4t)0^ z0mAHGH!h@yot`KySA7w>b0AL3sysZx5cdErLg*VbE2bwAL+iJ(r67V2wUOPU$fbQ6W5}< zWA}ELK4-}ll|w-RWMC#gn;868FZ8z+HS`D;CFWb8tHkXJ2z^qvolU;}c?qg1R9Stt zv!>}ydLjF_HwrC=R(&P8vl4uG8qjQY=zk$T58jUmZV!De`d19LEhZ`{tH$%<#fuV| z4{7Ls?QlalH7)O5hvh*oI2MgkY*QO+9#xf0-S2|GT$}$Kso#Gi%12EFXTqniGd7f; ztDWZXD|*@h6cvCAhoWB&)v61~HcfLuUN7I(mLyAnoO}L%X8LNRR5P+(FWivAqlL{bVQ2{KWR+F(>npm%G>W0}{OCt!>Pqd4nOHAc6 z5m)SduwjK3BWcENg4>0O(}1PY@K|zag~FrKuEi?MeiTdan`laShZ#|t9l}Aodm*IS zIPhmE({j+VEC1L#gU4QzC|#>aK3PqO9VfPg{llnA8G-ySyB5}_CXwf84F$T@*n!p$R@ z(w?vU*hUfMH(d3BOwBd8+hMj?U=X`}R~#^OMqP6d#T6xd^0&s3UMQdgSJ zRO%D(4-c33zG64W8md30VG7aS`>bVn*1m^LT4EB{4^*u`Uu_z$pookg@q4+H77X(g zV6a{wfM!9iDPzMbgZ4u72x=98B+I`By6{ojFyi#hLg%v*kt&c9A`*G=tsZ*J(r3sRAA-xoq~pp z)Pi0SnTo-(VPqiRvzarnVYFza7j`rHJ6_$G)#rME#$~kS@H;(EJbYwT%o|4xevAN< z2R{JtNlMId{B=6TFAMyyd)*Aizo)0CUI-oR_|r*I%X5H{d9z@y7OIBb3|bmr0tQFQ zH-#x|H}AAH(U(2eqD{!JfxM|Ez}+a-^s#|He&%qp$xTvC%c36*I6AS@?bo!$(DaLz|%J!XijVv@nLfYYl3in`ztEdlt zD%%9)qi69ib&z0_LV0WMsSRz+;^rQ$O-CR$&p;# z495R(Zl>^DkLP;oyVPbM@p*}NH3)ASASb2`fJz0o&`ZTaHqz-6G@EQ7HJMYRhCyKo z^q@804YqLyh=4nP*CQff^(VD!o}g#=@LJo`PQh99W%Y|^ZPN~wZu1mS>#HZKZTLyV zMCN1iKr9FO>s@E_4L1d9k__BWREC0L)FF$TC#|_kaqaeEYbrO&z0FH-mcH0|OXz7J zmeean5ri`&1l#y__>N5!=Fda_ZznvR3NwPdgaF}TxQYrH$NPsZhRVt@i6_j@%J{$6 zt^+OZjKoEc>Fa7ICiRlY4GB4HO(L#fC_0CrVIk*bG|xf+2}%|ryPl;aPD1wbF%V`| zySsib)srPa`R*rb8ps`Sm?oWR){Oh`gQ;hywwX5{eHUK@?0lZ(1qvV>iYHUotn_1&V1dQqs z&}HZ?y=NCXVd#Z0x$nu=&W%Nh8j#67COG_f94SR}zRBKx=u=f^b~%tAC9UfPZEmJhv;#)ix@esBP=$ES{iuFgIUlb{xIdcVE=8sCXlgt~~Ax)K**6E-%;SD*eeT zqlr6kCHXQ}!#uoT@r*L~jdB%Zes^YfQCFJ|U=HNiQGgw~A3?__vUU2rVds#JlD<80 z0KW=ALfsys!XEuZi~U6Dpax>YPrVz!<-P@EYaNt_)YE~<4VHE%Uq5*M!&Xw=j$ zmINmEF#Rbkq&zNHLkk$d+!3N8-L++VS@R%@agnhe^jimJ$lij`HxAoha%gp9Sc`Yy z;B)zl1rrmxV_+QkttKSkwxwSmR&BdV?ZE~E=_JLf5iXwJY^1+76*e*~k%7EcYH}qp zNCo89qdc--(i6JgqD7nXh&-uVc`#q?1LRq-AOII^1igYXN*U+HHRtS(@9F$&WnluN z%?JZ2guF_D2g2w=0>HLvfRZAs1#H?Zm*S^6c_z`;(M@a_QJVx`lwyU>wG-Vjx&Vlp zGV>%i6d0v;l-oOZ4+kfJ!JT4p9=V4aC;9;w5Fad$ykBjVFOpxKi+y+=NWI zDosPXvZvXE5$dlH6MSw#s)|XQi-k4nQQ~5;k_{q`gyRCxGs=5+uB`Uc?5D@nnGVG4 z4ARD`fF9tyH+;^;Z$w1QUY&{jc;7O(ooxK-{*CA$3>P9oD)zX6@0IzG{myPY?T-@B z*YT7w1GqlzYn?#j6_jJl0oD=>%5xx#)?ZnjuSs>==Q5S^>O4Ihtwxd+Sb#?_PKaNe zs@S(bmUymx4N)BUDN|gEbdQ90zQ4|OSJO8B5LV|I5TBD%gq6$Ucg6Sp=p?pCns$B; z96K%NP2U2e$4FClGv!)O8!RWpSB3dN^Zhh+C|N?qlnO97s(^Ui|9uHiYu#IiP07dN z-x76Q@kf61ww^`HZJAMSIPPf=_E4r9#0o9IsTruHT=$_N=Jlirde&ykdo=o1ekC3L zP)%_!wNF+t@PVAfMOgXWL`@r-~k#qk6m{(bRG|b6oT!?ZwAT98zPlvpml_- z95k@Hl@ERVsLIjyEx-!^TQeQBXFs^K-`!lOgM6|}QK!d|$*T@LJ>%NR_M7dUl|ZbN z&uPOyxk?<@K9Car#EGR75<~s8+1tPMbhF#6C5%_-Q1Whi4?SQMprN0$;{a*?cfiNC z!>b>lxEDn=yo8DV^{`V!;iogaYVZSqct2SrJx3<1?&ODt(dwxa&fgRl`~aQ1jc>)pC2||4TVwKmXtc7_uJcv1frYo4 zDw_GKX{?al4xU5*-C~{uvMbP5DF5;fORYdg#O$2!bX-F3>gsryqk-2if9^}&CLiSZ zE3Ng1C}L^+#geC#u0TYIboUs@%4a@^b&OV#A$#Rg5+*1MGnx6&yi7b@YE-;rKU)${tZuAqJC{R<#|Wr_&I zN<+@6qy0dr@&WE$Ti5!=2A?DNIiu^R#|IBmYq&IZBAs50Ws9!WMZK;A;@iK*rm4vE=mPkR+z>3Lv7-vn>Y&Cw zu=FeDYX^3ZtLv=LKN?e)k#Ru{>VTi1Z;NwnF}L38^Zjb`C#L#SBalq1+HL)Ua|E?g zN4{&LQ9r70X8?gv2M{Dbu?xJ0KNPf#bUW~=uVM8Aq-8tA#s{i^pg`&l7>DA!AU8`8 zE70&F5MYnF_SZDoFWa&DfJ$GP(8YrKJqp1=ZG0I4IS5;+miOsa<@{Iuh!Hz%*GHJO z)}NV!Z?-}y3E#MJEfsJHph3t$&u*D#RTY5K+WX=@2;FykjBD7;$$CjC@?C0E;58ZO zyq{0Iu-0ix1xIAsPu_%ms4)b#1+l_FpsZ8$M+eVgt_P3U z4bI_N>24c)e9J_JX4#jcb|~OscoI7BipU0uXnL(_@rfef1^C!UDeRM01_Fl_9hr1k zmMg$-TI6}4>IvmCtYmGGI_B$Luv1=jf)O#k=H$9J)%g>F4VeHuNZs_MhY&%&cMJLmSE;@slSoNZAs(B;jIe`UPBEMgM1i`hyEMD=uXnO=p zo?JT_a=)FoCD*?5^-~H(A`{-U@rS+XDwy*#n45t&D^pKJo&iAd`v<0~-}9o!OI42` zyy0z|v!4Ex7rYkBiH&gCr1j?K%YJ^rI*8+TN4^E!0-MnO$kQbPmn_Hf;~S)7K-ZdX zPtJ>U4QrGJk7?V|dicHSXsrWK!N2i3`D7)1>NoVDWXpZX_-nevT*!smy7@{M>`s0p z`@@^dyU3=+BunBqQBN9{uehRq=Ow*HcnRkV;qdlmzN^k+75Rw#Wp%G;hT~>-Ri$Wd z6`JaxL!)=A4f&4NLJKOxnkG$7=B1_p6OC7w08Bz7E~NmmzzVJVOyxj&A@%n#cYc+y z4bamz!xOpXt%52z-R^`8s+B(F*#h%wbbw!SSN$ zS$WTw)J)NRvCY#Z@6bNwOQLJQ9b1M>;UVgt5X(6s9qpxZwof|eiF71;aUhgg2vi|A z(*jHwO%epf7Dz$YVHCHNYsE`xQ(~JOs9jx^ZT+k9_qQY5Pf4kt)$<;O01Z^pNctGA z)&h0E@3)>Eaz9yhtfxySEP%poX0AZJL0DL*jnmoZA6zsa!=eS?sUReetu=xiD9P={ zgaw{J>^fHcZjZdDV=95>uVu}IOWks+p>LjDhiBbzAiLHsp~nS$JmF^6o&Ecns`L}R|K8P&iny#+cHBx{t9 zw%};p;s>{)wgHcXPIQZ;4jQc1Bb?B7T7DORydOiz8_D3EFm$m!#4G$UYud^W2R-b# z(G=r+1+gm0kidV&I9L}_>vO&r`>M{oq|<350%ccq%VB5vhal~fZwf|$Be+F^neH3# z6H`gJ89*n*0+2?}*zC0z2@(rqhC>&KF>FWhr{iys^ms9FUu5(I&<;HmCr3@(;M+WX zluuLf^v$D*XYR6Otf~xMkOL4X+aZ(YIjfAZ1by1f@$;v3b0@dlMB|?YbpO`No8+ur zLb|@=AB7#Ek}s;m*yxT0H064!7OZDE7v`>kb588l9$6x%MT10P>g z&tgux4RvoGu zY`ra~+o|6OLBqyH@iCxMo=_epQdFP2Gd-cTiEswCD?6OWtGql$T`#~%l~p^gj5I@V z#*K8|m8Tzj-admkVHeSa(QuNmbz?(w$Tt|OZwJhjcB<6wr(9owSZL>d#8 zLcLIwDT1Ruebo{B#$sLbjp=K#pG495Yj@cDgO->V50EU}cBZ*>@$uNN#B^@J;jn#? z9Mf?jL}S|JU5hL|w_)Yj*@Wn5Pj~%_SATdl?Y_v6w9h=>VH>P!r>#+L6h_~P?|d8` z-m9^AmvL!IA+P!;OvfUq$NEsx#k-5;O^8J&OZO$Lj^e@>Q{)X>W*1M?{8l{VB2XFGNF}4_v{ZeJPi9!_N3<0iqJV>U*LV-H;6Y_V}UazqN`(3vL@wvDpG!?htSWW^_{)dYByq_P(v{)iq6Y^MdDD2XK_6fufm_g`{jMw zuR4t{-`7M@6Xs;e%AMxYqG-Mu*NMPd@w+=KsUeDpy-gD)&0n^!PnK3h&qli#=1|D$ zePZ)vN~5;`^7k7q zv%P9Ai400+i8^1`gP6IsjFJdk0=nLyknw|DY1i-*Bw-H$Bsx^>o8VkgGJX<=G5ncs zl3H6&lza!5?+DW#@r+>(p@*@q8qJ-7M0gm{Ak|IrFs|S?)~-C(P|;$**`jl2C59upQuxQRv=_I;t9O!q+-UfY;P76jsF=I+(%KN_|?YBUe@G1&L%v0s*O z``&gGpeK_xQ)MW^C^s!r%@kUT4;P!`s|!Vu+kb&3u+slM0DW{u{5;;`2Qa>T`4y=_ zs#UVys8DmDjXP%AX1ha`Gb0HxaH`bK{}i-|zrEUa1PUN6Rs{te$*@SxhFqLjwry1U zG&7$wu)=owf+4I*QS=s`$P}PxQ|at}MsSI&Dzi5GRAir`3$>%#cedUNZ_z-<0-{nK z6Mho&6}Zt@yelwTSuiXi$KPYz;p~Z#%9kb+dA%-lIT$*s3<(N5uj?Y|*AGUxyCF_V3s0VTbl&4H*u&M@e~N zjc@UgKK|av9l8fQ;Z(ea3R-MpwCKA8yVd5^p9b^O#=TVi0^b(eaoAD40jI42Sh|qO z(0Rdukxa;*_0`4NSJ5A`&J zW*vL=RBa6cBUmDB?d@}y#-3f4kS=Knc2-k(u2kAEF7~78c3QwrUDw}lP5JMH``H5$TUkBtrthV?>!Yx$Q z2b9eP&RnJf$#*wOHF7+lsIJ3oO>dYaLNF!*a<*fF1){FEr%GZIj?wewJ0B2qKS!XZ zAxbed34ehAm3Qe{(~)Uul$b+MINlnO0d!xZpVbROgFm?~xO_7m58-|9PDSwn1`FlY zwi@-fs!4*g3&WNj&}qwzlSEnvm7FqM1O7w*2~8JcZy zrDyt}L8mS*d33IBvl*d(OA!wcuB|r6y6(PfB4T+R7U)9h^G(duQ8{M6$p>UqqBzwX zjk`Vt-#0MRJc?SOXgJKt&DPS!ypL>CREoFXf~;N@foL6;?V$I35Q(Lz+Jk-6n*#78 zJpK}E?)@+Y`!-U7v|9kN{3VNZI_3<4r(!*8tXnocTPPP1qGq5fA!LSZd)aIEU5iiK za?SYNx87LrQ~=X9bI~8DtVxxLEp`NmF83i{B_meF1|IrCsrI^HUPGJHxnJ;`m~=Y9 z!^>Zv?b;{waNp$o(A&o?zasDT&bfcqc3l)NO9aV;I*cJd4uf}H`|(x4-Zo#}~k4+RzyliZ!ZzhiatS0RSRSjr#y9K+c{#>4_Zg-m1T zXMyk}+l&%ztcn+<3&i42Tvf(w@@+Y8GATd_)HJ>sD3Zs}KYIz1Bb#R{A?*$Q(|DOW z&&SzObX799TpPv^eUpT+qvkbD_uZbb!ex7YC9d?MxS`jTp}nWQ*1lWWy7Cya&I*H4 zSa0L&SNS-c4`P-)UZ)buX)}qkd{OQwH$re{{wSr_X96?yLl+b?tufaFZq*BHW4YuM zpJL|>=!A!wKuDkru#=+%ujXpacUpEUc?y2$lb*`cxN@RR`TXJnDByXgQTdZ>>WTtv z4m`cX7YQ6~C3EJnciBvixcY!cmRlJYJ9SMU7GnvJSyF#+s_|)Zr128`^Elk2JN|hb z#;l{B;SMR`3_;tG1If)_Ga-21-|}Z`M9&u@>vL^5!LOn`3~3DH#2FJAGHcDU9;msq zydO>EScQjxbNuS!ZtQIdm#Fbd*GZPn3r=q(RrskmqT|tKF6p+E6u^qQJvqf zhkXKpeyP-`a?v^}bSdtTWzeZ@Ih4DIEW}82M|>f1sMUNZ;Nq>d3U!3fVqOSjhk{X=?e@Q(Q1$}peWf=np>*aS_@$Pg1h`{@iIW)v#hylm=YwmN)02 z0w&6tEC>&LF`-B}`Npj%62?UsgiU=w5#i+#zk+r;LDRflYedrsdn)_A=L`Ged4Y$X zd#&~gLiGD*9rFQblE{9COYO9MeX^bM$;`UEu9416^EA15M7hW`)Gpsvk#`?q^NS(C zOuXgwnFa&`iRPbKjX!-j*c0FM;Ep9Q)h712T>asE-h0|xv<-6kgcCaVSZ08^Pv7~n zpCnorFe(@pz5;UDW_?|5Qo2A90*^sGDX<~wSpv>{fW@QLH`@07!p)(3rhr&5)p5;$ zb8~+&WWU-A!??Ve&siA9UYFh2Uz;rG68bX!5|9e8bo+Bq>*9wx!S=wXYA&*N=sv?@l{x^(CKby}OL4XI(ImBJ> zyzbjgMW9WsEQ5TM)|@91%0Jc+WX$Y7jR&Rhq-zX@Y6w*&h_G@swDKw%desmj731;K(HObRbj9M#TZ{8_m zc?M`@X=(!>?g9?D$E(;xufSr(aa3VnAr6$#b<1LjpUP7rmz-A^MTTcvRl$5YH43!m2iADh;n~TdxoDm6L(F%8)*fnLcOR$Z#BF zbN&iC-($H_rPtMpE&vU{V@uB01X2@HVc|9RmYD$Yu_b~cu2xFA8c+TwhA~15d);>a z+O{OIQC|1ySCf?lgyHPQIwrYFh~=n znW%K~V$@%>{NWqfXR9>;>NLuXM%=m#2knv4ACI6`fxaV%n;j>Fk1C95jecqUoEktds z2j}ylfHR`z-i5&Iee=gUli@E=cdww3#(P-jR?EU>DzJKc=lDaUj==Gu6JlKhuHD`C zUl>u)(tv{V+CLny{@cJSwl@0$N&@f0MYUbJ7@m-#aV_gHW$~213RLEaph?*Lq$OFt z5-^W=Z}L{#!5rnzgy)WtQrMDz$!NngxxbBlvWtK8;i=1A+sWuu)(`#Y!IMnqQ7%p8 z{z)7J%b&6p5e(lhL47l;*VOA7%2=N(Ao25vj+@q*+s4_g({2z5p`#Gq3n;m00$iry z37QHwYrGXVMdiJxiO@Y8Dq}JBiPczdbP>fLXyxIJ4b>o)5=Wmj49BjFFvnX*{6bgY zD%x$GpvZy&YiottWpq^!@-$-k5$S{#9FeV;(70qRkc|cmdNVqAAh|>)B8Xjw&JtD$ zvVHew+$!3Rhsu@H*hJmnB3G?GTN^SG7Rz8kR@*o)^9n@{uk2>4yKx>-$2LCZnWy1m zwJK0&CdT~Y)Sm@vWl-0YEu-41w}8l3z17W@QG+#)x{Jf-)0+lmJ?-mWjW-TVy?}A# z>&rT!(nNq5*+vj!#s74+Jtbg*H!3ALHk%gZ4WG3RHS(W-iW0j2WEW5m4YON>-^i0y zC|6mn-vx z*2-4Ap|zi=V1bOSfU~dM}H6YEvqG-%E^-^Lz zOxbfjzckB$#&(V>TT6h$pi@74J`==Dx>f2Wm5KOBlwvRS)sU%6c(u{a_*q7GW>$$jah`A+-e4v8{IT^kXE%uPTv1obKvXZtz9{g_p>VY}gC_Hyq-x~si3j;yHA@RkqlK~!- zo9}_8v%8?qv4!Bt_Kcqt_gfckeb^#sOxh-S#QxC)8y0Cw+8HeL$vljE$3n<$oZos5 z@8&UY?k&5Cr1Dh)=6^k4;Km~(W24u?oJIvuaq)Zwq93u${4(I3DnlM~np(ou< zxf1ua$44FZ`nChewuA3Nr`BwmO1sd19i2gwsg0uV(MH$Bwl3 z5AE-O){!^E=5yKh0o1zX3suYrZ=_xsR96jZQ9G)2Eq$By1;NQXBLUHzi1NJvlXXbAFE9F|i>? z)M_LxG|464hJ4`Qi*Ff7ff4}KQoU|Z zZP1g0mt@82`fZmoLWrB&EmPI)5J1`_-w=q%!TPf-xQbl<@K|gS9Yejdc&J-#9ni9F zwlLChG+v(c-#65_Bp6sFwgs>*$9x9-fyRz374iOAJ`s^+*SnX)3^i_s)l_u24Qr0`~2Z!AOfCcwv$O!?Ln`5k&hM)_fTqq9z-F}Rp zH|T=vg|ih{*lj{?o`o0Kb2zGc-ZVP5*vKF3PX|g3J1-+Q#IC*+E0HcU0SWBmdsSLh z9e9{x?&EeJ6X=x_0P-@ur;6zUyl87aD@dE@grY2u^?N*Zi?R8Xqc+9Jd3!k!dIGz- zz?OksS3t7y#r33bXWa`3)3#^oS&QoEeRwm@Dcl8KA^83-fA}cMA8jcU0&b@{N`rIM zm}7^Xp~yku&zw5VIH|r+keLmj0?WDc@X^)<8E4N;dQKg(Vuj(MZzsw>eCe}ccjlfw z;+{P*m!-Dc(KL`?L2Z0t^6f+2jImxW>wBt$XsS-E)H5fdefOJr>AUOI3*VcLurnq4 z(hIU12sFdRsy=7mx&H3F#@U%gAY;810}klkK!XDFs?qZo*Xb&RKo;Qq`@eX+bjmQ? zedh;@T4M=U;%|2lamPHr7JdU730ocen|h3(L|&k`tM^Cuu&fYlXZoaiPPqzZkM)4d zN1T)RCkT63-zHekY3cxjk^vy40)^&+>W5V3G@nQ2;~Wh`TS9$Nv_Zt@MItER1)=*#GYi3 z-2HSGfpBO0d;pYZDGf^Yp;2-d!5RyRr)#I+Zef0YIDzsDbN`i6lP_4}{P{s3;^uJx zq*y(TCH1L-A8QTTs~codPo6^pwg7X0GQNP`?YU?`k%FHqG^MZ3ZU0T_M8O6hBjZ9} zfHsTeMOLGMzS;|SJ(FdS-Vl)M@+!=UoCzp1)b%xXo9}A$Wpu8|s~b{3+Ii0nFjp?K^N>8U#CGM;ekgIrLVi>I(gq7!>;8|; z)J-VeTc#~&2gq|21<(sLshe}2*uLSOMKlSxID1J7%7I3blK^uX=wU$n&>V4AFhT!( zr5fPBCT$1j|4|`v@;~m+MkCq3<{sV3V{iK={^AJ%OY4Womaial=x$Nyad-C7f}GTt z>-i9(BK$p@EMNA|AZs{p;6Z4cnvr3nX$y-Ax1RoK7`?+61KKjgCzpJJaVYQ6_M?-T&f1zD#1qvE+a9ZbTuatM3a zxdZmh=TUX$J0e*|Wy#1|JC1$(EEdh6Xy#eRHeYYb!$uc9Ea+18?tAS`!|97vMW)cm zn-P#T<=ELbDv2NT#_ZsVV7X@s@5I_^UL?<_T)jW`5!J8itu`0g0DEtMB@Z9+Ot#06 zinrhO-;wwc3=RO0z#q@a``IpI2*-7KyV^IN1uY?5T*7~mU6GsUj zUMU&AaF1xeJD-n1K?{FujSskV15o+KLB6Q`TVU@aR}*@v#*%qlnpJ?4GEhq66chS! zi_Q)*L;L{8a?*?53sBj+wVH&}@7u1vK1xj^$|}S5&84mKIvd9y<|UN;2bi}*M?stHg&)y%A{--ZoFI9sRi&H1F^BU`~6e+DoghH?w5RDF<@ z`V8GI*PF-Ff561#lF;QT<^0i(b8d{}AR4p^Jkr(FTfNy^vv0p2|572cGAp6Y1ic6# z+szM#^D(X5S3K7uVCG4)F>oSYMG2i-ZdE{1i0H9XJp1_%0al>^kb*PJt+P&Tv_P&< zT39bw*2rKeuz1h697FIT_-hP1og0#uEj|oY)o+JjQ67w7#>Y&(oxNyIdOs@XDOlW6dTr%wmYE_!=I*)p9)_Uiq9{)rTK4UdrK1m5D?$vGS@qU zb}zmFD998o;ozIDWHkezbR>^S`py&AI6!TisGur}Jwu?=#KtnfPf*ow*LoY#6w_E0 zsTD`g!jax$3y{sDZ|72$vbtylL39Wy3Gb$VnCm`Sm^!`RgvFCF5KVe0nRsEuNJWKJ zEXWpLl#;cFJBJ(0YR*V)u0Ss^H=}m`8264=2aS4Y%z%dN z$5nRI<^s3#iv#b}_ZL|=UfE-tOMK3ad?!NA=ZBs#%>dM;^zn0SSV*997q{o_Argto z&FOYQX06$Kt#o&wghc2sDYb$FALb9RI`P2a7z+nEUTIwIpBh<%GgQ)nxm%KusP$*L zS!soaoxVuv#qf(|yC7eh#PHA7+t(Rk}e^Y!>$hr>*OHN!6h1(#tBClkh{;U!L+WC+mNb>_0Wg|*4rIS0bswF<-@NcDf^L_D{asb= zMN!3m3aM>9#U_x>co*AwaB#Bz{%Lz%rPMPW1`}C!+k)?Jc%zG)H`yoAGKjq{4(LJG zNr`f755u!|pIu|x$GiJtxgGf()brPhJfIGy6S||_cf%{=m+Elx`OTP|Yt>91uh5X3 za?bfDSBsAcmmd|c1!L4R4eH!YE7m{UIyk)zZ-un$5+b)ivbkj%W;)=b z`#vk1wDMK%HPr&|nS`(Hi*FWC^n616qY*gpqXa zfmoHO2GPtfZT8C-PQnBw>OiOKd3H;x1M^g%xYmdm4h;q`Astcq3c?rAm=ezR{0V6Z zQWf_XKR#OQ*PZpW+ zcW2GjTh(a;rJth_38y<^=RTlEO4wpTU(qCf)CXE=HuOv<@})LFO-(J9p#>8?|H+p| zzyYn`c)Im8B%$rZsghBvQZHXR`o*2{gCJ-cFdr&LC){7l-aT}L(wU!i!J}@g5dI)` zsNDw5YzW5)X=47QACe2FKPkh)KgkO)EMTdG#pGSRcVs(TE%xp+V0oTA6fQK>InSBGb8Uj0clYi}a#I zC?=#B;|(z!TRjBHX=3tSPcWt_$Vm1_5u-wULNLi0gfES19~6y;D5!P#cuEW#dbK>( z-yF-~IGp&%@9`~{hGAFcY2amm@*!=kpa~l37!PkxtIrkV`XL|!$Jw8ESJ73?qyAzm zegvv3^dVgsx_f(reGU@BbPbQJCbg~KNa@C1a9fPv1C14}k1dD7%Wzk~&?dJ(4{><3 z&~mn?vLq^I6M#u>1bp=c=6C_BRLHXikDZ!Obr}_Bn_+ z^||-aU17O=ZXn)wT! z_y$qrxQltRK$1r<)B;O(3%8o@C3qn=qDu6m~pvN-}K!#|wvtAd6;4vx_ zB^voY@dc-F9`pP7gX#nq0#QK{aQRy+C>+RjJW|qA5D$S5G{ zwisWqa)2Z-HkB5it~9rm0^O3Fcq<)tV;Z^ELxIM0cE3g1ns^KMhHKfug~!VWNvhFS zeZHtf-^!W2$nlh9WKk!VKWD+0|#cQ$=*R3f|D!>4yr3VXI zbyES!{H-LDd?2)M>Gnp~?q*Lj{sSe)SiAkdo(pYoqA`NyT5pgs%zdP=3T9gFY=~cO zyg--*2oBx(c+m>T$j07aw4R&K>jIgXsIvN+>iKK@14b-2inaRyH5b&JLqw7kWu z{t)({d{v|^{mg9KAY|Dxzw+6OgxiHJ6Asb$s3ldx+C4I6un6(^qEYE4%#ma^5_{?4&Dz<*y0tQ9ah-RGp*e&h1G#n}t%(XW!Ym?eX>0p5kaL9J{kBxCkAqFW)Ui19UqXoc zfxT}OC>Sxr8P4bg+eMjbT!7%=1S?mWbLmnYWGI|cI*}5yDQx!=?n%U#JnQfB6T1Rd#>KT<_N(tq zU4CS}4?)gzhbJG)`>0Z^^ip(6U6m!P3OC3c1Ib15Sa7vtj5LI6U$ zEooiP_Y_{QX|m9^&F1esSs@4cPvp4`OF(fs7A2Jb_>chWtx)QbUlI2&%x)C=xr)j2O*T1dx9Gz!Sr$z9h^b(q=(vS`rDO|ns|9Qs1;Rs# z76TLfd44Ub{>`Di_wv?!o?RGPNRoghN%fMf#i-+BUw={Q1@~lh%WDi=3wLJ^DZ)?* zBKMho?ZN%*7X*1m7=_5J>oJc|eVJ%7cEYTjQUJf`$31;B!S7tRp=z5;cHkL&pTLZS zX4yh&A(y!A!DmSrSvM-aHal`Jl#`hzdoPo|IQPiqDS_;+#zqi@!B;h&+qURo_*EBpE`X5tLhJ8Y=*BZ%q*Q#~|y z5I%2Y7TDkL(C~j51VI%jNCO={j%(TudB=qsEkdLi7cp_v~^&O{&iWrDD%9x`(N&U!6wpY-Qo?~5j%q1;O>hj_E)(=WtFUv7tqy| zNo8N$HEH<07W)I{D(6$bT&s}pcb)pv?qOan9)MljPfCbd&0$kxf8e0jn-6sV-r zhts4SOT_>4dA(*OsDMw%F!y}yavZ_cgXt|njZLlB6r@qr;e)Ikn>h5RX6Yh>OnHA= z!jwHz%C+Y2B=i;A`BqSR#MSGSJ7<7FUtBh`JPkUd7ZM~kd)CT#mbQ%S;*yBMq8*3T z`G-4t3koY9%v5!fIC;s`N_ljTlGTWyZAj_Y1yJ%5NFn;;$I!cuwICx$Yt$^(SSYt$ z)n6^W9?+%wPWKiSzrp3=AcKI@E-QCRy9u&IC=S6dGLiQxty0HzZ%WoOJVYNY+L^SF zNRLV@=iaz#ly=5KT1&Ou#{clbL$y*HG8lduS)y-`ya62fZ2||vD>6dk& z^ECMB@HwnYE)EPYEX^E92Q0Qp#1Ld_yF-uSn{s`IbP$LMq-^(_yvuZ5Xr(gSpD=3p0hhA(_UUFGXDLY)QCBs`N&FK&d+2=`o^Ep(C6co9Az}F|ir?*~wgDe0~HdS7-*$FDVmRtnxM{ z57S3_Fm{kGv_NHe&{S^|YP@;uh(XXRF6_7NJ`~PvR5`& z#ho;jx2|jA%RkNom|N^w_2bV^)~K$(No`jO2Es@IeOn)OrA^IfnB*`{6spr|^P^zY zk2QCl;?~H-8z5_Aw~%#zxL7Lj`5GdWX%6hgDfi54qTK|)Tg^^5GPQ^-)2Otcq>*b- zi?niU2rUN=@a_`sPP1E#b>(IA&s+ywgpPkc#|+ztJ4&STMPuTwy_L0@&W6A|SV__8 z;j&pTeJ;ve>$6)dZCM6|LBFX`7H}$V3WN7Gn}SA9boyA9s+=o-F}f-N|EyE5A~gMr zW3}znpoE6oQM0|znHb5+F5cR~s=aYqV4~#tkPm=|F7e05zuI$0@S{pyeqvpID}K^X zb(ZuADFrplLDyubcUzW@6*)+U_T9is0d~Zi`F?V8{^{rl|SmI)3EUE?wmvv&^X30Q22E>Er zOx2^47pn$p-dZjAa{aZYm)G+M9K4S>^bSj+D83pZt{7>nAmUD&@?Bn|`2&4)!V z55St1eY^>IDzzcRNp9itq8`bB(<|vShvB0*Am0r@|&kvyV1YBeslJn#e|p~B4erXyfU&&aSFqaQq zWJF8Ihzi%@c39m|1LU2ylO>m024vpED=^k$abV7dOE|QdW7HkdL%RP4Q0%oJgoD(f z=IFUy56jqIpb~Nq&IHdY5Xy3ykB}H|tr@e_lgL^xw}=pFXHX4$pI&zXC9E|4EVzcU z$-BS}iFz_)4F7nrgnj`5-?9P5TGMR>0fS^o)=0E~nInZBO~{yHRhYX#gM2&MMY652 zmjU|S5(f}c92*8Exd;R=V}c{W(GvkOBNj<;KP2Q?y`BK#q?wuMIwkZtyQT=AeJVa2 z^(GFOvM|JDs&F|rN}h&Q&jKd5WNzmS)-d5{sIibOk;sxoBcxzdC+pejV0#%^^__g7 zz>pk}v;f)5sjN2v;MbLcU_pEBMScKRnnE9hH++1tahwTpgrr0@M*ufarRS2pfn-Vq zLJvIybsRNqxcv*RfwZ57W2b!+br~Pq#E*(?8PrFUxa;h!8J~19ObSAZO{X^%A}m|uo5DF zA0fDY*w5s_^H6KE5EWzm;Gz$sF$og%rtua>a}|gy*MZ0A~Qv-WP{SCV?|onCme zBirKQPj$3WpfP6b4c4q)pu>69;Chs;_X~_nlOEoi8saXP=c4NaZX2{*>#GjFU56;& zA9%fdtJgP~zWjz(K6AP3&W8IoA0+n--+TR9T1$!pEP5vBLVlRZlLli@yUG}QoF|4N z<6D}4a2NJ?z5|b_m>#Wcui)|u7L^EN1O>4PXgsY;)N@DKS3mW=pFkDuC{fv=fiP0( ziE{1K%zK+WgCLhJVqYTG<*-(9Zeg3FUNKah+ecPzjez6y!zl+%C3Wh|NUS>! zT+bpdPqtpS7w#s;lFz)W41?sS?X|8*u-x?xmf%>-26=jLFM|}{eN;G7s90DlXmQUo zrbyb8+zM^hK@I(UG?Nm^Pd>*uNMmq9xQxH)qZm8xC7>Mrdu%A$N8s^{H7-fWRl3 ze@DicaFMsS%4(LSzZ?$A;;EC1ZlRBMUxMuhaVf8+39`D3fjF$dfMgx?F%l+yaYA#s ztstJwfZ1{L^#~2TBKxZ@aAZ;xXU6snPKGy@KxJd1~m4qhAmJPeCaKn9zD! zP)*f)&6Y_b*ud2~ZpkgCrp<#FrYH?S^U|tUSduCQHma0ssrt*7`R5t;CPz8XjP*1a z``DkXLPIblsK%rBC;@XIw)8L0O;MbYkbB7caLT9*AHstFaR;%(bq!ltSREhlD+8GJ zllhz=g5@H&f7J8g87Y;oX7s&wz>W3Hu{UpfrV2iB3=RNWZ=}}Aj41JJb@4H422A?w zlAqmBsVOykIM>%n;(g9aS4n0u9grMLvcV~PnJyByx$XU>jmcqMo6?%n^v7+D+gx{K zw;<_IJ7JevdK5dzPl=~drWAAeW>nG(PpbVhjmw!%ebB}WKMBog{lpPNMkDYVAGw{J zi{2=J;JOFjwlDMXH5zewAl4$^M>8~8^HGS%k0g2Epgm)OCou+FU9sujfuo+<|1?~` zE`eTK%@{rRt5zShT+oYd_tW)Z%l7d7g*u;;Zk!&J4!Iabf2#`2pTF$)XIy0v@!NJ5 z>VbX<&b1`a07X?$rbM;$qdnVCwij54=OlPM@Yt9qiwcjN8?cf{8f}PTPo4v?g&O7o z8dZV~PS)?TyR0uti6Jm$xS$k+#{wIqsIYR0MEDIxkpjp(o&0;=T4~wOnFshE0;dRy zS7<&8FlAcNLP^A6ghW)nXXb@U?0ueXK3-5RLx;Tt>0Mbt)kfK2_k#{Q!JmSj(s+fK zmicaoV>u3w8{oen03CCeT)IGxg{sk9Clk|HuBxoa)s7bo-(~*=OK^|WjY`ob- ztUtTH)9%D9FC{i-9HL4QgBOoC zlpKsT9KIIIQHS79agVCIBy9Xh4sUWlO8%)aoDT8{vpIL@>SuLPfw2uzV5G8$ra#p) zG50{28@V_r#mm+1w+_m;AcgM!Si8pDzlumryxadoQb0rq70cG2O@_t$c2G2YdR_e~ z{93p5MXZ3HTE(n!x__RaKV%QgV{p&R3UhVBPFG5!aPaBCPs{7|L@o#G4oh3U_U|&E z#wb~s?~R-Bu6GbDBulH`@VC7CQ)*|R3*N1(O8uG)(mmQikYEjY6P5V=r{GM1qMuu3zFcTcf$1cX4?Jya+Yk^WtJPJzPo#uCQuZ=zY5lKj#PT*G3Pw&X5u- zTF~w&^sKhHdBy|3yIlG;*WfnwdMT=|nMYCSyUA;=rLQ#l0yfc{64Iee0V~R;r=p2l zPA`cshNtTav0U@IKsX-X_WVPxLMslR)tBK3dr@4ZZ9#r9F1RF@eIEh=ADtW?lK0c> zwiVB&G*l4Dse6m=_A^iuD8f>?h1x0(t0IY);Ro1j80Nhj!zUG8?B`~M*6QWN+enz0 zY4jiAH=q&s8nOrsabC9wm68w(j>#r7q&rlX{_vkK%&bTXbm1eiT6g>XAXS~74fmz3 zAo7uL*X&__G*iktN0&d)1elQHNd;ux3i)CWe(62o2K`_)_b16nxtsiXWvzSCvDY0m zm2F^j#$TO=L$9S0Ib_x43L}isXQS3{oF;vIvsEh78!sSx^?J#>%T3FX+OHLQ{nD%_`Nft5Qv`{FTz+-( zS6x@3@21+i;A<^~49F^D;pkpCNV?QfVpkp}4|>e{6V?#sFmAB`q zJ(k%g`Y!5S$sdjagY%AJ1hg8eLOBX^6gv;Kfu!Oj<$lQTtWWa24qnN?=!-= z8p*qAH?_Qt4`Y$x@?$L#wwTUJWl(rDUlilNRD0SaGw720cg#`F-UJi&O_7`9XX}E@ ztVVf48~5nEqx@<0+dCz~6&(pEqU0TW==UzH`lCL=jjb&+LOX3&4MyD#li~?{x+jP6 z-$y|YgBJ6yt8Sn|9znpovdUsojv94;A#MMhdvsS~cu!%~r4-eFsN~5Sir29HGkZht zDq79sE=KhC_*IGD*ar%c*h3Ffd=$Okt}DuxwT+CU&O_Lx;@Tz6MaUN= z&LV6HmJ8C)kCvCIpYuZ&J|1j8k{vu1lHB>S@`aOD<D_kJttx5K+OUguheo{+H_ zW#22`ZhvxFj>BIT-}?D$7}c|xh;l!m*{B8X%zBC&|Cb`;(B}D9pSOjtZsxl1wAaCIOnbHh6mlT2X7{u}%rwcf>Jhpz<51QR7D# zVCJ>NM17fQDoG5d;cu*o3*bM^)sJ6Ra5AD&Sjqm8BNmxY$`IG)4Ds?V7-y~|a~v<8 zDC951kqPqf)w2@T2Wqtik@M0?8AB(}L7%-#6H3p9j*P*&-A(+c#ka6Xjd2@Y;Xz{8 zGM_N?Yml*SfNRckF8wPT&~(>MxMX355_^`F@v0%Or13xOImap%JK84iN%y1oA&tZU@2-KkPnXrrjWDx=K5r<2c6C}0?c#~2@;ZTQV68jd zb?K!F?axdBTk~%ZQ=BY2u7O{)7i=*oiX?STgFFcFK7xT#=1Fv3yfs-&{Fv05Kheeq zFWKD&g2vht*_DV#XrGfy-MyPATP$zNw3;~9cXBuUGx5ZgkO$9W1v2bTq2Zo^QN_#T zN(?FY?oo3m3=kkXZ`#s>2bH8ek-GiENSGjxU?QC)H2BtgvRqp|j#ATHp$(p;Jp$); z!b2;u`Y6AUOvkbACZa{^Z~;EGP>?#L2feS#xObxm;Wg6=Znwf4Bhfi=OcaeGp-kKh zlCglJiSk7H?UyGG-MH}H!C>43UvtNK@{8YiP1|ULz5ZKt5f1_mLyjE!Z0qm4lvq_J z`Jf{QU}c>i;1&{bkz+AwU|VD}@l35fhQ8?- z#ipP=x=M-sth2wINIdl(^i%^a5Iv*e-$Y#8ccwUD-6PMlth?Z0HNTp%)~If=SyO)V zYNyHl8RqsQ5_=3#mXrfZiE zv6BgHbxezoHojB75a9-BtVtrycEbU%YMUH4}%+`L>~RW(vgKVJOPO@$%Q7 z_``4A4o9*(WrV=HMyO0d{}{_B#stut+M$B5Nnsc;0jWhAYJd13P?l~pTP?Mi2(dP1 z)IEsc2)Gh-TgrgsTCn-CUqEuyC4jl>?ns`U3jklT7TzJ3tH6pPb%9Zz9Wx&c?=8`? zht8%IltRAY@U-*nLUu52wzZ@7r*TCdl2gk2ER!U1u+5GR;pmsK%ORXv*id?+bpk5| z+7G>097zZeopzha)ch?hPYek(YpAfo&+G^EN)V*Guc?FE(#ReHq@K^Q2E9p=-*|KX z`~CgnXhp+I8#UMJ@k*?oV}^%48zzyyn891s&&sQr!RT<<5aviD{aqskA^qZ#BnM&b zJ-&RmohV$d>t-!tqF{Nyq@c)BNzoJ~jn;QF*2Cc;neRmA7w|J0!wQpQvmHl%%ZkFL zj?;fMdaz>TM_r~w$0U>02ljZfilEUKTLdIg*-yC^g6~j7AJzq@V7Yh_E};-Z+RdwD z%zP9Uil!Ym228n2k{1H%Jt*`O8yH%*GCawp_;CkU+fiFa^DGf_{88sVV$*-d$6G24 zgU6%{1MN!^K19w*nR(Ak8~0!rBT~$@pt!u<-t07Cx&T#H;i42n8Br4>^MuJaAuyQ9 zPrHfxAG_(R_Kox~tmcbWJBl&(&l!=j)-F^!ad#I^-J6qkJ#YKVt#!T__>*Fa(3vS& zd3Eu|<6oGAE2MHVyWcQvO|8WvTd$)Lpa$BHO>r4{a)J29`I4KViQ0To(UsR?q&Crx zakVqJq59MqHgyUa=n?t=Y|rLReE9RU{=sKygR6^dtFu3f0LVcqDRew=;FNet)j|IP zjJ}!cgB{oMHZ)=pBT8UUiHxX`H4LeHc*=Q#O~v)!;I^mq%Z*&QU|6BlM11Ia?>v1Z zpMEQb9^vds#merf1ueR6u(6dX&+RdkNF`(#m>x=%K~41pfu-%U%&#L2jQ~vTg8-+W z!E~OK@eU3Gk;dP!d*n0B2;)fC1wQ1)RiMjbh~*c_Ek|_uvBUG-P6Z$FZ!XSCP#YNh zcL82UG+}f8#^LKlVm9Xh1z3L<$wp&er{7j)f2wmXl95t%#{6y&LCx0x>qCGK?8L>0 z!83QD@(o1U5{n%X1xO9!2R8GiXUs8wkPClv(r3}7-glSEvF20z?xtoUR_H7Ca#kms zh22CD8N@MsoA;vs+W9=;?L_F$GEKHeUL`=46#l+Dx{3t3wTNZVJ<ki#-(lp6Q5vq_&qF>)O+4h>POzgw@8<1`BE>vFRK z=ANPrPCGeqkTD5=>J!^n&#X;8(0+=2ai)fln~W#J(0kUnrU3$WLh#peSd9Rpg+Ps# zUp~i?M27$835KCT5PXHVrU$OGDq5rH6m06rAXB4bhRdxE?wFHGXPr~0iKOkU^CUqz zP42&bjSX-sPBB{ zwX5c5dSl9ckf-D6x|CwAjd$w`m>_e==`p}Z&$M+T9p-9k z!-WE2xG6UPuk?*vQImFks7H;u~iP}#@{hq}- zl0J(K>_LX)6(Hcy?1ne}>r?#`xYUt&_Suw9g_>BY3EVIwTp4xh`>>L&vWyx2wggu3w#@vat_9_(yKIXwuK|*N~bE za;ED@)lj%f-LZ#kr{Sarzq`(UtqTmnpA4s=@$3nF{ZM4Hg@Z+b;s&ZuUxxBhGQ^(c z&-Z-H1PQE@%hCvDs!by~?N+kd0(kN?s*FhWTfA~C#wnE=KZol3C-(e(p-cYZ??qtK z(+<64F+t0Jn~V)|gFbxb#Lc-Ddp5^Rtv||PXb9C5B6xf5T4Ia!*=rz)hRp61c3(3A z1%hacobd8~edcNTR<(c1?D+d_|G@BT^=WtCRB-`vXRfS_@s>!Gu;o^EIwKh!P@wziU^b8;aKa>s7NyH-XyMS46 zNypqvfL2fd*fTF}f0O@2hD!JZsJgpA$!vNJ9*O#b!;hiwb48QSJD3FDo<%Z##{{l; z*r>b;gQB!c->tQAnH|vnY_q0lKWF3UWThWLMvNOFu;T%-KqR!a9-9z~5|AulDNXe^ zU8gBnFoV}!6wCuRVwHNV5ni>c|Fuv3-GrY>G?eQ-i1AW<8pnfzoT2`4g9oLsPtlL& z=Yn^y(G(1pUegESG`uVHl^eq=<_+9`P=NkCEwKLl_n`f;Xq2v-cfY;&g%{Be#3*}# zLc}Y&C}H`9AJfFN)K7Au^*6rS9(iLW2ozP^2hgih9rn*l%cG&4$!mbQ@b<6L}P+WUGA1tJWrD zivQaSAn@1e#*bBCei;VbjA-uwbrSww7~Q~Un2%qHwFBiPi-u+C)SCZT=t8~YC%A5) z9}7JU{;S0yM}%q`Y&H?LufFawy2H?W%rcII5{Ui>=B)%(CmW6>gfjeJmIf1~o`_#B z@ODR+i=Br%<~U@}At3&HkN@K~j^jnA*1ohKkMvi0qJ)f=X)3!TjDrDv*Ft?}T|qi7 zYNT6c zG2#`5{$>CfWQJ)(dI~zAd2F*NesV~qsV70e{Dh10G`o8o8f$RIuX5Osb{|^;0wDvP zx8b0;VMC8V&+)i;CkhVpyjG{3v51E|)G(j~|J2uftPWf$b%Zg@3wvnfpN!Xk0fSYF zH}nEGCSvgdzCP{^2iGTq zHFp1B{N#TvveI(r5cyiOIt-8-i@HR{%PS7lxav&Y?oX{S6|N4+%z~f=-j0{pi=N_aPrwve(7<@u5}) zPv_oOBA{h;#^dOjzbC~aivc=k9e|BkVN2-^9UY9f_Vc* zbe9+^Xkjq`QvHSvX$yf?&7i?y!y%r}(R|2PqvH!^eN~TV+&BKM$Fr=7E+l?>o;*MIw>m**AyHS zqz+o-OYR?!XTtinS)Of1=KwzvrLU~Pla(YGsQBzE`}4KxSg$n{T$MJ>hB9yfYK{hu z$IH(9%~WqrGT9NkCWj4#6L2Gy9IJ_J41DOGDo^bO=JY`oimYM?zim4X`7W-3LnHOL zUZI?|gfK@96)F+0TXYj>eire59lu3BNU>9Q|@LgxvWx zdS_3TL_S?Zc{3g7Gh~>%TR%gb>NHM!>5%>;n&Y1ZU8F4z8tpxE z65~+GXJ92W{x;0xY3>8U3XM6BN}YOAG-9~HVr8By2v9GPfP$P74B6=f@YyZV~=pd|H|nKKp7gR~*i(OByt3~SJSUzvXXY;7}4?d$*f_WC!k ztP6W4sRqtK2j-rxT*&?(Qi-;!*@-`4*&a6g;zb@wWyLV7{?A$T>FE!!++h>(zhx-z;YLfWjp7ekILH^rU3T{8W;|TK_ z+JF19e`+%RZzpP$V6{-&54;FvO8lf7G2X~Fb^QY@z@YywtDnyOO$;zptQJ?h9X1B! zyFnRX;s8*6`op@l7&obgcjNBY$A%}MQHTIsp@?OlJK6lNU{X$M+!M9SA7|JbLnz+j zMHNGMC#BPTTX+r}ooXX8`1BF629<5VzEU?WRLJhgk^V4{Ax%t0$qTjmMnBP0mq^d% zvk0g=q>wX~oHS-^})rq`wg_PnAkPvJjnF}NnF%u?oDfTGFl zw9Pb+#b&cWttfl~bkeV$od2u5ZV*~IZ5j{0*O6lVKJxvI35dzbM~bzFj^O=&j9%A- zO?$~6I=koTkAt~7l94gbI3--fSJR+ybw7w@S_iB{|=uk1g5LQ{rP0?%=LEBKU&5-T(S`wkfq z0<9Q0f#-J+0S<6SYSz%vIY2zcLTjS zMPRnRR*{2(Z0BxmV0Rp!Z?{j#$$tuwJL?qE*HfXk6s=4|ITj}ghm6y(KW%_W_ z+JHom8Qzpk3>>(+(Ut~u2_3%|u;CyxNk9yAhNjYhOQ2Zgw3EOo`K?hZDCE6&RDd$G z*>J|%p@?u)^xiKth{%L1Abh3gpohYI06rUuMI1k;MPErz1mgU7pA&9|I{gCDbRbF5 z+qdZ&aQV7`6ba1{=?NezX{D5ZB-yk$9(eA4Z<&b+NFtcSyk})j`=hx$wh>jKG?d?U z^o$`{1%m#YJCg(nDn)?+#+-nh4eF`iJ0|nroLLv8mP_oBs3SeaZKl%~5itN!KD2E> zNzpOJ4Ql8_Rf4C;7;3%ySI)$?A%G%ROb&ef=?4ZwuEk08&fe5dZ^V14a^}1cWs?Mi zgDy}3&?yzl5lSUVVO$P;DBZ1ZN6Slk$FB2_ZwO1>i3ksIvptRB@j=8@=Czgt33-^DrsV(hT6<0OX#>KNn#boIfa=G=qoZeleJu zJtvFPK?4V{Gg-`f097mOzu&X}b|e4!k8Kx`ZNM&RZ#MZIa(BiM-YXPh{@1_;g>I@s zmkv-z@?zcsL@QJbplPC@2$qqc)zUXTT}SN#g&CDi-7gqsyOn1U2bGc7^w@jTl{mnt z9s^W+m;k@P;Pbr1dQ!f>scQ=LICxUUmgzNX0mNJN9^~SO9~8q=3^vsTY(Vx4N7GUVsADvqB}_m z0pTAyAeli7c-cP*V?=>q|Dhwk8yvL2C`NmG%IRRC{;Oo>64BemwI^`m{^qP394@9U z&y?fLznb)up5=oJHb*I+svFo#XTzT5y~LHv`~=5}LxrkH+wzFW!{M6?WMPF+QcxvJMd0YQBR3eNl0XFcGr4mmY` z1L|tw7Q`0!B=kJk&oNJyj-%hL@#BHu@;%!4Lw_PwcNjYST!|uowyEjX&&qBv?}HwD zKK3d`!3X3`bUk4w)IS=4qcyS7_3^LOOy7I_Xkce7I8mbd_UiDROYWd@UZxj|yw~OI zyPnz>O`UoNG2W9d%pMRI2yz*aqZi1!^WV0*o@1cvW??8!Z1c2XeVCZW! zq548>xy3t=Qs-K;$|%1JbmW%e-U1_eudap#ezWcVTv`P+I{MY3YbKy~eM@26@vbuL zgqdy0dhEQ?DpiwJ1m<--a5}Y-HD&b~S!iT=)#B}b6#Xmhfu{IUS9LiI&w3i_W?OP% znSg=%$;EV|ilz`xv`aZyM61PxwEZ3uzWjrop|NO%a_LG_U^bv=HZfeRoccq3sp%>b zfR;1@daQ2Q%c3b+KQs9}W3EAjh^cQb@T7l&Zo70!DRwhKK#_(I{u38qzcZVNUazU{ zz*TC;^=VI`NDl|WV|Mi?w%C5yAJ2bFS0(|Sm^$tZO0wu%+vb_C?8X|{08tg^tlS;hh3SbHh^Zk>h(|t{1tzfN5gS-gtuq2wHPTrbV z4|lDv%nc&GN3Vmw+Q*x+4j6)|e&<*pK6syZKsV+Hy!x5lPfccjFV{O3?tfL#&jyWt z4nPuZsOGWs0k=N7W&ce)*I9Fpa$yW5M}s?%9IRfS7_au=D@SlFZQJVDl2fVg8FKVc zOXBu;gK)jLhuh!4tuN7g8gRnSSCoD;CnGuyd;Dc8sdozze}a#4-UZW`{|UHJ=Aq^$0eXf#vmI6cEGm)dNVP~o zX!MJr2$z0tAy0j3JR{h%9~}8oaN4{Odf0$GAkH`-)wX383gQ;G+2aC3z4DO;JOdhF zptwFwJo;F-V{p-OlxIprZzfc{TCYLxrUa9o2HotIW zb!@Reqr#4iwW8q$#u)PU83lRLUN|N^c_7#YAsBxs6jT^C+Z@g|Wl2GT`+zQo0eX?3e}Ka& z-X&;Xd<$G}0lE{-_8kWihf)UU>77|AKNQM*%F+HbsPP4|s#^|}lccBX{l;5)`%E;* z80^?cko_asB4VX#^v~U;95~{jxSh6FQczxV`uCk*ubEmum<+nrmNzF-zzK3g`~r8n zG-O?(Zzid*(xW`t-$=1)?)3gRY;l@a5-oh+7`K3U=Pp^#TE)E_0* zlBi`@=+`??aHUoh{dh{it9ERF&j*KzU2fUV2}Q6b=zkX}+F9e%e8Y9R08UEWiBOH2!g^)R@$nXz(zhOKKYVKs+*!$24d0eVx#o>*g zPd!n*`<;)!c;6+*L|%MH4>AasH3gbzgqh_w@pJ~=hHG@}Kdnfh-W50~rH$AZ$KNP4 z%K2=ALdqgA?yf}RyVXn0Sv@dA0TQB$gDq?+UAcI%1gfyWIq`|#BpcbwMpQFSEPxJ~ zO`I4gD=!v#Yg_XbQQn2mv&9T8TE9SB9q73#0d;^~l4EEigubxLP}vkz)PZ=pe!L-7 zP*Au(GpyxZMl{GPNDnx~v{1?Th6R=f?Y%^Ix;bLqNxiPx;reoC zj$zwp5WU;-(3(+AIf%Zz#bm!XSYzMBONZLH2t=j);ZS;4tX*57QESs&gP<~P>{9_8 zCM_$5xqU<7!29m(1iZXZ{o)uu^~Gjkyf%Vs2H;@$2L_rKk5kuG^?3MslBE5Kz?0!+ zYQ(&fijZ#dYt8-IS05pb9O|0@EH2EN(CJ>dsAmE0kKyb7H3C zk10WS)_!r(HyUv4)!-WFI#C=il;>a{p*jz&QbfQvcgnt>I4Ijx*eV0m#Hn|ud}L@S zkQQTkC{(zi{{)v-@gS@&9hLuZQj#em1*SU=xn|;|1gJCHo1Wi3Br{Ot(apH+ubT1v z2Y3qxl3mIm+zwl$U6{6hDdwAIT+mLkhV%%kpOP$f1PfNXKN9>w;%{^HMI??=9-v!B zFm_9RbmmBTWg=nrKs#hMsrtp}1Pb!nT#{)P$y%=7aVr6jI-4Fkk^$}YG05)i7lr2+ zrG$A2ho|-gh|oU@z260!heRsqT&BS&ArmTb7WhIWbm5qPfDT8-(;)%&1UMro=p`RH zBj$G^gr6%N07sGhWZ>V^#hz{#q{a|O@M?s`ib7I8oqI@>vO+O8WWpc{1)#Inx?@S9S4H4X&;DeUyDW@3hOi1MSl?ok;S^?(PY2lOV}4U+r9~)mrxFQrJTdUlgBtvHh}I?K|Bi@9?vGLe=AvEPD*x<+Oa4w!!4(2g7gKw^^y&c5S_k2 z)GMMZdJHuqhLe;ZiINM7eew+LW+-)$z7Fmo!7y+78Bf+Y!3!I$j5e{Mf%|-i1rH;- z8avvF5}S(cF~^#+T?&%=46R0Bs(}_DH0!Fmi{|=Oae)4posRYS(zbpBdrj2eSSfV| zxK&QDmWO~w>1STH+sSHo38C10678gH0m;p2HtL@2iF7NxRwZB}_PLt=;HS)*wVSQp zfFz&SfNP0%*vL?b6;8b#WSxvYO&=wBx38S1bzXVgtigft2V;P3ZX1^uFx{2N;zJM{ z>GiljaVU7io2w-iL-+yGav$X4o2rC{yi+R*EaLOWza>@^%H+_(u(*q0Q7s-*rggvWc_J`n(W5`GTOJ8+cl7)K zuD{f+dMtICs1n@b?PlWXGEs>%fSdMukI_6uOdq!nWb-2D9(`F9jrwi`oHjb(u}RWC z&?wK1^j(MEF0EV*alqml*AADpCk!>G-r&(t+gvn{90~FHUmw%2)Gm;0WyhinZP)z5 z#tVId(%!Vr=ck8tS_J*167bUvnYwC`iH^5MEcV^kc=$sSj)f+uW zO(Gn*%Owh4g-Rn3dBAzEMb?jLjyHAZH?ts`XUmI!hNM=t89JGMI9;wy$6>ib^dRL$ zwaqF*$I?uElTTOkuhZZNGmm90ICu1quYjWp5kRF)}5kuD%TwVBL zm`kp`cd5oIsdgRjr-CRe(GJHJi~$dm_!ESkqXBB+8))cw=-wWqgvCTMkPzA( zUb}>seG1)`4#F#Gk!MG2SPcVOzq6M1qyoZ%jL&!*%x5W#L{NjK-v64J+UV(E&jalw zB}ZW$7?DujULF*tW%pMAQ?8Q1U%FJXpUDL!{RJ_90HX~Vty&d>p=SZFpq3Hf@VGy{ z6xA40%Y%;3tLRT$R#(%|piwQUX+WJsv;5Rs^$Wzxe)JeDQnXEl<0PSeV?Lr#FEQ>X zCT1Q6tUwCLVRwdi=W8p;-#<5gy${aI@mQq7JJjiYHFq)ZL-CfJr4HBg?c7*gJTc5L zZW0CH>>>NH84SgLG+?BF+1l`BpN4_|Y4Fg?hL5k;dBTF@n2mdI@gXcrSxD%0uOrno z9bZ|zk{E4pey@!C`WS=x=wjNF$8v1?dHrY$gYNEl&D<#GM{LthT9Evw|BXkD36F}h4R;dl3y#I8N{A)m@USRMF33ga_@7O(tvDkt?n=ZE4}Fv9Me6D zJ&S~IX2rFVB|cLXbm4Kh#e%D?sDa3Y+KTCVJC|mRuBI65R3T`QyX>oSL9=X+J&+j1 zQC}>m$O3)~hC8}cR{_0&f3yVJ`Qj5%u4&xdT>z-F9hw}*WjAFp#+bu@FO-Fnz0CE? zLPqW+S3~ySPMj(}OCw+L3j)wT!6;~HPi;Jd*;_&6ThR#w+qhCIb`VXR9O4UF6MXh1 z`o+O%$uD+ak1l{yjpR@nsC!g4$i~MeFYn5ctwX4u?p`R$XbpC*Y~qn&8LAId%uubcIr zd>N+4lzL0$YGpkEM^7>ZXF4;y1!Z&Y6$yz*f2e8`(>qgH%;kTML;p?l)`bH(VzU3Y zP^Tk@K+=c=5)ECf7YYx{$+`_l8AsC}21g#BS<^Q76~S6#p`nd{9g)lPmQ|9P#Cuob zU?*cB*;iPQ6%Wc@urqZ&0RT(I{+K65tKOiN@rm`LL>>Ex6c8+zMKavbgUA!jLS4k! z!txn!&~AYZ{&Yr~G6cWI9Vl9dN6a-of(Zb^>Kn-_wAU=i#QZY!aGfZT#79l6Fyb^C zRsq=Nj0k-{uU%e|z#B0OF*;r|7{He2qM?z5*-_C$-U~%e1MK-7DP|`Rc8meBEPUah z@vBg%AkX)jev~?eximCs+UjU}z&>(Yf>Qi`rp7N=24k#3iJvUF)YV`@!ual(D(VQZc)m91uP)#=_0tVHA z{z%LMFs3>EXjQ4V&2g}B^Nm~)!lWjeb5++?KC4){vN7kw%aJ^J#1(T}!IBAp3^UZ2 zBjd3tP(VoBQmS*g?5B`^TqS%rm~tpV8Nvtm#033FMYpmf8!n!4zC9`uA0Dsf^&TK! z)za+jm~N`1*82Y+X=fc(^}D8hx;vHJbT>##cXtU$x&a9hP&x#qySux)y9GsBQb}nE z>3AQ0=bSlnX4aWCv);d4h-(RZfA{m;ab2IQ26j}@hmMrJwzZb;voD_Y>+t)Uz!SJ*ev0!u+9aE(t**)Gl2aipQ z6UgN&ZjV+utQV{bxnBjDh=gZ))BL%;6zg}e@GIITXD1b`G`!7Rz^8nQ=WvnMJ3>)) zmKN>i7=j86rarX{S!tyZkGCzse zz^Jm&v^?TCOOTUa)ueUx719fV6r*Y?i6rP5z{_>KMDhVHV?OX3vy(Xn3(k`XIu~2Y zrZO<+GCqx7!6IKs8x;K&rc-62@`b1QN}swm(a=H zzbmxv($XBUnL9+ZY9s+m^z!n~yK^HeEX((QW+?pA z^LB|;Q&u}}NE7Hg#+a1)vhB8K4=n5lW3p)>Xfjgm+9oyC^0|~uo^!^i3r~I)E=t|x z#p&}WMT=#K1kxxjCqfhXnx=LWF7fP4ZKx=BW)>x?@>lJ4g5A1oj#fl>6TT7GOno#2 zjld>@AyRaqd^Ob|JGoPp(OeOxYSjbNYv-2SE}4KSF}RFh{+%`WCIoTf z_yY$CEUFEtTQ2-fC$xq~mobyjy5>;^|fO!Q_1{6wP z5gk$F1@D7=mmN){NK|xk@`&}FobPbxNdsX?oV+Z{uO_pth*vO$Sx3dEP$Hd!L{5hD z;N)_p>S$5e-AKZg-&ZcaArp3cAydLp&h+^K1LFQ8S!y^0{~ML}{Y7y#yMFO3DnFfK zJRp3$8srQ%qmslQQ!a%ShV>q5nQ@h4~_~8r}Tf3Uy^wz_D(iE4L75dJl^s7tP z&s0D%$q#V*HPJKiWL9EX_^I3B(#{6K#ktU|K&k*!|A7c>%qJA@*$WABHOp+UcKGg4 zTlX>Kk9Yn-naS+gc+BjDxTyTelp3nHW9xR=Q`ih;DO%DxY%0`Vfx>j&>@1P1IxdQ~ zsa=&7;XiyXDwD(>6zCWA)*%eGWRwCE>G7;r@Q*xCTU=}5;fiCQYb~)6^LO zB1oSw44ox>?I(K+T#wVIToKup_?w0I?<|M^`bRJa!dU}h zRRQ>|O+LpwOv1y#$XA_i-_%n}$7&mg6;P;^YImx^ghlH1#Pov;PP-qW%(MJ3=O@^U zC7O>VzuTYz=r`JCLB%hCMeRGbaYlhPR?C z>NIDH?j1XY)66@qNN&r|trWAY-Rh~_aw#)xUFQ^@3+?poa-`ot6C0c+*Mm605b;rH zy|n)!FNsS3GJimADNppnc{Kpve5aT~6C06fpKug%8=HG3G?UX!ioleyvFk>GP$pyQ z%PvndqT{kAp=rP5EUb2>#b17v$X!t77^Q-4k|4jJ=RFlx*|U0G=^-fMbs0R9a`Yet zvl?Q;fVjITh5ih6;aoBZ?OVl8siWZxxkLN0tm_Ska%bToU6KR$d6G_^)9y6tou+pm z=?ct!HSFaA--A1%M_>5UgP|u*UxBENnjlNWeN;!X#%O(RgPY?gs7_D#^kltKXyP34F$0|6LsXpUc%|e?P~8?-BC?SaUeP=Bm2Dlp_xb=wROX%e)mLa(uWy znn8eO%Lvmllj#bh4C-=oMPji7Vr)(cZC=hde*gBympyP65-%IQF1qeRS9+a5x)MPS zNP#X1RmX^6panZak*9Z+@~0r+0n5QfFDJlOo z7#zHj45Rg#7=8c&OF=WlzwsRWC)a{}re?}~krZ>Cry4?7l!!4~XWgQo!Q-;;)JzxU z-E6pYxQxtwZN0M2(!J2{q}dJ;TZpNzg3!eLBDEWitn{GNar`u#QH6@4AJQSjv>X~^ z;=8jBTh^t2MqKfA!;=T@n*ZorVCXh~;!u1TQ}*l(d0mW4?E0c~4s+J2C)_lyuRU<_ zj-Dm5XUVf*HE;^--b*WD!y`;VN6)32ILg#eT_hhM@ zQ_X+Duoqd6|5Q3^j;*fq+i-;d{J{Eblm9pvdI5C^Bfrj17i^&%|E;DNtk*vp@Hxf} zz86Ft{Exyve|g-Ol5g@+WT`}gUmSHE(L4id3u*DwN}aO-m$Ed{3m})%L8sT(zPdft z>5Y_c0rwg|MG}+@&`@Fo9>LIs=&4L6TjMMt+62vi14FO)+#KY}MID|XW2U#cd9ytV zAy5YivR{2Q0g`-{Ffj6oP1w_G{|x+*A;4%9D)q?+N7(H(F^is$?aTCRD?IG|>5@8N z`KV)PP_+J>sA6`~^^l=qUH0>A$237Fk@Z`jmME?C2OlyXB3owN@+amPUsl#*Jcjxo_4@8{P3SCCqr*pJ;bJ8=* zV?@scXL8_)xZAg9MWrrXc5qsA}-uR_G(u1eT`=SN$Ytno#*)u ze#iJJgc~nKgN_~*L-6gEx*C8i*h`<%fQ_!U{pVV%&j=?lr*8!8!x8c=gcT0&3SaW; z!jSTx_G9hIADD|CZEiLFjhBvu^tchW!s#~`YJg2!Jv+{bOqkm$KdZ0#&rbLMXi5I# zvUP&@CvcGNebXEUGb~OEfYvp1_OZD=@Avb_um6jqv?)}pWyB^zd1iBG_4QWlK-UIh~<*b zF26|Y@uXI1m!;lyXUGhh+KNk;&Pn~ zMJi+PLt{f5qzyqhk4fA1Pttd#G*0!r3Y?pK@vS0;R+ywpXF|WhV)YCyvs1RrTP5pW zb$$K^L--W>b#PVJN(rw&EC$pRO{RCIJ(0kDEx|`?w*0yCatOZIVlU>4j9tA&7&Cpq zj@1haedcZ;I^2i!I+5yo(~&3l;Mu4<-jhT1#W_}kLmgZS;qy3dBTTV}eU?vvo_c+y z>+2Hb5{*zsPIy4tA3__#P3e$Dx8#w$LKV+~5=-lUeeQ8bI6futXgi|-KK#|AuVNpj z5Y&#=2JFgD_zb3=o7K+9nikxh=C7P z6)jPm)!j8JgZVd6<2=Dvgo^G3XTKBv2Z10k=^;Iu^pHw%2TS5Q_IcrGJXoPW-k(B4 zeOQZCTc@)^5S@+7Di60TXNj|-C|v1b=Yy&=3qon1_Sys8pr$9rmEC+b)l;cX$vtVH z=Fo2L4{jgL`}}c;!gFjQ^0q#dkBb@y#T*#S`0s$nskm3}b9NlJOT_c*(`x+!O2TBm zvI|}UnvRJTdG1${YQnhRjn(Eru~Rx1S0p6IdgDqC-PN^w&_u- zQoX|QD9>9|Q>A41?onMctp)`#T20>;2JN&ffZnWR4O_bK6GMmhGVsE7%l63U>sA;t zUjlI&qWl0YIKqj9+++9OMCf)gO&^zK7UpxeWiY(QhKAB#0m=8s6JkC7F3frwu*gk1 zia37-6k{q3KXNjg@H?<(hJ1CqevTOc$B33poW8pb#rOZd&%mXE`4X|5PBV+Uzfa@w z1ogH`OuKmlY}xZ~++SueKS#Iy$ql zdrN#=9L)VCqHUK1BmiJh5Ik#162QO4KmocWzn&Ta3i-u(pla9tX``WN&}`{<&i!&{ z8g{@uu@f2x`iZ2>eFt7OQ5^-g6Z0G!pf&Nqe$3LMRsqf^@3kB-06JYq3!dEYVh>DZF#GW$ufO{SU%X!f1wESre z8N>(szgDy%^|*E*ini3&i*aSpLGD%b>1zWdCB}sN#|#irbyG z9bJ#U0dJ7Xp(=k4*v<}B9gA?pEM2R_%=TRm=3$cJZ6%#KVx_esW0I5`AzD4IW=}q~ z;7;c$P$h>^rEpmwJ+-d_8c;kyE7EiTb7j4^LZg~IFMS{rh5JBLNwV=HuoG!39PF}; z2@M%YS-@E18=!It`7{)=FdZ&`!EgUi3Hum2gae`;6higT_fi~uNgu=c6y<>7b9#^n zC*n^8%V?Zg@K(AGrx>9-GW ze)bIpSP`b{3rcE_vtKL#R!Ot^VN%R~;Wf~yq5uaS>EP1U)7mYTe@u^l2*K3|&2Xm& z-h6SzWZ?Z2f(9ori6xDLW1SOIqMEUdfoD&13^=OtCkJOcJj$u2d9f%oni(+H-{iDt zpEd!T`lFgDc1+~;yb~<9O>w};T&rsq{-YKXsRDp1{S|(OKRrsk04!ue&{MdDHv;{m z`C5Mn{lz2M;PAk~ut8Bj`Sny`ga{smfD{c{aDSHfc?yhwY(6+}EqRS|D#l9r^yjWo za`XNoh6dDk|4jY?SYpGdw_t-8yf#3Ir$5mK6z>u*zteAx-$<*xBxcba%cmNQkEZRE zpy)i)M1FKGq{ITn8%fw}co|T*)4}=-geD;E{IE|Lr4ViPOmy*c2E$xqE+G4>9ZO); z&}_fI-pd8!E$%Gw_hMd`)!oA1_$NzsSmf-5b_=9MfjE=MV zho)2|(rih*j$w2N^jsWLG^RN%qzmIfQcMk2*#u4!T;XyHND@~xcm=sF-#a@Yjw2b&0qHDZWX1|3g!Bi(bOS~^nm3$ zkMk!n?H$)^YnH4z zwOuW<`mFm9K~Blv*`zcm+rw0gRrqd74U1a1&5m)Ck7Ru=KRv0sk4C@kZ#9~%p#S*` zd64^n{#xGOS`$k2Dew{ZNR$)u@OyYj!6+P(0Fd^?Zzj zN5+z;=2}5dYdlk7nyu%DPKal#2E7c2gB^KdX~7Vp+l6{8%T2r!zXDwZckvUBfaYre zS|4^KEy|R51FuTad_0KILBmMg{n=iElHzo!b${`qqxBBhpMAVN&*T)o2Q042g6Dnu zR@ggBK3tVoH)IOqTWTFzL%XelIn6)LqrczPIIajzhC_fQmndz{aH17S_FcNpIwJfy z@W?X0n1Qt)8A!niEta>8rW~H{9eDYc%>pR#=cMJ~e&UH4 z9|FFlMuV*m?rzLNRp)hSO?RiNs)>ca)#YzoW<%&_6lummNu=RMp_CSo+@o{Zj{#A_ zGn@Q!1hoBR3}5{D>zRcWfHeCqz0vVuvR)h>`~5Z`TwGnvu*pVxDRnjQS@f(jPrSrK zhdp*#A5^ie?Rs}KXHSVf&I93cH$cL8@{%mc+r$f0;@l}U)aAR$KLq+x`7#=|b114? z`Jw8j;pA!60>wjwAuVcIa}h_Ufsjd*`stn6>g3I-=M`-&RzB+y_o3?HLCUP+lhm}L z@cHD^aW&EMqh)$0Izy;o^Ou?XL?h})?{=p(E+{6*Y>f}y4C-t%qIB+vapECl%MPYF zJ6}r=)YOoksR-D|f4h^w$4BX#hr;{Ix*2EV67)}r$Ntp?;XB#PmZ#9-#C`;VsKYH} zVtbO)w@%;S!oERJar_bP>eX*-+36W_i?crhlhIMbCbM6P)V%jV8OemQ&thmUxkqd|hEdOrYyFF_kBHkp64^Kud zIPn}r_XnR?4M+FD(b{gHcOn;Ya|64Z*{K2WHMKJzeVU(yS>9d&18(Uk1mSgP3LSf(XhK8XM zne=dctel0j{MZEwak5@#-#!h>t~b^mNTyBHSQJ&q1-1z7=~K|I_dkZ~s1H?z6z~uo zI&7m7F;!pT*gx-IsO$kzxC0tj&vS4ECoTegk{XWq-1dcK4ZT;x(^iqH2ht0C@Q4R( ze;pylLdOlj?*LyAv;1GDPW-q6p6BT`vz$E>l3q+N>w#JW{{wOq0Z02p@BHwu&fHKx zZ0yP7MaK(f?l-&B{7*yOLc?yaj);L3IhL#Y@UV@CMDbqr^NrWl3BpqzPm90kKleD@ zNHIQlNTdw)4>ZnOV-Dr6yir|A!KVbCDeCFj9*{4vs*xk0tE){0>nkB4BVReP6g16X z)mD{+(Ja!)AnI5Gru{m@rnx&UfoOD)Nhj4*$RghX%v&+3io;Y^qogBGeuuuBZ+DM- z6t)Y&#lRs*p?HGv?{HhOZbj*&ZVszG24uuv`v)yVV;s1jZMU3GKFH*&%M3k12n6%z zg)No=Bj6zmQ2{%~;n8EXiow<&EL}T(Rga8dVmo3TOTJA6yuXV7Tan~ zG%8<`r?KVEZmGtZd-~xq*?6p#`H8SrQIq*EXCD<&>75#PS8i6^>V{|4{a^9A|auKL@69v0H%6qKoBJ&=_CTWih6Z6 zL=hLKS{(tg;G*=5nS7_%S2dGAEhFQ5ld$m3%Jb%n8@D)xuL>z+VS@gxpT^ya+VQw6Tzh!>dxMS* zj}F$>GQ|KA*3}~@qw7Ja-#0?>=eTpK+X=&zVPoLZh!~S{QEjT#o5f0N5{HAB@(!>r zFjdoB6dcFxImCx>tdaZaa3<2LTuVBZHeN3pe-bvyJHAcTKBC+IjWRSI=Bg!dB^dO_ ze3@WJB;1GB{e)JmH`l;KgeJ!^^=l_D(wLLmIVgLJw+-{nyzdpE#`Z~>MorJXuZLCm zDM#a4cM-~u##_=RhuVq}(YMMX3RN%kn?cl6u!o%Z@xJoXsl@OzI)WgW?)lFRtecdF zrz``fy|k>$?OnfXRn&=Je>7;YEwHt)TMhKBe(tbxv44%dCLA*5J-{TgRB=I4bu$Q$ zed)N5+>^Z0Cy>CBdQ{#^UZrYf`5zba-=~e;EC|^t?|=Vz2iQDKD~7r;UrgTTd|HZL zFzI|-l{fcoVprI_UmsvlNUB1A*a$&H<3xUUd&fFX>7U3c4r{r471f{Zf0yaZvt{d& zdl#4Hgs$oI?62mjnfb5tON8k>K*0TETF0PEzbZa%_CcSK|BFKbWdiaX4$!(WMeblF zrtYY^IWyoNT7I%wsCwLGH7PVzTRq%MF{>Uf3HCLv1ewhnZe%rp#o=3QF$BV5 zX@FB?Haar*qV)&REb1;OWV7+Iv#XN(+EHBWx%!|M%;n0UU-fv#pq*cB<9~>iD!1|X zYxKOJINr{Zo9+)z+P?f5eVCKe^F%8&Thz{nwD^ZkU>hW(n`@BHh=n-UNpW=p`8le9(W%? zq>5S)X7K}^xYGa;UJ%U^GQ84pLlA>8^l450t=ELw>k!Lw38VIsWfaQNni0B|5aJ6x zDB}Hkl-Ts$2IwGS2{NU|doKNswmvi%VOZomeyR~LxO^R!nl+Y{#Njv_x>^S2?M2$p zq$vFpwY?xi-k5t7WZT|sqkt+s(`t2dPA>V}Q$C{ZihzpO7=(HvAvYpy#Vf22NI^x%Dm51a$r_?;J0f}tkJ*61`p@chA+ z!*<+EO>9}mhTAQLKu(DkAsuBPB;I?v7R(RArkTZLiYO~A3|x_3E8xI7#34|v!Te)C z+s*gMk38qn7RDdEYnTcq@jHCNXhF3 zTUe%2--o99XX|Z8l^i6z#des5RZ--^?EF=kI3OxWoh0Dx#xOf!u7IN(=q_t7Z;n`E z^Ibbk1>#SKWAZe=NjzcY$ZOc2USwz$O4tT;bu z?~UQCSd{xD?Xx%)hu-m=Q~Drd0jmL#Ag<|p4wH6TLZ7>eNuG6!IFV<;QrRL%fqXxF ze*Z9QdGny=ZfMGG5Sb1u^Kp$mo{&V|v7M`uU5zv~rx29I?iYc032$`viqU;EjlW5E4Y8K~8ZK}lEH?Yu z;D`uVw@`1x#9cc`z6ah)StdvEuE45y4C9t6LFrc}zO(q6>1|5`GYIs$d&zY~ zlgijn0&7v1!z~hF73(LmG@hR!Pk$IJq`YS|ls9={V4xid>n) zy5H?DRr(+`VqWdu>#!o(<=5yE9@E?`0?QDZ^BT0_1OTT*q#hVA=KErz#yXK}+DF{` z6gWm=yt4SU@w(gOqP~n`jb+4dy?l}8O>tan^;S34<_jq=mikcORz=tSwG#8NFl1;3 z6OEzBy}#Voe6a&UkjDmQ&xCP-<~Ka7_@q`}qHs}g{ejLmnAp@y;gipPjVjf0v`b*w z@ClH9UC$J%QBtz|PQz&8ZqV#hBNB2h?0Pq?MZOv0-W4VjmI%dgXsbwv&Q&&G zJZt0y%8BNaw~;4DQ++enOVF(0r6PG4=p{qseZP~8d&r|^@lG%3E8 z+ZnwZMrt0!m9}?XtaJRK+6oSqYuZQFvV zdDQh<_kC0`zdrjuTBcR>32_j2#1HoPQatR!u4=$8m`;paf{~o}7r8623FrW!x5dfi zR;M?zoq~(y8z#o4e!w`sMf4b-p60^=5oj z??1b)Yjt1g%g*q2iM5^Vp4v_qGZTiW;Dhyh5o8nrw!vmf7I>add=9q|pP_nP?^wz> zgDC^@&nBr)&tNUaQ@iky;wj{7fC)5%%u%eYM&*#xUk{X~G9Zms`IQy_b_JD`iJkzE ze0<}Gh@}e)`9xux6AVI@9@slC*UJ2^aM%CT3@sqn(^)-n5ED=P_Cm$RZ^`jX7)Z0E zcW1(X;V1ak2PgTH_{uXxTDNecx~Mqc=F{0IF?Iq#HjJb1&=UHEo?Pe9(ZDKbOlVyk zc$HtwiXR#W=lX?*6+zq_c zH!i9uNXx=47y|AwzeQSS3_-+y3~j(7&=}#eLwdgvGb#MvEezY`U;=sYs23+2;zFE2 z%c;3CA!JJ!9TM^$`lpXCxE&dbES`4B0an^1`nx=!*3u=i-$k(BjkUb>RbLPd*|!}$ zMTfpfHcQ_}!NOY(#$Au!Qm1LH4GmzBN*NWT59X5ixpCQ zaryjqaV+nLJ8bE%na25zt0Eia$}AKKR64LwTODV;$fGp{ZYrj zGtJ#j&c^?vJ_FZhM`B9Dm{sq0^)!hPKPhy9`mn_Y{F9(UW8qlV+tH*h9afWD^m4e< z9`bkET5fxkCse4iw*{QK_^GAH*gpJz;-O9x+86i9Qhrv zF+()+p5p<$LDUn`YZ@LK`=R#(%{wc1B``s0CTH*&8aU`q_nXAN1xW;CBnd+iH`0Ij z%IH1oj?7owQk%pVWJz>21vmXWe~&Pj7Dv!QI850BJmt#K0A{$ss`&*8Y;iaxze9TG zM?}jto2kN3V2rtLF;yal;B1ejXe~z@Hk}{vwk2}@XqCl=-4{<2c#~_71cVB>j-5|^ z&;0FS+$<4t!(k#7L0~4s%pTXJv1(nFNPHQ zqbyb|#!<_J5)dqZ1*XCsUqcDI;ajvYz+GcrTQ5{G(rGsJHKqc)IQHL|xQ0GJa`U1^ zE%mHHTc5y`!})_8ICSHEC4C{$0j%gf?`pu@moXy!5$$3L#VOQi?8l+rgq4H#j{`5n za6D7y7$)92;5E1!NSuI_f>^&qt!M`SuRR|=5g6ca7(+E=z47p(g>qB~5r)B!z+`S3 zLmdR4TcKYg+m@1V7#%KQPJd7c!T1n}W#13B1X}qs0Aa#(PytZ`b`VkVx^h(kNhQu( zJVg@PR>>fv0TupDJ!yOB7g;eH?n(l@GWia=~Sc+5wdT=A8 zH6R#myi2;eiO7FAZ2|)n^{53pX~RQcUoq<{p0STI0F%&yx_~hKg3-rl1pgSXs@mOiU;?96C zt&+^U0+n(}UuxpZClIoFKMRupaV3Wik9Uj}UzoHC<1Ng}08$9C^eekj{Uls=?SrII(|!H>!@wM zyh49==ttKe15|%Nn=lSqrj3!Q(kKZjUIcH_)CMr!F;@_EH!-Y=U5AUWw7>CSO9f(B%P<5`#Wbo6A^sJ!^B;Ple^%W7oVYL=UkRd} zX>g-wK~Q{vYOc?nP_9`Y&@s!GfFBG8RIbu7FLHDUEX8@ku~^yOtDWxGsoB{N|7J01 zFQ#=@RYwqc;keWcxaAUx^s!*gQaBfA?kqL0j$rsIM2h#WMb#PipLa#GD51+=c8yga0=<8Maw7tJMzzx;D1&ueI*)hWi zY_Xln;CZXZA7+yE1eQ4zVM(swY#f|TKh%+;EY(Rvs6;1XPuy@BGz#>ImBSH`tUPSc z^J&;H7hamAsb12>WAkp|F$tM=3KZ}q%KJm6KkN%YCxlz8=;AX;A42eppllNmH@Drh z;6Xfux6#WvbWb-C{K*2HUpg=V|2iSi9Af>3b0@Z-^hW4^0mW;yt$Q}qf6&w>ra^vp zcD3CW2KwnTXBau0WQkhD5F*1DVs|dJ`=8bJoPjF9q@@q`4VAfCX%n0$uH>-1qh^f|1AK?ceIL>VA9bnHwyw2QO*`O~Ib zg;6yUmV7*A#7_8~sPS@GiX>IX{=- zm}eGE(Gz=wYRHBl?*il7>wi3ze>11Lp@>{Vk^N1biG9F6-zfU?zZLQ3Q2WKbR;aZc z*_ZFl<3vrF5K=%;#`$*GQsg5}0A2UmEr~Rruf`p990=8k3|y0qI6R@j*D?p*SE5$Pw1}8wjf^hW^09(C2MtNKei~k4|pRz60E{VSb4TR!bc6RYG zUes!4zgu|9pWoybL%_115j>WgZnU~+lp#+sx&kMcJ3On<0z5?S-{1Hh!#?J$hs>E$ zmZMgo7Ceo709#91Gq12vIA`xqSoU`dFcgrM=V$8Z3c7caL5mG`O>8+&jt_?WnPYFu zbPwEM@fZ*mtR&j`5ZB}LZFMdJ&Cj%`@wGfSgP(VZ%xo_6=UY z5{kS#aG=(r(`Q#aO%@lqx9XMbmL%qJU5W931ilCj)?^pQ0u=*Dmn04&aqP_g52F|I#X&> zt;O=EL#+5HYdr`HuM~W4?CA^=+;=9eRDOJoV`v&qWGl<^Ehg?BEy)V7#EAGz`|~vc zXTuS7r_QNRK?)8M!IzPEk@swnD??Bg1!7vGdmjZC3zA#sWp=>PJS9wppU?tXj~4IZ36@iF+A>56nAS3|jmDV$Q#0>pkv>gLSn-iG-qX@h6F z=fHD~)Z9a5+*-e|Y!^$EfGU7Mqq;R>q4r}2@pKptuP`H7+7{==+zi5#qU|OSr0XSU4mJehG<@&f*L#6`W5O5|L!dDqkW+WpM zF+3JDhH(n&UtYomv_E~WKksxa56`>ydZnEWN~+a5?YomY24EsLxL0{cSk;E$c?g(@Ly*{8CJA ztdACS^lGy(Q~hvvm31gL~v?8v=P zVuCQzZiwo+(_6&rGgE#nNY-NcRH&7ExiGa8qF9>~$jxY%kPB{%OLvD`3t*kq^2RkjEO%H+^*%>1) zT5e~Ot{;iH-Rk z>`CyA+n%$73DPh6u;j3H-Y*t8*+4WLr2B*W|8ge%Yb~J=E`D{=6#O_FDDb17L?d)i zsg?#41OiGgPKhA+nktJSx6w={Em?Bnz(r7V?b($fE{H3D3<&XAT7Gn*b_IO=xr#-| z?p&3lcz0V*#Rt?>>i$$R1g98!#DN#lZE1hUjW# zzJfwe|K;jrVCT`9ICm~bY0m;QRs~ff=CMm7Y-DeTB3E5SbKYDB5qn%lSmY;Y8`gvO z=`jZxKlF5Cgq*XnuZL&48qAA{K+1!jSpWA{*S6^wB1(?VS6ACsdYCzv*L&UzM^Xa} zHN684BS7Qw<VNj=Gv89knUus4~mdVfqU1YkEZ4c;@Q4XN2h z!xk-7Q%37vZg&#(ArvZ(4oaD8A2wDM~BOvt{D{)QDlP5 z0k~EQG`#gpapyXABwY`kpLg>sRahS`Es`ej>`B#yD1alj;W&lIR}c|(q{EQUG_4Yx zaQanzy0fK!YUYND)RegTc<+rXZWU(G9qtrwkd)~(whqW}kbT3ThM`X-N#OxpE!U;e!LlOL~YfM6iq zH40~r!1a^2SpWKw_&5Gk|)9*^_kFN{771*u*v**W2*e zPod3l`Q8h}2)=D^gq~fo8Lja@(XMAo=SWRWh8b$Nf#pNJh5QXpw=>FzUjzsk{K1oaRd3tND2RSVa7XBmi zcsC?oQ*>?ZBovIqLcy%yIs!S3RvO@25o1PuFU|bXObeA22wk?nh=OV(E5O#>eyXs* zRxeuIUvxOVX-QMJ&@&DsfQ7U6k#u3gyjw9Cs(fPBViwoE)FKuPddul!kPTRV5Tie# zw(7BGKSK$WnZ>*&7OD`o{$wfesvIQA0IXL(2!ol{Cl$FQhjr!&ewav%=nQnH(_}Jk z4TNw%8)O*OYJ6=YV=a3i^<)21!2Iuyp{C z7`i00ASiL!`&Csu+;+J&rFu#o9kYmBxDg+cCy_m#%uAAHvkA^@k@I;PL;RARq-nS5 zqYwrP9TEiVWjHY{@!=pNT3VTC1kmZ0 z4f}&@UORuSK*<;X(g2b6TPk0fVTM#Ik_}mYAE3tX{hlcm#8=jMa9GaN%r}Q7h`w3N zr>5Q=elUn;@AWT-Dw_X%wPo`P8TNF9L6|u}n`lt!4gK9TW%982=4#I@_5mR-8WB=C>w+D8pVx~xW!oxGC3$Ka!xWr{x`4} zb=g@!zL!^vRzIdO&~3JG&}v;~?*?FO9Gie4AXUVrk$f5|~?KD^l1 zt+gJ{W zRkWPE)+9>XPp!-ne8Vx4intWr-2OEVQtpvGff0>e&QGbH zE`blM6Vtc*b;gJ&m9+F9f4=lP_F47Dv|lXI$ZMN3U5X$V96)?Z}dnO{tDzZcX<1J$6d38828_-1z3qx0d zX9U?f*!@~i;tsE?T7kbQW$+chw_|-cIb3`vZX+cM4%$gbnwal%g|ktjM%kZ0Yojz? z$zZu$6^!xJfdGP)YH3pSnZm{c)EL^S&=@R~XplNrt#UFPBbG3$|32U~I(KfIxYE(j zJ~;wdY=i~q%mYv#=%&hjO}|pgS4>chd8t*PxT9TOy#(rgM&J@FUh~^W#~jNU1@ku@ zN^w&d4PnqH!CLmew4o#N=^2F)3l9Q{N)~D_fUa^OCt|xcur7;J}R~u~d^ks3hKOR^|}r#*|%gVU>rYsOoqoAN9fK&V*pz>4z*> z%y0mnMo#W*iIx_xgI82-UX{6WHU%h(5_Vo;Fu9MZ1i#xHT@8ItQn8&5s?@SAu`z>g zfh9Mz5^h|C(0a;rF<*&nOirg0|K2YcB9-B)1FlrPXsSZD*y<8<~* z!(C)RnAs-;Z$JhRagB=-rg2T(3$j|NHb>&*4x{(drw4xCii*ShKfb;KDywZ>TRM~u z>FyAaZjf#PNdYP8?vRr1mTn}Z@uRy#x+SE$K|1^=XYX_Vd+xpGj=^>Sn{Tkb#hi1! z@AE$4r~+a!rxybd`e`%WI{n|R$3JDT2^<;vH||Uo$Lq+OUNTuL?#zpV=q~EBqNr;l zeqakqDf`9A+pWpv?P}_4=vgjk)q+pd(OX(2B5p?wrZf{ zPduj%Eu?Q|h&C9cR>0wGxL9xh?F;xjV}M*w*Xpt=jnN9=`;#=6(- z{$A^O`2i7$kfegV!N>d^;q0W1j z5C=W|Vs@uW-=c_W?H~K-0>-8%&;^PQlED=k6}7d&hEV2gK(d|#TZ0l04lffMo;BiP ztd2!Q+$jQc0y3Y}c{hKPtqDi)#7dQqXg&NQPsHT;dpdxFf1#&u(YWwt@s$;o4VmTo z%Mwg;;b&FCHO|LXCXN7vC`gXxfWe{B8~Zp2wCNyXH!d__GUS1NvqCM0&*f9XF-z67 zfDQowX+lI{D?4xqb)O0wrP(_+O|@4l6qLT+oOUZ@iIyPdKAtm&XJUI6_{WA9W_rjD zWjyjr*H`8N5pF+nh8iHolCBDC9^8aGrT9!FB}%W6(!;pbDl zzxOLy+Vub*OxN+EICI{*t+gy&qL&?`fPn2o<-(y5nLvmMP` zQdTz4!kb$~^sTSICQbzQVHoVDw=PrEl8@$>I z?@J8?==1GAR9mCb+fd4ppsFT{H8GbBR(M(sPi|{O3x|1f2#4KZ1g<_i=6iZr_k9zU z^lI;qbElO7tboW02(skEA+omT?C%M0<sPu@lj{pft^a1j{U0DCqBt4YIJrt$+f*9c{2&6?!+xz>hIj{T3=OIu zX|}JZj#{o>#qv2b9J+G82Y59li5H}7Wq8!DEJ8>mJ*dP_C+c>pL_-dgE3}o>291k$ zV#tv|k8R!=G28*Dt7L5G`jYB~*$1K|fFLkg46#`X8|WrLsRg&Cz2Vu?3Gcx~jcR%SodXu9$=Xx# z^{z}?2IMQuOsWn7^okiC#e>siZvf5!HV)ZOv(*+rAH^OL$u}gtYj@dk;8bEYa-sQ6Wm4Apu>-`GoISVTc8V+mUO8`s5`^6nY@C-BD zn=;?426DC62i6RSNLWI+0MEkxM}*+bR+L`L$n=b0xyJ z99-qq+US6=5HlE!R9#B;1s-erD9c<=0{w?j@a+6X1}+I5WaXScM-?y`eN<2MS!#5C zQWInPham?8tnwS*twf~`k$~IV7bHX#<~ScEe*)n&HP9SWKV^5L67ghDFo8*q+g>rP z1mIpV)5EqcLd@d<&>}{RXpYUS{qBR51wMyaC6Ciij3S@|qRayhp>1g0pDI`&MO5>W zLvX0fCcQuDLaS~Y*02uuSa#pe00A+tZu?;@-yPfnlj5APIw0Ky!81NZLXqCe=AK+Zj-n{zIS}K2Uz1*t%`{1UumF7pw6<2~3?^NE8q7>kx zi6i^~k+zzvRDR?t;seKqqB%{cX5Y1A9N>};UXs#AYilvyP0PABZ^MbYK>(X*7;2_| z9Iv8(9iX~vKx&B%&MW10BBQU8k$btydA)0Z+E9zzb$r`&+=>NUio&x9b)EKSn0LnM z!Pdk{eoywqMRi}I1Oe4dUzl#RhSIo|8Z^GWlgYN_uyCqqM7<2QzZvFc?*XLjk15`` z+`ruNQf(R3z7^fNfGWvf;^h=g^1?XiO$EPA(CO4y0?H`Yc(y2v*2sLPz#6yN=U0Mk zbvchkFt>1LutMzyJ7YNx^7qsrNR0}J&sURSj);@5$XMDIH4<+Cu?$B#ZE;+~p5vek ztuDSvm3=YUv<4dp_=9wAfPG1Se2fB<-O2VV*)s52 z*z z>n%ybOj7}Q2ps_T%KJ2p!iFfp4TV6u;c(QTIwE=$HOh5vUoFMAHGIK(i!ylR(rieQ z#bI83eKGstBfl*UFtpIP$^)0ni?fX7dhU%q=&@5Xt2fz~4@jq$4zsQ+_Q!g^QQo~; ztlGM0M3SQSx!pB21afwV;c7`@a*{SZdfHi^i%qvSmJY5H!&2&G8APbXksOl=n}z9p zPs%9AV3Q$GHx8`d>8UvGC9{zhIWK~~rhJB_ZqXsUadr(qI?9TDAM^P>P3bWhgqP1` z*DL8qe%{s@atD^n4!`D%m3$VGq-|+L7LRThX@7RSK8j4on_FByLzx$ir3ru}Iwyd&k2`DEef+pCS~vkdqdL{P@zu(V$1PQk}h zYqE)}ED^TYV7+@iafK=BhdhooI`))HN8Sd$@nYuvRO6_VW3|*-I@WG-;cNGc`>@|pq*rAh*b23m6`rkYeCWC5 zd)tgxk-(7YQ>c(uFuUm%)pI8%5WM;u(&)U;5GjsLVnTI{L7ySL&|Tu5JhuNqWhN)1?PXbCo`;U5tIEg0@)GrOKHG4lNzKi zmHnz%A&I^+2FD#Hn$UH2sy`j+B**NQUNhsH`PK5`;j{LmT7}Zx08c^Zy>}N;5o^Gb z*47y3xaBHy*%iqxU)sI}kH;>%oo%F}TcJtC!)CS%JL{>E`S&N$fBDK5yXZs7=c>rS6?fhzKdaQgn z>52{kCuk8FqeeM895ObmKmYu3OI>XC%VN;>O_NfKMtyp?;Kn|krGJgMVASWmA~jSS z)FYMB=)5jd4BQJa&;);HQyFkp18KunY!+FEF9Z(i=jHh*?VeqwZ_GGk7beU%%<>bg z&uZYd!G%0<9LpEN4oW4H=ASI=i=Q9n0kM|vlCGbDsfcRs`?{lox?2DCaF6*GNCAhF zKH+oeAP}c$Ad==gr(3?r%*B?T0U|HqZrCac9eokKPRMgzkGH9Byw%4NdL!_eK|GtE zFRR%fDH8Jv>0PMIKfEiH0wHzZ4zDj!U)EE(?P-zi>SuWvax682B7i^-(EbLMY-^=NX=Sm!CC&m=;p>c;J&@ zwOzJ2=EL@<6N2@f$>njQ)@~L0!r)7J3&&IXuZ*bI1`nQX+5ter%I;Z7{VPpv467u~ zfZxIVTc|7G6oSRlG9~3T^gXES;=OGPHRzk(c}l$2i$#>iDtj+nG-0{aSTlbOHSt;P z#P0!A73u*pC0Xu1#6rMga8!!XA%~Nw9Bd(m?F9lCz07)v3GU|9;9?4J(v-q*QMX)b zugq@(_L@U;udPK#>@d6O{3sIL^ZpND!ZUTn%8+ILS*O|Mkl-+YCtC2bz7@6S3_Ogc zg1y+SetaqG1_e>VB%n#*q>TIyCN>@g9i$R3!agaGNXFEsaYi#FoL)VV%J2R>4+?LY z)-jq3wmT-+O}?^dR!rrP895)FQ-@7k1C!a(t(UOZhjkx_LB1Xm)k;Y88XWRsz8J8_ z4yMpHN9g)IEDug0jaOv*Oz&~q8io#K_S+Ku;Xrq0@=&Lt zw5uJEizoBO&2oWh+;)37jnQFy#Cks~;YyNa`)$Q9xw+5SL6p4&T**e?ft`~OR-zxs3C)lRq(J`cN#4>Rj_G!HDm-{xc%%zJrs$~6j zWbtX*raemNhM?gm-l<|t;7SVzwJKvTPAz|xy~lR1k76M<$WP_DKgl-Wrs)%n*B%Da+KWC4#&!FezkA*p>eg5eM z@HJhCxQ&=Yg3R|mb=O~4eQ zTYkT_yy}(E!N9mxq;0?B0|?I*8}*x z`}wD@!H8D!%-sgG`xH`>h!dfTnOo2=12k)C6 zG(vVO);mC=N#s5$`q0*DweZ`b+3-NL(mhWhEjYh-y>xH>9tH}9piWw3t*;sBGZn{M zzoD?lg?t&+;tK~YUtIDb+A%r>=rUeV94hDQLS`=y`F|4yCc%%#<%lg`Qex$O$RQb{ zfbZnSpz0bX)sEa1diKfQr!yRHsEz~e=ht16X6?zGs<2OlGR%`87fS6TR1TE8@QDaJ zC)!IU%`pPC5B^rL9XcOcJUF#3&pl9m?@B6KX%^f`N;Bp1|53%3W-qvKPTCpO#eEV% zZd{Mz-!O@Rb|^hmPE8wYZ6CoNVg_S;pFcwGqan2PYnjh5zpJH(NY2>l=>#`jIy7yu z{Rrcbf6d16I19?ivRDuWS^_B(v(z>WeQEUT&@J$bQM`PF`#0bNYH=78&u->L%*PJR|tZ@}ZT2`{m8dFT{PS)hNzFCkkgYSJaDdy2>_B2cyqWjgsKBRz(YI z7A~W@ydcb2YFuX=J}58+K-7lntgR#QOijIpNQqD{{tVK0Qy<1-+9Vh*Qx#qPMlZ?J zTarT))C-GdOcK|n>2}-mblwljc(jxIY)Zz4R@y*|4)E6BCfudR_I${h{$+7f;B;J| zA~>clbqjP@D$%fg7=ga%((IZi9IbI1X)or-12(<;_v!vu%Jm4@St0=M{yJ-)lhE;F zo2bqxa}a;v+!EmP_eWK5SMy=q73_e-W`pq{Y9p*6aUk#9byc+SdVjb#qU+EVoE8mAM@}6>r!JOB}w}RmJQdb z|G7$(B>VJ)gbA61VuE&K{!GlwI^(4fD%NU_Zd0u{EGID??DN>ry9K<pLk9B6^0J%?3=I-wYDHT9QzeBKu$G`WT_e~qF|&cwLL?QC zK3OH~JENfjJic*J5gu}=8?@9j>Fl2qRB9r3(m)?E-Dml!KV87xLHba99{uzbg%o}m zO^mEF?h9-bsOgx)5KV+j~wD{}qXDDoCU|wqPPHITq%BwuEnP(A zwe+*s*yca3H{zA7gj;>5A};~VEF-e)zoivZXxP*j=BSi)Zxv#8g&uxm zDG+#rJe?`G4m^K-O8>;Ui0FKAn%+<60Ev)uFjB|>vG9LXQ{Q30lOhJA5YlXCX+VUT zc*5ejEVEyXnOT%E-qR}H>%>MpPAjEoW1_UQ4AG6z`Au5ojc zx6mj+b91_nb5r13>XoH=16_^+O|PKw-c-eO5Oya}3pF@cpHwz>3)TX!V{dUuWK+&A zV#}FpJz%d9>@i+$^0TF$n?f++d1+2nLH8~rK+|V_0_ucj8S@aQPibjd_HY7Mq=DE$ zAF0w?SSf~2Kp0y*i7MjJ;Q>Y1O~7$t-JfS?+~_WOx<^7hK(sgQMok2AqvX^-f`oS2 z3i}5Et5>;fTT+n(#r=i}OTcA&1BpqgNUl`W{tedf1vX9baim_24CI#_x?)Z$=yb>T z5r;OzU;d#2?4j+K#G|n6CZ8ykDhJlLZS+K*Kh)bB)x;N1tMT(`=ANdnn+&O*Qn-7= z*^lasg7>P56=pg8ZF5`dhBqZPLL)!)>J!AAbarN2s@{*|appY?T*#>U>7F3P*Zl&8 zrxN~!jY6s5uI^7@r?`4GByVn*u74k_@XTeoc<23{8094b5>6qwlmL5`1+d= zZKp%z{X{&1B()F`)5fwbXlYU^4JAlLF$n_5`rV}O49RCHn;2L48aA+i7%%JsEB5|vuhUR(H_a_#?zsz2LY&CHZIUc z0!G+0Sd{h=oT{GO(x>X~rxK({r(oC*q$-q5w=XAp5U>!r)RG-vE`s6!MN9@*o5A#V zpNM>l(LCR-n<`s;VI{)1S3%JT-RjIB>T| zaGoi6!F^7?%epCdc~v(jQ9c4vHPR=^;bHp1N+I&6$)mCBc{!pzrLL;y63x4;e6A&k zCC5ycOeD7upA63bA#8kqO&)lwb4N;CdIS$Bw9y9I({G&me(p&LKrf zPz|K>VrhN7e3#`3VliAjQlfkT0h*Gu>g<>t4EsyxeOZCoBqI#|G2+$7Q2+*CAQ78E59lcOe?C~+RuN$MNu~Og4 z*rl6;$;0mJc39rIZ<{msBB&ING9v}B=%Z9S0HpV8z8{kAE&1@~EZ5!9XN~9w=; zJkuFOK$CL3Z>munL;T~OI{MyaeOjK9w+@MmJna}wl%Y1v{Y{|rc?D-_nq|e&xXCY@ zZ3Fg5vl>fq);?rzSKa)QS!`y^g-~dzO64gO>Bv|&nm;{mWFn#duLWL&xUwKwI*3xG z&H75i3EgaLMe+S>iOR(j4D`OG&oAmcuU-|8yVk9r7CgoAC?NM~#^oz!1eMAfq3D7E zyp{lFv6I8 zxJl*l;h|`1z}f}E{EFiYv+5j_2hgMlrJs{d!5E|JS?Du@!d;kTPNJx|2sO4J5iTz@ zfR;KtFPU_*X5Hrt7%Z97s)~JcN%#U5dkX47KK;-h>Tog@@Z~4Bd?!y7YEDa&a}Ioe zy+!4RH^*|*DWw#JeG0?D0uKd{p_=D93=R_FAs8K$xNXErVPjl^G$0JEYS=7NIvc72 zEihj3g7suqsB=W;7zkq2i=17sX_{7=EYgYsBgmpV+{Me|E86h1Ro1q-(BdWF;iu{% zO5qY7*t+@-iTiLbL7nbs?m#S63*#4&SWb8J1?y^Q3x)1EI_{Vqzlr=kPSo4p#i{&( z2Z#9SL+C507(z_BW`c8@-V%3PCbe(*)`?Y*?Ja}NXbbQWV^!vpG=>1lW&j$BR+U1= zw{de`eD-VGPWahN#3XvZBQ^0X>kH%bQ4S!Auat9P;U@P*4p;P%OiOvGRzn?m9E)Ba zTHwxyd*-ENHi-5))y)srNUD^l4Q+Fpz2dA%(*9wkcbrHYhz&7=3--w$r86P1In*1@ zu{n?C(BtU+q@yFWVEAz~Q>-bAcfGAPSc++h&{(=*gA{PPuca-TU$@bLW8 zeAVsG=iw?4l+`s%nRBwWxZdNa$P{rCut#L=gQaTrg=-llAinP9F-Gk2^cW4<|-jgHNol3F;A84AhWVktJ|W7Mk_kaEBBx04Lal?5muwpKHrQi zMz~GTeUP4o$mnO|g+IAZzpE^*8UrcP6a=K$%Stt@!hgU+my!X_g-SCq3g=xP!Jcpu zFynz)eVJMW$}uGLFp!m$gG60paU-2^jc16d5OQEuAnI~HCy4$N1R^Tv)tan!23jvI z@c`ntw0xG3Zd_1meQ2h!{o2|Z(Rq-%Feb!b?P)x$=Y4}y;#l3p^&z|I=DHDJCc36X zVuw@(CgmCYu0P?~`-;rbJ~pQ!y^+hDL}7hjd%#C0^eC=6#Adz~PtkL6JCW|VvJ(&) zwW81Keio3W^mu<`{O6Na^X*>AAhBb-JChaQVt;k%Em#Bn*zA1$1Lny}=hT>GZCi>H zkS-7Zh&f!nRAcG0tn{`S8Am|9jxwrMAEL@k_NG_KA4}?h;O>dMVtP8&!-#E~_&`~7 z*Xq@J^CJ`w%R;*f?^Sw@M!qGGoV21em$siuzf+NiHAD=i3LNF&1nqK|6eT& za!fzz>(H-7?O3`@Xau%-VlUsdBR)2JkI3w?kwRf-N^mL(RWF!f$V%$9NQvudh^4LE zY}GEXlgzUTjP`u`tv4Ip;Rc4AQPx$2=- zm+Rj=!-gtM`s$LhLYbZ@zgVnFtE_I}4XYK7*sfZrhyzTLRAh7-&gyhkFd9;{Kc03l z%mq6Ph71PnFW4|DjmY{lL;PQ9|BiPkq2s(3Ejesg)(RJY<Ikgz z4cmR|uup-nbxJMOYxYn1F7b4h1)K1c-Drts0hM~u8mbF|6RvUk4~y0<8E43|f?sZf zv@Y%Drz5s!Y-(fOwfz=;8#3$hSXM~S3cPcT2>?hK)+t~`hJYyfDe#t9d1Rp4z_U0Avr;_~1mM&(BS>tc#(jM+`WtGe3`UJ0FH(07up`GP)GmWWh~8)lCu6IgUNC!bs$0GLNY$5xa8JswNU!xP zO-Yau;^&br^L4mWHr;?Rj6_kPH#WTrtVA^ZsRydUx4{&z#S*sTEpOl3zRni5373#9 zPbBV-UGQIlH~<6i6LH;GjH5)Y@`(V^8v&$(bpHu*MPP<83&wUeTyvFin zfnuqR2HWRi8e4)6{xpbdi~JDSwa%HWN-T#2R++?kD-3^~krhiz-?g>KtPA?OZ`VuE z6B+~x?5E?}`Q+?ZGDG4q6+Sx}KL`X$19I5>aD?I1*z#p3LmBLX(# z9*gthumuQL9FLP5`L^YhlN&(p z+A)i@Ae}+t)dYOeZvYY@;d3gQu?aI8&J&e)q6^A$WIZJHhN5itRbK!`Z3WUJlJajS!@dV4mf4g9^X*#~&xkguh`^Hm4q#?+jQ#L4+&Nsx36=08UdAx~mU7M3z4%S%B1pz@-)#^iSa-fU z5{%khtQ+N)N(*??hsd_F`f*vh)E%!fg&?r%XRjhiFf!gQUCMUGKIef2BSr5E*~f>g zteE)07;=BqeGb>dr6#4|(4d}h&S>3+%7$+M@z1qgZUy;AiGWEa$u|dRP&G@8avY#} ztOf|&#j7iFpu z%EuQHLp5wOlj_!K2|*3K$b^Jq(+P5?@!`8qt5o5erx943HmyJFL`QWjQ}L*41QR@+ zN{4dv^l^R|2~`2Ob0w6+@U#VXFwnhGJakRvy%~RlyLs+Zt1!-p?8)QiSkB76C^BIb z{_|1Z)dX(d08X~0N&}-gi70T!b|8}s3LIbygQQHosOK*~6^io)(z*(m3IJx`9_F#k z$${|4L5+>F-pJOIIm|LoNMFwj`i3m;Gr>B5Ui_%t7qgn7%yp3tZA8T0P37Z-3<&=b zPfD=vJi73hlTSPR&x^AAHS{VSz3hPp07I%Ulq7FJd8wF$JMVr7Ydj3j)?Xt(*z17o zdk2y|&=t7|;`R9E$8u~L`TIGF^S8S6Yiule?@e+{cae#&(zaq~ZkU_&0g{nB9#U>eLSQTFJ90|S?^&$J& zk18I9L+Y()C*>XuEd`o7r%YfGW_1xD)g+GPQIW^^KJfBw!qGpj5V%~U}q58o9wFmLRi6evf$^a zquHeXeE8A^A(J9t<3p~Voc&h^HOc|8&Rn>pr=)dtQ`7Og%^M<*@@GeYmRGH=raPL- z`M&8T*P@8f)j&$6W*)7xe40?)N z5(e<2y1q=rhiV-T)Xh#sTv%<`Olgubb9DmI^htG04YpV@r##1%vd-&K$-C#?z@b|X%{{|UlVXysqu!=Q1XAgLoHOJl0*k5zWy&&9b znoadK=I)z76TT+{ov4VO=&*qMC!?_`JjvMJDB{99+y-}RkE$)v6p=^70wg;CayIT1 zTuL9};R&!CaCu(3!~RlF}3w+6;kuNIx!iKF&>bqSvoU< z%T9N1fya1^nvj?eP34ytYIf1NY|&RHzlXxSUo7TP>n-KwskPcoaB{Ex`K`LrBxR-Z z#4_)anQ)$yo|&qer*S{;H5X`&u0BK0h=qt730f75KB-Lp3!(A9er1T`r#bWXfWL%U zeSF=48Xp??h0nSJM|06w=%+uJ#7Jjs;uGV1Oa#Ze17R9ansqHE!)XbD39C9WjvKg# zq2S0HbjZL0lZkh*KY(^hz9j*af~l-E6>IBIket=7*D__=r=)4ILLtfd8F-I?tDUPq zU#eb~iW>a#kL$0WB8Del=u`_Lc-&61CqOVLduZ`P^de^00no_YSJsL6^7!9^2`>9y z|G1f=I9UJKc~X6|s5k37C%}FfnNLV4ZHnk~G_9T-sGm4RFZ~cwLxIAR@o)mL+tu-& za;FSTwE#`TOMqemmcHq2&gWYgwEobo(*Oh074+4{{c_cZV)e3l2H1Wp;4-VKO(mBQ zGCR@Yb%!d^4M+bw!!_tR<0&!e<5AlmQyfy*;wOt^5S0}M2&;%OB>>&aaYR^Mni9$v z6sYw*SgQWWc)I8~IuPv!*A0Z`5~G=;dpbZE;{W6W4v6faB@9ptPb`+ex~RH+B9NOC z7jjT=j$e-1APjc^TKbpuwjejq*NFp{Za5Ai168R0aWYIXN;1UNEd=k4=sfuko`;;y z-Cj*D)|+hY)Y$fT_M-YX8(5^VbwDT(i~EyH=)?<99U(KbGi9XMWG;&iKbRek7O91< zS7094Cb^)ZiSpR=`aoQd%nJ>wqcRCVP~QlOKi+&;L(yH!6!h}a8<~ch1T+ zBC`GmbR*c+z@hZ*m6h2}-yCo${@CVOfpt%&Vi+kp|MeIQPWaD^@ z8jRg9SFX0i(b;Lu*w*5)n?&FXFu1VH2+-kiB?2j!NR0w;9GLQYUazm%tK5;dTfp4K zW#y*yZVxk(jnqa|bOdAzmpj1d2;OQ?_eX+{vs5e!eikOzy6>X2&J^SN%g^gJ-KFwKR z3r4!#Y>s6Lc8$!@yveuR)3k~Qxb({F@Bklw^X&M8p&H=clrUq#Yy!1K0);B(?#2(6Ld1Ldfmbq(z{n*bzg|h+ zbo7vigrJ-36Lt_;o85VLxR1waMB^&uvjJUK&Xc>haJd;7Pc)Z%&9m%VH{a+YVtyB3 zO$RcgV(5$&nuhG1_U5WcrK{y}Hc>i}=g~W$a2N>;7H374#_y8t0T=?I(aq1v+a zH+MW=m!tax8f>FiHVd^Gq$5DCBra{NvuLE0!AFn#Dq@z46JP>_3{l7L$Qt@cX z$|S^^L0A9d8bl-(aeejvXk(GXAqw5$C0vyca1to-t+$X1Pw*rsux$S^+=!I#XVCRa z{YoPr>UC~n45BOK$H{6J=0i8yMn*EIQFDi6+-)Ngow2z7cmd{ojUUQ7!TkBDob3PK zi`-_TRM1t#Q9zV;;V3D*2;z-g!fV)`Xu&9hKDc$(m~zL|ClSUrJKtw8W`W~bl_T!m z)$z-jML0Z8l9UIdn&LtjUQ z2|8icD`ix>Y6S=&B z@Ey1`dj}Y9J+dl6kv=TrLbLS2Qm%h+pn$1QHz_q1@VliWYd=WXjd z3cZG39NS(^zci;58U*+UQSnVJ(Z`qi>Okfd=f3=#5ex1!&2!98&8%M)iAhu7FTfZg zW4G)OL~tjF7rI6I%#T-!V4VT_MZ%?07jHW#$6kN+(S?D2Pc&3-vXI(gH?-k-d=qsN zWFlmS9`+@h2t0}tNHb{Ym`Cz60?*`%qD(RXNLG;L{5tSUo#z?thBha_11W!b>@#~2QQvfc3gM(T2A><7zh4*hLvaL^$4)O$53BPH76_i? zLTXf+-@Z?i+5^sb35Rp4H_b?a;Nq!8Er#?KC?zlW^%Bm2)Fa42z=tv0U{G=B_1w)u zL&~}zB!(iLw=Vf~=tR*AhV%-TDVYUnNNL~OxB!a3(q{P)W4v%wPMzh3ttxB+eQ$~+ zWUR&0^&%GDINS_L2pKr#1m0k)6%59yy zRrRDMOeXJ!^4t@WG(q+}*DpgKSs|aH7%D_Z3+`ql znN62uT}Rqel>d8t@_D$buwz(wwM66AQ%qeWDgP#ve0H(x^~q|cWpb`S3*I@6OF_n& zuX*iP^Fr3$$wCc+Lf{Ldq&P1woW^%yDa<_VV!ne&qV<#s*p@IxGIo$0^Td%2PBI!k zY(#>!AW}o2h|Cb#Ul$MbOSU|ZExkiD#X17+M*@H!N)6Qs3ya*_ciX&erp8D}_InZ|I^G2mlR5rfP z>TB^DvG<mUX zyw_CFg#Sxhs_rnXW&rpk+(Qi0%<~kU(yNk>IZEAA)(3WPI!mQ0FW!QuDG*qdHfdaf zEUF^cW00S`o3cpH!Z>5XGdXJ0+$lU^s?RQ5`?uli|ME1AAwm!Nh|#6T~7X& zG0DU2pS5J~%6R@1b#4cZ0$5AJ*Jw{O@BG}2kqpYkBJWieo%$Wu;g_d~>A-5#d?&yq zuD+f}84y>#)=(9nJn2~}`rlZxLHNM+OA+UU8XaNEJ^4%lR>murqs3yq>MwN4Z-`-% zG;bV*gkV83BdK4W@;E7L5P&`6jR|tSzJ@Kj+?;)M-nar3@+oEiF(J_Stu-$vaL1C_H; z*o(*p1ky==FD5ZTAnnP$-3C&}gdpx1XA$fUnt-3~eCJv)Jq#XccJK2ea;Fmq(jTO0+BnWp(5O#) zAUTeLUU7pcU2H_q9=WfZfHoG4sw5$0!Zw zkQyg5>xgarbecGp58m#t---%PZ2kGkkL5-f{wF$G_ha71fKh&?jsGR;J@u(cPX>`zf4C2 z&WFytYu!zR&WQ_O_q`X+RmC?V4%$`seeht6Ox)obSyR8_rO-xRHSFS&a#K0~|0fkBSkB<;!sIRKSDd!HwN}|iy z5R7E`vd7N@czlRNmb*=|?@w8@eO^YC?e+=XdE=PaOtYyw;V&;D2&W^fdOI>cpkI9x zhHYQvPH(8Wn`Seq$AnM2ThUmxutZZ`b+F{jq@(+CeG~n3W#Ge5Odp`@Z?vTLCN}ZS z2Y9%6gTI8wn=wGJ@zVbOkqKO=R>H}d8)Iwm^NZ9m+O3X@Wt^(v8o+}^9s>kQD&V5w zHcLg`vg(BoI>bIh%BO_J#xBf@AO05i3@PRrk{S5Y68ks!?5~dinRXOWHX1x#=V>*2 zdb*&Hq^Q4tl{6U&mTynx({PcI<4cCplT53Lo}f8M?z=W zyBvNZ>G#xu1-rY#Wlb{a?eW)J`(OW^AcaBR&HcrfNS zvz^t`M>>kh?_vc4txKnN)rwUlfRBONpMv0jzRQ2y`G31SvPM`;EG%MnX=!P6U>SoB z=))M>qghGzK$pz~3auOv&5)@FDxSEYwu4p`VA9mu$X_3>YK_J4j7 z!VHBNYT%|68Zx|y5hP@KPp$~q6%rhQJtn_S*9x{M?#HhDAQowh>uEmM8esaIKvIL9?iHp7I%`j2KLdt(`o&S01()iH8 z$^aKw+dOA*3<-YfG!i}8hHbyZcLwc?&gHL_scTjqKN64-<0x!Y435$YxnRN8zU+@ zr)OSh{NwyMp8%Wquj|TZhwk9gpTNgePx|-8ONN8B;;P6XpWP*?%jA?lr`b2g!Q5oGNr z4?JAY-v6WQtD~yy^0p1bZV-^}5=l|u&@Cn1Al)D(9n#(1eP|F6B&55$+i&wc zGw;khYu3Bg_b`FSKYQhVhQ7-}d=QOB$Y-yH)9 z!7FBkYV1DZ62C;||Lgzx-#@JI9X7YqK?wfE^oTdDh({k18LQ(^YfK*LO`~= z_#Hk!0@WksW6h`dWOIZC1l3}FEX4}3m~T|>0r|Fdz{9~>u~&l7bRec66L>^qf>kIm z56Fq4?p=MXFXVDq+%_wI=I6rdKo;%D)Z#1~xN9@w#4xx(;Vx z%h5;npC##kU5x)cT>t%ts$zTCu>OOLP;d<|ze zFjxv73F#{T2t=8Zz#^U}pBUT+d8r9SAVg9VM#-4@4DdSrHvw4I;2^qhB+P)M0zi-z6e&hVx-^s>=1r9c`cudMWyziSX zzQZtl=dt_rCY_>8+v5@l@&wBdW^&Ru{_Xif;ysuGzhpt2#K5LA z#Gq8CEdx?*5;Y|l)bvtzp*V<@6KE20(~blz1M0W~{-`k;|{+^D}lb7;>k z@b`PR9slHM_x9yn)y99h)&GwRUl?{f$O}6LERJ~c)#DkQTEc;mtK&ZAlpWyY(GjSK z&iu@h3jT9%)nw#ysR}~$$_5SF?oMQW0*PubBe~CfvrFjKcwQZ(#>{`Z(V@!ZSALY& zRfAaI#YqAnc!z-I;)+^a_NCAd;VjL#czv7_92Su}A9Bx)KnWkqs)V9X!V`dV$h{Ho}EQuUq~xK$-m`CT++zf0%f!AjLG zc}M)y3m}~M8Srw7pD6gajsG)SI=WhkbJ7>|bzYbkkDLqFyuFGzQr?X5-I;T>_vykg z_k2mI&Mt9MHBh_MU`=%bj8z9k)_AoWTcI9nvt z%;}IufvYMq+{h4{+-EtLrA+yUy_d#L;E z1rBH|FL?ZcS$1t)An7trsuGMZLJL#d;Gn(T!h6$X_;qL%LX)~*_SbPqC z=QCAJ8~=qeet@3?%iCH-p>zDWP~d`0DNzRimFJ*1CoepjU(tz63InG^2j}us^RgC6 z;jgHJeSp$?^m9u1a|=Kd5;Z{}B%^s>8XqX^ zxOS*sb5LH)GlE|?uc91hdULiN=f9@Ck#Y9-9R`|8FdtUogd1U`I%ihJZ^^s_tx&dt zuhc$!on`jpz+nDqV)nHfT54WQx^sumwf1EksqAadD*rUdxe$ znTytlC3CvbY9WU_(hZIQ)qpouLAF$e$p<`*=Ncrb(MAFw>&-w-`N$qHJ(&C2W9r{X zh7;4tsOHKh;^N=}1K9f2F_$expgO4c^8X6%>=59eh9Ip3AsMyn+WVbqj;_BAW*tQL zyNw^oOg6vxkAa<*v<#Wq7&Zbo@Hw~oetL1|h?+!A@lALSseB)gZ*nLY9@qOvvgee$ z3Lbq-UOL1ZS&s>b8SvM2-Ovv<49e6PPbPZtvizoz52 zGVr=V5)HbycdtJU(Y}jq9Io_h5+eqdCM2X6Dr#?;RZENG6ChO61>>tqieDEKtW`iP zUX6@Z@*9UYumKz(#g@{)F2TzbB?K&^X(FVEjbc@42(l54eA5Zse}Q1S03)QAWrDWA z^lJ?BC$o6x1AO=H)F1NImrPXDlfjTwZuKFhIH z@YYI4_rSV{m0R#a{IqL!h+e>FDZY~}UcqIAC<14~cfhGmR$fzidG7BiCtKmKWx^@O zV6Y?GF|gcXiFbbzpvx%T7$wOoI{ep)K{$!3+;Lx>g^dk9nd)84=($4@U9nRx8|Grz z!S_*cU#jBL+1AJ&0h^}hr<;5ubB-)hxwxpX{ACsC#G0g7_WJ!?>#Yy2{xx6c{`?yG zSk?WG0oVXXturZQTNlzfRihFfwB+*sjAqaQr%|HLk_Db>jfBgx8B%BYUH+u7s1!wA zk>BY+^JhVHmGU*%cS|fCmee7H7!AgS=rZMR`HV*IAOq{nIrWPZIWLN@u7d9CKi`wsrwH_tCS~4-=*C zc^sWy%9_9{ECXHQvHn)7^J`OI15N#n93ewxiB^;3L2s8LO1=QQ_jP zd&P`~W4+%j8S)r-#2Y-w+@yIs?u*D^yQI*t&~lsoPNagqZFaWW-ooz|jY+eg%V_1jT{)Rhr*c%t#V136wG709;W-O~VAN0_A|AA}>=4 z+fxpD!8+5lC&dM{U_<){JT@CqFN-p6o@a~*$dSTt;guQ{US@X^Mm0I?e!9b6Nw!jX z6k)mg=S-3vzjlmNzpj}3*Mp8Eh8d^DqCP}ieUuVr-7o&RPrC@*Wjj?CRq-_KX!o0^ z%G);?%MLbLzvPMfrP`paPPYKW_PDGROvTy+rGqha(OYxZ$j4(cETK^pLbwWoztx1x z!CPrOmT3*jX4m~C*I6?E4X2(90rO~~H|TQTp@clnX5Zt?PLm~5&xU14^W3*Ilri)T znwB8@P<$g_JhKnZmIrx%w+Zbeu*dv1zCQX+!#0I)fhtPKo(DwJ5mhD-AT~uIjETT8 zeUl^{vxcI-cnw*K_^5Y7f^@pJDMUt{*?GXx z%cerl%RyGwgiNt^cSQ)^#Z29D7 z1wB51@W`sd|9Jr0k?r4|Cco)VobP%b6}XFv`f$6PWTOEFd*qzu%-XY>1@Qk8?7c!g z;(FO^*uR@yUk5C~^jEr&!vmr8wjjBtB$i1`CkG?o6Csx+rQq%7)bqNFq+eNGH^FT7SbEWA=)2d^Y>J-65S30ZVWpf*PTKet5q=-ba;zl70W}K ze~*y*3h5xBC(g?$dt%w6Y51`Od!oR0~U@seSx&Prz;?{Vb1;ByJUAj$P5b6I=F z_IX;7EVQSbe=KK^U4`Zz<$dngJPIwcw|~vn|9w~yu7ua^c#h$t(&WDcR_39A`_|tE z`eqcQuZzyB=r71br$GUg7J4x1U#ZY@zBw}`Ddm5FuL9rQxA$OCLOw2*bRiUE|4gMA z!WOIfb{52s#~!~&WMudQ1YU!S;IN_4k>vGZJq22nggH(y>^;`tV6da;TZ|BxoY}@A zK``$bIO;rXvzlCX909n8kz&p}u3aszdHbxhKfoiEcj(}KZ{jkz$R~tO*9Ui@gem3| zjbd{)QgRKLnfm{{>Oi2!-g)<+IMfJjXVd5_C;5q=sfMx08ALXx&`&$ z>hChDw7*S;o9#{8bZS260uwXd0k93AJK4O%$1~Uv8sq#9E<^#w7FPEgGiry(;Q_&blYQLW@|>c^75|dualHexy%oFy(Gr=FSQ`MNx=JHDAS-9~QyX+c^wFnTu))BF3$n!eZ*JwOsH7iT5xL+#WP3cpw#P-~lwu%8N3PjWWe1ccIn&0{Tl53|!`KKT1-fI4C7kg1tNRW^DirT-* z7KQU8igX8_?bPTgu+O=bD5SNn++EvEx?_*ciCw(i1ospE<)n_+bM=>xJ@IviBXHJr3zi3PVm@v%@R0ndi%bOh z)qU@6EYTgp)n|@2B?*et_sR=oC_BOA^^snnoxgbv*v?KmsA~g@Z_PP}DJ|{upgcD@ zWrPuZ{wBre=WO7P=pkYV0sOrXVHw<(tCi46mvcsjup6lNHY$rVOI7d@@RnfHbq&HP z4P8?^=&_qFaiZAq+?!@&bKHX*pN=3$x3)a_FNIr#Ix)n8wG<6pYDiv{A zX|DvY4Qnxa-7)~QF?m{E^VrIB+pYyoT%S^7RK#gD>U_Cge;%hiz>>|~EaHoh>G{Xw zgs_7h|B|TGq1f`M3rC^PV8}CS&fJ;o{P0g4s>4Q8bdgldO? z(DD$F#bIuD#bC_3ysSxdVGlJut#{YPB;}`FaG^1kK(1E)`Dwmk4H(Ikj)E%4Xe zrnG7#fbaSGp8F}JszeFwH-9^FUC!PE*BmThpc~y$AHWPOY)Pob9HZrfNafl~%;82f zAO{k&FE+P_`3|ce%=+JKffZMFPB1Vw3I*0H+MD|$zQ)Wm%m7!8w-C`B0b)qJ5&qL^ zRX)VtCik*y1{~gqW3A(Pr^S9+6R9gZ-A3IG*ao6YBhcSfbL#P9f)($+^H#20aefY&R=dx9oAdyfI2+4ydQtL?}Cq{)P^BUlGu~SbNrL#yj;zzxWH{VXpa&Zb5 zKl>t>4U*4$K3w;jNj1N$0=w$S38B$>hNibO+Mh(1Q*qeCVl3SxT+0$2qzlZUjBs}* z=1Z<3ZSah6;Np{6Fb4Qdv~S%NHPk`RD!xqpJnWqKUWq#JP%}@E>I>$I8f>5wYOCIT zgZ1qzW!J6EBzBtqM)x9>h=D`Gv%n1ZkWGSCisP{NvxLNwi_|k8AAuf#*?p7F7km<% zI_?NikrO_Y+arGQMK2-@hhANF&C?A`)H5C3O0?9Lgrl(xF*nl^PhcRm5=i!@Pek_% zi^0-FnwZYWbDb{*vyskHnSU_d`AK-~-#UI{o>{xH)T{%yQk}e@?@!~WwHftqM~ZG# zIyplG@y}4xbr24FG%Oo_yK+rN?~{Lt?x_mRR_OS=C^hrEfWUudF*`ieKJ?ZG*gdPf zeqpH7X%w%u5xoYc#w>h!p zqSgT#bRx@e);8EUelnG6W%JDz0z9NRkL+*6p}_w!W)H{f7-2la>d`nm{^r@)$UiVD z@p$2MoARxVlrK9kifMNgx_hj+?aVKW42F)r#)q?Ac0A%*q`95zlZ5$;0YhRAx0f`* zQYiS0SUVZo$0I2`yXSmVp28n}CCB&o zr=_h2K>>u=&9$Y#sc;#g(I`RNwYM^Ju4N+!&nOnA;CAx4;&vqh3!;VSWe($u|d&Ec*R5D?nq`cC1mKVyFD1)VSXkiA5`?tI3pvb zj3FqXIrE?o=`JC>(ys^FxH)XVDD&kd6H z;q%>TQA-Mygh_ z%WuGaSJP$kkk-wOKf=uzU7*Q7Z%&JI;1<)L25kw5P#NNPu zA@&I_R2E?G+qZe-iqn0C3b$kdE9s;h$B#HBrKj%|=Ws6v!fLp~RgY3N*_ly17HR3U6;P?Yqt3i$h z-kbU zXDaB(7^3APhA;ANjfb6}88e3y1;SZZHH%>6@ZY-nco)lRC@*(5exw?~Ou+2C2yq<$ zpddik#{NstE;JYys9sO8r5hc}3SN`9ffr*5_$LD&9qkd0Tld@nln&h1mrJbPCna?Y zmDJT7QHQvG*S8yl{LbZ6u$G(i^;a#( zIMg%Is8_d39dO!k8uYf=o60#j!}zaSZzkd2bIVF%*oOhm??jSU&1HY2#dB_&}XlT0P~AJvNt`hE1(; z;d~?bzy10XfSf*Wq3@9W+*Bu4I)#$Kz z8^rW8%?lYe0cmrjqpwqnEbMre1qSBLaB|Ww^IYG{C#fAv=z$OP&0KrKVW(yn9lyu9 zJj)=*HMp-5^o})h{cDdKD_i};g zrSJEfLK}+=fxSbmu>M_uxS>sxO0GnGC8>9i4~O8C9sj5qPH3iN@Yp8XDJVXXDDs>h zVo`YjWY=zbh7GZQpyM`TPehfuv_wU}MOMF!TDrN_s~5f3D(|YiA{B3o_n#?O{k($|;S$pWHCyh!IjP<$p~IUj$yW*!$2c zODMd<7JZCHg?>ZrkQ?wYG_Twhm=yn+mb2xwHyyE-Jp<%yAz+;qN-Cfo6Y$)6@6SV> z7Euh5;GGr^27;KC`DC$*^zD4>+1TJ@-Pod_?_?{j2^f_=p*j@9tS7F?L`96 z{00>JzS}$<*$n1&_}0UYbrE1Rhv=CQ`NnR;9#3xanItOt*5k61IJEVAasXBnpXK3Q z+ViionPk#(bK+l2-jdS-x|~HJ=YdE3gjI?(VFnnTT4ZrFuw<>{D00tt4{t9S{-wFMBL^FleU#1uLH7Te0JPqy3wgu!1!7MguIQ*@Q zT}99Sb$`bvUmupI0i!#E;w#n> z-bM^4IgOci%hPsF+Fg-8kv%$5Gd~Z7kqG+4Dtrsp*wUeeyp`+T-IPcwG0+u zcAeHQX7O`zOd37ATpsmc6XSi3Yd0zAC!2e2*d;yOfkG@EG>|cV2YS{RpPDSGKNVfU zZ95o3_IxGi zoi)K#Aprf2{LicRbd`^F+$_8tQlA&4X=`v$9@b~Yss0AvpoN-d3HhqU%vlpYY!-|O zFXY2}AAOD$z@)P{nDjuxWko_qoGgF6QVWH?ZvX@Sprl3AD^-oDD>fPao0?|Hc91Vh zT3LKHRKrab{P`E##s%2we-nB++5QJFd|p8#3$xZ%JCiy-~<1%^X+ zJCV3{y&zU;SJ!LNn1_y?cv}MEVqG=LfC)?pS!Ydzw@^J8S5bqa@6=|#uFWW3H`$aG zRL{+?r->W+&y2OD?TFdO7UH_yc;D=o%g>*AMa4&*0sZNZF+1_(5jdQ*p)34oZfU)VfltxPa`r2I|iN}j?CLB2$V^yV09tv&I!`Ill|)S ze4yFskWBq5?1CV!z0=FESTlc0lG1{-ZltImY42m;^Uh=000%#CcBMlTKWVN9Qn_l% zY-Rh)yyYfUB*+W@pwaAPKGiByM~4;ehH$tIKDQb}@E7Jo7RdM8%SAh-vx0DmUit;Z z@jMy_+?9vVwx)DEcv2QWb|<8fRz5XJuO}|lMQIZOPs(#_oGgLxLr%yZ^!npUs4n+v zle|NzSc-P_7N-iIeT!vQrdF$dHwugSx1Y^ZdqzF)UJdZn;QSIie`vS*Qq-}`hd-IT zY>mk+x6;*;O}vtq4RtD{qYf~_w;vE=yzM1(TYrZ+pl-)FP_Pi{TxKv4yZ4(VnplsD z;P4_>jw}Wz1eWQZz>?6}vi9?JP%2W;&5Dcb4^D~o^g!OlgkQmqEBWsqp4w3tDW711rc$*`VZ(F%5AZGHcXOE6rlm#6p-Mk7ZDSljSUPcjmL8N5sh3ri{_t&5PyredQiV`fy<)b20vhkn~ zf3D)irDFD(+xZZb&4Nwdxo;JM8WfM>-G7;zKoA{W@ofs=VC$SPa3~$zTs;_(3Y42& z%+x)61XH}!PcxW`y1F`k1={?J!a`nyWdc0diOu&Xit4HZP;J;A$eC*++%n})H{3U> zT;H^=FMK&gr#tb76v-yqDv_roBydpsw{mj!7}|DBPo?lw4e<$dLx<5FDc>Z)O#TLb+A@oMSp0iw8;$7E`f7c>s_f5{5>ioP4c1# zJq%KqUbAFy@H33iLCDV{VEeAbeYcg>x*CWnIQ_9qv}CNaHql7;X%S^s1WZvVUkNKl zhNHq@IVQ(?KQ|~13c1O=xa#kv&EsW`-ucV*4PnYY( zjh3gW^60^|+i&r!zy*WTb7H;@I$NJmEl9wB!NHf%T)$j$Tb<&J@gPG+M|zh9QWbJ#7ZbCnP?0M7HI zf+|dGOF_emXuRZ@jCs41)Q`Dm@|duuL*n+c8Sldo==|PXbO2TEO;Cq#ph>75*%#K= z>FESUP{e+KP1KlN#j0vY`M9CAcZeVbcF>KB@EeB&w_WLb*V=~Kh1ea86xJllXFq(o zE{(yzDEIqnYNVP2dM<`y^Gm(!)B8)Ia>i+a_0x`k?@^jW+zTac=%x+Z)-47~@O}p6 zbH3{wvA#JJkQ!)U-Zrb^RJG}cT|$#RC<=bj%eP`l1np3EWZ8X;xrxg8X|Bg*wH}T5 z93<|1x*|(Euy?Q}U>Cwf6bdWa%;S8-chlf|QfEG;tx+9l^o544?{PF#7D9S!t$h^k z(|rzUe4Dy{VHrl*|2^8b*f3)5s1n#yiXsU3I`V>%k-?8bBR%G~M}kN0$4)wvn%KHsLIu zPJ}DkWY(as&jeLJ&MBOUOAY9On@`{g`(${U4`XYz@B)~`y~-`qHEr=5mHBJ@l?AA9 zJNR4yveb!taK80ZOWn|)99I+@NpmO|;{2RW zzWHVjC*zTIpOMlM_5{W{6hFg3K1(a&(mRRU+wp~8$-8WCqw67KH;zM2WtPu4*x1?r zXm|)w$kM< zluvFw>O93hA{BWN40%5;VrBX!MFj1Rh(-hKUtwVYO3-go3GuOu6X`uAVcN|uS&9X)()#Ulo_AK`ZQHpM-JlP9N3ix` zxO%9pGqb`Wi)E}pvv9G*)3dn#ms*|Y@po@zweqipVBb{koN8F%0oYb6Kt?sTSW1sk zYcfk8*uVPIHeu-gWROJ-Zndm0R{2-mQ$|UHF&Y(lI+f!3A&>JNs}}ffteGU=$*Wp6 znh%+BH%q>l{f^WJ_Yp!5(=yee;*aJ7MFIVpCNyC7GQ8f6RdrP#iIrNXd`i;avD)L} z|Lm!<(^<>%cf&t|-48(KClgg6#g-o)2Gs zYrnsRv!Ed1V;#rXOj(*Q5@(jTAUzAFs5md9>NJbnl9e+URPDX>OxPThah z)~i@h<08X+;OFa9FC8ZKlV~h=L=YiB_`Xce>UUmUy~7GIciaKu5~!5y*G7X;*B?n% zEnNYYY~FqHYC_%#Xuh7GR-c85_;tKSA?|AQW>j6C(`%5TqV8cUpL}YQYztVLD%vf8 zc2%Zoyw73&0<|fDAWE+QnSGKRiJfF%4)|1&ob}UGRWF{&rt(Yt=^AP=;YMrMJ?dtr zmei)D5!4+GMh%QW8V@N$tGT&4%7}54IMVi0adDel!U~~s9rg-nb?^&X#1#|lOm^sPS6kQ3w zKt|NtTqr!EgZ43F@3+DV`wnd)%Q~02Qi@^&QFyD6;3&kd>vzP5DyijuR`LVwl%@LJ zAud$F!%J1;y0r{CbW7yDb@kE0QMTu5GcAj^^h6k~1U|NYanFT3b#|XRmaA_0nc^!O zV)W2PN0}24Y*eRNLmBf+=gYAK6LpV`iA;J)F|l~@Pe%ayC4c5>H>31p#;TZioZVOd z7*WeJvn4-V%@OP*18_A%4%x_$7Or2$=|sLI_5dCK*~s0sz@az^fmnnZJ|o%I8tco` z?&ogY`yub9LFp;!?&^DTc>Yq1-^Wo_slzZ*m^p=mRqZ_wWTN-U*KLpvs=a$V!5-zZ z)`$6H9_GH{OI#NDv9*T&ju%dvT8diL=b~i}BKJb`$4Op(fD2F%=y-4W>Ek z6l-qZmV{rtxCvSs?RiZz+b8_|&%CY7m>uS1y6(L+4}>HTdRguI<^in3YBVe-{K)Tw zJ;Uj!B?)ex0A$y}IR~2UI=%%R>8-TovPf`QmU9q=_yLmIsCq?OSkfcI}Z#5-H426&5?o z|Gp)e5c~&y_ODeq6IMI-+1+(oC<$NfV~8aL;dQR`ZpZGVJB_M`{}EoPa?#}Ep%6*Y z9Q1W_h5N0F`FSnLB#KTO#N8{9DdXtv?or2`8Q*F$lHfbAN~ zZqp$HSs2=DaDgztF5xs+;fsTkBKh(GYGQl`Bn*#1A#i6@@S{UHS;V1ead_xGL0}c% z*Gs)ckg~Pcv~~!HV{gS=!O5s*#IveYk(e{s)^Cko4D~PR-*}h z&S!Vbk5<9&j`{nt8q#p*SPgk=yV5fP8m%D%mow39E^yP6}y5?H0Jw z{gAfhEXBZ9Y8HPbZp)Sq0*&G#i^B6ieax4> ze%&Quxf3?b0No-WJ?2Hi*S~A99`l-(mfMkN%#GD$Cp&dFRu^Ym<-Rt!W|VpW7s*R; z)k73n%HKf4f|>NYN@zk)elgG0_=!TjMHwVD+N8P#mK?dBfwUC8s^w?%H8gyk^N_O_ z=^26~xJX9Q6$h+ZRlmpSaHjo87&TzNCwz&J2L0jmjc&sMMacD6(+CQVMNCy_url{T z{Ek3`QwGm58bd^Z6$>QM>BiEJ_QfRRo~Le@L1jV-1LswFC7RZlpJd*l75h*D%UBrb zV3w@3SDDngJ)wTL7C4soo%>{OZUMjZ)B?Jyv9NcFS@(ti-*g-+-=DNDlE3XnaZPv| zUa<|anUH|}GQ-pQ>NrF^U>GTomT*5&7y z{oD2v|A)6;Ir2~dbA^c91Kn+3M=+ocza2EAXBt<>{#+692#^GR_2G#pHzV+CWZ>P zYAZ{4lVr z&+xhP5T1UxZ;hr=p0gfP6t&IvHnwX0(kg1T$DmQm_-3qN_v8IVUD$aQ@p@4F=}e^& zs(DUKD>nK;A_!1{+y(Th$YFPL(IWWX@zl*~R|wMlG;zB&h}CrF*Cg8D>(==rc72lC zzu7-QmvaB<#oR$?v1(cAYL|-Vda*gvZs7uIy~3jqzHB0&TJ8j5e?ilJ5$~A4yulT9 zea8ij{c~k=D9B$$vVGXBum74lcUb_@>1YY&zFEL}DV_Nsj7#O0M-yUiGBA|BxBRYp z_M8@R`814cfsz#&8Asc)aa&RkrC7Q7tQSjuMSiwx<7TFt`q=a?44?Ta}et(tvce=a;>{i-b_4d@q51g_-kJ+Nd$IE1X z>N&MwRZgrbC(jwHFY*ty46(O!>X3+t4Y9T*=&3P^K7ulgzFYsxdK4_59N6xW?d|<& zong_35eAq?E30zT`(&Y-)X-|nycM8^6?1tSH;pmXQ3wm)ZC!qq=_iS`U)bTX2R*U> zY5SPj9U-*PUuH6yYL))`MMA~a+H0c|0{y@zQ2Sgej-mRqO%&X|L#uf6Wf1gP%@|(y zOFzmQ+i`W~?Y0|}V#~c6^weo6kj#S?#0qU%IaMy_PB4DJjob6CMWS;r6Ui=1(Sk4R ztl+#pn5~OpY7PBogOD+X{?pkvNSiH@oaXpi@Z)JzGAbmgJXJK| z_iBXOExGK{A_^SC(hql}4BDS2Dh-c0+FmY%#iIUwVt()f3xv)eYv1Gs7sX@NFsf1C zk)L@%%mJw!FjHGA;xPHL`B;7y6!^KBL?m9eCPpOhQ?qN`Kq++9eb1eSWn}{T*Ojv0 zK5KigyRP0Kysw8x^KE~(3^Nj+j(n%PrV(gB=*qp22;xEkFRejSe?Aq_kIk%`IH-Lf zp5+h^Bw!QXaJ7m=w$csxT&W||MG*63uF@-j;m`l3_Jk%$$%bNH@TeWm)@Kn+ZiY&< z@$^KniulF2@Pn%rkZ^iMjgHT=iJk0xzSd)`ZLzRSI+!xl@2&#BR20hEPI(lkt<$PD zr>K6>VGv=1-_1>TUT7Y9|8aY0BL8E;jAYh6-mV>XSZ(|Y&dwW9sLt=ifB%r)_@s4L z!}NnY>dNR|HEWa1rb;jw;o*pNyG zGb#=ZG7plTjsY2u(q?eSScQSmSR0&+taqw_c0D^fHjctpHggl>S&rzhjvBLxZ$5bC z-RXk0SYqu;<&6jxlm>v0I`Oj9@@2m1SXWgsJMW|2ol&qwh_pE)Aa{PdK0jR43H_|s zF_MNFXk0GCQP}a)(?yC9LnKj4cCNxe%A98q#dcI0`5JigXLT=Zj{Mn-E+P6yL2AVH zG9SkszY5Lk1dF3i8QHH?jcoP)yNtjGnLY{EXDLvNJec*gm5ZrfUx$`C2S5lbDvy>n z1G`n6Oyfxom%#}Eu$?ZJ_3z!sPk^q(dpOuwr+kxg)U7wHa(3K$Rl6!L5xXtRMqX*> z=A@Tp+8o+EIcIiy#qfc9*<0LVIXixitx(R-8ECTcJ4&DEKCfGHbw2wk)dfxwRh6HF zb4@d$`0D{q^NYw6SBrT|E*Gj{vS&D~H1J8m-LrP>jLAZtK*A^i=Bf1qfZ3r0trBsV z&~|s$V<4gtkS_q{S{gK-Nuv~Mz4)>0;2G8~Nq{k6;KT`ETav&s(7da@1**MW>viDp z8ghcr;u9fAE{-YQ2}oV|AQKb|h%$}=R zOd9kL1jZq4`=+a0#pXquR0{?D$RP&zj8ZRF*PHcEp4_;QPX|t8seF%JSF+P*5igZz zRtJq<+GC@a;`|gR4qz1b8o00AY4VDfc=zonWapu82lrdwdcw8|uUr1i^vB0lNaa_n zOCG|jA$8lU5SGr~5^VDJ625=2(ZJcZIFfqLmCp-*GwgKQ+?n*85ziBRfBHbruWjT@ z`v8O!1IRq6_(PX`BE!4s97hy$Z@jLD!?WAyQn7A!`Oxk6rLyjpQ=fCN3CEZu4aGM(jO zK~_TLv9qQ0l~P9_A-;MtOb#$>_43cu1i;V$p6+Xfx4Xt~kK5S=Bx*6h^rZ+TfAS zpuaXG+N*h{U_qMp4gyp0P)-lTP0R?z6H;RcpMka!9~V5i;Lm}2N>Oy=pdO|UkDPUh zHT5%M-ivxf8>FisD#rK!H z1bG4pLM_FwUH9wH;6y1;JsL06M=mD;?=b}<*p#4)5`@-&^ZavX_YuVIz6XrpFwNf* zEop3QxC9!@2uJBXeCodgwj}^c4Of)nCF)J?2nkaRL?xNPZgitp4ye=tkuB4 zuu+c|8lw*EQVyu9%)n`B^zXB$y|}3VxfhDIdDFSZ2qAv}x)(#we&9Yx5A4O5Xx#EE zxd83eWz{m&;|X}HUENy0ToVtvT$Nul9bBt0YEF+E$3{jjIWxje)U4um?4POw*L#)Z zC5(o#_FTC()HCBBsRA08rpr7R0H%kyhxw+2K+9#|=XR_@o{kDnk+zZ?Klq3(7K}GB zj2>6eda}ACT+VA;Hg*{pAGe1ONs*NDHyWiDSK+caGudoDu^F_x>CX<@uP0rL`yNz?`6 zmh{wkw6aQEMRhkQ-$~q=)FgwpX^2I@ZiAx|Wd^wUy#-1oxiX<3x$#i;S!5t&u`j+j zm~SG1e$XH<&eLDVUPr(Ewp7G@YtX`?0?dgxYE%!&C zoLqm&77BlUK)k}MF<+zunn((dI~!k<>GBNbU^Oce6PLNqn1{bl0~4#`Jr`T=Z|b6h zr1sHh(8u+eW+ENUlj$w&Y;mcjc-^N8>MgBUG?6?{Ou08FN=^Xfw}qDu(kYqu(yx1f z)9Rrd)ScfKCl;7ZE@gDnbT$?Vizi$0HntC)%9>T^QIXb~Pu(ow&e?hlbPR#HtHZTk zqBB@1G|vBOb?19_7^n3Ej{(*_G+AHM3HiJ0;-IkNI=Q2b8E2O0OZ*Yj%1#D6{SUR25W3j)5_)HL)DgfA9iXXWQDzuxq^`TMi+kqdHF&*Z_)q_{WxiMmIE zk?axv-Lc?wJPjeW)_J#Jo{Ke6ZEcEA04JC0FMBFr*pszL0!ys};W{(6_@}eBoi(tIUtKwWV;ywCClfq#w zP+)~4n}2>;QmyOV%gY%T`L&jvsSZKiog&5--c4Ifnq5)zmk9DWn>U&$@9At8?qc%x z<5oJCOs37HMRJVP@l@Nc(6hJ{eLQ4ORfos(5?H{E76kDY3&SY1g|s;}wn<~X?c%37 z9(x|_CK7y?EB~FoyfW4nNTNS3)Xyi0+BEZhC%z#Z>R-)ua6V08)TkY*_=7oOe5$28 z0+ppu-^63c;0IO?yt`}ERun6UWM9Y$IZX2Z3a2)-{~|KT)516!^5%>UeCM(m3x2RgrCQm0yQ_!nXsu%MFEp z1Izy1q=WnwY)2_8@q21LQd!h)J)h7GJ%~?+YMH7%KIjXl@VV{Nm%W#`sh*ZfzR%ov zbXYzkheZ$rKFWs)&l!ip2|4MPY(2vf5uQETiEKka4RRIU&BcNU@9mC+M9b5nDFFZK zwaSQ{QBWRuLf%yT0i3;WgP4W&^0Pp;v#V=|l?kvwUVcK-4|k1bv1O6ZC!H3YSAUoo z?#F%t!^qhoCZmj-BP!_@H!vNxa!4_89umm~G~Zi8@7IZw+FxF2qFArafL@s$QBqb$ zgO>W>Cs5B{75OkM6Qry9h7+Xtt`jwBfN%m%0-k=-y>mW|+PAFGn}2!%d|mBi6H`FM!%LD%Y{w9?$z z0T(xQ&|DQKi!!wak~~|A3zJ;Z=L3!R00r%bF3Y2ohcQ_`fmH-m_-LU}ttwYl^Hi#O zMh*;XVZ#WAu%1PnTW`-yU_oOt=24xof2jH;t7FWvSgZPg6G`&X(Mr|0FEV4M&G}e$ zri_|l=Lr<9$mN}Qur4I&BZi6vP=V%ps58j6uPme7^Tm=waL8tcq78iRf!?h!BfbWA)kX?Q?m;$JVkRWWpk)9m>mEf*{oFa2!-`9bnyN z@6j(;|LYl31kvV%EQ`_~F-(^O8qM2xeg1A;xN^zY;zj#L8_yWpG%Q%S4r&16GbAkm zj8m|CBiu9ydi=hxslc%M=d&Ao?48Q@a+Tj}8KoXN?}hrMYpC`0o&uon|50|Ty_(q&0bQNUP`tqNj5yDHELjR{zEYs3F{M8R z67quggs=+_$N3bp>7zGl;cOK3TuYlHI;YCc&leEV3DHQMOMFrU3t4+eH*sv_M6C^y(?;4gpOI4EE?OOJD z0}4y3hp7-b88zC~PWP8|-ju4V<$NK{EO;RE82C1+M7?a;&VgT^Pk?7hW8h$bx&uL(x6QxbBB$*8*xtJHeSTsQvYfswn z+4)q=Y#m!H3Cw`K0BhL;h*78QZ<%n#gC9gLQ5@;KKI6|TZ3}t!0a7VqV+ewuf{Pg) zl!7p3jCQy#pk8OibF@=>S9qp`_VZw|Nxn?$q?`~4fUmqknpFt&t?G{c3js&P(v1O~ zS_{jFGlS$Vp780TVdCdg)F^@B^Q1keI=Q&>SleHOLL&F#S@`*^61cTify)3VA|hf& zaL?!iILlr6a%Bq>YV!7Ci$oNHGu%a*RtR|5w_V}(4Qe9*S)7jjCrTJ^V3RYLn%{Re zLjk>JTDeJz1Rmpn-%E!YBn-Yw)hFt_PF5d{_^eE`09KMN;mQvn`(;faj5lk0ID$^I zYu4AcV?MV@@{Gj3m2zQC7A~+En7&Y3p%pC^1>XAm%WX3CCVg>F*`Ne$ZKrtv-4L2u zc%JWr&`Ap~Ty(}8Zc1@^xRp0;2Mp#(HvMbDVXn#`uFTX+L2;NtwaB@{wE%M5$4Qzu zS)nJ4^ZRyV2_%O<0DU~&3T6>UH`e1s?ILJC_6WN}B)pM#&A@$y53FFw&pO5t9KYj? zc%ko6(eie>NdsuRR0MXfOFFsQC$-&Je;$xYFz<qy;K+QM0&tTwX&BOC>g8X zY6F<>t1?YThS#awmU)rnbu4t(IV`9~=J9kf8-kB*--gSomtRZ!I(;7AorNfa8M9qO z7-+UyE2<0I`dG~c|{C}LKvEkcVNl!@jnOzOShVc-?;fX@Wj*J zD0SXER_~p-mm&sBc>Oh3v$ky_^NeJ8cA1D&+$yZ!79aTy73dThol!@hGjg^cs0IP+ zYg&eEWIf&f8Te2K?ppz(FdSg62YGu44BX3_)9??~?hLOq6uEnQ>c5zeA=O$QM!(>{ zruyh)moW><)1h`Q1w+fF=EPrq%r<8s5;QRb&JPWmUUqtl?GFCq9{KFR^gBfqHuV>s z7bv9HMBrHkmrs4hN64Z$75dF(XOU%$Y3+r72AhHYD~KvppsTnH|S3_s+^ycyVEjdA_Mpaio-13w(2;>F4WQ zfLKFu{p(AXska(27``7&PoS)B1558)8HP1@Cb>7;O?6UXEQoDczSowiG(C;Lc8A8~ zfm8&D&TN8dYOt>7jEf^Iqx4B-lHVt`g^YV{j>m@KBs`F6_9UKi0qG!U+30Fd2O2&B z`mJ9{73{KsUhLW!TR3n+JM*CyWPU~69fqL9ir?!1P5JOs{q7%#izNJ&4&WN{l^REQ zSjm@mZq{V!W9eSPOjHs(cN^}2%8Bv!Z~-ME7t80=n}nzMAF9e2vwCG8yVT6e^eWn= zzrG+IMChCZgt?iE*T9uS7PSE2Mkz?*q+Cxp$79Sr-fKzm5F;j!+>p> z!s}=5V;^RC2}10zQl(45Zj(S#VypFAzNQ}a6~}!-(73>O4>ukgZG*e$I-3CC+gP%R zSA%|Qwn$q!@0xFJkC-b{z)M*2F~&y&i4!q*KyZDi6zFab`gJuWDenuIWvCvl$tw7x z|JZNrrsfYdgqwjzYR$y0Qhe^OnY(0F-Q#Dkb4vVB?q>m6kjl5pCRqSOOikl71mF0s zx2oZSnHlMOMzokcJuhy*lMMn>tFTwq?195%M^CL$cj#a}J9dv->SP1a=pEqh*BTBm zIVJnyvUt|vzGTEAtH5( zq!58O8K4~M@j{?dclzj(FTHH@=4##X24p5{-=(vdW@ERj-JUJAoz3XP#>;ZR+Lt@o}K^I8+bSJU35Nq{_qICTDQ!4;g|FqwBYms(@erLSJ~WkAgEBrd^n{d2rd(c zi~;QlJVT>vCMn{W!%{jdy5Cvv5ik}2#aLr#`?Xay>0#~c;|oMO`5%Lc@&_n1@UO;1 z{I-0y8yzOb-!2HeMflSgS(AIxh{sJ^l>{4su7u%ErmChI%b}E$8>HyN3yl zv+o7mADW`IG$p7e?j1&7-*>)dCn$3HqIp046ku-jFgMmZN6Q@O{41({vv3! z$);(a$Wug-Qg6vp?$M4G){9y+!U;Yin{S=1^^hC1)Tk^!% z`A{!?$5xLRvw^jy`#19e^_$fJYpFLG6&&I1h9Ahsy! zO*PUF$jEE9#n?#OkWgBsfn}1HaIR2toSIK9QJuY`$Hr@dd-qeQgINVO=qzm zc`-9}X;*5g0`QQ!$HsXi6L9(P#$thR6E_=qDs1(3|3gCCWDEYq?&(sE zi*)Y&ctB;>G|pW0MHn&MQTJ-pYjJ%yO>`pksjKZ+PT6u=py>qvC2`83e?7aTjM78q zT+&zfI$fRtO9%>AWsKMuKA!0K177|323?&U&L=tDve8k08snZe2er*?Jv3^NC~V;RnAkE})>Z{i{<1Vl;vu$k)>CWDNlB?_P(`n`imq zg_i61eAsjv_%vd;nVRt%^gd@_jTeK%gt-(~Teno)K;LP)t>lSM**u}rg+0I`^hDyl zR6od!3_rQ+B|t5Z@-4nYdSQUIEU1KWAb(2FU|#=Qjj;Yh*6e3B`{bmX%w;LY?5!*> zB@|^2B3gm4#C(NW5OsWF{^o8|0G*fm#FKZS<-Wp}%QxqqneQh3jox8w&mBf?)t$FM zBEcSOu{~*R!{*41LWOkhH}%=(>zF;4nZW@0B=3zm3^C$tKM`d}>0KM&tzLtfh%3ZH zwAn?;L6lXyR%JQvvR)MfYQGYkXqJGw`CP-X=>g94Z~oB3Y6fuVlg;?Q@%tQoiEeJU z=j#$pgkhQu=B13fwpbOnb7}Wz_+_^0nqTdH-@iCc2}GdYeIw$uY4g>if9;X3q$Y+v zU{tSV`^6$L_v)6YP`;|Qcm+vvGk#T(FuV@LbKjm10qG<>VpeCKWCS+H#sh6Lpz!!y zOa69aAYLO2hdBh%QJi@R7_JKH9_v1BR5z?cCd;mBCy5Sn!7zovrh@V7nlb!_LO+`A zch3M~0vM`7c+hVJTwaI8yO#8KXfHi<_bVBgD@mEVRZflwL@6nOHl}JB#z-isEBc3L zKagJm*~^s(D)-?}{n7n`ALnhGN}s6YY3s7%zgiu5Ik(n&c+2D8 zV75YC50+V=Ebe3Y%$i@Z*Ve{#qDjg>_NulpXuBwsZv&B#`ie)%yxs5HlQIsg?>_iy0jpa#d=H7m5I!~Yq0fVd3#OF8-o-$Swy2>{sLgnWO7t$|p@D@;qnP2V8X-$C`5QGfPrzIi`Z3kfQI3|kp zRZs|hrc+SS#Ex+zeRzGRp%;-8_W7&b5o1(njE;45%Cr*UmP z0ESanQQuNg(#H^N#8QVkHINR_CzXPdtW$a{`2qXfaRg#=cJ)y@*#CZF3IMolKcT1Z#agie zS+$Z7@MDw7DKW2L9)m z^Rq=qtkkVjTF#<&bLVMz-52PV6cPS@xtW3h#}^YkPUbRE^Z)YhZhT> zT=YM-`cLs<58FBTBzl3YyXPTB1uU{}rT%;LLC*==`qWF2z2xU^`$BoZh)|OUm?~(c zU3LXn>U~1t;C5hyKV)q>pSL!hw<1Z5e$D^tRQ1yq6qLaX4;(^(4`q`}WK8U$H95D# z{0d?Z!NU><0)5f39Wpxr%ZFlN&tk!TpBl{&@lN`@K*B02k$w z@8JCg!M^&CtDt`#mVap^1XB7JwlYv)gyOFMN00X53o&mT*(bI)4^V=Omxd4P%EKQD zl!pj}4Xe+{$n>V3Qjzd{45YSbXKt%q2#$cqY>gM^MD+(vU`3lk_|N0u2us3i<4_k0 z&XgavH-$uxz_)i@2q_UoNPxAZOv!@wrKm` zelr|BV7Pi9wCTTmrvLhK|L9Fe)_i;(2xXXj6X|>EIm9Y zKu!G>dtx?11!^g?J5xn^9%a4hf*gLAOtz%|Se5_RZ(f25EGaKR<-{N_d21ls&%ycU z-f0wngrj+X^CVvT9xoz-p2g9T&aoFS832bW9H_6}B=&`%9toy~1+KkuVW_V9Pqp2@ ze!~BcuQ5pj0H7l>I9Sqgf6>F^QP~T9S1sNliMQ$i1#b3%!-NhnryVRg@c+D=;1?@v zQk1N^m&)x?APe5W@%mKDlJ@uIk)$IS{62KFKL~r(JA711?0*}+P5?A4pN>Bo=l-W9 z?|*qkIz$6{dT^3bE`y`}X*WS&NEfz^>4o2;i$5Qz7%q~SXgZjsT|Hi9hwlOC{SQfz zU_O=sAaNylN!^~x8{rcBN69n@y+>|JnpFSW`{q9m3bOI=u}_sBf^I&#$SYHob9-=V zF+BVf*&ulKP6R)zV^q2hkb5BxoP12^Gczr6CFZTo(MQ_sNm2jx>HFWjV?ZFqG-u#& z1gSCKVtV_>pKwISDg1~wLGiayI7=zCwtSp(pa@y4K9Z2#%6s~V7tU`=+x!R`$U(B!rw zh;q0d$3O6a)$oZZrKk*08Y@Q=^Jwpv>$f#G9<+Pi^+emTSCj&c&sT-{S`UQ;Mm5G} zqR{uxv*318HQT)rGzg_`T0>RZoJn|yw|JJi6mlPK4XE+up_}PG=y+p+=K8xr8Zef{ z2Kf5~OE8o1$pc$-MM1hY4w0~Dt@o1+P?bw9P~;vy1m0ePQ-)-&M2N0!Y47#C!!Fs# zLB@~DEO4NY0Dq(ZYq_mIEn+V;S!CuO=8Q&(&_bRRdfF$Yt}};CO(d zi;)Nj3$z>fjJbNY^5&h9o)@McQv&GsU)XtsKiGMkYze7dfed2kgor~Ik|9KraNJ#X z96rwlf~faM8k7X@;R8J&*m!>)N$^DU-~@mtSSv%f>79xKsWN@2>EGEtNV1Rej9XhM zp7pgbd!5_BtQT))5^?oalC7ZOYn~MouKyFj#cyR9$^=2t&2NE$_3J>>sf<#36uVCOBztoH07z%n@?CleD8X=#)LAZ ztmqz`W0`{VCOB6O{Fva##Np_eDJ3m+VJiI^6ux&PuUBw`mulX8{D(V1jX#0^am9l@&&X$|Yee{pD(Ycl|=jro)FYahUYJp!nUNVfLNZ%m}3uP1%h zRWI4$E`87Z<;P~FYqPq^n~&B3Pcgkjzb%wm1%$wqA#WdC;j(IvtxjFWo(JGaKf0mq z^6z^QNQYT|!}AlCoeKHAKMm&a4G&MA+z{NCPe$)szl9Qw$nhatJCcG3Ay9`8S9rrVHrx$F8dq7(fU4Zq+w2WOv%X_pj&Gqv8 zU1GY2nq%1tXY2N3!RU9Yt|yFpQz~d^$W|b=f+d9Z&3PZl%_-YjdZ3u*$tRCqw^cuD zeYe5r<0qn(6EpS}CdL$qkcF}_FWZ>7=kkoy&45)Hz!iN}8e0Fe>hz~!fBO{^ENGRo zHxGsgFmT4dr^`y9?{JJ2JOLWlU35hx1eg`3ibe?;|Ik$xGjLb=cJ+W74|fg;F`j;m zHaCwxSk$lbh#~Y;g>UV}=B<3}}ii$;yAz35Z$1`rRcmXJl}h z|7_|R|HJ|R=P@r3f;lw;QS=Hq$|n*z{2Ne;Qyd(v7uCurY^PrAk|;Rt#{=|tS&e`! z3p3)jl^=kwd&>Z4tFu)q<_HYEJzz@oSw%MYA&6vUHIaOd5HD00@Mt zDcZKyE+-+~YSd@}b6|@x7`W@G3cXBa%ZUI|W-#KJt^nX@yhKL5%7e+s-XSQ{jfTOe z;;`mbFOqpjVUQTKF#M`F~__lv=ga6RWB<% zP><31-klK;7(6dlgJqtr)qZz0<_01t5biBLBHPRz;=Q`fezYrnU5WzGyc2BGK5@k^sM2Pn^?!!LvQm(_N`Iwpjy_^`k7O>+Ai|4r?MDHs62qcU_K zg#{Didz9iC{;pmM=wMDw>6OHCF0-8(RJ=P82ny(ybH+w7r;@Y&%})`7WsoogveIJ# z0zKys;OKC?Gy}O^TX1j&oV#M#tgH96;{Gnwwh1^+FaKSEF9utUd3gbyN%y7F;DA|CHi}=+T$E#25_R*FYQd!O)3~$EZuK zU2nqxkb=!s$PY$7kgX->eX(>g19e+_pwxZ)M8RWFXAjlabsFJ;v0U}oo%Le{?g6^? zt4-?wsdpA5fkn@P*$nO(CyEqFUV)x~f8+M_Dkv1N`R!c6&=Wu2o~9d|9V3D1Q@e%f z9v3WM$(75smN<@kb+diwK^iXWz>kXuUKS2OuqAHjRvC)F0=b0~RYuf~{bUU-o7pbi zVVj`w{h$_H11K!KY@d4lUr>m_FHlA3x_&o3c6)a=y&)BZ=oSeU>np17HXxh@2iQOG z=6VCEYjRiZKpkuh$gee7i7Yzmi|^#|CIFAdaey{?&iDp8nsyd&3ATtHFl&FC{_2Yv z`m0iPTgQX8y*s#~jwR67>jjlV?|j|v+pNQ{Kq=5UIMk+2*1|>c7~H^3?!WJ}zO{j4 zv3Q+lUeG@19svbBHr}AR} zCu0j}2YP>fcY51=nVG+&S7jKG0u<}aB(;SPisw4(S!^&Tj^E2qjQ|t;NWNwF7a4*C z?mxtPBWEK4?KGuRZ!h9?h11q(A}Qo@4b?+Z3b;0;z@_g2Xhp^c`H%;$YG)thrsR!NFP=s?5Wnb{sv78mV7J_lFY$hZD;ibVK2Py(bC_XV9i8|z=@Q^b%6UtR z+%H#U%Ah+eYttGAc;MqE0122a%n7vJ;X&l^p;zvQ)@ul-~_rzvD?88&^O zCTw6yAT4+cz}JlCK0W{y63p<-8)Tz#xF2Hf`Th8MFdyqXnuU1XoUAV)x^46E;kh^nf;_KCrd$)eI|&}iUPV!Kr!6W zgfvAzPfCW&T0qhjl1v8^lAy59gD{fr?{1>A8gJmf8UoVIx0C;_fL0_!Q1q{M(dCA*Ul+^(#?P&vlfyX!90 zHiX&>1JCWkJdMgNgdO2|H9*5S5%*=M_k#LdL;~aDwj+*jHW2n#DC`40Y&?_~hfbl& z7gBmg%62W#^Cj-&mxt`$Jx^g@$N5D)^ow5|&Z_XgoFJqh$#i$W9Ubl-G@%}t`+FDq zq$qY~`q^H7@7De9R&quKZE0Xfxs7k%Xt;E#Vl8D~(}Qm*QLm|#X)%#ZW70Q(XSH?m zUDO;6EiEe1kFjjNwMMgG)#8tF{_IQGy%?(u3MpN|UQ@#O0HI$Qq?_U7^@Q2?!A>bo zf6U={Kg=~23DPW^X{nc>9_G#+5_dpMN}t56h0RS)XUTDeBA(+g3`o>cVHjj@$3c{? zTtJG$8m$DO!bbpQ*M2Hxvx(fLgLzC2l&8+*fPP%JvOJH5ZP>r&-Skf5JrhAIbv$SdE0qD}#cuc}VHcPWAIEvz;lrg7ul`P*DKq$cnCD^D_b)UnF8^XAqEM_LcaajeU> z?A%1U-9Hp`;L>Ccqu@jHg+4^l{hY1LHaP^pPW!h1<_g^EJ=!I$-^LV|RvNvg&7Sey z@L&z%d31%5@628v9en@t?BM3Y?ZPAx(GSqIcA19*r_>%W2S|u~p1oqB?9_bK*GPSj@I#M>kb##RSsfsik9S!B=eblj{g8*ed;(XA-qa_@~iSBb` z-u}Xza^4-gg(c<#cbD^BIbkPNz2_@BcZ)I?>X~;u3#%5_7JLq7L}6Ce&29%3d>BAY zLlK}DV^`#|%lqyN{wo4Z;pa3eS5_$)uNvw$q+(fV&0%-0F+2P+#Sa&#*Q33HImMwC%aQx$(GrG-!<--3&C1 zz)9UA%mbkGV_kI$4FUTFY|W-xQyOwQ zq{U%DuClMgOeC)^KUU;&<%MVL0!t={!_>TcH}S~chC&AN!)*NCu-i6AWKniUja%hudAy~Z zlsc5k6;>BP|3%lJFHP`m)09EU)~Xi;fZuZNuXcwGX|9&@;crEkT83pW88oG8;Ps=h zcBlJRbwA@X<*WQQYWuR|y%IVd9nh<)LCD~Df!%{5#}Nxvc^nodCmZLm8m~D&Wb=5YB+mX;4w>fN^l4^+SCV=Dt9%$_Xx}h z>rW7gQRNe!QSum7YJHJz7B_qXj%;rGGzTMoWh5fR<8pau_zV^G+}J@IU@0st!ncqO z*j~7hf-!o`jQyAkQ#-8F9wRLpgLJMEVJGJfmAH@+&5RH8o;{?}u7yQwVG!ute;8BX zlf3>0Dj{hR3`inySZGO*5k&SzCI3{!28!g5w3=>lg_QhpqxkS%l(H!3R+?zqAP;6L zuo#Xo>4`{6;Q=U2O7>i%u<1e{!E*29>gl$+S1UY4m5Cuhb96{N*pNX& z$cgseF>f34&$C(Rdsq?7);f{`BNUt$B!-|$e|rh|BeF5dmn?;NLA{2z>U7Fk%mlYb zKGhZz#-H$THqcl+*`KXHG#IlmbCySTT{R0!E5;EKJBesZ!gw2H;`$RBpm@a1ineic z&vLJ|A^wzhDshSI9KpO`RL{t3b2)e|PtI<{;SFR@v9<+z;4O_)wgz7K&uGvpkW!&$ zxkFtS%6+@;c4)#>BJ$bT<2t^B={>%#*o_H+N(ZY3{pya&SVWI#5@)BAaXE>8k~O!F zGfmlI*Rs=?aP!lUzBhaU#ugTmWMSfds4SQIBy97m7-aij@XSSUJSj{DW0VRJndEkg&Nk6DnUv~!TbC3s! zm2sBP^H*B{s){(@%TI^Zx+a!kZKROCZ=rchsy+hq4T$Lb@6)A@ZUS4d>0(1v8y)la z^7po71bxZgW-1ujsrTsOweLEvA^H|uk(&GIQ$h0;a+h$^@z|4(PsYMF23}YQa@chZ zh!c7tPL5YDvwiz(;Y_J4(QAn%|3b|MEMf0YNcbHQH}cvijxx=l{>8`SyLfw51nU`& z>$iLc#;q{6E5OQ7*N1zv(ZEsr-S~wf`?_fpqE~FXflyzE-5APd>~ovZs6ctp-2P$q z3A{T^7w@QL=G7itpDzpw(N|mnSFuR(`8y*y9FP4d`*xVyjKM<9n?=aF84qn zfV5^5zvuoU3oGwpcgfX~&G#B>^!~3hpcPQ|{J8KLFy*2ZgD2!S@c~DbCsak_yfPPQ z;$O7cdDMmjToeC{XwvB3FW+#|{*Dh1kqlUqWX6j-E(kVzPm2F@+0U;?H@ZWZaf7L{ zm9Z{hgD4&IQT9;yrAN7ME)E)M$3^x^HV7raY)OQkz}sFQ5JJOAp;qJpN#Ihdo6BZaSE)KOy6ucUn_9un0*UD|B4iLNb1iIg*Z zxJq5No)BLbhC#|dj(u)HpaRk4!(}l-?$NihTxuWt3`bTsgOgoZ#r>o*0rILbhVZDq z(D9hENuUGGq#=%&=QYX>lN+hvT?d@rM)|igD-Alzr6ziTZg$wD@&V7jKfNp}dHkuCxvtUy4= zF|z#1fgM9icu4URk;@Jj6U5_OwA$^C)=R2dMYqW=Yl~z8t-!d2276WUGralbzF0;4 ziqQN|AzF{$Rny2dNysNQ8Ns?*Xs9Em^;UP%E+Yow%cT%TCA*GDwRu4(>Xa$b23-zU zI+G~;pzpuSZNHNW&GK7rV0gs*5M(B*7&)F0{2V1{1gT{G+}FJm7CHboevV!abq%7{ zQ|x4D@uOOLLc*(HMbmzPpEr-sI|2`+CRg4f)~(n#FYJ|^m@UK}U?I(Q3mt!@KIS*|%1CI8 zD^hsVZv2Vl=-DhN(au;W^eNvWth(Bubs)a1eWjtV#Y-XJeen#Aa;{9PZMJnoN-!E4 zZz*#9lUfUMv=AhHtb!PLWY+i~_eI5>Ez_DD8)GR450Ca9q_VObnRh(vb34vaOkjSS zn&=W}1X<^QHx^|%05q-A%?RG0#}K?j+h9d4ei+!mv7)2n3*sR+oa0>hNYPt|`cko@ z)9nFRN%ye6nD`s*6Q9-+5;M<C0Y4opa%x8YDm-=R%+QBv~i z;E4J-SI;7!TcXiRJf9ZMbKd?bs?S|C$92FUa@_A?bNM*0N4fZ9RmJ9KbbrxPwmt#=a@!7n7-H*W z*31q5<=di;1|D8Gbg~_9Z5g3KHS=c*@~wRxMk4x;;YzcFedwKxFdh=5uz;#z+{mz# zA0KvnM^MruFGjUkwiBJC5)s2&HJdfiK00=$_4DTo{={b)F|33d6c~M>CVj1-slJAC zChO6RJ5Tg%&4Fu9V!_tDQueV;Qm$j^vxkUl50Ul(1Jc5{%> zN0RpcZZI0){IWyjccLs?D&+^x?pAl1N3d@(f4)JC8XmXFLz}V|{q3#%=?LB~-a zTb2SX{8(eyTV$XfH1@P)VENwjX^P!0e?uc57Q4jLhA0MwytL2`5GRJ{^nXt`+nIW6 zYva(e9xDjD#s>xxR`{Ij1;JzxJXMmX@E8i^S>uRr`MyG|G(fFQpJO>-H@@r-hvuFN zk@3=8d_v5vf{L?Fo))3+v0%4<;}S${SF+16h^Tbi(ujig=rOmdE@U%PaeeHeM|;Lfg!>04DC_ z?iAP_$lWFs(Q^rdNqQ)m?E;6ck54O^RWHG9v2sl4BpRQtulsN>11;PxpNPbk*QGG1Z|wq*ekKrv@Y}UEWE)2=O$wgH6kRBrZWf&P_=jV6e+et8{csw zY%AJk4T_fQfyuIQs%fno5c7R>wJGTmj=pZ|@&yuqT`JBGwcWDr10R9)YE$qa`rJC5 z%F{g|Af3mW7!xP$GahQOBGEWXQM6WA0*QOQ^_I0sqG07JR(O#@m%M=cv&tbJaKdwE z?LLu$lnsN#{!qWi*_G=j${mJ&5fD#TUR6x^zx%V0E4+#sey z_@ckTphJsG=EfMs=LX^ScZ?2X1DBU}2@K8)lo2|eM6WF@JJuD;@06f@+l6*wvbxB= zFoB$4UMwI4SNlx_WYePV_`&9`_^bFp4CHzjn1$lXkEDrhXSVVkKRbuEV*UJX}<< z5+d*e@5i5{_C-049&ZfHPkpc}K~I`Ex1LBUy{hQ^bwmpH*sCIbOyFeh9~MCN6-%Ti zk-}~z&RDq)WOl%HXKKO`E!r`5K02-glw`Axfm-_RxykwLepUR3-9jBeV~>l8rk%`T zQ1H;bNl?ooPD#3+mF@4imJ+V5@;k$%i>LaZ3O=ANB826iV0xukBsoHOf=3ciQ1D|N z;X@>Yn1ynk_f=`_BS;|$2<@9-ISae&B>1bxnhuG4n9mpvK{;b~xdUFk1Rg!T z_>bNaadJU2GKR@ zN^)yYfpb#xS%5TGh9%@|<~kPDz>JXXVK`M}Mp5T(<2QD^;gc@^%U6Ff-NS$L6r80) z5`Te+NswBK7Zj?v{cfqvt6@|bjF4DjW|z*|(oI1Z5=MW#%p$XcaRhV{5SH;|8bE2Q z2n$8R995Q=M#i8X+qrah%AG$2y&aXDxgl3V+h{BE_fK6GIesyiQcM-Ym+p=AY-7uH zkawk6j2Tv4y|ne0xUoPnNwG{|Nw2vJxcXIV11io|cc^=UHM5U%*#W$*;~Z`caCm7M zfOUbPPW7|%5lf*$7{&!dX|YD-JjimzlQIVSw28ouaQ&uZbfZF0KX(5z0ccW)B1~<4+T%?XK%WvwxWtlgOjwUBfnX|W3r<2lE}hrIDQM;W!DY( zhYb93uJIs`F!*FEowvVXh#a{^){&iC-4ZL3T!W8cP|7jy0RQpLv z+lyZlL$f#^k4;|}1)I;xIr&BSxDvm>ZqruQG>i$^)`I|Fn?x8JoriqtiEEX+UIj*+ zgA1o0y?$JP-qW46YU^ZsG?195maMWr`WWN3KzM1>0`n0GFF1@dcc(e!Jg*7r#l3eq zbaiRoZ;tdWex3qT*|cdT(Eph4S8!)g`5K^dK;Y(l>{=c?2#2~o zE{DVt!kN1LwvY~eh(q2YFqdcC&;Ctql zHvx591!^H<`Bb}v*jMfy{xwp8+mJjgjIP9D<(q~8{f2HceZzh;%35L2Y_0d|-D_9L zm8h_M5tPfh*^vC{2*al}J>ueEdaucHNjQ!3Xf1R7RYmpbgnp~4pu9XUe54WRwp1WQ zRtq?ScX*8jgy!E|*;w@Jy7f01(rSk}#J+%Tq3z5y_df4hJ-9RCg%Z72%F$l`T)OX3eg8KMF9BaQ zm%;n?&OQONRQTQelg+c3?!9gLowfxxsj8#WPe+rs^}g~Z3G=(&_J1K4pk$UIX5dEPB=VJfaCjXcqG}ty zCl$N?)eQ07#>79bqvR zbgTmx7s?^vmnrWh348s}E~-LWD2O;Hv1RrIdWuo)92Qm{Qq!;RUlsjci(<19ACy$z zE;o`i67ZTS{;b>9pvrk<$KLvxgz=!WRzu$*0EISK?}U3dG!7l!Yp<&ZOzN@5%>og^ z6;eOeNsj`C8!8Z=JIy5f2aPCxU7#$0Kk2|oZg??R(c zzSu224}gHVXXM4Q*O&`j1WLAgC1@*j!osSLr1Rl`k!FGgIT$H4O~3?NMOY0VBt{d( zLnbqhi4P9&ip{^Vc*24YRrBWOPbi%La8&XXs^IX-i&YV7APKBW;!ZCE1F^a_Q{0)y z`6ak#&z)7Tmr3FBMu30U6pGY>n;7Lwa?{d)%?)KT2(P(>!6#NHAxnAx6UEfQXSn>DmrHf`Xe!`<8 zCO6YxYS%JWob{F#+5?i)V{pRhn*&c0(r_+NzsZYg$LQ^?Gm&+eMf_+m^JS70G%uWo zd7BSpDMs1O4+!a0CyRuKndTl#R||_ld#gc*X1~DwUD|I%Dad1lrU;EDM31-r$y#(^ z-Gw8^@9JD!NdtG1iJyg~MqkF5y4?;iV6fSKAx(tbMIQ89Y&8#?f1l(z81eq6G++LI zmge8610=H`MPiPgWsWm~c+5X1WyA8%7NZ4Hb@C*S{0+enb;|DX6FN(;#w4)+7(8y< zt6yLaNV_1VxAeNeU?u&8^RhchBE(z!9-JY6UDNs9Iu1{dp+2eH2^|~)>Y*}FK&n!- z$$p^ny$5pzQlPt?g+0?`*RB6$A{xWU_yZ^q5_wnwpEhd88>H<@@>?D}_q}!3%_6Im z%uPJ3?)UuqgI+O>=Al6##sp~SI;HB00T&pizBhYrvlMjk4)`{z*ZCA+<_X)QS)l5J z!L1^IoHkcS)-3U4&4_jCdk`MmKF->3B2)2$q*+*Y>ViS9Leoa0>v+7t!aywUhZKeX zM1`K!I8b7Pg%_jvq&2Var}!aPc7CaFkY~O*aOs?MU#kFFJ409R{2&y2D@FYOL+-HIR*qPFYtR7n@%J_YvpW{iC^Lww|?J{ zE5E)68ol0$Ad>ByTA%!;S8E*s9q})_2IQ$in!p6TPVDIM)8UUU=z)Ai=es)gZPOe> zpioFjFI2FNJWuXJ#F>OneYJQ}y03cO@=};D$(kzK;AHFKY@(C9*_hc)gwO)o`;wbI z<)Znp3l&aZkg(Xll}#ci_}duelfxL-Tx`Z z{Aa5NJAVN^Y($yEw40f?Csmdbw0EizTaGKH2@}&sd{+08NqdUkq7XAJz6Gr28ly%A zU=W|*4TvTEuTlt6zsNNzKgKZPh-(va87z(wkmTNrF|mN$9?Rb~cwN}-5wOXxcD29! zWq8nHt?|}_qs{^zr$F^!Lv2ZA+bD1mx8%)!Be}>g!Ea+3mtjwL5ueedKO9W7dV$hx zj9i?9V5w zcwHEYOV@Yu7@fEvE-aMdL3c*3RR5ZG7+_ABd6?E$F`v2Zu3!B69?y7nvXi?tTKId! zhOShSZC18VVABiqaO9v5=&|~+r#`12oSC$03QBaFYR)g_u`6BYcD+O8o}@pm+Lj?w zy_9MSaSB;U;RMQ*wi?fOiZM{8cAXqbT(j=b7})-@N}Y?;nXUx@iAtN{ zl#|0YAA8=AzKLjN6U*ISyz)U`p|!8_!(r2pkBiUw{|{$h9arVHtu2TM(jg#9DIqPA zN+U>zfFhkD-Q6f4Atl|Qgh+RHNhu*ADGkyg9p6|x?z#7zbI-T;{l~q3uzDE!F8vy|?s~+#T%BHj3B}_O}H4uWzGOTBe-PeoFD!DQjEwJNtcohFnU*j-NVFIeTCFPlf28 zgAdZ%Lf*3+%Fk(}2uG^0xU2((7DXISGx-YW||-HWiqYucOzyDG0A^l2fd5x;#2Q2$;Y3hw_i#Jq__Y8Y#9!f)z zO#p62!v_I|-ovIZ5Z2nc9wRG*FApcPd~fb1(8oS2Dcxe}pJxm2E)xxyJ&qCywzU)L zezhGm;NdS&rBXm#>IjWjfCLBoPk&uC#rI^`?2K$z*;m_p;_3+uZ%dBeS_M-y&P6U3 zJdc9R#^YC4Fnqt0bD0kJT$hJ4y>Ikmy*ZUpy~z+mhoe?yAGg3=rFJ@|MG_t?-uUTj zT3^gXU!jDc0A9wjoA5wzyar9X_}1 z-Wq7l&Pz_yI+rk)3ECXnEjgCH3EH1>b11camLYXC<^{azYrB*0dsX;meR;n;xhWm? zhE2a+H1hiHq-^=V=zIDRe44;j1CcW=0%J_Kg{T+y^>1(}($;6xWW-1^pQ*D85L(4% zp~r4o`t5dw^j?yC;pNtoz%4J>-Xs2gufVV&^Vl_M=0aUjk7b}o++|IBUB>y}>Hvk1 z1BLiT*oN5O*D0p*sM%!We*LzWhB7-*j1(LR<rozxU9>34X6 zFg0!K1#cmXHVoE1{J!ED1A+5Heebye8U1V21zKd4m(cS90UivzLBmu-fBH6H7UHvL za-FhopmkWr#~Xsp>|8}9ae{oeJ}%M|`(+Cg^Vv^jl2@fJ1!Y$aWuF$}dh5&2nX6Uo8z0>iJm;5gDQ$?> zJN*Kk%FRtPr(_Qpgfq!ncVeh8s^kyEFTep#S8UizI=q|O>kiCJ4_&HSK|P-WbNA)6 zH==%+0V8>|uou7L2FC%y{kbEHtE(VuyNIaB&z;i+yh%f>CrXk zB(v#y)}P0zWLOv|As?>i-hUSmRHj)|uBK1Kg`I}u!2Ue7MdX+F<*UfAggy?Pt8-rl zz)N*HKEb(E|6x(OD6dAI8Yj3->Bm2>u$Y|Ro*1L@X2Rj$Oa0QTZi$6`n3pCXtaC3f z4%Y1oQ-^Crh=&5QDt?v5of}J|;qh5mv9E5zO)0zjYi}yYVRTSNEN*lz^q`LoOxtml zF=&r5%{a)e~eL@?CINGqq@{ zQz)PXj55z^XI1mVPZ3YZ+rbZ!!!OZhLvC_Ug~nBT@BixmAm05zZov<7LWf7TsrD=` zdhcK^A{C*dq9*2pFR5|plAx`Y1pn29Tgn2Iv09mLH+`slBz?{~Y1$hD#S2YcHnm^Z z@t*wyvZmxG@OlT;J68axxY5n--r}}MUV7MtQit*`*b5{R!&1~J6>%}I?}OHQ=I~5 zS`=hKV!$1~LUhMv&q zWu=DmJY=5F1$@`G~8K31AhP<<+-VN|gfXpb2N-=!|$kcAWZ z_TAluYZjj|#xRVkggy5Lq|Xc*t^}`t6*$S&vSObeD*e!43ZB@{Az#PNVyf1+jQ)ie z5I-AaN*p))+^>y^8+D720~1K!ygr-OW#3IM66i1cvVCSD$JoMprBtKJuerXN5|~!K zr)aGa+<#t-`+U579p!ijq!rzIY8u1+h;g*VUfg{e=O^~y7@(Mtb;L4i6*)n{NeDE^ z=!I}Pd2&@b9v4E4sxA&At2f1&HKtN!E%1z$mTkZEJtY@$J^p+rG!VFx$L5c{czxDo zO3cR{+=Hfr&bULb`~*1l=e;5|AluW8d(2-xTOo7gz{S-Op}-LibTV#p=sIW*)(%q2 za*IE~ef&#oIcJRtHcCTx3KbhEDTKUZjBGk@lti(@g3SA2s3oo0wWgY!O*%3jVWy(t zU{MAY-T{e@2ZpEM!XP<=Pg9E2z`JRNyR~lIzTLd>ly^-`OHcOl^ui&F3kV{LS@SiH zP)+ZwV9Z9VfBL*>Vsyefo`?{urBI8?00d;bH_V?`T0Sg#og zp%(DFdJuxbLk>uw$^r$zX3JL%-9I2Ty)ZFEnmNU4 zeUc?dRyWgNJZSi=${}q1D_D0fRNUcmP50T>`|=ZPS)%os=80`%;W&(HTpR~mtFEJN zXaqVfXSU}$x;J}Xrno=WnM)dhNd-1nsE!5dbnv~{udN4e5J;07F%$UwNWNIE?nn-k zltbcJ@VwG8`8xJC!-#}uLBM^~c5ZI2?$=b9i$?cGypJ?{v~>pA78BV}+fLc)HD!CN zmbKG9&XkR4#cXdUbi|S@_?%Nr(_7a4ir#Ax>~a6}z;>PFYBz|1n30ayhiipRO*c3b z%Dy|sMHR&SiU1jJgI41myyKBb(#xi}EYW*Y4b`<=N&nD!Q%>SHq6+6qVv+NS3i-8m zMlw2PWSnNjd?@CKlT-eE)?@mhYCP(AK71OzTIc`=E`#t zw4V&RniG%M6$0>SbfOlc)h)tbWk`{rk&17>jmuFZB!=!~fp?A#OBV*+bW- z+{*R$nnGXZ94Ky7imzyXccn;%PIt9$d z%v7n5Yp(@SswkC%1#6r^36*=Lt=ZwF{D!rg;at0{#^9?=tr|fTEI%CiDX&-l0SfuJ zeK&cwWOI^?XihGpb#j}`v)UmG6QcEBW$!D@MhSc(K3- zgxnIHf{!xA_x!R*61{otT@@zk*D+&eC{$mKuJAW0Tifd)39~c#zqy~?@8{R0#B)wR zg#96ulzmatdQg_T+e}yj%UsZhDH03{w7Ek7$yf4PVwWhIbrL50l z*5BAlJ*5;xGLU9)%$x!$njFLNDIHv*>&_mz)&W45l{#FZpxa<+ocK*QdDvS5CiyaW zO_w_`{jA=WSx_rhjcIcZSclx8XvhIIa3@ww*JStfYpKDNpD%dVB0Z$4g@v}k?$<{D zM)J+zEmE#~aD?82cT(vyzBwm?m0A=o?T?oDr6~xP zPftUl?K&e96z;RyVpq18zSVoMgM5}}9C{Sr(Igv@WDXIgMtXWAKT?`mBF@uYjHt72C-<;Sm%$<^|pA{~*sujG)LR9u6wX z3m zCnGXjvnKj^ol8^(dU3#TsW-aOy=3;6k!p$);il}&=vuWfsOJm zio_aibhR#*Ngpx~=;G;(OgvFbTR_wJTuA-XWNV3qPO-<(rzo3kXe=^26TiDth?xvy zG5J8Q#(2-C@;N6^`7TOhed_98Ij}I%vSzSt<(%x@V$d}5RRz2JXxosUjf(PU z{Gsy>HT`G8AI3bfNA|9CcPdjjC%F3GMpC`@^bA8=2t1v%YQc&wPY%5`j=^M@hK2be z3^jHftLr^z&OAEuYKE}TA_|@tY48Eh4aq%Qig?9-*(#+>`q+7a&`NgQMr=~3rU*hK zyr;7ggd4nkt&DWb696w)C2jpQmh_8%tgm8<)BqhF3q8AxvusRZx8f7Kh3YrUj&oN9 z-JWt(3((g6jFb49OHrwUN{1$N>G=&a#nF!z-y`e;EXyvG$+4DTCi^?GRf zHaQN1{qFn$na^2N6(Gau3LK>l46m7;#Ejf7+pNnbydh{^FNzodO(^zN;m z*snNTv>4HT#2$tMYb$Xc`wpW)+c};5(Oi2WycRL;aqhW62Tc`|;McX66StX8rpXju z-twu=Mv^7HRqq^9CI$RrD((FdeG4P?zk^QjV4Yc1clI$@Ef@)Oe zZW&$p>0NpoFmWvYwoS{qEi3%l!g#mMQ{zvj=?y9%yZCw3ueHtF?nb>>nd;Tp>BU}O z0H)D|KOkI+WxMHW$vnC-62j)=&TCYxNRf3pbH5vOiPI4`raD6g3$4^rq`EP8Pj~s5 znJ?~Wbod7JHMp>$a!o%VJvr)Yc--P^{ogvJJUkxv>97z$7%nu|41C5uoO-yoMp$f@xOI08-IFhkPKfZv!n@0q z$vavn2-jlM7e~ZMritx34+H7gheF&-vJaXtLoB@-G4uN}y&DuFYMKUuhAjav@QA-C z+zJR-`*t5V>k;CYa+ZK;Aa45ed6kXthfA^7R)>IEj1;Uh?N-vMW>BSU;#mhMdP~>s zRX?0T*!(ieiB8)Koj_}>qApHrcyL8R_~y^WifIcx&x^Ad8lESTI#kSgq(-uJ$3IQ? z^manX#uxAo!s~HD`X_3gOUybb6IE-Sw!=iC!v*e4%@Cw%^gAMC%*CyuNIpJKrmYDT z!Dl4l5@qQtF?(*?oq0*;Z~G9X@xs$)Axfp1eBU)rN$d0v}&$0{V`_^Q+) ze$L~MI?h-NS811Drfs9YGIGLU($lu-1giqIX;jb7N}geI@m{b1(qgor>ZF>m^c7vz zepFv7?ImjRMzc7U;R_hzgq?*SYr^nS`D5>mzJV!7+*R%*rXaoPy{DKD7~UYMeUWOb zdBiibQjw033^ME_mo7gZm%Wdpz}PqhYH4m!7frD|{j*#n(dmq3eKvu{O1v>LYd$w{ zem~=i$Xrv;m>PuXaHHcqaAypvW_d~Uj}>+=WsCEB$je1;Gfv?)6aix%?QI>KAumOD z3)2chWv}Cw*4_tRDn&j-1(CvqRC>)m=!RQ9C3iMS=w@8WcOynLY|HMdl^T6oWFLOO z_;&lAVGFOW0GsDIvdx{k2q8BM86>Hd=_6(EkDY zV)bDxGdVF{)aclPXZqM}eJd{eYpM?f>ws{+N;2Q`EJgWQi0=ALk;K{dSwAI1wF-+n z5l&E|W;6=!6vNS_%6(5f67 zi*X3Wg*2_oM}_mkcWvBN$1P4sbF^<`Dgw#J93AIoi6)^Uz1x-BXt zmN{+Tev%X2aQoqPoYh>&cu4qF?WOw+BGKS$jj^<(FGFF93Sr(=^uLI|?B46}uZ*71y1{tr zIZWX&_7Rj!2{zmXU7DItZ!uP47EBBc*{L8LIl^;<9&yBTNK$&9pHgw+z1h`^#q}+h zJ{8kT%@~$cGN(3n!gB!3!=qD3U(|$DDTe|T2PiSa->nDQ)A;#I5%QyHqn)1W8Acf+ zb#FuN(~NTA$=oL&TuffJL@YfD;tEms_0GI)G!xV=gh32gbFrk4P1{vMBCT!WJnt|e z;0Y~gml{)&@4RYTi&X0ip(#k4eT9xPnZ$wjCNQW?-6$`xjau!3biIaJk@wa*Z|fZ` zh=n|RceYmYb{?(-j->lzo`zpJEv0k)&Vn_ysK%2Y^@{RW4kTpA&Czm!K6-eRV7Vs zXoDzQ(HB+S`+V^aL<^>-5$le)hla=a9aqcfdcd>%01ni4TC}&1KHLZrxykJ@60kM? zSgVkJOg5pRPHuElsm4<_lI`A!ifiwW|EA(i$3h+@F}y}FSE|mft5@3(?H!}MR=!eJ zvRf0Nj#tnK-<&Mswog@9Hcae6e&O9Qz^)};XT2#793Xt@_PdGTD8xWuZ6whf9-+L2jen(gM#V#4({!FKc|X4{ou`LmPvw? zOQn|w!y26*U7~o`9aGS^85H`R;pwO4lgL7*=Y>LM(;KxB769$*0Z4fNCdk+J2Q?D$ zoq1DI!qM#K+!iUmI=(4i5^z8MDL&yiT{k9&0k${XD5HKZEo|Y6M__i}3b1WPw4iIf z)vPc6kJjya?n%1{ezZ-3NFf(S6&aF-qeY=@2u+ckg&P({I)hIrSn|6C$PYH8L=LcR zyM@I3!{Ksp3XhoZjazk61o4-aaz)tn(Ed^U{%He7;SFHdDxxw91X0>gS8fcsuzK)O z&p0^#m7-2Z={ZOAt)DDD=?&%$lce{WV`Hh$g(o~t$f6Z&E=!~L+Ye_B-ye2sTvgmH z(Kl$p+wI=0=Y5=<>sRSGX@N>E*TQFzPPa=J)+TLbd zMXVVq&0#*KksM;e7x)bE_9U#4p&8VCL7S`15J-~F4ZCOpuuX=#Kb!R?qg&*&WYQ_Qn z;>rK;g@LiKR|SgU*W?cbW>d9Q3wYNDuw%%Qv5G=(ONUn%jvetdm zh6HccS;+2u;P)ittKhWsTafrv|Eg&Qb1+Y0C<()}lH!v=txcHp(4GrK!63jdlS9g< z0lQPmuIM)OeGbIJ535FrWr&=5q+4a9dFtFp z{V{?U3)$7FK1mLcvIFL6RNy!g!|?XY$QxS4NgnO)#_ofuGSdpq#+$1#)FH`}o9@ z_Wzz3YL$$8xcgPG4J=#8riroy>vp=jLp<#4=o%j|I&$s(fj|E@+UXYFy)vz6R_&=J zyk>`OF!nwbGl9RC=NkZyd!NUQPQ4mO1;J!1`dxMuLe7qcb{*k=;g!0B79ec zvW(-Q!xUj~K)@73+5H$M zRjDtkIFQZccDmhxyz*$vx&5v2Ll)-WuI@XOoyA_ppCbiXS6)YXS=~*Wg&Dh|+m2-M zrTaTU9AQMk2Pmo5f={rn1QL`P#1>TIdU5@Lh?YRH5k+Y8owfnsMf1wQySNQ+xlihfV|*)( z6`1n)gX?K0<|otH#pnm@=!ICE#_2dGnvRn++&VKTzDc}}#xuRE5PCQEMEhB(<+Pj+ zsZ}Np{>m!zfOM4}{y}j!3js{&3Am@-A`1`8@M*7VevP`u|vgA|JPEl*wLM<}g1UZa;wi(kROv&=Yk ze2FX+u*;zV(wFs7mR9&QQ=sTrU1p3;()|}UW6UUvzgwL)vLnMNh6wJ-J5Pou9tC&t z`!yfDyiUg5{?HRmIbTE4?KoRr`s>l|qMOqHxNvCHTX0kucQ8D)aJZhR39<@ArHXA@ zAtb5X`A%gt>GB4sLbE2dT-Top>gp{Z(O9&+!MPsF_byk==}Tf&K5`ptZC|&1?DGsH zs`+I86av6&;_b$2kJLevI5P`1qtX?u%30B`AR)!Yz3UgPf7gs&Wuwc>$_{bJct_q& zMR^r84^fUxNtEDqDTW< zyjm%Lf0uvjUy=Fl7Dao>yR?yZ+)1~lHRu_}!RDUJCK zc7=q@YRVYbF1A{55YC_2X+EPhjwud~1a}{M!7dUA`?}m4PG*F*qvATFR?a#G5mVp3 zSP)SlRG%xZFH{S4(u#Ma5YHUCWFw2RjPC3=dRn78dF6=8_g?~}-X8t^WwaaHSa(o9 zqUJSHaG}AZR(h8@_M%(Izr9By_n z>0W=D*33EJ0Z>4Z#pKHYt!g`Zaa}#9FDaYJ+&AJb5TFbt5}MG*N>H55!o>c%R3i^k zvAxy{s&Gz1rPRaPPl0Z#|89N%w}Rnc9|QkjA#na`1s!)TfpP!)C?`l_-K(3tZ#-ZC zTuImU(_!_?W&DvD!0>(e*$as^XrWtW+4Y6Dg6-GjuQ}@drP-_@4yO%}P+rkG+ZMF` z1sS;$_-i8@QbBOGd@tMDE7JG$C!jn3rW<+1cw?+gee#dXE}Lr9fBU`FOfz~?$6g|g zbWd1ywONvJ9aUy_CX(}$CgK!$GgH)}a)L&J|&r_S(-bee8Mpcy~HeJ&6IF}Q)@ zo?^`=$hF^3r$H3ndx%~>7KqFMM>FuuV*|6vlNWu!q4I}}MhV%bzMV?2on*6J#7ycb z)P2+nB!|4sB&Obkipa4CtKYKk)PXMo3$0vYI>eE($zb5M6bZlPZH;BqZ-eKE0g6V4 z{_=JHS-+bMK``lz9E(G!ibJG-d-P%9qufE1DJZ*gPX(_LW-)jO{FCqZpWFUF@VI~Z z$^bbM+Af5H$nR|m3JE=8?SY+WA!U4g!dCt!o7Im5i>dq#f5)vK!u?tD+SybjV_``g zw*?O-N}_*Q6OY(IIYkXTfV;bxNP0^C&&5PeK{A`I?z|4OxQrpE012S=fz9qaPeU&l zIbTD2jwl~jWO)DBnow{h46xd6Alpb^{ZIGiUsv7lUqKV5l#XVKw%U-^+nD%{FsaW^ z>yD}!7?`h7Fd>D}P=$UaD1oFL(^m|VU4BX;?Cjoyy9Ck{jZ`Eq)U`yQjK}?P^(wnL z8ku||kFXHhD8~a^Eoy|8i)QQ8Z-r?c*y}{#HCW7Xof~b-bmGvW$n7ZWy-eKwF?oLZ z2OnK49F=CEdO^H>i3=2b)kkc0bUA`g@ugCV|G+JqJO3wcnO@-d>8+@ZtkgrM*GpeF zr@xE8Lv2oe_)9+h2}$xlpV$FRZ6Lu5ine&EvvK`E4R+AS;OB6-!Ck{n`U?FNb z>Cfe*G?z3UL+BLy1ht6YcAH|^r>H#7!1Bz#fUXY?qgs6eR~#t+?eBG4#-nDKac40=@CXJE~pE_+#hGk z#G!EPf51`nqP<7sdx>-sW`8tC#?xB()+|A!U0v2T$vpVpL z=m`=YV7>mW-2dMm%>VW4-pYssj4EYUhmTk3@;Bxc9%Kn3_JT@W5)Px(L*O;dYeUze zDbgSJm!5=wzIk3KiXlQk++!?HsC*z@wKEg(udnzUU!lxLfoQCTN{IZPjnfP0siYUz zf#O#Wa6-VZ%zrZ(t(f*8K$ver^fWOL;_;zs!n?t4XxGyR&r~ZADB6H2)`rO0fZ2B| za7Sqvlq(;Ddz_*MfIuPJS}rRz)@!2_?-esv+ko`d>VrQ=^tVUeJ z?O7T`@aKEo7Tz{5q|50wQdU2bfc<1OdYV(Yyu#@a9h| z3zifL+q2FHiZx`Mfb%EBm2~caOq&Q^M~K5`)c_B%MB^MxI2hrPVwv2|ckH&3N zUTH&=7W~GNsk{KC!q~|za-}Re0&VwS8Ibey0r=nVK0?y3(O_oqD2xFPVeG%aK2}~Q z4$hM8o6dK;$#~1vEr>rmb|&-JqzGC>vuH9vA51ez;q(LP31nh<-Lv9x-brud1-nn~ z;pq{*>3a8KkEfrMB}RF#vDWt7CN{zSrIZ9dvfe zbsTJ^>qq^WTRSK`nTGRDdf>6++aJ}xEuSp?&AiW)!@fmk3+8YL8XO@Mt9an-8_vX1 zy?h%SXsMn+$6$T3UJ(RLr2rU0CG;Ep;qdhztDb*d;5;~J8gLq;pG1F-J64KQuHr0k zs0q}sel%XRlD`J{_)PvZR!<}%A2pC)afKob`T1{wFDeD~FN?P_R+C2D$ zD%S!pMYse!We);@C4%bn9q>5ty~myfR1C?ZOSjSMJeqR-aBvfv)1##nhS=%r z&EdFrpNXV)l{|WL(wbm-ymL)>o-zL}eH~RL&~-f!)86Y7n`40X&8EE}-?6o=Q7ttp zTJB4Gy$25a1>mN-VIh1rvGg^C72%$@>MDF_3zF1Xm}edYIRXhyI_#IgcE31<RUW;ixJcfM z2Y8FnfU^Zb3%q96Vt%r3J_{mC&bo{`&x><4f0r+b-`@j=5J?yE#TcNfVDdPed2>l{ zVG96xK#^QPzBX~dn#%Mf^B!)P$N7<#9&}j@=nbm~s}!&#n_n7+&WO!r&j_qtOFYhA zzE{px{5kxK)O=C_9b6$rfhqS=fe39i(lZLR;J2SNjz~vuDY?v^Q?c!UnflmZb6-BNloy&AtyQ`UYI)g1P;rSvvKNV<)Ku zPS)7zm0f;*lO%hriZC~jzWFon=QD%@a&)8qWhC=bV4Y=nIcUWaYb`UgfE74G*+e#M z;f*>CWq1(mU=pl+H&Mp|)6TBP8|WfD`lS2zpNh{s`Nik+dUy)97q#XOH<@~iSAS3+ z@4G*l?@f?5DT~4;zj)m~4ml5sS=XXDO_XEelMwC9eeX-0J|$^M#PM-aO`#sJd%Ope zXGNZyq$z-4&d@nw=Ji7Z{Pan>PH{xJJ{hG{(2&1BVD77Z(&y;gP~{@6H0pxi?`^2%W?}0tF6|XyX%QN= z?TYMFbUK7IN?hDqzK!!>riX&UmxPJJ{IWNm2COR5>#kzox;xj5G!_d65DXdn_Lp#& zfF*Jr)UreL!i>AHqzh6mlOvpC3G*MPLb`)mb5&4AVNoDT(+X^{sv@n95_CpNS~U*A zca=YeHRgMZQ@G2RVs1bhS4v@#R7()!PAaC4`ICGAd!prVxgZ%YfXM9W%&fI9k?so^ zxLO$Zdpt^Yi-Oe6I+}Ucidx@7r@>6w3_p{FO@|~l{Y;sc6O~2pp>=pTiZ~=ki{|Dx zFxL+~F?<}ivt$q&f0h#1%X7fcExs~sh6EK8*iFn3B(Zj&G4DB5d-NXsw>&m#{}ti> z&-do{@A3$u`Fv>ODU&de$h*2*)r2n8cwHo~Yj5>H&+8uBX{u_a=S2)kX?6S}!W;c? z3vbLAB2;105%Mt-rU*)rOsa~00L-Muf_D(Mr5YmWo*q1a& z;Y?E6d-3^Au}L1g`6lDjWh9{ZWMq#nU#{ zGyMwuO7|qr#ra1B85*LgQ0rzw;RKHD58SRLgAu0Fxlln9c{I0&#+ZJ%%s!@3FfrH! z>mV2CyH`&j-Ng9hMU3XB^-SK0bj7j5+L;Px?;pM;bAree3;Zs4&*1X zQb55}1O^vI6#3c>^`)NhTiz>WeE|z)10=o3A-J0wocz4BB;IoylQs56Xe=?{_&&|p z4Ss`n;aSbJn6uHWa|xCsel@y(oW-YJx@C+tRZ3rL<6Axl)~?yqvmU?RTg-Pxh%XT| zFC!8I4*nNO*uO2hg=*0adSaQ7?Vx#e5)54V!`whf1N~#Y%rA3mcM^hwJ7JxhA>8PX z!2iGQA#0yeJOG346d@oQOvQFM`z4UqJhpuiy|Yj-AO}e3pu^z1JK_%R7|c0cvCj7= zFHQ$FQ!9=7-!oKC|N4~UhMX=bDR^|$<^q;?;7`o!qQ{K7>xIZ2B%gDtt-rsBk)*O{JIze6AOf>IT=3N=fIYhIL;EaA$(QAS zfAs#_xT;ii1BeGnDkGOUjn5Qzf1=lN&IyMBM8 z&C#O_qmeG2XopV!<|Br;zk!c%1+(RUcj-R6l_dB;BIWkPO6n=%96KY*q}5p`X|@4G zkgS>TbSUJa!l3sj0TEY9X#WI6m=6(j(61|lfEi2y^(`awV{jWk~NM zgi|?i84Bf;niy_`sa@w4g4%On8EznF<7nI&KP7h(-Id@k3Iv*#}uboI(ZXH z#vNHkWv7DG$JvS*t*OG7+dz3s>#%t)?DlIYMh|S75M}H`#!!Ld*u%9F``a|rN`i@h zy}br&J4&!+81CP?(FV*}lt>@I@R>F1>HZiNQMwZdQTWwkx|1Gr#YfWo$e-nSvD=jO z9gPq?U1|{d9b@GA88H8RXmrne9wzlatpMg8+;@6T*<)%V$CYBe+^6fVo-Uzl?pOkr zClS7a2<`NDdcIP8Z73(lx(T(0L-3x5kn=OZAUItglcY~OOHi+MeD*`Az<`IAx{UC4 zI<@xq?b-OQ1U>x{k=;X^dC60Te{lrBjgtqseG`q$hWeTkH%Ye{~BiYdl4`6qZz|i0=G|D z=1;YOak$sd7Uh&^qG>ATr8vZramieSNn}MJut&rr2b+D}MXErDMTGmx{yuD*LtnH^ zQHRlQMuSTQsiVLuEUUfXqm8kCLpIJ|&`3=$-gLrXuI}ndJgP5#>~;qJy{-D8zi_2+ zYY;yFK)Ki3Tke0DXE8}m2$fmiftDI1x*65khNgm>1tZ_9KZD;>Ln( zIKX2bZAiGxw46ntZ!EL*0npq#HE? z$5Nn*mb2<(aHIC4F*^NN`slLF(ihF#_H}L70k-KFhNn^pVCDD$RG2stwiA`sNEQxn zkgvFr=7L(Taf2Dyos6%HZ7fFe^M;JHspo`s&Y&qiE{u`C1HwilIQ*L_O+jBf($I5TB*&hA@f2U(2 z?Wr!;=qPJP-dHVE+ofQ2#is%!1bV)Hn6ubq?3a^hOBqSfb zB>f{RA2hf-D8m%Y^1L}uqe_w7bl5CHVlu@iVAk7l8Cxl*51ci4?MA1EmNKbkz42w~@+ks}SzmrB0$M{5R%^fdEKb1PPbQh~dk;{^65!iY z`9(0LcHVCD*gu6e6qc*{;i3xH+zm|RUd%L$y+8Pv0`w4jfr8O($*0b<0Ua5(ORhaO zU-=Ib6Cc_u#&el70E89=^3yKf&02z`3{uYO@88uu**9RPcIdI?HRZ4!=D9QN&Mhkd z%9iIN3Kt_(#_mQ&`)1gl^5O;fD|K055Xz`06yXC(AT50HiqewaP!=e99Xt0G% zJm%u0!P4xRDHhs+A#TOZj8~VC(I~zC^FNJZ*C6)ndjLkK;j3auP?>MNJpXQMi;1|3 zVGvK~5)zDD1dy<3hc}s+kI6EpUl>>U_(Ia(I-bI<;?T#57sA9WKyZjS+1%8<|I?&> z6lPrvQ@lVS4B1=zuEdd(AI;iu%TVAPL;0gZ6Z+5Ki|X@T0-JnQbHpeMcDP_R*#kt9 zMTZg2a4J$Q$ZKN2OEp%f7r3b7*h7@MmO@1iMwiwbF38`(I6T2RKAWe0;YX8a66Mqv zheLoiMGsb)5diA_6AuRNsnI@^zE39r3~!?R&R zgt?_~qYmMqIL*ht4i63fStSj~Oyvsg$x<+fEmB<90OmsQY*4X|`#6GcJy6_>7!Z5C zaK>)udawmTNf&up_qITaq{b!u@-w|DtQvo%?`5Vj1V&^@Wn<$Tc{sO792+Yf`Rq|} zf4heN@gMx#Vf?OK{cCSJLd4=PF=Krh;JWtvjZ34o+FNEzh~t5v_n5YWr+2RsW?_^O z`y2Pmqo<}t(!$^IzL&z?G%92xR-w#|2S*{pLk z*9I5RM9M|ab!SCom=MyXcpL{1Xq+1~E=)Pi1v_0aG~Fth3i5;sCy*fbG%u3Lnd%4E zBfr?M%G18}?k8O^g%e#uVLYAyLq7ZL=S6yjRC2V-7^|++MX3aQWawlCN<)3>EQ^zU z_8hy#sEHl>=jFzO?X?9!|J&Dk_;}LOa>Gk!-9k|OuiO9)Zvfb0nL=IiFMLkV&n`ZL z&D5kt$nVci`X?_Bx)sL=4{_suZIAxV{O+`6)-xZI{)x_wj>!+nrrYFas~fj0YaTB< zk55*QZ;+Qw=B@Utp9v7 zZiiunEE=ty#cCQrWV>15zVW?8e7NA^Q3!<~EsPVbksnJRqx80$hNECV1hSEBlA>WW zYP4L!eo{8Xlww1dnnDAAOEFuKrfN2j5x;V$4QE7X8uaF!V1P)il0Tscxo2=!KXzie zZ|7w7Tni5m-+?(rH#l$7L-iL0)sYmO8;Pll2lF7CzL#+LGbeliI9*;hZKkuaZgRy= z%jLrST0fle$7m%fj6SL0bYoKu;v~`J2Y)IiKypG%O+Nq9?x{gc2fqVzA5P=1=o)gY zczC|)&{2L7yc0n;zY&2&^}lUM8p+7UXDMK{lfvK_jM%hrW4z7}ex)-3N1wY}Ote+z z2hsAwb`A0l_ktpeKRSqLHzB4-wGrXfnV(P9(F&RBctlStADVZXPPj+ z!C$?;(VsMj$vrpeaIkFdxH|PATU!F-Q&wacQ6I6~WsYAFvF}y=FTc1g*P}+vn4`;8gBY5D?nC#T9zkz4AtdYgv|`EYU5np%$2 z{(oCK;@X9cA(N(NqyR^i7k&A*?4^dJ4w z!F&F?M2bLC=V!=Xe%uKO=DVGdwZxb+L!2M1KN2AaKKj*J$od!m6cWli1)-W%fo|4+PsISLxN0dxVOdMSJI>al;rTsqt@`?Vxr~V~m$-B5+Hv-Y`$~9l@ zRs0LD|L2#W;8Q-bro2A(=Q{Z7?;f{O2IaGYTO6N}1;O9=sXtbuw-7Q4;Z?;ntpCH0 zc8gMiwIP*jR$5I-7>&OEKYymb@L;8rAt472ekqxk`}-eUM46I-fkD)fRz%49vj8cV z-`~D(Vb4$oGB73!C;KK<)trwfuKvySNa@x1g4GH#lEXMDQ+W(1ux>s=RCs^sLI3l0 z5{$^Yy1G=Zj3|U});{R|A1uV`{5ZJm}q*Zz*R^*ZP!5hKV0*$>;LC9BSd+0@G4dIsnm} z9y$*h#)@`##NHvv62{W0Vj%q2Z*Ao~3L^L%;Zq7AVkh8h zOTcvR`f99B(nD@4SALk6BhVcn9#WWflB|Oz6o;*zUAo94y}Uim(K1tpw7K!!n{ z`VRK6V(bPT6-Itv!5bw|D*@33Ye>QKt}P`WRCoJ-D?k5v^S6q-#$lwOUHtN^;f4oH zw%7=PLhur-Vd^5Pcw%6Nr*`dnU>I~=5y0DNBU$A#D$EXnBHIUwdF7pj8pTh~@@NZc z2LvDE{sbd5!}gU?Xq3BEw1eNlwUG8kzLFsku4gm!^h!^yj(4_8FAUhl08U~oGu2*N zD=37*Lj`7`G%#pQHlj7WnDy)hR00})llZD?mAZ3aeV%1~-<@d@{|xgdYT(C3&$da& z*8!bW1~@Y>Iu2E6Wsjfz{8lBrGvE1gahWsOX;xCT+Ai**&wyY4;}Eg7n{Kjv&NIi) zkhz>hxfimic~`SKm*DMr@T6(n{e_;&qg~?95Hzq>@;QOKfx}`#6nxrV-^h7fF=3Mf z5LJi3fmR(kHtA=6_hY-Nqs7PXnANdCAQ)LyK8ADS{x>ak#sqFlwpC6urwH?r>Ux#q zjVHe?Wc)sDf3%@@RLb1#^?!X2rChjDY=9mESv#E|n09BW_c)`l88;7>O&L!Es^Cpa zf%u}sq7HKVnw}?@!|H4~o~tgIO;k#vVmc|+pIF2*J-;X4+|ttP)H}Lr_-Uwd3M`oq zbF*yir-1pn5FzjOTEhMZ;8Y98tErRQm1JkGL=?L1xEUw!hrV6&zmp`uem zf4NUyRM2+u^v6Vty}((g^*a*AUn5H;)^m@IA*FAb7w_ZpZvPIDe%sL6wJNQ`IgI)m z(K*fsP_kT?R>w%aa(C%u4j&I>$y?SyoYfuR`_%J0GR8})3woYzzj50Vwrem9a+tp3 zn7A=H*)ZOY2b;WvG17g)tWutlzkbkrqhRD}H%y`G0sCs~%XEchO2k4%2Kr|vrOZ;d zlXX#O?y{KF%SAWpYa(tOK+d`<(Z;O-U#EI15$SHBB$=w+39$fk$f;@a%d!wI)V$fqKRSWULZRd3NlYrdG#^{;^u=tJrH1 z@FpY^xEy1xQ{4Bfl9ci_R7*0CtHoAb$dbf`p(0b1{&9M=n{B_sQy}d(%M(EIS2ry$ zp)q2FdAi-EM?+ozvpg0Qe}t5n)-)H@OAgf4Qqga*iy`ps6FN3R)N6#he6s0DSussc z_ATckx5kilc<0A!{tU2|%1nmAFx|%kEkx7S*^|Kj5_@ptLR?hTC!*K!Es%Fc?2N-K zK-wktS{L+r42W@81l6IibqT-8y~2bjhlxtIeHZ7Q`EY2Q{5O`4mb9&kZ+pJHe*>8E z(jX7X@VrnlvrT$9!h5inPrx)jhVs~QtW!T?&x=m&*|Qe zEr52q_z&#L-6eH@wGpR`U$U$z)E3*cUGAfLNA<`qRt+kQ7ob|@!q|f!n$JuijaU6% z9A#BZ;7N4_<8iF5I|b*x=iNY-cq0054+MldS?;fiwvwk0Dq zpdy)?7k$;`zi)Je5|Bz{q9rhFN}zCy5hv*{Hyr8ANLbZ*Pd;RRm0ce#YC-9#4hAK# z!Vd7ile>Nn3C10R>7wcDfJr$lqV?}3Z_w`!V>ZTztBi9PNtK+KaH(T4S$r?{g)$&h=EsY&XmXmb9I3iuu$zrfDtmK{i@PH=`O zx*#mf{SfPtNtf}T-?H`PK`dd(TcFeQs@xqag#mC`yUCN|IzXv!`6LEl$hb_P__U(7 z{Xf#aJD%#k|34#=}-I_`Oco zb&v1;{oTJ?_wT>1$5ov3`Mk&L^?W@?xgKDRlbO~fl?SWN`2ez)@Qpu0Y*F4GDZnvu z#_|pRD#>}e@hO*S9)f7a8C6at29Dcfj{GJDL=@{3c2rU~% z^Z5}t%gg|K-bn>9TOOq_)xrt~QuugOXN1RWkOo)_TytX;_QB&-2fP@~8L?&s%2H4v zegfpU8wRs;5GgH1aVoqan6%l`@?pfZX^hO zjU+LGNMSdRLntO+z~Q}n!Fv1ZW|Xpq^|g!@s3}({tH=n-`%kUFr5YBlWMe_MM_8G@R_=ox^*Q?>4;`=+x(2;7H$Ox5CFYy$STdc$*@`H z@)h2IljbAsq#=V4wPf_ZB`b7ElMkLrop|BWhKs;U`~icI;?_rERN?+t*Er^Y82 zG&)?KUx~@0Gea(EP9F|Ro`hYH+-t-9W!6}Gq1!-OXRl?^)6xv{chqEG5u9*ZGIyK_Jv!2iK|h}G5cea6H@B``ehk0*CXz8v z^~Ci)i!2CGtc-i-4dX@Q;QqS8yRI3@_AC+H3XflT`ht|-yb)-QPa)J$)_FB6M#x1C zVvvY$w60-Y*b0Oh3k&#ahJeLDD*)uuA}jq_>ap8YiC+?9`6pI1TY9-qsdAn=2nW>9 z+4If2s8!I=4Abbvl4TykMVXReHuU1lYuYqTuS6hJFvA-N2Hdu}JGoUK=yZl|0E7ks zhXbK6+n=zQD4MkMnQRvX@Y03`$L|1d?bp943vj=U@DQpZ_=iAICX3-_RM!y9hNRmd zY#|tWCJ9iu(mwKE?#>)qp-VW>&HkbR&xYnEcF-ajbC6yRHZlDhM$?m*;COffKkKH^ z@q$qzgAfKM3luIrOm!qFS1GcAf+C`=8ZMYHc>T1y?OX8lD+(GI<>S4Oessa$YwzTql@;)yDi6<3? z*H$5WbMM^c_44K>0iD`tG)#|9P($|vE#a(|1G1S(nv>TV)6GL8vgG0f>ZN<^Eupg! zk{UFN7s`r3w-O(3B?uSXN6smgchc%9pLqY!1S()gdG7+(hAmt@PuCj?F8z2Zbk1Z< z0Oelj@_5xqs+`=>p-s}(+VST-N(gD+vK-3q(-(9-MqT&;jBg z?&@09j(s>(M$r^5vynzKz@*zw;kR9+g?ft9BO2zrS!#q7c^I6S<>40Ud;+OdOh*zG|iT3!JAg>%kACvW92CvnK7!mdh=DhwqMEW)&9b>GsfcS5o6AV4I*lNBJO93(t^>(=bzDOa5h`CHj5< zTwt~EA@x9(y3uNmOtf9%m6shce0u$Nt*8E|+#X)C8xwnPQH*><BUn!8S^jQ&B&V`u z*llJ|%&~bil~;!WYy;i%yYz$Ot`x-8c5eFNQ@WOJFyWqoW`C1M0?14;Z7mZmh&y*) zVA>wDIU}!3#%Q?MI)VvFCh#4*YM8$Kx`jdGGOGW$db7Qv?G>UjQ^>+`waiGgK)50q z9JBLb>O}Nbz-jApSAbhOyi`BuO=_FGxm)J8c?TAIpt3*%g5s37cIqzuUS_H8B;Goy)mD5}agAxjqK{H=-=KuJyJxF|Vu#wi= zJsNQb)HC%KIEgD2Unn0lFbK|VLFuMBl`ZR zgPQ9}VlFpf^2akrz6Ey6Pk_-5YlG8LMOJujn)~ zpT5ez^jywk7&B|;sy&!w-(~4pasGirgbo;;ZQJ{Tr^Na!Y`xuj01l_pmuur=f<+!p z#U8(wrzhsVO^eU1^UaCY?Jzw}pg33-+#eX@8@D5n-7c=MEg2IusZbwCDxsQvsC~R( zL3^z+mOshO^pl9kyqn#%Yc^GSaNf=cCj0-t!7q_0!ls~`Hc{o&7C65)fX6PbgO~0! zr%*OKdYt&+`t`GQ+`U`TZsVgqRNZ<{o`l5wIZ>R(<`Fxy)L-WNoq{oPnR$dvT-5FA|AK}8gTo_ zq&TBidrp04qo2t=@aaIB^fTZ5uB;zaUvSK@R}O0JIQ94sRC$8>nr@{~jh!;Jnbb;DU#Qcwlbjd#D-$QJeg8i0w*V4&)+&+TX? zesfl|xq*?LHRN&Yzkj)_>oEc=!Tku(BJsK_(65bla&&3loMUI z_*ovbX!&RS+sXC6LWl5KJWewzWimi>$Q}!YE3Uv>r9ZDZmd75s#|lJ`VlPxt0Gz%R zhsS^aq$8NgeBvfZWqOjOhRmAPhoYj9(TA+ryq_$1HN{t6BmOTR=RbY@ zK&8`PV<_;yoU6wsPVFP}KREG+`um5+z2d#e=L{3{V6<5L`6kq>-91JAKk0aSSF`_(K>Ns z`S(dfcOiP>`(X75m*ITbqpz?3i=Xh>9r1+n{vB}+S@-Y z*d8>kyd|i=Wd(F~A3whkkVDk-g<;%cT8Epo3DSiuS=5pmxVxcz4jDV8d~$&B&jU4( zgx5_A!oYCzU>@~WFi>X%dRTv`O_cjH_axv3Hh=RpP5vI3YTSU6F%)>O!*+~$_?hY@ zvJk}0%|8zu{~!wM{^5XS|pF< z)4lp@O5NUru7mAvm}nQ!3qqIm1%>wKlP-U$8-}$ayD*RwFCDuWZ9O3SiSU6A^p3?@ zK;A3{GryPWslUDOX_L_p{^f1@}O}dvg!;DY@#$UQs-vMjDSrG=Y z(kmD>ZESYbG(p#j?jz`kEJGPXlcA_r0Eu*h&6q#B%LdfCZDGvbp2H?ZHkR?*n}9$_ z(P)C#^$C=s-MQc2cY`nkO_$^Eqv95Ks(X70jLuABI^^=rM|cVXU{)huVP_5lg`5(- z-~tZwVXlh9tM-Lq@a>y`bA@n$eop-?>FwtSSWkP`U<-r-8><2h+^2a_o3l8T0~dmFlKq!nFl155D5Q?Izs0rKorul3d#dI_8PRof<9m)=&D#R zeN6(YcffRgy9UI3v*9*$t3dNrCPj zmD&nHam=7p%3Fb|zX%CExEL5B>UI<<6q{Yy)Y|2`OK(yJxI(0$bFs}>{13o=B6qYV zsH?(Z$Q2>757qy1y3kyCd*{b^UMeYr@k+;8RK@q#6rbQ1D-@ZKP{e4X51~X+{P?o* zV06=w_E?)j+a(9NHfcMcNe|rcV1OvY(SnONjcM_GHez(r5jscNY3bF|&^r)~)kJ}U zP{pDw`2)M*GZ@qRGyEiQJ9g_u#mdv=05|pbW|Dy95^8e3*)DCD9!ej4gf0Wu7 zy|mKvz}zF^U~U);rkAUKF7^I39C)q3HE&A>NdJoCVtOiJ(R*~T^=ehgyXD~`rukO{ z3@cqpZ#IL<12|{p2}JrP6_{cC83sej7I-VVUE$DQ=b<;&^vY-rxns+qu}ytWVo{m$JWu1Of^J*9}$ zfWV_#b~&NFPvAW(TdXQ=)?WgrJ!D{`ov_18H z4VK9O(~a+{oXu0zN1Zwio9*;1He3Bg9W@i?n^a?b?N*%QBdNB`7SZZER5F5l*YDUm zN+zBLwYte156t%Zi4=y=(=`I562BJ=svF4>~$+G@0`U2pWs^^fKDO za;G8SxZzwEO)HwM30;7+lJcF5eEVwXyq;SnnRmO4x;oo5L##}2o_!VQbnH{sKwU(L zC_LSp`(uQ%TV^un$5J`~urP0H)G=N&z!pq0j3FKJ<8E?@u{5UWh{-RIYZ`O!5l>h-$ zpZ-A~2AXFbMWU8N1eARr?s??`OyH^7JwC%s{`Lsc1K;AzI7z{I?7~3|&D;>qR54`M z?mdfa<{xct&k)|xB}ILoC#`agO>Jr%)QEhe)ENeh}~I%`ezD3#t@D34;Pc>wU15vT+G#Jh7EZ5-7{nmwVtSo{RDD#KqXkOzje-ROD-{3}< zdnf`fOR;AJwKCF>tdtg;f)O;`7!V9_Y!nYFs|2k&A9p);u{qivS>weBT)C-8Hz6Wl z;hs8$LsYXBWLUd$Yv0qfi<|o*GC;WBS?pcq`d4qAUVw&M;5;_)v>v;Mo;!geE=rNW zvufI(Usu1*woz-@dbVwCh49X}LsB|Oh3l6eVTr+uG4~YWrs=H#i?Am82#4XqwTDT;qB~2`e?P?JN7i%ht@(ZfqMIyZBTysM%62>`Zp}Os4@mTRPAE2+>jj zQ#{3ixeScOpSQ?yQE<03gDWPB?6^Y;k&;C;o8)Rs+iC0j5Rmt)HrcZNtLNsTWPQAPdC7NgD6(3FE zT?%8&X_@IAALZ~ydc?z+Cv(Z<)FxE5h7)82h1-Tk{p{mL8{o2ffK6mtQ~eHrfgY32 zjdAC-k>wT`u7#hWa-eB&&N2rL1H0*SL(4l3!&Dm1{e&V}Q6{H5Z9uFOg`F5Gg7;0C))^}U~s_?y5pXir<-UU-ZZ%x#(* z{dizxu0NW)$9*Xku>d(WG0v+iM3tY1UKq7SJlp5yErS&7)n4qYOiw@S=Zh`@GW}|T z{@5E+P|D>_c3DdK^Vw(i?*TPGkdxWogu#*T_&bW)43CZRQ_cvB6;hWshwsK4p~`)M z*{{8`mOocuh{#9A2__YAjNr(L4p_${fb1|E%*+R;wcRHiN|-l@!UbeJl6DfLA&?vs z+8U6V`?o;ZiH_Ge)vF-o-4`bH?)Q0zll-4$oy;kX1$e!mkyMgEdm-Lumx(ihzgW}vbFX6 zKy9Z^vTps^VpHhjimB9RAioBW{PMD}B>>OG=@9ZOt2C{(Eudlm42Cb|ET6|Hc!$%v z5JIMo1q~*%lO9+T>=<8H6PlXDqwAHhT)a*X;Ixu2XD8WMR;=*sfyq5*UH6P4Jj)H2Ah7J4ixwd=LgFT|m)gL~5roN*D z{IH86ui&tvd34m9H>{YPZoZg%y|QGBYxYQ0Z|JtP5w#o~@G z22u2Ig0Xp;YJpN`-uU_B%nm1W#2=Xl124dGknhWk=8xAD7FL)AId~CygB4UKk{<=B zO~Rs*WwYLLQyy^B6>{EYBBXQ+>UGu?M4y!&t#Tr6);HlQolWxiMlO=ct{0WH3uet5 zP|DpkABtH^Hw!=QPuF~|kC0c5{fWJEC$)#?-JA)xq4`u3-z5G z2QRh~3sh?j|D@xG>!Mi2XH0sfv+50OgWJ}`vAc8H)IQtaI{D@ z`rEevx?wg_4}`o{3aj!Xx9v#mG^4-R5rQleshRh8&>EQTq(>K^`})Ip`oc-Bk|3$c_3t-i4rBn#wtSlg|*wBs2c_yBctSDa30;t(+7Io?>#mfzIZoeC)!(I z(`5^>vyEJv0mqg=F!38&&LG!`?sT7mVXaENbfjl0R!7X<{Rv>it;7s6g3$bJ7EB1; zf@_({t*)qB6##bm+RuW!*`NH?62TMj!!-3P0!L7@5iZ5tI|(X^S&gY+lyIy48Ibzk zUFEb}R#})hCJFX&00RjQh`Q)W9kR%Hnqk;jMnbTRyg;`KPK{uY+^jESw*q%GLwRu+ zEXuMTEGosNJ5*fJmP`HigM!8hc606a{E@Ejq~Zk15W*RWv8+{FK?HIAtOO-cIDX8o z`9hcp=j^~i`_e=itfbq696~D~)J^Uvi$fbb11FIY7#bu<`vQ8?_-be9rM&l~LG#p6 zk&Gff(UX@H@hTYAnG$e(A>rT<_DL{3Tmb_i8FTFc4tTHx?yW+3qZ!rlB=e^e zogphW5eboe3|KC9Gb^P?UqNeARjmNOf>yN;n^`NZ)7!5Bj599W9iY%hC)p=VS6;=# z6G4u@8Gis*Ta{F@iVJwn2n}rDTsU}nXwTueLA(Gi04t302?<%$Lazqm=5XG&68%;?tiz1}gxf^SqbP@LPAGMQaMU(o|}`fe33}pS3!Wfx9dxzIzFZcBih* zTP`!DIgcKykBX&pe2u| zEK8Hnwd!a?)-iBLg{VrI+5mp>f;sRH>JkhEGq$1fZR3`{d?Y7ZtdmV2k_^)+`SL$R@}|qH{({bFhEAiOU`1i+gh8`w z*OPL09AbV6-v{{@B!O9(Hs(4AT_F7>>yh4+ZhHWejx<6U2 z7{e)RCYa6$7*L56NLjo474sACRim9Ps(t{6&H#vT7{V|+FPyGaHQ;8l0i$WN34m+O z#?&Ku+3)fWj*zBlfwwosIexIyBjU>FP?dsPGZ|#V9w`#~`k%~qaJ~+Ur6yu@0G;R{ zC<8`d78P4?{Oc{{J+0gcy0hk;ptTkQ*o2duUT;-o#aOM`@jbl;KcwXb-%d8W#i)0J zMf^Q7#~0rS?z}a8W+!EWGf?3?`S#x+tp8MX1Quh1#E}I|u0o+2PuX*05i%F#Tm3cj z6FH6MZdZTXs*tYf={D(d8yZJX9s#Wu7b3kxu(|>_@|Y$>qyT4WBHs(D!zBn0`f08ThF+K*aaGtD-yY-)j0Dc_@jd{6)k#S)lI+!xTiL3rZl z@6xef1rAS94;Q~R$h-u1a=1)h7MORVoPcjIZYn2yioO6RGeO_6qmn1%R?$ya1eHZj7PgFFA>k z-q5aHhYhm1&_!e7LUpvVO5;*eRYM#Io_{6pZk%MqEpgrI(BWlJ{_;?cco0(MPc+6O zgw(3$+vr+hNVTh^W(O?;kK3nSl4<+cb3Z8>(t0mCY;`?)STJBxy8wQtpMX&FV!}l; z_FVCRI9w1j0m3{@P@x(C<8qGgbvW>z?j>gO~10XQ;1^N zTSk{kCS*A<`Xq|ZSnA~7(c$d`)WOa>io>Biy)z3FH8n%i@UuTjg=cR7 z|Ahl}w|~i)%qO|~^HU~tSY;coW#`gL$(;*#m!eFw^IV{sw?Fjf?Q%7~6mKnH<0(A?XVbHM zalpPFa*g~V=z&+|^Ks{R30L~}>R-%5wiCQ(=#XXF&m~27?!RfGGo^vY~xJlJX}6 z7g&z@%Q*mm2ojV9JRUF?(#VY~7j!qGAym|W}Q2xrlVwAxlHf>Xn2#!?|{s?24;n#x!IqrshvD{0} z3&Tb4o+ms{P=Hy5BLo9t+VWko)&2lB0wGXwo?eDZFd8_g(zoOjL~3129&78C=r>ti z_|0m zg$K)(3gtNOn@;As!4>`<`q5z?XU@T4F}a&6r1^qco2m5lL^^EYHIq5c0_zyey->kVq6#P15LMn`Ng#PzwP3BNoAsc=Uuze1tiQonIbw{{eW?N9*72 z-8+t3sDugF-7nokKJH~kk|k1+d!bWK~e1>38{bCMfPi2o3itHuvlh^ zlrP%kzB5%av9+4(h+ywA45ebzaeujFr=6Q#i~?mu=s(#K%wA=NP`}Do5cI%OVZRmz z(>K0*LkqD+isHVc%#7rP(*J(qNkfdCuYb+v8H2!??O$&pF#i|Q@ATy_q+eHVa#rh! z*PGFRBgMIWxiXj>H8j^=MkD>x*>i5A1xE2P{A4q~-~}#^H&OItUb2~hxO>IQRY}- zw{h$%6?2p))xG}tZN$wnWa5ll+}`w#2kh)GRMPjtzxODl(Q%tk@s9p}a$N=bDRqaq z(;?0kL3y1fcxl_~KOc;LdnJFpxW<)jif3njeI;W_ znl_(Nf~v#1`>&_CkYUz;uK1IzRN8`CIEmrBo}RUVY_x}(%p4ru*&ml~qCHrBh?$hW zz5+r*R9bSp)1vV$5N+<6O;ig$HpPw(AwIw_w$oVIA3aaWO9R0R`A4e-FvHQ;=vlbH z?g8O@9o0*4)}GHB%e#tw5tkO+Gf2|-Xos8RDG38SWKR5*t&DNOrThJl4!6)fP=jeh z8y1)F-jvO>`jzr9Hyt3p347KALe|$6K;UdCgf|wQo%N+12Hx!9UA8IG5*qR^a$U5R zk36#|ln=m#*v}Di1He}BYyX5x7_j<-fjrT|*&)ERFCBEZlRq2P6>sGM0@@LK6qK)c z+U{3??K}lm1hN)Wo9zY<*hJZZ<8pM@>fVVrZMT2zF>2!Y=DZ;n4Ij5u0M!NYdf!k4 zy?mz`Ksd>+C?~sj&_?AUrOI9$Rf^@-YoT3v(4#Nl&Q$zxJ9dspm>MjbN8@>fw{t&m)^6=TH|JNG*x2u{(8v`*rlH6ML6SFg+9|$14T6)2zo$yfgfdOK; zr*p3uD*lku_@v?>o`ruKAKi~0`Nb0Xs@6g78?myNoe_P_=RkZ*b8UVNj_2CLHGfbWt!MN4eM#JO+ z?u85CpuA1p<_TKaN86E|p_;#Bg@Uy!u{m23U7b@+eiJ&JP?#BEQ%e16E=9g#b3Mr0 zbi1Ys47ujUuPOibnf&YjD1C`ty*t(FaGKZ+q6e+VdqL?9)E!0H+NTlv9dXR_yMWg7 zId8`RY5X47DcZf1vHZ^b?$arTIw8!GUyc z_=*e)vX5mGw#4}CmP^rLPrz*rqg8de0NV&=Y~hr5U#b98hX#1H{rWlA?deP^t< zv-vveAork=B|Tp#^sxL?6o|@M`G;f8bN90%J=>|)E~ z5$sITTMD#~qss^Pe9GqyxSI7F28iqFWUQZ$?Rv+1ek@|O`;Ei?8p|Zkp$Xjx90U#J z>I9G+Vo`Zzx*ebEJFrkb0HNgWm-N#Qy_mcp*)#ij132Yz3|<_`cJ4vG90SJC$ToZl z5W;B}nS`3VP5GoQQ*j0MGJ|-cWE!oISk7_YIfzZ@_zHBB2lUaFHt8B=zQEOz0WsK= ztknABoStfzNA$d9rM)?BNkp9^3MPH!=xK}spb3uj7kN0on9}LrhdsBl4#2=rxjL8! zmILD!fwx{IX;J#In#;Jm7tfC6CY%(3;B_a-#V}g4J7P@t11-#VbaDe9G=z~aPKnUE zh+K0R^PBmC{>)~O^wYxx=YtcHylG>GEH0^|?pPKgwfNJuP~_=P(({KVWbSak@HBl# zJ^(}bW)Oia7xbPR8CS^HztuDF@mnl947zM4OdU}LWT%H6+IrfwMvVhfO#Vo4( zU?2~M{=t08Njmqo;FR1cI|5=GqEaEbrOCX6I}G$DA3*07wPZ}Xz8fMZjFJX=ve|69 z@=*Q^g41y!Ib4R#C6`<1_|S%v^?KslQINdNYWCLdcQ zBBzPUMNt)#?E^&&608X|l{&gU57?yO1eQ3iR6TLs&A3+@6UW)-IGV(z>z;=c_?|&v=!8{3bb9 zbY~()Cb(sg5WFRL!WCHdDBz5A%BToRq6-~}SJ4I~otY++oWRddh2|sU%}tffshV=V z`e1_Iog$--HVu=j8F=jVZmn`tR<-8nLOlDb4^F32hTVIjLEaX054oO&gDV$%w=Z=} zaPRvYJ~}JjPO84AUWMHF8R{{0Js7Ppe~EFi0|HnW&hmg+AI!~fyBt(M=Tvq+vxo#I zfyWC2Ysr@}s>V%Ow2zYTg0?T1^%u={Xis8)o}elq0QeO-kj?o7_>N3r_fcaMNpavuCkSTv!_%`t*T#bG|ST`nJMy1c^Q_N{Ulf~ zjKyFi|HHZQs=16#wp|H0UsfM(;M1qQ%qAkW14DSYkc(66A9&~?byDo@<}QqZs2P=mqWKB0dtT#YRqehct+5A=k4B|O zow9)S#64*6!<)=0T4-zuu%{6}qT>54OyX+qi zI4q{quk1oKCI==9h8;!uFz2ASNPX$jwFy`L$9AiSBW0A)B%Z&g)S{|7*7s z)@qqcxbpe^EaiU&2=C(%Es>X#-ds2h_h}eSO=I8|nRKo16+*VKk0+@y|El!d(f({z zXaIQwqAemO)etF8Ju>WG-fp|!&(OS^Z z(0FpjenKYi3vxKkW9iZ*Z|M{h!GYU#;1khjQVS<)6^FxmV{s0wHZTDoqqngZ3?@*+ z3Wo{bl>Xc5K$6k(c8vSdT&3z05+(EG`xdbHnNlPM(g2$+8NvGzXSOu)inASu&Ggg} zfb{0GCZsP2j^g0X2}YDwT$Q`|^7NLGH|d>`T<4b~DEsV4AEZ&CI#&empo;yu#yb2# zvlSphP+nb(*>%=Cc}<6_(SQjg^wg>Yn7oemSB1(6S9OkmeBf+3a8r{S{CWuJw#S>5GW-PEi@5xbx|;<|7Aek7Fk(O4?Z zeIV~NX3rtEGa@5y+z4of>gScG&)AnJ#4Zq_Ia7fgVH>SSi9EtQO|(=CgQh4X@-8{e z68uE6ZW`^9OpUVcEb=*OHw}w+Bze?_!J6l%_5k9WigiH(K7Q^pnqow!J2qEruD-Il zttD5$RAB(vfCYEMV=s5^q&zn$U@H8s@;C70s91m3GM{!MAvi?h5LKYY%E#uEVs~cf z)dyNu$DEfPp)4>P%bK4scjXl?!| zNPI){+D|4xs~z|aPu#d$4dFlMQAA{ao*A*EZ-uS=N*V~Di`cKljJ$xdyBY*U`1m6! z2Q>`FKA=4rKSuTOs2Gp#7VBtQ7n|D2 zSt>0|H{Mu@fpNs}avd0af}c_Tppc~~mM!;zwMMdZWH((cU$*s^{VETyahLr7%kEDS zwYA1qQzJdOdDU9M)1!^OlRB!5Prf;vHQsz2Tu!n~XMlB9GzSyc;G7yNX3(z{n?GSO z_bB!B#iNsroy!pZW)?QpJ9NJ@gHA}>t@Gx>Z=fr!5(yAk$5XKiwGmo5T2OM_r<`P_ z*_a#(v-waJ%U^V#yN0dmoFtasa5)8c8(dG;+1<@OrA-szPDrKOzKrZVT?o z$6h`MTMJi{?lPgtcHiTsBQGx>?y3359_Xj>)$1JJ8xd2h;-pX#ni?cB%_aU}Q%0 zU%k@$qt7CiK#|DlU{iO3U!_LlFZ$Lz7!8GUu?V%R7X6EI&t zV8`&q#igP&q$QW9#r3S+K&q=$2?`1paPk){FK_f(8da2+D+u?E^?lEByF`Y0(ft%Q z%_#_nJ#~UVzP&+{QAT)8Hkt>4rg*2w#b?L>q}K*rB?5*dX4BM8^VbYJ1b6(T)D^JK z5=Qsu)FjoIrmHY$6)#^9t`E8`NQgF>{b==>u znEmkRH95UB^2YaD?ARJ3eC&DZ6@GbrcAJShB z^dVvCd}5p!sqD=^;6k(qrII;FC-qz&&qF>Yab$L`hiU)e)4@-w67=u#nn!_9j6yVL zHkOMQnV7FsrWmx|XoJMSg`78ngeJ;xngCPhX63D9BqXpo++RDR=u6?(TV_KxQhYY} z6s*zq6yqMvHkg7K6%U&*ttt1!xNP%%=(qCPqup$6v4nmf#Q+dvCEs%HgZJ2@MJDNf zYCu)1W+&4gZ4Hg*PLyIWE`TFL_UeRYHia(^*{FV2cb z8+&C@4IZW+cKvii)lxpkozc#YqeFK$0f=eFKQn}cLPYK3W=p6Wx#~02X2;VMC!~qB zHF)*eTROY)Szl7Xg`|&LN9==%_0RgdE!PL1lD3A44sgbxmWTElB^{#sV|UB6s+>Nw zC3SzIfMSHZ2QJ403f^^=O$ZW?8nLKAK-dv>be|L}isGJixxCG7SCuDz5v2~~;sbbc ziZQ_~F8p(RWfV`&o?u7+)9z=G#e`Z2d7Ie23oBb>oD%yb8I2E4T;zVg$g^TVcYsNNyFxsGt|4y;CDWI z;1#zsPC>1KL=i4tb(()>=hBrZnxbB^O2^9DF~JgW8{dB3%AXa-e<-4%<&#A4;ULh8 zIi9iS@wkFm&^1OsF5%{yRV6@62be2Z7X)Z3`I3;rN4wwVcLub7_E#H_?8ENg-;)w~ z&$Ne4%P0grW7}!67|WR2(jRM2n@6xr6L`;L5#L~7acm^ye*IgEQI>Fiw5&ioM>e({ zK7UT~;x@!83on8$Y~>*K(ftuul!aA>F)QRve^15py^pHp5-^JG`|^iqGhy!by!8i| z>-iuS-ri7i>KP%+qztAx7`5Ra;v)QJxBBWMgsHh`n7<})9$zkBS~V;gi;5hvq`p{E zm4->qm9}Oi2xPyBH35@ws5iQ^NS%g0Ne~II0EOPAW>efu@a6ms3vLU?wJNX7P+jxO zf=-2etEJP3z-v3;p4Je-zgpT;XyzEg`Z7Q&Moa|w5U9b&$e25pabOG>jpA(W8BFCg|FK$Fu>%-4((o2my^_fF!r5=G!jlP9D;l)VTGtTO}l2Y%&>Z+Limi zS}*m}M}W{L0u&D&;-l%6+Kw|%g=^lilsD~=6{P})UrczVU|3Xlu}9X_$ZotWFOqLl z>c+={#kh2S2q{I_bPyB_#n=rm#PL>C@NG2RKtL;+bx~z%QePH%h1(>Agpg@GHD0#3 zMkfj`SPE6u)rsS69V@k?B>%hJ0d6pjDamM9w88y3)(T}Fb zJV)T3V?xd|+N{Snc6c!H&1I>MS)JJ1xz@kZdJ!iI~ivBK^cA!>R2}H7@xBtbDG1kf1#!+ekRCq;5W=+UN3((r)m3vBhIu z73I#R4>=JjGWOOP(FPzJja3rQ{Mz7u)zs~a=S`<9$UC|se1t+jNFrI@FO<&9>^v8W z0tR32jaxmaDb3Zn#;is;>k~Jzh5ZdRT~`M_)9esN(NTF|Q9Umh!SnR^JpZ!J{#MyA zQR#$fFuD*Dt4UZI*&(-qL?vvm>nOq?Z5tWw&7X}#%dC{?aG1|}lf{*oeH-CWT>}E? z%#9Dbz?EpLC)@FD1M84%q<{0W>LdT#e~93kUBmtw)?{N`(mJbPkcNNq(hU8a14pny zHaVv(A4d8u8^#@Cq&hSDUE2|Q{&9e(Sb8XbuTds{1CByNG5=S6TdOYVZj@!``s_fe5XLtX608~M zW1?psa{8IIMy12YJrJr0NcD0eHfG!$8r!{6AoOn*7ShJ1xc)7!K_%B8?sHHEaX)w? zWag=qQ>5Bh(}F&@4hJ94`HnCw^@9f}JGv6W-w0nBjx`y7Ws^B%QL%E!Hix(B%#i|C zafK3$N^Qc~BsBN-A&`pM^s43#o}NAZc5h3%pxf@VY}KMgImH@R6z{dn_fOus5mvEi9fDtTM<|qn zB|L;Kv%a~Cw!sGKJ~*yAJ_}Dhc)eQe{pVuVpfv3{pNC&pmE{}CFYwO4)szl3AwksH*O)BUhZpj)=APRx zVy+zXJ{`{To@}h)f<>@)yEmVkl`-n)11n-buivQy(3=tq8|;Hk^dpNIG=OUK-Zk>B zs>Hah^1|2rrO!{&b>U{Pw&O%7SbSDTt93%ur_Ag|tsf<6f6jJ09zo!t&&^fCy$zCCuM0wK zz`2UiuDxOu^Zno_x`$*i!OYh;tFI#@nTvQJAEQTb-}d+J3fK+_R@mrr$>v}Mg#bfj zeNJ?Z(#6_BaD`(KqKIyo5IsY;t-fI*=hYZk)C--ZSAVOGg?}q~#^WprBl=z)(FQuE zWTR~8*Q(OR&rAr|@d)%$1w$9If;Sb*-E}d}7WA9($CZkix>Mk)w$}*2d8qDU(^)v3 zJ*H^fy{D!UWFvp?6NvcS=qy}dF&wWfyO}+%uIs%ssCR)=x6Z0!$?d4D1;U_N;b6O) z0>6*XBT28(#?O@(S45}vx;)@qGW>@f*Tc7|?pd=G;n;fo=7K!skx7`QRTTvnleN+& zEhlpKRmxmX=AKZxJE+Lj$@1m3x*KhEAe2|Dqwp9KRqL=2PS4ta2@8{h0j;yD#B`K!OZ1OEJ0 z-4Y3YsiO$NgSrM92A0@H3g^@R@!0;yU&!^o)O1hpjk*ecZpE)<5_rp_dpvw*X2!rb zt*ILt430wmbN~4Je|rl5{>6GE(#vO$(&5Q#jlWK0^&|Xii;0TYA`P-FnZ73a-dy4^ z5E!YWs7kcye8}!OrOQXlK>S+`;m|et>Q|1@U2v5Y1Yaxr3n23KabIfHm{5}LW60Od zN>C}2dJ>}t{klIlZr^XMM3KALFu2r70{!pA0__c!KNkwk9ByfK8`7Ll`O7(`knr#l z2`NACsdExRl)v@aFTTAd4;e}oM+4fXdS6xl`d}eknAxm0F6t5)ZugL(-nwh7^jArJ zZSqyqh<|IDD%^k{E{ax(K-9bwoZ3;ngqQID{D6Ua*u8JkSry|`s>A*}YoivuwH6_i6?uqz0{$#Y>S4?f01K zaeWI$`hVd3)-poKCICK>a^HJncCBV0GL-3fba_UR=C5}_gt=Jp=a*4Z)6~+6OFwW! z+B}vsyGR_~pX87F9e8Fi5w{mGqt!KE61S+DBeeq26@LCd5w)A)?)$fqnlG|hnaZ4l zD`)fNE5S#-fZefBcgQ!PR3%rD;kVvSz7)Dzio2Lmj(7>iDQ|rX-i43;dhQ9hxZ={8 zLQ=9W5&QYw%d~VydjqHG$VlMPNo{^;tp1%-#_TaRkZD(CNVNM_3$WFq?o*xl^T{`f zVlF1dM5wrg@8@=}!q_#qph88+$W*NUx86OF_wdY$p2{TM>f?5)bOn71@}XLvKt@1l zPy0LUKQ9{(Ga|G@_?=0EP|%6l@|dd9jT6?@4Xdg$^s|y(^_o9F1!R&6IoiS$v zrp3;FQVl}eEsGn?;^=V|w88*RycLh1}itCos)}xN`G%db-TSra3m9;&Apc zuUhH9`JF4Rm==@JY@x(%Wn$bit4QVcQXmD-4|9pjgUY|YG6NmvjKz14u)lc$w1gHZ zZGi4X2kcsZpcqLNWqfN?@O*7-?M`9W*So!v$NH^nhnNooue4bIlJW2DQ$XLsk=kuvDG5*f=^Uv3bhXP!z+l@!9Sy$miQeU}e{#&o%A3sX+nnz`2r3@UO zos#f~6&z~wq<*gi`upuxCYk_z^Ata$Sd|(L8(d$TEYY+JzqRH6{vAZpZ{%9*osXhB zdcy%9%Dy!3!GHUq#1h(sQ+zgG$SXq)GT=|Ti1j-s>p%Xk{37m;nVBJ%{YT0%iU)5J zcvGXiT23@=`M=aNYM2IJP@g0_m-@11G@o-Lg5Q?9|ufLhwmG)m&iU9lnDv3#sj6O&eJ(7=+%DSid z_x14iHFly^Aj$0k7xwJv(KUwlGP;lVPxO!e_wPy$b+=6CePeg=p7nWdoTtB475(D_ zGmK%kL~!txc)^CqmPot!Uv3Cv+Fa`-cE|nj|Efs)r;ihh-Qv(PHd-KOcFuFE+p#iF z`M-QTd=F_@Sy|th5UG=3*XIeS{BA@2w=+njA1~zA^bp1BiYfS#JM@7)cU zo9k_C@I(N&Clc@@G13yS=_q*Kbsgf)fvE_%yNiCM&Lo;(05nD7a~mkeM>C;MQtc*e zI;zZ&Xn%+(p0VUlt7nnu;fnke9w;vR7ky;TtKAZl*OUo##Wj5Vxv=MQ>x z*4(`Bb0{ddk@C-fW`p&XYcVF!21^$p14F}rmd>JY(SZ{}T`E?Rx~wxZzBTu({?yjy9R%9KfrQAQb-cdZp4vPx0e@ z?}(MmU(a2{4iCU)}N`Q8lUWwqkG8>CLJClc60r)rZy-4nwg6*;ijqnAN$b zro2GI)o3n1uB1gVW7X}@4b2r&N1Fm2ev}^i*$@aB5)B4`Gz|-tN4R$2oAGjiCT=N6 z=TebgYepp8HJvfd63+*{Pd9QthLCW3tx!NV=5&dLU6$8$Hbhyw2{6?a% z1hV`lypHSoj>F#*O?r~Qn@ql!wL4i*ibj%~<*Z=h<>K4;`{x$9b7>5cW1IHwO7xw| zm6~go?trKpvtYhW=e?EmFslAEGH&CZYQyCoG4nz}cLXQYjkr{({3N{kL#1}A7$5|0 z=CWr%qp}&r+eAV*WaNZw!D`>a^QZ5R+ih$#enV1<1$n`!O$)kV=lojpe$AZsXQm{P-2Z1F{Y?D; zyQwB(_Rqa0V&$6SfHeL8Xu=hK5QX`A-+m>vx)YL=Zp(LqfI&61;A3-xU#&ibz>pPP zfLw!1GLnfMw(BR%YJ$2KbvMIk-F1TnN+SMY0Bmgcrqh0%XAMCxo^HRo^NjD}pxRZ0 z;;B6q)V(&nE~|vqIr^vF;(G(tQo%Y)J2Jwpg($J%B&Mf+zFqhaF#3@Kl(Z{|ZR^l* z!g;3GQey&skQ;!F6U8m84tS~r&yp^{@pc@KU5LUQ>dZ|!pj4~vT;cE~i})Y-@xfPF z;s0J~d}q%c>;JU@{@+RK|9#Y>-rV2vtYoF#oH%>iowZH92MJs;y(v>{z&{!4AuZif ziRUU06l$E{MORFAg|4dDtIH$Fr%szki$Lz}GhdXL4NZc1@R^VZX$?TME&J;(q0+rI z7bc4}XXsY=CaIxfymHVoFc)YM_snFL?gAoV1w;-q6~9!rvq*QW<%K*Ey7={{koRa@ zhEucFg9{WY&BrG57rZ{#?cOn4{%Za}dRnVnU7{+oC=i|0ZA(Ovjv9m#Q6 zFfU|10zZ--I&M{ao_w}qORW3RL<_m?A00!G0~l^kKQwIoJac)Nywt_F#TKP8IEKf& z6pxz*r-9|gj4PFs_mQ;7japn6+`Ld3n4$5*=xfihUoAf*)z+|k)Wv6)lWmM7$V zGT%_S=K-`Tyn8|GC1A)Idrf}6mM7T(_1XM&dlwL~!s)06KuEEAP6XKb{~*aSPVg3! zrr9lFO93j(zjL5oG@!^~;aqan%4-NBlPWC-A+r;rMRl8@-T@yPnBu(pUJ85bZsEs= zA(mZxW@c4CkVYPSBRkTqu7Q2R6Gjlzv8GnDM^2=8j)6Yj&H%ifa z9^@l2zzlSE#Gj;M%easb5-`d^L{2B@0i?iW`nHSe@hmdw6eJqAi%dYUJ@_pjo1Fhx zlkv0T8icZxPGYl^{U#=;w7}=lvX{eSq`%znZ#9IgQ1Mv3#9W1{y%8U$_I&rI-D;+V zH2i0cCse%-HkIGrw9Fd5JV8GGeKg5t*>H=A!{+lJ&oRl)m>uyv{ffeoPJk|usl-e; zSs6CaG$J!TMs)lrbZ0j}PL@d1Y%Ko;j4n--0p{ zIYH!iY>zpt$zEY5#g(1Y3`>bZy#9Z*A$j$QOoKS9n6K~G3Ifw9L&WEOb_LL0?(xZG z;$aB{X%>GozE5!KHQ%a~I-1Im%Zs%r8EJkGW~xOvub)B-3J0jMK0xefdw*wJ2;kvfM9^u%Vt1qxVn2OAi{3UGwh1i?+dK%`}nfJ6>C%>6@S z%bMs{muc0mNvF%iwc#!ml@Cfjr{E&SZbL3NUvW@eTwLOq2$zy0bWxi|jCFSZe~-Zb znwS`<^7p#p8h?vmSI%gJE9fpERSPZ`5GB&JccIgb4B-39bd|PdS#v_mNUK=Ew|P&S zR`#;vb@X`N6wc!B8+gy)$c(g%O<9 zc9SO@EFJ|xX0I!%^T~=-TIvVA?2(VT1om~6q^Oxo)aJ852d=;=7LS5WLEjhu z+59SpdN}E3MOJ0IkYot+otzvz{8}T{Du)(5$s+3UK(#TkbfCRIS@6s~`fvl+T7-dh zZK%8S3yg~fd*^!%=f5C?>ItOv6xAkXE@fpSo{b8X*SP2HF-b1QMKCEL;(1mxs5VOA zSsBHOp)th03Kl%2CsWK;WG3S}mYpqpfy*?D9mB5kz9YVFGOI6+li^VY zD6~)Dcsh%=_s!IkLjTu#Kz`k6qO+Yc4xc!^4COWNV$KTUIDy9i4=B-m8vtK#w7*>3!nbK#|-2< zM$dFzWuY4MsGKJ~-$SC^Hc9mFvZxz_kX9QCJ#<*A^0QB15?VjhtY(o>Mk-UDz@%YK zHD~qYC0rnLog+q0`8x`)AnF%CP1?xkWf`J|(v!aq%eh}XiOCXd0#X~J#TMc4uz}$s zXD7vJ^>3>xTjbXh2s(X=FWLSz`pcL*K~2c+p0pgo(%>nHKg@>OxgE$CcZgA zx2r=-&|`Xx^k&_nyete_`q-puGF}#n(_d?bSTVcHq^v!p5Ji{h+&6C1l5lzW4w_m1 z?xaAzke%W=Q-hSP@Bf@nrx68SJLI7|0aR>LxE?m)GBI%pA8?z&q7(y?DKj+r_9!dT zgP#GBJD;_zAX120k|s?{edg2k8G zxVR#%m@MV;{!r5!4aK{yd2e83toEypJ3sib58Cps9F5AscX>4?5(z(;%p^Pbprsc7 zNJ#1M1lBWlkXRHBfTWv`ix!v$Em6o-7y5G1Jz~t~) z_gG$sSR>JChf1OJq{&IbW|Vryyed<}u6UEZo_G49?p2Yb$LpWLPv|)kwFyfpN0fRW z_9IbYVM;ovr4x^{+go&th8^VlO^FeZYr@3x#qdq9SV*D(m;39{!khX|R$NB{vW{k2 zu6A*JPKe%jIbd1tJ_lX?Ww55liNU4V3!&Sxs;F3YQ$M|uyKevXr%PO}Zs;ie5}`Ol z@@n#Jx6(l>jHd3?)dEN3MZ;S<`!^J-D+A7eD`;c%@qJ7RYKQb;#{|L|)wu@3$$eL3S>Tox{~Yu@yJM$Jq_j za`_tvsdV#M3wJa0FsVniz- ztNW-3#fuvCS#e+^p@>qr_bk-m#w;ayPM&25G`Srome_CWf3eRmV#IBvxo-DOc48T ztzdZB(TsNBVpje2SyJg63e-y_O&z+e_wqB>SPHd-P+Do>n^v0*VF#W&J1i73ouGcg zr7(4Res>oHhth5kuWi*V-QWzP$^-f?6vG3h*{nK?n*mQTD$2K9p5)oAbk9H#F^AIx z2b--JcmqEtbAOXs_3|yZ>if;?#60vMeion5Dsw4&GH=DlIXrB*jC)hZo_yuS8L^fW z7wH4~bPp5ci4IczM5BZ3gv>YJpTCQc6je^^&Vw5SfgF;kRF=ujpkHysqEw?(PK?3; z)ON%qtmM%vMd`a^ePbLQ;UEqB*PWlw18`QHPJgQw2h+DLWkB79n+Is=aujhKslBo|9BTxhswuO8S#nW)%}TuWbF;0O zV?@~&E}#tMp?9)CF;|Zjmk@pIjoo$Bwrm#5G1jm+b124GSHdh$Tia>za%(DIr#trH zi_IgPXJ!1w)oc#-Cxsu82(p(m%3&-Md%?@5f9WvFR+rJ+FgewgMcR{_!ZXU0v?f}p z@d?D5La^Fj-IqJTSL8-1Hfxz&ui5Vlj1zsA5vN)0EYs5JJ+OF}FkN0~_Bj9uFb73V z{^H)yWzx&6S*6?WzmeJ40Sh2sl#@?I#9I^?f)9?Q2F(gODll8%+BQPJRn~x5o^xxD z6g!T`cQNcZew2Dy3}@z|)>TClxWTFA6g|qA)-INW;+R+~g@f#^dXl}=q|4MR_VHxt z2OEq@5&3GcdKmd@7aYA^XWpWjS(&_+C{{10?DzYw=yb=^?)~lv(6~oDW}H-e_oA@q z_Hg}8<78d%er#wSZMX#;iEPC(e-S?4^Z+LcyRI%KAx(}Q0)&-aYSfaLyQ>3Zy^FbZ zDG;d0^3As7r_@TyQ!5LVpUCwiDRfe#lELZXcjtWXhZcB+8~Bf>U)a!OX;vUsxU_#? zv&vsIN&{(<&CX3W!^?9t1_3wI9<{5>3jv!ya%j5k^CMx7%(q$Z{Pz|v97@nrnlO;f zrBW)b82z&7;#9-R6RAGx3aIXv!O3YF*Iyau?6lqO;tBf<2k9WKcOq%sBzVY~Hr%T7hvIT5@Kj_cNctVhi83=0Cg<=1uMI+}H1U2gZYGQ_?*!vaWvr?Hj7*dBBos${4zmg80K%ILFNO z;9trobfsEca(EHfPbKMDm_MT~=SgV0K)7H#QE?y|Bj9573gy(8gkKhlk&8$q(=*f` zu|Z)?e}zMxyxrQ35QGVgg&HghLQ88uFlMI9)3E#~gY7)%Buvmik}dd`BpK;h2!A{pfMEoLamRjmyq`%qMp9b#o}?T$89UoT=it2Y8(yvezqL#%G?CG=U6 z$o46h1!QDT?zP@}s#A}uCX3?{p2~vS|opeO?5_kD-}5)t?xs zNhUjG)g5Kc>|)8cSl`e2XL%Cd#DC3yPUEyD)rloC?MKNe?SET}7wQS^8tsQGTzxhgt92Ff;<{~yT(*Xv9yL5ns>!Oe!Wu;WmL{3OE=)Qu&Qvg_dG38@xVGVn z9}d}FD%u*DEWpY@q4#9KE-W$Z)fZJ$i4$|mrf4%3$I*a&3}Z^ z444?&M!WC@&{~p}{QDyMH(!R_)Lb!-2T$7PCj}qTcU5!x=g4hMM#Xvy>aXWF;D(wI zmAyYHEVIC%uz#bjT=>C!K9uRI-ZD%y;hS-Je*Re;_6jceg`c{gKC69P_-44+jLTCa z5k8QyqMWj7$}|RkYnqU2OG-N>F=<7iG=0ha#b@xz?4*^CwDCh4G4fWzv*cv0<*!$_ z70-)iQ?yO`z%+~ub~s{`zzGccz;x$mrN3o_R`TviPd44>{uV#Uhp}Y9)+pzcF@?ZF07sk)FJbzDBV^F?-VEdpZ(dOAQ80clW zU_U*an-fp?fN%#y{nLoY*;NsF#9PHcjzDREr5`9-xqB zB$$CR4pIEt`xHdYC28PL#4KsXkVJI`95xPzYDG(PB&%U~-2LMEW%!uMYBN+Bc~?~K8n*jc{h_@r{Z zP?D`;%MpV+?MaAck)6)T;?bd~0J|$D5@=`@SA4@PFBH|+d z4#z~m=o4p_&qpiirKLl`!0=e5{|+}$RWX5+#ADK)e}F0*vBC~tIwsi_SYC?yd6Pio zK1mq2B-Y&RI9+>nu~o(d5eIVe5a3DXF=9~N2~VYVh&!>|kQWkhuJu5g|Mp;6sO-F7 zTcH@fi~_L}tN!0G$`mRI!(PfOuT`9ZaqnbEh^7Z46&z79NRvzDA~`{rk~5^vTpB1M z)K@Ut@w;I7JKTLgK|mw(YXcEf5eznnpI#yOY6m>^1%(b_%lq#KKt@*ODl!b zylhhz&ML8ePMi2kmobZrT%pyZk1?f_r+FV+UUGJGNb4ZmiBxQspo49r0B+bFN30?E zg8C0}5W%rE3QNw9jsPu=C}rGqFp3v3K)kG)?)Dq_ z-^s}DbwsemjFW={?yx2^*&AXU^_lr)V|L5s#+EAv3JoOP%n8E>Ev~?~vhlZT70;eB zMQ?4pK@G?UT?~ctW4U$+8tJm~0lc?WhU5_b+Sr+afAxa>_^ReM{He%Cto~#<(8XQAa|kYtO#xgwRU&iw_p2hE@1Q=z38d=(;ASynGSo*y_6b+h!47WQR}Pw zx>;`A2h0^A@}4=TFjZYY^bqY&qp@2}hcrr)S3$0we}4Q_rpHSlSX~-mUGaDr>MW=- ziDprGw&^Cdecu_pz8>Eoz}2d#2?wGX&e!x8+ zhpqYeO@$wmF~%Rb&) zyOh(Ifwup6+RMaMZ+8xM96JwOP^Re#&<$JHDbX``6w@B&Hz|(#|}8;*?GIYOOa#tfSqq35-*Nhd1&iv+?YJz6i*PN?Y&$ z>n@_yBZxZ3>j^AQ4tG~BanoDM02y9}L%jvazWydi_?pS}aD+lPs~`4xq+2K$vp+y{ zwjD+HIJH=?OuUEBd3(C-8P?Y~TYZwOK_i?V=WdD_1h+bVYS84Y_of)J@txIKLJ%w` z6Bw)suE*c&-yGcr3BqVd7t8mLN2b{?WhiUtWG|of8ZzE8hNSThM+!fDt5-Y)q4dn_ z`f|`#)PE83tZoCJ<+XlR$Yz&sx~Tn33{w=7%51U2UU*>-`*+Tp*fS^F!U<#8V}L*kPF7-|#guV_8pj+OiTnt=Noo?__+9A7u~nF&5Yng}f* zT)L-6vP{hi-e5g-wy~6?pX{^A3fb$zA+-;2IT#3?+z}W-Yhs!>IEPgDf?4WP_5k0K z>g{^$#OTY%#GNcqVWjPApc;BpulC|FWaPdk<}S9C{6vurVx^)V7=?T6WsH(T{O-q5 z!`(dY*2r*bwIH=DyrFBvOVqb|9PI4MMvM0_LNbE0%yi-rSNKe#x}1}`ts1_r0JMt_AC`vo)J|pKK5B`cVi@f)z-QHvEH< z3QbaiaV+i$zAsyuI4k^fPJ=pPnyu>L$!^eQgz2kP$9Xv(_XG$PvK-@wkLM~kD;N#8 zLuZYXyM2irgIr{8rbqOwK=aLKo)UHP30bZ8HmqY#75N#dA0_ZvUzMBBKP(7GwJ`-O z%v*aR$&6&-*@IU{NizEPiNti|$O)RH>CS=j`sF?KuK)FiOPGI}M4g7-Y^0;oKzM+t zIyss#8!|F1+WNLP`d0>v{16<&pL!Zg=YUq5-m)hPO<&X_7l9 zPcyG)NtX)+8T@0_^0}vymPePww)sa)!?Y7uPHFhpdS=Muq>dCxlNr6_hW+6LrQr{- zwbc4iQqDFp2R%meHr?Hpm64!*`bcDs-Y~CpVz+d88#h?Rlda*BgSO~7V!5WqW-h_P z)c>|a68V98@=e!I5{K%v?E5rP>fiEdb$^IZ;_J}Z#*FVRd&nNS+me0+@(+t|m?kR+ z#(|NwO5G$sj-EH&+$&`u49WLivyPpu!L2;iAEnKVr$aC?!%30yr_P{`d*zts+N4?D z{EdnF6AiEnCiZY2#ZD-*?S!9_aXBchr%IjA z9Ik{0BUx+DpG;A9$sYNUmJxB>WbD_Q12N0tq>YwQpwyuy>oJSkmaG2H2W>=)Bl0Ku zl^Q9luas?3U>lRT@0I&s6oS{=*TOg23s*o;W>A!^WYzCf?!7yBWO3B*r0?$8f7Tbl z$Th$?@E+^2-^Ra5hk1f%PG&91P)b#2tpwf!^I1}kEY%xtNx!hXaKXo@)OuV_*`sSD zU#v>=bY_AlmPI+zb{C~RS!=9*OhegvrO&z7;v8;{1@-7XjHp2^%`2PR^q8pna!(|V z@fD7eMWZq{d@2qwMXG67@2F%v2qrdD5H{-$9!i~RXft&8P^e*9}0=}n7kLVL(LJ_|? z@z2!l!vN@rbkI_S;M=|Aao5KR^iP>JAf;WC6QMJU)uCgY)S;6rAt3ZCC34hI+%ixp zdXOH{g1_;~KkY}~;fkH~J8Sjmm(C)Ad8TJD3D9=gX63v?Pv~lRsryU2N(wM5v&WLU zLMn4#Y%3O18Kr{S(trB4O6d0JB65DxohFk_a;bdo!;o5{eh{fp1GE;YibS7F;;O*M z-5zav9tu9B-(CfA+Kwe*k$fb3L_ODh(ULow%Jll;;)qws9MHK-0iTbWIHb?EOIxYh z&+B3y>2lJlU}Cp9j!yaAuCa7h6TX!i; zdFoIN(0wSygC8q@9I8X*Yb%|1WJ8B2R8;?pSucfm)2=NVCQlLnKp+;;q5Ov$Y)(F!%LG0bbBazEZ^90l|5(vwZ4n)ELcniXGq zUd7D~801WFT2D_Py_=!lWiTa#+#!H;=gh&~SWWG#hjg(IaSN1fQ9>&Avr<`o-x0~c^3!?hcwo}8dz>iH0Ao^ zc=b}_2BG~qoh`4Jy?_#*@rP-6^Vc<=PUTTVaMX2Q8{ZWz zY_~>aBuUv<9{9K1R__xY+!W3+Z zTVWyJRJqkf*>ksxF3c@aTN8A?A2kLFzK`%_DdjEVsJo9*=I405P2hF-vT|i$!cE_( z{>%8gr^oWKb&)G-yZFAk-1v~r06Uq*kC80sqTSlEwHAK=H6rkKRg$ev43mQgdVBA0 z3a3f4IE0Z-x*k1I`dJ+|%ksLI!qo%DOV{AHo|KLwWw=IbHR4a#P?K<;$@^~lzO@-y zPkAb!#gWfIPaA2l12am)q}b~F0ge|#G&raI#r*HB?vGE^YrZJzMbxhIG~^zm{dSq*HC7lE65-tMp7iNqY{we@2L4y2RYb@VQV2t|%K`SWtxv;L@& zKu7n!`>nx&VZGo^7hM%%EtDyhFa4~aUTN4!c0u9Y2C0H<{eQ#$NJi#g4h&($ou2fZ zD$g3Dg|`#nkbP@Lo!O2I@*3Zdkn6Rq+CjJ5t~Uvi%vJLD|`6Ws|a0U%PTOp>&Ih>mdEZuS{y<>V<}#T9cBKB$s|g8C4uK z4%V@Q$phUP$1`lw*rbNbX%8Zul_}qQ&kCt@3BYS3i`LN+BMUL0wpV9Quig6C)R|t<7?HMK3FD4HpZq z!Nz-S#CQlvlE|==nS1(6b7*`|W5MCwn2JzpR!hv5U%JxmB5)taUL@|IqNokVa6iYx zHa+sfFC`3(@UcW9^G76gj_qO#)y<}(dgTV34hFm5wWXKX{ zEP@KZ-UQ2aX|&X8%fDi@QsJp_&jU#DnsBTJ71Sc|&by^VgH$&0arLS$%cPketZir* zFUf(j=L|r_;*GLDU(tk+5y3znNhyWicQpn;DQjL#A%#cF_gE0cZ_2F(6PDM3lL{Il8Ias_9?~Bwl@Fi zkl?a@JtRSA{O&#h?R#>kZsuSlI#J1mAd|l`&qdwpjYvN=cVf!4@IK1PjLfu?X~`f6 z5WhyRNulhtAE?Rzcj{(7{r%_ZbkM}rmr`T+$q}6ge%`mFimWy8G>D!l`rzuM=8rYC;K+Hwvmop?`oUw#@fJxdj z3Y+;K(+PVBhMg&tP>Ehkd?H@z8N|RX$yi}o1^DP><;QasM(>M5Aau6;y~kSi`FNxD zzih>$Ci_&yaE`lsqd#5tXb^B}#X3s~d8J0(IiJ`Pu@&h`_kFM3U;XT0&8VCGi2njW z$QI?wp=lfyCkIPtKB!491NrP^2i?VZ+Rt`%I4!fKH!)S(hbp-!rg&w%bH1UpYU@E3 zgKk@BSubXQ!$ikV+)d}d>~uQWZMHHkpAi%yQ9*0gC7W^fIji?uc{EbSf0GeM8pm`B z@`mjxbT5d!K+$P$TTPM?y0~?=p1m{$o54st$fErn+dmO6lEwx(N~>me=F2UK=1IL2I8dSbg4FBJFfCpd*Zwu#0lL{UXAK1zAWyD0? zx0R>NAh?KRI$<{C+Lx20`~#S!iDzud({)XE4$sQjR#Vd+11h|Qp&}#M+WU{`=;yH_ zqdHj4vUHs0g1A%z4NhMpW4A^#r?qy|u1EeEb{ED=3#A|1>3KpyXJ&E({nlskM~tB4 z{&JXePt&qV0tyGd+;O1ag}{z`VYH^AKW<6OL)h|EqrVqCquz%il)gS^^qwM=R6kbV zsq5h5h)=TtIuJ_P=%YwLqj@Xv8b{|WV0!%D|0<7hqHTzkj5=iJmK0J_crUD|M~JTF z)7vih_~n+LX{(<&Xrhj>@N-yjdpusl7lv|d48`b2X*zUf??i~tds404g~3>`b4Zn# z=0G&nIis&2L%A{OJm(<0f9{{)SOyZ1jTQobv6QsFaNkt#cm!3&E1>#2xEW;&?Mdu` zJ$h7TdVx;^bw_nF4kQlJ0g_*JKD@-#Q7SUL#LzC4j{H;4GUh#-kEZEwG{6~axZlQ@ zx8GIHl{-+UEl{s}I$e^lb+V#-2D(95o{ z;-2G7h-G0LG5^qhFN=KCX8B!0?utSh)ZU#;51RAq<4rmw(!xHj_dT35YUO6{7yH{O zWWC#YS$0%55FRPv37(TvO8bZmD0pLUnI10}N()!gq3TTF8^T3|4!=N=!jwch6H1?F zzfWn@L-4B@Iml2}C17JIwFJ2hp`Eph2HripgfO48%h~PMFZb%PyVb56{H;!4TGyb6 z#?kHjDXW{6si(Kx^PYVOl&-r?jREv>5aZ^f*Y{BgwCbC9Z{OBttoZvlg#M958Lmf) zoS(`($nw|*{AUN@MRzu`ddk^KAl)v$ZVi}U(}Yvo>GFr`rDrBc`WO=A>fGpXSZ?u2 z*QM0G0`-Zdb69Pn$^9X%Bv!?KrW=Jn$?SQJe3lB(aWk2HSe#`u=BQ1tC2>O)nu@RM z;mycmo(t%KI%sNqtkj}vE#Zb!c#F^fZbDBARB#`TFgkz9l0M*fgpi-npQN{EK6cMk z6&BPSO~#?tlWr&5y^@jCc(LG(G7BoBiBIL8F^PLDN#-or{j?)YQwt8=0#0YTy1pyN zgB+baIM2V9@vra8OoNoqpMZcdv8#CcAe&7wzF~prS0eUB_G*SvZgRA;j%!zs4P&}j zBQi$%pwg4neCA~ZZ`xLkn|6o0ccUR5zjbY(C5FtOT{k&C4c3HcWrIwsem<zlW(Zp8Psf_fj8{xxg4DK4}%Rs3^H;jgP%BJLuRf3f7J z?o~Mdb9@g{=(>)HB1fF}!ufybZeWzZQ=sr`}L_$2x1kz-G=Nt2iilqW^Xr zds@oL5)l7OKi4QFD81K3r8&)THZ)d!ry?!0xc_KSnup2Eg)S+cm0YeOnPXP}Bs|jM zv}a*-|F8U5^F}0-KQGYeQ@nY#;i8;e0zY91`kUIS&N-$K`Tg`Th-je_uM2_egE6%h z$e^w)$3oMCRApP-IaOX3{95_M=Z8F|Lp^02jdpK%nJsMSY;_9}ovEm!r}-{0^^auU zr%^wh_Q4BkJfeD4HLLP4{@xKgU4$L7XRag`Lag%@N4*^elYG^`A2SGbBMpLX+8=xG#z#=x>jBkN1`V@JM!X92AA*KRlH zdoeFRRFjDT?9Q>ot&pCfxCZ`}}5;>9s<=QNCx)y*ZJHzIR!@ z+m`J?64ze@*VjoC+8GDhrw|;Yg8|uT7wY*pl!Npdl~EOu`G62szO8-8<)$7p6KH@%{R8n5%(G-@kv4Ss?A zRL}Q@5s!%aqK~LecKCmwjStUb{M&k{=->RX2$P+!*i+dI=Hq2Hs>)8iq5=tAmL$K1 z^I|Xp+ExT*WZYeWh{@IZK{?b?>E8PZ1W3ahE9a7qUFl)6SvGJCWG*I{@(VmgH=?p# zfl$}AgBxO%1JMkv7r#;XWBVq`w}oF5Cw3aJ?B|UpJ?-MAvMu%2t&MrAm-qeZY|31y z6M#woD%`dA1C>}yHK&gcW9og4%rcFtGCZj7l{oMGFef4olVwr&vn!C+eX#H+0Nu;5 zpQaL*c)?ws^GL^Tfv74NHIKD!mm}=+8kqxyX2pKU^x{2FIn5Vg#b#180VXu(>qK|| z1Zo_gyj+8^(oTY7u)~woIE*<;<|<3Cf#OEpuFq5dWe=|7uE+OeFQr0o1mL=7>0bT|-^=RzZ)cMw9*hOConcy9jb&FKvl1|xph4ZlqH+E1k23t)(TZ2zgcrho4 zrak4E1-7bx0RDA^W`b1$3%xV`4gWv!3r}0-fd@X!Q4(5GoQoW>96~k(6cwJ<6ffRk zk@9ZPAH1yJDJt;z^AMv&pNjqYo6m)&1E!vC!;e36{<3ths@1s99{HI$T1@IA6XNyn zQ|QJZlje#GQ2RxH;%Dn0=^e>gI>s^?+X>^UJENWmcEV$=ep%jv%E5sGM)U3II#p(T zrQA{4oi}WIpl~8nFZLMVTZiy8a@@!J6{s#c>5ewuY)%)@U#G$yOSFfEhGTQ5>KbM< z1o@t2NZaVd9+p5#w8u!mHUP(CUL?Gq5)Ndd*yvx`>4+A<`Xqm%Gou#AncnzL@+s;s zu!C`FoXNA#v?}U%+Dkgr?Ms4eNf&V0Q%+$)hDX(+;qu=rg!7QI9<)34kFJwH(q z=$qK~q@<6F>5$CEXo>1Q)_8;nY? zumiB&x{Tb6u;7|T`0V!Y&x&OC*FAweH#|P+%6jh$9k$?)=MWJdU+uU?e(V0zI%hBp zU?T4N3n`rry*#+7xztcp&ZL~*V}wtxJ&$oY7y9Q2Jf4MSb%NC7tYmAe{VC&|WAj35 zIm&mYqQp|gxtNF%4duhME4ECl$E%D637i^A!)w;t(Rhinb-UPZQ-mEUKaYL7-Ccu& zY%64ksx#aop=_xsabPDm5~Os~|V4X3cX;%Dn8o`fNwLtonrWe2Y96S8oNXH& zQIgx|H>cZ3cx->}(W*<_W?FmXFNprkf|L>cu~yCV`l^zTICYK@$t*G0*a0b;i9^}M z0z^seTw@!L+e_hUI$)w`#&S`ZbU(t`VJ<4)4MgSuulqIVOQkfb#E!DB>pL)p-h4=2 zn!hG1c=D4gSNGC>IdfkA>$OMcUTMj8%uGLmcq0K}oods2>>$O}HK;ZeAc=3#%G!oy z-5Go0{ku%6@7C94wsq<%N$MKxW`$92)TWut7d|T~=ftjeXCNZAd1}8Nn>AX^vV5fK zU~tSMnjfF%m-)yO+MEo8_4*bNBP-Y@1_lsI(4y8pDd+I@_1|)&SjXiel}T3!m_SGO z@iHep)FzR&qL~^+%xBkrtL!TXkqRbWJTIIMwJt2BbCq65WXvi{R%q65X+9hiD=pns z&wt?gMzm0mp5K@*OK>J1l8V{M!>y~??i!?wEWNL@V75;P&*U{~)Y&9Z6HNksX5eA>oH$4BqoLp=C&tMJiqf)U`amLC~F5^ zD7f%ssxsVcqXeC6ZF~Ye7^yaT6HZK+jitVQ^5BoaEe`HC zmNWHeGo30>l2i%|${?%Ql7d`0a7atKafC!`^^0TRZT{{F! zK5@s1n~CkKW1y_MUyku#qw7B}h|a@YLwhXS{toF)649bKw2}0;1JlKP5yvCzS`E!K z-V0`&D0K9L9qKx`ES5SUI8mDG<4zbj`tQ#+oX%}4?N@ZsaVlEWt?STOTsx4j%l0Ku zJbI7YkZFqlBN*nte*1?VrSG~jvrPfy;y3#&X!VS`25AK;Gz#p-+ z&qGd_UgpZzUSz4!PTy6x5pzmoUL)ugtvn>`K0oC5Nc!lWJsD>s)?4qfdD+rQolwhn zr)?2>P3$vIo@xx8B!@7H6ddg?>_ndbs5c$V2{qaAIF;%O^Zq#bxKV|5ADihnRe{=@ zH%ubnJWguF#067A^taSblz{frMRlH`!WzA%=$TJAE*>k;h6X-IS;8}G^3p^Z&-p%m zx6C>QFjN(dlvqto-nwU9S-#&V*@?7fhU)D4S>Wd_0%WZL=|2E1&g^K;V_A3`dCfCeM#u8L_h4Rf!V6Bc!yK+X6`Wso2{A z)6zG(?hJlYz0-TCZh%UxZ*_tHdZI!U&#;3!WO|(pzgf#xoKe#~#*`lK;4%2zH22h3;nco#<;CFC9z6r+cV*`w) zBqe>6?^#20rf!xfl}Z0-Yo*R9bGduuz)d_x9d^hR@C%sZFTb zOkz-QhQDy47M+>duN@0Pwp1<%Hm)sDD=>VBz1a&G}oRFMkca->|(FCSNE58#SeyjA3 zyuOd__PKTP-}a~$SpiCe7*^%CC1VQxc!$fqPnADzZH*MAgNO`II*T&@;$vJZfq|EF zBtz*WuVYqc^37cOtiwUIxHJshMR#zB#R4JT|IB>22T$;DSh1#

3xs5rBvm<%wI^ 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

$*i; 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

  • _5-wn1t?JyTs6 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 z%0D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嵬VT(szYX~ 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 z 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 z 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

    4$IW7aes3{!j~(d+b)76lo5#yG$< zEyOrsiH^yOR{zW*P~R-f44JH0L~eR;54H^Du(T#A+a6UfMZ8d;+px{X!vLe}pP;Gl z=NO>4+E~F}#y*({(YU{gRMBSS%>F}>q zi~MfS?5iZ%o(%^*|GrSs3v~2?+wj6<5c*b;*H}3X--C-w;o`&(8n!Y%@8bj%PH1op zyq*v(M)z|BW0jEpB?*b&my4g^-DY0{B&h0zr3xAd`NNZFF|)74-EqfV==X!1C2NYg z^wney1T$ilgO}=V>YN78jB=3;7<+z9$^zVYPShvI+b42{8;uLPCsUiNd+o|}l;FL3 zIP3!4;DreeGDoq&s>7!G=pYJs3KG&w83GkAl{VQvZzP$QAHg#Jr?BC_66pRi-`aW! z(C`xN3<8Ao!O*ET8wcNpt$G{PT%A8XUpeAuVHb}owx@AQTFBt6z&)-Q&$Va>Gg4I* zR%jE-6fy-%tAv>X!JFxZmSBK8$bQ)#L9w1qBp!+v@;L+)!IfnN(CoZz0S6#@b#p^O zZr$=ulv8r;&dA_laDAOu4FHz-xsf%dGm*nHvBSYW2TYQDbas^&49XTT2q^jyxDh9} z1xJ3+kP^~f!a^%d!?nEv>D(AMyXp7>H?)miquNV4n#4nlZn*CV1g)L2y2qJ8*<5=xN5 zR#F?otk5euEz4 zVB@w1KM#A}Z8MK9Yn<+FXg@urr*Er< z>0c!hs-N3y9c=>pXd84JaTDwEM1}t|x z!0}ZT4vOy4+qWz5ilf$r_@Db3;{oVW*-NY*eJfzK;EL2hJIibFzK9f#nDEg8&8R}Y1SC`Rt`kw7CT@|ta)SoCnWTL zm%tB-rkBUS?Qrk5YKS<2hG1H8`jR=A+7??l@bzH4c4d@o8ic$Y$=i48lYTPd%2*4F)w;Y)T>fZjLYT zh7Qsg6ea1KlxM`c<$UWl6A2Y5C_rMHHU?>_XXd$+q>Jf`PnA`BK?* zC&Q03INtz|D^*}ud_NJh1ezRirF~q1=!v3@@iQ<~Y?!~dN)czSuB+_Q6!HGbB!?AfX;TL28J z9iFb-Z4)00M$07I8kRFo(C6cB_~-m)lA|v>ey*}jOq`Iv4pd&@#io`(JBW}n=PVNa z0L;O^z$5^IpR(IMW?@$|(2CdA^xYSG8 zZ_3&!hf(lRM$hJUcBGWc&c6=&jnt@9%gSw83fBjl$^$Crs+>XJc$+fNDWwoXen>#v z#}U1=aD<3@%)W|%gPbpIAESaAKD$=Vsl~=#QxQFxxQ3r_yot)EU;iL(T+XR^W<64r z2s8A$J%G%es{+F@FK*K&yL;d|ZM0n5NhKIq8-kB*7w2ows%H@fDCb~Iwej#C2E_ow>3G#4IR_@cW&AZX|$ z;cFmDQ{Z`(_DpBCB9Z2&TCLQcp3BlIg?P{Tu&s!eaTk{b%@qv7e^c#`+hO;(6-Y} z&vJcO(>TLhmppkAup=9T7R*`k@;bO0@^8Pz;n_hYsjxO2s{ZeCJpa0YP3g6Ms_(S! zwD~fC!e+Z99?UffiZHAR;-;LvV;_Z5vxDU~e)-i}F=@i){JZ5C!cDfT!+*CZ&vJSB z`wpEr=R{QF%Y#Jp9vSCUKfF0T{SI{JewT?eSF)C&c7BvF`>pnPVt~4$;m30GUod_z zhZf>aN^>vqD*g~`J3?+W9GDd#`<6B0ISrrk$nterHGl9KlY#kk`HJBLi#U5+wQSX- zGdp%AZCO6aff9-6^8@x1B;QSxlF7HIygiYD22?_qJ4Ap~F+FxW>HsU#kpz+ z#0g48V1<=8YDW^xX52!f#0o;*`27hA0FLsdZS%*5Qu^F>58SePVcfws>=0RfF+cR+ zUuEI%*3GG~HoqVD03w%%|x>tYQ!=! n8%KYsefP6Zm+B@uY0;Dd+u{&^vF_s!;Gg*^%agd{PQU&?_IFLN literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag/api/README.assets/image-20250323194750379.png b/LightRAG/lightrag/api/README.assets/image-20250323194750379.png new file mode 100644 index 0000000000000000000000000000000000000000..649a456eaa09b9cecb59011124d23589e4d1506a GIT binary patch literal 390472 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�FWrK!D!? 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%0Any-0hid%kk1@=1GCx3|4g@V}jfe;rnTw_*wm z-(+Guq%g_F@X9Xr#49xjO0l!6q8;+rT9i=JSXa}YWqh!{^$t^QutV=P8|R^=c2m-{ z*ik?QU40^_*FKcp0GfTZC`j@*4}C>;g2Mf|-i$wcCC5GMHhaGLM6Afl-8-~^9!zZ0 z@bcz&w-rVk#1i|}BU9@0ssVnY~RaTsCSBeR{J-d2Sq3rNu zBB#UBPJIyT?@RzD{e%1qqz|nZ$9T2&1s6D0!O{tL-N91u zH<_jpy|m4(sTpsakNv_HLA}N<1nwIo)!6S*B~Ni0aFk%4tBlYjgUz(`mLUqyY`^YQ z-RZyWO!0dQ`ppqK82KYaR7&nlNvt+9lK54jd<|ccjg#aJw~mgoi`t=f_p;ldZxmD9 z6xbhKV$p!ro~Ua|A$VUcN$^-z=2??#HDqT?=^0LxGwSL`)8Lemgs?m$E-AN+4qq`a zav6@%9a<04esa=NxjAd2TF(Lf9c}__8=dFCPodjlwRM}LL!1R~g*#$I-|SK~7wOj; zy(=MK&U3nbz+w8k`eGd3#719nqN|1hW29VX2+2gN!N6L^ zw8Qx4$)RE9fz8k;YOnrWlK3nks}P&+l7=nwOVwuvbLJ z8;!!FkM3K~ceX+b1oB$#uWwpBj~s zvaqmJFPB;�G(Q1KF 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 D#-v Since VS Code with the Python extension may automatically load the .env file in the integrated terminal, please open a new terminal session after each modification to the .env file. + +Here are some examples of common settings for LLM and Embedding models: + +* OpenAI LLM + Ollama Embedding: + +``` +LLM_BINDING=openai +LLM_MODEL=gpt-4o +LLM_BINDING_HOST=https://api.openai.com/v1 +LLM_BINDING_API_KEY=your_api_key + +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +# EMBEDDING_BINDING_API_KEY=your_api_key +``` + +> When targeting Google Gemini, set `LLM_BINDING=gemini`, choose a model such as `LLM_MODEL=gemini-flash-latest`, and provide your Gemini key via `LLM_BINDING_API_KEY` (or `GEMINI_API_KEY`). + +* Ollama LLM + Ollama Embedding: + +``` +LLM_BINDING=ollama +LLM_MODEL=mistral-nemo:latest +LLM_BINDING_HOST=http://localhost:11434 +# LLM_BINDING_API_KEY=your_api_key +### Ollama Server context length (Must be larger than MAX_TOTAL_TOKENS+2000) +OLLAMA_LLM_NUM_CTX=16384 + +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +# EMBEDDING_BINDING_API_KEY=your_api_key +``` + +> **Important Note**: The Embedding model must be determined before document indexing, and the same model must be used during the document query phase. For certain storage solutions (e.g., PostgreSQL), the vector dimension must be defined upon initial table creation. Therefore, when changing embedding models, it is necessary to delete the existing vector-related tables and allow LightRAG to recreate them with the new dimensions. + +### Starting LightRAG Server + +The LightRAG Server supports two operational modes: +* The simple and efficient Uvicorn mode: + +``` +lightrag-server +``` +* The multiprocess Gunicorn + Uvicorn mode (production mode, not supported on Windows environments): + +``` +lightrag-gunicorn --workers 4 +``` + +When starting LightRAG, the current working directory must contain the `.env` configuration file. **It is intentionally designed that the `.env` file must be placed in the startup directory**. The purpose of this is to allow users to launch multiple LightRAG instances simultaneously and configure different `.env` files for different instances. **After modifying the `.env` file, you need to reopen the terminal for the new settings to take effect.** This is because each time LightRAG Server starts, it loads the environment variables from the `.env` file into the system environment variables, and system environment variables have higher precedence. + +During startup, configurations in the `.env` file can be overridden by command-line parameters. Common command-line parameters include: + +- `--host`: Server listening address (default: 0.0.0.0) +- `--port`: Server listening port (default: 9621) +- `--timeout`: LLM request timeout (default: 150 seconds) +- `--log-level`: Log level (default: INFO) +- `--working-dir`: Database persistence directory (default: ./rag_storage) +- `--input-dir`: Directory for uploaded files (default: ./inputs) +- `--workspace`: Workspace name, used to logically isolate data between multiple LightRAG instances (default: empty) + +### Launching LightRAG Server with Docker + +Using Docker Compose is the most convenient way to deploy and run the LightRAG Server. + +* Create a project directory. + +* Copy the `docker-compose.yml` file from the LightRAG repository into your project directory. + +* Prepare the `.env` file: Duplicate the sample file [`env.example`](https://ai.znipower.com:5013/c/env.example)to create a customized `.env` file, and configure the LLM and embedding parameters according to your specific requirements. + +* Start the LightRAG Server with the following command: + +```shell +docker compose up +# If you want the program to run in the background after startup, add the -d parameter at the end of the command. +``` + +You can get the official docker compose file from here: [docker-compose.yml](https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml). For historical versions of LightRAG docker images, visit this link: [LightRAG Docker Images](https://github.com/HKUDS/LightRAG/pkgs/container/lightrag). For more details about docker deployment, please refer to [DockerDeployment.md](./../../docs/DockerDeployment.md). + +### Offline Deployment + +Official LightRAG Docker images are fully compatible with offline or air-gapped environments. If you want to build up you own offline enviroment, please refer to [Offline Deployment Guide](./../../docs/OfflineDeployment.md). + +### Starting Multiple LightRAG Instances + +There are two ways to start multiple LightRAG instances. The first way is to configure a completely independent working environment for each instance. This requires creating a separate working directory for each instance and placing a dedicated `.env` configuration file in that directory. The server listening ports in the configuration files of different instances cannot be the same. Then, you can start the service by running `lightrag-server` in the working directory. + +The second way is for all instances to share the same set of `.env` configuration files, and then use command-line arguments to specify different server listening ports and workspaces for each instance. You can start multiple LightRAG instances in the same working directory with different command-line arguments. For example: + +``` +# Start instance 1 +lightrag-server --port 9621 --workspace space1 + +# Start instance 2 +lightrag-server --port 9622 --workspace space2 +``` + +The purpose of a workspace is to achieve data isolation between different instances. Therefore, the `workspace` parameter must be different for different instances; otherwise, it will lead to data confusion and corruption. + +When launching multiple LightRAG instances via Docker Compose, simply specify unique `WORKSPACE` and `PORT` environment variables for each container within your `docker-compose.yml`. Even if all instances share a common `.env` file, the container-specific environment variables defined in Compose will take precedence, ensuring independent configurations for each instance. + +### Data Isolation Between LightRAG Instances + +Configuring an independent working directory and a dedicated `.env` configuration file for each instance can generally ensure that locally persisted files in the in-memory database are saved in their respective working directories, achieving data isolation. By default, LightRAG uses all in-memory databases, and this method of data isolation is sufficient. However, if you are using an external database, and different instances access the same database instance, you need to use workspaces to achieve data isolation; otherwise, the data of different instances will conflict and be destroyed. + +The command-line `workspace` argument and the `WORKSPACE` environment variable in the `.env` file can both be used to specify the workspace name for the current instance, with the command-line argument having higher priority. Here is how workspaces are implemented for different types of storage: + +- **For local file-based databases, data isolation is achieved through workspace subdirectories:** `JsonKVStorage`, `JsonDocStatusStorage`, `NetworkXStorage`, `NanoVectorDBStorage`, `FaissVectorDBStorage`. +- **For databases that store data in collections, it's done by adding a workspace prefix to the collection name:** `RedisKVStorage`, `RedisDocStatusStorage`, `MilvusVectorDBStorage`, `MongoKVStorage`, `MongoDocStatusStorage`, `MongoVectorDBStorage`, `MongoGraphStorage`, `PGGraphStorage`. +- **For Qdrant vector database, data isolation is achieved through payload-based partitioning (Qdrant's recommended multitenancy approach):** `QdrantVectorDBStorage` uses shared collections with payload filtering for unlimited workspace scalability. +- **For relational databases, data isolation is achieved by adding a `workspace` field to the tables for logical data separation:** `PGKVStorage`, `PGVectorStorage`, `PGDocStatusStorage`. +- **For graph databases, logical data isolation is achieved through labels:** `Neo4JStorage`, `MemgraphStorage` + +To maintain compatibility with legacy data, the default workspace for PostgreSQL is `default` and for Neo4j is `base` when no workspace is configured. For all external storages, the system provides dedicated workspace environment variables to override the common `WORKSPACE` environment variable configuration. These storage-specific workspace environment variables are: `REDIS_WORKSPACE`, `MILVUS_WORKSPACE`, `QDRANT_WORKSPACE`, `MONGODB_WORKSPACE`, `POSTGRES_WORKSPACE`, `NEO4J_WORKSPACE`, `MEMGRAPH_WORKSPACE`. + +### Multiple workers for Gunicorn + Uvicorn + +The LightRAG Server can operate in the `Gunicorn + Uvicorn` preload mode. Gunicorn's multiple worker (multiprocess) capability prevents document indexing tasks from blocking RAG queries. Using CPU-exhaustive document extraction tools, such as docling, can lead to the entire system being blocked in pure Uvicorn mode. + +Though LightRAG Server uses one worker to process the document indexing pipeline, with the async task support of Uvicorn, multiple files can be processed in parallel. The bottleneck of document indexing speed mainly lies with the LLM. If your LLM supports high concurrency, you can accelerate document indexing by increasing the concurrency level of the LLM. Below are several environment variables related to concurrent processing, along with their default values: + +``` +### Number of worker processes, not greater than (2 x number_of_cores) + 1 +WORKERS=2 +### Number of parallel files to process in one batch +MAX_PARALLEL_INSERT=2 +### Max concurrent requests to the LLM +MAX_ASYNC=4 +``` + +### Install LightRAG as a Linux Service + +Create your service file `lightrag.service` from the sample file: `lightrag.service.example`. Modify the start options the service file: + +```text +# Set Enviroment to your Python virtual enviroment +Environment="PATH=/home/netman/lightrag-xyj/venv/bin" +WorkingDirectory=/home/netman/lightrag-xyj +# ExecStart=/home/netman/lightrag-xyj/venv/bin/lightrag-server +ExecStart=/home/netman/lightrag-xyj/venv/bin/lightrag-gunicorn + +``` + +> The ExecStart command must be either `lightrag-gunicorn` or `lightrag-server`; no wrapper scripts are allowed. This is because service termination requires the main process to be one of these two executables. + +Install LightRAG service. If your system is Ubuntu, the following commands will work: + +```shell +sudo cp lightrag.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl start lightrag.service +sudo systemctl status lightrag.service +sudo systemctl enable lightrag.service +``` + +## Ollama Emulation + +We provide Ollama-compatible interfaces for LightRAG, aiming to emulate LightRAG as an Ollama chat model. This allows AI chat frontends supporting Ollama, such as Open WebUI, to access LightRAG easily. + +### Connect Open WebUI to LightRAG + +After starting the lightrag-server, you can add an Ollama-type connection in the Open WebUI admin panel. And then a model named `lightrag:latest` will appear in Open WebUI's model management interface. Users can then send queries to LightRAG through the chat interface. You should install LightRAG as a service for this use case. + +Open WebUI uses an LLM to do the session title and session keyword generation task. So the Ollama chat completion API detects and forwards OpenWebUI session-related requests directly to the underlying LLM. Screenshot from Open WebUI: + +![image-20250323194750379](./README.assets/image-20250323194750379.png) + +### Choose Query mode in chat + +The default query mode is `hybrid` if you send a message (query) from the Ollama interface of LightRAG. You can select query mode by sending a message with a query prefix. + +A query prefix in the query string can determine which LightRAG query mode is used to generate the response for the query. The supported prefixes include: + +``` +/local +/global +/hybrid +/naive +/mix + +/bypass +/context +/localcontext +/globalcontext +/hybridcontext +/naivecontext +/mixcontext +``` + +For example, the chat message `/mix What's LightRAG?` will trigger a mix mode query for LightRAG. A chat message without a query prefix will trigger a hybrid mode query by default. + +`/bypass` is not a LightRAG query mode; it will tell the API Server to pass the query directly to the underlying LLM, including the chat history. So the user can use the LLM to answer questions based on the chat history. If you are using Open WebUI as a front end, you can just switch the model to a normal LLM instead of using the `/bypass` prefix. + +`/context` is also not a LightRAG query mode; it will tell LightRAG to return only the context information prepared for the LLM. You can check the context if it's what you want, or process the context by yourself. + +### Add user prompt in chat + +When using LightRAG for content queries, avoid combining the search process with unrelated output processing, as this significantly impacts query effectiveness. User prompt is specifically designed to address this issue — it does not participate in the RAG retrieval phase, but rather guides the LLM on how to process the retrieved results after the query is completed. We can append square brackets to the query prefix to provide the LLM with the user prompt: + +``` +/[Use mermaid format for diagrams] Please draw a character relationship diagram for Scrooge +/mix[Use mermaid format for diagrams] Please draw a character relationship diagram for Scrooge +``` + +## API Key and Authentication + +By default, the LightRAG Server can be accessed without any authentication. We can configure the server with an API Key or account credentials to secure it. + +* API Key: + +``` +LIGHTRAG_API_KEY=your-secure-api-key-here +WHITELIST_PATHS=/health,/api/* +``` + +> Health check and Ollama emulation endpoints are excluded from API Key check by default. For security reasons, remove `/api/*` from `WHITELIST_PATHS` if the Ollama service is not required. + +The API key is passed using the request header `X-API-Key`. Below is an example of accessing the LightRAG Server via API: + +``` +curl -X 'POST' \ + 'http://localhost:9621/documents/scan' \ + -H 'accept: application/json' \ + -H 'X-API-Key: your-secure-api-key-here-123' \ + -d '' +``` + +* Account credentials (the Web UI requires login before access can be granted): + +LightRAG API Server implements JWT-based authentication using the HS256 algorithm. To enable secure access control, the following environment variables are required: + +```bash +# For jwt auth +AUTH_ACCOUNTS='admin:admin123,user1:pass456' +TOKEN_SECRET='your-key' +TOKEN_EXPIRE_HOURS=4 +``` + +> Currently, only the configuration of an administrator account and password is supported. A comprehensive account system is yet to be developed and implemented. + +If Account credentials are not configured, the Web UI will access the system as a Guest. Therefore, even if only an API Key is configured, all APIs can still be accessed through the Guest account, which remains insecure. Hence, to safeguard the API, it is necessary to configure both authentication methods simultaneously. + +## For Azure OpenAI Backend + +Azure OpenAI API can be created using the following commands in Azure CLI (you need to install Azure CLI first from [https://docs.microsoft.com/en-us/cli/azure/install-azure-cli](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)): + +```bash +# Change the resource group name, location, and OpenAI resource name as needed +RESOURCE_GROUP_NAME=LightRAG +LOCATION=swedencentral +RESOURCE_NAME=LightRAG-OpenAI + +az login +az group create --name $RESOURCE_GROUP_NAME --location $LOCATION +az cognitiveservices account create --name $RESOURCE_NAME --resource-group $RESOURCE_GROUP_NAME --kind OpenAI --sku S0 --location swedencentral +az cognitiveservices account deployment create --resource-group $RESOURCE_GROUP_NAME --model-format OpenAI --name $RESOURCE_NAME --deployment-name gpt-4o --model-name gpt-4o --model-version "2024-08-06" --sku-capacity 100 --sku-name "Standard" +az cognitiveservices account deployment create --resource-group $RESOURCE_GROUP_NAME --model-format OpenAI --name $RESOURCE_NAME --deployment-name text-embedding-3-large --model-name text-embedding-3-large --model-version "1" --sku-capacity 80 --sku-name "Standard" +az cognitiveservices account show --name $RESOURCE_NAME --resource-group $RESOURCE_GROUP_NAME --query "properties.endpoint" +az cognitiveservices account keys list --name $RESOURCE_NAME -g $RESOURCE_GROUP_NAME + +``` + +The output of the last command will give you the endpoint and the key for the OpenAI API. You can use these values to set the environment variables in the `.env` file. + +``` +# Azure OpenAI Configuration in .env: +LLM_BINDING=azure_openai +LLM_BINDING_HOST=your-azure-endpoint +LLM_MODEL=your-model-deployment-name +LLM_BINDING_API_KEY=your-azure-api-key +### API version is optional, defaults to latest version +AZURE_OPENAI_API_VERSION=2024-08-01-preview + +### If using Azure OpenAI for embeddings +EMBEDDING_BINDING=azure_openai +EMBEDDING_MODEL=your-embedding-deployment-name +``` + +## LightRAG Server Configuration in Detail + +The API Server can be configured in three ways (highest priority first): + +* Command line arguments +* Environment variables or .env file +* Config.ini (Only for storage configuration) + +Most of the configurations come with default settings; check out the details in the sample file: `.env.example`. Data storage configuration can also be set by config.ini. A sample file `config.ini.example` is provided for your convenience. + +### LLM and Embedding Backend Supported + +LightRAG supports binding to various LLM/Embedding backends: + +* ollama +* openai (including openai compatible) +* azure_openai +* lollms +* aws_bedrock + +Use environment variables `LLM_BINDING` or CLI argument `--llm-binding` to select the LLM backend type. Use environment variables `EMBEDDING_BINDING` or CLI argument `--embedding-binding` to select the Embedding backend type. + +For LLM and embedding configuration examples, please refer to the `env.example` file in the project's root directory. To view the complete list of configurable options for OpenAI and Ollama-compatible LLM interfaces, use the following commands: +``` +lightrag-server --llm-binding openai --help +lightrag-server --llm-binding ollama --help +lightrag-server --embedding-binding ollama --help +``` + +> Please use OpenAI-compatible method to access LLMs deployed by OpenRouter or vLLM/SGLang. You can pass additional parameters to OpenRouter or vLLM/SGLang through the `OPENAI_LLM_EXTRA_BODY` environment variable to disable reasoning mode or achieve other personalized controls. + +Set the max_tokens to **prevent excessively long or endless output loop** during the entity relationship extraction phase for Large Language Model (LLM) responses. The purpose of setting max_tokens parameter is to truncate LLM output before timeouts occur, thereby preventing document extraction failures. This addresses issues where certain text blocks (e.g., tables or citations) containing numerous entities and relationships can lead to overly long or even endless loop outputs from LLMs. This setting is particularly crucial for locally deployed, smaller-parameter models. Max tokens value can be calculated by this formula: `LLM_TIMEOUT * llm_output_tokens/second` (i.e. `180s * 50 tokens/s = 9000`) + +``` +# For vLLM/SGLang doployed models, or most of OpenAI compatible API provider +OPENAI_LLM_MAX_TOKENS=9000 + +# For Ollama Deployed Modeles +OLLAMA_LLM_NUM_PREDICT=9000 + +# For OpenAI o1-mini or newer modles +OPENAI_LLM_MAX_COMPLETION_TOKENS=9000 +``` + +### Entity Extraction Configuration + +* ENABLE_LLM_CACHE_FOR_EXTRACT: Enable LLM cache for entity extraction (default: true) + +It's very common to set `ENABLE_LLM_CACHE_FOR_EXTRACT` to true for a test environment to reduce the cost of LLM calls. + +### Storage Types Supported + +LightRAG uses 4 types of storage for different purposes: + +* KV_STORAGE: llm response cache, text chunks, document information +* VECTOR_STORAGE: entities vectors, relation vectors, chunks vectors +* GRAPH_STORAGE: entity relation graph +* DOC_STATUS_STORAGE: document indexing status + +LightRAG Server offers various storage implementations, with the default being an in-memory database that persists data to the WORKING_DIR directory. Additionally, LightRAG supports a wide range of storage solutions including PostgreSQL, MongoDB, FAISS, Milvus, Qdrant, Neo4j, Memgraph, and Redis. For detailed information on supported storage options, please refer to the storage section in the README.md file located in the root directory. + +You can select the storage implementation by configuring environment variables. For instance, prior to the initial launch of the API server, you can set the following environment variable to specify your desired storage implementation: + +``` +LIGHTRAG_KV_STORAGE=PGKVStorage +LIGHTRAG_VECTOR_STORAGE=PGVectorStorage +LIGHTRAG_GRAPH_STORAGE=PGGraphStorage +LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage +``` + +You cannot change storage implementation selection after adding documents to LightRAG. Data migration from one storage implementation to another is not supported yet. For further information, please read the sample env file or config.ini file. + +### LLM Cache Migration Between Storage Types + +When switching the storage implementation in LightRAG, the LLM cache can be migrated from the existing storage to the new one. Subsequently, when re-uploading files to the new storage, the pre-existing LLM cache will significantly accelerate file processing. For detailed instructions on using the LLM cache migration tool, please refer to[README_MIGRATE_LLM_CACHE.md](../tools/README_MIGRATE_LLM_CACHE.md) + +### LightRAG API Server Command Line Options + +| Parameter | Default | Description | +| --------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| --host | 0.0.0.0 | Server host | +| --port | 9621 | Server port | +| --working-dir | ./rag_storage | Working directory for RAG storage | +| --input-dir | ./inputs | Directory containing input documents | +| --max-async | 4 | Maximum number of async operations | +| --log-level | INFO | Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) | +| --verbose | - | Verbose debug output (True, False) | +| --key | None | API key for authentication. Protects the LightRAG server against unauthorized access | +| --ssl | False | Enable HTTPS | +| --ssl-certfile | None | Path to SSL certificate file (required if --ssl is enabled) | +| --ssl-keyfile | None | Path to SSL private key file (required if --ssl is enabled) | +| --llm-binding | ollama | LLM binding type (lollms, ollama, openai, openai-ollama, azure_openai, aws_bedrock) | +| --embedding-binding | ollama | Embedding binding type (lollms, ollama, openai, azure_openai, aws_bedrock) | + +### Reranking Configuration + +Reranking query-recalled chunks can significantly enhance retrieval quality by re-ordering documents based on an optimized relevance scoring model. LightRAG currently supports the following rerank providers: + +- **Cohere / vLLM**: Offers full API integration with Cohere AI's `v2/rerank` endpoint. As vLLM provides a Cohere-compatible reranker API, all reranker models deployed via vLLM are also supported. +- **Jina AI**: Provides complete implementation compatibility with all Jina rerank models. +- **Aliyun**: Features a custom implementation designed to support Aliyun's rerank API format. + +The rerank provider is configured via the `.env` file. Below is an example configuration for a rerank model deployed locally using vLLM: + +``` +RERANK_BINDING=cohere +RERANK_MODEL=BAAI/bge-reranker-v2-m3 +RERANK_BINDING_HOST=http://localhost:8000/v1/rerank +RERANK_BINDING_API_KEY=your_rerank_api_key_here +``` + +Here is an example configuration for utilizing the Reranker service provided by Aliyun: + +``` +RERANK_BINDING=aliyun +RERANK_MODEL=gte-rerank-v2 +RERANK_BINDING_HOST=https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank +RERANK_BINDING_API_KEY=your_rerank_api_key_here +``` + +For comprehensive reranker configuration examples, please refer to the `env.example` file. + +### Enable Reranking + +Reranking can be enabled or disabled on a per-query basis. + +The `/query` and `/query/stream` API endpoints include an `enable_rerank` parameter, which is set to `true` by default, controlling whether reranking is active for the current query. To change the default value of the `enable_rerank` parameter to `false`, set the following environment variable: + +``` +RERANK_BY_DEFAULT=False +``` + +### Include Chunk Content in References + +By default, the `/query` and `/query/stream` endpoints return references with only `reference_id` and `file_path`. For evaluation, debugging, or citation purposes, you can request the actual retrieved chunk content to be included in references. + +The `include_chunk_content` parameter (default: `false`) controls whether the actual text content of retrieved chunks is included in the response references. This is particularly useful for: + +- **RAG Evaluation**: Testing systems like RAGAS that need access to retrieved contexts +- **Debugging**: Verifying what content was actually used to generate the answer +- **Citation Display**: Showing users the exact text passages that support the response +- **Transparency**: Providing full visibility into the RAG retrieval process + +**Important**: The `content` field is an **array of strings**, where each string represents a chunk from the same file. A single file may correspond to multiple chunks, so the content is returned as a list to preserve chunk boundaries. + +**Example API Request:** + +```json +{ + "query": "What is LightRAG?", + "mode": "mix", + "include_references": true, + "include_chunk_content": true +} +``` + +**Example Response (with chunk content):** + +```json +{ + "response": "LightRAG is a graph-based RAG system...", + "references": [ + { + "reference_id": "1", + "file_path": "/documents/intro.md", + "content": [ + "LightRAG is a retrieval-augmented generation system that combines knowledge graphs with vector similarity search...", + "The system uses a dual-indexing approach with both vector embeddings and graph structures for enhanced retrieval..." + ] + }, + { + "reference_id": "2", + "file_path": "/documents/features.md", + "content": [ + "The system provides multiple query modes including local, global, hybrid, and mix modes..." + ] + } + ] +} +``` + +**Notes**: +- This parameter only works when `include_references=true`. Setting `include_chunk_content=true` without including references has no effect. +- **Breaking Change**: Prior versions returned `content` as a single concatenated string. Now it returns an array of strings to preserve individual chunk boundaries. If you need a single string, join the array elements with your preferred separator (e.g., `"\n\n".join(content)`). + +### .env Examples + +```bash +### Server Configuration +# HOST=0.0.0.0 +PORT=9621 +WORKERS=2 + +### Settings for document indexing +ENABLE_LLM_CACHE_FOR_EXTRACT=true +SUMMARY_LANGUAGE=Chinese +MAX_PARALLEL_INSERT=2 + +### LLM Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal) +TIMEOUT=150 +MAX_ASYNC=4 + +LLM_BINDING=openai +LLM_MODEL=gpt-4o-mini +LLM_BINDING_HOST=https://api.openai.com/v1 +LLM_BINDING_API_KEY=your-api-key + +### Embedding Configuration (Use valid host. For local services installed with docker, you can use host.docker.internal) +# see also env.ollama-binding-options.example for fine tuning ollama +EMBEDDING_MODEL=bge-m3:latest +EMBEDDING_DIM=1024 +EMBEDDING_BINDING=ollama +EMBEDDING_BINDING_HOST=http://localhost:11434 + +### For JWT Auth +# AUTH_ACCOUNTS='admin:admin123,user1:pass456' +# TOKEN_SECRET=your-key-for-LightRAG-API-Server-xxx +# TOKEN_EXPIRE_HOURS=48 + +# LIGHTRAG_API_KEY=your-secure-api-key-here-123 +# WHITELIST_PATHS=/api/* +# WHITELIST_PATHS=/health,/api/* + +``` + +## Document and Chunk Processing Login Clarification + +The document processing pipeline in LightRAG is somewhat complex and is divided into two primary stages: the Extraction stage (entity and relationship extraction) and the Merging stage (entity and relationship merging). There are two key parameters that control pipeline concurrency: the maximum number of files processed in parallel (MAX_PARALLEL_INSERT) and the maximum number of concurrent LLM requests (MAX_ASYNC). The workflow is described as follows: + +1. MAX_ASYNC limits the total number of concurrent LLM requests in the system, including those for querying, extraction, and merging. LLM requests have different priorities: query operations have the highest priority, followed by merging, and then extraction. +2. MAX_PARALLEL_INSERT controls the number of files processed in parallel during the extraction stage. For optimal performance, MAX_PARALLEL_INSERT is recommended to be set between 2 and 10, typically MAX_ASYNC/3. Setting this value too high can increase the likelihood of naming conflicts among entities and relationships across different documents during the merge phase, thereby reducing its overall efficiency. +3. Within a single file, entity and relationship extractions from different text blocks are processed concurrently, with the degree of concurrency set by MAX_ASYNC. Only after MAX_ASYNC text blocks are processed will the system proceed to the next batch within the same file. +4. When a file completes entity and relationship extraction, it enters the entity and relationship merging stage. This stage also processes multiple entities and relationships concurrently, with the concurrency level also controlled by `MAX_ASYNC`. +5. LLM requests for the merging stage are prioritized over the extraction stage to ensure that files in the merging phase are processed quickly and their results are promptly updated in the vector database. +6. To prevent race conditions, the merging stage avoids concurrent processing of the same entity or relationship. When multiple files involve the same entity or relationship that needs to be merged, they are processed serially. +7. Each file is treated as an atomic processing unit in the pipeline. A file is marked as successfully processed only after all its text blocks have completed extraction and merging. If any error occurs during processing, the entire file is marked as failed and must be reprocessed. +8. When a file is reprocessed due to errors, previously processed text blocks can be quickly skipped thanks to LLM caching. Although LLM cache is also utilized during the merging stage, inconsistencies in merging order may limit its effectiveness in this stage. +9. If an error occurs during extraction, the system does not retain any intermediate results. If an error occurs during merging, already merged entities and relationships might be preserved; when the same file is reprocessed, re-extracted entities and relationships will be merged with the existing ones, without impacting the query results. +10. At the end of the merging stage, all entity and relationship data are updated in the vector database. Should an error occur at this point, some updates may be retained. However, the next processing attempt will overwrite previous results, ensuring that successfully reprocessed files do not affect the integrity of future query results. + +Large files should be divided into smaller segments to enable incremental processing. Reprocessing of failed files can be initiated by pressing the "Scan" button on the web UI. + +## API Endpoints + +All servers (LoLLMs, Ollama, OpenAI and Azure OpenAI) provide the same REST API endpoints for RAG functionality. When the API Server is running, visit: + +- Swagger UI: http://localhost:9621/docs +- ReDoc: http://localhost:9621/redoc + +You can test the API endpoints using the provided curl commands or through the Swagger UI interface. Make sure to: + +1. Start the appropriate backend service (LoLLMs, Ollama, or OpenAI) +2. Start the RAG server +3. Upload some documents using the document management endpoints +4. Query the system using the query endpoints +5. Trigger document scan if new files are put into the inputs directory + +## Asynchronous Document Indexing with Progress Tracking + +LightRAG implements asynchronous document indexing to enable frontend monitoring and querying of document processing progress. Upon uploading files or inserting text through designated endpoints, a unique Track ID is returned to facilitate real-time progress monitoring. + +**API Endpoints Supporting Track ID Generation:** + +* `/documents/upload` +* `/documents/text` +* `/documents/texts` + +**Document Processing Status Query Endpoint:** +* `/track_status/{track_id}` + +This endpoint provides comprehensive status information including: +* Document processing status (pending/processing/processed/failed) +* Content summary and metadata +* Error messages if processing failed +* Timestamps for creation and updates diff --git a/LightRAG/lightrag/api/__init__.py b/LightRAG/lightrag/api/__init__.py new file mode 100644 index 00000000..8fdc9fae --- /dev/null +++ b/LightRAG/lightrag/api/__init__.py @@ -0,0 +1 @@ +__api_version__ = "0254" diff --git a/LightRAG/lightrag/api/auth.py b/LightRAG/lightrag/api/auth.py new file mode 100644 index 00000000..0b61095d --- /dev/null +++ b/LightRAG/lightrag/api/auth.py @@ -0,0 +1,109 @@ +from datetime import datetime, timedelta + +import jwt +from dotenv import load_dotenv +from fastapi import HTTPException, status +from pydantic import BaseModel + +from .config import global_args + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +class TokenPayload(BaseModel): + sub: str # Username + exp: datetime # Expiration time + role: str = "user" # User role, default is regular user + metadata: dict = {} # Additional metadata + + +class AuthHandler: + def __init__(self): + self.secret = global_args.token_secret + self.algorithm = global_args.jwt_algorithm + self.expire_hours = global_args.token_expire_hours + self.guest_expire_hours = global_args.guest_token_expire_hours + self.accounts = {} + auth_accounts = global_args.auth_accounts + if auth_accounts: + for account in auth_accounts.split(","): + username, password = account.split(":", 1) + self.accounts[username] = password + + def create_token( + self, + username: str, + role: str = "user", + custom_expire_hours: int = None, + metadata: dict = None, + ) -> str: + """ + Create JWT token + + Args: + username: Username + role: User role, default is "user", guest is "guest" + custom_expire_hours: Custom expiration time (hours), if None use default value + metadata: Additional metadata + + Returns: + str: Encoded JWT token + """ + # Choose default expiration time based on role + if custom_expire_hours is None: + if role == "guest": + expire_hours = self.guest_expire_hours + else: + expire_hours = self.expire_hours + else: + expire_hours = custom_expire_hours + + expire = datetime.utcnow() + timedelta(hours=expire_hours) + + # Create payload + payload = TokenPayload( + sub=username, exp=expire, role=role, metadata=metadata or {} + ) + + return jwt.encode(payload.dict(), self.secret, algorithm=self.algorithm) + + def validate_token(self, token: str) -> dict: + """ + Validate JWT token + + Args: + token: JWT token + + Returns: + dict: Dictionary containing user information + + Raises: + HTTPException: If token is invalid or expired + """ + try: + payload = jwt.decode(token, self.secret, algorithms=[self.algorithm]) + expire_timestamp = payload["exp"] + expire_time = datetime.utcfromtimestamp(expire_timestamp) + + if datetime.utcnow() > expire_time: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail="Token expired" + ) + + # Return complete payload instead of just username + return { + "username": payload["sub"], + "role": payload.get("role", "user"), + "metadata": payload.get("metadata", {}), + "exp": expire_time, + } + except jwt.PyJWTError: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token" + ) + + +auth_handler = AuthHandler() diff --git a/LightRAG/lightrag/api/config.py b/LightRAG/lightrag/api/config.py new file mode 100644 index 00000000..4f59d3c1 --- /dev/null +++ b/LightRAG/lightrag/api/config.py @@ -0,0 +1,549 @@ +""" +Configs for the LightRAG API. +""" + +import os +import argparse +import logging +from dotenv import load_dotenv +from lightrag.utils import get_env_value +from lightrag.llm.binding_options import ( + GeminiEmbeddingOptions, + GeminiLLMOptions, + OllamaEmbeddingOptions, + OllamaLLMOptions, + OpenAILLMOptions, +) +from lightrag.base import OllamaServerInfos +import sys + +from lightrag.constants import ( + DEFAULT_WOKERS, + DEFAULT_TIMEOUT, + DEFAULT_TOP_K, + DEFAULT_CHUNK_TOP_K, + DEFAULT_HISTORY_TURNS, + DEFAULT_MAX_ENTITY_TOKENS, + DEFAULT_MAX_RELATION_TOKENS, + DEFAULT_MAX_TOTAL_TOKENS, + DEFAULT_COSINE_THRESHOLD, + DEFAULT_RELATED_CHUNK_NUMBER, + DEFAULT_MIN_RERANK_SCORE, + DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, + DEFAULT_MAX_ASYNC, + DEFAULT_SUMMARY_MAX_TOKENS, + DEFAULT_SUMMARY_LENGTH_RECOMMENDED, + DEFAULT_SUMMARY_CONTEXT_SIZE, + DEFAULT_SUMMARY_LANGUAGE, + DEFAULT_EMBEDDING_FUNC_MAX_ASYNC, + DEFAULT_EMBEDDING_BATCH_NUM, + DEFAULT_OLLAMA_MODEL_NAME, + DEFAULT_OLLAMA_MODEL_TAG, + DEFAULT_RERANK_BINDING, + DEFAULT_ENTITY_TYPES, +) + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +ollama_server_infos = OllamaServerInfos() + + +class DefaultRAGStorageConfig: + KV_STORAGE = "JsonKVStorage" + VECTOR_STORAGE = "NanoVectorDBStorage" + GRAPH_STORAGE = "NetworkXStorage" + DOC_STATUS_STORAGE = "JsonDocStatusStorage" + + +def get_default_host(binding_type: str) -> str: + default_hosts = { + "ollama": os.getenv("LLM_BINDING_HOST", "http://localhost:11434"), + "lollms": os.getenv("LLM_BINDING_HOST", "http://localhost:9600"), + "azure_openai": os.getenv("AZURE_OPENAI_ENDPOINT", "https://api.openai.com/v1"), + "openai": os.getenv("LLM_BINDING_HOST", "https://api.openai.com/v1"), + "gemini": os.getenv( + "LLM_BINDING_HOST", "https://generativelanguage.googleapis.com" + ), + } + return default_hosts.get( + binding_type, os.getenv("LLM_BINDING_HOST", "http://localhost:11434") + ) # fallback to ollama if unknown + + +def parse_args() -> argparse.Namespace: + """ + Parse command line arguments with environment variable fallback + + Args: + is_uvicorn_mode: Whether running under uvicorn mode + + Returns: + argparse.Namespace: Parsed arguments + """ + + parser = argparse.ArgumentParser(description="LightRAG API Server") + + # Server configuration + parser.add_argument( + "--host", + default=get_env_value("HOST", "0.0.0.0"), + help="Server host (default: from env or 0.0.0.0)", + ) + parser.add_argument( + "--port", + type=int, + default=get_env_value("PORT", 9621, int), + help="Server port (default: from env or 9621)", + ) + + # Directory configuration + parser.add_argument( + "--working-dir", + default=get_env_value("WORKING_DIR", "./rag_storage"), + help="Working directory for RAG storage (default: from env or ./rag_storage)", + ) + parser.add_argument( + "--input-dir", + default=get_env_value("INPUT_DIR", "./inputs"), + help="Directory containing input documents (default: from env or ./inputs)", + ) + + parser.add_argument( + "--timeout", + default=get_env_value("TIMEOUT", DEFAULT_TIMEOUT, int, special_none=True), + type=int, + help="Timeout in seconds (useful when using slow AI). Use None for infinite timeout", + ) + + # RAG configuration + parser.add_argument( + "--max-async", + type=int, + default=get_env_value("MAX_ASYNC", DEFAULT_MAX_ASYNC, int), + help=f"Maximum async operations (default: from env or {DEFAULT_MAX_ASYNC})", + ) + parser.add_argument( + "--summary-max-tokens", + type=int, + default=get_env_value("SUMMARY_MAX_TOKENS", DEFAULT_SUMMARY_MAX_TOKENS, int), + help=f"Maximum token size for entity/relation summary(default: from env or {DEFAULT_SUMMARY_MAX_TOKENS})", + ) + parser.add_argument( + "--summary-context-size", + type=int, + default=get_env_value( + "SUMMARY_CONTEXT_SIZE", DEFAULT_SUMMARY_CONTEXT_SIZE, int + ), + help=f"LLM Summary Context size (default: from env or {DEFAULT_SUMMARY_CONTEXT_SIZE})", + ) + parser.add_argument( + "--summary-length-recommended", + type=int, + default=get_env_value( + "SUMMARY_LENGTH_RECOMMENDED", DEFAULT_SUMMARY_LENGTH_RECOMMENDED, int + ), + help=f"LLM Summary Context size (default: from env or {DEFAULT_SUMMARY_LENGTH_RECOMMENDED})", + ) + + # Logging configuration + parser.add_argument( + "--log-level", + default=get_env_value("LOG_LEVEL", "INFO"), + choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], + help="Logging level (default: from env or INFO)", + ) + parser.add_argument( + "--verbose", + action="store_true", + default=get_env_value("VERBOSE", False, bool), + help="Enable verbose debug output(only valid for DEBUG log-level)", + ) + + parser.add_argument( + "--key", + type=str, + default=get_env_value("LIGHTRAG_API_KEY", None), + help="API key for authentication. This protects lightrag server against unauthorized access", + ) + + # Optional https parameters + parser.add_argument( + "--ssl", + action="store_true", + default=get_env_value("SSL", False, bool), + help="Enable HTTPS (default: from env or False)", + ) + parser.add_argument( + "--ssl-certfile", + default=get_env_value("SSL_CERTFILE", None), + help="Path to SSL certificate file (required if --ssl is enabled)", + ) + parser.add_argument( + "--ssl-keyfile", + default=get_env_value("SSL_KEYFILE", None), + help="Path to SSL private key file (required if --ssl is enabled)", + ) + + # Ollama model configuration + parser.add_argument( + "--simulated-model-name", + type=str, + default=get_env_value("OLLAMA_EMULATING_MODEL_NAME", DEFAULT_OLLAMA_MODEL_NAME), + help="Name for the simulated Ollama model (default: from env or lightrag)", + ) + + parser.add_argument( + "--simulated-model-tag", + type=str, + default=get_env_value("OLLAMA_EMULATING_MODEL_TAG", DEFAULT_OLLAMA_MODEL_TAG), + help="Tag for the simulated Ollama model (default: from env or latest)", + ) + + # Namespace + parser.add_argument( + "--workspace", + type=str, + default=get_env_value("WORKSPACE", ""), + help="Default workspace for all storage", + ) + + # Server workers configuration + parser.add_argument( + "--workers", + type=int, + default=get_env_value("WORKERS", DEFAULT_WOKERS, int), + help="Number of worker processes (default: from env or 1)", + ) + + # LLM and embedding bindings + parser.add_argument( + "--llm-binding", + type=str, + default=get_env_value("LLM_BINDING", "ollama"), + choices=[ + "lollms", + "ollama", + "openai", + "openai-ollama", + "azure_openai", + "aws_bedrock", + "gemini", + ], + help="LLM binding type (default: from env or ollama)", + ) + parser.add_argument( + "--embedding-binding", + type=str, + default=get_env_value("EMBEDDING_BINDING", "ollama"), + choices=[ + "lollms", + "ollama", + "openai", + "azure_openai", + "aws_bedrock", + "jina", + "gemini", + ], + help="Embedding binding type (default: from env or ollama)", + ) + parser.add_argument( + "--rerank-binding", + type=str, + default=get_env_value("RERANK_BINDING", DEFAULT_RERANK_BINDING), + choices=["null", "cohere", "jina", "aliyun"], + help=f"Rerank binding type (default: from env or {DEFAULT_RERANK_BINDING})", + ) + + # Document loading engine configuration + parser.add_argument( + "--docling", + action="store_true", + default=False, + help="Enable DOCLING document loading engine (default: from env or DEFAULT)", + ) + + # Conditionally add binding options defined in binding_options module + # This will add command line arguments for all binding options (e.g., --ollama-embedding-num_ctx) + # and corresponding environment variables (e.g., OLLAMA_EMBEDDING_NUM_CTX) + if "--llm-binding" in sys.argv: + try: + idx = sys.argv.index("--llm-binding") + if idx + 1 < len(sys.argv) and sys.argv[idx + 1] == "ollama": + OllamaLLMOptions.add_args(parser) + except IndexError: + pass + elif os.environ.get("LLM_BINDING") == "ollama": + OllamaLLMOptions.add_args(parser) + + if "--embedding-binding" in sys.argv: + try: + idx = sys.argv.index("--embedding-binding") + if idx + 1 < len(sys.argv): + if sys.argv[idx + 1] == "ollama": + OllamaEmbeddingOptions.add_args(parser) + elif sys.argv[idx + 1] == "gemini": + GeminiEmbeddingOptions.add_args(parser) + except IndexError: + pass + else: + env_embedding_binding = os.environ.get("EMBEDDING_BINDING") + if env_embedding_binding == "ollama": + OllamaEmbeddingOptions.add_args(parser) + elif env_embedding_binding == "gemini": + GeminiEmbeddingOptions.add_args(parser) + + # Add OpenAI LLM options when llm-binding is openai or azure_openai + if "--llm-binding" in sys.argv: + try: + idx = sys.argv.index("--llm-binding") + if idx + 1 < len(sys.argv) and sys.argv[idx + 1] in [ + "openai", + "azure_openai", + ]: + OpenAILLMOptions.add_args(parser) + except IndexError: + pass + elif os.environ.get("LLM_BINDING") in ["openai", "azure_openai"]: + OpenAILLMOptions.add_args(parser) + + if "--llm-binding" in sys.argv: + try: + idx = sys.argv.index("--llm-binding") + if idx + 1 < len(sys.argv) and sys.argv[idx + 1] == "gemini": + GeminiLLMOptions.add_args(parser) + except IndexError: + pass + elif os.environ.get("LLM_BINDING") == "gemini": + GeminiLLMOptions.add_args(parser) + + args = parser.parse_args() + + # convert relative path to absolute path + args.working_dir = os.path.abspath(args.working_dir) + args.input_dir = os.path.abspath(args.input_dir) + + # Inject storage configuration from environment variables + args.kv_storage = get_env_value( + "LIGHTRAG_KV_STORAGE", DefaultRAGStorageConfig.KV_STORAGE + ) + args.doc_status_storage = get_env_value( + "LIGHTRAG_DOC_STATUS_STORAGE", DefaultRAGStorageConfig.DOC_STATUS_STORAGE + ) + args.graph_storage = get_env_value( + "LIGHTRAG_GRAPH_STORAGE", DefaultRAGStorageConfig.GRAPH_STORAGE + ) + args.vector_storage = get_env_value( + "LIGHTRAG_VECTOR_STORAGE", DefaultRAGStorageConfig.VECTOR_STORAGE + ) + + # Get MAX_PARALLEL_INSERT from environment + args.max_parallel_insert = get_env_value("MAX_PARALLEL_INSERT", 2, int) + + # Get MAX_GRAPH_NODES from environment + args.max_graph_nodes = get_env_value("MAX_GRAPH_NODES", 1000, int) + + # Handle openai-ollama special case + if args.llm_binding == "openai-ollama": + args.llm_binding = "openai" + args.embedding_binding = "ollama" + + # Ollama ctx_num + args.ollama_num_ctx = get_env_value("OLLAMA_NUM_CTX", 32768, int) + + args.llm_binding_host = get_env_value( + "LLM_BINDING_HOST", get_default_host(args.llm_binding) + ) + args.embedding_binding_host = get_env_value( + "EMBEDDING_BINDING_HOST", get_default_host(args.embedding_binding) + ) + args.llm_binding_api_key = get_env_value("LLM_BINDING_API_KEY", None) + args.embedding_binding_api_key = get_env_value("EMBEDDING_BINDING_API_KEY", "") + + # Inject model configuration + args.llm_model = get_env_value("LLM_MODEL", "mistral-nemo:latest") + args.embedding_model = get_env_value("EMBEDDING_MODEL", "bge-m3:latest") + args.embedding_dim = get_env_value("EMBEDDING_DIM", 1024, int) + args.embedding_send_dim = get_env_value("EMBEDDING_SEND_DIM", False, bool) + + # Inject chunk configuration + args.chunk_size = get_env_value("CHUNK_SIZE", 1200, int) + args.chunk_overlap_size = get_env_value("CHUNK_OVERLAP_SIZE", 100, int) + + # Inject LLM cache configuration + args.enable_llm_cache_for_extract = get_env_value( + "ENABLE_LLM_CACHE_FOR_EXTRACT", True, bool + ) + args.enable_llm_cache = get_env_value("ENABLE_LLM_CACHE", True, bool) + + # Set document_loading_engine from --docling flag + if args.docling: + args.document_loading_engine = "DOCLING" + else: + args.document_loading_engine = get_env_value( + "DOCUMENT_LOADING_ENGINE", "DEFAULT" + ) + + # PDF decryption password + args.pdf_decrypt_password = get_env_value("PDF_DECRYPT_PASSWORD", None) + + # Add environment variables that were previously read directly + args.cors_origins = get_env_value("CORS_ORIGINS", "*") + args.summary_language = get_env_value("SUMMARY_LANGUAGE", DEFAULT_SUMMARY_LANGUAGE) + args.entity_types = get_env_value("ENTITY_TYPES", DEFAULT_ENTITY_TYPES, list) + args.whitelist_paths = get_env_value("WHITELIST_PATHS", "/health,/api/*") + + # For JWT Auth + args.auth_accounts = get_env_value("AUTH_ACCOUNTS", "") + args.token_secret = get_env_value("TOKEN_SECRET", "lightrag-jwt-default-secret") + args.token_expire_hours = get_env_value("TOKEN_EXPIRE_HOURS", 48, int) + args.guest_token_expire_hours = get_env_value("GUEST_TOKEN_EXPIRE_HOURS", 24, int) + args.jwt_algorithm = get_env_value("JWT_ALGORITHM", "HS256") + + # Rerank model configuration + args.rerank_model = get_env_value("RERANK_MODEL", None) + args.rerank_binding_host = get_env_value("RERANK_BINDING_HOST", None) + args.rerank_binding_api_key = get_env_value("RERANK_BINDING_API_KEY", None) + # Note: rerank_binding is already set by argparse, no need to override from env + + # Min rerank score configuration + args.min_rerank_score = get_env_value( + "MIN_RERANK_SCORE", DEFAULT_MIN_RERANK_SCORE, float + ) + + # Query configuration + args.history_turns = get_env_value("HISTORY_TURNS", DEFAULT_HISTORY_TURNS, int) + args.top_k = get_env_value("TOP_K", DEFAULT_TOP_K, int) + args.chunk_top_k = get_env_value("CHUNK_TOP_K", DEFAULT_CHUNK_TOP_K, int) + args.max_entity_tokens = get_env_value( + "MAX_ENTITY_TOKENS", DEFAULT_MAX_ENTITY_TOKENS, int + ) + args.max_relation_tokens = get_env_value( + "MAX_RELATION_TOKENS", DEFAULT_MAX_RELATION_TOKENS, int + ) + args.max_total_tokens = get_env_value( + "MAX_TOTAL_TOKENS", DEFAULT_MAX_TOTAL_TOKENS, int + ) + args.cosine_threshold = get_env_value( + "COSINE_THRESHOLD", DEFAULT_COSINE_THRESHOLD, float + ) + args.related_chunk_number = get_env_value( + "RELATED_CHUNK_NUMBER", DEFAULT_RELATED_CHUNK_NUMBER, int + ) + + # Add missing environment variables for health endpoint + args.force_llm_summary_on_merge = get_env_value( + "FORCE_LLM_SUMMARY_ON_MERGE", DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, int + ) + args.embedding_func_max_async = get_env_value( + "EMBEDDING_FUNC_MAX_ASYNC", DEFAULT_EMBEDDING_FUNC_MAX_ASYNC, int + ) + args.embedding_batch_num = get_env_value( + "EMBEDDING_BATCH_NUM", DEFAULT_EMBEDDING_BATCH_NUM, int + ) + + # Embedding token limit configuration + args.embedding_token_limit = get_env_value( + "EMBEDDING_TOKEN_LIMIT", None, int, special_none=True + ) + + ollama_server_infos.LIGHTRAG_NAME = args.simulated_model_name + ollama_server_infos.LIGHTRAG_TAG = args.simulated_model_tag + + return args + + +def update_uvicorn_mode_config(): + # If in uvicorn mode and workers > 1, force it to 1 and log warning + if global_args.workers > 1: + original_workers = global_args.workers + global_args.workers = 1 + # Log warning directly here + logging.warning( + f">> Forcing workers=1 in uvicorn mode(Ignoring workers={original_workers})" + ) + + +# Global configuration with lazy initialization +_global_args = None +_initialized = False + + +def initialize_config(args=None, force=False): + """Initialize global configuration + + This function allows explicit initialization of the configuration, + which is useful for programmatic usage, testing, or embedding LightRAG + in other applications. + + Args: + args: Pre-parsed argparse.Namespace or None to parse from sys.argv + force: Force re-initialization even if already initialized + + Returns: + argparse.Namespace: The configured arguments + + Example: + # Use parsed command line arguments (default) + initialize_config() + + # Use custom configuration programmatically + custom_args = argparse.Namespace( + host='localhost', + port=8080, + working_dir='./custom_rag', + # ... other config + ) + initialize_config(custom_args) + """ + global _global_args, _initialized + + if _initialized and not force: + return _global_args + + _global_args = args if args is not None else parse_args() + _initialized = True + return _global_args + + +def get_config(): + """Get global configuration, auto-initializing if needed + + Returns: + argparse.Namespace: The configured arguments + """ + if not _initialized: + initialize_config() + return _global_args + + +class _GlobalArgsProxy: + """Proxy object that auto-initializes configuration on first access + + This maintains backward compatibility with existing code while + allowing programmatic control over initialization timing. + """ + + def __getattr__(self, name): + if not _initialized: + initialize_config() + return getattr(_global_args, name) + + def __setattr__(self, name, value): + if not _initialized: + initialize_config() + setattr(_global_args, name, value) + + def __repr__(self): + if not _initialized: + return "" + return repr(_global_args) + + +# Create proxy instance for backward compatibility +# Existing code like `from config import global_args` continues to work +# The proxy will auto-initialize on first attribute access +global_args = _GlobalArgsProxy() diff --git a/LightRAG/lightrag/api/gunicorn_config.py b/LightRAG/lightrag/api/gunicorn_config.py new file mode 100644 index 00000000..4d2292d0 --- /dev/null +++ b/LightRAG/lightrag/api/gunicorn_config.py @@ -0,0 +1,162 @@ +# gunicorn_config.py +import os +import logging +from lightrag.kg.shared_storage import finalize_share_data +from lightrag.utils import setup_logger, get_env_value +from lightrag.constants import ( + DEFAULT_LOG_MAX_BYTES, + DEFAULT_LOG_BACKUP_COUNT, + DEFAULT_LOG_FILENAME, +) + + +# Get log directory path from environment variable +log_dir = os.getenv("LOG_DIR", os.getcwd()) +log_file_path = os.path.abspath(os.path.join(log_dir, DEFAULT_LOG_FILENAME)) + +# Ensure log directory exists +os.makedirs(os.path.dirname(log_file_path), exist_ok=True) + +# Get log file max size and backup count from environment variables +log_max_bytes = get_env_value("LOG_MAX_BYTES", DEFAULT_LOG_MAX_BYTES, int) +log_backup_count = get_env_value("LOG_BACKUP_COUNT", DEFAULT_LOG_BACKUP_COUNT, int) + +# These variables will be set by run_with_gunicorn.py +workers = None +bind = None +loglevel = None +certfile = None +keyfile = None + +# Enable preload_app option +preload_app = True + +# Use Uvicorn worker +worker_class = "uvicorn.workers.UvicornWorker" + +# Other Gunicorn configurations + +# Logging configuration +errorlog = os.getenv("ERROR_LOG", log_file_path) # Default write to lightrag.log +accesslog = os.getenv("ACCESS_LOG", log_file_path) # Default write to lightrag.log + +logconfig_dict = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "standard": {"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"}, + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "standard", + "stream": "ext://sys.stdout", + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "standard", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf8", + }, + }, + "filters": { + "path_filter": { + "()": "lightrag.utils.LightragPathFilter", + }, + }, + "loggers": { + "lightrag": { + "handlers": ["console", "file"], + "level": loglevel.upper() if loglevel else "INFO", + "propagate": False, + }, + "gunicorn": { + "handlers": ["console", "file"], + "level": loglevel.upper() if loglevel else "INFO", + "propagate": False, + }, + "gunicorn.error": { + "handlers": ["console", "file"], + "level": loglevel.upper() if loglevel else "INFO", + "propagate": False, + }, + "gunicorn.access": { + "handlers": ["console", "file"], + "level": loglevel.upper() if loglevel else "INFO", + "propagate": False, + "filters": ["path_filter"], + }, + }, +} + + +def on_starting(server): + """ + Executed when Gunicorn starts, before forking the first worker processes + You can use this function to do more initialization tasks for all processes + """ + print("=" * 80) + print(f"GUNICORN MASTER PROCESS: on_starting jobs for {workers} worker(s)") + print(f"Process ID: {os.getpid()}") + print("=" * 80) + + # Memory usage monitoring + try: + import psutil + + process = psutil.Process(os.getpid()) + memory_info = process.memory_info() + msg = ( + f"Memory usage after initialization: {memory_info.rss / 1024 / 1024:.2f} MB" + ) + print(msg) + except ImportError: + print("psutil not installed, skipping memory usage reporting") + + # Log the location of the LightRAG log file + print(f"LightRAG log file: {log_file_path}\n") + + print("Gunicorn initialization complete, forking workers...\n") + + +def on_exit(server): + """ + Executed when Gunicorn is shutting down. + This is a good place to release shared resources. + """ + print("=" * 80) + print("GUNICORN MASTER PROCESS: Shutting down") + print(f"Process ID: {os.getpid()}") + + print("Finalizing shared storage...") + finalize_share_data() + + print("Gunicorn shutdown complete") + print("=" * 80) + + +def post_fork(server, worker): + """ + Executed after a worker has been forked. + This is a good place to set up worker-specific configurations. + """ + # Set up main loggers + log_level = loglevel.upper() if loglevel else "INFO" + setup_logger("uvicorn", log_level, add_filter=False, log_file_path=log_file_path) + setup_logger( + "uvicorn.access", log_level, add_filter=True, log_file_path=log_file_path + ) + setup_logger("lightrag", log_level, add_filter=True, log_file_path=log_file_path) + + # Set up lightrag submodule loggers + for name in logging.root.manager.loggerDict: + if name.startswith("lightrag."): + setup_logger(name, log_level, add_filter=True, log_file_path=log_file_path) + + # Disable uvicorn.error logger + uvicorn_error_logger = logging.getLogger("uvicorn.error") + uvicorn_error_logger.handlers = [] + uvicorn_error_logger.setLevel(logging.CRITICAL) + uvicorn_error_logger.propagate = False diff --git a/LightRAG/lightrag/api/lightrag_server.py b/LightRAG/lightrag/api/lightrag_server.py new file mode 100644 index 00000000..41a07f7f --- /dev/null +++ b/LightRAG/lightrag/api/lightrag_server.py @@ -0,0 +1,1398 @@ +""" +LightRAG FastAPI Server +""" + +from fastapi import FastAPI, Depends, HTTPException, Request +from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse +from fastapi.openapi.docs import ( + get_swagger_ui_html, + get_swagger_ui_oauth2_redirect_html, +) +import os +import logging +import logging.config +import sys +import uvicorn +import pipmaster as pm +from fastapi.staticfiles import StaticFiles +from fastapi.responses import RedirectResponse +from pathlib import Path +import configparser +from ascii_colors import ASCIIColors +from fastapi.middleware.cors import CORSMiddleware +from contextlib import asynccontextmanager +from dotenv import load_dotenv +from lightrag.api.utils_api import ( + get_combined_auth_dependency, + display_splash_screen, + check_env_file, +) +from .config import ( + global_args, + update_uvicorn_mode_config, + get_default_host, +) +from lightrag.utils import get_env_value +from lightrag import LightRAG, __version__ as core_version +from lightrag.api import __api_version__ +from lightrag.types import GPTKeywordExtractionFormat +from lightrag.utils import EmbeddingFunc +from lightrag.constants import ( + DEFAULT_LOG_MAX_BYTES, + DEFAULT_LOG_BACKUP_COUNT, + DEFAULT_LOG_FILENAME, + DEFAULT_LLM_TIMEOUT, + DEFAULT_EMBEDDING_TIMEOUT, +) +from lightrag.api.routers.document_routes import ( + DocumentManager, + create_document_routes, +) +from lightrag.api.routers.query_routes import create_query_routes +from lightrag.api.routers.graph_routes import create_graph_routes +from lightrag.api.routers.ollama_api import OllamaAPI + +from lightrag.utils import logger, set_verbose_debug +from lightrag.kg.shared_storage import ( + get_namespace_data, + initialize_pipeline_status, + cleanup_keyed_lock, + finalize_share_data, +) +from fastapi.security import OAuth2PasswordRequestForm +from lightrag.api.auth import auth_handler + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +webui_title = os.getenv("WEBUI_TITLE") +webui_description = os.getenv("WEBUI_DESCRIPTION") + +# Initialize config parser +config = configparser.ConfigParser() +config.read("config.ini") + +# Global authentication configuration +auth_configured = bool(auth_handler.accounts) + + +class LLMConfigCache: + """Smart LLM and Embedding configuration cache class""" + + def __init__(self, args): + self.args = args + + # Initialize configurations based on binding conditions + self.openai_llm_options = None + self.gemini_llm_options = None + self.gemini_embedding_options = None + self.ollama_llm_options = None + self.ollama_embedding_options = None + + # Only initialize and log OpenAI options when using OpenAI-related bindings + if args.llm_binding in ["openai", "azure_openai"]: + from lightrag.llm.binding_options import OpenAILLMOptions + + self.openai_llm_options = OpenAILLMOptions.options_dict(args) + logger.info(f"OpenAI LLM Options: {self.openai_llm_options}") + + if args.llm_binding == "gemini": + from lightrag.llm.binding_options import GeminiLLMOptions + + self.gemini_llm_options = GeminiLLMOptions.options_dict(args) + logger.info(f"Gemini LLM Options: {self.gemini_llm_options}") + + # Only initialize and log Ollama LLM options when using Ollama LLM binding + if args.llm_binding == "ollama": + try: + from lightrag.llm.binding_options import OllamaLLMOptions + + self.ollama_llm_options = OllamaLLMOptions.options_dict(args) + logger.info(f"Ollama LLM Options: {self.ollama_llm_options}") + except ImportError: + logger.warning( + "OllamaLLMOptions not available, using default configuration" + ) + self.ollama_llm_options = {} + + # Only initialize and log Ollama Embedding options when using Ollama Embedding binding + if args.embedding_binding == "ollama": + try: + from lightrag.llm.binding_options import OllamaEmbeddingOptions + + self.ollama_embedding_options = OllamaEmbeddingOptions.options_dict( + args + ) + logger.info( + f"Ollama Embedding Options: {self.ollama_embedding_options}" + ) + except ImportError: + logger.warning( + "OllamaEmbeddingOptions not available, using default configuration" + ) + self.ollama_embedding_options = {} + + # Only initialize and log Gemini Embedding options when using Gemini Embedding binding + if args.embedding_binding == "gemini": + try: + from lightrag.llm.binding_options import GeminiEmbeddingOptions + + self.gemini_embedding_options = GeminiEmbeddingOptions.options_dict( + args + ) + logger.info( + f"Gemini Embedding Options: {self.gemini_embedding_options}" + ) + except ImportError: + logger.warning( + "GeminiEmbeddingOptions not available, using default configuration" + ) + self.gemini_embedding_options = {} + + +def check_frontend_build(): + """Check if frontend is built and optionally check if source is up-to-date + + Returns: + bool: True if frontend is outdated, False if up-to-date or production environment + """ + webui_dir = Path(__file__).parent / "webui" + index_html = webui_dir / "index.html" + + # 1. Check if build files exist (required) + if not index_html.exists(): + ASCIIColors.red("\n" + "=" * 80) + ASCIIColors.red("ERROR: Frontend Not Built") + ASCIIColors.red("=" * 80) + ASCIIColors.yellow("The WebUI frontend has not been built yet.") + ASCIIColors.yellow( + "Please build the frontend code first using the following commands:\n" + ) + ASCIIColors.cyan(" cd lightrag_webui") + ASCIIColors.cyan(" bun install --frozen-lockfile") + ASCIIColors.cyan(" bun run build") + ASCIIColors.cyan(" cd ..") + ASCIIColors.yellow("\nThen restart the service.\n") + ASCIIColors.cyan( + "Note: Make sure you have Bun installed. Visit https://bun.sh for installation." + ) + ASCIIColors.red("=" * 80 + "\n") + sys.exit(1) # Exit immediately + + # 2. Check if this is a development environment (source directory exists) + try: + source_dir = Path(__file__).parent.parent.parent / "lightrag_webui" + src_dir = source_dir / "src" + + # Determine if this is a development environment: source directory exists and contains src directory + if not source_dir.exists() or not src_dir.exists(): + # Production environment, skip source code check + logger.debug( + "Production environment detected, skipping source freshness check" + ) + return False + + # Development environment, perform source code timestamp check + logger.debug("Development environment detected, checking source freshness") + + # Source code file extensions (files to check) + source_extensions = { + ".ts", + ".tsx", + ".js", + ".jsx", + ".mjs", + ".cjs", # TypeScript/JavaScript + ".css", + ".scss", + ".sass", + ".less", # Style files + ".json", + ".jsonc", # Configuration/data files + ".html", + ".htm", # Template files + ".md", + ".mdx", # Markdown + } + + # Key configuration files (in lightrag_webui root directory) + key_files = [ + source_dir / "package.json", + source_dir / "bun.lock", + source_dir / "vite.config.ts", + source_dir / "tsconfig.json", + source_dir / "tailraid.config.js", + source_dir / "index.html", + ] + + # Get the latest modification time of source code + latest_source_time = 0 + + # Check source code files in src directory + for file_path in src_dir.rglob("*"): + if file_path.is_file(): + # Only check source code files, ignore temporary files and logs + if file_path.suffix.lower() in source_extensions: + mtime = file_path.stat().st_mtime + latest_source_time = max(latest_source_time, mtime) + + # Check key configuration files + for key_file in key_files: + if key_file.exists(): + mtime = key_file.stat().st_mtime + latest_source_time = max(latest_source_time, mtime) + + # Get build time + build_time = index_html.stat().st_mtime + + # Compare timestamps (5 second tolerance to avoid file system time precision issues) + if latest_source_time > build_time + 5: + ASCIIColors.yellow("\n" + "=" * 80) + ASCIIColors.yellow("WARNING: Frontend Source Code Has Been Updated") + ASCIIColors.yellow("=" * 80) + ASCIIColors.yellow( + "The frontend source code is newer than the current build." + ) + ASCIIColors.yellow( + "This might happen after 'git pull' or manual code changes.\n" + ) + ASCIIColors.cyan( + "Recommended: Rebuild the frontend to use the latest changes:" + ) + ASCIIColors.cyan(" cd lightrag_webui") + ASCIIColors.cyan(" bun install --frozen-lockfile") + ASCIIColors.cyan(" bun run build") + ASCIIColors.cyan(" cd ..") + ASCIIColors.yellow("\nThe server will continue with the current build.") + ASCIIColors.yellow("=" * 80 + "\n") + return True # Frontend is outdated + else: + logger.info("Frontend build is up-to-date") + return False # Frontend is up-to-date + + except Exception as e: + # If check fails, log warning but don't affect startup + logger.warning(f"Failed to check frontend source freshness: {e}") + return False # Assume up-to-date on error + + +def create_app(args): + # Check frontend build first and get outdated status + is_frontend_outdated = check_frontend_build() + + # Create unified API version display with warning symbol if frontend is outdated + api_version_display = ( + f"{__api_version__}⚠️" if is_frontend_outdated else __api_version__ + ) + + # Setup logging + logger.setLevel(args.log_level) + set_verbose_debug(args.verbose) + + # Create configuration cache (this will output configuration logs) + config_cache = LLMConfigCache(args) + + # Verify that bindings are correctly setup + if args.llm_binding not in [ + "lollms", + "ollama", + "openai", + "azure_openai", + "aws_bedrock", + "gemini", + ]: + raise Exception("llm binding not supported") + + if args.embedding_binding not in [ + "lollms", + "ollama", + "openai", + "azure_openai", + "aws_bedrock", + "jina", + "gemini", + ]: + raise Exception("embedding binding not supported") + + # Set default hosts if not provided + if args.llm_binding_host is None: + args.llm_binding_host = get_default_host(args.llm_binding) + + if args.embedding_binding_host is None: + args.embedding_binding_host = get_default_host(args.embedding_binding) + + # Add SSL validation + if args.ssl: + if not args.ssl_certfile or not args.ssl_keyfile: + raise Exception( + "SSL certificate and key files must be provided when SSL is enabled" + ) + if not os.path.exists(args.ssl_certfile): + raise Exception(f"SSL certificate file not found: {args.ssl_certfile}") + if not os.path.exists(args.ssl_keyfile): + raise Exception(f"SSL key file not found: {args.ssl_keyfile}") + + # Check if API key is provided either through env var or args + api_key = os.getenv("LIGHTRAG_API_KEY") or args.key + + # Initialize document manager with workspace support for data isolation + doc_manager = DocumentManager(args.input_dir, workspace=args.workspace) + + @asynccontextmanager + async def lifespan(app: FastAPI): + """Lifespan context manager for startup and shutdown events""" + # Store background tasks + app.state.background_tasks = set() + + try: + # Initialize database connections + await rag.initialize_storages() + await initialize_pipeline_status() + + # Data migration regardless of storage implementation + await rag.check_and_migrate_data() + + ASCIIColors.green("\nServer is ready to accept connections! 🚀\n") + + yield + + finally: + # Clean up database connections + await rag.finalize_storages() + + if "LIGHTRAG_GUNICORN_MODE" not in os.environ: + # Only perform cleanup in Uvicorn single-process mode + logger.debug("Unvicorn Mode: finalizing shared storage...") + finalize_share_data() + else: + # In Gunicorn mode with preload_app=True, cleanup is handled by on_exit hooks + logger.debug( + "Gunicorn Mode: postpone shared storage finalization to master process" + ) + + # Initialize FastAPI + base_description = ( + "Providing API for LightRAG core, Web UI and Ollama Model Emulation" + ) + swagger_description = ( + base_description + + (" (API-Key Enabled)" if api_key else "") + + "\n\n[View ReDoc documentation](/redoc)" + ) + app_kwargs = { + "title": "LightRAG Server API", + "description": swagger_description, + "version": __api_version__, + "openapi_url": "/openapi.json", # Explicitly set OpenAPI schema URL + "docs_url": None, # Disable default docs, we'll create custom endpoint + "redoc_url": "/redoc", # Explicitly set redoc URL + "lifespan": lifespan, + } + + # Configure Swagger UI parameters + # Enable persistAuthorization and tryItOutEnabled for better user experience + app_kwargs["swagger_ui_parameters"] = { + "persistAuthorization": True, + "tryItOutEnabled": True, + } + + app = FastAPI(**app_kwargs) + + # Add custom validation error handler for /query/data endpoint + @app.exception_handler(RequestValidationError) + async def validation_exception_handler( + request: Request, exc: RequestValidationError + ): + # Check if this is a request to /query/data endpoint + if request.url.path.endswith("/query/data"): + # Extract error details + error_details = [] + for error in exc.errors(): + field_path = " -> ".join(str(loc) for loc in error["loc"]) + error_details.append(f"{field_path}: {error['msg']}") + + error_message = "; ".join(error_details) + + # Return in the expected format for /query/data + return JSONResponse( + status_code=400, + content={ + "status": "failure", + "message": f"Validation error: {error_message}", + "data": {}, + "metadata": {}, + }, + ) + else: + # For other endpoints, return the default FastAPI validation error + return JSONResponse(status_code=422, content={"detail": exc.errors()}) + + def get_cors_origins(): + """Get allowed origins from global_args + Returns a list of allowed origins, defaults to ["*"] if not set + """ + origins_str = global_args.cors_origins + if origins_str == "*": + return ["*"] + return [origin.strip() for origin in origins_str.split(",")] + + # Add CORS middleware + app.add_middleware( + CORSMiddleware, + allow_origins=get_cors_origins(), + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + + # Create combined auth dependency for all endpoints + combined_auth = get_combined_auth_dependency(api_key) + + # Create working directory if it doesn't exist + Path(args.working_dir).mkdir(parents=True, exist_ok=True) + + def create_optimized_openai_llm_func( + config_cache: LLMConfigCache, args, llm_timeout: int + ): + """Create optimized OpenAI LLM function with pre-processed configuration""" + + async def optimized_openai_alike_model_complete( + prompt, + system_prompt=None, + history_messages=None, + keyword_extraction=False, + **kwargs, + ) -> str: + from lightrag.llm.openai import openai_complete_if_cache + + keyword_extraction = kwargs.pop("keyword_extraction", None) + if keyword_extraction: + kwargs["response_format"] = GPTKeywordExtractionFormat + if history_messages is None: + history_messages = [] + + # Use pre-processed configuration to avoid repeated parsing + kwargs["timeout"] = llm_timeout + if config_cache.openai_llm_options: + kwargs.update(config_cache.openai_llm_options) + + return await openai_complete_if_cache( + args.llm_model, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + base_url=args.llm_binding_host, + api_key=args.llm_binding_api_key, + **kwargs, + ) + + return optimized_openai_alike_model_complete + + def create_optimized_azure_openai_llm_func( + config_cache: LLMConfigCache, args, llm_timeout: int + ): + """Create optimized Azure OpenAI LLM function with pre-processed configuration""" + + async def optimized_azure_openai_model_complete( + prompt, + system_prompt=None, + history_messages=None, + keyword_extraction=False, + **kwargs, + ) -> str: + from lightrag.llm.azure_openai import azure_openai_complete_if_cache + + keyword_extraction = kwargs.pop("keyword_extraction", None) + if keyword_extraction: + kwargs["response_format"] = GPTKeywordExtractionFormat + if history_messages is None: + history_messages = [] + + # Use pre-processed configuration to avoid repeated parsing + kwargs["timeout"] = llm_timeout + if config_cache.openai_llm_options: + kwargs.update(config_cache.openai_llm_options) + + return await azure_openai_complete_if_cache( + args.llm_model, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + base_url=args.llm_binding_host, + api_key=os.getenv("AZURE_OPENAI_API_KEY", args.llm_binding_api_key), + api_version=os.getenv("AZURE_OPENAI_API_VERSION", "2024-08-01-preview"), + **kwargs, + ) + + return optimized_azure_openai_model_complete + + def create_optimized_gemini_llm_func( + config_cache: LLMConfigCache, args, llm_timeout: int + ): + """Create optimized Gemini LLM function with cached configuration""" + + async def optimized_gemini_model_complete( + prompt, + system_prompt=None, + history_messages=None, + keyword_extraction=False, + **kwargs, + ) -> str: + from lightrag.llm.gemini import gemini_complete_if_cache + + if history_messages is None: + history_messages = [] + + # Use pre-processed configuration to avoid repeated parsing + kwargs["timeout"] = llm_timeout + if ( + config_cache.gemini_llm_options is not None + and "generation_config" not in kwargs + ): + kwargs["generation_config"] = dict(config_cache.gemini_llm_options) + + return await gemini_complete_if_cache( + args.llm_model, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + api_key=args.llm_binding_api_key, + base_url=args.llm_binding_host, + keyword_extraction=keyword_extraction, + **kwargs, + ) + + return optimized_gemini_model_complete + + def create_llm_model_func(binding: str): + """ + Create LLM model function based on binding type. + Uses optimized functions for OpenAI bindings and lazy import for others. + """ + try: + if binding == "lollms": + from lightrag.llm.lollms import lollms_model_complete + + return lollms_model_complete + elif binding == "ollama": + from lightrag.llm.ollama import ollama_model_complete + + return ollama_model_complete + elif binding == "aws_bedrock": + return bedrock_model_complete # Already defined locally + elif binding == "azure_openai": + # Use optimized function with pre-processed configuration + return create_optimized_azure_openai_llm_func( + config_cache, args, llm_timeout + ) + elif binding == "gemini": + return create_optimized_gemini_llm_func(config_cache, args, llm_timeout) + else: # openai and compatible + # Use optimized function with pre-processed configuration + return create_optimized_openai_llm_func(config_cache, args, llm_timeout) + except ImportError as e: + raise Exception(f"Failed to import {binding} LLM binding: {e}") + + def create_llm_model_kwargs(binding: str, args, llm_timeout: int) -> dict: + """ + Create LLM model kwargs based on binding type. + Uses lazy import for binding-specific options. + """ + if binding in ["lollms", "ollama"]: + try: + from lightrag.llm.binding_options import OllamaLLMOptions + + return { + "host": args.llm_binding_host, + "timeout": llm_timeout, + "options": OllamaLLMOptions.options_dict(args), + "api_key": args.llm_binding_api_key, + } + except ImportError as e: + raise Exception(f"Failed to import {binding} options: {e}") + return {} + + def create_optimized_embedding_function( + config_cache: LLMConfigCache, binding, model, host, api_key, args + ) -> EmbeddingFunc: + """ + Create optimized embedding function and return an EmbeddingFunc instance + with proper max_token_size inheritance from provider defaults. + + This function: + 1. Imports the provider embedding function + 2. Extracts max_token_size and embedding_dim from provider if it's an EmbeddingFunc + 3. Creates an optimized wrapper that calls the underlying function directly (avoiding double-wrapping) + 4. Returns a properly configured EmbeddingFunc instance + """ + + # Step 1: Import provider function and extract default attributes + provider_func = None + provider_max_token_size = None + provider_embedding_dim = None + + try: + if binding == "openai": + from lightrag.llm.openai import openai_embed + + provider_func = openai_embed + elif binding == "ollama": + from lightrag.llm.ollama import ollama_embed + + provider_func = ollama_embed + elif binding == "gemini": + from lightrag.llm.gemini import gemini_embed + + provider_func = gemini_embed + elif binding == "jina": + from lightrag.llm.jina import jina_embed + + provider_func = jina_embed + elif binding == "azure_openai": + from lightrag.llm.azure_openai import azure_openai_embed + + provider_func = azure_openai_embed + elif binding == "aws_bedrock": + from lightrag.llm.bedrock import bedrock_embed + + provider_func = bedrock_embed + elif binding == "lollms": + from lightrag.llm.lollms import lollms_embed + + provider_func = lollms_embed + + # Extract attributes if provider is an EmbeddingFunc + if provider_func and isinstance(provider_func, EmbeddingFunc): + provider_max_token_size = provider_func.max_token_size + provider_embedding_dim = provider_func.embedding_dim + logger.debug( + f"Extracted from {binding} provider: " + f"max_token_size={provider_max_token_size}, " + f"embedding_dim={provider_embedding_dim}" + ) + except ImportError as e: + logger.warning(f"Could not import provider function for {binding}: {e}") + + # Step 2: Apply priority (user config > provider default) + # For max_token_size: explicit env var > provider default > None + final_max_token_size = args.embedding_token_limit or provider_max_token_size + # For embedding_dim: user config (always has value) takes priority + # Only use provider default if user config is explicitly None (which shouldn't happen) + final_embedding_dim = ( + args.embedding_dim if args.embedding_dim else provider_embedding_dim + ) + + # Step 3: Create optimized embedding function (calls underlying function directly) + async def optimized_embedding_function(texts, embedding_dim=None): + try: + if binding == "lollms": + from lightrag.llm.lollms import lollms_embed + + # Get real function, skip EmbeddingFunc wrapper if present + actual_func = ( + lollms_embed.func + if isinstance(lollms_embed, EmbeddingFunc) + else lollms_embed + ) + return await actual_func( + texts, embed_model=model, host=host, api_key=api_key + ) + elif binding == "ollama": + from lightrag.llm.ollama import ollama_embed + + # Get real function, skip EmbeddingFunc wrapper if present + actual_func = ( + ollama_embed.func + if isinstance(ollama_embed, EmbeddingFunc) + else ollama_embed + ) + + # Use pre-processed configuration if available + if config_cache.ollama_embedding_options is not None: + ollama_options = config_cache.ollama_embedding_options + else: + from lightrag.llm.binding_options import OllamaEmbeddingOptions + + ollama_options = OllamaEmbeddingOptions.options_dict(args) + + return await actual_func( + texts, + embed_model=model, + host=host, + api_key=api_key, + options=ollama_options, + ) + elif binding == "azure_openai": + from lightrag.llm.azure_openai import azure_openai_embed + + actual_func = ( + azure_openai_embed.func + if isinstance(azure_openai_embed, EmbeddingFunc) + else azure_openai_embed + ) + return await actual_func(texts, model=model, api_key=api_key) + elif binding == "aws_bedrock": + from lightrag.llm.bedrock import bedrock_embed + + actual_func = ( + bedrock_embed.func + if isinstance(bedrock_embed, EmbeddingFunc) + else bedrock_embed + ) + return await actual_func(texts, model=model) + elif binding == "jina": + from lightrag.llm.jina import jina_embed + + actual_func = ( + jina_embed.func + if isinstance(jina_embed, EmbeddingFunc) + else jina_embed + ) + return await actual_func( + texts, + embedding_dim=embedding_dim, + base_url=host, + api_key=api_key, + ) + elif binding == "gemini": + from lightrag.llm.gemini import gemini_embed + + actual_func = ( + gemini_embed.func + if isinstance(gemini_embed, EmbeddingFunc) + else gemini_embed + ) + + # Use pre-processed configuration if available + if config_cache.gemini_embedding_options is not None: + gemini_options = config_cache.gemini_embedding_options + else: + from lightrag.llm.binding_options import GeminiEmbeddingOptions + + gemini_options = GeminiEmbeddingOptions.options_dict(args) + + return await actual_func( + texts, + model=model, + base_url=host, + api_key=api_key, + embedding_dim=embedding_dim, + task_type=gemini_options.get("task_type", "RETRIEVAL_DOCUMENT"), + ) + else: # openai and compatible + from lightrag.llm.openai import openai_embed + + actual_func = ( + openai_embed.func + if isinstance(openai_embed, EmbeddingFunc) + else openai_embed + ) + return await actual_func( + texts, + model=model, + base_url=host, + api_key=api_key, + embedding_dim=embedding_dim, + ) + except ImportError as e: + raise Exception(f"Failed to import {binding} embedding: {e}") + + # Step 4: Wrap in EmbeddingFunc and return + embedding_func_instance = EmbeddingFunc( + embedding_dim=final_embedding_dim, + func=optimized_embedding_function, + max_token_size=final_max_token_size, + send_dimensions=False, # Will be set later based on binding requirements + ) + + # Log final embedding configuration + logger.info( + f"Embedding config: binding={binding} model={model} " + f"embedding_dim={final_embedding_dim} max_token_size={final_max_token_size}" + ) + + return embedding_func_instance + + llm_timeout = get_env_value("LLM_TIMEOUT", DEFAULT_LLM_TIMEOUT, int) + embedding_timeout = get_env_value( + "EMBEDDING_TIMEOUT", DEFAULT_EMBEDDING_TIMEOUT, int + ) + + async def bedrock_model_complete( + prompt, + system_prompt=None, + history_messages=None, + keyword_extraction=False, + **kwargs, + ) -> str: + # Lazy import + from lightrag.llm.bedrock import bedrock_complete_if_cache + + keyword_extraction = kwargs.pop("keyword_extraction", None) + if keyword_extraction: + kwargs["response_format"] = GPTKeywordExtractionFormat + if history_messages is None: + history_messages = [] + + # Use global temperature for Bedrock + kwargs["temperature"] = get_env_value("BEDROCK_LLM_TEMPERATURE", 1.0, float) + + return await bedrock_complete_if_cache( + args.llm_model, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + **kwargs, + ) + + # Create embedding function with optimized configuration and max_token_size inheritance + import inspect + + # Create the EmbeddingFunc instance (now returns complete EmbeddingFunc with max_token_size) + embedding_func = create_optimized_embedding_function( + config_cache=config_cache, + binding=args.embedding_binding, + model=args.embedding_model, + host=args.embedding_binding_host, + api_key=args.embedding_binding_api_key, + args=args, + ) + + # Get embedding_send_dim from centralized configuration + embedding_send_dim = args.embedding_send_dim + + # Check if the underlying function signature has embedding_dim parameter + sig = inspect.signature(embedding_func.func) + has_embedding_dim_param = "embedding_dim" in sig.parameters + + # Determine send_dimensions value based on binding type + # Jina and Gemini REQUIRE dimension parameter (forced to True) + # OpenAI and others: controlled by EMBEDDING_SEND_DIM environment variable + if args.embedding_binding in ["jina", "gemini"]: + # Jina and Gemini APIs require dimension parameter - always send it + send_dimensions = has_embedding_dim_param + dimension_control = f"forced by {args.embedding_binding.title()} API" + else: + # For OpenAI and other bindings, respect EMBEDDING_SEND_DIM setting + send_dimensions = embedding_send_dim and has_embedding_dim_param + if send_dimensions or not embedding_send_dim: + dimension_control = "by env var" + else: + dimension_control = "by not hasparam" + + # Set send_dimensions on the EmbeddingFunc instance + embedding_func.send_dimensions = send_dimensions + + logger.info( + f"Send embedding dimension: {send_dimensions} {dimension_control} " + f"(dimensions={embedding_func.embedding_dim}, has_param={has_embedding_dim_param}, " + f"binding={args.embedding_binding})" + ) + + # Log max_token_size source + if embedding_func.max_token_size: + source = ( + "env variable" + if args.embedding_token_limit + else f"{args.embedding_binding} provider default" + ) + logger.info( + f"Embedding max_token_size: {embedding_func.max_token_size} (from {source})" + ) + else: + logger.info("Embedding max_token_size: not set (90% token warning disabled)") + + # Configure rerank function based on args.rerank_bindingparameter + rerank_model_func = None + if args.rerank_binding != "null": + from lightrag.rerank import cohere_rerank, jina_rerank, ali_rerank + + # Map rerank binding to corresponding function + rerank_functions = { + "cohere": cohere_rerank, + "jina": jina_rerank, + "aliyun": ali_rerank, + } + + # Select the appropriate rerank function based on binding + selected_rerank_func = rerank_functions.get(args.rerank_binding) + if not selected_rerank_func: + logger.error(f"Unsupported rerank binding: {args.rerank_binding}") + raise ValueError(f"Unsupported rerank binding: {args.rerank_binding}") + + # Get default values from selected_rerank_func if args values are None + if args.rerank_model is None or args.rerank_binding_host is None: + sig = inspect.signature(selected_rerank_func) + + # Set default model if args.rerank_model is None + if args.rerank_model is None and "model" in sig.parameters: + default_model = sig.parameters["model"].default + if default_model != inspect.Parameter.empty: + args.rerank_model = default_model + + # Set default base_url if args.rerank_binding_host is None + if args.rerank_binding_host is None and "base_url" in sig.parameters: + default_base_url = sig.parameters["base_url"].default + if default_base_url != inspect.Parameter.empty: + args.rerank_binding_host = default_base_url + + async def server_rerank_func( + query: str, documents: list, top_n: int = None, extra_body: dict = None + ): + """Server rerank function with configuration from environment variables""" + return await selected_rerank_func( + query=query, + documents=documents, + top_n=top_n, + api_key=args.rerank_binding_api_key, + model=args.rerank_model, + base_url=args.rerank_binding_host, + extra_body=extra_body, + ) + + rerank_model_func = server_rerank_func + logger.info( + f"Reranking is enabled: {args.rerank_model or 'default model'} using {args.rerank_binding} provider" + ) + else: + logger.info("Reranking is disabled") + + # Create ollama_server_infos from command line arguments + from lightrag.api.config import OllamaServerInfos + + ollama_server_infos = OllamaServerInfos( + name=args.simulated_model_name, tag=args.simulated_model_tag + ) + + # Initialize RAG with unified configuration + try: + rag = LightRAG( + working_dir=args.working_dir, + workspace=args.workspace, + llm_model_func=create_llm_model_func(args.llm_binding), + llm_model_name=args.llm_model, + llm_model_max_async=args.max_async, + summary_max_tokens=args.summary_max_tokens, + summary_context_size=args.summary_context_size, + chunk_token_size=int(args.chunk_size), + chunk_overlap_token_size=int(args.chunk_overlap_size), + llm_model_kwargs=create_llm_model_kwargs( + args.llm_binding, args, llm_timeout + ), + embedding_func=embedding_func, + default_llm_timeout=llm_timeout, + default_embedding_timeout=embedding_timeout, + kv_storage=args.kv_storage, + graph_storage=args.graph_storage, + vector_storage=args.vector_storage, + doc_status_storage=args.doc_status_storage, + vector_db_storage_cls_kwargs={ + "cosine_better_than_threshold": args.cosine_threshold + }, + enable_llm_cache_for_entity_extract=args.enable_llm_cache_for_extract, + enable_llm_cache=args.enable_llm_cache, + rerank_model_func=rerank_model_func, + max_parallel_insert=args.max_parallel_insert, + max_graph_nodes=args.max_graph_nodes, + addon_params={ + "language": args.summary_language, + "entity_types": args.entity_types, + }, + ollama_server_infos=ollama_server_infos, + ) + except Exception as e: + logger.error(f"Failed to initialize LightRAG: {e}") + raise + + # Add routes + app.include_router( + create_document_routes( + rag, + doc_manager, + api_key, + ) + ) + app.include_router(create_query_routes(rag, api_key, args.top_k)) + app.include_router(create_graph_routes(rag, api_key)) + + # Add Ollama API routes + ollama_api = OllamaAPI(rag, top_k=args.top_k, api_key=api_key) + app.include_router(ollama_api.router, prefix="/api") + + # Custom Swagger UI endpoint for offline support + @app.get("/docs", include_in_schema=False) + async def custom_swagger_ui_html(): + """Custom Swagger UI HTML with local static files""" + return get_swagger_ui_html( + openapi_url=app.openapi_url, + title=app.title + " - Swagger UI", + oauth2_redirect_url="/docs/oauth2-redirect", + swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js", + swagger_css_url="/static/swagger-ui/swagger-ui.css", + swagger_favicon_url="/static/swagger-ui/favicon-32x32.png", + swagger_ui_parameters=app.swagger_ui_parameters, + ) + + @app.get("/docs/oauth2-redirect", include_in_schema=False) + async def swagger_ui_redirect(): + """OAuth2 redirect for Swagger UI""" + return get_swagger_ui_oauth2_redirect_html() + + @app.get("/") + async def redirect_to_webui(): + """Redirect root path to /webui""" + return RedirectResponse(url="/webui") + + @app.get("/auth-status") + async def get_auth_status(): + """Get authentication status and guest token if auth is not configured""" + + if not auth_handler.accounts: + # Authentication not configured, return guest token + guest_token = auth_handler.create_token( + username="guest", role="guest", metadata={"auth_mode": "disabled"} + ) + return { + "auth_configured": False, + "access_token": guest_token, + "token_type": "bearer", + "auth_mode": "disabled", + "message": "Authentication is disabled. Using guest access.", + "core_version": core_version, + "api_version": api_version_display, + "webui_title": webui_title, + "webui_description": webui_description, + } + + return { + "auth_configured": True, + "auth_mode": "enabled", + "core_version": core_version, + "api_version": api_version_display, + "webui_title": webui_title, + "webui_description": webui_description, + } + + @app.post("/login") + async def login(form_data: OAuth2PasswordRequestForm = Depends()): + if not auth_handler.accounts: + # Authentication not configured, return guest token + guest_token = auth_handler.create_token( + username="guest", role="guest", metadata={"auth_mode": "disabled"} + ) + return { + "access_token": guest_token, + "token_type": "bearer", + "auth_mode": "disabled", + "message": "Authentication is disabled. Using guest access.", + "core_version": core_version, + "api_version": api_version_display, + "webui_title": webui_title, + "webui_description": webui_description, + } + username = form_data.username + if auth_handler.accounts.get(username) != form_data.password: + raise HTTPException(status_code=401, detail="Incorrect credentials") + + # Regular user login + user_token = auth_handler.create_token( + username=username, role="user", metadata={"auth_mode": "enabled"} + ) + return { + "access_token": user_token, + "token_type": "bearer", + "auth_mode": "enabled", + "core_version": core_version, + "api_version": api_version_display, + "webui_title": webui_title, + "webui_description": webui_description, + } + + @app.get("/health", dependencies=[Depends(combined_auth)]) + async def get_status(): + """Get current system status""" + try: + pipeline_status = await get_namespace_data("pipeline_status") + + if not auth_configured: + auth_mode = "disabled" + else: + auth_mode = "enabled" + + # Cleanup expired keyed locks and get status + keyed_lock_info = cleanup_keyed_lock() + + return { + "status": "healthy", + "working_directory": str(args.working_dir), + "input_directory": str(args.input_dir), + "configuration": { + # LLM configuration binding/host address (if applicable)/model (if applicable) + "llm_binding": args.llm_binding, + "llm_binding_host": args.llm_binding_host, + "llm_model": args.llm_model, + # embedding model configuration binding/host address (if applicable)/model (if applicable) + "embedding_binding": args.embedding_binding, + "embedding_binding_host": args.embedding_binding_host, + "embedding_model": args.embedding_model, + "summary_max_tokens": args.summary_max_tokens, + "summary_context_size": args.summary_context_size, + "kv_storage": args.kv_storage, + "doc_status_storage": args.doc_status_storage, + "graph_storage": args.graph_storage, + "vector_storage": args.vector_storage, + "enable_llm_cache_for_extract": args.enable_llm_cache_for_extract, + "enable_llm_cache": args.enable_llm_cache, + "workspace": args.workspace, + "max_graph_nodes": args.max_graph_nodes, + # Rerank configuration + "enable_rerank": rerank_model_func is not None, + "rerank_binding": args.rerank_binding, + "rerank_model": args.rerank_model if rerank_model_func else None, + "rerank_binding_host": args.rerank_binding_host + if rerank_model_func + else None, + # Environment variable status (requested configuration) + "summary_language": args.summary_language, + "force_llm_summary_on_merge": args.force_llm_summary_on_merge, + "max_parallel_insert": args.max_parallel_insert, + "cosine_threshold": args.cosine_threshold, + "min_rerank_score": args.min_rerank_score, + "related_chunk_number": args.related_chunk_number, + "max_async": args.max_async, + "embedding_func_max_async": args.embedding_func_max_async, + "embedding_batch_num": args.embedding_batch_num, + }, + "auth_mode": auth_mode, + "pipeline_busy": pipeline_status.get("busy", False), + "keyed_locks": keyed_lock_info, + "core_version": core_version, + "api_version": api_version_display, + "webui_title": webui_title, + "webui_description": webui_description, + } + except Exception as e: + logger.error(f"Error getting health status: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + # Custom StaticFiles class for smart caching + class SmartStaticFiles(StaticFiles): # Renamed from NoCacheStaticFiles + async def get_response(self, path: str, scope): + response = await super().get_response(path, scope) + + is_html = path.endswith(".html") or response.media_type == "text/html" + + if is_html: + response.headers["Cache-Control"] = ( + "no-cache, no-store, must-revalidate" + ) + response.headers["Pragma"] = "no-cache" + response.headers["Expires"] = "0" + elif ( + "/assets/" in path + ): # Assets (JS, CSS, images, fonts) generated by Vite with hash in filename + response.headers["Cache-Control"] = ( + "public, max-age=31536000, immutable" + ) + # Add other rules here if needed for non-HTML, non-asset files + + # Ensure correct Content-Type + if path.endswith(".js"): + response.headers["Content-Type"] = "application/javascript" + elif path.endswith(".css"): + response.headers["Content-Type"] = "text/css" + + return response + + # Mount Swagger UI static files for offline support + swagger_static_dir = Path(__file__).parent / "static" / "swagger-ui" + if swagger_static_dir.exists(): + app.mount( + "/static/swagger-ui", + StaticFiles(directory=swagger_static_dir), + name="swagger-ui-static", + ) + + # Webui mount webui/index.html + static_dir = Path(__file__).parent / "webui" + static_dir.mkdir(exist_ok=True) + app.mount( + "/webui", + SmartStaticFiles( + directory=static_dir, html=True, check_dir=True + ), # Use SmartStaticFiles + name="webui", + ) + + return app + + +def get_application(args=None): + """Factory function for creating the FastAPI application""" + if args is None: + args = global_args + return create_app(args) + + +def configure_logging(): + """Configure logging for uvicorn startup""" + + # Reset any existing handlers to ensure clean configuration + for logger_name in ["uvicorn", "uvicorn.access", "uvicorn.error", "lightrag"]: + logger = logging.getLogger(logger_name) + logger.handlers = [] + logger.filters = [] + + # Get log directory path from environment variable + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath(os.path.join(log_dir, DEFAULT_LOG_FILENAME)) + + print(f"\nLightRAG log file: {log_file_path}\n") + os.makedirs(os.path.dirname(log_dir), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = get_env_value("LOG_MAX_BYTES", DEFAULT_LOG_MAX_BYTES, int) + log_backup_count = get_env_value("LOG_BACKUP_COUNT", DEFAULT_LOG_BACKUP_COUNT, int) + + logging.config.dictConfig( + { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": "%(levelname)s: %(message)s", + }, + "detailed": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + }, + }, + "handlers": { + "console": { + "formatter": "default", + "class": "logging.StreamHandler", + "stream": "ext://sys.stderr", + }, + "file": { + "formatter": "detailed", + "class": "logging.handlers.RotatingFileHandler", + "filename": log_file_path, + "maxBytes": log_max_bytes, + "backupCount": log_backup_count, + "encoding": "utf-8", + }, + }, + "loggers": { + # Configure all uvicorn related loggers + "uvicorn": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + "uvicorn.access": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + "filters": ["path_filter"], + }, + "uvicorn.error": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + }, + "lightrag": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": False, + "filters": ["path_filter"], + }, + }, + "filters": { + "path_filter": { + "()": "lightrag.utils.LightragPathFilter", + }, + }, + } + ) + + +def check_and_install_dependencies(): + """Check and install required dependencies""" + required_packages = [ + "uvicorn", + "tiktoken", + "fastapi", + # Add other required packages here + ] + + for package in required_packages: + if not pm.is_installed(package): + print(f"Installing {package}...") + pm.install(package) + print(f"{package} installed successfully") + + +def main(): + # Explicitly initialize configuration for clarity + # (The proxy will auto-initialize anyway, but this makes intent clear) + from .config import initialize_config + + initialize_config() + + # Check if running under Gunicorn + if "GUNICORN_CMD_ARGS" in os.environ: + # If started with Gunicorn, return directly as Gunicorn will call get_application + print("Running under Gunicorn - worker management handled by Gunicorn") + return + + # Check .env file + if not check_env_file(): + sys.exit(1) + + # Check and install dependencies + check_and_install_dependencies() + + from multiprocessing import freeze_support + + freeze_support() + + # Configure logging before parsing args + configure_logging() + update_uvicorn_mode_config() + display_splash_screen(global_args) + + # Note: Signal handlers are NOT registered here because: + # - Uvicorn has built-in signal handling that properly calls lifespan shutdown + # - Custom signal handlers can interfere with uvicorn's graceful shutdown + # - Cleanup is handled by the lifespan context manager's finally block + + # Create application instance directly instead of using factory function + app = create_app(global_args) + + # Start Uvicorn in single process mode + uvicorn_config = { + "app": app, # Pass application instance directly instead of string path + "host": global_args.host, + "port": global_args.port, + "log_config": None, # Disable default config + } + + if global_args.ssl: + uvicorn_config.update( + { + "ssl_certfile": global_args.ssl_certfile, + "ssl_keyfile": global_args.ssl_keyfile, + } + ) + + print( + f"Starting Uvicorn server in single-process mode on {global_args.host}:{global_args.port}" + ) + uvicorn.run(**uvicorn_config) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/lightrag/api/routers/__init__.py b/LightRAG/lightrag/api/routers/__init__.py new file mode 100644 index 00000000..b71f204e --- /dev/null +++ b/LightRAG/lightrag/api/routers/__init__.py @@ -0,0 +1,10 @@ +""" +This module contains all the routers for the LightRAG API. +""" + +from .document_routes import router as document_router +from .query_routes import router as query_router +from .graph_routes import router as graph_router +from .ollama_api import OllamaAPI + +__all__ = ["document_router", "query_router", "graph_router", "OllamaAPI"] diff --git a/LightRAG/lightrag/api/routers/document_routes.py b/LightRAG/lightrag/api/routers/document_routes.py new file mode 100644 index 00000000..a59f10c7 --- /dev/null +++ b/LightRAG/lightrag/api/routers/document_routes.py @@ -0,0 +1,2977 @@ +""" +This module contains all document-related routes for the LightRAG API. +""" + +import asyncio +from functools import lru_cache +from lightrag.utils import logger, get_pinyin_sort_key +import aiofiles +import shutil +import traceback +from datetime import datetime, timezone +from pathlib import Path +from typing import Dict, List, Optional, Any, Literal +from io import BytesIO +from fastapi import ( + APIRouter, + BackgroundTasks, + Depends, + File, + HTTPException, + UploadFile, +) +from pydantic import BaseModel, Field, field_validator + +from lightrag import LightRAG +from lightrag.base import DeletionResult, DocProcessingStatus, DocStatus +from lightrag.utils import generate_track_id +from lightrag.api.utils_api import get_combined_auth_dependency +from ..config import global_args + + +@lru_cache(maxsize=1) +def _is_docling_available() -> bool: + """Check if docling is available (cached check). + + This function uses lru_cache to avoid repeated import attempts. + The result is cached after the first call. + + Returns: + bool: True if docling is available, False otherwise + """ + try: + import docling # noqa: F401 # type: ignore[import-not-found] + + return True + except ImportError: + return False + + +# Function to format datetime to ISO format string with timezone information +def format_datetime(dt: Any) -> Optional[str]: + """Format datetime to ISO format string with timezone information + + Args: + dt: Datetime object, string, or None + + Returns: + ISO format string with timezone information, or None if input is None + """ + if dt is None: + return None + if isinstance(dt, str): + return dt + + # Check if datetime object has timezone information + if isinstance(dt, datetime): + # If datetime object has no timezone info (naive datetime), add UTC timezone + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + + # Return ISO format string with timezone information + return dt.isoformat() + + +router = APIRouter( + prefix="/documents", + tags=["documents"], +) + +# Temporary file prefix +temp_prefix = "__tmp__" + + +def sanitize_filename(filename: str, input_dir: Path) -> str: + """ + Sanitize uploaded filename to prevent Path Traversal attacks. + + Args: + filename: The original filename from the upload + input_dir: The target input directory + + Returns: + str: Sanitized filename that is safe to use + + Raises: + HTTPException: If the filename is unsafe or invalid + """ + # Basic validation + if not filename or not filename.strip(): + raise HTTPException(status_code=400, detail="Filename cannot be empty") + + # Remove path separators and traversal sequences + clean_name = filename.replace("/", "").replace("\\", "") + clean_name = clean_name.replace("..", "") + + # Remove control characters and null bytes + clean_name = "".join(c for c in clean_name if ord(c) >= 32 and c != "\x7f") + + # Remove leading/trailing whitespace and dots + clean_name = clean_name.strip().strip(".") + + # Check if anything is left after sanitization + if not clean_name: + raise HTTPException( + status_code=400, detail="Invalid filename after sanitization" + ) + + # Verify the final path stays within the input directory + try: + final_path = (input_dir / clean_name).resolve() + if not final_path.is_relative_to(input_dir.resolve()): + raise HTTPException(status_code=400, detail="Unsafe filename detected") + except (OSError, ValueError): + raise HTTPException(status_code=400, detail="Invalid filename") + + return clean_name + + +class ScanResponse(BaseModel): + """Response model for document scanning operation + + Attributes: + status: Status of the scanning operation + message: Optional message with additional details + track_id: Tracking ID for monitoring scanning progress + """ + + status: Literal["scanning_started"] = Field( + description="Status of the scanning operation" + ) + message: Optional[str] = Field( + default=None, description="Additional details about the scanning operation" + ) + track_id: str = Field(description="Tracking ID for monitoring scanning progress") + + class Config: + json_schema_extra = { + "example": { + "status": "scanning_started", + "message": "Scanning process has been initiated in the background", + "track_id": "scan_20250729_170612_abc123", + } + } + + +class ReprocessResponse(BaseModel): + """Response model for reprocessing failed documents operation + + Attributes: + status: Status of the reprocessing operation + message: Message describing the operation result + track_id: Tracking ID for monitoring reprocessing progress + """ + + status: Literal["reprocessing_started"] = Field( + description="Status of the reprocessing operation" + ) + message: str = Field(description="Human-readable message describing the operation") + track_id: str = Field( + description="Tracking ID for monitoring reprocessing progress" + ) + + class Config: + json_schema_extra = { + "example": { + "status": "reprocessing_started", + "message": "Reprocessing of failed documents has been initiated in background", + "track_id": "retry_20250729_170612_def456", + } + } + + +class CancelPipelineResponse(BaseModel): + """Response model for pipeline cancellation operation + + Attributes: + status: Status of the cancellation request + message: Message describing the operation result + """ + + status: Literal["cancellation_requested", "not_busy"] = Field( + description="Status of the cancellation request" + ) + message: str = Field(description="Human-readable message describing the operation") + + class Config: + json_schema_extra = { + "example": { + "status": "cancellation_requested", + "message": "Pipeline cancellation has been requested. Documents will be marked as FAILED.", + } + } + + +class InsertTextRequest(BaseModel): + """Request model for inserting a single text document + + Attributes: + text: The text content to be inserted into the RAG system + file_source: Source of the text (optional) + """ + + text: str = Field( + min_length=1, + description="The text to insert", + ) + file_source: str = Field(default=None, min_length=0, description="File Source") + + @field_validator("text", mode="after") + @classmethod + def strip_text_after(cls, text: str) -> str: + return text.strip() + + @field_validator("file_source", mode="after") + @classmethod + def strip_source_after(cls, file_source: str) -> str: + return file_source.strip() + + class Config: + json_schema_extra = { + "example": { + "text": "This is a sample text to be inserted into the RAG system.", + "file_source": "Source of the text (optional)", + } + } + + +class InsertTextsRequest(BaseModel): + """Request model for inserting multiple text documents + + Attributes: + texts: List of text contents to be inserted into the RAG system + file_sources: Sources of the texts (optional) + """ + + texts: list[str] = Field( + min_length=1, + description="The texts to insert", + ) + file_sources: list[str] = Field( + default=None, min_length=0, description="Sources of the texts" + ) + + @field_validator("texts", mode="after") + @classmethod + def strip_texts_after(cls, texts: list[str]) -> list[str]: + return [text.strip() for text in texts] + + @field_validator("file_sources", mode="after") + @classmethod + def strip_sources_after(cls, file_sources: list[str]) -> list[str]: + return [file_source.strip() for file_source in file_sources] + + class Config: + json_schema_extra = { + "example": { + "texts": [ + "This is the first text to be inserted.", + "This is the second text to be inserted.", + ], + "file_sources": [ + "First file source (optional)", + ], + } + } + + +class InsertResponse(BaseModel): + """Response model for document insertion operations + + Attributes: + status: Status of the operation (success, duplicated, partial_success, failure) + message: Detailed message describing the operation result + track_id: Tracking ID for monitoring processing status + """ + + status: Literal["success", "duplicated", "partial_success", "failure"] = Field( + description="Status of the operation" + ) + message: str = Field(description="Message describing the operation result") + track_id: str = Field(description="Tracking ID for monitoring processing status") + + class Config: + json_schema_extra = { + "example": { + "status": "success", + "message": "File 'document.pdf' uploaded successfully. Processing will continue in background.", + "track_id": "upload_20250729_170612_abc123", + } + } + + +class ClearDocumentsResponse(BaseModel): + """Response model for document clearing operation + + Attributes: + status: Status of the clear operation + message: Detailed message describing the operation result + """ + + status: Literal["success", "partial_success", "busy", "fail"] = Field( + description="Status of the clear operation" + ) + message: str = Field(description="Message describing the operation result") + + class Config: + json_schema_extra = { + "example": { + "status": "success", + "message": "All documents cleared successfully. Deleted 15 files.", + } + } + + +class ClearCacheRequest(BaseModel): + """Request model for clearing cache + + This model is kept for API compatibility but no longer accepts any parameters. + All cache will be cleared regardless of the request content. + """ + + class Config: + json_schema_extra = {"example": {}} + + +class ClearCacheResponse(BaseModel): + """Response model for cache clearing operation + + Attributes: + status: Status of the clear operation + message: Detailed message describing the operation result + """ + + status: Literal["success", "fail"] = Field( + description="Status of the clear operation" + ) + message: str = Field(description="Message describing the operation result") + + class Config: + json_schema_extra = { + "example": { + "status": "success", + "message": "Successfully cleared cache for modes: ['default', 'naive']", + } + } + + +"""Response model for document status + +Attributes: + id: Document identifier + content_summary: Summary of document content + content_length: Length of document content + status: Current processing status + created_at: Creation timestamp (ISO format string) + updated_at: Last update timestamp (ISO format string) + chunks_count: Number of chunks (optional) + error: Error message if any (optional) + metadata: Additional metadata (optional) + file_path: Path to the document file +""" + + +class DeleteDocRequest(BaseModel): + doc_ids: List[str] = Field(..., description="The IDs of the documents to delete.") + delete_file: bool = Field( + default=False, + description="Whether to delete the corresponding file in the upload directory.", + ) + delete_llm_cache: bool = Field( + default=False, + description="Whether to delete cached LLM extraction results for the documents.", + ) + + @field_validator("doc_ids", mode="after") + @classmethod + def validate_doc_ids(cls, doc_ids: List[str]) -> List[str]: + if not doc_ids: + raise ValueError("Document IDs list cannot be empty") + + validated_ids = [] + for doc_id in doc_ids: + if not doc_id or not doc_id.strip(): + raise ValueError("Document ID cannot be empty") + validated_ids.append(doc_id.strip()) + + # Check for duplicates + if len(validated_ids) != len(set(validated_ids)): + raise ValueError("Document IDs must be unique") + + return validated_ids + + +class DeleteEntityRequest(BaseModel): + entity_name: str = Field(..., description="The name of the entity to delete.") + + @field_validator("entity_name", mode="after") + @classmethod + def validate_entity_name(cls, entity_name: str) -> str: + if not entity_name or not entity_name.strip(): + raise ValueError("Entity name cannot be empty") + return entity_name.strip() + + +class DeleteRelationRequest(BaseModel): + source_entity: str = Field(..., description="The name of the source entity.") + target_entity: str = Field(..., description="The name of the target entity.") + + @field_validator("source_entity", "target_entity", mode="after") + @classmethod + def validate_entity_names(cls, entity_name: str) -> str: + if not entity_name or not entity_name.strip(): + raise ValueError("Entity name cannot be empty") + return entity_name.strip() + + +class DocStatusResponse(BaseModel): + id: str = Field(description="Document identifier") + content_summary: str = Field(description="Summary of document content") + content_length: int = Field(description="Length of document content in characters") + status: DocStatus = Field(description="Current processing status") + created_at: str = Field(description="Creation timestamp (ISO format string)") + updated_at: str = Field(description="Last update timestamp (ISO format string)") + track_id: Optional[str] = Field( + default=None, description="Tracking ID for monitoring progress" + ) + chunks_count: Optional[int] = Field( + default=None, description="Number of chunks the document was split into" + ) + error_msg: Optional[str] = Field( + default=None, description="Error message if processing failed" + ) + metadata: Optional[dict[str, Any]] = Field( + default=None, description="Additional metadata about the document" + ) + file_path: str = Field(description="Path to the document file") + + class Config: + json_schema_extra = { + "example": { + "id": "doc_123456", + "content_summary": "Research paper on machine learning", + "content_length": 15240, + "status": "processed", + "created_at": "2025-03-31T12:34:56", + "updated_at": "2025-03-31T12:35:30", + "track_id": "upload_20250729_170612_abc123", + "chunks_count": 12, + "error": None, + "metadata": {"author": "John Doe", "year": 2025}, + "file_path": "research_paper.pdf", + } + } + + +class DocsStatusesResponse(BaseModel): + """Response model for document statuses + + Attributes: + statuses: Dictionary mapping document status to lists of document status responses + """ + + statuses: Dict[DocStatus, List[DocStatusResponse]] = Field( + default_factory=dict, + description="Dictionary mapping document status to lists of document status responses", + ) + + class Config: + json_schema_extra = { + "example": { + "statuses": { + "PENDING": [ + { + "id": "doc_123", + "content_summary": "Pending document", + "content_length": 5000, + "status": "pending", + "created_at": "2025-03-31T10:00:00", + "updated_at": "2025-03-31T10:00:00", + "track_id": "upload_20250331_100000_abc123", + "chunks_count": None, + "error": None, + "metadata": None, + "file_path": "pending_doc.pdf", + } + ], + "PREPROCESSED": [ + { + "id": "doc_789", + "content_summary": "Document pending final indexing", + "content_length": 7200, + "status": "preprocessed", + "created_at": "2025-03-31T09:30:00", + "updated_at": "2025-03-31T09:35:00", + "track_id": "upload_20250331_093000_xyz789", + "chunks_count": 10, + "error": None, + "metadata": None, + "file_path": "preprocessed_doc.pdf", + } + ], + "PROCESSED": [ + { + "id": "doc_456", + "content_summary": "Processed document", + "content_length": 8000, + "status": "processed", + "created_at": "2025-03-31T09:00:00", + "updated_at": "2025-03-31T09:05:00", + "track_id": "insert_20250331_090000_def456", + "chunks_count": 8, + "error": None, + "metadata": {"author": "John Doe"}, + "file_path": "processed_doc.pdf", + } + ], + } + } + } + + +class TrackStatusResponse(BaseModel): + """Response model for tracking document processing status by track_id + + Attributes: + track_id: The tracking ID + documents: List of documents associated with this track_id + total_count: Total number of documents for this track_id + status_summary: Count of documents by status + """ + + track_id: str = Field(description="The tracking ID") + documents: List[DocStatusResponse] = Field( + description="List of documents associated with this track_id" + ) + total_count: int = Field(description="Total number of documents for this track_id") + status_summary: Dict[str, int] = Field(description="Count of documents by status") + + class Config: + json_schema_extra = { + "example": { + "track_id": "upload_20250729_170612_abc123", + "documents": [ + { + "id": "doc_123456", + "content_summary": "Research paper on machine learning", + "content_length": 15240, + "status": "PROCESSED", + "created_at": "2025-03-31T12:34:56", + "updated_at": "2025-03-31T12:35:30", + "track_id": "upload_20250729_170612_abc123", + "chunks_count": 12, + "error": None, + "metadata": {"author": "John Doe", "year": 2025}, + "file_path": "research_paper.pdf", + } + ], + "total_count": 1, + "status_summary": {"PROCESSED": 1}, + } + } + + +class DocumentsRequest(BaseModel): + """Request model for paginated document queries + + Attributes: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', 'id', 'file_path') + sort_direction: Sort direction ('asc' or 'desc') + """ + + status_filter: Optional[DocStatus] = Field( + default=None, description="Filter by document status, None for all statuses" + ) + page: int = Field(default=1, ge=1, description="Page number (1-based)") + page_size: int = Field( + default=50, ge=10, le=200, description="Number of documents per page (10-200)" + ) + sort_field: Literal["created_at", "updated_at", "id", "file_path"] = Field( + default="updated_at", description="Field to sort by" + ) + sort_direction: Literal["asc", "desc"] = Field( + default="desc", description="Sort direction" + ) + + class Config: + json_schema_extra = { + "example": { + "status_filter": "PROCESSED", + "page": 1, + "page_size": 50, + "sort_field": "updated_at", + "sort_direction": "desc", + } + } + + +class PaginationInfo(BaseModel): + """Pagination information + + Attributes: + page: Current page number + page_size: Number of items per page + total_count: Total number of items + total_pages: Total number of pages + has_next: Whether there is a next page + has_prev: Whether there is a previous page + """ + + page: int = Field(description="Current page number") + page_size: int = Field(description="Number of items per page") + total_count: int = Field(description="Total number of items") + total_pages: int = Field(description="Total number of pages") + has_next: bool = Field(description="Whether there is a next page") + has_prev: bool = Field(description="Whether there is a previous page") + + class Config: + json_schema_extra = { + "example": { + "page": 1, + "page_size": 50, + "total_count": 150, + "total_pages": 3, + "has_next": True, + "has_prev": False, + } + } + + +class PaginatedDocsResponse(BaseModel): + """Response model for paginated document queries + + Attributes: + documents: List of documents for the current page + pagination: Pagination information + status_counts: Count of documents by status for all documents + """ + + documents: List[DocStatusResponse] = Field( + description="List of documents for the current page" + ) + pagination: PaginationInfo = Field(description="Pagination information") + status_counts: Dict[str, int] = Field( + description="Count of documents by status for all documents" + ) + + class Config: + json_schema_extra = { + "example": { + "documents": [ + { + "id": "doc_123456", + "content_summary": "Research paper on machine learning", + "content_length": 15240, + "status": "PROCESSED", + "created_at": "2025-03-31T12:34:56", + "updated_at": "2025-03-31T12:35:30", + "track_id": "upload_20250729_170612_abc123", + "chunks_count": 12, + "error_msg": None, + "metadata": {"author": "John Doe", "year": 2025}, + "file_path": "research_paper.pdf", + } + ], + "pagination": { + "page": 1, + "page_size": 50, + "total_count": 150, + "total_pages": 3, + "has_next": True, + "has_prev": False, + }, + "status_counts": { + "PENDING": 10, + "PROCESSING": 5, + "PREPROCESSED": 5, + "PROCESSED": 130, + "FAILED": 5, + }, + } + } + + +class StatusCountsResponse(BaseModel): + """Response model for document status counts + + Attributes: + status_counts: Count of documents by status + """ + + status_counts: Dict[str, int] = Field(description="Count of documents by status") + + class Config: + json_schema_extra = { + "example": { + "status_counts": { + "PENDING": 10, + "PROCESSING": 5, + "PREPROCESSED": 5, + "PROCESSED": 130, + "FAILED": 5, + } + } + } + + +class PipelineStatusResponse(BaseModel): + """Response model for pipeline status + + Attributes: + autoscanned: Whether auto-scan has started + busy: Whether the pipeline is currently busy + job_name: Current job name (e.g., indexing files/indexing texts) + job_start: Job start time as ISO format string with timezone (optional) + docs: Total number of documents to be indexed + batchs: Number of batches for processing documents + cur_batch: Current processing batch + request_pending: Flag for pending request for processing + latest_message: Latest message from pipeline processing + history_messages: List of history messages + update_status: Status of update flags for all namespaces + """ + + autoscanned: bool = False + busy: bool = False + job_name: str = "Default Job" + job_start: Optional[str] = None + docs: int = 0 + batchs: int = 0 + cur_batch: int = 0 + request_pending: bool = False + latest_message: str = "" + history_messages: Optional[List[str]] = None + update_status: Optional[dict] = None + + @field_validator("job_start", mode="before") + @classmethod + def parse_job_start(cls, value): + """Process datetime and return as ISO format string with timezone""" + return format_datetime(value) + + class Config: + extra = "allow" # Allow additional fields from the pipeline status + + +class DocumentManager: + def __init__( + self, + input_dir: str, + workspace: str = "", # New parameter for workspace isolation + supported_extensions: tuple = ( + ".txt", + ".md", + ".pdf", + ".docx", + ".pptx", + ".xlsx", + ".rtf", # Rich Text Format + ".odt", # OpenDocument Text + ".tex", # LaTeX + ".epub", # Electronic Publication + ".html", # HyperText Markup Language + ".htm", # HyperText Markup Language + ".csv", # Comma-Separated Values + ".json", # JavaScript Object Notation + ".xml", # eXtensible Markup Language + ".yaml", # YAML Ain't Markup Language + ".yml", # YAML + ".log", # Log files + ".conf", # Configuration files + ".ini", # Initialization files + ".properties", # Java properties files + ".sql", # SQL scripts + ".bat", # Batch files + ".sh", # Shell scripts + ".c", # C source code + ".cpp", # C++ source code + ".py", # Python source code + ".java", # Java source code + ".js", # JavaScript source code + ".ts", # TypeScript source code + ".swift", # Swift source code + ".go", # Go source code + ".rb", # Ruby source code + ".php", # PHP source code + ".css", # Cascading Style Sheets + ".scss", # Sassy CSS + ".less", # LESS CSS + ), + ): + # Store the base input directory and workspace + self.base_input_dir = Path(input_dir) + self.workspace = workspace + self.supported_extensions = supported_extensions + self.indexed_files = set() + + # Create workspace-specific input directory + # If workspace is provided, create a subdirectory for data isolation + if workspace: + self.input_dir = self.base_input_dir / workspace + else: + self.input_dir = self.base_input_dir + + # Create input directory if it doesn't exist + self.input_dir.mkdir(parents=True, exist_ok=True) + + def scan_directory_for_new_files(self) -> List[Path]: + """Scan input directory for new files""" + new_files = [] + for ext in self.supported_extensions: + logger.debug(f"Scanning for {ext} files in {self.input_dir}") + for file_path in self.input_dir.glob(f"*{ext}"): + if file_path not in self.indexed_files: + new_files.append(file_path) + return new_files + + def mark_as_indexed(self, file_path: Path): + self.indexed_files.add(file_path) + + def is_supported_file(self, filename: str) -> bool: + return any(filename.lower().endswith(ext) for ext in self.supported_extensions) + + +def validate_file_path_security(file_path_str: str, base_dir: Path) -> Optional[Path]: + """ + Validate file path security to prevent Path Traversal attacks. + + Args: + file_path_str: The file path string to validate + base_dir: The base directory that the file must be within + + Returns: + Path: Safe file path if valid, None if unsafe or invalid + """ + if not file_path_str or not file_path_str.strip(): + return None + + try: + # Clean the file path string + clean_path_str = file_path_str.strip() + + # Check for obvious path traversal patterns before processing + # This catches both Unix (..) and Windows (..\) style traversals + if ".." in clean_path_str: + # Additional check for Windows-style backslash traversal + if ( + "\\..\\" in clean_path_str + or clean_path_str.startswith("..\\") + or clean_path_str.endswith("\\..") + ): + # logger.warning( + # f"Security violation: Windows path traversal attempt detected - {file_path_str}" + # ) + return None + + # Normalize path separators (convert backslashes to forward slashes) + # This helps handle Windows-style paths on Unix systems + normalized_path = clean_path_str.replace("\\", "/") + + # Create path object and resolve it (handles symlinks and relative paths) + candidate_path = (base_dir / normalized_path).resolve() + base_dir_resolved = base_dir.resolve() + + # Check if the resolved path is within the base directory + if not candidate_path.is_relative_to(base_dir_resolved): + # logger.warning( + # f"Security violation: Path traversal attempt detected - {file_path_str}" + # ) + return None + + return candidate_path + + except (OSError, ValueError, Exception) as e: + logger.warning(f"Invalid file path detected: {file_path_str} - {str(e)}") + return None + + +def get_unique_filename_in_enqueued(target_dir: Path, original_name: str) -> str: + """Generate a unique filename in the target directory by adding numeric suffixes if needed + + Args: + target_dir: Target directory path + original_name: Original filename + + Returns: + str: Unique filename (may have numeric suffix added) + """ + import time + + original_path = Path(original_name) + base_name = original_path.stem + extension = original_path.suffix + + # Try original name first + if not (target_dir / original_name).exists(): + return original_name + + # Try with numeric suffixes 001-999 + for i in range(1, 1000): + suffix = f"{i:03d}" + new_name = f"{base_name}_{suffix}{extension}" + if not (target_dir / new_name).exists(): + return new_name + + # Fallback with timestamp if all 999 slots are taken + timestamp = int(time.time()) + return f"{base_name}_{timestamp}{extension}" + + +# Document processing helper functions (synchronous) +# These functions run in thread pool via asyncio.to_thread() to avoid blocking the event loop + + +def _convert_with_docling(file_path: Path) -> str: + """Convert document using docling (synchronous). + + Args: + file_path: Path to the document file + + Returns: + str: Extracted markdown content + """ + from docling.document_converter import DocumentConverter # type: ignore + + converter = DocumentConverter() + result = converter.convert(file_path) + return result.document.export_to_markdown() + + +def _extract_pdf_pypdf(file_bytes: bytes, password: str = None) -> str: + """Extract PDF content using pypdf (synchronous). + + Args: + file_bytes: PDF file content as bytes + password: Optional password for encrypted PDFs + + Returns: + str: Extracted text content + + Raises: + Exception: If PDF is encrypted and password is incorrect or missing + """ + from pypdf import PdfReader # type: ignore + + pdf_file = BytesIO(file_bytes) + reader = PdfReader(pdf_file) + + # Check if PDF is encrypted + if reader.is_encrypted: + if not password: + raise Exception("PDF is encrypted but no password provided") + + decrypt_result = reader.decrypt(password) + if decrypt_result == 0: + raise Exception("Incorrect PDF password") + + # Extract text from all pages + content = "" + for page in reader.pages: + content += page.extract_text() + "\n" + + return content + + +def _extract_docx(file_bytes: bytes) -> str: + """Extract DOCX content (synchronous). + + Args: + file_bytes: DOCX file content as bytes + + Returns: + str: Extracted text content + """ + from docx import Document # type: ignore + + docx_file = BytesIO(file_bytes) + doc = Document(docx_file) + return "\n".join([paragraph.text for paragraph in doc.paragraphs]) + + +def _extract_pptx(file_bytes: bytes) -> str: + """Extract PPTX content (synchronous). + + Args: + file_bytes: PPTX file content as bytes + + Returns: + str: Extracted text content + """ + from pptx import Presentation # type: ignore + + pptx_file = BytesIO(file_bytes) + prs = Presentation(pptx_file) + content = "" + for slide in prs.slides: + for shape in slide.shapes: + if hasattr(shape, "text"): + content += shape.text + "\n" + return content + + +def _extract_xlsx(file_bytes: bytes) -> str: + """Extract XLSX content (synchronous). + + Args: + file_bytes: XLSX file content as bytes + + Returns: + str: Extracted text content + """ + from openpyxl import load_workbook # type: ignore + + xlsx_file = BytesIO(file_bytes) + wb = load_workbook(xlsx_file) + content = "" + for sheet in wb: + content += f"Sheet: {sheet.title}\n" + for row in sheet.iter_rows(values_only=True): + content += ( + "\t".join(str(cell) if cell is not None else "" for cell in row) + "\n" + ) + content += "\n" + return content + + +async def pipeline_enqueue_file( + rag: LightRAG, file_path: Path, track_id: str = None +) -> tuple[bool, str]: + """Add a file to the queue for processing + + Args: + rag: LightRAG instance + file_path: Path to the saved file + track_id: Optional tracking ID, if not provided will be generated + Returns: + tuple: (success: bool, track_id: str) + """ + + # Generate track_id if not provided + if track_id is None: + track_id = generate_track_id("unknown") + + try: + content = "" + ext = file_path.suffix.lower() + file_size = 0 + + # Get file size for error reporting + try: + file_size = file_path.stat().st_size + except Exception: + file_size = 0 + + file = None + try: + async with aiofiles.open(file_path, "rb") as f: + file = await f.read() + except PermissionError as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]Permission denied - cannot read file", + "original_error": str(e), + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error( + f"[File Extraction]Permission denied reading file: {file_path.name}" + ) + return False, track_id + except FileNotFoundError as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]File not found", + "original_error": str(e), + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error(f"[File Extraction]File not found: {file_path.name}") + return False, track_id + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]File reading error", + "original_error": str(e), + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error( + f"[File Extraction]Error reading file {file_path.name}: {str(e)}" + ) + return False, track_id + + # Process based on file type + try: + match ext: + case ( + ".txt" + | ".md" + | ".html" + | ".htm" + | ".tex" + | ".json" + | ".xml" + | ".yaml" + | ".yml" + | ".rtf" + | ".odt" + | ".epub" + | ".csv" + | ".log" + | ".conf" + | ".ini" + | ".properties" + | ".sql" + | ".bat" + | ".sh" + | ".c" + | ".cpp" + | ".py" + | ".java" + | ".js" + | ".ts" + | ".swift" + | ".go" + | ".rb" + | ".php" + | ".css" + | ".scss" + | ".less" + ): + try: + # Try to decode as UTF-8 + content = file.decode("utf-8") + + # Validate content + if not content or len(content.strip()) == 0: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]Empty file content", + "original_error": "File contains no content or only whitespace", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]Empty content in file: {file_path.name}" + ) + return False, track_id + + # Check if content looks like binary data string representation + if content.startswith("b'") or content.startswith('b"'): + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]Binary data in text file", + "original_error": "File appears to contain binary data representation instead of text", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]File {file_path.name} appears to contain binary data representation instead of text" + ) + return False, track_id + + except UnicodeDecodeError as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]UTF-8 encoding error, please convert it to UTF-8 before processing", + "original_error": f"File is not valid UTF-8 encoded text: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]File {file_path.name} is not valid UTF-8 encoded text. Please convert it to UTF-8 before processing." + ) + return False, track_id + + case ".pdf": + try: + # Try DOCLING first if configured and available + if ( + global_args.document_loading_engine == "DOCLING" + and _is_docling_available() + ): + content = await asyncio.to_thread( + _convert_with_docling, file_path + ) + else: + if ( + global_args.document_loading_engine == "DOCLING" + and not _is_docling_available() + ): + logger.warning( + f"DOCLING engine configured but not available for {file_path.name}. Falling back to pypdf." + ) + # Use pypdf (non-blocking via to_thread) + content = await asyncio.to_thread( + _extract_pdf_pypdf, + file, + global_args.pdf_decrypt_password, + ) + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]PDF processing error", + "original_error": f"Failed to extract text from PDF: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]Error processing PDF {file_path.name}: {str(e)}" + ) + return False, track_id + + case ".docx": + try: + # Try DOCLING first if configured and available + if ( + global_args.document_loading_engine == "DOCLING" + and _is_docling_available() + ): + content = await asyncio.to_thread( + _convert_with_docling, file_path + ) + else: + if ( + global_args.document_loading_engine == "DOCLING" + and not _is_docling_available() + ): + logger.warning( + f"DOCLING engine configured but not available for {file_path.name}. Falling back to python-docx." + ) + # Use python-docx (non-blocking via to_thread) + content = await asyncio.to_thread(_extract_docx, file) + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]DOCX processing error", + "original_error": f"Failed to extract text from DOCX: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]Error processing DOCX {file_path.name}: {str(e)}" + ) + return False, track_id + + case ".pptx": + try: + # Try DOCLING first if configured and available + if ( + global_args.document_loading_engine == "DOCLING" + and _is_docling_available() + ): + content = await asyncio.to_thread( + _convert_with_docling, file_path + ) + else: + if ( + global_args.document_loading_engine == "DOCLING" + and not _is_docling_available() + ): + logger.warning( + f"DOCLING engine configured but not available for {file_path.name}. Falling back to python-pptx." + ) + # Use python-pptx (non-blocking via to_thread) + content = await asyncio.to_thread(_extract_pptx, file) + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]PPTX processing error", + "original_error": f"Failed to extract text from PPTX: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]Error processing PPTX {file_path.name}: {str(e)}" + ) + return False, track_id + + case ".xlsx": + try: + # Try DOCLING first if configured and available + if ( + global_args.document_loading_engine == "DOCLING" + and _is_docling_available() + ): + content = await asyncio.to_thread( + _convert_with_docling, file_path + ) + else: + if ( + global_args.document_loading_engine == "DOCLING" + and not _is_docling_available() + ): + logger.warning( + f"DOCLING engine configured but not available for {file_path.name}. Falling back to openpyxl." + ) + # Use openpyxl (non-blocking via to_thread) + content = await asyncio.to_thread(_extract_xlsx, file) + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]XLSX processing error", + "original_error": f"Failed to extract text from XLSX: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents( + error_files, track_id + ) + logger.error( + f"[File Extraction]Error processing XLSX {file_path.name}: {str(e)}" + ) + return False, track_id + + case _: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": f"[File Extraction]Unsupported file type: {ext}", + "original_error": f"File extension {ext} is not supported", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error( + f"[File Extraction]Unsupported file type: {file_path.name} (extension {ext})" + ) + return False, track_id + + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]File format processing error", + "original_error": f"Unexpected error during file extracting: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error( + f"[File Extraction]Unexpected error during {file_path.name} extracting: {str(e)}" + ) + return False, track_id + + # Insert into the RAG queue + if content: + # Check if content contains only whitespace characters + if not content.strip(): + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "[File Extraction]File contains only whitespace", + "original_error": "File content contains only whitespace characters", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.warning( + f"[File Extraction]File contains only whitespace characters: {file_path.name}" + ) + return False, track_id + + try: + await rag.apipeline_enqueue_documents( + content, file_paths=file_path.name, track_id=track_id + ) + + logger.info( + f"Successfully extracted and enqueued file: {file_path.name}" + ) + + # Move file to __enqueued__ directory after enqueuing + try: + enqueued_dir = file_path.parent / "__enqueued__" + enqueued_dir.mkdir(exist_ok=True) + + # Generate unique filename to avoid conflicts + unique_filename = get_unique_filename_in_enqueued( + enqueued_dir, file_path.name + ) + target_path = enqueued_dir / unique_filename + + # Move the file + file_path.rename(target_path) + logger.debug( + f"Moved file to enqueued directory: {file_path.name} -> {unique_filename}" + ) + + except Exception as move_error: + logger.error( + f"Failed to move file {file_path.name} to __enqueued__ directory: {move_error}" + ) + # Don't affect the main function's success status + + return True, track_id + + except Exception as e: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "Document enqueue error", + "original_error": f"Failed to enqueue document: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error(f"Error enqueueing document {file_path.name}: {str(e)}") + return False, track_id + else: + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "No content extracted", + "original_error": "No content could be extracted from file", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error(f"No content extracted from file: {file_path.name}") + return False, track_id + + except Exception as e: + # Catch-all for any unexpected errors + try: + file_size = file_path.stat().st_size if file_path.exists() else 0 + except Exception: + file_size = 0 + + error_files = [ + { + "file_path": str(file_path.name), + "error_description": "Unexpected processing error", + "original_error": f"Unexpected error: {str(e)}", + "file_size": file_size, + } + ] + await rag.apipeline_enqueue_error_documents(error_files, track_id) + logger.error(f"Enqueuing file {file_path.name} error: {str(e)}") + logger.error(traceback.format_exc()) + return False, track_id + finally: + if file_path.name.startswith(temp_prefix): + try: + file_path.unlink() + except Exception as e: + logger.error(f"Error deleting file {file_path}: {str(e)}") + + +async def pipeline_index_file(rag: LightRAG, file_path: Path, track_id: str = None): + """Index a file with track_id + + Args: + rag: LightRAG instance + file_path: Path to the saved file + track_id: Optional tracking ID + """ + try: + success, returned_track_id = await pipeline_enqueue_file( + rag, file_path, track_id + ) + if success: + await rag.apipeline_process_enqueue_documents() + + except Exception as e: + logger.error(f"Error indexing file {file_path.name}: {str(e)}") + logger.error(traceback.format_exc()) + + +async def pipeline_index_files( + rag: LightRAG, file_paths: List[Path], track_id: str = None +): + """Index multiple files sequentially to avoid high CPU load + + Args: + rag: LightRAG instance + file_paths: Paths to the files to index + track_id: Optional tracking ID to pass to all files + """ + if not file_paths: + return + try: + enqueued = False + + # Use get_pinyin_sort_key for Chinese pinyin sorting + sorted_file_paths = sorted( + file_paths, key=lambda p: get_pinyin_sort_key(str(p)) + ) + + # Process files sequentially with track_id + for file_path in sorted_file_paths: + success, _ = await pipeline_enqueue_file(rag, file_path, track_id) + if success: + enqueued = True + + # Process the queue only if at least one file was successfully enqueued + if enqueued: + await rag.apipeline_process_enqueue_documents() + except Exception as e: + logger.error(f"Error indexing files: {str(e)}") + logger.error(traceback.format_exc()) + + +async def pipeline_index_texts( + rag: LightRAG, + texts: List[str], + file_sources: List[str] = None, + track_id: str = None, +): + """Index a list of texts with track_id + + Args: + rag: LightRAG instance + texts: The texts to index + file_sources: Sources of the texts + track_id: Optional tracking ID + """ + if not texts: + return + if file_sources is not None: + if len(file_sources) != 0 and len(file_sources) != len(texts): + [ + file_sources.append("unknown_source") + for _ in range(len(file_sources), len(texts)) + ] + await rag.apipeline_enqueue_documents( + input=texts, file_paths=file_sources, track_id=track_id + ) + await rag.apipeline_process_enqueue_documents() + + +async def run_scanning_process( + rag: LightRAG, doc_manager: DocumentManager, track_id: str = None +): + """Background task to scan and index documents + + Args: + rag: LightRAG instance + doc_manager: DocumentManager instance + track_id: Optional tracking ID to pass to all scanned files + """ + try: + new_files = doc_manager.scan_directory_for_new_files() + total_files = len(new_files) + logger.info(f"Found {total_files} files to index.") + + if new_files: + # Check for files with PROCESSED status and filter them out + valid_files = [] + processed_files = [] + + for file_path in new_files: + filename = file_path.name + existing_doc_data = await rag.doc_status.get_doc_by_file_path(filename) + + if existing_doc_data and existing_doc_data.get("status") == "processed": + # File is already PROCESSED, skip it with warning + processed_files.append(filename) + logger.warning(f"Skipping already processed file: {filename}") + else: + # File is new or in non-PROCESSED status, add to processing list + valid_files.append(file_path) + + # Process valid files (new files + non-PROCESSED status files) + if valid_files: + await pipeline_index_files(rag, valid_files, track_id) + if processed_files: + logger.info( + f"Scanning process completed: {len(valid_files)} files Processed {len(processed_files)} skipped." + ) + else: + logger.info( + f"Scanning process completed: {len(valid_files)} files Processed." + ) + else: + logger.info( + "No files to process after filtering already processed files." + ) + else: + # No new files to index, check if there are any documents in the queue + logger.info( + "No upload file found, check if there are any documents in the queue..." + ) + await rag.apipeline_process_enqueue_documents() + + except Exception as e: + logger.error(f"Error during scanning process: {str(e)}") + logger.error(traceback.format_exc()) + + +async def background_delete_documents( + rag: LightRAG, + doc_manager: DocumentManager, + doc_ids: List[str], + delete_file: bool = False, + delete_llm_cache: bool = False, +): + """Background task to delete multiple documents""" + from lightrag.kg.shared_storage import ( + get_namespace_data, + get_pipeline_status_lock, + ) + + pipeline_status = await get_namespace_data("pipeline_status") + pipeline_status_lock = get_pipeline_status_lock() + + total_docs = len(doc_ids) + successful_deletions = [] + failed_deletions = [] + + # Double-check pipeline status before proceeding + async with pipeline_status_lock: + if pipeline_status.get("busy", False): + logger.warning("Error: Unexpected pipeline busy state, aborting deletion.") + return # Abort deletion operation + + # Set pipeline status to busy for deletion + pipeline_status.update( + { + "busy": True, + "job_name": f"Deleting {total_docs} Documents", + "job_start": datetime.now().isoformat(), + "docs": total_docs, + "batchs": total_docs, + "cur_batch": 0, + "latest_message": "Starting document deletion process", + } + ) + # Use slice assignment to clear the list in place + pipeline_status["history_messages"][:] = ["Starting document deletion process"] + if delete_llm_cache: + pipeline_status["history_messages"].append( + "LLM cache cleanup requested for this deletion job" + ) + + try: + # Loop through each document ID and delete them one by one + for i, doc_id in enumerate(doc_ids, 1): + # Check for cancellation at the start of each document deletion + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + cancel_msg = f"Deletion cancelled by user at document {i}/{total_docs}. {len(successful_deletions)} deleted, {total_docs - i + 1} remaining." + logger.info(cancel_msg) + pipeline_status["latest_message"] = cancel_msg + pipeline_status["history_messages"].append(cancel_msg) + # Add remaining documents to failed list with cancellation reason + failed_deletions.extend( + doc_ids[i - 1 :] + ) # i-1 because enumerate starts at 1 + break # Exit the loop, remaining documents unchanged + + start_msg = f"Deleting document {i}/{total_docs}: {doc_id}" + logger.info(start_msg) + pipeline_status["cur_batch"] = i + pipeline_status["latest_message"] = start_msg + pipeline_status["history_messages"].append(start_msg) + + file_path = "#" + try: + result = await rag.adelete_by_doc_id( + doc_id, delete_llm_cache=delete_llm_cache + ) + file_path = ( + getattr(result, "file_path", "-") if "result" in locals() else "-" + ) + if result.status == "success": + successful_deletions.append(doc_id) + success_msg = ( + f"Document deleted {i}/{total_docs}: {doc_id}[{file_path}]" + ) + logger.info(success_msg) + async with pipeline_status_lock: + pipeline_status["history_messages"].append(success_msg) + + # Handle file deletion if requested and file_path is available + if ( + delete_file + and result.file_path + and result.file_path != "unknown_source" + ): + try: + deleted_files = [] + # SECURITY FIX: Use secure path validation to prevent arbitrary file deletion + safe_file_path = validate_file_path_security( + result.file_path, doc_manager.input_dir + ) + + if safe_file_path is None: + # Security violation detected - log and skip file deletion + security_msg = f"Security violation: Unsafe file path detected for deletion - {result.file_path}" + logger.warning(security_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = security_msg + pipeline_status["history_messages"].append( + security_msg + ) + else: + # check and delete files from input_dir directory + if safe_file_path.exists(): + try: + safe_file_path.unlink() + deleted_files.append(safe_file_path.name) + file_delete_msg = f"Successfully deleted input_dir file: {result.file_path}" + logger.info(file_delete_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = ( + file_delete_msg + ) + pipeline_status["history_messages"].append( + file_delete_msg + ) + except Exception as file_error: + file_error_msg = f"Failed to delete input_dir file {result.file_path}: {str(file_error)}" + logger.debug(file_error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = ( + file_error_msg + ) + pipeline_status["history_messages"].append( + file_error_msg + ) + + # Also check and delete files from __enqueued__ directory + enqueued_dir = doc_manager.input_dir / "__enqueued__" + if enqueued_dir.exists(): + # SECURITY FIX: Validate that the file path is safe before processing + # Only proceed if the original path validation passed + base_name = Path(result.file_path).stem + extension = Path(result.file_path).suffix + + # Search for exact match and files with numeric suffixes + for enqueued_file in enqueued_dir.glob( + f"{base_name}*{extension}" + ): + # Additional security check: ensure enqueued file is within enqueued directory + safe_enqueued_path = ( + validate_file_path_security( + enqueued_file.name, enqueued_dir + ) + ) + if safe_enqueued_path is not None: + try: + enqueued_file.unlink() + deleted_files.append(enqueued_file.name) + logger.info( + f"Successfully deleted enqueued file: {enqueued_file.name}" + ) + except Exception as enqueued_error: + file_error_msg = f"Failed to delete enqueued file {enqueued_file.name}: {str(enqueued_error)}" + logger.debug(file_error_msg) + async with pipeline_status_lock: + pipeline_status[ + "latest_message" + ] = file_error_msg + pipeline_status[ + "history_messages" + ].append(file_error_msg) + else: + security_msg = f"Security violation: Unsafe enqueued file path detected - {enqueued_file.name}" + logger.warning(security_msg) + + if deleted_files == []: + file_error_msg = f"File deletion skipped, missing or unsafe file: {result.file_path}" + logger.warning(file_error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = file_error_msg + pipeline_status["history_messages"].append( + file_error_msg + ) + + except Exception as file_error: + file_error_msg = f"Failed to delete file {result.file_path}: {str(file_error)}" + logger.error(file_error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = file_error_msg + pipeline_status["history_messages"].append( + file_error_msg + ) + elif delete_file: + no_file_msg = ( + f"File deletion skipped, missing file path: {doc_id}" + ) + logger.warning(no_file_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = no_file_msg + pipeline_status["history_messages"].append(no_file_msg) + else: + failed_deletions.append(doc_id) + error_msg = f"Failed to delete {i}/{total_docs}: {doc_id}[{file_path}] - {result.message}" + logger.error(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append(error_msg) + + except Exception as e: + failed_deletions.append(doc_id) + error_msg = f"Error deleting document {i}/{total_docs}: {doc_id}[{file_path}] - {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append(error_msg) + + except Exception as e: + error_msg = f"Critical error during batch deletion: {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + async with pipeline_status_lock: + pipeline_status["history_messages"].append(error_msg) + finally: + # Final summary and check for pending requests + async with pipeline_status_lock: + pipeline_status["busy"] = False + pipeline_status["pending_requests"] = False # Reset pending requests flag + pipeline_status["cancellation_requested"] = ( + False # Always reset cancellation flag + ) + completion_msg = f"Deletion completed: {len(successful_deletions)} successful, {len(failed_deletions)} failed" + pipeline_status["latest_message"] = completion_msg + pipeline_status["history_messages"].append(completion_msg) + + # Check if there are pending document indexing requests + has_pending_request = pipeline_status.get("request_pending", False) + + # If there are pending requests, start document processing pipeline + if has_pending_request: + try: + logger.info( + "Processing pending document indexing requests after deletion" + ) + await rag.apipeline_process_enqueue_documents() + except Exception as e: + logger.error(f"Error processing pending documents after deletion: {e}") + + +def create_document_routes( + rag: LightRAG, doc_manager: DocumentManager, api_key: Optional[str] = None +): + # Create combined auth dependency for document routes + combined_auth = get_combined_auth_dependency(api_key) + + @router.post( + "/scan", response_model=ScanResponse, dependencies=[Depends(combined_auth)] + ) + async def scan_for_new_documents(background_tasks: BackgroundTasks): + """ + Trigger the scanning process for new documents. + + This endpoint initiates a background task that scans the input directory for new documents + and processes them. If a scanning process is already running, it returns a status indicating + that fact. + + Returns: + ScanResponse: A response object containing the scanning status and track_id + """ + # Generate track_id with "scan" prefix for scanning operation + track_id = generate_track_id("scan") + + # Start the scanning process in the background with track_id + background_tasks.add_task(run_scanning_process, rag, doc_manager, track_id) + return ScanResponse( + status="scanning_started", + message="Scanning process has been initiated in the background", + track_id=track_id, + ) + + @router.post( + "/upload", response_model=InsertResponse, dependencies=[Depends(combined_auth)] + ) + async def upload_to_input_dir( + background_tasks: BackgroundTasks, file: UploadFile = File(...) + ): + """ + Upload a file to the input directory and index it. + + This API endpoint accepts a file through an HTTP POST request, checks if the + uploaded file is of a supported type, saves it in the specified input directory, + indexes it for retrieval, and returns a success status with relevant details. + + Args: + background_tasks: FastAPI BackgroundTasks for async processing + file (UploadFile): The file to be uploaded. It must have an allowed extension. + + Returns: + InsertResponse: A response object containing the upload status and a message. + status can be "success", "duplicated", or error is thrown. + + Raises: + HTTPException: If the file type is not supported (400) or other errors occur (500). + """ + try: + # Sanitize filename to prevent Path Traversal attacks + safe_filename = sanitize_filename(file.filename, doc_manager.input_dir) + + if not doc_manager.is_supported_file(safe_filename): + raise HTTPException( + status_code=400, + detail=f"Unsupported file type. Supported types: {doc_manager.supported_extensions}", + ) + + # Check if filename already exists in doc_status storage + existing_doc_data = await rag.doc_status.get_doc_by_file_path(safe_filename) + if existing_doc_data: + # Get document status information for error message + status = existing_doc_data.get("status", "unknown") + return InsertResponse( + status="duplicated", + message=f"File '{safe_filename}' already exists in document storage (Status: {status}).", + track_id="", + ) + + file_path = doc_manager.input_dir / safe_filename + # Check if file already exists in file system + if file_path.exists(): + return InsertResponse( + status="duplicated", + message=f"File '{safe_filename}' already exists in the input directory.", + track_id="", + ) + + with open(file_path, "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + + track_id = generate_track_id("upload") + + # Add to background tasks and get track_id + background_tasks.add_task(pipeline_index_file, rag, file_path, track_id) + + return InsertResponse( + status="success", + message=f"File '{safe_filename}' uploaded successfully. Processing will continue in background.", + track_id=track_id, + ) + + except Exception as e: + logger.error(f"Error /documents/upload: {file.filename}: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/text", response_model=InsertResponse, dependencies=[Depends(combined_auth)] + ) + async def insert_text( + request: InsertTextRequest, background_tasks: BackgroundTasks + ): + """ + Insert text into the RAG system. + + This endpoint allows you to insert text data into the RAG system for later retrieval + and use in generating responses. + + Args: + request (InsertTextRequest): The request body containing the text to be inserted. + background_tasks: FastAPI BackgroundTasks for async processing + + Returns: + InsertResponse: A response object containing the status of the operation. + + Raises: + HTTPException: If an error occurs during text processing (500). + """ + try: + # Check if file_source already exists in doc_status storage + if ( + request.file_source + and request.file_source.strip() + and request.file_source != "unknown_source" + ): + existing_doc_data = await rag.doc_status.get_doc_by_file_path( + request.file_source + ) + if existing_doc_data: + # Get document status information for error message + status = existing_doc_data.get("status", "unknown") + return InsertResponse( + status="duplicated", + message=f"File source '{request.file_source}' already exists in document storage (Status: {status}).", + track_id="", + ) + + # Generate track_id for text insertion + track_id = generate_track_id("insert") + + background_tasks.add_task( + pipeline_index_texts, + rag, + [request.text], + file_sources=[request.file_source], + track_id=track_id, + ) + + return InsertResponse( + status="success", + message="Text successfully received. Processing will continue in background.", + track_id=track_id, + ) + except Exception as e: + logger.error(f"Error /documents/text: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/texts", + response_model=InsertResponse, + dependencies=[Depends(combined_auth)], + ) + async def insert_texts( + request: InsertTextsRequest, background_tasks: BackgroundTasks + ): + """ + Insert multiple texts into the RAG system. + + This endpoint allows you to insert multiple text entries into the RAG system + in a single request. + + Args: + request (InsertTextsRequest): The request body containing the list of texts. + background_tasks: FastAPI BackgroundTasks for async processing + + Returns: + InsertResponse: A response object containing the status of the operation. + + Raises: + HTTPException: If an error occurs during text processing (500). + """ + try: + # Check if any file_sources already exist in doc_status storage + if request.file_sources: + for file_source in request.file_sources: + if ( + file_source + and file_source.strip() + and file_source != "unknown_source" + ): + existing_doc_data = await rag.doc_status.get_doc_by_file_path( + file_source + ) + if existing_doc_data: + # Get document status information for error message + status = existing_doc_data.get("status", "unknown") + return InsertResponse( + status="duplicated", + message=f"File source '{file_source}' already exists in document storage (Status: {status}).", + track_id="", + ) + + # Generate track_id for texts insertion + track_id = generate_track_id("insert") + + background_tasks.add_task( + pipeline_index_texts, + rag, + request.texts, + file_sources=request.file_sources, + track_id=track_id, + ) + + return InsertResponse( + status="success", + message="Texts successfully received. Processing will continue in background.", + track_id=track_id, + ) + except Exception as e: + logger.error(f"Error /documents/texts: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.delete( + "", response_model=ClearDocumentsResponse, dependencies=[Depends(combined_auth)] + ) + async def clear_documents(): + """ + Clear all documents from the RAG system. + + This endpoint deletes all documents, entities, relationships, and files from the system. + It uses the storage drop methods to properly clean up all data and removes all files + from the input directory. + + Returns: + ClearDocumentsResponse: A response object containing the status and message. + - status="success": All documents and files were successfully cleared. + - status="partial_success": Document clear job exit with some errors. + - status="busy": Operation could not be completed because the pipeline is busy. + - status="fail": All storage drop operations failed, with message + - message: Detailed information about the operation results, including counts + of deleted files and any errors encountered. + + Raises: + HTTPException: Raised when a serious error occurs during the clearing process, + with status code 500 and error details in the detail field. + """ + from lightrag.kg.shared_storage import ( + get_namespace_data, + get_pipeline_status_lock, + ) + + # Get pipeline status and lock + pipeline_status = await get_namespace_data("pipeline_status") + pipeline_status_lock = get_pipeline_status_lock() + + # Check and set status with lock + async with pipeline_status_lock: + if pipeline_status.get("busy", False): + return ClearDocumentsResponse( + status="busy", + message="Cannot clear documents while pipeline is busy", + ) + # Set busy to true + pipeline_status.update( + { + "busy": True, + "job_name": "Clearing Documents", + "job_start": datetime.now().isoformat(), + "docs": 0, + "batchs": 0, + "cur_batch": 0, + "request_pending": False, # Clear any previous request + "latest_message": "Starting document clearing process", + } + ) + # Cleaning history_messages without breaking it as a shared list object + del pipeline_status["history_messages"][:] + pipeline_status["history_messages"].append( + "Starting document clearing process" + ) + + try: + # Use drop method to clear all data + drop_tasks = [] + storages = [ + rag.text_chunks, + rag.full_docs, + rag.full_entities, + rag.full_relations, + rag.entity_chunks, + rag.relation_chunks, + rag.entities_vdb, + rag.relationships_vdb, + rag.chunks_vdb, + rag.chunk_entity_relation_graph, + rag.doc_status, + ] + + # Log storage drop start + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append( + "Starting to drop storage components" + ) + + for storage in storages: + if storage is not None: + drop_tasks.append(storage.drop()) + + # Wait for all drop tasks to complete + drop_results = await asyncio.gather(*drop_tasks, return_exceptions=True) + + # Check for errors and log results + errors = [] + storage_success_count = 0 + storage_error_count = 0 + + for i, result in enumerate(drop_results): + storage_name = storages[i].__class__.__name__ + if isinstance(result, Exception): + error_msg = f"Error dropping {storage_name}: {str(result)}" + errors.append(error_msg) + logger.error(error_msg) + storage_error_count += 1 + else: + namespace = storages[i].namespace + workspace = storages[i].workspace + logger.info( + f"Successfully dropped {storage_name}: {workspace}/{namespace}" + ) + storage_success_count += 1 + + # Log storage drop results + if "history_messages" in pipeline_status: + if storage_error_count > 0: + pipeline_status["history_messages"].append( + f"Dropped {storage_success_count} storage components with {storage_error_count} errors" + ) + else: + pipeline_status["history_messages"].append( + f"Successfully dropped all {storage_success_count} storage components" + ) + + # If all storage operations failed, return error status and don't proceed with file deletion + if storage_success_count == 0 and storage_error_count > 0: + error_message = "All storage drop operations failed. Aborting document clearing process." + logger.error(error_message) + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append(error_message) + return ClearDocumentsResponse(status="fail", message=error_message) + + # Log file deletion start + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append( + "Starting to delete files in input directory" + ) + + # Delete only files in the current directory, preserve files in subdirectories + deleted_files_count = 0 + file_errors_count = 0 + + for file_path in doc_manager.input_dir.glob("*"): + if file_path.is_file(): + try: + file_path.unlink() + deleted_files_count += 1 + except Exception as e: + logger.error(f"Error deleting file {file_path}: {str(e)}") + file_errors_count += 1 + + # Log file deletion results + if "history_messages" in pipeline_status: + if file_errors_count > 0: + pipeline_status["history_messages"].append( + f"Deleted {deleted_files_count} files with {file_errors_count} errors" + ) + errors.append(f"Failed to delete {file_errors_count} files") + else: + pipeline_status["history_messages"].append( + f"Successfully deleted {deleted_files_count} files" + ) + + # Prepare final result message + final_message = "" + if errors: + final_message = f"Cleared documents with some errors. Deleted {deleted_files_count} files." + status = "partial_success" + else: + final_message = f"All documents cleared successfully. Deleted {deleted_files_count} files." + status = "success" + + # Log final result + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append(final_message) + + # Return response based on results + return ClearDocumentsResponse(status=status, message=final_message) + except Exception as e: + error_msg = f"Error clearing documents: {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append(error_msg) + raise HTTPException(status_code=500, detail=str(e)) + finally: + # Reset busy status after completion + async with pipeline_status_lock: + pipeline_status["busy"] = False + completion_msg = "Document clearing process completed" + pipeline_status["latest_message"] = completion_msg + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].append(completion_msg) + + @router.get( + "/pipeline_status", + dependencies=[Depends(combined_auth)], + response_model=PipelineStatusResponse, + ) + async def get_pipeline_status() -> PipelineStatusResponse: + """ + Get the current status of the document indexing pipeline. + + This endpoint returns information about the current state of the document processing pipeline, + including the processing status, progress information, and history messages. + + Returns: + PipelineStatusResponse: A response object containing: + - autoscanned (bool): Whether auto-scan has started + - busy (bool): Whether the pipeline is currently busy + - job_name (str): Current job name (e.g., indexing files/indexing texts) + - job_start (str, optional): Job start time as ISO format string + - docs (int): Total number of documents to be indexed + - batchs (int): Number of batches for processing documents + - cur_batch (int): Current processing batch + - request_pending (bool): Flag for pending request for processing + - latest_message (str): Latest message from pipeline processing + - history_messages (List[str], optional): List of history messages (limited to latest 1000 entries, + with truncation message if more than 1000 messages exist) + + Raises: + HTTPException: If an error occurs while retrieving pipeline status (500) + """ + try: + from lightrag.kg.shared_storage import ( + get_namespace_data, + get_all_update_flags_status, + ) + + pipeline_status = await get_namespace_data("pipeline_status") + + # Get update flags status for all namespaces + update_status = await get_all_update_flags_status() + + # Convert MutableBoolean objects to regular boolean values + processed_update_status = {} + for namespace, flags in update_status.items(): + processed_flags = [] + for flag in flags: + # Handle both multiprocess and single process cases + if hasattr(flag, "value"): + processed_flags.append(bool(flag.value)) + else: + processed_flags.append(bool(flag)) + processed_update_status[namespace] = processed_flags + + # Convert to regular dict if it's a Manager.dict + status_dict = dict(pipeline_status) + + # Add processed update_status to the status dictionary + status_dict["update_status"] = processed_update_status + + # Convert history_messages to a regular list if it's a Manager.list + # and limit to latest 1000 entries with truncation message if needed + if "history_messages" in status_dict: + history_list = list(status_dict["history_messages"]) + total_count = len(history_list) + + if total_count > 1000: + # Calculate truncated message count + truncated_count = total_count - 1000 + + # Take only the latest 1000 messages + latest_messages = history_list[-1000:] + + # Add truncation message at the beginning + truncation_message = ( + f"[Truncated history messages: {truncated_count}/{total_count}]" + ) + status_dict["history_messages"] = [ + truncation_message + ] + latest_messages + else: + # No truncation needed, return all messages + status_dict["history_messages"] = history_list + + # Ensure job_start is properly formatted as a string with timezone information + if "job_start" in status_dict and status_dict["job_start"]: + # Use format_datetime to ensure consistent formatting + status_dict["job_start"] = format_datetime(status_dict["job_start"]) + + return PipelineStatusResponse(**status_dict) + except Exception as e: + logger.error(f"Error getting pipeline status: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + # TODO: Deprecated, use /documents/paginated instead + @router.get( + "", response_model=DocsStatusesResponse, dependencies=[Depends(combined_auth)] + ) + async def documents() -> DocsStatusesResponse: + """ + Get the status of all documents in the system. This endpoint is deprecated; use /documents/paginated instead. + To prevent excessive resource consumption, a maximum of 1,000 records is returned. + + This endpoint retrieves the current status of all documents, grouped by their + processing status (PENDING, PROCESSING, PREPROCESSED, PROCESSED, FAILED). The results are + limited to 1000 total documents with fair distribution across all statuses. + + Returns: + DocsStatusesResponse: A response object containing a dictionary where keys are + DocStatus values and values are lists of DocStatusResponse + objects representing documents in each status category. + Maximum 1000 documents total will be returned. + + Raises: + HTTPException: If an error occurs while retrieving document statuses (500). + """ + try: + statuses = ( + DocStatus.PENDING, + DocStatus.PROCESSING, + DocStatus.PREPROCESSED, + DocStatus.PROCESSED, + DocStatus.FAILED, + ) + + tasks = [rag.get_docs_by_status(status) for status in statuses] + results: List[Dict[str, DocProcessingStatus]] = await asyncio.gather(*tasks) + + response = DocsStatusesResponse() + total_documents = 0 + max_documents = 1000 + + # Convert results to lists for easier processing + status_documents = [] + for idx, result in enumerate(results): + status = statuses[idx] + docs_list = [] + for doc_id, doc_status in result.items(): + docs_list.append((doc_id, doc_status)) + status_documents.append((status, docs_list)) + + # Fair distribution: round-robin across statuses + status_indices = [0] * len( + status_documents + ) # Track current index for each status + current_status_idx = 0 + + while total_documents < max_documents: + # Check if we have any documents left to process + has_remaining = False + for status_idx, (status, docs_list) in enumerate(status_documents): + if status_indices[status_idx] < len(docs_list): + has_remaining = True + break + + if not has_remaining: + break + + # Try to get a document from the current status + status, docs_list = status_documents[current_status_idx] + current_index = status_indices[current_status_idx] + + if current_index < len(docs_list): + doc_id, doc_status = docs_list[current_index] + + if status not in response.statuses: + response.statuses[status] = [] + + response.statuses[status].append( + DocStatusResponse( + id=doc_id, + content_summary=doc_status.content_summary, + content_length=doc_status.content_length, + status=doc_status.status, + created_at=format_datetime(doc_status.created_at), + updated_at=format_datetime(doc_status.updated_at), + track_id=doc_status.track_id, + chunks_count=doc_status.chunks_count, + error_msg=doc_status.error_msg, + metadata=doc_status.metadata, + file_path=doc_status.file_path, + ) + ) + + status_indices[current_status_idx] += 1 + total_documents += 1 + + # Move to next status (round-robin) + current_status_idx = (current_status_idx + 1) % len(status_documents) + + return response + except Exception as e: + logger.error(f"Error GET /documents: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + class DeleteDocByIdResponse(BaseModel): + """Response model for single document deletion operation.""" + + status: Literal["deletion_started", "busy", "not_allowed"] = Field( + description="Status of the deletion operation" + ) + message: str = Field(description="Message describing the operation result") + doc_id: str = Field(description="The ID of the document to delete") + + @router.delete( + "/delete_document", + response_model=DeleteDocByIdResponse, + dependencies=[Depends(combined_auth)], + summary="Delete a document and all its associated data by its ID.", + ) + async def delete_document( + delete_request: DeleteDocRequest, + background_tasks: BackgroundTasks, + ) -> DeleteDocByIdResponse: + """ + Delete documents and all their associated data by their IDs using background processing. + + Deletes specific documents and all their associated data, including their status, + text chunks, vector embeddings, and any related graph data. When requested, + cached LLM extraction responses are removed after graph deletion/rebuild completes. + The deletion process runs in the background to avoid blocking the client connection. + + This operation is irreversible and will interact with the pipeline status. + + Args: + delete_request (DeleteDocRequest): The request containing the document IDs and deletion options. + background_tasks: FastAPI BackgroundTasks for async processing + + Returns: + DeleteDocByIdResponse: The result of the deletion operation. + - status="deletion_started": The document deletion has been initiated in the background. + - status="busy": The pipeline is busy with another operation. + + Raises: + HTTPException: + - 500: If an unexpected internal error occurs during initialization. + """ + doc_ids = delete_request.doc_ids + + try: + from lightrag.kg.shared_storage import get_namespace_data + + pipeline_status = await get_namespace_data("pipeline_status") + + # Check if pipeline is busy + if pipeline_status.get("busy", False): + return DeleteDocByIdResponse( + status="busy", + message="Cannot delete documents while pipeline is busy", + doc_id=", ".join(doc_ids), + ) + + # Add deletion task to background tasks + background_tasks.add_task( + background_delete_documents, + rag, + doc_manager, + doc_ids, + delete_request.delete_file, + delete_request.delete_llm_cache, + ) + + return DeleteDocByIdResponse( + status="deletion_started", + message=f"Document deletion for {len(doc_ids)} documents has been initiated. Processing will continue in background.", + doc_id=", ".join(doc_ids), + ) + + except Exception as e: + error_msg = f"Error initiating document deletion for {delete_request.doc_ids}: {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=error_msg) + + @router.post( + "/clear_cache", + response_model=ClearCacheResponse, + dependencies=[Depends(combined_auth)], + ) + async def clear_cache(request: ClearCacheRequest): + """ + Clear all cache data from the LLM response cache storage. + + This endpoint clears all cached LLM responses regardless of mode. + The request body is accepted for API compatibility but is ignored. + + Args: + request (ClearCacheRequest): The request body (ignored for compatibility). + + Returns: + ClearCacheResponse: A response object containing the status and message. + + Raises: + HTTPException: If an error occurs during cache clearing (500). + """ + try: + # Call the aclear_cache method (no modes parameter) + await rag.aclear_cache() + + # Prepare success message + message = "Successfully cleared all cache" + + return ClearCacheResponse(status="success", message=message) + except Exception as e: + logger.error(f"Error clearing cache: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.delete( + "/delete_entity", + response_model=DeletionResult, + dependencies=[Depends(combined_auth)], + ) + async def delete_entity(request: DeleteEntityRequest): + """ + Delete an entity and all its relationships from the knowledge graph. + + Args: + request (DeleteEntityRequest): The request body containing the entity name. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + + Raises: + HTTPException: If the entity is not found (404) or an error occurs (500). + """ + try: + result = await rag.adelete_by_entity(entity_name=request.entity_name) + if result.status == "not_found": + raise HTTPException(status_code=404, detail=result.message) + if result.status == "fail": + raise HTTPException(status_code=500, detail=result.message) + # Set doc_id to empty string since this is an entity operation, not document + result.doc_id = "" + return result + except HTTPException: + raise + except Exception as e: + error_msg = f"Error deleting entity '{request.entity_name}': {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=error_msg) + + @router.delete( + "/delete_relation", + response_model=DeletionResult, + dependencies=[Depends(combined_auth)], + ) + async def delete_relation(request: DeleteRelationRequest): + """ + Delete a relationship between two entities from the knowledge graph. + + Args: + request (DeleteRelationRequest): The request body containing the source and target entity names. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + + Raises: + HTTPException: If the relation is not found (404) or an error occurs (500). + """ + try: + result = await rag.adelete_by_relation( + source_entity=request.source_entity, + target_entity=request.target_entity, + ) + if result.status == "not_found": + raise HTTPException(status_code=404, detail=result.message) + if result.status == "fail": + raise HTTPException(status_code=500, detail=result.message) + # Set doc_id to empty string since this is a relation operation, not document + result.doc_id = "" + return result + except HTTPException: + raise + except Exception as e: + error_msg = f"Error deleting relation from '{request.source_entity}' to '{request.target_entity}': {str(e)}" + logger.error(error_msg) + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=error_msg) + + @router.get( + "/track_status/{track_id}", + response_model=TrackStatusResponse, + dependencies=[Depends(combined_auth)], + ) + async def get_track_status(track_id: str) -> TrackStatusResponse: + """ + Get the processing status of documents by tracking ID. + + This endpoint retrieves all documents associated with a specific tracking ID, + allowing users to monitor the processing progress of their uploaded files or inserted texts. + + Args: + track_id (str): The tracking ID returned from upload, text, or texts endpoints + + Returns: + TrackStatusResponse: A response object containing: + - track_id: The tracking ID + - documents: List of documents associated with this track_id + - total_count: Total number of documents for this track_id + + Raises: + HTTPException: If track_id is invalid (400) or an error occurs (500). + """ + try: + # Validate track_id + if not track_id or not track_id.strip(): + raise HTTPException(status_code=400, detail="Track ID cannot be empty") + + track_id = track_id.strip() + + # Get documents by track_id + docs_by_track_id = await rag.aget_docs_by_track_id(track_id) + + # Convert to response format + documents = [] + status_summary = {} + + for doc_id, doc_status in docs_by_track_id.items(): + documents.append( + DocStatusResponse( + id=doc_id, + content_summary=doc_status.content_summary, + content_length=doc_status.content_length, + status=doc_status.status, + created_at=format_datetime(doc_status.created_at), + updated_at=format_datetime(doc_status.updated_at), + track_id=doc_status.track_id, + chunks_count=doc_status.chunks_count, + error_msg=doc_status.error_msg, + metadata=doc_status.metadata, + file_path=doc_status.file_path, + ) + ) + + # Build status summary + # Handle both DocStatus enum and string cases for robust deserialization + status_key = str(doc_status.status) + status_summary[status_key] = status_summary.get(status_key, 0) + 1 + + return TrackStatusResponse( + track_id=track_id, + documents=documents, + total_count=len(documents), + status_summary=status_summary, + ) + + except HTTPException: + raise + except Exception as e: + logger.error(f"Error getting track status for {track_id}: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/paginated", + response_model=PaginatedDocsResponse, + dependencies=[Depends(combined_auth)], + ) + async def get_documents_paginated( + request: DocumentsRequest, + ) -> PaginatedDocsResponse: + """ + Get documents with pagination support. + + This endpoint retrieves documents with pagination, filtering, and sorting capabilities. + It provides better performance for large document collections by loading only the + requested page of data. + + Args: + request (DocumentsRequest): The request body containing pagination parameters + + Returns: + PaginatedDocsResponse: A response object containing: + - documents: List of documents for the current page + - pagination: Pagination information (page, total_count, etc.) + - status_counts: Count of documents by status for all documents + + Raises: + HTTPException: If an error occurs while retrieving documents (500). + """ + try: + # Get paginated documents and status counts in parallel + docs_task = rag.doc_status.get_docs_paginated( + status_filter=request.status_filter, + page=request.page, + page_size=request.page_size, + sort_field=request.sort_field, + sort_direction=request.sort_direction, + ) + status_counts_task = rag.doc_status.get_all_status_counts() + + # Execute both queries in parallel + (documents_with_ids, total_count), status_counts = await asyncio.gather( + docs_task, status_counts_task + ) + + # Convert documents to response format + doc_responses = [] + for doc_id, doc in documents_with_ids: + doc_responses.append( + DocStatusResponse( + id=doc_id, + content_summary=doc.content_summary, + content_length=doc.content_length, + status=doc.status, + created_at=format_datetime(doc.created_at), + updated_at=format_datetime(doc.updated_at), + track_id=doc.track_id, + chunks_count=doc.chunks_count, + error_msg=doc.error_msg, + metadata=doc.metadata, + file_path=doc.file_path, + ) + ) + + # Calculate pagination info + total_pages = (total_count + request.page_size - 1) // request.page_size + has_next = request.page < total_pages + has_prev = request.page > 1 + + pagination = PaginationInfo( + page=request.page, + page_size=request.page_size, + total_count=total_count, + total_pages=total_pages, + has_next=has_next, + has_prev=has_prev, + ) + + return PaginatedDocsResponse( + documents=doc_responses, + pagination=pagination, + status_counts=status_counts, + ) + + except Exception as e: + logger.error(f"Error getting paginated documents: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.get( + "/status_counts", + response_model=StatusCountsResponse, + dependencies=[Depends(combined_auth)], + ) + async def get_document_status_counts() -> StatusCountsResponse: + """ + Get counts of documents by status. + + This endpoint retrieves the count of documents in each processing status + (PENDING, PROCESSING, PROCESSED, FAILED) for all documents in the system. + + Returns: + StatusCountsResponse: A response object containing status counts + + Raises: + HTTPException: If an error occurs while retrieving status counts (500). + """ + try: + status_counts = await rag.doc_status.get_all_status_counts() + return StatusCountsResponse(status_counts=status_counts) + + except Exception as e: + logger.error(f"Error getting document status counts: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/reprocess_failed", + response_model=ReprocessResponse, + dependencies=[Depends(combined_auth)], + ) + async def reprocess_failed_documents(background_tasks: BackgroundTasks): + """ + Reprocess failed and pending documents. + + This endpoint triggers the document processing pipeline which automatically + picks up and reprocesses documents in the following statuses: + - FAILED: Documents that failed during previous processing attempts + - PENDING: Documents waiting to be processed + - PROCESSING: Documents with abnormally terminated processing (e.g., server crashes) + + This is useful for recovering from server crashes, network errors, LLM service + outages, or other temporary failures that caused document processing to fail. + + The processing happens in the background and can be monitored using the + returned track_id or by checking the pipeline status. + + Returns: + ReprocessResponse: Response with status, message, and track_id + + Raises: + HTTPException: If an error occurs while initiating reprocessing (500). + """ + try: + # Generate track_id with "retry" prefix for retry operation + track_id = generate_track_id("retry") + + # Start the reprocessing in the background + background_tasks.add_task(rag.apipeline_process_enqueue_documents) + logger.info( + f"Reprocessing of failed documents initiated with track_id: {track_id}" + ) + + return ReprocessResponse( + status="reprocessing_started", + message="Reprocessing of failed documents has been initiated in background", + track_id=track_id, + ) + + except Exception as e: + logger.error(f"Error initiating reprocessing of failed documents: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/cancel_pipeline", + response_model=CancelPipelineResponse, + dependencies=[Depends(combined_auth)], + ) + async def cancel_pipeline(): + """ + Request cancellation of the currently running pipeline. + + This endpoint sets a cancellation flag in the pipeline status. The pipeline will: + 1. Check this flag at key processing points + 2. Stop processing new documents + 3. Cancel all running document processing tasks + 4. Mark all PROCESSING documents as FAILED with reason "User cancelled" + + The cancellation is graceful and ensures data consistency. Documents that have + completed processing will remain in PROCESSED status. + + Returns: + CancelPipelineResponse: Response with status and message + - status="cancellation_requested": Cancellation flag has been set + - status="not_busy": Pipeline is not currently running + + Raises: + HTTPException: If an error occurs while setting cancellation flag (500). + """ + try: + from lightrag.kg.shared_storage import ( + get_namespace_data, + get_pipeline_status_lock, + ) + + pipeline_status = await get_namespace_data("pipeline_status") + pipeline_status_lock = get_pipeline_status_lock() + + async with pipeline_status_lock: + if not pipeline_status.get("busy", False): + return CancelPipelineResponse( + status="not_busy", + message="Pipeline is not currently running. No cancellation needed.", + ) + + # Set cancellation flag + pipeline_status["cancellation_requested"] = True + cancel_msg = "Pipeline cancellation requested by user" + logger.info(cancel_msg) + pipeline_status["latest_message"] = cancel_msg + pipeline_status["history_messages"].append(cancel_msg) + + return CancelPipelineResponse( + status="cancellation_requested", + message="Pipeline cancellation has been requested. Documents will be marked as FAILED.", + ) + + except Exception as e: + logger.error(f"Error requesting pipeline cancellation: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException(status_code=500, detail=str(e)) + + return router diff --git a/LightRAG/lightrag/api/routers/graph_routes.py b/LightRAG/lightrag/api/routers/graph_routes.py new file mode 100644 index 00000000..e892ff01 --- /dev/null +++ b/LightRAG/lightrag/api/routers/graph_routes.py @@ -0,0 +1,688 @@ +""" +This module contains all graph-related routes for the LightRAG API. +""" + +from typing import Optional, Dict, Any +import traceback +from fastapi import APIRouter, Depends, Query, HTTPException +from pydantic import BaseModel, Field + +from lightrag.utils import logger +from ..utils_api import get_combined_auth_dependency + +router = APIRouter(tags=["graph"]) + + +class EntityUpdateRequest(BaseModel): + entity_name: str + updated_data: Dict[str, Any] + allow_rename: bool = False + allow_merge: bool = False + + +class RelationUpdateRequest(BaseModel): + source_id: str + target_id: str + updated_data: Dict[str, Any] + + +class EntityMergeRequest(BaseModel): + entities_to_change: list[str] = Field( + ..., + description="List of entity names to be merged and deleted. These are typically duplicate or misspelled entities.", + min_length=1, + examples=[["Elon Msk", "Ellon Musk"]], + ) + entity_to_change_into: str = Field( + ..., + description="Target entity name that will receive all relationships from the source entities. This entity will be preserved.", + min_length=1, + examples=["Elon Musk"], + ) + + +class EntityCreateRequest(BaseModel): + entity_name: str = Field( + ..., + description="Unique name for the new entity", + min_length=1, + examples=["Tesla"], + ) + entity_data: Dict[str, Any] = Field( + ..., + description="Dictionary containing entity properties. Common fields include 'description' and 'entity_type'.", + examples=[ + { + "description": "Electric vehicle manufacturer", + "entity_type": "ORGANIZATION", + } + ], + ) + + +class RelationCreateRequest(BaseModel): + source_entity: str = Field( + ..., + description="Name of the source entity. This entity must already exist in the knowledge graph.", + min_length=1, + examples=["Elon Musk"], + ) + target_entity: str = Field( + ..., + description="Name of the target entity. This entity must already exist in the knowledge graph.", + min_length=1, + examples=["Tesla"], + ) + relation_data: Dict[str, Any] = Field( + ..., + description="Dictionary containing relationship properties. Common fields include 'description', 'keywords', and 'weight'.", + examples=[ + { + "description": "Elon Musk is the CEO of Tesla", + "keywords": "CEO, founder", + "weight": 1.0, + } + ], + ) + + +def create_graph_routes(rag, api_key: Optional[str] = None): + combined_auth = get_combined_auth_dependency(api_key) + + @router.get("/graph/label/list", dependencies=[Depends(combined_auth)]) + async def get_graph_labels(): + """ + Get all graph labels + + Returns: + List[str]: List of graph labels + """ + try: + return await rag.get_graph_labels() + except Exception as e: + logger.error(f"Error getting graph labels: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error getting graph labels: {str(e)}" + ) + + @router.get("/graph/label/popular", dependencies=[Depends(combined_auth)]) + async def get_popular_labels( + limit: int = Query( + 300, description="Maximum number of popular labels to return", ge=1, le=1000 + ), + ): + """ + Get popular labels by node degree (most connected entities) + + Args: + limit (int): Maximum number of labels to return (default: 300, max: 1000) + + Returns: + List[str]: List of popular labels sorted by degree (highest first) + """ + try: + return await rag.chunk_entity_relation_graph.get_popular_labels(limit) + except Exception as e: + logger.error(f"Error getting popular labels: {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error getting popular labels: {str(e)}" + ) + + @router.get("/graph/label/search", dependencies=[Depends(combined_auth)]) + async def search_labels( + q: str = Query(..., description="Search query string"), + limit: int = Query( + 50, description="Maximum number of search results to return", ge=1, le=100 + ), + ): + """ + Search labels with fuzzy matching + + Args: + q (str): Search query string + limit (int): Maximum number of results to return (default: 50, max: 100) + + Returns: + List[str]: List of matching labels sorted by relevance + """ + try: + return await rag.chunk_entity_relation_graph.search_labels(q, limit) + except Exception as e: + logger.error(f"Error searching labels with query '{q}': {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error searching labels: {str(e)}" + ) + + @router.get("/graphs", dependencies=[Depends(combined_auth)]) + async def get_knowledge_graph( + label: str = Query(..., description="Label to get knowledge graph for"), + max_depth: int = Query(3, description="Maximum depth of graph", ge=1), + max_nodes: int = Query(1000, description="Maximum nodes to return", ge=1), + ): + """ + Retrieve a connected subgraph of nodes where the label includes the specified label. + When reducing the number of nodes, the prioritization criteria are as follows: + 1. Hops(path) to the staring node take precedence + 2. Followed by the degree of the nodes + + Args: + label (str): Label of the starting node + max_depth (int, optional): Maximum depth of the subgraph,Defaults to 3 + max_nodes: Maxiumu nodes to return + + Returns: + Dict[str, List[str]]: Knowledge graph for label + """ + try: + # Log the label parameter to check for leading spaces + logger.debug( + f"get_knowledge_graph called with label: '{label}' (length: {len(label)}, repr: {repr(label)})" + ) + + return await rag.get_knowledge_graph( + node_label=label, + max_depth=max_depth, + max_nodes=max_nodes, + ) + except Exception as e: + logger.error(f"Error getting knowledge graph for label '{label}': {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error getting knowledge graph: {str(e)}" + ) + + @router.get("/graph/entity/exists", dependencies=[Depends(combined_auth)]) + async def check_entity_exists( + name: str = Query(..., description="Entity name to check"), + ): + """ + Check if an entity with the given name exists in the knowledge graph + + Args: + name (str): Name of the entity to check + + Returns: + Dict[str, bool]: Dictionary with 'exists' key indicating if entity exists + """ + try: + exists = await rag.chunk_entity_relation_graph.has_node(name) + return {"exists": exists} + except Exception as e: + logger.error(f"Error checking entity existence for '{name}': {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error checking entity existence: {str(e)}" + ) + + @router.post("/graph/entity/edit", dependencies=[Depends(combined_auth)]) + async def update_entity(request: EntityUpdateRequest): + """ + Update an entity's properties in the knowledge graph + + This endpoint allows updating entity properties, including renaming entities. + When renaming to an existing entity name, the behavior depends on allow_merge: + + Args: + request (EntityUpdateRequest): Request containing: + - entity_name (str): Name of the entity to update + - updated_data (Dict[str, Any]): Dictionary of properties to update + - allow_rename (bool): Whether to allow entity renaming (default: False) + - allow_merge (bool): Whether to merge into existing entity when renaming + causes name conflict (default: False) + + Returns: + Dict with the following structure: + { + "status": "success", + "message": "Entity updated successfully" | "Entity merged successfully into 'target_name'", + "data": { + "entity_name": str, # Final entity name + "description": str, # Entity description + "entity_type": str, # Entity type + "source_id": str, # Source chunk IDs + ... # Other entity properties + }, + "operation_summary": { + "merged": bool, # Whether entity was merged into another + "merge_status": str, # "success" | "failed" | "not_attempted" + "merge_error": str | None, # Error message if merge failed + "operation_status": str, # "success" | "partial_success" | "failure" + "target_entity": str | None, # Target entity name if renaming/merging + "final_entity": str, # Final entity name after operation + "renamed": bool # Whether entity was renamed + } + } + + operation_status values explained: + - "success": All operations completed successfully + * For simple updates: entity properties updated + * For renames: entity renamed successfully + * For merges: non-name updates applied AND merge completed + + - "partial_success": Update succeeded but merge failed + * Non-name property updates were applied successfully + * Merge operation failed (entity not merged) + * Original entity still exists with updated properties + * Use merge_error for failure details + + - "failure": Operation failed completely + * If merge_status == "failed": Merge attempted but both update and merge failed + * If merge_status == "not_attempted": Regular update failed + * No changes were applied to the entity + + merge_status values explained: + - "success": Entity successfully merged into target entity + - "failed": Merge operation was attempted but failed + - "not_attempted": No merge was attempted (normal update/rename) + + Behavior when renaming to an existing entity: + - If allow_merge=False: Raises ValueError with 400 status (default behavior) + - If allow_merge=True: Automatically merges the source entity into the existing target entity, + preserving all relationships and applying non-name updates first + + Example Request (simple update): + POST /graph/entity/edit + { + "entity_name": "Tesla", + "updated_data": {"description": "Updated description"}, + "allow_rename": false, + "allow_merge": false + } + + Example Response (simple update success): + { + "status": "success", + "message": "Entity updated successfully", + "data": { ... }, + "operation_summary": { + "merged": false, + "merge_status": "not_attempted", + "merge_error": null, + "operation_status": "success", + "target_entity": null, + "final_entity": "Tesla", + "renamed": false + } + } + + Example Request (rename with auto-merge): + POST /graph/entity/edit + { + "entity_name": "Elon Msk", + "updated_data": { + "entity_name": "Elon Musk", + "description": "Corrected description" + }, + "allow_rename": true, + "allow_merge": true + } + + Example Response (merge success): + { + "status": "success", + "message": "Entity merged successfully into 'Elon Musk'", + "data": { ... }, + "operation_summary": { + "merged": true, + "merge_status": "success", + "merge_error": null, + "operation_status": "success", + "target_entity": "Elon Musk", + "final_entity": "Elon Musk", + "renamed": true + } + } + + Example Response (partial success - update succeeded but merge failed): + { + "status": "success", + "message": "Entity updated successfully", + "data": { ... }, # Data reflects updated "Elon Msk" entity + "operation_summary": { + "merged": false, + "merge_status": "failed", + "merge_error": "Target entity locked by another operation", + "operation_status": "partial_success", + "target_entity": "Elon Musk", + "final_entity": "Elon Msk", # Original entity still exists + "renamed": true + } + } + """ + try: + result = await rag.aedit_entity( + entity_name=request.entity_name, + updated_data=request.updated_data, + allow_rename=request.allow_rename, + allow_merge=request.allow_merge, + ) + + # Extract operation_summary from result, with fallback for backward compatibility + operation_summary = result.get( + "operation_summary", + { + "merged": False, + "merge_status": "not_attempted", + "merge_error": None, + "operation_status": "success", + "target_entity": None, + "final_entity": request.updated_data.get( + "entity_name", request.entity_name + ), + "renamed": request.updated_data.get( + "entity_name", request.entity_name + ) + != request.entity_name, + }, + ) + + # Separate entity data from operation_summary for clean response + entity_data = dict(result) + entity_data.pop("operation_summary", None) + + # Generate appropriate response message based on merge status + response_message = ( + f"Entity merged successfully into '{operation_summary['final_entity']}'" + if operation_summary.get("merged") + else "Entity updated successfully" + ) + return { + "status": "success", + "message": response_message, + "data": entity_data, + "operation_summary": operation_summary, + } + except ValueError as ve: + logger.error( + f"Validation error updating entity '{request.entity_name}': {str(ve)}" + ) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(f"Error updating entity '{request.entity_name}': {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error updating entity: {str(e)}" + ) + + @router.post("/graph/relation/edit", dependencies=[Depends(combined_auth)]) + async def update_relation(request: RelationUpdateRequest): + """Update a relation's properties in the knowledge graph + + Args: + request (RelationUpdateRequest): Request containing source ID, target ID and updated data + + Returns: + Dict: Updated relation information + """ + try: + result = await rag.aedit_relation( + source_entity=request.source_id, + target_entity=request.target_id, + updated_data=request.updated_data, + ) + return { + "status": "success", + "message": "Relation updated successfully", + "data": result, + } + except ValueError as ve: + logger.error( + f"Validation error updating relation between '{request.source_id}' and '{request.target_id}': {str(ve)}" + ) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error( + f"Error updating relation between '{request.source_id}' and '{request.target_id}': {str(e)}" + ) + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error updating relation: {str(e)}" + ) + + @router.post("/graph/entity/create", dependencies=[Depends(combined_auth)]) + async def create_entity(request: EntityCreateRequest): + """ + Create a new entity in the knowledge graph + + This endpoint creates a new entity node in the knowledge graph with the specified + properties. The system automatically generates vector embeddings for the entity + to enable semantic search and retrieval. + + Request Body: + entity_name (str): Unique name identifier for the entity + entity_data (dict): Entity properties including: + - description (str): Textual description of the entity + - entity_type (str): Category/type of the entity (e.g., PERSON, ORGANIZATION, LOCATION) + - source_id (str): Related chunk_id from which the description originates + - Additional custom properties as needed + + Response Schema: + { + "status": "success", + "message": "Entity 'Tesla' created successfully", + "data": { + "entity_name": "Tesla", + "description": "Electric vehicle manufacturer", + "entity_type": "ORGANIZATION", + "source_id": "chunk-123chunk-456" + ... (other entity properties) + } + } + + HTTP Status Codes: + 200: Entity created successfully + 400: Invalid request (e.g., missing required fields, duplicate entity) + 500: Internal server error + + Example Request: + POST /graph/entity/create + { + "entity_name": "Tesla", + "entity_data": { + "description": "Electric vehicle manufacturer", + "entity_type": "ORGANIZATION" + } + } + """ + try: + # Use the proper acreate_entity method which handles: + # - Graph lock for concurrency + # - Vector embedding creation in entities_vdb + # - Metadata population and defaults + # - Index consistency via _edit_entity_done + result = await rag.acreate_entity( + entity_name=request.entity_name, + entity_data=request.entity_data, + ) + + return { + "status": "success", + "message": f"Entity '{request.entity_name}' created successfully", + "data": result, + } + except ValueError as ve: + logger.error( + f"Validation error creating entity '{request.entity_name}': {str(ve)}" + ) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error(f"Error creating entity '{request.entity_name}': {str(e)}") + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error creating entity: {str(e)}" + ) + + @router.post("/graph/relation/create", dependencies=[Depends(combined_auth)]) + async def create_relation(request: RelationCreateRequest): + """ + Create a new relationship between two entities in the knowledge graph + + This endpoint establishes an undirected relationship between two existing entities. + The provided source/target order is accepted for convenience, but the backend + stored edge is undirected and may be returned with the entities swapped. + Both entities must already exist in the knowledge graph. The system automatically + generates vector embeddings for the relationship to enable semantic search and graph traversal. + + Prerequisites: + - Both source_entity and target_entity must exist in the knowledge graph + - Use /graph/entity/create to create entities first if they don't exist + + Request Body: + source_entity (str): Name of the source entity (relationship origin) + target_entity (str): Name of the target entity (relationship destination) + relation_data (dict): Relationship properties including: + - description (str): Textual description of the relationship + - keywords (str): Comma-separated keywords describing the relationship type + - source_id (str): Related chunk_id from which the description originates + - weight (float): Relationship strength/importance (default: 1.0) + - Additional custom properties as needed + + Response Schema: + { + "status": "success", + "message": "Relation created successfully between 'Elon Musk' and 'Tesla'", + "data": { + "src_id": "Elon Musk", + "tgt_id": "Tesla", + "description": "Elon Musk is the CEO of Tesla", + "keywords": "CEO, founder", + "source_id": "chunk-123chunk-456" + "weight": 1.0, + ... (other relationship properties) + } + } + + HTTP Status Codes: + 200: Relationship created successfully + 400: Invalid request (e.g., missing entities, invalid data, duplicate relationship) + 500: Internal server error + + Example Request: + POST /graph/relation/create + { + "source_entity": "Elon Musk", + "target_entity": "Tesla", + "relation_data": { + "description": "Elon Musk is the CEO of Tesla", + "keywords": "CEO, founder", + "weight": 1.0 + } + } + """ + try: + # Use the proper acreate_relation method which handles: + # - Graph lock for concurrency + # - Entity existence validation + # - Duplicate relation checks + # - Vector embedding creation in relationships_vdb + # - Index consistency via _edit_relation_done + result = await rag.acreate_relation( + source_entity=request.source_entity, + target_entity=request.target_entity, + relation_data=request.relation_data, + ) + + return { + "status": "success", + "message": f"Relation created successfully between '{request.source_entity}' and '{request.target_entity}'", + "data": result, + } + except ValueError as ve: + logger.error( + f"Validation error creating relation between '{request.source_entity}' and '{request.target_entity}': {str(ve)}" + ) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error( + f"Error creating relation between '{request.source_entity}' and '{request.target_entity}': {str(e)}" + ) + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error creating relation: {str(e)}" + ) + + @router.post("/graph/entities/merge", dependencies=[Depends(combined_auth)]) + async def merge_entities(request: EntityMergeRequest): + """ + Merge multiple entities into a single entity, preserving all relationships + + This endpoint consolidates duplicate or misspelled entities while preserving the entire + graph structure. It's particularly useful for cleaning up knowledge graphs after document + processing or correcting entity name variations. + + What the Merge Operation Does: + 1. Deletes the specified source entities from the knowledge graph + 2. Transfers all relationships from source entities to the target entity + 3. Intelligently merges duplicate relationships (if multiple sources have the same relationship) + 4. Updates vector embeddings for accurate retrieval and search + 5. Preserves the complete graph structure and connectivity + 6. Maintains relationship properties and metadata + + Use Cases: + - Fixing spelling errors in entity names (e.g., "Elon Msk" -> "Elon Musk") + - Consolidating duplicate entities discovered after document processing + - Merging name variations (e.g., "NY", "New York", "New York City") + - Cleaning up the knowledge graph for better query performance + - Standardizing entity names across the knowledge base + + Request Body: + entities_to_change (list[str]): List of entity names to be merged and deleted + entity_to_change_into (str): Target entity that will receive all relationships + + Response Schema: + { + "status": "success", + "message": "Successfully merged 2 entities into 'Elon Musk'", + "data": { + "merged_entity": "Elon Musk", + "deleted_entities": ["Elon Msk", "Ellon Musk"], + "relationships_transferred": 15, + ... (merge operation details) + } + } + + HTTP Status Codes: + 200: Entities merged successfully + 400: Invalid request (e.g., empty entity list, target entity doesn't exist) + 500: Internal server error + + Example Request: + POST /graph/entities/merge + { + "entities_to_change": ["Elon Msk", "Ellon Musk"], + "entity_to_change_into": "Elon Musk" + } + + Note: + - The target entity (entity_to_change_into) must exist in the knowledge graph + - Source entities will be permanently deleted after the merge + - This operation cannot be undone, so verify entity names before merging + """ + try: + result = await rag.amerge_entities( + source_entities=request.entities_to_change, + target_entity=request.entity_to_change_into, + ) + return { + "status": "success", + "message": f"Successfully merged {len(request.entities_to_change)} entities into '{request.entity_to_change_into}'", + "data": result, + } + except ValueError as ve: + logger.error( + f"Validation error merging entities {request.entities_to_change} into '{request.entity_to_change_into}': {str(ve)}" + ) + raise HTTPException(status_code=400, detail=str(ve)) + except Exception as e: + logger.error( + f"Error merging entities {request.entities_to_change} into '{request.entity_to_change_into}': {str(e)}" + ) + logger.error(traceback.format_exc()) + raise HTTPException( + status_code=500, detail=f"Error merging entities: {str(e)}" + ) + + return router diff --git a/LightRAG/lightrag/api/routers/ollama_api.py b/LightRAG/lightrag/api/routers/ollama_api.py new file mode 100644 index 00000000..f9353dda --- /dev/null +++ b/LightRAG/lightrag/api/routers/ollama_api.py @@ -0,0 +1,734 @@ +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel +from typing import List, Dict, Any, Optional, Type +from lightrag.utils import logger +import time +import json +import re +from enum import Enum +from fastapi.responses import StreamingResponse +import asyncio +from ascii_colors import trace_exception +from lightrag import LightRAG, QueryParam +from lightrag.utils import TiktokenTokenizer +from lightrag.api.utils_api import get_combined_auth_dependency +from fastapi import Depends + + +# query mode according to query prefix (bypass is not LightRAG quer mode) +class SearchMode(str, Enum): + naive = "naive" + local = "local" + global_ = "global" + hybrid = "hybrid" + mix = "mix" + bypass = "bypass" + context = "context" + + +class OllamaMessage(BaseModel): + role: str + content: str + images: Optional[List[str]] = None + + +class OllamaChatRequest(BaseModel): + model: str + messages: List[OllamaMessage] + stream: bool = True + options: Optional[Dict[str, Any]] = None + system: Optional[str] = None + + +class OllamaChatResponse(BaseModel): + model: str + created_at: str + message: OllamaMessage + done: bool + + +class OllamaGenerateRequest(BaseModel): + model: str + prompt: str + system: Optional[str] = None + stream: bool = False + options: Optional[Dict[str, Any]] = None + + +class OllamaGenerateResponse(BaseModel): + model: str + created_at: str + response: str + done: bool + context: Optional[List[int]] + total_duration: Optional[int] + load_duration: Optional[int] + prompt_eval_count: Optional[int] + prompt_eval_duration: Optional[int] + eval_count: Optional[int] + eval_duration: Optional[int] + + +class OllamaVersionResponse(BaseModel): + version: str + + +class OllamaModelDetails(BaseModel): + parent_model: str + format: str + family: str + families: List[str] + parameter_size: str + quantization_level: str + + +class OllamaModel(BaseModel): + name: str + model: str + size: int + digest: str + modified_at: str + details: OllamaModelDetails + + +class OllamaTagResponse(BaseModel): + models: List[OllamaModel] + + +class OllamaRunningModelDetails(BaseModel): + parent_model: str + format: str + family: str + families: List[str] + parameter_size: str + quantization_level: str + + +class OllamaRunningModel(BaseModel): + name: str + model: str + size: int + digest: str + details: OllamaRunningModelDetails + expires_at: str + size_vram: int + + +class OllamaPsResponse(BaseModel): + models: List[OllamaRunningModel] + + +async def parse_request_body( + request: Request, model_class: Type[BaseModel] +) -> BaseModel: + """ + Parse request body based on Content-Type header. + Supports both application/json and application/octet-stream. + + Args: + request: The FastAPI Request object + model_class: The Pydantic model class to parse the request into + + Returns: + An instance of the provided model_class + """ + content_type = request.headers.get("content-type", "").lower() + + try: + if content_type.startswith("application/json"): + # FastAPI already handles JSON parsing for us + body = await request.json() + elif content_type.startswith("application/octet-stream"): + # Manually parse octet-stream as JSON + body_bytes = await request.body() + body = json.loads(body_bytes.decode("utf-8")) + else: + # Try to parse as JSON for any other content type + body_bytes = await request.body() + body = json.loads(body_bytes.decode("utf-8")) + + # Create an instance of the model + return model_class(**body) + except json.JSONDecodeError: + raise HTTPException(status_code=400, detail="Invalid JSON in request body") + except Exception as e: + raise HTTPException( + status_code=400, detail=f"Error parsing request body: {str(e)}" + ) + + +def estimate_tokens(text: str) -> int: + """Estimate the number of tokens in text using tiktoken""" + tokens = TiktokenTokenizer().encode(text) + return len(tokens) + + +def parse_query_mode(query: str) -> tuple[str, SearchMode, bool, Optional[str]]: + """Parse query prefix to determine search mode + Returns tuple of (cleaned_query, search_mode, only_need_context, user_prompt) + + Examples: + - "/local[use mermaid format for diagrams] query string" -> (cleaned_query, SearchMode.local, False, "use mermaid format for diagrams") + - "/[use mermaid format for diagrams] query string" -> (cleaned_query, SearchMode.hybrid, False, "use mermaid format for diagrams") + - "/local query string" -> (cleaned_query, SearchMode.local, False, None) + """ + # Initialize user_prompt as None + user_prompt = None + + # First check if there's a bracket format for user prompt + bracket_pattern = r"^/([a-z]*)\[(.*?)\](.*)" + bracket_match = re.match(bracket_pattern, query) + + if bracket_match: + mode_prefix = bracket_match.group(1) + user_prompt = bracket_match.group(2) + remaining_query = bracket_match.group(3).lstrip() + + # Reconstruct query, removing the bracket part + query = f"/{mode_prefix} {remaining_query}".strip() + + # Unified handling of mode and only_need_context determination + mode_map = { + "/local ": (SearchMode.local, False), + "/global ": ( + SearchMode.global_, + False, + ), # global_ is used because 'global' is a Python keyword + "/naive ": (SearchMode.naive, False), + "/hybrid ": (SearchMode.hybrid, False), + "/mix ": (SearchMode.mix, False), + "/bypass ": (SearchMode.bypass, False), + "/context": ( + SearchMode.mix, + True, + ), + "/localcontext": (SearchMode.local, True), + "/globalcontext": (SearchMode.global_, True), + "/hybridcontext": (SearchMode.hybrid, True), + "/naivecontext": (SearchMode.naive, True), + "/mixcontext": (SearchMode.mix, True), + } + + for prefix, (mode, only_need_context) in mode_map.items(): + if query.startswith(prefix): + # After removing prefix and leading spaces + cleaned_query = query[len(prefix) :].lstrip() + return cleaned_query, mode, only_need_context, user_prompt + + return query, SearchMode.mix, False, user_prompt + + +class OllamaAPI: + def __init__(self, rag: LightRAG, top_k: int = 60, api_key: Optional[str] = None): + self.rag = rag + self.ollama_server_infos = rag.ollama_server_infos + self.top_k = top_k + self.api_key = api_key + self.router = APIRouter(tags=["ollama"]) + self.setup_routes() + + def setup_routes(self): + # Create combined auth dependency for Ollama API routes + combined_auth = get_combined_auth_dependency(self.api_key) + + @self.router.get("/version", dependencies=[Depends(combined_auth)]) + async def get_version(): + """Get Ollama version information""" + return OllamaVersionResponse(version="0.9.3") + + @self.router.get("/tags", dependencies=[Depends(combined_auth)]) + async def get_tags(): + """Return available models acting as an Ollama server""" + return OllamaTagResponse( + models=[ + { + "name": self.ollama_server_infos.LIGHTRAG_MODEL, + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "modified_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "size": self.ollama_server_infos.LIGHTRAG_SIZE, + "digest": self.ollama_server_infos.LIGHTRAG_DIGEST, + "details": { + "parent_model": "", + "format": "gguf", + "family": self.ollama_server_infos.LIGHTRAG_NAME, + "families": [self.ollama_server_infos.LIGHTRAG_NAME], + "parameter_size": "13B", + "quantization_level": "Q4_0", + }, + } + ] + ) + + @self.router.get("/ps", dependencies=[Depends(combined_auth)]) + async def get_running_models(): + """List Running Models - returns currently running models""" + return OllamaPsResponse( + models=[ + { + "name": self.ollama_server_infos.LIGHTRAG_MODEL, + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "size": self.ollama_server_infos.LIGHTRAG_SIZE, + "digest": self.ollama_server_infos.LIGHTRAG_DIGEST, + "details": { + "parent_model": "", + "format": "gguf", + "family": "llama", + "families": ["llama"], + "parameter_size": "7.2B", + "quantization_level": "Q4_0", + }, + "expires_at": "2050-12-31T14:38:31.83753-07:00", + "size_vram": self.ollama_server_infos.LIGHTRAG_SIZE, + } + ] + ) + + @self.router.post( + "/generate", dependencies=[Depends(combined_auth)], include_in_schema=True + ) + async def generate(raw_request: Request): + """Handle generate completion requests acting as an Ollama model + For compatibility purpose, the request is not processed by LightRAG, + and will be handled by underlying LLM model. + Supports both application/json and application/octet-stream Content-Types. + """ + try: + # Parse the request body manually + request = await parse_request_body(raw_request, OllamaGenerateRequest) + + query = request.prompt + start_time = time.time_ns() + prompt_tokens = estimate_tokens(query) + + if request.system: + self.rag.llm_model_kwargs["system_prompt"] = request.system + + if request.stream: + response = await self.rag.llm_model_func( + query, stream=True, **self.rag.llm_model_kwargs + ) + + async def stream_generator(): + try: + first_chunk_time = None + last_chunk_time = time.time_ns() + total_response = "" + + # Ensure response is an async generator + if isinstance(response, str): + # If it's a string, send in two parts + first_chunk_time = start_time + last_chunk_time = time.time_ns() + total_response = response + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": response, + "done": False, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + + completion_tokens = estimate_tokens(total_response) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": "", + "done": True, + "done_reason": "stop", + "context": [], + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + else: + try: + async for chunk in response: + if chunk: + if first_chunk_time is None: + first_chunk_time = time.time_ns() + + last_chunk_time = time.time_ns() + + total_response += chunk + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": chunk, + "done": False, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + except (asyncio.CancelledError, Exception) as e: + error_msg = str(e) + if isinstance(e, asyncio.CancelledError): + error_msg = "Stream was cancelled by server" + else: + error_msg = f"Provider error: {error_msg}" + + logger.error(f"Stream error: {error_msg}") + + # Send error message to client + error_data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": f"\n\nError: {error_msg}", + "error": f"\n\nError: {error_msg}", + "done": False, + } + yield f"{json.dumps(error_data, ensure_ascii=False)}\n" + + # Send final message to close the stream + final_data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": "", + "done": True, + } + yield f"{json.dumps(final_data, ensure_ascii=False)}\n" + return + if first_chunk_time is None: + first_chunk_time = start_time + completion_tokens = estimate_tokens(total_response) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": "", + "done": True, + "done_reason": "stop", + "context": [], + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + return + + except Exception as e: + trace_exception(e) + raise + + return StreamingResponse( + stream_generator(), + media_type="application/x-ndjson", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Content-Type": "application/x-ndjson", + "X-Accel-Buffering": "no", # Ensure proper handling of streaming responses in Nginx proxy + }, + ) + else: + first_chunk_time = time.time_ns() + response_text = await self.rag.llm_model_func( + query, stream=False, **self.rag.llm_model_kwargs + ) + last_chunk_time = time.time_ns() + + if not response_text: + response_text = "No response generated" + + completion_tokens = estimate_tokens(str(response_text)) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + return { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "response": str(response_text), + "done": True, + "done_reason": "stop", + "context": [], + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + except Exception as e: + trace_exception(e) + raise HTTPException(status_code=500, detail=str(e)) + + @self.router.post( + "/chat", dependencies=[Depends(combined_auth)], include_in_schema=True + ) + async def chat(raw_request: Request): + """Process chat completion requests by acting as an Ollama model. + Routes user queries through LightRAG by selecting query mode based on query prefix. + Detects and forwards OpenWebUI session-related requests (for meta data generation task) directly to LLM. + Supports both application/json and application/octet-stream Content-Types. + """ + try: + # Parse the request body manually + request = await parse_request_body(raw_request, OllamaChatRequest) + + # Get all messages + messages = request.messages + if not messages: + raise HTTPException(status_code=400, detail="No messages provided") + + # Validate that the last message is from a user + if messages[-1].role != "user": + raise HTTPException( + status_code=400, detail="Last message must be from user role" + ) + + # Get the last message as query and previous messages as history + query = messages[-1].content + # Convert OllamaMessage objects to dictionaries + conversation_history = [ + {"role": msg.role, "content": msg.content} for msg in messages[:-1] + ] + + # Check for query prefix + cleaned_query, mode, only_need_context, user_prompt = parse_query_mode( + query + ) + + start_time = time.time_ns() + prompt_tokens = estimate_tokens(cleaned_query) + + param_dict = { + "mode": mode.value, + "stream": request.stream, + "only_need_context": only_need_context, + "conversation_history": conversation_history, + "top_k": self.top_k, + } + + # Add user_prompt to param_dict + if user_prompt is not None: + param_dict["user_prompt"] = user_prompt + + query_param = QueryParam(**param_dict) + + if request.stream: + # Determine if the request is prefix with "/bypass" + if mode == SearchMode.bypass: + if request.system: + self.rag.llm_model_kwargs["system_prompt"] = request.system + response = await self.rag.llm_model_func( + cleaned_query, + stream=True, + history_messages=conversation_history, + **self.rag.llm_model_kwargs, + ) + else: + response = await self.rag.aquery( + cleaned_query, param=query_param + ) + + async def stream_generator(): + try: + first_chunk_time = None + last_chunk_time = time.time_ns() + total_response = "" + + # Ensure response is an async generator + if isinstance(response, str): + # If it's a string, send in two parts + first_chunk_time = start_time + last_chunk_time = time.time_ns() + total_response = response + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": response, + "images": None, + }, + "done": False, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + + completion_tokens = estimate_tokens(total_response) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": "", + "images": None, + }, + "done_reason": "stop", + "done": True, + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + else: + try: + async for chunk in response: + if chunk: + if first_chunk_time is None: + first_chunk_time = time.time_ns() + + last_chunk_time = time.time_ns() + + total_response += chunk + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": chunk, + "images": None, + }, + "done": False, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + except (asyncio.CancelledError, Exception) as e: + error_msg = str(e) + if isinstance(e, asyncio.CancelledError): + error_msg = "Stream was cancelled by server" + else: + error_msg = f"Provider error: {error_msg}" + + logger.error(f"Stream error: {error_msg}") + + # Send error message to client + error_data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": f"\n\nError: {error_msg}", + "images": None, + }, + "error": f"\n\nError: {error_msg}", + "done": False, + } + yield f"{json.dumps(error_data, ensure_ascii=False)}\n" + + # Send final message to close the stream + final_data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": "", + "images": None, + }, + "done": True, + } + yield f"{json.dumps(final_data, ensure_ascii=False)}\n" + return + + if first_chunk_time is None: + first_chunk_time = start_time + completion_tokens = estimate_tokens(total_response) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + data = { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": "", + "images": None, + }, + "done_reason": "stop", + "done": True, + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + yield f"{json.dumps(data, ensure_ascii=False)}\n" + + except Exception as e: + trace_exception(e) + raise + + return StreamingResponse( + stream_generator(), + media_type="application/x-ndjson", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Content-Type": "application/x-ndjson", + "X-Accel-Buffering": "no", # Ensure proper handling of streaming responses in Nginx proxy + }, + ) + else: + first_chunk_time = time.time_ns() + + # Determine if the request is prefix with "/bypass" or from Open WebUI's session title and session keyword generation task + match_result = re.search( + r"\n\nUSER:", cleaned_query, re.MULTILINE + ) + if match_result or mode == SearchMode.bypass: + if request.system: + self.rag.llm_model_kwargs["system_prompt"] = request.system + + response_text = await self.rag.llm_model_func( + cleaned_query, + stream=False, + history_messages=conversation_history, + **self.rag.llm_model_kwargs, + ) + else: + response_text = await self.rag.aquery( + cleaned_query, param=query_param + ) + + last_chunk_time = time.time_ns() + + if not response_text: + response_text = "No response generated" + + completion_tokens = estimate_tokens(str(response_text)) + total_time = last_chunk_time - start_time + prompt_eval_time = first_chunk_time - start_time + eval_time = last_chunk_time - first_chunk_time + + return { + "model": self.ollama_server_infos.LIGHTRAG_MODEL, + "created_at": self.ollama_server_infos.LIGHTRAG_CREATED_AT, + "message": { + "role": "assistant", + "content": str(response_text), + "images": None, + }, + "done_reason": "stop", + "done": True, + "total_duration": total_time, + "load_duration": 0, + "prompt_eval_count": prompt_tokens, + "prompt_eval_duration": prompt_eval_time, + "eval_count": completion_tokens, + "eval_duration": eval_time, + } + except Exception as e: + trace_exception(e) + raise HTTPException(status_code=500, detail=str(e)) diff --git a/LightRAG/lightrag/api/routers/query_routes.py b/LightRAG/lightrag/api/routers/query_routes.py new file mode 100644 index 00000000..d163ca5a --- /dev/null +++ b/LightRAG/lightrag/api/routers/query_routes.py @@ -0,0 +1,1162 @@ +""" +This module contains all query-related routes for the LightRAG API. +""" + +import json +import logging +from typing import Any, Dict, List, Literal, Optional + +from fastapi import APIRouter, Depends, HTTPException +from lightrag.base import QueryParam +from lightrag.api.utils_api import get_combined_auth_dependency +from pydantic import BaseModel, Field, field_validator + +from ascii_colors import trace_exception + +router = APIRouter(tags=["query"]) + + +class QueryRequest(BaseModel): + query: str = Field( + min_length=3, + description="The query text", + ) + + mode: Literal["local", "global", "hybrid", "naive", "mix", "bypass"] = Field( + default="mix", + description="Query mode", + ) + + only_need_context: Optional[bool] = Field( + default=None, + description="If True, only returns the retrieved context without generating a response.", + ) + + only_need_prompt: Optional[bool] = Field( + default=None, + description="If True, only returns the generated prompt without producing a response.", + ) + + response_type: Optional[str] = Field( + min_length=1, + default=None, + description="Defines the response format. Examples: 'Multiple Paragraphs', 'Single Paragraph', 'Bullet Points'.", + ) + + top_k: Optional[int] = Field( + ge=1, + default=None, + description="Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode.", + ) + + chunk_top_k: Optional[int] = Field( + ge=1, + default=None, + description="Number of text chunks to retrieve initially from vector search and keep after reranking.", + ) + + max_entity_tokens: Optional[int] = Field( + default=None, + description="Maximum number of tokens allocated for entity context in unified token control system.", + ge=1, + ) + + max_relation_tokens: Optional[int] = Field( + default=None, + description="Maximum number of tokens allocated for relationship context in unified token control system.", + ge=1, + ) + + max_total_tokens: Optional[int] = Field( + default=None, + description="Maximum total tokens budget for the entire query context (entities + relations + chunks + system prompt).", + ge=1, + ) + + hl_keywords: list[str] = Field( + default_factory=list, + description="List of high-level keywords to prioritize in retrieval. Leave empty to use the LLM to generate the keywords.", + ) + + ll_keywords: list[str] = Field( + default_factory=list, + description="List of low-level keywords to refine retrieval focus. Leave empty to use the LLM to generate the keywords.", + ) + + conversation_history: Optional[List[Dict[str, Any]]] = Field( + default=None, + description="Stores past conversation history to maintain context. Format: [{'role': 'user/assistant', 'content': 'message'}].", + ) + + user_prompt: Optional[str] = Field( + default=None, + description="User-provided prompt for the query. If provided, this will be used instead of the default value from prompt template.", + ) + + enable_rerank: Optional[bool] = Field( + default=None, + description="Enable reranking for retrieved text chunks. If True but no rerank model is configured, a warning will be issued. Default is True.", + ) + + include_references: Optional[bool] = Field( + default=True, + description="If True, includes reference list in responses. Affects /query and /query/stream endpoints. /query/data always includes references.", + ) + + include_chunk_content: Optional[bool] = Field( + default=False, + description="If True, includes actual chunk text content in references. Only applies when include_references=True. Useful for evaluation and debugging.", + ) + + stream: Optional[bool] = Field( + default=True, + description="If True, enables streaming output for real-time responses. Only affects /query/stream endpoint.", + ) + + @field_validator("query", mode="after") + @classmethod + def query_strip_after(cls, query: str) -> str: + return query.strip() + + @field_validator("conversation_history", mode="after") + @classmethod + def conversation_history_role_check( + cls, conversation_history: List[Dict[str, Any]] | None + ) -> List[Dict[str, Any]] | None: + if conversation_history is None: + return None + for msg in conversation_history: + if "role" not in msg: + raise ValueError("Each message must have a 'role' key.") + if not isinstance(msg["role"], str) or not msg["role"].strip(): + raise ValueError("Each message 'role' must be a non-empty string.") + return conversation_history + + def to_query_params(self, is_stream: bool) -> "QueryParam": + """Converts a QueryRequest instance into a QueryParam instance.""" + # Use Pydantic's `.model_dump(exclude_none=True)` to remove None values automatically + # Exclude API-level parameters that don't belong in QueryParam + request_data = self.model_dump( + exclude_none=True, exclude={"query", "include_chunk_content"} + ) + + # Ensure `mode` and `stream` are set explicitly + param = QueryParam(**request_data) + param.stream = is_stream + return param + + +class ReferenceItem(BaseModel): + """A single reference item in query responses.""" + + reference_id: str = Field(description="Unique reference identifier") + file_path: str = Field(description="Path to the source file") + content: Optional[List[str]] = Field( + default=None, + description="List of chunk contents from this file (only present when include_chunk_content=True)", + ) + + +class QueryResponse(BaseModel): + response: str = Field( + description="The generated response", + ) + references: Optional[List[ReferenceItem]] = Field( + default=None, + description="Reference list (Disabled when include_references=False, /query/data always includes references.)", + ) + + +class QueryDataResponse(BaseModel): + status: str = Field(description="Query execution status") + message: str = Field(description="Status message") + data: Dict[str, Any] = Field( + description="Query result data containing entities, relationships, chunks, and references" + ) + metadata: Dict[str, Any] = Field( + description="Query metadata including mode, keywords, and processing information" + ) + + +class StreamChunkResponse(BaseModel): + """Response model for streaming chunks in NDJSON format""" + + references: Optional[List[Dict[str, str]]] = Field( + default=None, + description="Reference list (only in first chunk when include_references=True)", + ) + response: Optional[str] = Field( + default=None, description="Response content chunk or complete response" + ) + error: Optional[str] = Field( + default=None, description="Error message if processing fails" + ) + + +def create_query_routes(rag, api_key: Optional[str] = None, top_k: int = 60): + combined_auth = get_combined_auth_dependency(api_key) + + @router.post( + "/query", + response_model=QueryResponse, + dependencies=[Depends(combined_auth)], + responses={ + 200: { + "description": "Successful RAG query response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "string", + "description": "The generated response from the RAG system", + }, + "references": { + "type": "array", + "items": { + "type": "object", + "properties": { + "reference_id": {"type": "string"}, + "file_path": {"type": "string"}, + "content": { + "type": "array", + "items": {"type": "string"}, + "description": "List of chunk contents from this file (only included when include_chunk_content=True)", + }, + }, + }, + "description": "Reference list (only included when include_references=True)", + }, + }, + "required": ["response"], + }, + "examples": { + "with_references": { + "summary": "Response with references", + "description": "Example response when include_references=True", + "value": { + "response": "Artificial Intelligence (AI) is a branch of computer science that aims to create intelligent machines capable of performing tasks that typically require human intelligence, such as learning, reasoning, and problem-solving.", + "references": [ + { + "reference_id": "1", + "file_path": "/documents/ai_overview.pdf", + }, + { + "reference_id": "2", + "file_path": "/documents/machine_learning.txt", + }, + ], + }, + }, + "with_chunk_content": { + "summary": "Response with chunk content", + "description": "Example response when include_references=True and include_chunk_content=True. Note: content is an array of chunks from the same file.", + "value": { + "response": "Artificial Intelligence (AI) is a branch of computer science that aims to create intelligent machines capable of performing tasks that typically require human intelligence, such as learning, reasoning, and problem-solving.", + "references": [ + { + "reference_id": "1", + "file_path": "/documents/ai_overview.pdf", + "content": [ + "Artificial Intelligence (AI) represents a transformative field in computer science focused on creating systems that can perform tasks requiring human-like intelligence. These tasks include learning from experience, understanding natural language, recognizing patterns, and making decisions.", + "AI systems can be categorized into narrow AI, which is designed for specific tasks, and general AI, which aims to match human cognitive abilities across a wide range of domains.", + ], + }, + { + "reference_id": "2", + "file_path": "/documents/machine_learning.txt", + "content": [ + "Machine learning is a subset of AI that enables computers to learn and improve from experience without being explicitly programmed. It focuses on the development of algorithms that can access data and use it to learn for themselves." + ], + }, + ], + }, + }, + "without_references": { + "summary": "Response without references", + "description": "Example response when include_references=False", + "value": { + "response": "Artificial Intelligence (AI) is a branch of computer science that aims to create intelligent machines capable of performing tasks that typically require human intelligence, such as learning, reasoning, and problem-solving." + }, + }, + "different_modes": { + "summary": "Different query modes", + "description": "Examples of responses from different query modes", + "value": { + "local_mode": "Focuses on specific entities and their relationships", + "global_mode": "Provides broader context from relationship patterns", + "hybrid_mode": "Combines local and global approaches", + "naive_mode": "Simple vector similarity search", + "mix_mode": "Integrates knowledge graph and vector retrieval", + }, + }, + }, + } + }, + }, + 400: { + "description": "Bad Request - Invalid input parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Query text must be at least 3 characters long" + }, + } + }, + }, + 500: { + "description": "Internal Server Error - Query processing failed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Failed to process query: LLM service unavailable" + }, + } + }, + }, + }, + ) + async def query_text(request: QueryRequest): + """ + Comprehensive RAG query endpoint with non-streaming response. Parameter "stream" is ignored. + + This endpoint performs Retrieval-Augmented Generation (RAG) queries using various modes + to provide intelligent responses based on your knowledge base. + + **Query Modes:** + - **local**: Focuses on specific entities and their direct relationships + - **global**: Analyzes broader patterns and relationships across the knowledge graph + - **hybrid**: Combines local and global approaches for comprehensive results + - **naive**: Simple vector similarity search without knowledge graph + - **mix**: Integrates knowledge graph retrieval with vector search (recommended) + - **bypass**: Direct LLM query without knowledge retrieval + + conversation_history parameteris sent to LLM only, does not affect retrieval results. + + **Usage Examples:** + + Basic query: + ```json + { + "query": "What is machine learning?", + "mode": "mix" + } + ``` + + Bypass initial LLM call by providing high-level and low-level keywords: + ```json + { + "query": "What is Retrieval-Augmented-Generation?", + "hl_keywords": ["machine learning", "information retrieval", "natural language processing"], + "ll_keywords": ["retrieval augmented generation", "RAG", "knowledge base"], + "mode": "mix" + } + ``` + + Advanced query with references: + ```json + { + "query": "Explain neural networks", + "mode": "hybrid", + "include_references": true, + "response_type": "Multiple Paragraphs", + "top_k": 10 + } + ``` + + Conversation with history: + ```json + { + "query": "Can you give me more details?", + "conversation_history": [ + {"role": "user", "content": "What is AI?"}, + {"role": "assistant", "content": "AI is artificial intelligence..."} + ] + } + ``` + + Args: + request (QueryRequest): The request object containing query parameters: + - **query**: The question or prompt to process (min 3 characters) + - **mode**: Query strategy - "mix" recommended for best results + - **include_references**: Whether to include source citations + - **response_type**: Format preference (e.g., "Multiple Paragraphs") + - **top_k**: Number of top entities/relations to retrieve + - **conversation_history**: Previous dialogue context + - **max_total_tokens**: Token budget for the entire response + + Returns: + QueryResponse: JSON response containing: + - **response**: The generated answer to your query + - **references**: Source citations (if include_references=True) + + Raises: + HTTPException: + - 400: Invalid input parameters (e.g., query too short) + - 500: Internal processing error (e.g., LLM service unavailable) + """ + try: + param = request.to_query_params( + False + ) # Ensure stream=False for non-streaming endpoint + # Force stream=False for /query endpoint regardless of include_references setting + param.stream = False + + # Unified approach: always use aquery_llm for both cases + result = await rag.aquery_llm(request.query, param=param) + + # Extract LLM response and references from unified result + llm_response = result.get("llm_response", {}) + data = result.get("data", {}) + references = data.get("references", []) + + # Get the non-streaming response content + response_content = llm_response.get("content", "") + if not response_content: + response_content = "No relevant context found for the query." + + # Enrich references with chunk content if requested + if request.include_references and request.include_chunk_content: + chunks = data.get("chunks", []) + # Create a mapping from reference_id to chunk content + ref_id_to_content = {} + for chunk in chunks: + ref_id = chunk.get("reference_id", "") + content = chunk.get("content", "") + if ref_id and content: + # Collect chunk content; join later to avoid quadratic string concatenation + ref_id_to_content.setdefault(ref_id, []).append(content) + + # Add content to references + enriched_references = [] + for ref in references: + ref_copy = ref.copy() + ref_id = ref.get("reference_id", "") + if ref_id in ref_id_to_content: + # Keep content as a list of chunks (one file may have multiple chunks) + ref_copy["content"] = ref_id_to_content[ref_id] + enriched_references.append(ref_copy) + references = enriched_references + + # Return response with or without references based on request + if request.include_references: + return QueryResponse(response=response_content, references=references) + else: + return QueryResponse(response=response_content, references=None) + except Exception as e: + trace_exception(e) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/query/stream", + dependencies=[Depends(combined_auth)], + responses={ + 200: { + "description": "Flexible RAG query response - format depends on stream parameter", + "content": { + "application/x-ndjson": { + "schema": { + "type": "string", + "format": "ndjson", + "description": "Newline-delimited JSON (NDJSON) format used for both streaming and non-streaming responses. For streaming: multiple lines with separate JSON objects. For non-streaming: single line with complete JSON object.", + "example": '{"references": [{"reference_id": "1", "file_path": "/documents/ai.pdf"}]}\n{"response": "Artificial Intelligence is"}\n{"response": " a field of computer science"}\n{"response": " that focuses on creating intelligent machines."}', + }, + "examples": { + "streaming_with_references": { + "summary": "Streaming mode with references (stream=true)", + "description": "Multiple NDJSON lines when stream=True and include_references=True. First line contains references, subsequent lines contain response chunks.", + "value": '{"references": [{"reference_id": "1", "file_path": "/documents/ai_overview.pdf"}, {"reference_id": "2", "file_path": "/documents/ml_basics.txt"}]}\n{"response": "Artificial Intelligence (AI) is a branch of computer science"}\n{"response": " that aims to create intelligent machines capable of performing"}\n{"response": " tasks that typically require human intelligence, such as learning,"}\n{"response": " reasoning, and problem-solving."}', + }, + "streaming_with_chunk_content": { + "summary": "Streaming mode with chunk content (stream=true, include_chunk_content=true)", + "description": "Multiple NDJSON lines when stream=True, include_references=True, and include_chunk_content=True. First line contains references with content arrays (one file may have multiple chunks), subsequent lines contain response chunks.", + "value": '{"references": [{"reference_id": "1", "file_path": "/documents/ai_overview.pdf", "content": ["Artificial Intelligence (AI) represents a transformative field...", "AI systems can be categorized into narrow AI and general AI..."]}, {"reference_id": "2", "file_path": "/documents/ml_basics.txt", "content": ["Machine learning is a subset of AI that enables computers to learn..."]}]}\n{"response": "Artificial Intelligence (AI) is a branch of computer science"}\n{"response": " that aims to create intelligent machines capable of performing"}\n{"response": " tasks that typically require human intelligence."}', + }, + "streaming_without_references": { + "summary": "Streaming mode without references (stream=true)", + "description": "Multiple NDJSON lines when stream=True and include_references=False. Only response chunks are sent.", + "value": '{"response": "Machine learning is a subset of artificial intelligence"}\n{"response": " that enables computers to learn and improve from experience"}\n{"response": " without being explicitly programmed for every task."}', + }, + "non_streaming_with_references": { + "summary": "Non-streaming mode with references (stream=false)", + "description": "Single NDJSON line when stream=False and include_references=True. Complete response with references in one message.", + "value": '{"references": [{"reference_id": "1", "file_path": "/documents/neural_networks.pdf"}], "response": "Neural networks are computational models inspired by biological neural networks that consist of interconnected nodes (neurons) organized in layers. They are fundamental to deep learning and can learn complex patterns from data through training processes."}', + }, + "non_streaming_without_references": { + "summary": "Non-streaming mode without references (stream=false)", + "description": "Single NDJSON line when stream=False and include_references=False. Complete response only.", + "value": '{"response": "Deep learning is a subset of machine learning that uses neural networks with multiple layers (hence deep) to model and understand complex patterns in data. It has revolutionized fields like computer vision, natural language processing, and speech recognition."}', + }, + "error_response": { + "summary": "Error during streaming", + "description": "Error handling in NDJSON format when an error occurs during processing.", + "value": '{"references": [{"reference_id": "1", "file_path": "/documents/ai.pdf"}]}\n{"response": "Artificial Intelligence is"}\n{"error": "LLM service temporarily unavailable"}', + }, + }, + } + }, + }, + 400: { + "description": "Bad Request - Invalid input parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Query text must be at least 3 characters long" + }, + } + }, + }, + 500: { + "description": "Internal Server Error - Query processing failed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Failed to process streaming query: Knowledge graph unavailable" + }, + } + }, + }, + }, + ) + async def query_text_stream(request: QueryRequest): + """ + Advanced RAG query endpoint with flexible streaming response. + + This endpoint provides the most flexible querying experience, supporting both real-time streaming + and complete response delivery based on your integration needs. + + **Response Modes:** + - Real-time response delivery as content is generated + - NDJSON format: each line is a separate JSON object + - First line: `{"references": [...]}` (if include_references=True) + - Subsequent lines: `{"response": "content chunk"}` + - Error handling: `{"error": "error message"}` + + > If stream parameter is False, or the query hit LLM cache, complete response delivered in a single streaming message. + + **Response Format Details** + - **Content-Type**: `application/x-ndjson` (Newline-Delimited JSON) + - **Structure**: Each line is an independent, valid JSON object + - **Parsing**: Process line-by-line, each line is self-contained + - **Headers**: Includes cache control and connection management + + **Query Modes (same as /query endpoint)** + - **local**: Entity-focused retrieval with direct relationships + - **global**: Pattern analysis across the knowledge graph + - **hybrid**: Combined local and global strategies + - **naive**: Vector similarity search only + - **mix**: Integrated knowledge graph + vector retrieval (recommended) + - **bypass**: Direct LLM query without knowledge retrieval + + conversation_history parameteris sent to LLM only, does not affect retrieval results. + + **Usage Examples** + + Real-time streaming query: + ```json + { + "query": "Explain machine learning algorithms", + "mode": "mix", + "stream": true, + "include_references": true + } + ``` + + Bypass initial LLM call by providing high-level and low-level keywords: + ```json + { + "query": "What is Retrieval-Augmented-Generation?", + "hl_keywords": ["machine learning", "information retrieval", "natural language processing"], + "ll_keywords": ["retrieval augmented generation", "RAG", "knowledge base"], + "mode": "mix" + } + ``` + + Complete response query: + ```json + { + "query": "What is deep learning?", + "mode": "hybrid", + "stream": false, + "response_type": "Multiple Paragraphs" + } + ``` + + Conversation with context: + ```json + { + "query": "Can you elaborate on that?", + "stream": true, + "conversation_history": [ + {"role": "user", "content": "What is neural network?"}, + {"role": "assistant", "content": "A neural network is..."} + ] + } + ``` + + **Response Processing:** + + ```python + async for line in response.iter_lines(): + data = json.loads(line) + if "references" in data: + # Handle references (first message) + references = data["references"] + if "response" in data: + # Handle content chunk + content_chunk = data["response"] + if "error" in data: + # Handle error + error_message = data["error"] + ``` + + **Error Handling:** + - Streaming errors are delivered as `{"error": "message"}` lines + - Non-streaming errors raise HTTP exceptions + - Partial responses may be delivered before errors in streaming mode + - Always check for error objects when processing streaming responses + + Args: + request (QueryRequest): The request object containing query parameters: + - **query**: The question or prompt to process (min 3 characters) + - **mode**: Query strategy - "mix" recommended for best results + - **stream**: Enable streaming (True) or complete response (False) + - **include_references**: Whether to include source citations + - **response_type**: Format preference (e.g., "Multiple Paragraphs") + - **top_k**: Number of top entities/relations to retrieve + - **conversation_history**: Previous dialogue context for multi-turn conversations + - **max_total_tokens**: Token budget for the entire response + + Returns: + StreamingResponse: NDJSON streaming response containing: + - **Streaming mode**: Multiple JSON objects, one per line + - References object (if requested): `{"references": [...]}` + - Content chunks: `{"response": "chunk content"}` + - Error objects: `{"error": "error message"}` + - **Non-streaming mode**: Single JSON object + - Complete response: `{"references": [...], "response": "complete content"}` + + Raises: + HTTPException: + - 400: Invalid input parameters (e.g., query too short, invalid mode) + - 500: Internal processing error (e.g., LLM service unavailable) + + Note: + This endpoint is ideal for applications requiring flexible response delivery. + Use streaming mode for real-time interfaces and non-streaming for batch processing. + """ + try: + # Use the stream parameter from the request, defaulting to True if not specified + stream_mode = request.stream if request.stream is not None else True + param = request.to_query_params(stream_mode) + + from fastapi.responses import StreamingResponse + + # Unified approach: always use aquery_llm for all cases + result = await rag.aquery_llm(request.query, param=param) + + async def stream_generator(): + # Extract references and LLM response from unified result + references = result.get("data", {}).get("references", []) + llm_response = result.get("llm_response", {}) + + # Enrich references with chunk content if requested + if request.include_references and request.include_chunk_content: + data = result.get("data", {}) + chunks = data.get("chunks", []) + # Create a mapping from reference_id to chunk content + ref_id_to_content = {} + for chunk in chunks: + ref_id = chunk.get("reference_id", "") + content = chunk.get("content", "") + if ref_id and content: + # Collect chunk content + ref_id_to_content.setdefault(ref_id, []).append(content) + + # Add content to references + enriched_references = [] + for ref in references: + ref_copy = ref.copy() + ref_id = ref.get("reference_id", "") + if ref_id in ref_id_to_content: + # Keep content as a list of chunks (one file may have multiple chunks) + ref_copy["content"] = ref_id_to_content[ref_id] + enriched_references.append(ref_copy) + references = enriched_references + + if llm_response.get("is_streaming"): + # Streaming mode: send references first, then stream response chunks + if request.include_references: + yield f"{json.dumps({'references': references})}\n" + + response_stream = llm_response.get("response_iterator") + if response_stream: + try: + async for chunk in response_stream: + if chunk: # Only send non-empty content + yield f"{json.dumps({'response': chunk})}\n" + except Exception as e: + logging.error(f"Streaming error: {str(e)}") + yield f"{json.dumps({'error': str(e)})}\n" + else: + # Non-streaming mode: send complete response in one message + response_content = llm_response.get("content", "") + if not response_content: + response_content = "No relevant context found for the query." + + # Create complete response object + complete_response = {"response": response_content} + if request.include_references: + complete_response["references"] = references + + yield f"{json.dumps(complete_response)}\n" + + return StreamingResponse( + stream_generator(), + media_type="application/x-ndjson", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Content-Type": "application/x-ndjson", + "X-Accel-Buffering": "no", # Ensure proper handling of streaming response when proxied by Nginx + }, + ) + except Exception as e: + trace_exception(e) + raise HTTPException(status_code=500, detail=str(e)) + + @router.post( + "/query/data", + response_model=QueryDataResponse, + dependencies=[Depends(combined_auth)], + responses={ + 200: { + "description": "Successful data retrieval response with structured RAG data", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["success", "failure"], + "description": "Query execution status", + }, + "message": { + "type": "string", + "description": "Status message describing the result", + }, + "data": { + "type": "object", + "properties": { + "entities": { + "type": "array", + "items": { + "type": "object", + "properties": { + "entity_name": {"type": "string"}, + "entity_type": {"type": "string"}, + "description": {"type": "string"}, + "source_id": {"type": "string"}, + "file_path": {"type": "string"}, + "reference_id": {"type": "string"}, + }, + }, + "description": "Retrieved entities from knowledge graph", + }, + "relationships": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src_id": {"type": "string"}, + "tgt_id": {"type": "string"}, + "description": {"type": "string"}, + "keywords": {"type": "string"}, + "weight": {"type": "number"}, + "source_id": {"type": "string"}, + "file_path": {"type": "string"}, + "reference_id": {"type": "string"}, + }, + }, + "description": "Retrieved relationships from knowledge graph", + }, + "chunks": { + "type": "array", + "items": { + "type": "object", + "properties": { + "content": {"type": "string"}, + "file_path": {"type": "string"}, + "chunk_id": {"type": "string"}, + "reference_id": {"type": "string"}, + }, + }, + "description": "Retrieved text chunks from vector database", + }, + "references": { + "type": "array", + "items": { + "type": "object", + "properties": { + "reference_id": {"type": "string"}, + "file_path": {"type": "string"}, + }, + }, + "description": "Reference list for citation purposes", + }, + }, + "description": "Structured retrieval data containing entities, relationships, chunks, and references", + }, + "metadata": { + "type": "object", + "properties": { + "query_mode": {"type": "string"}, + "keywords": { + "type": "object", + "properties": { + "high_level": { + "type": "array", + "items": {"type": "string"}, + }, + "low_level": { + "type": "array", + "items": {"type": "string"}, + }, + }, + }, + "processing_info": { + "type": "object", + "properties": { + "total_entities_found": { + "type": "integer" + }, + "total_relations_found": { + "type": "integer" + }, + "entities_after_truncation": { + "type": "integer" + }, + "relations_after_truncation": { + "type": "integer" + }, + "final_chunks_count": { + "type": "integer" + }, + }, + }, + }, + "description": "Query metadata including mode, keywords, and processing information", + }, + }, + "required": ["status", "message", "data", "metadata"], + }, + "examples": { + "successful_local_mode": { + "summary": "Local mode data retrieval", + "description": "Example of structured data from local mode query focusing on specific entities", + "value": { + "status": "success", + "message": "Query executed successfully", + "data": { + "entities": [ + { + "entity_name": "Neural Networks", + "entity_type": "CONCEPT", + "description": "Computational models inspired by biological neural networks", + "source_id": "chunk-123", + "file_path": "/documents/ai_basics.pdf", + "reference_id": "1", + } + ], + "relationships": [ + { + "src_id": "Neural Networks", + "tgt_id": "Machine Learning", + "description": "Neural networks are a subset of machine learning algorithms", + "keywords": "subset, algorithm, learning", + "weight": 0.85, + "source_id": "chunk-123", + "file_path": "/documents/ai_basics.pdf", + "reference_id": "1", + } + ], + "chunks": [ + { + "content": "Neural networks are computational models that mimic the way biological neural networks work...", + "file_path": "/documents/ai_basics.pdf", + "chunk_id": "chunk-123", + "reference_id": "1", + } + ], + "references": [ + { + "reference_id": "1", + "file_path": "/documents/ai_basics.pdf", + } + ], + }, + "metadata": { + "query_mode": "local", + "keywords": { + "high_level": ["neural", "networks"], + "low_level": [ + "computation", + "model", + "algorithm", + ], + }, + "processing_info": { + "total_entities_found": 5, + "total_relations_found": 3, + "entities_after_truncation": 1, + "relations_after_truncation": 1, + "final_chunks_count": 1, + }, + }, + }, + }, + "global_mode": { + "summary": "Global mode data retrieval", + "description": "Example of structured data from global mode query analyzing broader patterns", + "value": { + "status": "success", + "message": "Query executed successfully", + "data": { + "entities": [], + "relationships": [ + { + "src_id": "Artificial Intelligence", + "tgt_id": "Machine Learning", + "description": "AI encompasses machine learning as a core component", + "keywords": "encompasses, component, field", + "weight": 0.92, + "source_id": "chunk-456", + "file_path": "/documents/ai_overview.pdf", + "reference_id": "2", + } + ], + "chunks": [], + "references": [ + { + "reference_id": "2", + "file_path": "/documents/ai_overview.pdf", + } + ], + }, + "metadata": { + "query_mode": "global", + "keywords": { + "high_level": [ + "artificial", + "intelligence", + "overview", + ], + "low_level": [], + }, + }, + }, + }, + "naive_mode": { + "summary": "Naive mode data retrieval", + "description": "Example of structured data from naive mode using only vector search", + "value": { + "status": "success", + "message": "Query executed successfully", + "data": { + "entities": [], + "relationships": [], + "chunks": [ + { + "content": "Deep learning is a subset of machine learning that uses neural networks with multiple layers...", + "file_path": "/documents/deep_learning.pdf", + "chunk_id": "chunk-789", + "reference_id": "3", + } + ], + "references": [ + { + "reference_id": "3", + "file_path": "/documents/deep_learning.pdf", + } + ], + }, + "metadata": { + "query_mode": "naive", + "keywords": {"high_level": [], "low_level": []}, + }, + }, + }, + }, + } + }, + }, + 400: { + "description": "Bad Request - Invalid input parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Query text must be at least 3 characters long" + }, + } + }, + }, + 500: { + "description": "Internal Server Error - Data retrieval failed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {"detail": {"type": "string"}}, + }, + "example": { + "detail": "Failed to retrieve data: Knowledge graph unavailable" + }, + } + }, + }, + }, + ) + async def query_data(request: QueryRequest): + """ + Advanced data retrieval endpoint for structured RAG analysis. + + This endpoint provides raw retrieval results without LLM generation, perfect for: + - **Data Analysis**: Examine what information would be used for RAG + - **System Integration**: Get structured data for custom processing + - **Debugging**: Understand retrieval behavior and quality + - **Research**: Analyze knowledge graph structure and relationships + + **Key Features:** + - No LLM generation - pure data retrieval + - Complete structured output with entities, relationships, and chunks + - Always includes references for citation + - Detailed metadata about processing and keywords + - Compatible with all query modes and parameters + + **Query Mode Behaviors:** + - **local**: Returns entities and their direct relationships + related chunks + - **global**: Returns relationship patterns across the knowledge graph + - **hybrid**: Combines local and global retrieval strategies + - **naive**: Returns only vector-retrieved text chunks (no knowledge graph) + - **mix**: Integrates knowledge graph data with vector-retrieved chunks + - **bypass**: Returns empty data arrays (used for direct LLM queries) + + **Data Structure:** + - **entities**: Knowledge graph entities with descriptions and metadata + - **relationships**: Connections between entities with weights and descriptions + - **chunks**: Text segments from documents with source information + - **references**: Citation information mapping reference IDs to file paths + - **metadata**: Processing information, keywords, and query statistics + + **Usage Examples:** + + Analyze entity relationships: + ```json + { + "query": "machine learning algorithms", + "mode": "local", + "top_k": 10 + } + ``` + + Explore global patterns: + ```json + { + "query": "artificial intelligence trends", + "mode": "global", + "max_relation_tokens": 2000 + } + ``` + + Vector similarity search: + ```json + { + "query": "neural network architectures", + "mode": "naive", + "chunk_top_k": 5 + } + ``` + + Bypass initial LLM call by providing high-level and low-level keywords: + ```json + { + "query": "What is Retrieval-Augmented-Generation?", + "hl_keywords": ["machine learning", "information retrieval", "natural language processing"], + "ll_keywords": ["retrieval augmented generation", "RAG", "knowledge base"], + "mode": "mix" + } + ``` + + **Response Analysis:** + - **Empty arrays**: Normal for certain modes (e.g., naive mode has no entities/relationships) + - **Processing info**: Shows retrieval statistics and token usage + - **Keywords**: High-level and low-level keywords extracted from query + - **Reference mapping**: Links all data back to source documents + + Args: + request (QueryRequest): The request object containing query parameters: + - **query**: The search query to analyze (min 3 characters) + - **mode**: Retrieval strategy affecting data types returned + - **top_k**: Number of top entities/relationships to retrieve + - **chunk_top_k**: Number of text chunks to retrieve + - **max_entity_tokens**: Token limit for entity context + - **max_relation_tokens**: Token limit for relationship context + - **max_total_tokens**: Overall token budget for retrieval + + Returns: + QueryDataResponse: Structured JSON response containing: + - **status**: "success" or "failure" + - **message**: Human-readable status description + - **data**: Complete retrieval results with entities, relationships, chunks, references + - **metadata**: Query processing information and statistics + + Raises: + HTTPException: + - 400: Invalid input parameters (e.g., query too short, invalid mode) + - 500: Internal processing error (e.g., knowledge graph unavailable) + + Note: + This endpoint always includes references regardless of the include_references parameter, + as structured data analysis typically requires source attribution. + """ + try: + param = request.to_query_params(False) # No streaming for data endpoint + response = await rag.aquery_data(request.query, param=param) + + # aquery_data returns the new format with status, message, data, and metadata + if isinstance(response, dict): + return QueryDataResponse(**response) + else: + # Handle unexpected response format + return QueryDataResponse( + status="failure", + message="Invalid response type", + data={}, + ) + except Exception as e: + trace_exception(e) + raise HTTPException(status_code=500, detail=str(e)) + + return router diff --git a/LightRAG/lightrag/api/run_with_gunicorn.py b/LightRAG/lightrag/api/run_with_gunicorn.py new file mode 100644 index 00000000..deabe7cf --- /dev/null +++ b/LightRAG/lightrag/api/run_with_gunicorn.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python +""" +Start LightRAG server with Gunicorn +""" + +import os +import sys +import platform +import pipmaster as pm +from lightrag.api.utils_api import display_splash_screen, check_env_file +from lightrag.api.config import global_args +from lightrag.utils import get_env_value +from lightrag.kg.shared_storage import initialize_share_data + +from lightrag.constants import ( + DEFAULT_WOKERS, + DEFAULT_TIMEOUT, +) + + +def check_and_install_dependencies(): + """Check and install required dependencies""" + required_packages = [ + "gunicorn", + "tiktoken", + "psutil", + # Add other required packages here + ] + + for package in required_packages: + if not pm.is_installed(package): + print(f"Installing {package}...") + pm.install(package) + print(f"{package} installed successfully") + + +def main(): + # Explicitly initialize configuration for Gunicorn mode + from lightrag.api.config import initialize_config + + initialize_config() + + # Set Gunicorn mode flag for lifespan cleanup detection + os.environ["LIGHTRAG_GUNICORN_MODE"] = "1" + + # Check .env file + if not check_env_file(): + sys.exit(1) + + # Check DOCLING compatibility with Gunicorn multi-worker mode on macOS + if ( + platform.system() == "Darwin" + and global_args.document_loading_engine == "DOCLING" + and global_args.workers > 1 + ): + print("\n" + "=" * 80) + print("❌ ERROR: Incompatible configuration detected!") + print("=" * 80) + print( + "\nDOCLING engine with Gunicorn multi-worker mode is not supported on macOS" + ) + print("\nReason:") + print(" PyTorch (required by DOCLING) has known compatibility issues with") + print(" fork-based multiprocessing on macOS, which can cause crashes or") + print(" unexpected behavior when using Gunicorn with multiple workers.") + print("\nCurrent configuration:") + print(" - Operating System: macOS (Darwin)") + print(f" - Document Engine: {global_args.document_loading_engine}") + print(f" - Workers: {global_args.workers}") + print("\nPossible solutions:") + print(" 1. Use single worker mode:") + print(" --workers 1") + print("\n 2. Change document loading engine in .env:") + print(" DOCUMENT_LOADING_ENGINE=DEFAULT") + print("\n 3. Deploy on Linux where multi-worker mode is fully supported") + print("=" * 80 + "\n") + sys.exit(1) + + # Check macOS fork safety environment variable for multi-worker mode + if ( + platform.system() == "Darwin" + and global_args.workers > 1 + and os.environ.get("OBJC_DISABLE_INITIALIZE_FORK_SAFETY") != "YES" + ): + print("\n" + "=" * 80) + print("❌ ERROR: Missing required environment variable on macOS!") + print("=" * 80) + print("\nmacOS with Gunicorn multi-worker mode requires:") + print(" OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES") + print("\nReason:") + print(" NumPy uses macOS's Accelerate framework (Objective-C based) for") + print(" vector computations. The Objective-C runtime has fork safety checks") + print(" that will crash worker processes when embedding functions are called.") + print("\nCurrent configuration:") + print(" - Operating System: macOS (Darwin)") + print(f" - Workers: {global_args.workers}") + print( + f" - Environment Variable: {os.environ.get('OBJC_DISABLE_INITIALIZE_FORK_SAFETY', 'NOT SET')}" + ) + print("\nHow to fix:") + print(" Option 1 - Set environment variable before starting (recommended):") + print(" export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES") + print(" lightrag-server") + print("\n Option 2 - Add to your shell profile (~/.zshrc or ~/.bash_profile):") + print(" echo 'export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES' >> ~/.zshrc") + print(" source ~/.zshrc") + print("\n Option 3 - Use single worker mode (no multiprocessing):") + print(" lightrag-server --workers 1") + print("=" * 80 + "\n") + sys.exit(1) + + # Check and install dependencies + check_and_install_dependencies() + + # Note: Signal handlers are NOT registered here because: + # - Master cleanup already handled by gunicorn_config.on_exit() + + # Display startup information + display_splash_screen(global_args) + + print("🚀 Starting LightRAG with Gunicorn") + print(f"🔄 Worker management: Gunicorn (workers={global_args.workers})") + print("🔍 Preloading app: Enabled") + print("📝 Note: Using Gunicorn's preload feature for shared data initialization") + print("\n\n" + "=" * 80) + print("MAIN PROCESS INITIALIZATION") + print(f"Process ID: {os.getpid()}") + print(f"Workers setting: {global_args.workers}") + print("=" * 80 + "\n") + + # Import Gunicorn's StandaloneApplication + from gunicorn.app.base import BaseApplication + + # Define a custom application class that loads our config + class GunicornApp(BaseApplication): + def __init__(self, app, options=None): + self.options = options or {} + self.application = app + super().__init__() + + def load_config(self): + # Define valid Gunicorn configuration options + valid_options = { + "bind", + "workers", + "worker_class", + "timeout", + "keepalive", + "preload_app", + "errorlog", + "accesslog", + "loglevel", + "certfile", + "keyfile", + "limit_request_line", + "limit_request_fields", + "limit_request_field_size", + "graceful_timeout", + "max_requests", + "max_requests_jitter", + } + + # Special hooks that need to be set separately + special_hooks = { + "on_starting", + "on_reload", + "on_exit", + "pre_fork", + "post_fork", + "pre_exec", + "pre_request", + "post_request", + "worker_init", + "worker_exit", + "nworkers_changed", + "child_exit", + } + + # Import and configure the gunicorn_config module + from lightrag.api import gunicorn_config + + # Set configuration variables in gunicorn_config, prioritizing command line arguments + gunicorn_config.workers = ( + global_args.workers + if global_args.workers + else get_env_value("WORKERS", DEFAULT_WOKERS, int) + ) + + # Bind configuration prioritizes command line arguments + host = ( + global_args.host + if global_args.host != "0.0.0.0" + else os.getenv("HOST", "0.0.0.0") + ) + port = ( + global_args.port + if global_args.port != 9621 + else get_env_value("PORT", 9621, int) + ) + gunicorn_config.bind = f"{host}:{port}" + + # Log level configuration prioritizes command line arguments + gunicorn_config.loglevel = ( + global_args.log_level.lower() + if global_args.log_level + else os.getenv("LOG_LEVEL", "info") + ) + + # Timeout configuration prioritizes command line arguments + gunicorn_config.timeout = ( + global_args.timeout + 30 + if global_args.timeout is not None + else get_env_value( + "TIMEOUT", DEFAULT_TIMEOUT + 30, int, special_none=True + ) + ) + + # Keepalive configuration + gunicorn_config.keepalive = get_env_value("KEEPALIVE", 5, int) + + # SSL configuration prioritizes command line arguments + if global_args.ssl or os.getenv("SSL", "").lower() in ( + "true", + "1", + "yes", + "t", + "on", + ): + gunicorn_config.certfile = ( + global_args.ssl_certfile + if global_args.ssl_certfile + else os.getenv("SSL_CERTFILE") + ) + gunicorn_config.keyfile = ( + global_args.ssl_keyfile + if global_args.ssl_keyfile + else os.getenv("SSL_KEYFILE") + ) + + # Set configuration options from the module + for key in dir(gunicorn_config): + if key in valid_options: + value = getattr(gunicorn_config, key) + # Skip functions like on_starting and None values + if not callable(value) and value is not None: + self.cfg.set(key, value) + # Set special hooks + elif key in special_hooks: + value = getattr(gunicorn_config, key) + if callable(value): + self.cfg.set(key, value) + + if hasattr(gunicorn_config, "logconfig_dict"): + self.cfg.set( + "logconfig_dict", getattr(gunicorn_config, "logconfig_dict") + ) + + def load(self): + # Import the application + from lightrag.api.lightrag_server import get_application + + return get_application(global_args) + + # Create the application + app = GunicornApp("") + + # Force workers to be an integer and greater than 1 for multi-process mode + workers_count = global_args.workers + if workers_count > 1: + # Set a flag to indicate we're in the main process + os.environ["LIGHTRAG_MAIN_PROCESS"] = "1" + initialize_share_data(workers_count) + else: + initialize_share_data(1) + + # Run the application + print("\nStarting Gunicorn with direct Python API...") + app.run() + + +if __name__ == "__main__": + main() diff --git a/LightRAG/lightrag/api/static/swagger-ui/favicon-32x32.png b/LightRAG/lightrag/api/static/swagger-ui/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..249737fe44558e679f0b67134e274461d988fa98 GIT binary patch literal 628 zcmV-)0*n2LP)Ma*GM0}OV<074bNCP7P7GVd{iMr*I6y~TMLss@FjvgL~HxU z%Vvj33AwpD(Z4*$Mfx=HaU16axM zt2xG_rloN<$iy9j9I5(()=>{var s={251:(s,o)=>{o.read=function(s,o,i,a,u){var _,w,x=8*u-a-1,C=(1<>1,L=-7,B=i?u-1:0,$=i?-1:1,U=s[o+B];for(B+=$,_=U&(1<<-L)-1,U>>=-L,L+=x;L>0;_=256*_+s[o+B],B+=$,L-=8);for(w=_&(1<<-L)-1,_>>=-L,L+=a;L>0;w=256*w+s[o+B],B+=$,L-=8);if(0===_)_=1-j;else{if(_===C)return w?NaN:1/0*(U?-1:1);w+=Math.pow(2,a),_-=j}return(U?-1:1)*w*Math.pow(2,_-a)},o.write=function(s,o,i,a,u,_){var w,x,C,j=8*_-u-1,L=(1<>1,$=23===u?Math.pow(2,-24)-Math.pow(2,-77):0,U=a?0:_-1,V=a?1:-1,z=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(x=isNaN(o)?1:0,w=L):(w=Math.floor(Math.log(o)/Math.LN2),o*(C=Math.pow(2,-w))<1&&(w--,C*=2),(o+=w+B>=1?$/C:$*Math.pow(2,1-B))*C>=2&&(w++,C/=2),w+B>=L?(x=0,w=L):w+B>=1?(x=(o*C-1)*Math.pow(2,u),w+=B):(x=o*Math.pow(2,B-1)*Math.pow(2,u),w=0));u>=8;s[i+U]=255&x,U+=V,x/=256,u-=8);for(w=w<0;s[i+U]=255&w,U+=V,w/=256,j-=8);s[i+U-V]|=128*z}},462:(s,o,i)=>{"use strict";var a=i(40975);s.exports=a},659:(s,o,i)=>{var a=i(51873),u=Object.prototype,_=u.hasOwnProperty,w=u.toString,x=a?a.toStringTag:void 0;s.exports=function getRawTag(s){var o=_.call(s,x),i=s[x];try{s[x]=void 0;var a=!0}catch(s){}var u=w.call(s);return a&&(o?s[x]=i:delete s[x]),u}},694:(s,o,i)=>{"use strict";i(91599);var a=i(37257);i(12560),s.exports=a},953:(s,o,i)=>{"use strict";s.exports=i(53375)},1733:s=>{var o=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;s.exports=function asciiWords(s){return s.match(o)||[]}},1882:(s,o,i)=>{var a=i(72552),u=i(23805);s.exports=function isFunction(s){if(!u(s))return!1;var o=a(s);return"[object Function]"==o||"[object GeneratorFunction]"==o||"[object AsyncFunction]"==o||"[object Proxy]"==o}},1907:(s,o,i)=>{"use strict";var a=i(41505),u=Function.prototype,_=u.call,w=a&&u.bind.bind(_,_);s.exports=a?w:function(s){return function(){return _.apply(s,arguments)}}},2205:function(s,o,i){var a;a=void 0!==i.g?i.g:this,s.exports=function(s){if(s.CSS&&s.CSS.escape)return s.CSS.escape;var cssEscape=function(s){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var o,i=String(s),a=i.length,u=-1,_="",w=i.charCodeAt(0);++u=1&&o<=31||127==o||0==u&&o>=48&&o<=57||1==u&&o>=48&&o<=57&&45==w?"\\"+o.toString(16)+" ":0==u&&1==a&&45==o||!(o>=128||45==o||95==o||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122)?"\\"+i.charAt(u):i.charAt(u):_+="�";return _};return s.CSS||(s.CSS={}),s.CSS.escape=cssEscape,cssEscape}(a)},2209:(s,o,i)=>{"use strict";var a,u=i(9404),_=function productionTypeChecker(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};_.isRequired=_;var w=function getProductionTypeChecker(){return _};function getPropType(s){var o=typeof s;return Array.isArray(s)?"array":s instanceof RegExp?"object":s instanceof u.Iterable?"Immutable."+s.toSource().split(" ")[0]:o}function createChainableTypeChecker(s){function checkType(o,i,a,u,_,w){for(var x=arguments.length,C=Array(x>6?x-6:0),j=6;j>",null!=i[a]?s.apply(void 0,[i,a,u,_,w].concat(C)):o?new Error("Required "+_+" `"+w+"` was not specified in `"+u+"`."):void 0}var o=checkType.bind(null,!1);return o.isRequired=checkType.bind(null,!0),o}function createIterableSubclassTypeChecker(s,o){return function createImmutableTypeChecker(s,o){return createChainableTypeChecker((function validate(i,a,u,_,w){var x=i[a];if(!o(x)){var C=getPropType(x);return new Error("Invalid "+_+" `"+w+"` of type `"+C+"` supplied to `"+u+"`, expected `"+s+"`.")}return null}))}("Iterable."+s,(function(s){return u.Iterable.isIterable(s)&&o(s)}))}(a={listOf:w,mapOf:w,orderedMapOf:w,setOf:w,orderedSetOf:w,stackOf:w,iterableOf:w,recordOf:w,shape:w,contains:w,mapContains:w,orderedMapContains:w,list:_,map:_,orderedMap:_,set:_,orderedSet:_,stack:_,seq:_,record:_,iterable:_}).iterable.indexed=createIterableSubclassTypeChecker("Indexed",u.Iterable.isIndexed),a.iterable.keyed=createIterableSubclassTypeChecker("Keyed",u.Iterable.isKeyed),s.exports=a},2404:(s,o,i)=>{var a=i(60270);s.exports=function isEqual(s,o){return a(s,o)}},2523:s=>{s.exports=function baseFindIndex(s,o,i,a){for(var u=s.length,_=i+(a?1:-1);a?_--:++_{"use strict";var a=i(45951),u=Object.defineProperty;s.exports=function(s,o){try{u(a,s,{value:o,configurable:!0,writable:!0})}catch(i){a[s]=o}return o}},2694:(s,o,i)=>{"use strict";var a=i(6925);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,s.exports=function(){function shim(s,o,i,u,_,w){if(w!==a){var x=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw x.name="Invariant Violation",x}}function getShim(){return shim}shim.isRequired=shim;var s={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return s.PropTypes=s,s}},2874:s=>{s.exports={}},2875:(s,o,i)=>{"use strict";var a=i(23045),u=i(80376);s.exports=Object.keys||function keys(s){return a(s,u)}},2955:(s,o,i)=>{"use strict";var a,u=i(65606);function _defineProperty(s,o,i){return(o=function _toPropertyKey(s){var o=function _toPrimitive(s,o){if("object"!=typeof s||null===s)return s;var i=s[Symbol.toPrimitive];if(void 0!==i){var a=i.call(s,o||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===o?String:Number)(s)}(s,"string");return"symbol"==typeof o?o:String(o)}(o))in s?Object.defineProperty(s,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):s[o]=i,s}var _=i(86238),w=Symbol("lastResolve"),x=Symbol("lastReject"),C=Symbol("error"),j=Symbol("ended"),L=Symbol("lastPromise"),B=Symbol("handlePromise"),$=Symbol("stream");function createIterResult(s,o){return{value:s,done:o}}function readAndResolve(s){var o=s[w];if(null!==o){var i=s[$].read();null!==i&&(s[L]=null,s[w]=null,s[x]=null,o(createIterResult(i,!1)))}}function onReadable(s){u.nextTick(readAndResolve,s)}var U=Object.getPrototypeOf((function(){})),V=Object.setPrototypeOf((_defineProperty(a={get stream(){return this[$]},next:function next(){var s=this,o=this[C];if(null!==o)return Promise.reject(o);if(this[j])return Promise.resolve(createIterResult(void 0,!0));if(this[$].destroyed)return new Promise((function(o,i){u.nextTick((function(){s[C]?i(s[C]):o(createIterResult(void 0,!0))}))}));var i,a=this[L];if(a)i=new Promise(function wrapForNext(s,o){return function(i,a){s.then((function(){o[j]?i(createIterResult(void 0,!0)):o[B](i,a)}),a)}}(a,this));else{var _=this[$].read();if(null!==_)return Promise.resolve(createIterResult(_,!1));i=new Promise(this[B])}return this[L]=i,i}},Symbol.asyncIterator,(function(){return this})),_defineProperty(a,"return",(function _return(){var s=this;return new Promise((function(o,i){s[$].destroy(null,(function(s){s?i(s):o(createIterResult(void 0,!0))}))}))})),a),U);s.exports=function createReadableStreamAsyncIterator(s){var o,i=Object.create(V,(_defineProperty(o={},$,{value:s,writable:!0}),_defineProperty(o,w,{value:null,writable:!0}),_defineProperty(o,x,{value:null,writable:!0}),_defineProperty(o,C,{value:null,writable:!0}),_defineProperty(o,j,{value:s._readableState.endEmitted,writable:!0}),_defineProperty(o,B,{value:function value(s,o){var a=i[$].read();a?(i[L]=null,i[w]=null,i[x]=null,s(createIterResult(a,!1))):(i[w]=s,i[x]=o)},writable:!0}),o));return i[L]=null,_(s,(function(s){if(s&&"ERR_STREAM_PREMATURE_CLOSE"!==s.code){var o=i[x];return null!==o&&(i[L]=null,i[w]=null,i[x]=null,o(s)),void(i[C]=s)}var a=i[w];null!==a&&(i[L]=null,i[w]=null,i[x]=null,a(createIterResult(void 0,!0))),i[j]=!0})),s.on("readable",onReadable.bind(null,i)),i}},3110:(s,o,i)=>{const a=i(5187),u=i(85015),_=i(98023),w=i(53812),x=i(23805),C=i(85105),j=i(86804);class Namespace{constructor(s){this.elementMap={},this.elementDetection=[],this.Element=j.Element,this.KeyValuePair=j.KeyValuePair,s&&s.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(s){return s.namespace&&s.namespace({base:this}),s.load&&s.load({base:this}),this}useDefault(){return this.register("null",j.NullElement).register("string",j.StringElement).register("number",j.NumberElement).register("boolean",j.BooleanElement).register("array",j.ArrayElement).register("object",j.ObjectElement).register("member",j.MemberElement).register("ref",j.RefElement).register("link",j.LinkElement),this.detect(a,j.NullElement,!1).detect(u,j.StringElement,!1).detect(_,j.NumberElement,!1).detect(w,j.BooleanElement,!1).detect(Array.isArray,j.ArrayElement,!1).detect(x,j.ObjectElement,!1),this}register(s,o){return this._elements=void 0,this.elementMap[s]=o,this}unregister(s){return this._elements=void 0,delete this.elementMap[s],this}detect(s,o,i){return void 0===i||i?this.elementDetection.unshift([s,o]):this.elementDetection.push([s,o]),this}toElement(s){if(s instanceof this.Element)return s;let o;for(let i=0;i{const o=s[0].toUpperCase()+s.substr(1);this._elements[o]=this.elementMap[s]}))),this._elements}get serialiser(){return new C(this)}}C.prototype.Namespace=Namespace,s.exports=Namespace},3121:(s,o,i)=>{"use strict";var a=i(65482),u=Math.min;s.exports=function(s){var o=a(s);return o>0?u(o,9007199254740991):0}},3209:(s,o,i)=>{var a=i(91596),u=i(53320),_=i(36306),w="__lodash_placeholder__",x=128,C=Math.min;s.exports=function mergeData(s,o){var i=s[1],j=o[1],L=i|j,B=L<131,$=j==x&&8==i||j==x&&256==i&&s[7].length<=o[8]||384==j&&o[7].length<=o[8]&&8==i;if(!B&&!$)return s;1&j&&(s[2]=o[2],L|=1&i?0:4);var U=o[3];if(U){var V=s[3];s[3]=V?a(V,U,o[4]):U,s[4]=V?_(s[3],w):o[4]}return(U=o[5])&&(V=s[5],s[5]=V?u(V,U,o[6]):U,s[6]=V?_(s[5],w):o[6]),(U=o[7])&&(s[7]=U),j&x&&(s[8]=null==s[8]?o[8]:C(s[8],o[8])),null==s[9]&&(s[9]=o[9]),s[0]=o[0],s[1]=L,s}},3650:(s,o,i)=>{var a=i(74335)(Object.keys,Object);s.exports=a},3656:(s,o,i)=>{s=i.nmd(s);var a=i(9325),u=i(89935),_=o&&!o.nodeType&&o,w=_&&s&&!s.nodeType&&s,x=w&&w.exports===_?a.Buffer:void 0,C=(x?x.isBuffer:void 0)||u;s.exports=C},4509:(s,o,i)=>{var a=i(12651);s.exports=function mapCacheHas(s){return a(this,s).has(s)}},4640:s=>{"use strict";var o=String;s.exports=function(s){try{return o(s)}catch(s){return"Object"}}},4664:(s,o,i)=>{var a=i(79770),u=i(63345),_=Object.prototype.propertyIsEnumerable,w=Object.getOwnPropertySymbols,x=w?function(s){return null==s?[]:(s=Object(s),a(w(s),(function(o){return _.call(s,o)})))}:u;s.exports=x},4901:(s,o,i)=>{var a=i(72552),u=i(30294),_=i(40346),w={};w["[object Float32Array]"]=w["[object Float64Array]"]=w["[object Int8Array]"]=w["[object Int16Array]"]=w["[object Int32Array]"]=w["[object Uint8Array]"]=w["[object Uint8ClampedArray]"]=w["[object Uint16Array]"]=w["[object Uint32Array]"]=!0,w["[object Arguments]"]=w["[object Array]"]=w["[object ArrayBuffer]"]=w["[object Boolean]"]=w["[object DataView]"]=w["[object Date]"]=w["[object Error]"]=w["[object Function]"]=w["[object Map]"]=w["[object Number]"]=w["[object Object]"]=w["[object RegExp]"]=w["[object Set]"]=w["[object String]"]=w["[object WeakMap]"]=!1,s.exports=function baseIsTypedArray(s){return _(s)&&u(s.length)&&!!w[a(s)]}},4993:(s,o,i)=>{"use strict";var a=i(16946),u=i(74239);s.exports=function(s){return a(u(s))}},5187:s=>{s.exports=function isNull(s){return null===s}},5419:s=>{s.exports=function(s,o,i,a){var u=new Blob(void 0!==a?[a,s]:[s],{type:i||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(u,o);else{var _=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(u):window.webkitURL.createObjectURL(u),w=document.createElement("a");w.style.display="none",w.href=_,w.setAttribute("download",o),void 0===w.download&&w.setAttribute("target","_blank"),document.body.appendChild(w),w.click(),setTimeout((function(){document.body.removeChild(w),window.URL.revokeObjectURL(_)}),200)}}},5556:(s,o,i)=>{s.exports=i(2694)()},5861:(s,o,i)=>{var a=i(55580),u=i(68223),_=i(32804),w=i(76545),x=i(28303),C=i(72552),j=i(47473),L="[object Map]",B="[object Promise]",$="[object Set]",U="[object WeakMap]",V="[object DataView]",z=j(a),Y=j(u),Z=j(_),ee=j(w),ie=j(x),ae=C;(a&&ae(new a(new ArrayBuffer(1)))!=V||u&&ae(new u)!=L||_&&ae(_.resolve())!=B||w&&ae(new w)!=$||x&&ae(new x)!=U)&&(ae=function(s){var o=C(s),i="[object Object]"==o?s.constructor:void 0,a=i?j(i):"";if(a)switch(a){case z:return V;case Y:return L;case Z:return B;case ee:return $;case ie:return U}return o}),s.exports=ae},6048:s=>{s.exports=function negate(s){if("function"!=typeof s)throw new TypeError("Expected a function");return function(){var o=arguments;switch(o.length){case 0:return!s.call(this);case 1:return!s.call(this,o[0]);case 2:return!s.call(this,o[0],o[1]);case 3:return!s.call(this,o[0],o[1],o[2])}return!s.apply(this,o)}}},6188:s=>{"use strict";s.exports=Math.max},6205:s=>{s.exports={ROOT:0,GROUP:1,POSITION:2,SET:3,RANGE:4,REPETITION:5,REFERENCE:6,CHAR:7}},6233:(s,o,i)=>{const a=i(6048),u=i(10316),_=i(92340);class ArrayElement extends u{constructor(s,o,i){super(s||[],o,i),this.element="array"}primitive(){return"array"}get(s){return this.content[s]}getValue(s){const o=this.get(s);if(o)return o.toValue()}getIndex(s){return this.content[s]}set(s,o){return this.content[s]=this.refract(o),this}remove(s){const o=this.content.splice(s,1);return o.length?o[0]:null}map(s,o){return this.content.map(s,o)}flatMap(s,o){return this.map(s,o).reduce(((s,o)=>s.concat(o)),[])}compactMap(s,o){const i=[];return this.forEach((a=>{const u=s.bind(o)(a);u&&i.push(u)})),i}filter(s,o){return new _(this.content.filter(s,o))}reject(s,o){return this.filter(a(s),o)}reduce(s,o){let i,a;void 0!==o?(i=0,a=this.refract(o)):(i=1,a="object"===this.primitive()?this.first.value:this.first);for(let o=i;o{s.bind(o)(i,this.refract(a))}))}shift(){return this.content.shift()}unshift(s){this.content.unshift(this.refract(s))}push(s){return this.content.push(this.refract(s)),this}add(s){this.push(s)}findElements(s,o){const i=o||{},a=!!i.recursive,u=void 0===i.results?[]:i.results;return this.forEach(((o,i,_)=>{a&&void 0!==o.findElements&&o.findElements(s,{results:u,recursive:a}),s(o,i,_)&&u.push(o)})),u}find(s){return new _(this.findElements(s,{recursive:!0}))}findByElement(s){return this.find((o=>o.element===s))}findByClass(s){return this.find((o=>o.classes.includes(s)))}getById(s){return this.find((o=>o.id.toValue()===s)).first}includes(s){return this.content.some((o=>o.equals(s)))}contains(s){return this.includes(s)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(s){return new this.constructor(this.content.concat(s.content))}"fantasy-land/concat"(s){return this.concat(s)}"fantasy-land/map"(s){return new this.constructor(this.map(s))}"fantasy-land/chain"(s){return this.map((o=>s(o)),this).reduce(((s,o)=>s.concat(o)),this.empty())}"fantasy-land/filter"(s){return new this.constructor(this.content.filter(s))}"fantasy-land/reduce"(s,o){return this.content.reduce(s,o)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),s.exports=ArrayElement},6499:(s,o,i)=>{"use strict";var a=i(1907),u=0,_=Math.random(),w=a(1..toString);s.exports=function(s){return"Symbol("+(void 0===s?"":s)+")_"+w(++u+_,36)}},6549:s=>{"use strict";s.exports=Object.getOwnPropertyDescriptor},6925:s=>{"use strict";s.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},7057:(s,o,i)=>{"use strict";var a=i(11470).charAt,u=i(90160),_=i(64932),w=i(60183),x=i(59550),C="String Iterator",j=_.set,L=_.getterFor(C);w(String,"String",(function(s){j(this,{type:C,string:u(s),index:0})}),(function next(){var s,o=L(this),i=o.string,u=o.index;return u>=i.length?x(void 0,!0):(s=a(i,u),o.index+=s.length,x(s,!1))}))},7176:(s,o,i)=>{"use strict";var a,u=i(73126),_=i(75795);try{a=[].__proto__===Array.prototype}catch(s){if(!s||"object"!=typeof s||!("code"in s)||"ERR_PROTO_ACCESS"!==s.code)throw s}var w=!!a&&_&&_(Object.prototype,"__proto__"),x=Object,C=x.getPrototypeOf;s.exports=w&&"function"==typeof w.get?u([w.get]):"function"==typeof C&&function getDunder(s){return C(null==s?s:x(s))}},7309:(s,o,i)=>{var a=i(62006)(i(24713));s.exports=a},7376:s=>{"use strict";s.exports=!0},7463:(s,o,i)=>{"use strict";var a=i(98828),u=i(62250),_=/#|\.prototype\./,isForced=function(s,o){var i=x[w(s)];return i===j||i!==C&&(u(o)?a(o):!!o)},w=isForced.normalize=function(s){return String(s).replace(_,".").toLowerCase()},x=isForced.data={},C=isForced.NATIVE="N",j=isForced.POLYFILL="P";s.exports=isForced},7666:(s,o,i)=>{var a=i(84851),u=i(953);function _extends(){var o;return s.exports=_extends=a?u(o=a).call(o):function(s){for(var o=1;o{const a=i(6205);o.wordBoundary=()=>({type:a.POSITION,value:"b"}),o.nonWordBoundary=()=>({type:a.POSITION,value:"B"}),o.begin=()=>({type:a.POSITION,value:"^"}),o.end=()=>({type:a.POSITION,value:"$"})},8068:s=>{"use strict";var o=(()=>{var s=Object.defineProperty,o=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable,__defNormalProp=(o,i,a)=>i in o?s(o,i,{enumerable:!0,configurable:!0,writable:!0,value:a}):o[i]=a,__spreadValues=(s,o)=>{for(var i in o||(o={}))u.call(o,i)&&__defNormalProp(s,i,o[i]);if(a)for(var i of a(o))_.call(o,i)&&__defNormalProp(s,i,o[i]);return s},__publicField=(s,o,i)=>__defNormalProp(s,"symbol"!=typeof o?o+"":o,i),w={};((o,i)=>{for(var a in i)s(o,a,{get:i[a],enumerable:!0})})(w,{DEFAULT_OPTIONS:()=>C,DEFAULT_UUID_LENGTH:()=>x,default:()=>B});var x=6,C={dictionary:"alphanum",shuffle:!0,debug:!1,length:x,counter:0},j=class _ShortUniqueId{constructor(s={}){__publicField(this,"counter"),__publicField(this,"debug"),__publicField(this,"dict"),__publicField(this,"version"),__publicField(this,"dictIndex",0),__publicField(this,"dictRange",[]),__publicField(this,"lowerBound",0),__publicField(this,"upperBound",0),__publicField(this,"dictLength",0),__publicField(this,"uuidLength"),__publicField(this,"_digit_first_ascii",48),__publicField(this,"_digit_last_ascii",58),__publicField(this,"_alpha_lower_first_ascii",97),__publicField(this,"_alpha_lower_last_ascii",123),__publicField(this,"_hex_last_ascii",103),__publicField(this,"_alpha_upper_first_ascii",65),__publicField(this,"_alpha_upper_last_ascii",91),__publicField(this,"_number_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii]}),__publicField(this,"_alpha_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]}),__publicField(this,"_alpha_lower_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]}),__publicField(this,"_alpha_upper_dict_ranges",{upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]}),__publicField(this,"_alphanum_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]}),__publicField(this,"_alphanum_lower_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]}),__publicField(this,"_alphanum_upper_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]}),__publicField(this,"_hex_dict_ranges",{decDigits:[this._digit_first_ascii,this._digit_last_ascii],alphaDigits:[this._alpha_lower_first_ascii,this._hex_last_ascii]}),__publicField(this,"_dict_ranges",{_number_dict_ranges:this._number_dict_ranges,_alpha_dict_ranges:this._alpha_dict_ranges,_alpha_lower_dict_ranges:this._alpha_lower_dict_ranges,_alpha_upper_dict_ranges:this._alpha_upper_dict_ranges,_alphanum_dict_ranges:this._alphanum_dict_ranges,_alphanum_lower_dict_ranges:this._alphanum_lower_dict_ranges,_alphanum_upper_dict_ranges:this._alphanum_upper_dict_ranges,_hex_dict_ranges:this._hex_dict_ranges}),__publicField(this,"log",((...s)=>{const o=[...s];o[0]="[short-unique-id] ".concat(s[0]),!0!==this.debug||"undefined"==typeof console||null===console||console.log(...o)})),__publicField(this,"_normalizeDictionary",((s,o)=>{let i;if(s&&Array.isArray(s)&&s.length>1)i=s;else{i=[],this.dictIndex=0;const o="_".concat(s,"_dict_ranges"),a=this._dict_ranges[o];let u=0;for(const[,s]of Object.entries(a)){const[o,i]=s;u+=Math.abs(i-o)}i=new Array(u);let _=0;for(const[,s]of Object.entries(a)){this.dictRange=s,this.lowerBound=this.dictRange[0],this.upperBound=this.dictRange[1];const o=this.lowerBound<=this.upperBound,a=this.lowerBound,u=this.upperBound;if(o)for(let s=a;su;s--)i[_++]=String.fromCharCode(s),this.dictIndex=s}i.length=_}if(o){for(let s=i.length-1;s>0;s--){const o=Math.floor(Math.random()*(s+1));[i[s],i[o]]=[i[o],i[s]]}}return i})),__publicField(this,"setDictionary",((s,o)=>{this.dict=this._normalizeDictionary(s,o),this.dictLength=this.dict.length,this.setCounter(0)})),__publicField(this,"seq",(()=>this.sequentialUUID())),__publicField(this,"sequentialUUID",(()=>{const s=this.dictLength,o=this.dict;let i=this.counter;const a=[];do{const u=i%s;i=Math.trunc(i/s),a.push(o[u])}while(0!==i);const u=a.join("");return this.counter+=1,u})),__publicField(this,"rnd",((s=this.uuidLength||x)=>this.randomUUID(s))),__publicField(this,"randomUUID",((s=this.uuidLength||x)=>{if(null==s||s<1)throw new Error("Invalid UUID Length Provided");const o=new Array(s),i=this.dictLength,a=this.dict;for(let u=0;uthis.formattedUUID(s,o))),__publicField(this,"formattedUUID",((s,o)=>{const i={$r:this.randomUUID,$s:this.sequentialUUID,$t:this.stamp};return s.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g,(s=>{const a=s.slice(0,2),u=Number.parseInt(s.slice(2),10);return"$s"===a?i[a]().padStart(u,"0"):"$t"===a&&o?i[a](u,o):i[a](u)}))})),__publicField(this,"availableUUIDs",((s=this.uuidLength)=>Number.parseFloat(([...new Set(this.dict)].length**s).toFixed(0)))),__publicField(this,"_collisionCache",new Map),__publicField(this,"approxMaxBeforeCollision",((s=this.availableUUIDs(this.uuidLength))=>{const o=s,i=this._collisionCache.get(o);if(void 0!==i)return i;const a=Number.parseFloat(Math.sqrt(Math.PI/2*s).toFixed(20));return this._collisionCache.set(o,a),a})),__publicField(this,"collisionProbability",((s=this.availableUUIDs(this.uuidLength),o=this.uuidLength)=>Number.parseFloat((this.approxMaxBeforeCollision(s)/this.availableUUIDs(o)).toFixed(20)))),__publicField(this,"uniqueness",((s=this.availableUUIDs(this.uuidLength))=>{const o=Number.parseFloat((1-this.approxMaxBeforeCollision(s)/s).toFixed(20));return o>1?1:o<0?0:o})),__publicField(this,"getVersion",(()=>this.version)),__publicField(this,"stamp",((s,o)=>{const i=Math.floor(+(o||new Date)/1e3).toString(16);if("number"==typeof s&&0===s)return i;if("number"!=typeof s||s<10)throw new Error(["Param finalLength must be a number greater than or equal to 10,","or 0 if you want the raw hexadecimal timestamp"].join("\n"));const a=s-9,u=Math.round(Math.random()*(a>15?15:a)),_=this.randomUUID(a);return"".concat(_.substring(0,u)).concat(i).concat(_.substring(u)).concat(u.toString(16))})),__publicField(this,"parseStamp",((s,o)=>{if(o&&!/t0|t[1-9]\d{1,}/.test(o))throw new Error("Cannot extract date from a formated UUID with no timestamp in the format");const i=o?o.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g,(s=>{const o={$r:s=>[...Array(s)].map((()=>"r")).join(""),$s:s=>[...Array(s)].map((()=>"s")).join(""),$t:s=>[...Array(s)].map((()=>"t")).join("")},i=s.slice(0,2),a=Number.parseInt(s.slice(2),10);return o[i](a)})).replace(/^(.*?)(t{8,})(.*)$/g,((o,i,a)=>s.substring(i.length,i.length+a.length))):s;if(8===i.length)return new Date(1e3*Number.parseInt(i,16));if(i.length<10)throw new Error("Stamp length invalid");const a=Number.parseInt(i.substring(i.length-1),16);return new Date(1e3*Number.parseInt(i.substring(a,a+8),16))})),__publicField(this,"setCounter",(s=>{this.counter=s})),__publicField(this,"validate",((s,o)=>{const i=o?this._normalizeDictionary(o):this.dict;return s.split("").every((s=>i.includes(s)))}));const o=__spreadValues(__spreadValues({},C),s);this.counter=0,this.debug=!1,this.dict=[],this.version="5.3.2";const{dictionary:i,shuffle:a,length:u,counter:_}=o;this.uuidLength=u,this.setDictionary(i,a),this.setCounter(_),this.debug=o.debug,this.log(this.dict),this.log("Generator instantiated with Dictionary Size ".concat(this.dictLength," and counter set to ").concat(this.counter)),this.log=this.log.bind(this),this.setDictionary=this.setDictionary.bind(this),this.setCounter=this.setCounter.bind(this),this.seq=this.seq.bind(this),this.sequentialUUID=this.sequentialUUID.bind(this),this.rnd=this.rnd.bind(this),this.randomUUID=this.randomUUID.bind(this),this.fmt=this.fmt.bind(this),this.formattedUUID=this.formattedUUID.bind(this),this.availableUUIDs=this.availableUUIDs.bind(this),this.approxMaxBeforeCollision=this.approxMaxBeforeCollision.bind(this),this.collisionProbability=this.collisionProbability.bind(this),this.uniqueness=this.uniqueness.bind(this),this.getVersion=this.getVersion.bind(this),this.stamp=this.stamp.bind(this),this.parseStamp=this.parseStamp.bind(this)}};__publicField(j,"default",j);var L,B=j;return L=w,((a,_,w,x)=>{if(_&&"object"==typeof _||"function"==typeof _)for(let C of i(_))u.call(a,C)||C===w||s(a,C,{get:()=>_[C],enumerable:!(x=o(_,C))||x.enumerable});return a})(s({},"__esModule",{value:!0}),L)})();s.exports=o.default,"undefined"!=typeof window&&(o=o.default)},9325:(s,o,i)=>{var a=i(34840),u="object"==typeof self&&self&&self.Object===Object&&self,_=a||u||Function("return this")();s.exports=_},9404:function(s){s.exports=function(){"use strict";var s=Array.prototype.slice;function createClass(s,o){o&&(s.prototype=Object.create(o.prototype)),s.prototype.constructor=s}function Iterable(s){return isIterable(s)?s:Seq(s)}function KeyedIterable(s){return isKeyed(s)?s:KeyedSeq(s)}function IndexedIterable(s){return isIndexed(s)?s:IndexedSeq(s)}function SetIterable(s){return isIterable(s)&&!isAssociative(s)?s:SetSeq(s)}function isIterable(s){return!(!s||!s[o])}function isKeyed(s){return!(!s||!s[i])}function isIndexed(s){return!(!s||!s[a])}function isAssociative(s){return isKeyed(s)||isIndexed(s)}function isOrdered(s){return!(!s||!s[u])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var o="@@__IMMUTABLE_ITERABLE__@@",i="@@__IMMUTABLE_KEYED__@@",a="@@__IMMUTABLE_INDEXED__@@",u="@@__IMMUTABLE_ORDERED__@@",_="delete",w=5,x=1<>>0;if(""+i!==o||4294967295===i)return NaN;o=i}return o<0?ensureSize(s)+o:o}function returnTrue(){return!0}function wholeSlice(s,o,i){return(0===s||void 0!==i&&s<=-i)&&(void 0===o||void 0!==i&&o>=i)}function resolveBegin(s,o){return resolveIndex(s,o,0)}function resolveEnd(s,o){return resolveIndex(s,o,o)}function resolveIndex(s,o,i){return void 0===s?i:s<0?Math.max(0,o+s):void 0===o?s:Math.min(o,s)}var $=0,U=1,V=2,z="function"==typeof Symbol&&Symbol.iterator,Y="@@iterator",Z=z||Y;function Iterator(s){this.next=s}function iteratorValue(s,o,i,a){var u=0===s?o:1===s?i:[o,i];return a?a.value=u:a={value:u,done:!1},a}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(s){return!!getIteratorFn(s)}function isIterator(s){return s&&"function"==typeof s.next}function getIterator(s){var o=getIteratorFn(s);return o&&o.call(s)}function getIteratorFn(s){var o=s&&(z&&s[z]||s[Y]);if("function"==typeof o)return o}function isArrayLike(s){return s&&"number"==typeof s.length}function Seq(s){return null==s?emptySequence():isIterable(s)?s.toSeq():seqFromValue(s)}function KeyedSeq(s){return null==s?emptySequence().toKeyedSeq():isIterable(s)?isKeyed(s)?s.toSeq():s.fromEntrySeq():keyedSeqFromValue(s)}function IndexedSeq(s){return null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s.toIndexedSeq():indexedSeqFromValue(s)}function SetSeq(s){return(null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s:indexedSeqFromValue(s)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=$,Iterator.VALUES=U,Iterator.ENTRIES=V,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[Z]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(s,o){return seqIterate(this,s,o,!0)},Seq.prototype.__iterator=function(s,o){return seqIterator(this,s,o,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(s,o){return seqIterate(this,s,o,!1)},IndexedSeq.prototype.__iterator=function(s,o){return seqIterator(this,s,o,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var ee,ie,ae,ce="@@__IMMUTABLE_SEQ__@@";function ArraySeq(s){this._array=s,this.size=s.length}function ObjectSeq(s){var o=Object.keys(s);this._object=s,this._keys=o,this.size=o.length}function IterableSeq(s){this._iterable=s,this.size=s.length||s.size}function IteratorSeq(s){this._iterator=s,this._iteratorCache=[]}function isSeq(s){return!(!s||!s[ce])}function emptySequence(){return ee||(ee=new ArraySeq([]))}function keyedSeqFromValue(s){var o=Array.isArray(s)?new ArraySeq(s).fromEntrySeq():isIterator(s)?new IteratorSeq(s).fromEntrySeq():hasIterator(s)?new IterableSeq(s).fromEntrySeq():"object"==typeof s?new ObjectSeq(s):void 0;if(!o)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+s);return o}function indexedSeqFromValue(s){var o=maybeIndexedSeqFromValue(s);if(!o)throw new TypeError("Expected Array or iterable object of values: "+s);return o}function seqFromValue(s){var o=maybeIndexedSeqFromValue(s)||"object"==typeof s&&new ObjectSeq(s);if(!o)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+s);return o}function maybeIndexedSeqFromValue(s){return isArrayLike(s)?new ArraySeq(s):isIterator(s)?new IteratorSeq(s):hasIterator(s)?new IterableSeq(s):void 0}function seqIterate(s,o,i,a){var u=s._cache;if(u){for(var _=u.length-1,w=0;w<=_;w++){var x=u[i?_-w:w];if(!1===o(x[1],a?x[0]:w,s))return w+1}return w}return s.__iterateUncached(o,i)}function seqIterator(s,o,i,a){var u=s._cache;if(u){var _=u.length-1,w=0;return new Iterator((function(){var s=u[i?_-w:w];return w++>_?iteratorDone():iteratorValue(o,a?s[0]:w-1,s[1])}))}return s.__iteratorUncached(o,i)}function fromJS(s,o){return o?fromJSWith(o,s,"",{"":s}):fromJSDefault(s)}function fromJSWith(s,o,i,a){return Array.isArray(o)?s.call(a,i,IndexedSeq(o).map((function(i,a){return fromJSWith(s,i,a,o)}))):isPlainObj(o)?s.call(a,i,KeyedSeq(o).map((function(i,a){return fromJSWith(s,i,a,o)}))):o}function fromJSDefault(s){return Array.isArray(s)?IndexedSeq(s).map(fromJSDefault).toList():isPlainObj(s)?KeyedSeq(s).map(fromJSDefault).toMap():s}function isPlainObj(s){return s&&(s.constructor===Object||void 0===s.constructor)}function is(s,o){if(s===o||s!=s&&o!=o)return!0;if(!s||!o)return!1;if("function"==typeof s.valueOf&&"function"==typeof o.valueOf){if((s=s.valueOf())===(o=o.valueOf())||s!=s&&o!=o)return!0;if(!s||!o)return!1}return!("function"!=typeof s.equals||"function"!=typeof o.equals||!s.equals(o))}function deepEqual(s,o){if(s===o)return!0;if(!isIterable(o)||void 0!==s.size&&void 0!==o.size&&s.size!==o.size||void 0!==s.__hash&&void 0!==o.__hash&&s.__hash!==o.__hash||isKeyed(s)!==isKeyed(o)||isIndexed(s)!==isIndexed(o)||isOrdered(s)!==isOrdered(o))return!1;if(0===s.size&&0===o.size)return!0;var i=!isAssociative(s);if(isOrdered(s)){var a=s.entries();return o.every((function(s,o){var u=a.next().value;return u&&is(u[1],s)&&(i||is(u[0],o))}))&&a.next().done}var u=!1;if(void 0===s.size)if(void 0===o.size)"function"==typeof s.cacheResult&&s.cacheResult();else{u=!0;var _=s;s=o,o=_}var w=!0,x=o.__iterate((function(o,a){if(i?!s.has(o):u?!is(o,s.get(a,j)):!is(s.get(a,j),o))return w=!1,!1}));return w&&s.size===x}function Repeat(s,o){if(!(this instanceof Repeat))return new Repeat(s,o);if(this._value=s,this.size=void 0===o?1/0:Math.max(0,o),0===this.size){if(ie)return ie;ie=this}}function invariant(s,o){if(!s)throw new Error(o)}function Range(s,o,i){if(!(this instanceof Range))return new Range(s,o,i);if(invariant(0!==i,"Cannot step a Range by 0"),s=s||0,void 0===o&&(o=1/0),i=void 0===i?1:Math.abs(i),oa?iteratorDone():iteratorValue(s,u,i[o?a-u++:u++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(s,o){return void 0===o||this.has(s)?this._object[s]:o},ObjectSeq.prototype.has=function(s){return this._object.hasOwnProperty(s)},ObjectSeq.prototype.__iterate=function(s,o){for(var i=this._object,a=this._keys,u=a.length-1,_=0;_<=u;_++){var w=a[o?u-_:_];if(!1===s(i[w],w,this))return _+1}return _},ObjectSeq.prototype.__iterator=function(s,o){var i=this._object,a=this._keys,u=a.length-1,_=0;return new Iterator((function(){var w=a[o?u-_:_];return _++>u?iteratorDone():iteratorValue(s,w,i[w])}))},ObjectSeq.prototype[u]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(s,o){if(o)return this.cacheResult().__iterate(s,o);var i=getIterator(this._iterable),a=0;if(isIterator(i))for(var u;!(u=i.next()).done&&!1!==s(u.value,a++,this););return a},IterableSeq.prototype.__iteratorUncached=function(s,o){if(o)return this.cacheResult().__iterator(s,o);var i=getIterator(this._iterable);if(!isIterator(i))return new Iterator(iteratorDone);var a=0;return new Iterator((function(){var o=i.next();return o.done?o:iteratorValue(s,a++,o.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(s,o){if(o)return this.cacheResult().__iterate(s,o);for(var i,a=this._iterator,u=this._iteratorCache,_=0;_=a.length){var o=i.next();if(o.done)return o;a[u]=o.value}return iteratorValue(s,u,a[u++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(s,o){return this.has(s)?this._value:o},Repeat.prototype.includes=function(s){return is(this._value,s)},Repeat.prototype.slice=function(s,o){var i=this.size;return wholeSlice(s,o,i)?this:new Repeat(this._value,resolveEnd(o,i)-resolveBegin(s,i))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(s){return is(this._value,s)?0:-1},Repeat.prototype.lastIndexOf=function(s){return is(this._value,s)?this.size:-1},Repeat.prototype.__iterate=function(s,o){for(var i=0;i=0&&o=0&&ii?iteratorDone():iteratorValue(s,_++,w)}))},Range.prototype.equals=function(s){return s instanceof Range?this._start===s._start&&this._end===s._end&&this._step===s._step:deepEqual(this,s)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var le="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(s,o){var i=65535&(s|=0),a=65535&(o|=0);return i*a+((s>>>16)*a+i*(o>>>16)<<16>>>0)|0};function smi(s){return s>>>1&1073741824|3221225471&s}function hash(s){if(!1===s||null==s)return 0;if("function"==typeof s.valueOf&&(!1===(s=s.valueOf())||null==s))return 0;if(!0===s)return 1;var o=typeof s;if("number"===o){if(s!=s||s===1/0)return 0;var i=0|s;for(i!==s&&(i^=4294967295*s);s>4294967295;)i^=s/=4294967295;return smi(i)}if("string"===o)return s.length>Se?cachedHashString(s):hashString(s);if("function"==typeof s.hashCode)return s.hashCode();if("object"===o)return hashJSObj(s);if("function"==typeof s.toString)return hashString(s.toString());throw new Error("Value type "+o+" cannot be hashed.")}function cachedHashString(s){var o=Pe[s];return void 0===o&&(o=hashString(s),xe===we&&(xe=0,Pe={}),xe++,Pe[s]=o),o}function hashString(s){for(var o=0,i=0;i0)switch(s.nodeType){case 1:return s.uniqueID;case 9:return s.documentElement&&s.documentElement.uniqueID}}var fe,ye="function"==typeof WeakMap;ye&&(fe=new WeakMap);var be=0,_e="__immutablehash__";"function"==typeof Symbol&&(_e=Symbol(_e));var Se=16,we=255,xe=0,Pe={};function assertNotInfinite(s){invariant(s!==1/0,"Cannot perform this action with an infinite size.")}function Map(s){return null==s?emptyMap():isMap(s)&&!isOrdered(s)?s:emptyMap().withMutations((function(o){var i=KeyedIterable(s);assertNotInfinite(i.size),i.forEach((function(s,i){return o.set(i,s)}))}))}function isMap(s){return!(!s||!s[Re])}createClass(Map,KeyedCollection),Map.of=function(){var o=s.call(arguments,0);return emptyMap().withMutations((function(s){for(var i=0;i=o.length)throw new Error("Missing value for key: "+o[i]);s.set(o[i],o[i+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(s,o){return this._root?this._root.get(0,void 0,s,o):o},Map.prototype.set=function(s,o){return updateMap(this,s,o)},Map.prototype.setIn=function(s,o){return this.updateIn(s,j,(function(){return o}))},Map.prototype.remove=function(s){return updateMap(this,s,j)},Map.prototype.deleteIn=function(s){return this.updateIn(s,(function(){return j}))},Map.prototype.update=function(s,o,i){return 1===arguments.length?s(this):this.updateIn([s],o,i)},Map.prototype.updateIn=function(s,o,i){i||(i=o,o=void 0);var a=updateInDeepMap(this,forceIterator(s),o,i);return a===j?void 0:a},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(o){return mergeIntoMapWith(this,o,s.call(arguments,1))},Map.prototype.mergeIn=function(o){var i=s.call(arguments,1);return this.updateIn(o,emptyMap(),(function(s){return"function"==typeof s.merge?s.merge.apply(s,i):i[i.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(o){var i=s.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(o),i)},Map.prototype.mergeDeepIn=function(o){var i=s.call(arguments,1);return this.updateIn(o,emptyMap(),(function(s){return"function"==typeof s.mergeDeep?s.mergeDeep.apply(s,i):i[i.length-1]}))},Map.prototype.sort=function(s){return OrderedMap(sortFactory(this,s))},Map.prototype.sortBy=function(s,o){return OrderedMap(sortFactory(this,o,s))},Map.prototype.withMutations=function(s){var o=this.asMutable();return s(o),o.wasAltered()?o.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(s,o){return new MapIterator(this,s,o)},Map.prototype.__iterate=function(s,o){var i=this,a=0;return this._root&&this._root.iterate((function(o){return a++,s(o[1],o[0],i)}),o),a},Map.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeMap(this.size,this._root,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Map.isMap=isMap;var Te,Re="@@__IMMUTABLE_MAP__@@",$e=Map.prototype;function ArrayMapNode(s,o){this.ownerID=s,this.entries=o}function BitmapIndexedNode(s,o,i){this.ownerID=s,this.bitmap=o,this.nodes=i}function HashArrayMapNode(s,o,i){this.ownerID=s,this.count=o,this.nodes=i}function HashCollisionNode(s,o,i){this.ownerID=s,this.keyHash=o,this.entries=i}function ValueNode(s,o,i){this.ownerID=s,this.keyHash=o,this.entry=i}function MapIterator(s,o,i){this._type=o,this._reverse=i,this._stack=s._root&&mapIteratorFrame(s._root)}function mapIteratorValue(s,o){return iteratorValue(s,o[0],o[1])}function mapIteratorFrame(s,o){return{node:s,index:0,__prev:o}}function makeMap(s,o,i,a){var u=Object.create($e);return u.size=s,u._root=o,u.__ownerID=i,u.__hash=a,u.__altered=!1,u}function emptyMap(){return Te||(Te=makeMap(0))}function updateMap(s,o,i){var a,u;if(s._root){var _=MakeRef(L),w=MakeRef(B);if(a=updateNode(s._root,s.__ownerID,0,void 0,o,i,_,w),!w.value)return s;u=s.size+(_.value?i===j?-1:1:0)}else{if(i===j)return s;u=1,a=new ArrayMapNode(s.__ownerID,[[o,i]])}return s.__ownerID?(s.size=u,s._root=a,s.__hash=void 0,s.__altered=!0,s):a?makeMap(u,a):emptyMap()}function updateNode(s,o,i,a,u,_,w,x){return s?s.update(o,i,a,u,_,w,x):_===j?s:(SetRef(x),SetRef(w),new ValueNode(o,a,[u,_]))}function isLeafNode(s){return s.constructor===ValueNode||s.constructor===HashCollisionNode}function mergeIntoNode(s,o,i,a,u){if(s.keyHash===a)return new HashCollisionNode(o,a,[s.entry,u]);var _,x=(0===i?s.keyHash:s.keyHash>>>i)&C,j=(0===i?a:a>>>i)&C;return new BitmapIndexedNode(o,1<>>=1)w[C]=1&i?o[_++]:void 0;return w[a]=u,new HashArrayMapNode(s,_+1,w)}function mergeIntoMapWith(s,o,i){for(var a=[],u=0;u>1&1431655765))+(s>>2&858993459))+(s>>4)&252645135,s+=s>>8,127&(s+=s>>16)}function setIn(s,o,i,a){var u=a?s:arrCopy(s);return u[o]=i,u}function spliceIn(s,o,i,a){var u=s.length+1;if(a&&o+1===u)return s[o]=i,s;for(var _=new Array(u),w=0,x=0;x=qe)return createNodes(s,C,a,u);var U=s&&s===this.ownerID,V=U?C:arrCopy(C);return $?x?L===B-1?V.pop():V[L]=V.pop():V[L]=[a,u]:V.push([a,u]),U?(this.entries=V,this):new ArrayMapNode(s,V)}},BitmapIndexedNode.prototype.get=function(s,o,i,a){void 0===o&&(o=hash(i));var u=1<<((0===s?o:o>>>s)&C),_=this.bitmap;return _&u?this.nodes[popCount(_&u-1)].get(s+w,o,i,a):a},BitmapIndexedNode.prototype.update=function(s,o,i,a,u,_,x){void 0===i&&(i=hash(a));var L=(0===o?i:i>>>o)&C,B=1<=ze)return expandNodes(s,z,$,L,Z);if(U&&!Z&&2===z.length&&isLeafNode(z[1^V]))return z[1^V];if(U&&Z&&1===z.length&&isLeafNode(Z))return Z;var ee=s&&s===this.ownerID,ie=U?Z?$:$^B:$|B,ae=U?Z?setIn(z,V,Z,ee):spliceOut(z,V,ee):spliceIn(z,V,Z,ee);return ee?(this.bitmap=ie,this.nodes=ae,this):new BitmapIndexedNode(s,ie,ae)},HashArrayMapNode.prototype.get=function(s,o,i,a){void 0===o&&(o=hash(i));var u=(0===s?o:o>>>s)&C,_=this.nodes[u];return _?_.get(s+w,o,i,a):a},HashArrayMapNode.prototype.update=function(s,o,i,a,u,_,x){void 0===i&&(i=hash(a));var L=(0===o?i:i>>>o)&C,B=u===j,$=this.nodes,U=$[L];if(B&&!U)return this;var V=updateNode(U,s,o+w,i,a,u,_,x);if(V===U)return this;var z=this.count;if(U){if(!V&&--z0&&a=0&&s>>o&C;if(a>=this.array.length)return new VNode([],s);var u,_=0===a;if(o>0){var x=this.array[a];if((u=x&&x.removeBefore(s,o-w,i))===x&&_)return this}if(_&&!u)return this;var j=editableVNode(this,s);if(!_)for(var L=0;L>>o&C;if(u>=this.array.length)return this;if(o>0){var _=this.array[u];if((a=_&&_.removeAfter(s,o-w,i))===_&&u===this.array.length-1)return this}var x=editableVNode(this,s);return x.array.splice(u+1),a&&(x.array[u]=a),x};var Xe,Qe,et={};function iterateList(s,o){var i=s._origin,a=s._capacity,u=getTailOffset(a),_=s._tail;return iterateNodeOrLeaf(s._root,s._level,0);function iterateNodeOrLeaf(s,o,i){return 0===o?iterateLeaf(s,i):iterateNode(s,o,i)}function iterateLeaf(s,w){var C=w===u?_&&_.array:s&&s.array,j=w>i?0:i-w,L=a-w;return L>x&&(L=x),function(){if(j===L)return et;var s=o?--L:j++;return C&&C[s]}}function iterateNode(s,u,_){var C,j=s&&s.array,L=_>i?0:i-_>>u,B=1+(a-_>>u);return B>x&&(B=x),function(){for(;;){if(C){var s=C();if(s!==et)return s;C=null}if(L===B)return et;var i=o?--B:L++;C=iterateNodeOrLeaf(j&&j[i],u-w,_+(i<=s.size||o<0)return s.withMutations((function(s){o<0?setListBounds(s,o).set(0,i):setListBounds(s,0,o+1).set(o,i)}));o+=s._origin;var a=s._tail,u=s._root,_=MakeRef(B);return o>=getTailOffset(s._capacity)?a=updateVNode(a,s.__ownerID,0,o,i,_):u=updateVNode(u,s.__ownerID,s._level,o,i,_),_.value?s.__ownerID?(s._root=u,s._tail=a,s.__hash=void 0,s.__altered=!0,s):makeList(s._origin,s._capacity,s._level,u,a):s}function updateVNode(s,o,i,a,u,_){var x,j=a>>>i&C,L=s&&j0){var B=s&&s.array[j],$=updateVNode(B,o,i-w,a,u,_);return $===B?s:((x=editableVNode(s,o)).array[j]=$,x)}return L&&s.array[j]===u?s:(SetRef(_),x=editableVNode(s,o),void 0===u&&j===x.array.length-1?x.array.pop():x.array[j]=u,x)}function editableVNode(s,o){return o&&s&&o===s.ownerID?s:new VNode(s?s.array.slice():[],o)}function listNodeFor(s,o){if(o>=getTailOffset(s._capacity))return s._tail;if(o<1<0;)i=i.array[o>>>a&C],a-=w;return i}}function setListBounds(s,o,i){void 0!==o&&(o|=0),void 0!==i&&(i|=0);var a=s.__ownerID||new OwnerID,u=s._origin,_=s._capacity,x=u+o,j=void 0===i?_:i<0?_+i:u+i;if(x===u&&j===_)return s;if(x>=j)return s.clear();for(var L=s._level,B=s._root,$=0;x+$<0;)B=new VNode(B&&B.array.length?[void 0,B]:[],a),$+=1<<(L+=w);$&&(x+=$,u+=$,j+=$,_+=$);for(var U=getTailOffset(_),V=getTailOffset(j);V>=1<U?new VNode([],a):z;if(z&&V>U&&x<_&&z.array.length){for(var Z=B=editableVNode(B,a),ee=L;ee>w;ee-=w){var ie=U>>>ee&C;Z=Z.array[ie]=editableVNode(Z.array[ie],a)}Z.array[U>>>w&C]=z}if(j<_&&(Y=Y&&Y.removeAfter(a,0,j)),x>=V)x-=V,j-=V,L=w,B=null,Y=Y&&Y.removeBefore(a,0,x);else if(x>u||V>>L&C;if(ae!==V>>>L&C)break;ae&&($+=(1<u&&(B=B.removeBefore(a,L,x-$)),B&&Vu&&(u=x.size),isIterable(w)||(x=x.map((function(s){return fromJS(s)}))),a.push(x)}return u>s.size&&(s=s.setSize(u)),mergeIntoCollectionWith(s,o,a)}function getTailOffset(s){return s>>w<=x&&w.size>=2*_.size?(a=(u=w.filter((function(s,o){return void 0!==s&&C!==o}))).toKeyedSeq().map((function(s){return s[0]})).flip().toMap(),s.__ownerID&&(a.__ownerID=u.__ownerID=s.__ownerID)):(a=_.remove(o),u=C===w.size-1?w.pop():w.set(C,void 0))}else if(L){if(i===w.get(C)[1])return s;a=_,u=w.set(C,[o,i])}else a=_.set(o,w.size),u=w.set(w.size,[o,i]);return s.__ownerID?(s.size=a.size,s._map=a,s._list=u,s.__hash=void 0,s):makeOrderedMap(a,u)}function ToKeyedSequence(s,o){this._iter=s,this._useKeys=o,this.size=s.size}function ToIndexedSequence(s){this._iter=s,this.size=s.size}function ToSetSequence(s){this._iter=s,this.size=s.size}function FromEntriesSequence(s){this._iter=s,this.size=s.size}function flipFactory(s){var o=makeSequence(s);return o._iter=s,o.size=s.size,o.flip=function(){return s},o.reverse=function(){var o=s.reverse.apply(this);return o.flip=function(){return s.reverse()},o},o.has=function(o){return s.includes(o)},o.includes=function(o){return s.has(o)},o.cacheResult=cacheResultThrough,o.__iterateUncached=function(o,i){var a=this;return s.__iterate((function(s,i){return!1!==o(i,s,a)}),i)},o.__iteratorUncached=function(o,i){if(o===V){var a=s.__iterator(o,i);return new Iterator((function(){var s=a.next();if(!s.done){var o=s.value[0];s.value[0]=s.value[1],s.value[1]=o}return s}))}return s.__iterator(o===U?$:U,i)},o}function mapFactory(s,o,i){var a=makeSequence(s);return a.size=s.size,a.has=function(o){return s.has(o)},a.get=function(a,u){var _=s.get(a,j);return _===j?u:o.call(i,_,a,s)},a.__iterateUncached=function(a,u){var _=this;return s.__iterate((function(s,u,w){return!1!==a(o.call(i,s,u,w),u,_)}),u)},a.__iteratorUncached=function(a,u){var _=s.__iterator(V,u);return new Iterator((function(){var u=_.next();if(u.done)return u;var w=u.value,x=w[0];return iteratorValue(a,x,o.call(i,w[1],x,s),u)}))},a}function reverseFactory(s,o){var i=makeSequence(s);return i._iter=s,i.size=s.size,i.reverse=function(){return s},s.flip&&(i.flip=function(){var o=flipFactory(s);return o.reverse=function(){return s.flip()},o}),i.get=function(i,a){return s.get(o?i:-1-i,a)},i.has=function(i){return s.has(o?i:-1-i)},i.includes=function(o){return s.includes(o)},i.cacheResult=cacheResultThrough,i.__iterate=function(o,i){var a=this;return s.__iterate((function(s,i){return o(s,i,a)}),!i)},i.__iterator=function(o,i){return s.__iterator(o,!i)},i}function filterFactory(s,o,i,a){var u=makeSequence(s);return a&&(u.has=function(a){var u=s.get(a,j);return u!==j&&!!o.call(i,u,a,s)},u.get=function(a,u){var _=s.get(a,j);return _!==j&&o.call(i,_,a,s)?_:u}),u.__iterateUncached=function(u,_){var w=this,x=0;return s.__iterate((function(s,_,C){if(o.call(i,s,_,C))return x++,u(s,a?_:x-1,w)}),_),x},u.__iteratorUncached=function(u,_){var w=s.__iterator(V,_),x=0;return new Iterator((function(){for(;;){var _=w.next();if(_.done)return _;var C=_.value,j=C[0],L=C[1];if(o.call(i,L,j,s))return iteratorValue(u,a?j:x++,L,_)}}))},u}function countByFactory(s,o,i){var a=Map().asMutable();return s.__iterate((function(u,_){a.update(o.call(i,u,_,s),0,(function(s){return s+1}))})),a.asImmutable()}function groupByFactory(s,o,i){var a=isKeyed(s),u=(isOrdered(s)?OrderedMap():Map()).asMutable();s.__iterate((function(_,w){u.update(o.call(i,_,w,s),(function(s){return(s=s||[]).push(a?[w,_]:_),s}))}));var _=iterableClass(s);return u.map((function(o){return reify(s,_(o))}))}function sliceFactory(s,o,i,a){var u=s.size;if(void 0!==o&&(o|=0),void 0!==i&&(i===1/0?i=u:i|=0),wholeSlice(o,i,u))return s;var _=resolveBegin(o,u),w=resolveEnd(i,u);if(_!=_||w!=w)return sliceFactory(s.toSeq().cacheResult(),o,i,a);var x,C=w-_;C==C&&(x=C<0?0:C);var j=makeSequence(s);return j.size=0===x?x:s.size&&x||void 0,!a&&isSeq(s)&&x>=0&&(j.get=function(o,i){return(o=wrapIndex(this,o))>=0&&ox)return iteratorDone();var s=u.next();return a||o===U?s:iteratorValue(o,C-1,o===$?void 0:s.value[1],s)}))},j}function takeWhileFactory(s,o,i){var a=makeSequence(s);return a.__iterateUncached=function(a,u){var _=this;if(u)return this.cacheResult().__iterate(a,u);var w=0;return s.__iterate((function(s,u,x){return o.call(i,s,u,x)&&++w&&a(s,u,_)})),w},a.__iteratorUncached=function(a,u){var _=this;if(u)return this.cacheResult().__iterator(a,u);var w=s.__iterator(V,u),x=!0;return new Iterator((function(){if(!x)return iteratorDone();var s=w.next();if(s.done)return s;var u=s.value,C=u[0],j=u[1];return o.call(i,j,C,_)?a===V?s:iteratorValue(a,C,j,s):(x=!1,iteratorDone())}))},a}function skipWhileFactory(s,o,i,a){var u=makeSequence(s);return u.__iterateUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterate(u,_);var x=!0,C=0;return s.__iterate((function(s,_,j){if(!x||!(x=o.call(i,s,_,j)))return C++,u(s,a?_:C-1,w)})),C},u.__iteratorUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterator(u,_);var x=s.__iterator(V,_),C=!0,j=0;return new Iterator((function(){var s,_,L;do{if((s=x.next()).done)return a||u===U?s:iteratorValue(u,j++,u===$?void 0:s.value[1],s);var B=s.value;_=B[0],L=B[1],C&&(C=o.call(i,L,_,w))}while(C);return u===V?s:iteratorValue(u,_,L,s)}))},u}function concatFactory(s,o){var i=isKeyed(s),a=[s].concat(o).map((function(s){return isIterable(s)?i&&(s=KeyedIterable(s)):s=i?keyedSeqFromValue(s):indexedSeqFromValue(Array.isArray(s)?s:[s]),s})).filter((function(s){return 0!==s.size}));if(0===a.length)return s;if(1===a.length){var u=a[0];if(u===s||i&&isKeyed(u)||isIndexed(s)&&isIndexed(u))return u}var _=new ArraySeq(a);return i?_=_.toKeyedSeq():isIndexed(s)||(_=_.toSetSeq()),(_=_.flatten(!0)).size=a.reduce((function(s,o){if(void 0!==s){var i=o.size;if(void 0!==i)return s+i}}),0),_}function flattenFactory(s,o,i){var a=makeSequence(s);return a.__iterateUncached=function(a,u){var _=0,w=!1;function flatDeep(s,x){var C=this;s.__iterate((function(s,u){return(!o||x0}function zipWithFactory(s,o,i){var a=makeSequence(s);return a.size=new ArraySeq(i).map((function(s){return s.size})).min(),a.__iterate=function(s,o){for(var i,a=this.__iterator(U,o),u=0;!(i=a.next()).done&&!1!==s(i.value,u++,this););return u},a.__iteratorUncached=function(s,a){var u=i.map((function(s){return s=Iterable(s),getIterator(a?s.reverse():s)})),_=0,w=!1;return new Iterator((function(){var i;return w||(i=u.map((function(s){return s.next()})),w=i.some((function(s){return s.done}))),w?iteratorDone():iteratorValue(s,_++,o.apply(null,i.map((function(s){return s.value}))))}))},a}function reify(s,o){return isSeq(s)?o:s.constructor(o)}function validateEntry(s){if(s!==Object(s))throw new TypeError("Expected [K, V] tuple: "+s)}function resolveSize(s){return assertNotInfinite(s.size),ensureSize(s)}function iterableClass(s){return isKeyed(s)?KeyedIterable:isIndexed(s)?IndexedIterable:SetIterable}function makeSequence(s){return Object.create((isKeyed(s)?KeyedSeq:isIndexed(s)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(s,o){return s>o?1:s=0;i--)o={value:arguments[i],next:o};return this.__ownerID?(this.size=s,this._head=o,this.__hash=void 0,this.__altered=!0,this):makeStack(s,o)},Stack.prototype.pushAll=function(s){if(0===(s=IndexedIterable(s)).size)return this;assertNotInfinite(s.size);var o=this.size,i=this._head;return s.reverse().forEach((function(s){o++,i={value:s,next:i}})),this.__ownerID?(this.size=o,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(o,i)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(s){return this.pushAll(s)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(s,o){if(wholeSlice(s,o,this.size))return this;var i=resolveBegin(s,this.size);if(resolveEnd(o,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,s,o);for(var a=this.size-i,u=this._head;i--;)u=u.next;return this.__ownerID?(this.size=a,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(a,u)},Stack.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeStack(this.size,this._head,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Stack.prototype.__iterate=function(s,o){if(o)return this.reverse().__iterate(s);for(var i=0,a=this._head;a&&!1!==s(a.value,i++,this);)a=a.next;return i},Stack.prototype.__iterator=function(s,o){if(o)return this.reverse().__iterator(s);var i=0,a=this._head;return new Iterator((function(){if(a){var o=a.value;return a=a.next,iteratorValue(s,i++,o)}return iteratorDone()}))},Stack.isStack=isStack;var at,ct="@@__IMMUTABLE_STACK__@@",lt=Stack.prototype;function makeStack(s,o,i,a){var u=Object.create(lt);return u.size=s,u._head=o,u.__ownerID=i,u.__hash=a,u.__altered=!1,u}function emptyStack(){return at||(at=makeStack(0))}function mixin(s,o){var keyCopier=function(i){s.prototype[i]=o[i]};return Object.keys(o).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(o).forEach(keyCopier),s}lt[ct]=!0,lt.withMutations=$e.withMutations,lt.asMutable=$e.asMutable,lt.asImmutable=$e.asImmutable,lt.wasAltered=$e.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var s=new Array(this.size||0);return this.valueSeq().__iterate((function(o,i){s[i]=o})),s},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJS?s.toJS():s})).__toJS()},toJSON:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJSON?s.toJSON():s})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var s={};return this.__iterate((function(o,i){s[i]=o})),s},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(s,o){return 0===this.size?s+o:s+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+o},concat:function(){return reify(this,concatFactory(this,s.call(arguments,0)))},includes:function(s){return this.some((function(o){return is(o,s)}))},entries:function(){return this.__iterator(V)},every:function(s,o){assertNotInfinite(this.size);var i=!0;return this.__iterate((function(a,u,_){if(!s.call(o,a,u,_))return i=!1,!1})),i},filter:function(s,o){return reify(this,filterFactory(this,s,o,!0))},find:function(s,o,i){var a=this.findEntry(s,o);return a?a[1]:i},forEach:function(s,o){return assertNotInfinite(this.size),this.__iterate(o?s.bind(o):s)},join:function(s){assertNotInfinite(this.size),s=void 0!==s?""+s:",";var o="",i=!0;return this.__iterate((function(a){i?i=!1:o+=s,o+=null!=a?a.toString():""})),o},keys:function(){return this.__iterator($)},map:function(s,o){return reify(this,mapFactory(this,s,o))},reduce:function(s,o,i){var a,u;return assertNotInfinite(this.size),arguments.length<2?u=!0:a=o,this.__iterate((function(o,_,w){u?(u=!1,a=o):a=s.call(i,a,o,_,w)})),a},reduceRight:function(s,o,i){var a=this.toKeyedSeq().reverse();return a.reduce.apply(a,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(s,o){return reify(this,sliceFactory(this,s,o,!0))},some:function(s,o){return!this.every(not(s),o)},sort:function(s){return reify(this,sortFactory(this,s))},values:function(){return this.__iterator(U)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(s,o){return ensureSize(s?this.toSeq().filter(s,o):this)},countBy:function(s,o){return countByFactory(this,s,o)},equals:function(s){return deepEqual(this,s)},entrySeq:function(){var s=this;if(s._cache)return new ArraySeq(s._cache);var o=s.toSeq().map(entryMapper).toIndexedSeq();return o.fromEntrySeq=function(){return s.toSeq()},o},filterNot:function(s,o){return this.filter(not(s),o)},findEntry:function(s,o,i){var a=i;return this.__iterate((function(i,u,_){if(s.call(o,i,u,_))return a=[u,i],!1})),a},findKey:function(s,o){var i=this.findEntry(s,o);return i&&i[0]},findLast:function(s,o,i){return this.toKeyedSeq().reverse().find(s,o,i)},findLastEntry:function(s,o,i){return this.toKeyedSeq().reverse().findEntry(s,o,i)},findLastKey:function(s,o){return this.toKeyedSeq().reverse().findKey(s,o)},first:function(){return this.find(returnTrue)},flatMap:function(s,o){return reify(this,flatMapFactory(this,s,o))},flatten:function(s){return reify(this,flattenFactory(this,s,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(s,o){return this.find((function(o,i){return is(i,s)}),void 0,o)},getIn:function(s,o){for(var i,a=this,u=forceIterator(s);!(i=u.next()).done;){var _=i.value;if((a=a&&a.get?a.get(_,j):j)===j)return o}return a},groupBy:function(s,o){return groupByFactory(this,s,o)},has:function(s){return this.get(s,j)!==j},hasIn:function(s){return this.getIn(s,j)!==j},isSubset:function(s){return s="function"==typeof s.includes?s:Iterable(s),this.every((function(o){return s.includes(o)}))},isSuperset:function(s){return(s="function"==typeof s.isSubset?s:Iterable(s)).isSubset(this)},keyOf:function(s){return this.findKey((function(o){return is(o,s)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(s){return this.toKeyedSeq().reverse().keyOf(s)},max:function(s){return maxFactory(this,s)},maxBy:function(s,o){return maxFactory(this,o,s)},min:function(s){return maxFactory(this,s?neg(s):defaultNegComparator)},minBy:function(s,o){return maxFactory(this,o?neg(o):defaultNegComparator,s)},rest:function(){return this.slice(1)},skip:function(s){return this.slice(Math.max(0,s))},skipLast:function(s){return reify(this,this.toSeq().reverse().skip(s).reverse())},skipWhile:function(s,o){return reify(this,skipWhileFactory(this,s,o,!0))},skipUntil:function(s,o){return this.skipWhile(not(s),o)},sortBy:function(s,o){return reify(this,sortFactory(this,o,s))},take:function(s){return this.slice(0,Math.max(0,s))},takeLast:function(s){return reify(this,this.toSeq().reverse().take(s).reverse())},takeWhile:function(s,o){return reify(this,takeWhileFactory(this,s,o))},takeUntil:function(s,o){return this.takeWhile(not(s),o)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var ut=Iterable.prototype;ut[o]=!0,ut[Z]=ut.values,ut.__toJS=ut.toArray,ut.__toStringMapper=quoteString,ut.inspect=ut.toSource=function(){return this.toString()},ut.chain=ut.flatMap,ut.contains=ut.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(s,o){var i=this,a=0;return reify(this,this.toSeq().map((function(u,_){return s.call(o,[_,u],a++,i)})).fromEntrySeq())},mapKeys:function(s,o){var i=this;return reify(this,this.toSeq().flip().map((function(a,u){return s.call(o,a,u,i)})).flip())}});var pt=KeyedIterable.prototype;function keyMapper(s,o){return o}function entryMapper(s,o){return[o,s]}function not(s){return function(){return!s.apply(this,arguments)}}function neg(s){return function(){return-s.apply(this,arguments)}}function quoteString(s){return"string"==typeof s?JSON.stringify(s):String(s)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(s,o){return so?-1:0}function hashIterable(s){if(s.size===1/0)return 0;var o=isOrdered(s),i=isKeyed(s),a=o?1:0;return murmurHashOfSize(s.__iterate(i?o?function(s,o){a=31*a+hashMerge(hash(s),hash(o))|0}:function(s,o){a=a+hashMerge(hash(s),hash(o))|0}:o?function(s){a=31*a+hash(s)|0}:function(s){a=a+hash(s)|0}),a)}function murmurHashOfSize(s,o){return o=le(o,3432918353),o=le(o<<15|o>>>-15,461845907),o=le(o<<13|o>>>-13,5),o=le((o=o+3864292196^s)^o>>>16,2246822507),o=smi((o=le(o^o>>>13,3266489909))^o>>>16)}function hashMerge(s,o){return s^o+2654435769+(s<<6)+(s>>2)}return pt[i]=!0,pt[Z]=ut.entries,pt.__toJS=ut.toObject,pt.__toStringMapper=function(s,o){return JSON.stringify(o)+": "+quoteString(s)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(s,o){return reify(this,filterFactory(this,s,o,!1))},findIndex:function(s,o){var i=this.findEntry(s,o);return i?i[0]:-1},indexOf:function(s){var o=this.keyOf(s);return void 0===o?-1:o},lastIndexOf:function(s){var o=this.lastKeyOf(s);return void 0===o?-1:o},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(s,o){return reify(this,sliceFactory(this,s,o,!1))},splice:function(s,o){var i=arguments.length;if(o=Math.max(0|o,0),0===i||2===i&&!o)return this;s=resolveBegin(s,s<0?this.count():this.size);var a=this.slice(0,s);return reify(this,1===i?a:a.concat(arrCopy(arguments,2),this.slice(s+o)))},findLastIndex:function(s,o){var i=this.findLastEntry(s,o);return i?i[0]:-1},first:function(){return this.get(0)},flatten:function(s){return reify(this,flattenFactory(this,s,!1))},get:function(s,o){return(s=wrapIndex(this,s))<0||this.size===1/0||void 0!==this.size&&s>this.size?o:this.find((function(o,i){return i===s}),void 0,o)},has:function(s){return(s=wrapIndex(this,s))>=0&&(void 0!==this.size?this.size===1/0||s{"use strict";i(71340);var a=i(92046);s.exports=a.Object.assign},9957:(s,o,i)=>{"use strict";var a=Function.prototype.call,u=Object.prototype.hasOwnProperty,_=i(66743);s.exports=_.call(a,u)},9999:(s,o,i)=>{var a=i(37217),u=i(83729),_=i(16547),w=i(74733),x=i(43838),C=i(93290),j=i(23007),L=i(92271),B=i(48948),$=i(50002),U=i(83349),V=i(5861),z=i(76189),Y=i(77199),Z=i(35529),ee=i(56449),ie=i(3656),ae=i(87730),ce=i(23805),le=i(38440),pe=i(95950),de=i(37241),fe="[object Arguments]",ye="[object Function]",be="[object Object]",_e={};_e[fe]=_e["[object Array]"]=_e["[object ArrayBuffer]"]=_e["[object DataView]"]=_e["[object Boolean]"]=_e["[object Date]"]=_e["[object Float32Array]"]=_e["[object Float64Array]"]=_e["[object Int8Array]"]=_e["[object Int16Array]"]=_e["[object Int32Array]"]=_e["[object Map]"]=_e["[object Number]"]=_e[be]=_e["[object RegExp]"]=_e["[object Set]"]=_e["[object String]"]=_e["[object Symbol]"]=_e["[object Uint8Array]"]=_e["[object Uint8ClampedArray]"]=_e["[object Uint16Array]"]=_e["[object Uint32Array]"]=!0,_e["[object Error]"]=_e[ye]=_e["[object WeakMap]"]=!1,s.exports=function baseClone(s,o,i,Se,we,xe){var Pe,Te=1&o,Re=2&o,$e=4&o;if(i&&(Pe=we?i(s,Se,we,xe):i(s)),void 0!==Pe)return Pe;if(!ce(s))return s;var qe=ee(s);if(qe){if(Pe=z(s),!Te)return j(s,Pe)}else{var ze=V(s),We=ze==ye||"[object GeneratorFunction]"==ze;if(ie(s))return C(s,Te);if(ze==be||ze==fe||We&&!we){if(Pe=Re||We?{}:Z(s),!Te)return Re?B(s,x(Pe,s)):L(s,w(Pe,s))}else{if(!_e[ze])return we?s:{};Pe=Y(s,ze,Te)}}xe||(xe=new a);var He=xe.get(s);if(He)return He;xe.set(s,Pe),le(s)?s.forEach((function(a){Pe.add(baseClone(a,o,i,a,s,xe))})):ae(s)&&s.forEach((function(a,u){Pe.set(u,baseClone(a,o,i,u,s,xe))}));var Ye=qe?void 0:($e?Re?U:$:Re?de:pe)(s);return u(Ye||s,(function(a,u){Ye&&(a=s[u=a]),_(Pe,u,baseClone(a,o,i,u,s,xe))})),Pe}},10023:(s,o,i)=>{const a=i(6205),INTS=()=>[{type:a.RANGE,from:48,to:57}],WORDS=()=>[{type:a.CHAR,value:95},{type:a.RANGE,from:97,to:122},{type:a.RANGE,from:65,to:90}].concat(INTS()),WHITESPACE=()=>[{type:a.CHAR,value:9},{type:a.CHAR,value:10},{type:a.CHAR,value:11},{type:a.CHAR,value:12},{type:a.CHAR,value:13},{type:a.CHAR,value:32},{type:a.CHAR,value:160},{type:a.CHAR,value:5760},{type:a.RANGE,from:8192,to:8202},{type:a.CHAR,value:8232},{type:a.CHAR,value:8233},{type:a.CHAR,value:8239},{type:a.CHAR,value:8287},{type:a.CHAR,value:12288},{type:a.CHAR,value:65279}];o.words=()=>({type:a.SET,set:WORDS(),not:!1}),o.notWords=()=>({type:a.SET,set:WORDS(),not:!0}),o.ints=()=>({type:a.SET,set:INTS(),not:!1}),o.notInts=()=>({type:a.SET,set:INTS(),not:!0}),o.whitespace=()=>({type:a.SET,set:WHITESPACE(),not:!1}),o.notWhitespace=()=>({type:a.SET,set:WHITESPACE(),not:!0}),o.anyChar=()=>({type:a.SET,set:[{type:a.CHAR,value:10},{type:a.CHAR,value:13},{type:a.CHAR,value:8232},{type:a.CHAR,value:8233}],not:!0})},10043:(s,o,i)=>{"use strict";var a=i(54018),u=String,_=TypeError;s.exports=function(s){if(a(s))return s;throw new _("Can't set "+u(s)+" as a prototype")}},10076:s=>{"use strict";s.exports=Function.prototype.call},10124:(s,o,i)=>{var a=i(9325);s.exports=function(){return a.Date.now()}},10300:(s,o,i)=>{"use strict";var a=i(13930),u=i(82159),_=i(36624),w=i(4640),x=i(73448),C=TypeError;s.exports=function(s,o){var i=arguments.length<2?x(s):o;if(u(i))return _(a(i,s));throw new C(w(s)+" is not iterable")}},10316:(s,o,i)=>{const a=i(2404),u=i(55973),_=i(92340);class Element{constructor(s,o,i){o&&(this.meta=o),i&&(this.attributes=i),this.content=s}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((s=>{s.parent=this,s.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const s=new this.constructor;return s.element=this.element,this.meta.length&&(s._meta=this.meta.clone()),this.attributes.length&&(s._attributes=this.attributes.clone()),this.content?this.content.clone?s.content=this.content.clone():Array.isArray(this.content)?s.content=this.content.map((s=>s.clone())):s.content=this.content:s.content=this.content,s}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof u?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((s=>s.toValue()),this):this.content}toRef(s){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const o=new this.RefElement(this.id.toValue());return s&&(o.path=s),o}findRecursive(...s){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const o=s.pop();let i=new _;const append=(s,o)=>(s.push(o),s),checkElement=(s,i)=>{i.element===o&&s.push(i);const a=i.findRecursive(o);return a&&a.reduce(append,s),i.content instanceof u&&(i.content.key&&checkElement(s,i.content.key),i.content.value&&checkElement(s,i.content.value)),s};return this.content&&(this.content.element&&checkElement(i,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,i)),s.isEmpty||(i=i.filter((o=>{let i=o.parents.map((s=>s.element));for(const o in s){const a=s[o],u=i.indexOf(a);if(-1===u)return!1;i=i.splice(0,u)}return!0}))),i}set(s){return this.content=s,this}equals(s){return a(this.toValue(),s)}getMetaProperty(s,o){if(!this.meta.hasKey(s)){if(this.isFrozen){const s=this.refract(o);return s.freeze(),s}this.meta.set(s,o)}return this.meta.get(s)}setMetaProperty(s,o){this.meta.set(s,o)}get element(){return this._storedElement||"element"}set element(s){this._storedElement=s}get content(){return this._content}set content(s){if(s instanceof Element)this._content=s;else if(s instanceof _)this.content=s.elements;else if("string"==typeof s||"number"==typeof s||"boolean"==typeof s||"null"===s||null==s)this._content=s;else if(s instanceof u)this._content=s;else if(Array.isArray(s))this._content=s.map(this.refract);else{if("object"!=typeof s)throw new Error("Cannot set content to given value");this._content=Object.keys(s).map((o=>new this.MemberElement(o,s[o])))}}get meta(){if(!this._meta){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._meta=new this.ObjectElement}return this._meta}set meta(s){s instanceof this.ObjectElement?this._meta=s:this.meta.set(s||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._attributes=new this.ObjectElement}return this._attributes}set attributes(s){s instanceof this.ObjectElement?this._attributes=s:this.attributes.set(s||{})}get id(){return this.getMetaProperty("id","")}set id(s){this.setMetaProperty("id",s)}get classes(){return this.getMetaProperty("classes",[])}set classes(s){this.setMetaProperty("classes",s)}get title(){return this.getMetaProperty("title","")}set title(s){this.setMetaProperty("title",s)}get description(){return this.getMetaProperty("description","")}set description(s){this.setMetaProperty("description",s)}get links(){return this.getMetaProperty("links",[])}set links(s){this.setMetaProperty("links",s)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:s}=this;const o=new _;for(;s;)o.push(s),s=s.parent;return o}get children(){if(Array.isArray(this.content))return new _(this.content);if(this.content instanceof u){const s=new _([this.content.key]);return this.content.value&&s.push(this.content.value),s}return this.content instanceof Element?new _([this.content]):new _}get recursiveChildren(){const s=new _;return this.children.forEach((o=>{s.push(o),o.recursiveChildren.forEach((o=>{s.push(o)}))})),s}}s.exports=Element},10392:s=>{s.exports=function getValue(s,o){return null==s?void 0:s[o]}},10487:(s,o,i)=>{"use strict";var a=i(96897),u=i(30655),_=i(73126),w=i(12205);s.exports=function callBind(s){var o=_(arguments),i=s.length-(arguments.length-1);return a(o,1+(i>0?i:0),!0)},u?u(s.exports,"apply",{value:w}):s.exports.apply=w},10776:(s,o,i)=>{var a=i(30756),u=i(95950);s.exports=function getMatchData(s){for(var o=u(s),i=o.length;i--;){var _=o[i],w=s[_];o[i]=[_,w,a(w)]}return o}},10866:(s,o,i)=>{const a=i(6048),u=i(92340);class ObjectSlice extends u{map(s,o){return this.elements.map((i=>s.bind(o)(i.value,i.key,i)))}filter(s,o){return new ObjectSlice(this.elements.filter((i=>s.bind(o)(i.value,i.key,i))))}reject(s,o){return this.filter(a(s.bind(o)))}forEach(s,o){return this.elements.forEach(((i,a)=>{s.bind(o)(i.value,i.key,i,a)}))}keys(){return this.map(((s,o)=>o.toValue()))}values(){return this.map((s=>s.toValue()))}}s.exports=ObjectSlice},11002:s=>{"use strict";s.exports=Function.prototype.apply},11042:(s,o,i)=>{"use strict";var a=i(85582),u=i(1907),_=i(24443),w=i(87170),x=i(36624),C=u([].concat);s.exports=a("Reflect","ownKeys")||function ownKeys(s){var o=_.f(x(s)),i=w.f;return i?C(o,i(s)):o}},11091:(s,o,i)=>{"use strict";var a=i(45951),u=i(76024),_=i(92361),w=i(62250),x=i(13846).f,C=i(7463),j=i(92046),L=i(28311),B=i(61626),$=i(49724);i(36128);var wrapConstructor=function(s){var Wrapper=function(o,i,a){if(this instanceof Wrapper){switch(arguments.length){case 0:return new s;case 1:return new s(o);case 2:return new s(o,i)}return new s(o,i,a)}return u(s,this,arguments)};return Wrapper.prototype=s.prototype,Wrapper};s.exports=function(s,o){var i,u,U,V,z,Y,Z,ee,ie,ae=s.target,ce=s.global,le=s.stat,pe=s.proto,de=ce?a:le?a[ae]:a[ae]&&a[ae].prototype,fe=ce?j:j[ae]||B(j,ae,{})[ae],ye=fe.prototype;for(V in o)u=!(i=C(ce?V:ae+(le?".":"#")+V,s.forced))&&de&&$(de,V),Y=fe[V],u&&(Z=s.dontCallGetSet?(ie=x(de,V))&&ie.value:de[V]),z=u&&Z?Z:o[V],(i||pe||typeof Y!=typeof z)&&(ee=s.bind&&u?L(z,a):s.wrap&&u?wrapConstructor(z):pe&&w(z)?_(z):z,(s.sham||z&&z.sham||Y&&Y.sham)&&B(ee,"sham",!0),B(fe,V,ee),pe&&($(j,U=ae+"Prototype")||B(j,U,{}),B(j[U],V,z),s.real&&ye&&(i||!ye[V])&&B(ye,V,z)))}},11287:s=>{s.exports=function getHolder(s){return s.placeholder}},11331:(s,o,i)=>{var a=i(72552),u=i(28879),_=i(40346),w=Function.prototype,x=Object.prototype,C=w.toString,j=x.hasOwnProperty,L=C.call(Object);s.exports=function isPlainObject(s){if(!_(s)||"[object Object]"!=a(s))return!1;var o=u(s);if(null===o)return!0;var i=j.call(o,"constructor")&&o.constructor;return"function"==typeof i&&i instanceof i&&C.call(i)==L}},11470:(s,o,i)=>{"use strict";var a=i(1907),u=i(65482),_=i(90160),w=i(74239),x=a("".charAt),C=a("".charCodeAt),j=a("".slice),createMethod=function(s){return function(o,i){var a,L,B=_(w(o)),$=u(i),U=B.length;return $<0||$>=U?s?"":void 0:(a=C(B,$))<55296||a>56319||$+1===U||(L=C(B,$+1))<56320||L>57343?s?x(B,$):a:s?j(B,$,$+2):L-56320+(a-55296<<10)+65536}};s.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},11842:(s,o,i)=>{var a=i(82819),u=i(9325);s.exports=function createBind(s,o,i){var _=1&o,w=a(s);return function wrapper(){return(this&&this!==u&&this instanceof wrapper?w:s).apply(_?i:this,arguments)}}},12205:(s,o,i)=>{"use strict";var a=i(66743),u=i(11002),_=i(13144);s.exports=function applyBind(){return _(a,u,arguments)}},12242:(s,o,i)=>{const a=i(10316);s.exports=class BooleanElement extends a{constructor(s,o,i){super(s,o,i),this.element="boolean"}primitive(){return"boolean"}}},12507:(s,o,i)=>{var a=i(28754),u=i(49698),_=i(63912),w=i(13222);s.exports=function createCaseFirst(s){return function(o){o=w(o);var i=u(o)?_(o):void 0,x=i?i[0]:o.charAt(0),C=i?a(i,1).join(""):o.slice(1);return x[s]()+C}}},12560:(s,o,i)=>{"use strict";i(99363);var a=i(19287),u=i(45951),_=i(14840),w=i(93742);for(var x in a)_(u[x],x),w[x]=w.Array},12651:(s,o,i)=>{var a=i(74218);s.exports=function getMapData(s,o){var i=s.__data__;return a(o)?i["string"==typeof o?"string":"hash"]:i.map}},12749:(s,o,i)=>{var a=i(81042),u=Object.prototype.hasOwnProperty;s.exports=function hashHas(s){var o=this.__data__;return a?void 0!==o[s]:u.call(o,s)}},13144:(s,o,i)=>{"use strict";var a=i(66743),u=i(11002),_=i(10076),w=i(47119);s.exports=w||a.call(_,u)},13222:(s,o,i)=>{var a=i(77556);s.exports=function toString(s){return null==s?"":a(s)}},13846:(s,o,i)=>{"use strict";var a=i(39447),u=i(13930),_=i(22574),w=i(75817),x=i(4993),C=i(70470),j=i(49724),L=i(73648),B=Object.getOwnPropertyDescriptor;o.f=a?B:function getOwnPropertyDescriptor(s,o){if(s=x(s),o=C(o),L)try{return B(s,o)}catch(s){}if(j(s,o))return w(!u(_.f,s,o),s[o])}},13930:(s,o,i)=>{"use strict";var a=i(41505),u=Function.prototype.call;s.exports=a?u.bind(u):function(){return u.apply(u,arguments)}},14248:s=>{s.exports=function arraySome(s,o){for(var i=-1,a=null==s?0:s.length;++i{s.exports=function arrayPush(s,o){for(var i=-1,a=o.length,u=s.length;++i{const a=i(10316);s.exports=class RefElement extends a{constructor(s,o,i){super(s||[],o,i),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(s){this.attributes.set("path",s)}}},14744:s=>{"use strict";var o=function isMergeableObject(s){return function isNonNullObject(s){return!!s&&"object"==typeof s}(s)&&!function isSpecial(s){var o=Object.prototype.toString.call(s);return"[object RegExp]"===o||"[object Date]"===o||function isReactElement(s){return s.$$typeof===i}(s)}(s)};var i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(s,o){return!1!==o.clone&&o.isMergeableObject(s)?deepmerge(function emptyTarget(s){return Array.isArray(s)?[]:{}}(s),s,o):s}function defaultArrayMerge(s,o,i){return s.concat(o).map((function(s){return cloneUnlessOtherwiseSpecified(s,i)}))}function getKeys(s){return Object.keys(s).concat(function getEnumerableOwnPropertySymbols(s){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(s).filter((function(o){return Object.propertyIsEnumerable.call(s,o)})):[]}(s))}function propertyIsOnObject(s,o){try{return o in s}catch(s){return!1}}function mergeObject(s,o,i){var a={};return i.isMergeableObject(s)&&getKeys(s).forEach((function(o){a[o]=cloneUnlessOtherwiseSpecified(s[o],i)})),getKeys(o).forEach((function(u){(function propertyIsUnsafe(s,o){return propertyIsOnObject(s,o)&&!(Object.hasOwnProperty.call(s,o)&&Object.propertyIsEnumerable.call(s,o))})(s,u)||(propertyIsOnObject(s,u)&&i.isMergeableObject(o[u])?a[u]=function getMergeFunction(s,o){if(!o.customMerge)return deepmerge;var i=o.customMerge(s);return"function"==typeof i?i:deepmerge}(u,i)(s[u],o[u],i):a[u]=cloneUnlessOtherwiseSpecified(o[u],i))})),a}function deepmerge(s,i,a){(a=a||{}).arrayMerge=a.arrayMerge||defaultArrayMerge,a.isMergeableObject=a.isMergeableObject||o,a.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var u=Array.isArray(i);return u===Array.isArray(s)?u?a.arrayMerge(s,i,a):mergeObject(s,i,a):cloneUnlessOtherwiseSpecified(i,a)}deepmerge.all=function deepmergeAll(s,o){if(!Array.isArray(s))throw new Error("first argument should be an array");return s.reduce((function(s,i){return deepmerge(s,i,o)}),{})};var a=deepmerge;s.exports=a},14792:(s,o,i)=>{var a=i(13222),u=i(55808);s.exports=function capitalize(s){return u(a(s).toLowerCase())}},14840:(s,o,i)=>{"use strict";var a=i(52623),u=i(74284).f,_=i(61626),w=i(49724),x=i(54878),C=i(76264)("toStringTag");s.exports=function(s,o,i,j){var L=i?s:s&&s.prototype;L&&(w(L,C)||u(L,C,{configurable:!0,value:o}),j&&!a&&_(L,"toString",x))}},14974:s=>{s.exports=function safeGet(s,o){if(("constructor"!==o||"function"!=typeof s[o])&&"__proto__"!=o)return s[o]}},15287:(s,o)=>{"use strict";var i=Symbol.for("react.element"),a=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),_=Symbol.for("react.strict_mode"),w=Symbol.for("react.profiler"),x=Symbol.for("react.provider"),C=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),L=Symbol.for("react.suspense"),B=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),U=Symbol.iterator;var V={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},z=Object.assign,Y={};function E(s,o,i){this.props=s,this.context=o,this.refs=Y,this.updater=i||V}function F(){}function G(s,o,i){this.props=s,this.context=o,this.refs=Y,this.updater=i||V}E.prototype.isReactComponent={},E.prototype.setState=function(s,o){if("object"!=typeof s&&"function"!=typeof s&&null!=s)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,s,o,"setState")},E.prototype.forceUpdate=function(s){this.updater.enqueueForceUpdate(this,s,"forceUpdate")},F.prototype=E.prototype;var Z=G.prototype=new F;Z.constructor=G,z(Z,E.prototype),Z.isPureReactComponent=!0;var ee=Array.isArray,ie=Object.prototype.hasOwnProperty,ae={current:null},ce={key:!0,ref:!0,__self:!0,__source:!0};function M(s,o,a){var u,_={},w=null,x=null;if(null!=o)for(u in void 0!==o.ref&&(x=o.ref),void 0!==o.key&&(w=""+o.key),o)ie.call(o,u)&&!ce.hasOwnProperty(u)&&(_[u]=o[u]);var C=arguments.length-2;if(1===C)_.children=a;else if(1{var a=i(96131);s.exports=function arrayIncludes(s,o){return!!(null==s?0:s.length)&&a(s,o,0)>-1}},15340:()=>{},15377:(s,o,i)=>{"use strict";var a=i(92861).Buffer,u=i(64634),_=i(74372),w=ArrayBuffer.isView||function isView(s){try{return _(s),!0}catch(s){return!1}},x="undefined"!=typeof Uint8Array,C="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,j=C&&(a.prototype instanceof Uint8Array||a.TYPED_ARRAY_SUPPORT);s.exports=function toBuffer(s,o){if(s instanceof a)return s;if("string"==typeof s)return a.from(s,o);if(C&&w(s)){if(0===s.byteLength)return a.alloc(0);if(j){var i=a.from(s.buffer,s.byteOffset,s.byteLength);if(i.byteLength===s.byteLength)return i}var _=s instanceof Uint8Array?s:new Uint8Array(s.buffer,s.byteOffset,s.byteLength),L=a.from(_);if(L.length===s.byteLength)return L}if(x&&s instanceof Uint8Array)return a.from(s);var B=u(s);if(B)for(var $=0;$255||~~U!==U)throw new RangeError("Array items must be numbers in the range 0-255.")}if(B||a.isBuffer(s)&&s.constructor&&"function"==typeof s.constructor.isBuffer&&s.constructor.isBuffer(s))return a.from(s);throw new TypeError('The "data" argument must be a string, an Array, a Buffer, a Uint8Array, or a DataView.')}},15389:(s,o,i)=>{var a=i(93663),u=i(87978),_=i(83488),w=i(56449),x=i(50583);s.exports=function baseIteratee(s){return"function"==typeof s?s:null==s?_:"object"==typeof s?w(s)?u(s[0],s[1]):a(s):x(s)}},15972:(s,o,i)=>{"use strict";var a=i(49724),u=i(62250),_=i(39298),w=i(92522),x=i(57382),C=w("IE_PROTO"),j=Object,L=j.prototype;s.exports=x?j.getPrototypeOf:function(s){var o=_(s);if(a(o,C))return o[C];var i=o.constructor;return u(i)&&o instanceof i?i.prototype:o instanceof j?L:null}},16038:(s,o,i)=>{var a=i(5861),u=i(40346);s.exports=function baseIsSet(s){return u(s)&&"[object Set]"==a(s)}},16426:s=>{s.exports=function(){var s=document.getSelection();if(!s.rangeCount)return function(){};for(var o=document.activeElement,i=[],a=0;a{var a=i(43360),u=i(75288),_=Object.prototype.hasOwnProperty;s.exports=function assignValue(s,o,i){var w=s[o];_.call(s,o)&&u(w,i)&&(void 0!==i||o in s)||a(s,o,i)}},16708:(s,o,i)=>{"use strict";var a,u=i(65606);function CorkedRequest(s){var o=this;this.next=null,this.entry=null,this.finish=function(){!function onCorkedFinish(s,o,i){var a=s.entry;s.entry=null;for(;a;){var u=a.callback;o.pendingcb--,u(i),a=a.next}o.corkedRequestsFree.next=s}(o,s)}}s.exports=Writable,Writable.WritableState=WritableState;var _={deprecate:i(94643)},w=i(40345),x=i(48287).Buffer,C=(void 0!==i.g?i.g:"undefined"!=typeof window?window:"undefined"!=typeof self?self:{}).Uint8Array||function(){};var j,L=i(75896),B=i(65291).getHighWaterMark,$=i(86048).F,U=$.ERR_INVALID_ARG_TYPE,V=$.ERR_METHOD_NOT_IMPLEMENTED,z=$.ERR_MULTIPLE_CALLBACK,Y=$.ERR_STREAM_CANNOT_PIPE,Z=$.ERR_STREAM_DESTROYED,ee=$.ERR_STREAM_NULL_VALUES,ie=$.ERR_STREAM_WRITE_AFTER_END,ae=$.ERR_UNKNOWN_ENCODING,ce=L.errorOrDestroy;function nop(){}function WritableState(s,o,_){a=a||i(25382),s=s||{},"boolean"!=typeof _&&(_=o instanceof a),this.objectMode=!!s.objectMode,_&&(this.objectMode=this.objectMode||!!s.writableObjectMode),this.highWaterMark=B(this,s,"writableHighWaterMark",_),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var w=!1===s.decodeStrings;this.decodeStrings=!w,this.defaultEncoding=s.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(s){!function onwrite(s,o){var i=s._writableState,a=i.sync,_=i.writecb;if("function"!=typeof _)throw new z;if(function onwriteStateUpdate(s){s.writing=!1,s.writecb=null,s.length-=s.writelen,s.writelen=0}(i),o)!function onwriteError(s,o,i,a,_){--o.pendingcb,i?(u.nextTick(_,a),u.nextTick(finishMaybe,s,o),s._writableState.errorEmitted=!0,ce(s,a)):(_(a),s._writableState.errorEmitted=!0,ce(s,a),finishMaybe(s,o))}(s,i,a,o,_);else{var w=needFinish(i)||s.destroyed;w||i.corked||i.bufferProcessing||!i.bufferedRequest||clearBuffer(s,i),a?u.nextTick(afterWrite,s,i,w,_):afterWrite(s,i,w,_)}}(o,s)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!1!==s.emitClose,this.autoDestroy=!!s.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new CorkedRequest(this)}function Writable(s){var o=this instanceof(a=a||i(25382));if(!o&&!j.call(Writable,this))return new Writable(s);this._writableState=new WritableState(s,this,o),this.writable=!0,s&&("function"==typeof s.write&&(this._write=s.write),"function"==typeof s.writev&&(this._writev=s.writev),"function"==typeof s.destroy&&(this._destroy=s.destroy),"function"==typeof s.final&&(this._final=s.final)),w.call(this)}function doWrite(s,o,i,a,u,_,w){o.writelen=a,o.writecb=w,o.writing=!0,o.sync=!0,o.destroyed?o.onwrite(new Z("write")):i?s._writev(u,o.onwrite):s._write(u,_,o.onwrite),o.sync=!1}function afterWrite(s,o,i,a){i||function onwriteDrain(s,o){0===o.length&&o.needDrain&&(o.needDrain=!1,s.emit("drain"))}(s,o),o.pendingcb--,a(),finishMaybe(s,o)}function clearBuffer(s,o){o.bufferProcessing=!0;var i=o.bufferedRequest;if(s._writev&&i&&i.next){var a=o.bufferedRequestCount,u=new Array(a),_=o.corkedRequestsFree;_.entry=i;for(var w=0,x=!0;i;)u[w]=i,i.isBuf||(x=!1),i=i.next,w+=1;u.allBuffers=x,doWrite(s,o,!0,o.length,u,"",_.finish),o.pendingcb++,o.lastBufferedRequest=null,_.next?(o.corkedRequestsFree=_.next,_.next=null):o.corkedRequestsFree=new CorkedRequest(o),o.bufferedRequestCount=0}else{for(;i;){var C=i.chunk,j=i.encoding,L=i.callback;if(doWrite(s,o,!1,o.objectMode?1:C.length,C,j,L),i=i.next,o.bufferedRequestCount--,o.writing)break}null===i&&(o.lastBufferedRequest=null)}o.bufferedRequest=i,o.bufferProcessing=!1}function needFinish(s){return s.ending&&0===s.length&&null===s.bufferedRequest&&!s.finished&&!s.writing}function callFinal(s,o){s._final((function(i){o.pendingcb--,i&&ce(s,i),o.prefinished=!0,s.emit("prefinish"),finishMaybe(s,o)}))}function finishMaybe(s,o){var i=needFinish(o);if(i&&(function prefinish(s,o){o.prefinished||o.finalCalled||("function"!=typeof s._final||o.destroyed?(o.prefinished=!0,s.emit("prefinish")):(o.pendingcb++,o.finalCalled=!0,u.nextTick(callFinal,s,o)))}(s,o),0===o.pendingcb&&(o.finished=!0,s.emit("finish"),o.autoDestroy))){var a=s._readableState;(!a||a.autoDestroy&&a.endEmitted)&&s.destroy()}return i}i(56698)(Writable,w),WritableState.prototype.getBuffer=function getBuffer(){for(var s=this.bufferedRequest,o=[];s;)o.push(s),s=s.next;return o},function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:_.deprecate((function writableStateBufferGetter(){return this.getBuffer()}),"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(s){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(j=Function.prototype[Symbol.hasInstance],Object.defineProperty(Writable,Symbol.hasInstance,{value:function value(s){return!!j.call(this,s)||this===Writable&&(s&&s._writableState instanceof WritableState)}})):j=function realHasInstance(s){return s instanceof this},Writable.prototype.pipe=function(){ce(this,new Y)},Writable.prototype.write=function(s,o,i){var a=this._writableState,_=!1,w=!a.objectMode&&function _isUint8Array(s){return x.isBuffer(s)||s instanceof C}(s);return w&&!x.isBuffer(s)&&(s=function _uint8ArrayToBuffer(s){return x.from(s)}(s)),"function"==typeof o&&(i=o,o=null),w?o="buffer":o||(o=a.defaultEncoding),"function"!=typeof i&&(i=nop),a.ending?function writeAfterEnd(s,o){var i=new ie;ce(s,i),u.nextTick(o,i)}(this,i):(w||function validChunk(s,o,i,a){var _;return null===i?_=new ee:"string"==typeof i||o.objectMode||(_=new U("chunk",["string","Buffer"],i)),!_||(ce(s,_),u.nextTick(a,_),!1)}(this,a,s,i))&&(a.pendingcb++,_=function writeOrBuffer(s,o,i,a,u,_){if(!i){var w=function decodeChunk(s,o,i){s.objectMode||!1===s.decodeStrings||"string"!=typeof o||(o=x.from(o,i));return o}(o,a,u);a!==w&&(i=!0,u="buffer",a=w)}var C=o.objectMode?1:a.length;o.length+=C;var j=o.length-1))throw new ae(s);return this._writableState.defaultEncoding=s,this},Object.defineProperty(Writable.prototype,"writableBuffer",{enumerable:!1,get:function get(){return this._writableState&&this._writableState.getBuffer()}}),Object.defineProperty(Writable.prototype,"writableHighWaterMark",{enumerable:!1,get:function get(){return this._writableState.highWaterMark}}),Writable.prototype._write=function(s,o,i){i(new V("_write()"))},Writable.prototype._writev=null,Writable.prototype.end=function(s,o,i){var a=this._writableState;return"function"==typeof s?(i=s,s=null,o=null):"function"==typeof o&&(i=o,o=null),null!=s&&this.write(s,o),a.corked&&(a.corked=1,this.uncork()),a.ending||function endWritable(s,o,i){o.ending=!0,finishMaybe(s,o),i&&(o.finished?u.nextTick(i):s.once("finish",i));o.ended=!0,s.writable=!1}(this,a,i),this},Object.defineProperty(Writable.prototype,"writableLength",{enumerable:!1,get:function get(){return this._writableState.length}}),Object.defineProperty(Writable.prototype,"destroyed",{enumerable:!1,get:function get(){return void 0!==this._writableState&&this._writableState.destroyed},set:function set(s){this._writableState&&(this._writableState.destroyed=s)}}),Writable.prototype.destroy=L.destroy,Writable.prototype._undestroy=L.undestroy,Writable.prototype._destroy=function(s,o){o(s)}},16946:(s,o,i)=>{"use strict";var a=i(1907),u=i(98828),_=i(45807),w=Object,x=a("".split);s.exports=u((function(){return!w("z").propertyIsEnumerable(0)}))?function(s){return"String"===_(s)?x(s,""):w(s)}:w},16962:(s,o)=>{o.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},o.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},o.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},o.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},o.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},o.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},o.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},o.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},o.realToAlias=function(){var s=Object.prototype.hasOwnProperty,i=o.aliasToReal,a={};for(var u in i){var _=i[u];s.call(a,_)?a[_].push(u):a[_]=[u]}return a}(),o.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},o.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},o.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},17255:(s,o,i)=>{var a=i(47422);s.exports=function basePropertyDeep(s){return function(o){return a(o,s)}}},17285:s=>{function source(s){return s?"string"==typeof s?s:s.source:null}function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>source(s))).join("")}function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}s.exports=function xml(s){const o=concat(/[A-Z_]/,function optional(s){return concat("(",s,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},u=s.inherit(a,{begin:/\(/,end:/\)/}),_=s.inherit(s.APOS_STRING_MODE,{className:"meta-string"}),w=s.inherit(s.QUOTE_STRING_MODE,{className:"meta-string"}),x={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[a,w,_,u,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[a,u,w,_]}]}]},s.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[x],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[x],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:o,relevance:0,starts:x}]},{className:"tag",begin:concat(/<\//,lookahead(concat(o,/>/))),contains:[{className:"name",begin:o,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},17400:(s,o,i)=>{var a=i(99374),u=1/0;s.exports=function toFinite(s){return s?(s=a(s))===u||s===-1/0?17976931348623157e292*(s<0?-1:1):s==s?s:0:0===s?s:0}},17533:s=>{s.exports=function yaml(s){var o="true false yes no null",i="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[s.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},u=s.inherit(a,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},w={end:",",endsWithParent:!0,excludeEnd:!0,keywords:o,relevance:0},x={begin:/\{/,end:/\}/,contains:[w],illegal:"\\n",relevance:0},C={begin:"\\[",end:"\\]",contains:[w],illegal:"\\n",relevance:0},j=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+i},{className:"type",begin:"!<"+i+">"},{className:"type",begin:"!"+i},{className:"type",begin:"!!"+i},{className:"meta",begin:"&"+s.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+s.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},s.HASH_COMMENT_MODE,{beginKeywords:o,keywords:{literal:o}},_,{className:"number",begin:s.C_NUMBER_RE+"\\b",relevance:0},x,C,a],L=[...j];return L.pop(),L.push(u),w.contains=L,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:j}}},17670:(s,o,i)=>{var a=i(12651);s.exports=function mapCacheDelete(s){var o=a(this,s).delete(s);return this.size-=o?1:0,o}},17965:(s,o,i)=>{"use strict";var a=i(16426),u={"text/plain":"Text","text/html":"Url",default:"Text"};s.exports=function copy(s,o){var i,_,w,x,C,j,L=!1;o||(o={}),i=o.debug||!1;try{if(w=a(),x=document.createRange(),C=document.getSelection(),(j=document.createElement("span")).textContent=s,j.ariaHidden="true",j.style.all="unset",j.style.position="fixed",j.style.top=0,j.style.clip="rect(0, 0, 0, 0)",j.style.whiteSpace="pre",j.style.webkitUserSelect="text",j.style.MozUserSelect="text",j.style.msUserSelect="text",j.style.userSelect="text",j.addEventListener("copy",(function(a){if(a.stopPropagation(),o.format)if(a.preventDefault(),void 0===a.clipboardData){i&&console.warn("unable to use e.clipboardData"),i&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var _=u[o.format]||u.default;window.clipboardData.setData(_,s)}else a.clipboardData.clearData(),a.clipboardData.setData(o.format,s);o.onCopy&&(a.preventDefault(),o.onCopy(a.clipboardData))})),document.body.appendChild(j),x.selectNodeContents(j),C.addRange(x),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");L=!0}catch(a){i&&console.error("unable to copy using execCommand: ",a),i&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(o.format||"text",s),o.onCopy&&o.onCopy(window.clipboardData),L=!0}catch(a){i&&console.error("unable to copy using clipboardData: ",a),i&&console.error("falling back to prompt"),_=function format(s){var o=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return s.replace(/#{\s*key\s*}/g,o)}("message"in o?o.message:"Copy to clipboard: #{key}, Enter"),window.prompt(_,s)}}finally{C&&("function"==typeof C.removeRange?C.removeRange(x):C.removeAllRanges()),j&&document.body.removeChild(j),w()}return L}},18073:(s,o,i)=>{var a=i(85087),u=i(54641),_=i(70981);s.exports=function createRecurry(s,o,i,w,x,C,j,L,B,$){var U=8&o;o|=U?32:64,4&(o&=~(U?64:32))||(o&=-4);var V=[s,o,x,U?C:void 0,U?j:void 0,U?void 0:C,U?void 0:j,L,B,$],z=i.apply(void 0,V);return a(s)&&u(z,V),z.placeholder=w,_(z,s,o)}},19123:(s,o,i)=>{var a=i(65606),u=i(31499),_=i(88310).Stream;function resolve(s,o,i){var a,_=function create_indent(s,o){return new Array(o||0).join(s||"")}(o,i=i||0),w=s;if("object"==typeof s&&((w=s[a=Object.keys(s)[0]])&&w._elem))return w._elem.name=a,w._elem.icount=i,w._elem.indent=o,w._elem.indents=_,w._elem.interrupt=w,w._elem;var x,C=[],j=[];function get_attributes(s){Object.keys(s).forEach((function(o){C.push(function attribute(s,o){return s+'="'+u(o)+'"'}(o,s[o]))}))}switch(typeof w){case"object":if(null===w)break;w._attr&&get_attributes(w._attr),w._cdata&&j.push(("/g,"]]]]>")+"]]>"),w.forEach&&(x=!1,j.push(""),w.forEach((function(s){"object"==typeof s?"_attr"==Object.keys(s)[0]?get_attributes(s._attr):j.push(resolve(s,o,i+1)):(j.pop(),x=!0,j.push(u(s)))})),x||j.push(""));break;default:j.push(u(w))}return{name:a,interrupt:!1,attributes:C,content:j,icount:i,indents:_,indent:o}}function format(s,o,i){if("object"!=typeof o)return s(!1,o);var a=o.interrupt?1:o.content.length;function proceed(){for(;o.content.length;){var u=o.content.shift();if(void 0!==u){if(interrupt(u))return;format(s,u)}}s(!1,(a>1?o.indents:"")+(o.name?"":"")+(o.indent&&!i?"\n":"")),i&&i()}function interrupt(o){return!!o.interrupt&&(o.interrupt.append=s,o.interrupt.end=proceed,o.interrupt=!1,s(!0),!0)}if(s(!1,o.indents+(o.name?"<"+o.name:"")+(o.attributes.length?" "+o.attributes.join(" "):"")+(a?o.name?">":"":o.name?"/>":"")+(o.indent&&a>1?"\n":"")),!a)return s(!1,o.indent?"\n":"");interrupt(o)||proceed()}s.exports=function xml(s,o){"object"!=typeof o&&(o={indent:o});var i=o.stream?new _:null,u="",w=!1,x=o.indent?!0===o.indent?" ":o.indent:"",C=!0;function delay(s){C?a.nextTick(s):s()}function append(s,o){if(void 0!==o&&(u+=o),s&&!w&&(i=i||new _,w=!0),s&&w){var a=u;delay((function(){i.emit("data",a)})),u=""}}function add(s,o){format(append,resolve(s,x,x?1:0),o)}function end(){if(i){var s=u;delay((function(){i.emit("data",s),i.emit("end"),i.readable=!1,i.emit("close")}))}}return delay((function(){C=!1})),o.declaration&&function addXmlDeclaration(s){var o={version:"1.0",encoding:s.encoding||"UTF-8"};s.standalone&&(o.standalone=s.standalone),add({"?xml":{_attr:o}}),u=u.replace("/>","?>")}(o.declaration),s&&s.forEach?s.forEach((function(o,i){var a;i+1===s.length&&(a=end),add(o,a)})):add(s,end),i?(i.readable=!0,i):u},s.exports.element=s.exports.Element=function element(){var s={_elem:resolve(Array.prototype.slice.call(arguments)),push:function(s){if(!this.append)throw new Error("not assigned to a parent!");var o=this,i=this._elem.indent;format(this.append,resolve(s,i,this._elem.icount+(i?1:0)),(function(){o.append(!0)}))},close:function(s){void 0!==s&&this.push(s),this.end&&this.end()}};return s}},19219:s=>{s.exports=function cacheHas(s,o){return s.has(o)}},19287:s=>{"use strict";s.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},19358:(s,o,i)=>{"use strict";var a=i(85582),u=i(49724),_=i(61626),w=i(88280),x=i(79192),C=i(19595),j=i(54829),L=i(34084),B=i(32096),$=i(39259),U=i(85884),V=i(39447),z=i(7376);s.exports=function(s,o,i,Y){var Z="stackTraceLimit",ee=Y?2:1,ie=s.split("."),ae=ie[ie.length-1],ce=a.apply(null,ie);if(ce){var le=ce.prototype;if(!z&&u(le,"cause")&&delete le.cause,!i)return ce;var pe=a("Error"),de=o((function(s,o){var i=B(Y?o:s,void 0),a=Y?new ce(s):new ce;return void 0!==i&&_(a,"message",i),U(a,de,a.stack,2),this&&w(le,this)&&L(a,this,de),arguments.length>ee&&$(a,arguments[ee]),a}));if(de.prototype=le,"Error"!==ae?x?x(de,pe):C(de,pe,{name:!0}):V&&Z in ce&&(j(de,ce,Z),j(de,ce,"prepareStackTrace")),C(de,ce),!z)try{le.name!==ae&&_(le,"name",ae),le.constructor=de}catch(s){}return de}}},19570:(s,o,i)=>{var a=i(37334),u=i(93243),_=i(83488),w=u?function(s,o){return u(s,"toString",{configurable:!0,enumerable:!1,value:a(o),writable:!0})}:_;s.exports=w},19595:(s,o,i)=>{"use strict";var a=i(49724),u=i(11042),_=i(13846),w=i(74284);s.exports=function(s,o,i){for(var x=u(o),C=w.f,j=_.f,L=0;L{"use strict";var a=i(23034);s.exports=a},19846:(s,o,i)=>{"use strict";var a=i(20798),u=i(98828),_=i(45951).String;s.exports=!!Object.getOwnPropertySymbols&&!u((function(){var s=Symbol("symbol detection");return!_(s)||!(Object(s)instanceof Symbol)||!Symbol.sham&&a&&a<41}))},19931:(s,o,i)=>{var a=i(31769),u=i(68090),_=i(68969),w=i(77797);s.exports=function baseUnset(s,o){return o=a(o,s),null==(s=_(s,o))||delete s[w(u(o))]}},20181:(s,o,i)=>{var a=/^\s+|\s+$/g,u=/^[-+]0x[0-9a-f]+$/i,_=/^0b[01]+$/i,w=/^0o[0-7]+$/i,x=parseInt,C="object"==typeof i.g&&i.g&&i.g.Object===Object&&i.g,j="object"==typeof self&&self&&self.Object===Object&&self,L=C||j||Function("return this")(),B=Object.prototype.toString,$=Math.max,U=Math.min,now=function(){return L.Date.now()};function isObject(s){var o=typeof s;return!!s&&("object"==o||"function"==o)}function toNumber(s){if("number"==typeof s)return s;if(function isSymbol(s){return"symbol"==typeof s||function isObjectLike(s){return!!s&&"object"==typeof s}(s)&&"[object Symbol]"==B.call(s)}(s))return NaN;if(isObject(s)){var o="function"==typeof s.valueOf?s.valueOf():s;s=isObject(o)?o+"":o}if("string"!=typeof s)return 0===s?s:+s;s=s.replace(a,"");var i=_.test(s);return i||w.test(s)?x(s.slice(2),i?2:8):u.test(s)?NaN:+s}s.exports=function debounce(s,o,i){var a,u,_,w,x,C,j=0,L=!1,B=!1,V=!0;if("function"!=typeof s)throw new TypeError("Expected a function");function invokeFunc(o){var i=a,_=u;return a=u=void 0,j=o,w=s.apply(_,i)}function shouldInvoke(s){var i=s-C;return void 0===C||i>=o||i<0||B&&s-j>=_}function timerExpired(){var s=now();if(shouldInvoke(s))return trailingEdge(s);x=setTimeout(timerExpired,function remainingWait(s){var i=o-(s-C);return B?U(i,_-(s-j)):i}(s))}function trailingEdge(s){return x=void 0,V&&a?invokeFunc(s):(a=u=void 0,w)}function debounced(){var s=now(),i=shouldInvoke(s);if(a=arguments,u=this,C=s,i){if(void 0===x)return function leadingEdge(s){return j=s,x=setTimeout(timerExpired,o),L?invokeFunc(s):w}(C);if(B)return x=setTimeout(timerExpired,o),invokeFunc(C)}return void 0===x&&(x=setTimeout(timerExpired,o)),w}return o=toNumber(o)||0,isObject(i)&&(L=!!i.leading,_=(B="maxWait"in i)?$(toNumber(i.maxWait)||0,o):_,V="trailing"in i?!!i.trailing:V),debounced.cancel=function cancel(){void 0!==x&&clearTimeout(x),j=0,a=C=u=x=void 0},debounced.flush=function flush(){return void 0===x?w:trailingEdge(now())},debounced}},20317:s=>{s.exports=function mapToArray(s){var o=-1,i=Array(s.size);return s.forEach((function(s,a){i[++o]=[a,s]})),i}},20334:(s,o,i)=>{"use strict";var a=i(48287).Buffer;class NonError extends Error{constructor(s){super(NonError._prepareSuperMessage(s)),Object.defineProperty(this,"name",{value:"NonError",configurable:!0,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(this,NonError)}static _prepareSuperMessage(s){try{return JSON.stringify(s)}catch{return String(s)}}}const u=[{property:"name",enumerable:!1},{property:"message",enumerable:!1},{property:"stack",enumerable:!1},{property:"code",enumerable:!0}],_=Symbol(".toJSON called"),destroyCircular=({from:s,seen:o,to_:i,forceEnumerable:w,maxDepth:x,depth:C})=>{const j=i||(Array.isArray(s)?[]:{});if(o.push(s),C>=x)return j;if("function"==typeof s.toJSON&&!0!==s[_])return(s=>{s[_]=!0;const o=s.toJSON();return delete s[_],o})(s);for(const[i,u]of Object.entries(s))"function"==typeof a&&a.isBuffer(u)?j[i]="[object Buffer]":"function"!=typeof u&&(u&&"object"==typeof u?o.includes(s[i])?j[i]="[Circular]":(C++,j[i]=destroyCircular({from:s[i],seen:o.slice(),forceEnumerable:w,maxDepth:x,depth:C})):j[i]=u);for(const{property:o,enumerable:i}of u)"string"==typeof s[o]&&Object.defineProperty(j,o,{value:s[o],enumerable:!!w||i,configurable:!0,writable:!0});return j};s.exports={serializeError:(s,o={})=>{const{maxDepth:i=Number.POSITIVE_INFINITY}=o;return"object"==typeof s&&null!==s?destroyCircular({from:s,seen:[],forceEnumerable:!0,maxDepth:i,depth:0}):"function"==typeof s?`[Function: ${s.name||"anonymous"}]`:s},deserializeError:(s,o={})=>{const{maxDepth:i=Number.POSITIVE_INFINITY}=o;if(s instanceof Error)return s;if("object"==typeof s&&null!==s&&!Array.isArray(s)){const o=new Error;return destroyCircular({from:s,seen:[],to_:o,maxDepth:i,depth:0}),o}return new NonError(s)}}},20426:s=>{var o=Object.prototype.hasOwnProperty;s.exports=function baseHas(s,i){return null!=s&&o.call(s,i)}},20575:(s,o,i)=>{"use strict";var a=i(3121);s.exports=function(s){return a(s.length)}},20798:(s,o,i)=>{"use strict";var a,u,_=i(45951),w=i(96794),x=_.process,C=_.Deno,j=x&&x.versions||C&&C.version,L=j&&j.v8;L&&(u=(a=L.split("."))[0]>0&&a[0]<4?1:+(a[0]+a[1])),!u&&w&&(!(a=w.match(/Edge\/(\d+)/))||a[1]>=74)&&(a=w.match(/Chrome\/(\d+)/))&&(u=+a[1]),s.exports=u},20850:(s,o,i)=>{"use strict";s.exports=i(46076)},20999:(s,o,i)=>{var a=i(69302),u=i(36800);s.exports=function createAssigner(s){return a((function(o,i){var a=-1,_=i.length,w=_>1?i[_-1]:void 0,x=_>2?i[2]:void 0;for(w=s.length>3&&"function"==typeof w?(_--,w):void 0,x&&u(i[0],i[1],x)&&(w=_<3?void 0:w,_=1),o=Object(o);++a<_;){var C=i[a];C&&s(o,C,a,w)}return o}))}},21549:(s,o,i)=>{var a=i(22032),u=i(63862),_=i(66721),w=i(12749),x=i(35749);function Hash(s){var o=-1,i=null==s?0:s.length;for(this.clear();++o{var a=i(16547),u=i(43360);s.exports=function copyObject(s,o,i,_){var w=!i;i||(i={});for(var x=-1,C=o.length;++x{var a=i(51873),u=i(37828),_=i(75288),w=i(25911),x=i(20317),C=i(84247),j=a?a.prototype:void 0,L=j?j.valueOf:void 0;s.exports=function equalByTag(s,o,i,a,j,B,$){switch(i){case"[object DataView]":if(s.byteLength!=o.byteLength||s.byteOffset!=o.byteOffset)return!1;s=s.buffer,o=o.buffer;case"[object ArrayBuffer]":return!(s.byteLength!=o.byteLength||!B(new u(s),new u(o)));case"[object Boolean]":case"[object Date]":case"[object Number]":return _(+s,+o);case"[object Error]":return s.name==o.name&&s.message==o.message;case"[object RegExp]":case"[object String]":return s==o+"";case"[object Map]":var U=x;case"[object Set]":var V=1&a;if(U||(U=C),s.size!=o.size&&!V)return!1;var z=$.get(s);if(z)return z==o;a|=2,$.set(s,o);var Y=w(U(s),U(o),a,j,B,$);return $.delete(s),Y;case"[object Symbol]":if(L)return L.call(s)==L.call(o)}return!1}},22032:(s,o,i)=>{var a=i(81042);s.exports=function hashClear(){this.__data__=a?a(null):{},this.size=0}},22225:s=>{var o="\\ud800-\\udfff",i="\\u2700-\\u27bf",a="a-z\\xdf-\\xf6\\xf8-\\xff",u="A-Z\\xc0-\\xd6\\xd8-\\xde",_="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",w="["+_+"]",x="\\d+",C="["+i+"]",j="["+a+"]",L="[^"+o+_+x+i+a+u+"]",B="(?:\\ud83c[\\udde6-\\uddff]){2}",$="[\\ud800-\\udbff][\\udc00-\\udfff]",U="["+u+"]",V="(?:"+j+"|"+L+")",z="(?:"+U+"|"+L+")",Y="(?:['’](?:d|ll|m|re|s|t|ve))?",Z="(?:['’](?:D|LL|M|RE|S|T|VE))?",ee="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",ie="[\\ufe0e\\ufe0f]?",ae=ie+ee+("(?:\\u200d(?:"+["[^"+o+"]",B,$].join("|")+")"+ie+ee+")*"),ce="(?:"+[C,B,$].join("|")+")"+ae,le=RegExp([U+"?"+j+"+"+Y+"(?="+[w,U,"$"].join("|")+")",z+"+"+Z+"(?="+[w,U+V,"$"].join("|")+")",U+"?"+V+"+"+Y,U+"+"+Z,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",x,ce].join("|"),"g");s.exports=function unicodeWords(s){return s.match(le)||[]}},22551:(s,o,i)=>{"use strict";var a=i(96540),u=i(69982);function p(s){for(var o="https://reactjs.org/docs/error-decoder.html?invariant="+s,i=1;i"},mA.link_close=function(){return""},mA.image=function(s,o,i){var a=' src="'+escapeHtml(s[o].src)+'"',u=s[o].title?' title="'+escapeHtml(replaceEntities(s[o].title))+'"':"";return""},mA.table_open=function(){return"\n"},mA.table_close=function(){return"
    \n"},mA.thead_open=function(){return"\n"},mA.thead_close=function(){return"\n"},mA.tbody_open=function(){return"\n"},mA.tbody_close=function(){return"\n"},mA.tr_open=function(){return""},mA.tr_close=function(){return"\n"},mA.th_open=function(s,o){var i=s[o];return""},mA.th_close=function(){return""},mA.td_open=function(s,o){var i=s[o];return""},mA.td_close=function(){return""},mA.strong_open=function(){return""},mA.strong_close=function(){return""},mA.em_open=function(){return""},mA.em_close=function(){return""},mA.del_open=function(){return""},mA.del_close=function(){return""},mA.ins_open=function(){return""},mA.ins_close=function(){return""},mA.mark_open=function(){return""},mA.mark_close=function(){return""},mA.sub=function(s,o){return""+escapeHtml(s[o].content)+""},mA.sup=function(s,o){return""+escapeHtml(s[o].content)+""},mA.hardbreak=function(s,o,i){return i.xhtmlOut?"
    \n":"
    \n"},mA.softbreak=function(s,o,i){return i.breaks?i.xhtmlOut?"
    \n":"
    \n":"\n"},mA.text=function(s,o){return escapeHtml(s[o].content)},mA.htmlblock=function(s,o){return s[o].content},mA.htmltag=function(s,o){return s[o].content},mA.abbr_open=function(s,o){return''},mA.abbr_close=function(){return""},mA.footnote_ref=function(s,o){var i=Number(s[o].id+1).toString(),a="fnref"+i;return s[o].subId>0&&(a+=":"+s[o].subId),'['+i+"]"},mA.footnote_block_open=function(s,o,i){return(i.xhtmlOut?'
    \n':'
    \n')+'
    \n
      \n'},mA.footnote_block_close=function(){return"
    \n
    \n"},mA.footnote_open=function(s,o){return'
  • '},mA.footnote_close=function(){return"
  • \n"},mA.footnote_anchor=function(s,o){var i="fnref"+Number(s[o].id+1).toString();return s[o].subId>0&&(i+=":"+s[o].subId),' '},mA.dl_open=function(){return"
    \n"},mA.dt_open=function(){return"
    "},mA.dd_open=function(){return"
    "},mA.dl_close=function(){return"
    \n"},mA.dt_close=function(){return"\n"},mA.dd_close=function(){return"\n"};var gA=mA.getBreak=function getBreak(s,o){return(o=nextToken(s,o))1)break;if(41===i&&--a<0)break;o++}return _!==o&&(u=unescapeMd(s.src.slice(_,o)),!!s.parser.validateLink(u)&&(s.linkContent=u,s.pos=o,!0))}function parseLinkTitle(s,o){var i,a=o,u=s.posMax,_=s.src.charCodeAt(o);if(34!==_&&39!==_&&40!==_)return!1;for(o++,40===_&&(_=41);o=s.length)&&!wA.test(s[o])}function replaceAt(s,o,i){return s.substr(0,o)+i+s.substr(o+1)}var xA=[["block",function block(s){s.inlineMode?s.tokens.push({type:"inline",content:s.src.replace(/\n/g," ").trim(),level:0,lines:[0,1],children:[]}):s.block.parse(s.src,s.options,s.env,s.tokens)}],["abbr",function abbr(s){var o,i,a,u,_=s.tokens;if(!s.inlineMode)for(o=1,i=_.length-1;o0?w[o].count:1,a=0;a=0;o--)if("text"===(_=u[o]).type){for(C=0,w=_.content,L.lastIndex=0,j=_.level,x=[];B=L.exec(w);)L.lastIndex>C&&x.push({type:"text",content:w.slice(C,B.index+B[1].length),level:j}),x.push({type:"abbr_open",title:s.env.abbreviations[":"+B[2]],level:j++}),x.push({type:"text",content:B[2],level:j}),x.push({type:"abbr_close",level:--j}),C=L.lastIndex-B[3].length;x.length&&(C=0;_--)if("inline"===s.tokens[_].type)for(o=(u=s.tokens[_].children).length-1;o>=0;o--)"text"===(i=u[o]).type&&(a=replaceScopedAbbr(a=i.content),vA.test(a)&&(a=a.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1—$2").replace(/(^|\s)--(\s|$)/gm,"$1–$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1–$2")),i.content=a)}],["smartquotes",function smartquotes(s){var o,i,a,u,_,w,x,C,j,L,B,$,U,V,z,Y,Z;if(s.options.typographer)for(Z=[],z=s.tokens.length-1;z>=0;z--)if("inline"===s.tokens[z].type)for(Y=s.tokens[z].children,Z.length=0,o=0;o=0&&!(Z[U].level<=x);U--);Z.length=U+1,_=0,w=(a=i.content).length;e:for(;_=0&&(L=Z[U],!(Z[U].level=(u=s.eMarks[o])||42!==(i=s.src.charCodeAt(a++))&&45!==i&&43!==i||a=u)return-1;if((i=s.src.charCodeAt(a++))<48||i>57)return-1;for(;;){if(a>=u)return-1;if(!((i=s.src.charCodeAt(a++))>=48&&i<=57)){if(41===i||46===i)break;return-1}}return a=this.eMarks[s]},StateBlock.prototype.skipEmptyLines=function skipEmptyLines(s){for(var o=this.lineMax;si;)if(o!==this.src.charCodeAt(--s))return s+1;return s},StateBlock.prototype.getLines=function getLines(s,o,i,a){var u,_,w,x,C,j=s;if(s>=o)return"";if(j+1===o)return _=this.bMarks[j]+Math.min(this.tShift[j],i),w=a?this.eMarks[j]+1:this.eMarks[j],this.src.slice(_,w);for(x=new Array(o-s),u=0;ji&&(C=i),C<0&&(C=0),_=this.bMarks[j]+C,w=j+1]/,AA=/^<\/([a-zA-Z]{1,15})[\s>]/;function index_browser_getLine(s,o){var i=s.bMarks[o]+s.blkIndent,a=s.eMarks[o];return s.src.substr(i,a-i)}function skipMarker(s,o){var i,a,u=s.bMarks[o]+s.tShift[o],_=s.eMarks[o];return u>=_||126!==(a=s.src.charCodeAt(u++))&&58!==a||u===(i=s.skipSpaces(u))||i>=_?-1:i}var CA=[["code",function code(s,o,i){var a,u;if(s.tShift[o]-s.blkIndent<4)return!1;for(u=a=o+1;a=4))break;u=++a}return s.line=a,s.tokens.push({type:"code",content:s.getLines(o,u,4+s.blkIndent,!0),block:!0,lines:[o,s.line],level:s.level}),!0}],["fences",function fences(s,o,i,a){var u,_,w,x,C,j=!1,L=s.bMarks[o]+s.tShift[o],B=s.eMarks[o];if(L+3>B)return!1;if(126!==(u=s.src.charCodeAt(L))&&96!==u)return!1;if(C=L,(_=(L=s.skipChars(L,u))-C)<3)return!1;if((w=s.src.slice(L,B).trim()).indexOf("`")>=0)return!1;if(a)return!0;for(x=o;!(++x>=i)&&!((L=C=s.bMarks[x]+s.tShift[x])<(B=s.eMarks[x])&&s.tShift[x]=4||(L=s.skipChars(L,u))-C<_||(L=s.skipSpaces(L))Y)return!1;if(62!==s.src.charCodeAt(z++))return!1;if(s.level>=s.options.maxNesting)return!1;if(a)return!0;for(32===s.src.charCodeAt(z)&&z++,C=s.blkIndent,s.blkIndent=0,x=[s.bMarks[o]],s.bMarks[o]=z,_=(z=z=Y,w=[s.tShift[o]],s.tShift[o]=z-s.bMarks[o],B=s.parser.ruler.getRules("blockquote"),u=o+1;u=(Y=s.eMarks[u]));u++)if(62!==s.src.charCodeAt(z++)){if(_)break;for(V=!1,$=0,U=B.length;$=Y,w.push(s.tShift[u]),s.tShift[u]=z-s.bMarks[u];for(j=s.parentType,s.parentType="blockquote",s.tokens.push({type:"blockquote_open",lines:L=[o,0],level:s.level++}),s.parser.tokenize(s,o,u),s.tokens.push({type:"blockquote_close",level:--s.level}),s.parentType=j,L[1]=s.line,$=0;$C)return!1;if(42!==(u=s.src.charCodeAt(x++))&&45!==u&&95!==u)return!1;for(_=1;x=0)z=!0;else{if(!((B=skipBulletListMarker(s,o))>=0))return!1;z=!1}if(s.level>=s.options.maxNesting)return!1;if(V=s.src.charCodeAt(B-1),a)return!0;for(Z=s.tokens.length,z?(L=s.bMarks[o]+s.tShift[o],U=Number(s.src.substr(L,B-L-1)),s.tokens.push({type:"ordered_list_open",order:U,lines:ie=[o,0],level:s.level++})):s.tokens.push({type:"bullet_list_open",lines:ie=[o,0],level:s.level++}),u=o,ee=!1,ce=s.parser.ruler.getRules("list");!(!(u=s.eMarks[u]?1:Y-B)>4&&($=1),$<1&&($=1),_=B-s.bMarks[u]+$,s.tokens.push({type:"list_item_open",lines:ae=[o,0],level:s.level++}),x=s.blkIndent,C=s.tight,w=s.tShift[o],j=s.parentType,s.tShift[o]=Y-s.bMarks[o],s.blkIndent=_,s.tight=!0,s.parentType="list",s.parser.tokenize(s,o,i,!0),s.tight&&!ee||(fe=!1),ee=s.line-o>1&&s.isEmpty(s.line-1),s.blkIndent=x,s.tShift[o]=w,s.tight=C,s.parentType=j,s.tokens.push({type:"list_item_close",level:--s.level}),u=o=s.line,ae[1]=u,Y=s.bMarks[o],u>=i)||s.isEmpty(u)||s.tShift[u]L)return!1;if(91!==s.src.charCodeAt(j))return!1;if(94!==s.src.charCodeAt(j+1))return!1;if(s.level>=s.options.maxNesting)return!1;for(x=j+2;x=L||58!==s.src.charCodeAt(++x))&&(a||(x++,s.env.footnotes||(s.env.footnotes={}),s.env.footnotes.refs||(s.env.footnotes.refs={}),C=s.src.slice(j+2,x-2),s.env.footnotes.refs[":"+C]=-1,s.tokens.push({type:"footnote_reference_open",label:C,level:s.level++}),u=s.bMarks[o],_=s.tShift[o],w=s.parentType,s.tShift[o]=s.skipSpaces(x)-x,s.bMarks[o]=x,s.blkIndent+=4,s.parentType="footnote",s.tShift[o]=C)return!1;if(35!==(u=s.src.charCodeAt(x))||x>=C)return!1;for(_=1,u=s.src.charCodeAt(++x);35===u&&x6||xx&&32===s.src.charCodeAt(w-1)&&(C=w),s.line=o+1,s.tokens.push({type:"heading_open",hLevel:_,lines:[o,s.line],level:s.level}),x=i)&&(!(s.tShift[w]3)&&(!((u=s.bMarks[w]+s.tShift[w])>=(_=s.eMarks[w]))&&((45===(a=s.src.charCodeAt(u))||61===a)&&(u=s.skipChars(u,a),!((u=s.skipSpaces(u))<_)&&(u=s.bMarks[o]+s.tShift[o],s.line=w+1,s.tokens.push({type:"heading_open",hLevel:61===a?1:2,lines:[o,s.line],level:s.level}),s.tokens.push({type:"inline",content:s.src.slice(u,s.eMarks[o]).trim(),level:s.level+1,lines:[o,s.line-1],children:[]}),s.tokens.push({type:"heading_close",hLevel:61===a?1:2,level:s.level}),!0))))))}],["htmlblock",function htmlblock(s,o,i,a){var u,_,w,x=s.bMarks[o],C=s.eMarks[o],j=s.tShift[o];if(x+=j,!s.options.html)return!1;if(j>3||x+2>=C)return!1;if(60!==s.src.charCodeAt(x))return!1;if(33===(u=s.src.charCodeAt(x+1))||63===u){if(a)return!0}else{if(47!==u&&!function isLetter$1(s){var o=32|s;return o>=97&&o<=122}(u))return!1;if(47===u){if(!(_=s.src.slice(x,C).match(AA)))return!1}else if(!(_=s.src.slice(x,C).match(OA)))return!1;if(!0!==kA[_[1].toLowerCase()])return!1;if(a)return!0}for(w=o+1;wi)return!1;if(C=o+1,s.tShift[C]=s.eMarks[C])return!1;if(124!==(u=s.src.charCodeAt(w))&&45!==u&&58!==u)return!1;if(_=index_browser_getLine(s,o+1),!/^[-:| ]+$/.test(_))return!1;if((j=_.split("|"))<=2)return!1;for(B=[],x=0;x=0;if(L=o+1,s.isEmpty(L)&&++L>i)return!1;if(s.tShift[L]=s.options.maxNesting)return!1;j=s.tokens.length,s.tokens.push({type:"dl_open",lines:C=[o,0],level:s.level++}),w=o,_=L;e:for(;;){for(Z=!0,Y=!1,s.tokens.push({type:"dt_open",lines:[w,w],level:s.level++}),s.tokens.push({type:"inline",content:s.getLines(w,w+1,s.blkIndent,!1).trim(),level:s.level+1,lines:[w,w],children:[]}),s.tokens.push({type:"dt_close",level:--s.level});;){if(s.tokens.push({type:"dd_open",lines:x=[L,0],level:s.level++}),z=s.tight,$=s.ddIndent,B=s.blkIndent,V=s.tShift[_],U=s.parentType,s.blkIndent=s.ddIndent=s.tShift[_]+2,s.tShift[_]=u-s.bMarks[_],s.tight=!0,s.parentType="deflist",s.parser.tokenize(s,_,i,!0),s.tight&&!Y||(Z=!1),Y=s.line-_>1&&s.isEmpty(s.line-1),s.tShift[_]=V,s.tight=z,s.parentType=U,s.blkIndent=B,s.ddIndent=$,s.tokens.push({type:"dd_close",level:--s.level}),x[1]=L=s.line,L>=i)break e;if(s.tShift[L]=i)break;if(w=L,s.isEmpty(w))break;if(s.tShift[w]=i)break;if(s.isEmpty(_)&&_++,_>=i)break;if(s.tShift[_]3)){for(u=!1,_=0,w=x.length;_=i))&&!(s.tShift[w]=0&&(s=s.replace(jA,(function(o,i){var a;return 10===s.charCodeAt(i)?(_=i+1,w=0,o):(a=" ".slice((i-_-w)%4),w=i-_+1,a)}))),u=new StateBlock(s,this,o,i,a),this.tokenize(u,u.line,u.lineMax)};for(var TA=[],NA=0;NA<256;NA++)TA.push(0);function isAlphaNum(s){return s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122}function scanDelims(s,o){var i,a,u,_=o,w=!0,x=!0,C=s.posMax,j=s.src.charCodeAt(o);for(i=o>0?s.src.charCodeAt(o-1):-1;_=C&&(w=!1),(u=_-o)>=4?w=x=!1:(32!==(a=_?@[]^_`{|}~-".split("").forEach((function(s){TA[s.charCodeAt(0)]=1}));var MA=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var RA=/\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g;var DA=["coap","doi","javascript","aaa","aaas","about","acap","cap","cid","crid","data","dav","dict","dns","file","ftp","geo","go","gopher","h323","http","https","iax","icap","im","imap","info","ipp","iris","iris.beep","iris.xpc","iris.xpcs","iris.lwz","ldap","mailto","mid","msrp","msrps","mtqp","mupdate","news","nfs","ni","nih","nntp","opaquelocktoken","pop","pres","rtsp","service","session","shttp","sieve","sip","sips","sms","snmp","soap.beep","soap.beeps","tag","tel","telnet","tftp","thismessage","tn3270","tip","tv","urn","vemmi","ws","wss","xcon","xcon-userid","xmlrpc.beep","xmlrpc.beeps","xmpp","z39.50r","z39.50s","adiumxtra","afp","afs","aim","apt","attachment","aw","beshare","bitcoin","bolo","callto","chrome","chrome-extension","com-eventbrite-attendee","content","cvs","dlna-playsingle","dlna-playcontainer","dtn","dvb","ed2k","facetime","feed","finger","fish","gg","git","gizmoproject","gtalk","hcp","icon","ipn","irc","irc6","ircs","itms","jar","jms","keyparc","lastfm","ldaps","magnet","maps","market","message","mms","ms-help","msnim","mumble","mvn","notes","oid","palm","paparazzi","platform","proxy","psyc","query","res","resource","rmi","rsync","rtmp","secondlife","sftp","sgn","skype","smb","soldat","spotify","ssh","steam","svn","teamspeak","things","udp","unreal","ut2004","ventrilo","view-source","webcal","wtai","wyciwyg","xfire","xri","ymsgr"],LA=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,FA=/^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/;function replace$1(s,o){return s=s.source,o=o||"",function self(i,a){return i?(a=a.source||a,s=s.replace(i,a),self):new RegExp(s,o)}}var BA=replace$1(/(?:unquoted|single_quoted|double_quoted)/)("unquoted",/[^"'=<>`\x00-\x20]+/)("single_quoted",/'[^']*'/)("double_quoted",/"[^"]*"/)(),$A=replace$1(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)("attr_name",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)("attr_value",BA)(),qA=replace$1(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)("attribute",$A)(),UA=replace$1(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)("open_tag",qA)("close_tag",/<\/[A-Za-z][A-Za-z0-9]*\s*>/)("comment",/|/)("processing",/<[?].*?[?]>/)("declaration",/]*>/)("cdata",//)();var VA=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,zA=/^&([a-z][a-z0-9]{1,31});/i;var WA=[["text",function index_browser_text(s,o){for(var i=s.pos;i=0&&32===s.pending.charCodeAt(i))if(i>=1&&32===s.pending.charCodeAt(i-1)){for(var _=i-2;_>=0;_--)if(32!==s.pending.charCodeAt(_)){s.pending=s.pending.substring(0,_+1);break}s.push({type:"hardbreak",level:s.level})}else s.pending=s.pending.slice(0,-1),s.push({type:"softbreak",level:s.level});else s.push({type:"softbreak",level:s.level});for(u++;u=x)return!1;if(126!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),126===_)return!1;if(126===w)return!1;if(32===w||10===w)return!1;for(a=C+2;aC+3)return s.pos+=a-C,o||(s.pending+=s.src.slice(C,a)),!0;for(s.pos=C+2,u=1;s.pos+1=x)return!1;if(43!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),43===_)return!1;if(43===w)return!1;if(32===w||10===w)return!1;for(a=C+2;a=x)return!1;if(61!==s.src.charCodeAt(C+1))return!1;if(s.level>=s.options.maxNesting)return!1;if(_=C>0?s.src.charCodeAt(C-1):-1,w=s.src.charCodeAt(C+2),61===_)return!1;if(61===w)return!1;if(32===w||10===w)return!1;for(a=C+2;a=s.options.maxNesting)return!1;for(s.pos=L+i,x=[i];s.pos=u)return!1;if(s.level>=s.options.maxNesting)return!1;for(s.pos=_+1;s.pos=u)return!1;if(s.level>=s.options.maxNesting)return!1;for(s.pos=_+1;s.pos=s.options.maxNesting)return!1;if(i=U+1,(a=parseLinkLabel(s,U))<0)return!1;if((x=a+1)<$&&40===s.src.charCodeAt(x)){for(x++;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x>=$)return!1;for(U=x,parseLinkDestination(s,x)?(_=s.linkContent,x=s.pos):_="",U=x;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x<$&&U!==x&&parseLinkTitle(s,x))for(w=s.linkContent,x=s.pos;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);else w="";if(x>=$||41!==s.src.charCodeAt(x))return s.pos=B,!1;x++}else{if(s.linkLevel>0)return!1;for(;x<$&&(32===(j=s.src.charCodeAt(x))||10===j);x++);if(x<$&&91===s.src.charCodeAt(x)&&(U=x+1,(x=parseLinkLabel(s,x))>=0?u=s.src.slice(U,x++):x=U-1),u||(void 0===u&&(x=a+1),u=s.src.slice(i,a)),!(C=s.env.references[normalizeReference(u)]))return s.pos=B,!1;_=C.href,w=C.title}return o||(s.pos=i,s.posMax=a,L?s.push({type:"image",src:_,title:w,alt:s.src.substr(i,a-i),level:s.level}):(s.push({type:"link_open",href:_,title:w,level:s.level++}),s.linkLevel++,s.parser.tokenize(s),s.linkLevel--,s.push({type:"link_close",level:--s.level}))),s.pos=x,s.posMax=$,!0}],["footnote_inline",function footnote_inline(s,o){var i,a,u,_,w=s.posMax,x=s.pos;return!(x+2>=w)&&(94===s.src.charCodeAt(x)&&(91===s.src.charCodeAt(x+1)&&(!(s.level>=s.options.maxNesting)&&(i=x+2,!((a=parseLinkLabel(s,x+1))<0)&&(o||(s.env.footnotes||(s.env.footnotes={}),s.env.footnotes.list||(s.env.footnotes.list=[]),u=s.env.footnotes.list.length,s.pos=i,s.posMax=a,s.push({type:"footnote_ref",id:u,level:s.level}),s.linkLevel++,_=s.tokens.length,s.parser.tokenize(s),s.env.footnotes.list[u]={tokens:s.tokens.splice(_)},s.linkLevel--),s.pos=a+1,s.posMax=w,!0)))))}],["footnote_ref",function footnote_ref(s,o){var i,a,u,_,w=s.posMax,x=s.pos;if(x+3>w)return!1;if(!s.env.footnotes||!s.env.footnotes.refs)return!1;if(91!==s.src.charCodeAt(x))return!1;if(94!==s.src.charCodeAt(x+1))return!1;if(s.level>=s.options.maxNesting)return!1;for(a=x+2;a=w)&&(a++,i=s.src.slice(x+2,a-1),void 0!==s.env.footnotes.refs[":"+i]&&(o||(s.env.footnotes.list||(s.env.footnotes.list=[]),s.env.footnotes.refs[":"+i]<0?(u=s.env.footnotes.list.length,s.env.footnotes.list[u]={label:i,count:0},s.env.footnotes.refs[":"+i]=u):u=s.env.footnotes.refs[":"+i],_=s.env.footnotes.list[u].count,s.env.footnotes.list[u].count++,s.push({type:"footnote_ref",id:u,subId:_,level:s.level})),s.pos=a,s.posMax=w,!0)))}],["autolink",function autolink(s,o){var i,a,u,_,w,x=s.pos;return 60===s.src.charCodeAt(x)&&(!((i=s.src.slice(x)).indexOf(">")<0)&&((a=i.match(FA))?!(DA.indexOf(a[1].toLowerCase())<0)&&(w=normalizeLink(_=a[0].slice(1,-1)),!!s.parser.validateLink(_)&&(o||(s.push({type:"link_open",href:w,level:s.level}),s.push({type:"text",content:_,level:s.level+1}),s.push({type:"link_close",level:s.level})),s.pos+=a[0].length,!0)):!!(u=i.match(LA))&&(w=normalizeLink("mailto:"+(_=u[0].slice(1,-1))),!!s.parser.validateLink(w)&&(o||(s.push({type:"link_open",href:w,level:s.level}),s.push({type:"text",content:_,level:s.level+1}),s.push({type:"link_close",level:s.level})),s.pos+=u[0].length,!0))))}],["htmltag",function htmltag(s,o){var i,a,u,_=s.pos;return!!s.options.html&&(u=s.posMax,!(60!==s.src.charCodeAt(_)||_+2>=u)&&(!(33!==(i=s.src.charCodeAt(_+1))&&63!==i&&47!==i&&!function isLetter$2(s){var o=32|s;return o>=97&&o<=122}(i))&&(!!(a=s.src.slice(_).match(UA))&&(o||s.push({type:"htmltag",content:s.src.slice(_,_+a[0].length),level:s.level}),s.pos+=a[0].length,!0))))}],["entity",function entity(s,o){var i,a,u=s.pos,_=s.posMax;if(38!==s.src.charCodeAt(u))return!1;if(u+1<_)if(35===s.src.charCodeAt(u+1)){if(a=s.src.slice(u).match(VA))return o||(i="x"===a[1][0].toLowerCase()?parseInt(a[1].slice(1),16):parseInt(a[1],10),s.pending+=isValidEntityCode(i)?fromCodePoint(i):fromCodePoint(65533)),s.pos+=a[0].length,!0}else if(a=s.src.slice(u).match(zA)){var w=decodeEntity(a[1]);if(a[1]!==w)return o||(s.pending+=w),s.pos+=a[0].length,!0}return o||(s.pending+="&"),s.pos++,!0}]];function ParserInline(){this.ruler=new Ruler;for(var s=0;s0)s.pos=i;else{for(o=0;o=_)break}else s.pending+=s.src[s.pos++]}s.pending&&s.pushPending()},ParserInline.prototype.parse=function(s,o,i,a){var u=new StateInline(s,this,o,i,a);this.tokenize(u)};var JA={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","replacements","smartquotes","references","abbr2","footnote_tail"]},block:{rules:["blockquote","code","fences","footnote","heading","hr","htmlblock","lheading","list","paragraph","table"]},inline:{rules:["autolink","backticks","del","emphasis","entity","escape","footnote_ref","htmltag","links","newline","text"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkTarget:"",typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["block","inline","references","abbr2"]},block:{rules:["blockquote","code","fences","heading","hr","htmlblock","lheading","list","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","htmltag","links","newline","text"]}}}};function StateCore(s,o,i){this.src=o,this.env=i,this.options=s.options,this.tokens=[],this.inlineMode=!1,this.inline=s.inline,this.block=s.block,this.renderer=s.renderer,this.typographer=s.typographer}function Remarkable(s,o){"string"!=typeof s&&(o=s,s="default"),o&&null!=o.linkify&&console.warn("linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n"),this.inline=new ParserInline,this.block=new ParserBlock,this.core=new Core,this.renderer=new Renderer,this.ruler=new Ruler,this.options={},this.configure(JA[s]),this.set(o||{})}Remarkable.prototype.set=function(s){index_browser_assign(this.options,s)},Remarkable.prototype.configure=function(s){var o=this;if(!s)throw new Error("Wrong `remarkable` preset, check name/content");s.options&&o.set(s.options),s.components&&Object.keys(s.components).forEach((function(i){s.components[i].rules&&o[i].ruler.enable(s.components[i].rules,!0)}))},Remarkable.prototype.use=function(s,o){return s(this,o),this},Remarkable.prototype.parse=function(s,o){var i=new StateCore(this,s,o);return this.core.process(i),i.tokens},Remarkable.prototype.render=function(s,o){return o=o||{},this.renderer.render(this.parse(s,o),this.options,o)},Remarkable.prototype.parseInline=function(s,o){var i=new StateCore(this,s,o);return i.inlineMode=!0,this.core.process(i),i.tokens},Remarkable.prototype.renderInline=function(s,o){return o=o||{},this.renderer.render(this.parseInline(s,o),this.options,o)};function indexOf(s,o){if(Array.prototype.indexOf)return s.indexOf(o);for(var i=0,a=s.length;i=0;i--)!0===o(s[i])&&s.splice(i,1)}function throwUnhandledCaseError(s){throw new Error("Unhandled case for value: '".concat(s,"'"))}var HA=function(){function HtmlTag(s){void 0===s&&(s={}),this.tagName="",this.attrs={},this.innerHTML="",this.whitespaceRegex=/\s+/,this.tagName=s.tagName||"",this.attrs=s.attrs||{},this.innerHTML=s.innerHtml||s.innerHTML||""}return HtmlTag.prototype.setTagName=function(s){return this.tagName=s,this},HtmlTag.prototype.getTagName=function(){return this.tagName||""},HtmlTag.prototype.setAttr=function(s,o){return this.getAttrs()[s]=o,this},HtmlTag.prototype.getAttr=function(s){return this.getAttrs()[s]},HtmlTag.prototype.setAttrs=function(s){return Object.assign(this.getAttrs(),s),this},HtmlTag.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},HtmlTag.prototype.setClass=function(s){return this.setAttr("class",s)},HtmlTag.prototype.addClass=function(s){for(var o,i=this.getClass(),a=this.whitespaceRegex,u=i?i.split(a):[],_=s.split(a);o=_.shift();)-1===indexOf(u,o)&&u.push(o);return this.getAttrs().class=u.join(" "),this},HtmlTag.prototype.removeClass=function(s){for(var o,i=this.getClass(),a=this.whitespaceRegex,u=i?i.split(a):[],_=s.split(a);u.length&&(o=_.shift());){var w=indexOf(u,o);-1!==w&&u.splice(w,1)}return this.getAttrs().class=u.join(" "),this},HtmlTag.prototype.getClass=function(){return this.getAttrs().class||""},HtmlTag.prototype.hasClass=function(s){return-1!==(" "+this.getClass()+" ").indexOf(" "+s+" ")},HtmlTag.prototype.setInnerHTML=function(s){return this.innerHTML=s,this},HtmlTag.prototype.setInnerHtml=function(s){return this.setInnerHTML(s)},HtmlTag.prototype.getInnerHTML=function(){return this.innerHTML||""},HtmlTag.prototype.getInnerHtml=function(){return this.getInnerHTML()},HtmlTag.prototype.toAnchorString=function(){var s=this.getTagName(),o=this.buildAttrsStr();return["<",s,o=o?" "+o:"",">",this.getInnerHtml(),""].join("")},HtmlTag.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var s=this.getAttrs(),o=[];for(var i in s)s.hasOwnProperty(i)&&o.push(i+'="'+s[i]+'"');return o.join(" ")},HtmlTag}();var KA=function(){function AnchorTagBuilder(s){void 0===s&&(s={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=s.newWindow||!1,this.truncate=s.truncate||{},this.className=s.className||""}return AnchorTagBuilder.prototype.build=function(s){return new HA({tagName:"a",attrs:this.createAttrs(s),innerHtml:this.processAnchorText(s.getAnchorText())})},AnchorTagBuilder.prototype.createAttrs=function(s){var o={href:s.getAnchorHref()},i=this.createCssClass(s);return i&&(o.class=i),this.newWindow&&(o.target="_blank",o.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=_)return w.host.length==o?(w.host.substr(0,o-u)+i).substr(0,_+a):buildSegment(C,_).substr(0,_+a);var j="";if(w.path&&(j+="/"+w.path),w.query&&(j+="?"+w.query),j){if((C+j).length>=_)return(C+j).length==o?(C+j).substr(0,o):(C+buildSegment(j,_-C.length)).substr(0,_+a);C+=j}if(w.fragment){var L="#"+w.fragment;if((C+L).length>=_)return(C+L).length==o?(C+L).substr(0,o):(C+buildSegment(L,_-C.length)).substr(0,_+a);C+=L}if(w.scheme&&w.host){var B=w.scheme+"://";if((C+B).length<_)return(B+C).substr(0,o)}if(C.length<=o)return C;var $="";return _>0&&($=C.substr(-1*Math.floor(_/2))),(C.substr(0,Math.ceil(_/2))+i+$).substr(0,_+a)}(s,i):"middle"===a?function truncateMiddle(s,o,i){if(s.length<=o)return s;var a,u;null==i?(i="…",a=8,u=3):(a=i.length,u=i.length);var _=o-u,w="";return _>0&&(w=s.substr(-1*Math.floor(_/2))),(s.substr(0,Math.ceil(_/2))+i+w).substr(0,_+a)}(s,i):function truncateEnd(s,o,i){return function ellipsis(s,o,i){var a;return s.length>o&&(null==i?(i="…",a=3):a=i.length,s=s.substring(0,o-a)+i),s}(s,o,i)}(s,i)},AnchorTagBuilder}(),GA=function(){function Match(s){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=s.tagBuilder,this.matchedText=s.matchedText,this.offset=s.offset}return Match.prototype.getMatchedText=function(){return this.matchedText},Match.prototype.setOffset=function(s){this.offset=s},Match.prototype.getOffset=function(){return this.offset},Match.prototype.getCssClassSuffixes=function(){return[this.getType()]},Match.prototype.buildTag=function(){return this.tagBuilder.build(this)},Match}(),extendStatics=function(s,o){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,o){s.__proto__=o}||function(s,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(s[i]=o[i])},extendStatics(s,o)};function tslib_es6_extends(s,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function __(){this.constructor=s}extendStatics(s,o),s.prototype=null===o?Object.create(o):(__.prototype=o.prototype,new __)}var __assign=function(){return __assign=Object.assign||function __assign(s){for(var o,i=1,a=arguments.length;i-1},UrlMatchValidator.isValidUriScheme=function(s){var o=s.match(this.uriSchemeRegex),i=o&&o[0].toLowerCase();return"javascript:"!==i&&"vbscript:"!==i},UrlMatchValidator.urlMatchDoesNotHaveProtocolOrDot=function(s,o){return!(!s||o&&this.hasFullProtocolRegex.test(o)||-1!==s.indexOf("."))},UrlMatchValidator.urlMatchDoesNotHaveAtLeastOneWordChar=function(s,o){return!(!s||!o)&&(!this.hasFullProtocolRegex.test(o)&&!this.hasWordCharAfterProtocolRegex.test(s))},UrlMatchValidator.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\/\//,UrlMatchValidator.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,UrlMatchValidator.hasWordCharAfterProtocolRegex=new RegExp(":[^\\s]*?["+lC+"]"),UrlMatchValidator.ipRegex=/[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/,UrlMatchValidator}(),xC=(YA=new RegExp("[/?#](?:["+dC+"\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*["+dC+"\\-+&@#/%=~_()|'$*\\[\\]{}✓])?"),new RegExp(["(?:","(",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/.source,getDomainNameStr(2),")","|","(","(//)?",/(?:www\.)/.source,getDomainNameStr(6),")","|","(","(//)?",getDomainNameStr(10)+"\\.",vC.source,"(?![-"+hC+"])",")",")","(?::[0-9]+)?","(?:"+YA.source+")?"].join(""),"gi")),kC=new RegExp("["+dC+"]"),OC=function(s){function UrlMatcher(o){var i=s.call(this,o)||this;return i.stripPrefix={scheme:!0,www:!0},i.stripTrailingSlash=!0,i.decodePercentEncoding=!0,i.matcherRegex=xC,i.wordCharRegExp=kC,i.stripPrefix=o.stripPrefix,i.stripTrailingSlash=o.stripTrailingSlash,i.decodePercentEncoding=o.decodePercentEncoding,i}return tslib_es6_extends(UrlMatcher,s),UrlMatcher.prototype.parseMatches=function(s){for(var o,i=this.matcherRegex,a=this.stripPrefix,u=this.stripTrailingSlash,_=this.decodePercentEncoding,w=this.tagBuilder,x=[],_loop_1=function(){var i=o[0],j=o[1],L=o[4],B=o[5],$=o[9],U=o.index,V=B||$,z=s.charAt(U-1);if(!wC.isValid(i,j))return"continue";if(U>0&&"@"===z)return"continue";if(U>0&&V&&C.wordCharRegExp.test(z))return"continue";if(/\?$/.test(i)&&(i=i.substr(0,i.length-1)),C.matchHasUnbalancedClosingParen(i))i=i.substr(0,i.length-1);else{var Y=C.matchHasInvalidCharAfterTld(i,j);Y>-1&&(i=i.substr(0,Y))}var Z=["http://","https://"].find((function(s){return!!j&&-1!==j.indexOf(s)}));if(Z){var ee=i.indexOf(Z);i=i.substr(ee),j=j.substr(ee),U+=ee}var ie=j?"scheme":L?"www":"tld",ae=!!j;x.push(new tC({tagBuilder:w,matchedText:i,offset:U,urlMatchType:ie,url:i,protocolUrlMatch:ae,protocolRelativeMatch:!!V,stripPrefix:a,stripTrailingSlash:u,decodePercentEncoding:_}))},C=this;null!==(o=i.exec(s));)_loop_1();return x},UrlMatcher.prototype.matchHasUnbalancedClosingParen=function(s){var o,i=s.charAt(s.length-1);if(")"===i)o="(";else if("]"===i)o="[";else{if("}"!==i)return!1;o="{"}for(var a=0,u=0,_=s.length-1;u<_;u++){var w=s.charAt(u);w===o?a++:w===i&&(a=Math.max(a-1,0))}return 0===a},UrlMatcher.prototype.matchHasInvalidCharAfterTld=function(s,o){if(!s)return-1;var i=0;o&&(i=s.indexOf(":"),s=s.slice(i));var a=new RegExp("^((.?//)?[-."+dC+"]*[-"+dC+"]\\.[-"+dC+"]+)").exec(s);return null===a?-1:(i+=a[1].length,s=s.slice(a[1].length),/^[^-.A-Za-z0-9:\/?#]/.test(s)?i:-1)},UrlMatcher}(rC),AC=new RegExp("[_".concat(dC,"]")),CC=function(s){function HashtagMatcher(o){var i=s.call(this,o)||this;return i.serviceName="twitter",i.serviceName=o.serviceName,i}return tslib_es6_extends(HashtagMatcher,s),HashtagMatcher.prototype.parseMatches=function(s){for(var o=this.tagBuilder,i=this.serviceName,a=[],u=s.length,_=0,w=-1,x=0;_-1&&_-w<=140){var u=s.slice(w,_),x=new QA({tagBuilder:o,matchedText:u,offset:w,serviceName:i,hashtag:u.slice(1)});a.push(x)}}},HashtagMatcher}(rC),jC=["twitter","facebook","instagram","tiktok"],PC=new RegExp("".concat(/(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/.source,"|").concat(/(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/.source),"g"),IC=function(s){function PhoneMatcher(){var o=null!==s&&s.apply(this,arguments)||this;return o.matcherRegex=PC,o}return tslib_es6_extends(PhoneMatcher,s),PhoneMatcher.prototype.parseMatches=function(s){for(var o,i=this.matcherRegex,a=this.tagBuilder,u=[];null!==(o=i.exec(s));){var _=o[0],w=_.replace(/[^0-9,;#]/g,""),x=!(!o[1]&&!o[2]),C=0==o.index?"":s.substr(o.index-1,1),j=s.substr(o.index+_.length,1),L=!C.match(/\d/)&&!j.match(/\d/);this.testMatch(o[3])&&this.testMatch(_)&&L&&u.push(new eC({tagBuilder:a,matchedText:_,offset:o.index,number:w,plusSign:x}))}return u},PhoneMatcher.prototype.testMatch=function(s){return oC.test(s)},PhoneMatcher}(rC),TC=new RegExp("@[_".concat(dC,"]{1,50}(?![_").concat(dC,"])"),"g"),NC=new RegExp("@[_.".concat(dC,"]{1,30}(?![_").concat(dC,"])"),"g"),MC=new RegExp("@[-_.".concat(dC,"]{1,50}(?![-_").concat(dC,"])"),"g"),RC=new RegExp("@[_.".concat(dC,"]{1,23}[_").concat(dC,"](?![_").concat(dC,"])"),"g"),DC=new RegExp("[^"+dC+"]"),LC=function(s){function MentionMatcher(o){var i=s.call(this,o)||this;return i.serviceName="twitter",i.matcherRegexes={twitter:TC,instagram:NC,soundcloud:MC,tiktok:RC},i.nonWordCharRegex=DC,i.serviceName=o.serviceName,i}return tslib_es6_extends(MentionMatcher,s),MentionMatcher.prototype.parseMatches=function(s){var o,i=this.serviceName,a=this.matcherRegexes[this.serviceName],u=this.nonWordCharRegex,_=this.tagBuilder,w=[];if(!a)return w;for(;null!==(o=a.exec(s));){var x=o.index,C=s.charAt(x-1);if(0===x||u.test(C)){var j=o[0].replace(/\.+$/g,""),L=j.slice(1);w.push(new ZA({tagBuilder:_,matchedText:j,offset:x,serviceName:i,mention:L}))}}return w},MentionMatcher}(rC);function parseHtml(s,o){for(var i=o.onOpenTag,a=o.onCloseTag,u=o.onText,_=o.onComment,w=o.onDoctype,x=new FC,C=0,j=s.length,L=0,B=0,$=x;C"===s?($=new FC(__assign(__assign({},$),{name:captureTagName()})),emitTagAndPreviousTextNode()):nC.test(s)||sC.test(s)||":"===s||resetToDataState()}function stateEndTagOpen(s){">"===s?resetToDataState():nC.test(s)?L=3:resetToDataState()}function stateBeforeAttributeName(s){iC.test(s)||("/"===s?L=12:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():"="===s||aC.test(s)||cC.test(s)?resetToDataState():L=5)}function stateAttributeName(s){iC.test(s)?L=6:"/"===s?L=12:"="===s?L=7:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():aC.test(s)&&resetToDataState()}function stateAfterAttributeName(s){iC.test(s)||("/"===s?L=12:"="===s?L=7:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():aC.test(s)?resetToDataState():L=5)}function stateBeforeAttributeValue(s){iC.test(s)||('"'===s?L=8:"'"===s?L=9:/[>=`]/.test(s)?resetToDataState():"<"===s?startNewTag():L=10)}function stateAttributeValueDoubleQuoted(s){'"'===s&&(L=11)}function stateAttributeValueSingleQuoted(s){"'"===s&&(L=11)}function stateAttributeValueUnquoted(s){iC.test(s)?L=4:">"===s?emitTagAndPreviousTextNode():"<"===s&&startNewTag()}function stateAfterAttributeValueQuoted(s){iC.test(s)?L=4:"/"===s?L=12:">"===s?emitTagAndPreviousTextNode():"<"===s?startNewTag():(L=4,function reconsumeCurrentCharacter(){C--}())}function stateSelfClosingStartTag(s){">"===s?($=new FC(__assign(__assign({},$),{isClosing:!0})),emitTagAndPreviousTextNode()):L=4}function stateMarkupDeclarationOpen(o){"--"===s.substr(C,2)?(C+=2,$=new FC(__assign(__assign({},$),{type:"comment"})),L=14):"DOCTYPE"===s.substr(C,7).toUpperCase()?(C+=7,$=new FC(__assign(__assign({},$),{type:"doctype"})),L=20):resetToDataState()}function stateCommentStart(s){"-"===s?L=15:">"===s?resetToDataState():L=16}function stateCommentStartDash(s){"-"===s?L=18:">"===s?resetToDataState():L=16}function stateComment(s){"-"===s&&(L=17)}function stateCommentEndDash(s){L="-"===s?18:16}function stateCommentEnd(s){">"===s?emitTagAndPreviousTextNode():"!"===s?L=19:"-"===s||(L=16)}function stateCommentEndBang(s){"-"===s?L=17:">"===s?emitTagAndPreviousTextNode():L=16}function stateDoctype(s){">"===s?emitTagAndPreviousTextNode():"<"===s&&startNewTag()}function resetToDataState(){L=0,$=x}function startNewTag(){L=1,$=new FC({idx:C})}function emitTagAndPreviousTextNode(){var o=s.slice(B,$.idx);o&&u(o,B),"comment"===$.type?_($.idx):"doctype"===$.type?w($.idx):($.isOpening&&i($.name,$.idx),$.isClosing&&a($.name,$.idx)),resetToDataState(),B=C+1}function captureTagName(){var o=$.idx+($.isClosing?2:1);return s.slice(o,C).toLowerCase()}B=0&&a++},onText:function(s,i){if(0===a){var _=function splitAndCapture(s,o){if(!o.global)throw new Error("`splitRegex` must have the 'g' flag set");for(var i,a=[],u=0;i=o.exec(s);)a.push(s.substring(u,i.index)),a.push(i[0]),u=i.index+i[0].length;return a.push(s.substring(u)),a}(s,/( | |<|<|>|>|"|"|')/gi),w=i;_.forEach((function(s,i){if(i%2==0){var a=o.parseText(s,w);u.push.apply(u,a)}w+=s.length}))}},onCloseTag:function(s){i.indexOf(s)>=0&&(a=Math.max(a-1,0))},onComment:function(s){},onDoctype:function(s){}}),u=this.compactMatches(u),u=this.removeUnwantedMatches(u)},Autolinker.prototype.compactMatches=function(s){s.sort((function(s,o){return s.getOffset()-o.getOffset()}));for(var o=0;ou?o:o+1;s.splice(w,1);continue}if(s[o+1].getOffset()<_){s.splice(o+1,1);continue}}o++}return s},Autolinker.prototype.removeUnwantedMatches=function(s){return this.hashtag||utils_remove(s,(function(s){return"hashtag"===s.getType()})),this.email||utils_remove(s,(function(s){return"email"===s.getType()})),this.phone||utils_remove(s,(function(s){return"phone"===s.getType()})),this.mention||utils_remove(s,(function(s){return"mention"===s.getType()})),this.urls.schemeMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"scheme"===s.getUrlMatchType()})),this.urls.wwwMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"www"===s.getUrlMatchType()})),this.urls.tldMatches||utils_remove(s,(function(s){return"url"===s.getType()&&"tld"===s.getUrlMatchType()})),s},Autolinker.prototype.parseText=function(s,o){void 0===o&&(o=0),o=o||0;for(var i=this.getMatchers(),a=[],u=0,_=i.length;u<_;u++){for(var w=i[u].parseMatches(s),x=0,C=w.length;x/g,">"));for(var o=this.parse(s),i=[],a=0,u=0,_=o.length;u<_;u++){var w=o[u];i.push(s.substring(a,w.getOffset())),i.push(this.createMatchReturnVal(w)),a=w.getOffset()+w.getMatchedText().length}return i.push(s.substring(a)),i.join("")},Autolinker.prototype.createMatchReturnVal=function(s){var o;return this.replaceFn&&(o=this.replaceFn.call(this.context,s)),"string"==typeof o?o:!1===o?s.getMatchedText():o instanceof HA?o.toAnchorString():s.buildTag().toAnchorString()},Autolinker.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var s=this.getTagBuilder(),o=[new CC({tagBuilder:s,serviceName:this.hashtag}),new SC({tagBuilder:s}),new IC({tagBuilder:s}),new LC({tagBuilder:s,serviceName:this.mention}),new OC({tagBuilder:s,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=o},Autolinker.prototype.getTagBuilder=function(){var s=this.tagBuilder;return s||(s=this.tagBuilder=new KA({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),s},Autolinker.version="3.16.2",Autolinker.AnchorTagBuilder=KA,Autolinker.HtmlTag=HA,Autolinker.matcher={Email:SC,Hashtag:CC,Matcher:rC,Mention:LC,Phone:IC,Url:OC},Autolinker.match={Email:XA,Hashtag:QA,Match:GA,Mention:ZA,Phone:eC,Url:tC},Autolinker}();const $C=BC;var qC=/www|@|\:\/\//;function isLinkOpen(s){return/^\s]/i.test(s)}function isLinkClose(s){return/^<\/a\s*>/i.test(s)}function createLinkifier(){var s=[],o=new $C({stripPrefix:!1,url:!0,email:!0,replaceFn:function(o){switch(o.getType()){case"url":s.push({text:o.matchedText,url:o.getUrl()});break;case"email":s.push({text:o.matchedText,url:"mailto:"+o.getEmail().replace(/^mailto:/i,"")})}return!1}});return{links:s,autolinker:o}}function parseTokens(s){var o,i,a,u,_,w,x,C,j,L,B,$,U,V=s.tokens,z=null;for(i=0,a=V.length;i=0;o--)if("link_close"!==(_=u[o]).type){if("htmltag"===_.type&&(isLinkOpen(_.content)&&B>0&&B--,isLinkClose(_.content)&&B++),!(B>0)&&"text"===_.type&&qC.test(_.content)){if(z||($=(z=createLinkifier()).links,U=z.autolinker),w=_.content,$.length=0,U.link(w),!$.length)continue;for(x=[],L=_.level,C=0;C<$.length;C++)s.inline.validateLink($[C].url)&&((j=w.indexOf($[C].text))&&x.push({type:"text",content:w.slice(0,j),level:L}),x.push({type:"link_open",href:$[C].url,title:"",level:L++}),x.push({type:"text",content:$[C].text,level:L}),x.push({type:"link_close",level:--L}),w=w.slice(j+$[C].text.length));w.length&&x.push({type:"text",content:w,level:L}),V[i].children=u=[].concat(u.slice(0,o),x,u.slice(o+1))}}else for(o--;u[o].level!==_.level&&"link_open"!==u[o].type;)o--}function linkify(s){s.core.ruler.push("linkify",parseTokens)}const{entries:UC,setPrototypeOf:VC,isFrozen:zC,getPrototypeOf:WC,getOwnPropertyDescriptor:JC}=Object;let{freeze:HC,seal:KC,create:GC}=Object,{apply:YC,construct:XC}="undefined"!=typeof Reflect&&Reflect;HC||(HC=function freeze(s){return s}),KC||(KC=function seal(s){return s}),YC||(YC=function apply(s,o,i){return s.apply(o,i)}),XC||(XC=function construct(s,o){return new s(...o)});const QC=unapply(Array.prototype.forEach),ZC=unapply(Array.prototype.lastIndexOf),ej=unapply(Array.prototype.pop),fj=unapply(Array.prototype.push),mj=unapply(Array.prototype.splice),_j=unapply(String.prototype.toLowerCase),Aj=unapply(String.prototype.toString),Cj=unapply(String.prototype.match),Nj=unapply(String.prototype.replace),Bj=unapply(String.prototype.indexOf),$j=unapply(String.prototype.trim),zj=unapply(Object.prototype.hasOwnProperty),Jj=unapply(RegExp.prototype.test),Kj=function unconstruct(s){return function(){for(var o=arguments.length,i=new Array(o),a=0;a1?i-1:0),u=1;u2&&void 0!==arguments[2]?arguments[2]:_j;VC&&VC(s,null);let a=o.length;for(;a--;){let u=o[a];if("string"==typeof u){const s=i(u);s!==u&&(zC(o)||(o[a]=s),u=s)}s[u]=!0}return s}function purify_es_cleanArray(s){for(let o=0;o/gm),pP=KC(/\$\{[\w\W]*/gm),hP=KC(/^data-[\-\w.\u00B7-\uFFFF]+$/),dP=KC(/^aria-[\-\w]+$/),fP=KC(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),mP=KC(/^(?:\w+script|data):/i),gP=KC(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),yP=KC(/^html$/i),vP=KC(/^[a-z][.\w]*(-[.\w]+)+$/i);var bP=Object.freeze({__proto__:null,ARIA_ATTR:dP,ATTR_WHITESPACE:gP,CUSTOM_ELEMENT:vP,DATA_ATTR:hP,DOCTYPE_NAME:yP,ERB_EXPR:uP,IS_ALLOWED_URI:fP,IS_SCRIPT_OR_DATA:mP,MUSTACHE_EXPR:lP,TMPLIT_EXPR:pP});const _P=1,SP=3,EP=7,wP=8,xP=9,kP=function getGlobal(){return"undefined"==typeof window?null:window};var OP=function createDOMPurify(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:kP();const DOMPurify=s=>createDOMPurify(s);if(DOMPurify.version="3.2.6",DOMPurify.removed=[],!s||!s.document||s.document.nodeType!==xP||!s.Element)return DOMPurify.isSupported=!1,DOMPurify;let{document:o}=s;const i=o,a=i.currentScript,{DocumentFragment:u,HTMLTemplateElement:_,Node:w,Element:x,NodeFilter:C,NamedNodeMap:j=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:L,DOMParser:B,trustedTypes:$}=s,U=x.prototype,V=lookupGetter(U,"cloneNode"),z=lookupGetter(U,"remove"),Y=lookupGetter(U,"nextSibling"),Z=lookupGetter(U,"childNodes"),ee=lookupGetter(U,"parentNode");if("function"==typeof _){const s=o.createElement("template");s.content&&s.content.ownerDocument&&(o=s.content.ownerDocument)}let ie,ae="";const{implementation:ce,createNodeIterator:le,createDocumentFragment:pe,getElementsByTagName:de}=o,{importNode:fe}=i;let ye={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};DOMPurify.isSupported="function"==typeof UC&&"function"==typeof ee&&ce&&void 0!==ce.createHTMLDocument;const{MUSTACHE_EXPR:be,ERB_EXPR:_e,TMPLIT_EXPR:Se,DATA_ATTR:we,ARIA_ATTR:xe,IS_SCRIPT_OR_DATA:Pe,ATTR_WHITESPACE:Te,CUSTOM_ELEMENT:Re}=bP;let{IS_ALLOWED_URI:$e}=bP,qe=null;const ze=addToSet({},[...Gj,...Xj,...eP,...rP,...sP]);let We=null;const He=addToSet({},[...oP,...iP,...aP,...cP]);let Ye=Object.seal(GC(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Xe=null,Qe=null,et=!0,tt=!0,rt=!1,nt=!0,st=!1,ot=!0,it=!1,at=!1,ct=!1,lt=!1,ut=!1,pt=!1,ht=!0,dt=!1,mt=!0,gt=!1,yt={},vt=null;const bt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let _t=null;const St=addToSet({},["audio","video","img","source","image","track"]);let Et=null;const wt=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),xt="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",Ot="http://www.w3.org/1999/xhtml";let At=Ot,Ct=!1,jt=null;const Pt=addToSet({},[xt,kt,Ot],Aj);let It=addToSet({},["mi","mo","mn","ms","mtext"]),Tt=addToSet({},["annotation-xml"]);const Nt=addToSet({},["title","style","font","a","script"]);let Mt=null;const Rt=["application/xhtml+xml","text/html"];let Dt=null,Lt=null;const Ft=o.createElement("form"),Bt=function isRegexOrFunction(s){return s instanceof RegExp||s instanceof Function},$t=function _parseConfig(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!Lt||Lt!==s){if(s&&"object"==typeof s||(s={}),s=clone(s),Mt=-1===Rt.indexOf(s.PARSER_MEDIA_TYPE)?"text/html":s.PARSER_MEDIA_TYPE,Dt="application/xhtml+xml"===Mt?Aj:_j,qe=zj(s,"ALLOWED_TAGS")?addToSet({},s.ALLOWED_TAGS,Dt):ze,We=zj(s,"ALLOWED_ATTR")?addToSet({},s.ALLOWED_ATTR,Dt):He,jt=zj(s,"ALLOWED_NAMESPACES")?addToSet({},s.ALLOWED_NAMESPACES,Aj):Pt,Et=zj(s,"ADD_URI_SAFE_ATTR")?addToSet(clone(wt),s.ADD_URI_SAFE_ATTR,Dt):wt,_t=zj(s,"ADD_DATA_URI_TAGS")?addToSet(clone(St),s.ADD_DATA_URI_TAGS,Dt):St,vt=zj(s,"FORBID_CONTENTS")?addToSet({},s.FORBID_CONTENTS,Dt):bt,Xe=zj(s,"FORBID_TAGS")?addToSet({},s.FORBID_TAGS,Dt):clone({}),Qe=zj(s,"FORBID_ATTR")?addToSet({},s.FORBID_ATTR,Dt):clone({}),yt=!!zj(s,"USE_PROFILES")&&s.USE_PROFILES,et=!1!==s.ALLOW_ARIA_ATTR,tt=!1!==s.ALLOW_DATA_ATTR,rt=s.ALLOW_UNKNOWN_PROTOCOLS||!1,nt=!1!==s.ALLOW_SELF_CLOSE_IN_ATTR,st=s.SAFE_FOR_TEMPLATES||!1,ot=!1!==s.SAFE_FOR_XML,it=s.WHOLE_DOCUMENT||!1,lt=s.RETURN_DOM||!1,ut=s.RETURN_DOM_FRAGMENT||!1,pt=s.RETURN_TRUSTED_TYPE||!1,ct=s.FORCE_BODY||!1,ht=!1!==s.SANITIZE_DOM,dt=s.SANITIZE_NAMED_PROPS||!1,mt=!1!==s.KEEP_CONTENT,gt=s.IN_PLACE||!1,$e=s.ALLOWED_URI_REGEXP||fP,At=s.NAMESPACE||Ot,It=s.MATHML_TEXT_INTEGRATION_POINTS||It,Tt=s.HTML_INTEGRATION_POINTS||Tt,Ye=s.CUSTOM_ELEMENT_HANDLING||{},s.CUSTOM_ELEMENT_HANDLING&&Bt(s.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ye.tagNameCheck=s.CUSTOM_ELEMENT_HANDLING.tagNameCheck),s.CUSTOM_ELEMENT_HANDLING&&Bt(s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ye.attributeNameCheck=s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),s.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ye.allowCustomizedBuiltInElements=s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),st&&(tt=!1),ut&&(lt=!0),yt&&(qe=addToSet({},sP),We=[],!0===yt.html&&(addToSet(qe,Gj),addToSet(We,oP)),!0===yt.svg&&(addToSet(qe,Xj),addToSet(We,iP),addToSet(We,cP)),!0===yt.svgFilters&&(addToSet(qe,eP),addToSet(We,iP),addToSet(We,cP)),!0===yt.mathMl&&(addToSet(qe,rP),addToSet(We,aP),addToSet(We,cP))),s.ADD_TAGS&&(qe===ze&&(qe=clone(qe)),addToSet(qe,s.ADD_TAGS,Dt)),s.ADD_ATTR&&(We===He&&(We=clone(We)),addToSet(We,s.ADD_ATTR,Dt)),s.ADD_URI_SAFE_ATTR&&addToSet(Et,s.ADD_URI_SAFE_ATTR,Dt),s.FORBID_CONTENTS&&(vt===bt&&(vt=clone(vt)),addToSet(vt,s.FORBID_CONTENTS,Dt)),mt&&(qe["#text"]=!0),it&&addToSet(qe,["html","head","body"]),qe.table&&(addToSet(qe,["tbody"]),delete Xe.tbody),s.TRUSTED_TYPES_POLICY){if("function"!=typeof s.TRUSTED_TYPES_POLICY.createHTML)throw Kj('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof s.TRUSTED_TYPES_POLICY.createScriptURL)throw Kj('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=s.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function _createTrustedTypesPolicy(s,o){if("object"!=typeof s||"function"!=typeof s.createPolicy)return null;let i=null;const a="data-tt-policy-suffix";o&&o.hasAttribute(a)&&(i=o.getAttribute(a));const u="dompurify"+(i?"#"+i:"");try{return s.createPolicy(u,{createHTML:s=>s,createScriptURL:s=>s})}catch(s){return console.warn("TrustedTypes policy "+u+" could not be created."),null}}($,a)),null!==ie&&"string"==typeof ae&&(ae=ie.createHTML(""));HC&&HC(s),Lt=s}},qt=addToSet({},[...Xj,...eP,...tP]),Ut=addToSet({},[...rP,...nP]),Vt=function _forceRemove(s){fj(DOMPurify.removed,{element:s});try{ee(s).removeChild(s)}catch(o){z(s)}},zt=function _removeAttribute(s,o){try{fj(DOMPurify.removed,{attribute:o.getAttributeNode(s),from:o})}catch(s){fj(DOMPurify.removed,{attribute:null,from:o})}if(o.removeAttribute(s),"is"===s)if(lt||ut)try{Vt(o)}catch(s){}else try{o.setAttribute(s,"")}catch(s){}},Wt=function _initDocument(s){let i=null,a=null;if(ct)s=""+s;else{const o=Cj(s,/^[\r\n\t ]+/);a=o&&o[0]}"application/xhtml+xml"===Mt&&At===Ot&&(s=''+s+"");const u=ie?ie.createHTML(s):s;if(At===Ot)try{i=(new B).parseFromString(u,Mt)}catch(s){}if(!i||!i.documentElement){i=ce.createDocument(At,"template",null);try{i.documentElement.innerHTML=Ct?ae:u}catch(s){}}const _=i.body||i.documentElement;return s&&a&&_.insertBefore(o.createTextNode(a),_.childNodes[0]||null),At===Ot?de.call(i,it?"html":"body")[0]:it?i.documentElement:_},Jt=function _createNodeIterator(s){return le.call(s.ownerDocument||s,s,C.SHOW_ELEMENT|C.SHOW_COMMENT|C.SHOW_TEXT|C.SHOW_PROCESSING_INSTRUCTION|C.SHOW_CDATA_SECTION,null)},Ht=function _isClobbered(s){return s instanceof L&&("string"!=typeof s.nodeName||"string"!=typeof s.textContent||"function"!=typeof s.removeChild||!(s.attributes instanceof j)||"function"!=typeof s.removeAttribute||"function"!=typeof s.setAttribute||"string"!=typeof s.namespaceURI||"function"!=typeof s.insertBefore||"function"!=typeof s.hasChildNodes)},Kt=function _isNode(s){return"function"==typeof w&&s instanceof w};function _executeHooks(s,o,i){QC(s,(s=>{s.call(DOMPurify,o,i,Lt)}))}const Gt=function _sanitizeElements(s){let o=null;if(_executeHooks(ye.beforeSanitizeElements,s,null),Ht(s))return Vt(s),!0;const i=Dt(s.nodeName);if(_executeHooks(ye.uponSanitizeElement,s,{tagName:i,allowedTags:qe}),ot&&s.hasChildNodes()&&!Kt(s.firstElementChild)&&Jj(/<[/\w!]/g,s.innerHTML)&&Jj(/<[/\w!]/g,s.textContent))return Vt(s),!0;if(s.nodeType===EP)return Vt(s),!0;if(ot&&s.nodeType===wP&&Jj(/<[/\w]/g,s.data))return Vt(s),!0;if(!qe[i]||Xe[i]){if(!Xe[i]&&Xt(i)){if(Ye.tagNameCheck instanceof RegExp&&Jj(Ye.tagNameCheck,i))return!1;if(Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(i))return!1}if(mt&&!vt[i]){const o=ee(s)||s.parentNode,i=Z(s)||s.childNodes;if(i&&o){for(let a=i.length-1;a>=0;--a){const u=V(i[a],!0);u.__removalCount=(s.__removalCount||0)+1,o.insertBefore(u,Y(s))}}}return Vt(s),!0}return s instanceof x&&!function _checkValidNamespace(s){let o=ee(s);o&&o.tagName||(o={namespaceURI:At,tagName:"template"});const i=_j(s.tagName),a=_j(o.tagName);return!!jt[s.namespaceURI]&&(s.namespaceURI===kt?o.namespaceURI===Ot?"svg"===i:o.namespaceURI===xt?"svg"===i&&("annotation-xml"===a||It[a]):Boolean(qt[i]):s.namespaceURI===xt?o.namespaceURI===Ot?"math"===i:o.namespaceURI===kt?"math"===i&&Tt[a]:Boolean(Ut[i]):s.namespaceURI===Ot?!(o.namespaceURI===kt&&!Tt[a])&&!(o.namespaceURI===xt&&!It[a])&&!Ut[i]&&(Nt[i]||!qt[i]):!("application/xhtml+xml"!==Mt||!jt[s.namespaceURI]))}(s)?(Vt(s),!0):"noscript"!==i&&"noembed"!==i&&"noframes"!==i||!Jj(/<\/no(script|embed|frames)/i,s.innerHTML)?(st&&s.nodeType===SP&&(o=s.textContent,QC([be,_e,Se],(s=>{o=Nj(o,s," ")})),s.textContent!==o&&(fj(DOMPurify.removed,{element:s.cloneNode()}),s.textContent=o)),_executeHooks(ye.afterSanitizeElements,s,null),!1):(Vt(s),!0)},Yt=function _isValidAttribute(s,i,a){if(ht&&("id"===i||"name"===i)&&(a in o||a in Ft))return!1;if(tt&&!Qe[i]&&Jj(we,i));else if(et&&Jj(xe,i));else if(!We[i]||Qe[i]){if(!(Xt(s)&&(Ye.tagNameCheck instanceof RegExp&&Jj(Ye.tagNameCheck,s)||Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(s))&&(Ye.attributeNameCheck instanceof RegExp&&Jj(Ye.attributeNameCheck,i)||Ye.attributeNameCheck instanceof Function&&Ye.attributeNameCheck(i))||"is"===i&&Ye.allowCustomizedBuiltInElements&&(Ye.tagNameCheck instanceof RegExp&&Jj(Ye.tagNameCheck,a)||Ye.tagNameCheck instanceof Function&&Ye.tagNameCheck(a))))return!1}else if(Et[i]);else if(Jj($e,Nj(a,Te,"")));else if("src"!==i&&"xlink:href"!==i&&"href"!==i||"script"===s||0!==Bj(a,"data:")||!_t[s]){if(rt&&!Jj(Pe,Nj(a,Te,"")));else if(a)return!1}else;return!0},Xt=function _isBasicCustomElement(s){return"annotation-xml"!==s&&Cj(s,Re)},Qt=function _sanitizeAttributes(s){_executeHooks(ye.beforeSanitizeAttributes,s,null);const{attributes:o}=s;if(!o||Ht(s))return;const i={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:We,forceKeepAttr:void 0};let a=o.length;for(;a--;){const u=o[a],{name:_,namespaceURI:w,value:x}=u,C=Dt(_),j=x;let L="value"===_?j:$j(j);if(i.attrName=C,i.attrValue=L,i.keepAttr=!0,i.forceKeepAttr=void 0,_executeHooks(ye.uponSanitizeAttribute,s,i),L=i.attrValue,!dt||"id"!==C&&"name"!==C||(zt(_,s),L="user-content-"+L),ot&&Jj(/((--!?|])>)|<\/(style|title)/i,L)){zt(_,s);continue}if(i.forceKeepAttr)continue;if(!i.keepAttr){zt(_,s);continue}if(!nt&&Jj(/\/>/i,L)){zt(_,s);continue}st&&QC([be,_e,Se],(s=>{L=Nj(L,s," ")}));const B=Dt(s.nodeName);if(Yt(B,C,L)){if(ie&&"object"==typeof $&&"function"==typeof $.getAttributeType)if(w);else switch($.getAttributeType(B,C)){case"TrustedHTML":L=ie.createHTML(L);break;case"TrustedScriptURL":L=ie.createScriptURL(L)}if(L!==j)try{w?s.setAttributeNS(w,_,L):s.setAttribute(_,L),Ht(s)?Vt(s):ej(DOMPurify.removed)}catch(o){zt(_,s)}}else zt(_,s)}_executeHooks(ye.afterSanitizeAttributes,s,null)},Zt=function _sanitizeShadowDOM(s){let o=null;const i=Jt(s);for(_executeHooks(ye.beforeSanitizeShadowDOM,s,null);o=i.nextNode();)_executeHooks(ye.uponSanitizeShadowNode,o,null),Gt(o),Qt(o),o.content instanceof u&&_sanitizeShadowDOM(o.content);_executeHooks(ye.afterSanitizeShadowDOM,s,null)};return DOMPurify.sanitize=function(s){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=null,_=null,x=null,C=null;if(Ct=!s,Ct&&(s="\x3c!--\x3e"),"string"!=typeof s&&!Kt(s)){if("function"!=typeof s.toString)throw Kj("toString is not a function");if("string"!=typeof(s=s.toString()))throw Kj("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return s;if(at||$t(o),DOMPurify.removed=[],"string"==typeof s&&(gt=!1),gt){if(s.nodeName){const o=Dt(s.nodeName);if(!qe[o]||Xe[o])throw Kj("root node is forbidden and cannot be sanitized in-place")}}else if(s instanceof w)a=Wt("\x3c!----\x3e"),_=a.ownerDocument.importNode(s,!0),_.nodeType===_P&&"BODY"===_.nodeName||"HTML"===_.nodeName?a=_:a.appendChild(_);else{if(!lt&&!st&&!it&&-1===s.indexOf("<"))return ie&&pt?ie.createHTML(s):s;if(a=Wt(s),!a)return lt?null:pt?ae:""}a&&ct&&Vt(a.firstChild);const j=Jt(gt?s:a);for(;x=j.nextNode();)Gt(x),Qt(x),x.content instanceof u&&Zt(x.content);if(gt)return s;if(lt){if(ut)for(C=pe.call(a.ownerDocument);a.firstChild;)C.appendChild(a.firstChild);else C=a;return(We.shadowroot||We.shadowrootmode)&&(C=fe.call(i,C,!0)),C}let L=it?a.outerHTML:a.innerHTML;return it&&qe["!doctype"]&&a.ownerDocument&&a.ownerDocument.doctype&&a.ownerDocument.doctype.name&&Jj(yP,a.ownerDocument.doctype.name)&&(L="\n"+L),st&&QC([be,_e,Se],(s=>{L=Nj(L,s," ")})),ie&&pt?ie.createHTML(L):L},DOMPurify.setConfig=function(){$t(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),at=!0},DOMPurify.clearConfig=function(){Lt=null,at=!1},DOMPurify.isValidAttribute=function(s,o,i){Lt||$t({});const a=Dt(s),u=Dt(o);return Yt(a,u,i)},DOMPurify.addHook=function(s,o){"function"==typeof o&&fj(ye[s],o)},DOMPurify.removeHook=function(s,o){if(void 0!==o){const i=ZC(ye[s],o);return-1===i?void 0:mj(ye[s],i,1)[0]}return ej(ye[s])},DOMPurify.removeHooks=function(s){ye[s]=[]},DOMPurify.removeAllHooks=function(){ye={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},DOMPurify}();OP.addHook&&OP.addHook("beforeSanitizeElements",(function(s){return s.href&&s.setAttribute("rel","noopener noreferrer"),s}));const AP=function Markdown({source:s,className:o="",getConfigs:i=()=>({useUnsafeMarkdown:!1})}){if("string"!=typeof s)return null;const a=new Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:"_blank"}).use(linkify);a.core.ruler.disable(["replacements","smartquotes"]);const{useUnsafeMarkdown:u}=i(),_=a.render(s),w=sanitizer(_,{useUnsafeMarkdown:u});return s&&_&&w?Re.createElement("div",{className:Jn()(o,"markdown"),dangerouslySetInnerHTML:{__html:w}}):null};function sanitizer(s,{useUnsafeMarkdown:o=!1}={}){const i=o,a=o?[]:["style","class"];return o&&!sanitizer.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),sanitizer.hasWarnedAboutDeprecation=!0),OP.sanitize(s,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:i,FORBID_ATTR:a})}sanitizer.hasWarnedAboutDeprecation=!1;class BaseLayout extends Re.Component{render(){const{errSelectors:s,specSelectors:o,getComponent:i}=this.props,a=i("SvgAssets"),u=i("InfoContainer",!0),_=i("VersionPragmaFilter"),w=i("operations",!0),x=i("Models",!0),C=i("Webhooks",!0),j=i("Row"),L=i("Col"),B=i("errors",!0),$=i("ServersContainer",!0),U=i("SchemesContainer",!0),V=i("AuthorizeBtnContainer",!0),z=i("FilterContainer",!0),Y=o.isSwagger2(),Z=o.isOAS3(),ee=o.isOAS31(),ie=!o.specStr(),ae=o.loadingStatus();let ce=null;if("loading"===ae&&(ce=Re.createElement("div",{className:"info"},Re.createElement("div",{className:"loading-container"},Re.createElement("div",{className:"loading"})))),"failed"===ae&&(ce=Re.createElement("div",{className:"info"},Re.createElement("div",{className:"loading-container"},Re.createElement("h4",{className:"title"},"Failed to load API definition."),Re.createElement(B,null)))),"failedConfig"===ae){const o=s.lastError(),i=o?o.get("message"):"";ce=Re.createElement("div",{className:"info failed-config"},Re.createElement("div",{className:"loading-container"},Re.createElement("h4",{className:"title"},"Failed to load remote configuration."),Re.createElement("p",null,i)))}if(!ce&&ie&&(ce=Re.createElement("h4",null,"No API definition provided.")),ce)return Re.createElement("div",{className:"swagger-ui"},Re.createElement("div",{className:"loading-container"},ce));const le=o.servers(),pe=o.schemes(),de=le&&le.size,fe=pe&&pe.size,ye=!!o.securityDefinitions();return Re.createElement("div",{className:"swagger-ui"},Re.createElement(a,null),Re.createElement(_,{isSwagger2:Y,isOAS3:Z,alsoShow:Re.createElement(B,null)},Re.createElement(B,null),Re.createElement(j,{className:"information-container"},Re.createElement(L,{mobile:12},Re.createElement(u,null))),de||fe||ye?Re.createElement("div",{className:"scheme-container"},Re.createElement(L,{className:"schemes wrapper",mobile:12},de||fe?Re.createElement("div",{className:"schemes-server-container"},de?Re.createElement($,null):null,fe?Re.createElement(U,null):null):null,ye?Re.createElement(V,null):null)):null,Re.createElement(z,null),Re.createElement(j,null,Re.createElement(L,{mobile:12,desktop:12},Re.createElement(w,null))),ee&&Re.createElement(j,{className:"webhooks-container"},Re.createElement(L,{mobile:12,desktop:12},Re.createElement(C,null))),Re.createElement(j,null,Re.createElement(L,{mobile:12,desktop:12},Re.createElement(x,null)))))}}const core_components=()=>({components:{App:KO,authorizationPopup:AuthorizationPopup,authorizeBtn:AuthorizeBtn,AuthorizeBtnContainer,authorizeOperationBtn:AuthorizeOperationBtn,auths:Auths,AuthItem:auth_item_Auths,authError:AuthError,oauth2:Oauth2,apiKeyAuth:ApiKeyAuth,basicAuth:BasicAuth,clear:Clear,liveResponse:LiveResponse,InitializedInput,info:nA,InfoContainer,InfoUrl,InfoBasePath,Contact:sA,License:oA,JumpToPath,CopyToClipboardBtn,onlineValidatorBadge:OnlineValidatorBadge,operations:Operations,operation:operation_Operation,OperationSummary,OperationSummaryMethod,OperationSummaryPath,responses:responses_Responses,response:response_Response,ResponseExtension:response_extension,responseBody:ResponseBody,parameters:Parameters,parameterRow:ParameterRow,execute:Execute,headers:headers_Headers,errors:Errors,contentType:ContentType,overview:Overview,footer:Footer,FilterContainer,ParamBody,curl:Curl,Property:property,TryItOutButton,Markdown:AP,BaseLayout,VersionPragmaFilter,VersionStamp:version_stamp,OperationExt:operation_extensions,OperationExtRow:operation_extension_row,ParameterExt:parameter_extension,ParameterIncludeEmpty,OperationTag,OperationContainer,OpenAPIVersion:openapi_version,DeepLink:deep_link,SvgAssets:svg_assets,Example:example_Example,ExamplesSelect,ExamplesSelectValueRetainer}}),form_components=()=>({components:{..._e}}),base=()=>[configsPlugin,util,logs,view,view_legacy,plugins_spec,err,icons,plugins_layout,json_schema_5,json_schema_5_samples,core_components,form_components,swagger_client,auth,downloadUrlPlugin,deep_linking,filter,on_complete,plugins_request_snippets,syntax_highlighting,versions,safe_render()],CP=(0,ze.Map)();function onlyOAS3(s){return(o,i)=>(...a)=>{if(i.getSystem().specSelectors.isOAS3()){const o=s(...a);return"function"==typeof o?o(i):o}return o(...a)}}const jP=onlyOAS3(xs()(null)),PP=onlyOAS3(((s,o)=>s=>s.getSystem().specSelectors.findSchema(o))),IP=onlyOAS3((()=>s=>{const o=s.getSystem().specSelectors.specJson().getIn(["components","schemas"]);return ze.Map.isMap(o)?o:CP})),TP=onlyOAS3((()=>s=>s.getSystem().specSelectors.specJson().hasIn(["servers",0]))),NP=onlyOAS3(Ut(Ns,(s=>s.getIn(["components","securitySchemes"])||null))),wrap_selectors_validOperationMethods=(s,o)=>(i,...a)=>o.specSelectors.isOAS3()?o.oas3Selectors.validOperationMethods():s(...a),MP=jP,RP=jP,DP=jP,LP=jP,FP=jP;const BP=function wrap_selectors_onlyOAS3(s){return(o,i)=>(...a)=>{if(i.getSystem().specSelectors.isOAS3()){let o=i.getState().getIn(["spec","resolvedSubtrees","components","securitySchemes"]);return s(i,o,...a)}return o(...a)}}(Ut((s=>s),(({specSelectors:s})=>s.securityDefinitions()),((s,o)=>{let i=(0,ze.List)();return o?(o.entrySeq().forEach((([s,o])=>{const a=o?.get("type");if("oauth2"===a&&o.get("flows").entrySeq().forEach((([a,u])=>{let _=(0,ze.fromJS)({flow:a,authorizationUrl:u.get("authorizationUrl"),tokenUrl:u.get("tokenUrl"),scopes:u.get("scopes"),type:o.get("type"),description:o.get("description")});i=i.push(new ze.Map({[s]:_.filter((s=>void 0!==s))}))})),"http"!==a&&"apiKey"!==a||(i=i.push(new ze.Map({[s]:o}))),"openIdConnect"===a&&o.get("openIdConnectData")){let a=o.get("openIdConnectData");(a.get("grant_types_supported")||["authorization_code","implicit"]).forEach((u=>{let _=a.get("scopes_supported")&&a.get("scopes_supported").reduce(((s,o)=>s.set(o,"")),new ze.Map),w=(0,ze.fromJS)({flow:u,authorizationUrl:a.get("authorization_endpoint"),tokenUrl:a.get("token_endpoint"),scopes:_,type:"oauth2",openIdConnectUrl:o.get("openIdConnectUrl")});i=i.push(new ze.Map({[s]:w.filter((s=>void 0!==s))}))}))}})),i):i})));function OAS3ComponentWrapFactory(s){return(o,i)=>a=>"function"==typeof i.specSelectors?.isOAS3?i.specSelectors.isOAS3()?Re.createElement(s,Mn()({},a,i,{Ori:o})):Re.createElement(o,a):(console.warn("OAS3 wrapper: couldn't get spec"),null)}const $P=(0,ze.Map)(),selectors_isSwagger2=()=>s=>function isSwagger2(s){const o=s.get("swagger");return"string"==typeof o&&"2.0"===o}(s.getSystem().specSelectors.specJson()),selectors_isOAS30=()=>s=>function isOAS30(s){const o=s.get("openapi");return"string"==typeof o&&/^3\.0\.(?:[1-9]\d*|0)$/.test(o)}(s.getSystem().specSelectors.specJson()),selectors_isOAS3=()=>s=>s.getSystem().specSelectors.isOAS30();function selectors_onlyOAS3(s){return(o,...i)=>a=>{if(a.specSelectors.isOAS3()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null}}const qP=selectors_onlyOAS3((()=>s=>s.specSelectors.specJson().get("servers",$P))),findSchema=(s,o)=>{const i=s.getIn(["resolvedSubtrees","components","schemas",o],null),a=s.getIn(["json","components","schemas",o],null);return i||a||null},UP=selectors_onlyOAS3(((s,{callbacks:o,specPath:i})=>s=>{const a=s.specSelectors.validOperationMethods();return ze.Map.isMap(o)?o.reduce(((s,o,u)=>{if(!ze.Map.isMap(o))return s;const _=o.reduce(((s,o,_)=>{if(!ze.Map.isMap(o))return s;const w=o.entrySeq().filter((([s])=>a.includes(s))).map((([s,o])=>({operation:(0,ze.Map)({operation:o}),method:s,path:_,callbackName:u,specPath:i.concat([u,_,s])})));return s.concat(w)}),(0,ze.List)());return s.concat(_)}),(0,ze.List)()).groupBy((s=>s.callbackName)).map((s=>s.toArray())).toObject():{}})),callbacks=({callbacks:s,specPath:o,specSelectors:i,getComponent:a})=>{const u=i.callbacksOperations({callbacks:s,specPath:o}),_=Object.keys(u),w=a("OperationContainer",!0);return 0===_.length?Re.createElement("span",null,"No callbacks"):Re.createElement("div",null,_.map((s=>Re.createElement("div",{key:`${s}`},Re.createElement("h2",null,s),u[s].map((o=>Re.createElement(w,{key:`${s}-${o.path}-${o.method}`,op:o.operation,tag:"callbacks",method:o.method,path:o.path,specPath:o.specPath,allowTryItOut:!1})))))))},getDefaultRequestBodyValue=(s,o,i,a)=>{const u=s.getIn(["content",o])??(0,ze.OrderedMap)(),_=u.get("schema",(0,ze.OrderedMap)()).toJS(),w=void 0!==u.get("examples"),x=u.get("example"),C=w?u.getIn(["examples",i,"value"]):x;return stringify(a.getSampleSchema(_,o,{includeWriteOnly:!0},C))},components_request_body=({userHasEditedBody:s,requestBody:o,requestBodyValue:i,requestBodyInclusionSetting:a,requestBodyErrors:u,getComponent:_,getConfigs:w,specSelectors:x,fn:C,contentType:j,isExecute:L,specPath:B,onChange:$,onChangeIncludeEmpty:U,activeExamplesKey:V,updateActiveExamplesKey:z,setRetainRequestBodyValueFlag:Y})=>{const handleFile=s=>{$(s.target.files[0])},setIsIncludedOptions=s=>{let o={key:s,shouldDispatchInit:!1,defaultValue:!0};return"no value"===a.get(s,"no value")&&(o.shouldDispatchInit=!0),o},Z=_("Markdown",!0),ee=_("modelExample"),ie=_("RequestBodyEditor"),ae=_("HighlightCode",!0),ce=_("ExamplesSelectValueRetainer"),le=_("Example"),pe=_("ParameterIncludeEmpty"),{showCommonExtensions:de}=w(),fe=o?.get("description")??null,ye=o?.get("content")??new ze.OrderedMap;j=j||ye.keySeq().first()||"";const be=ye.get(j)??(0,ze.OrderedMap)(),_e=be.get("schema",(0,ze.OrderedMap)()),Se=be.get("examples",null),we=Se?.map(((s,i)=>{const a=s?.get("value",null);return a&&(s=s.set("value",getDefaultRequestBodyValue(o,j,i,C),a)),s}));u=ze.List.isList(u)?u:(0,ze.List)();if(C.isFileUploadIntended(be?.get("schema"),j)){const s=_("Input");return L?Re.createElement(s,{type:"file",onChange:handleFile}):Re.createElement("i",null,"Example values are not available for ",Re.createElement("code",null,j)," media types.")}if(!be.size)return null;if(C.hasSchemaType(be.get("schema"),"object")&&("application/x-www-form-urlencoded"===j||0===j.indexOf("multipart/"))&&_e.get("properties",(0,ze.OrderedMap)()).size>0){const s=_("JsonSchemaForm"),o=_("ParameterExt"),j=_e.get("properties",(0,ze.OrderedMap)());return i=ze.Map.isMap(i)?i:(0,ze.OrderedMap)(),Re.createElement("div",{className:"table-container"},fe&&Re.createElement(Z,{source:fe}),Re.createElement("table",null,Re.createElement("tbody",null,ze.Map.isMap(j)&&j.entrySeq().map((([j,V])=>{if(V.get("readOnly"))return;const z=V.get("oneOf")?.get(0)?.toJS(),Y=V.get("anyOf")?.get(0)?.toJS();V=(0,ze.fromJS)(C.mergeJsonSchema(V.toJS(),z??Y??{}));let ie=de?getCommonExtensions(V):null;const ae=_e.get("required",(0,ze.List)()).includes(j),ce=C.getSchemaObjectType(V),le=C.getSchemaObjectTypeLabel(V),fe=C.getSchemaObjectType(V?.get("items")),ye=V.get("format"),be=V.get("description"),Se=i.getIn([j,"value"]),we=i.getIn([j,"errors"])||u,xe=a.get(j)||!1;let Pe=C.getSampleSchema(V,!1,{includeWriteOnly:!0});!1===Pe&&(Pe="false"),0===Pe&&(Pe="0"),"string"!=typeof Pe&&"object"===ce&&(Pe=stringify(Pe)),"string"==typeof Pe&&"array"===ce&&(Pe=JSON.parse(Pe));const Te=C.isFileUploadIntended(V),$e=Re.createElement(s,{fn:C,dispatchInitialValue:!Te,schema:V,description:j,getComponent:_,value:void 0===Se?Pe:Se,required:ae,errors:we,onChange:s=>{$(s,[j])}});return Re.createElement("tr",{key:j,className:"parameters","data-property-name":j},Re.createElement("td",{className:"parameters-col_name"},Re.createElement("div",{className:ae?"parameter__name required":"parameter__name"},j,ae?Re.createElement("span",null," *"):null),Re.createElement("div",{className:"parameter__type"},le,ye&&Re.createElement("span",{className:"prop-format"},"($",ye,")"),de&&ie.size?ie.entrySeq().map((([s,i])=>Re.createElement(o,{key:`${s}-${i}`,xKey:s,xVal:i}))):null),Re.createElement("div",{className:"parameter__deprecated"},V.get("deprecated")?"deprecated":null)),Re.createElement("td",{className:"parameters-col_description"},Re.createElement(Z,{source:be}),L?Re.createElement("div",null,"object"===ce||"object"===fe?Re.createElement(ee,{getComponent:_,specPath:B.push("schema"),getConfigs:w,isExecute:L,specSelectors:x,schema:V,example:$e}):$e,ae?null:Re.createElement(pe,{onChange:s=>U(j,s),isIncluded:xe,isIncludedOptions:setIsIncludedOptions(j),isDisabled:Array.isArray(Se)?0!==Se.length:!isEmptyValue(Se)})):null))})))))}const xe=getDefaultRequestBodyValue(o,j,V,C);let Pe=null;getKnownSyntaxHighlighterLanguage(xe)&&(Pe="json");const Te=L?Re.createElement(ie,{value:i,errors:u,defaultValue:xe,onChange:$,getComponent:_}):Re.createElement(ae,{className:"body-param__example",language:Pe},stringify(i)||xe);return Re.createElement("div",null,fe&&Re.createElement(Z,{source:fe}),we?Re.createElement(ce,{userHasEditedBody:s,examples:we,currentKey:V,currentUserInputValue:i,onSelect:s=>{z(s)},updateValue:$,defaultToFirstExample:!0,getComponent:_,setRetainRequestBodyValueFlag:Y}):null,Re.createElement(ee,{getComponent:_,getConfigs:w,specSelectors:x,expandDepth:1,isExecute:L,schema:be.get("schema"),specPath:B.push("content",j,"schema"),example:Te,includeWriteOnly:!0}),we?Re.createElement(le,{example:we.get(V),getComponent:_,getConfigs:w}):null)};class operation_link_OperationLink extends Re.Component{render(){const{link:s,name:o,getComponent:i}=this.props,a=i("Markdown",!0);let u=s.get("operationId")||s.get("operationRef"),_=s.get("parameters")&&s.get("parameters").toJS(),w=s.get("description");return Re.createElement("div",{className:"operation-link"},Re.createElement("div",{className:"description"},Re.createElement("b",null,Re.createElement("code",null,o)),w?Re.createElement(a,{source:w}):null),Re.createElement("pre",null,"Operation `",u,"`",Re.createElement("br",null),Re.createElement("br",null),"Parameters ",function padString(s,o){if("string"!=typeof o)return"";return o.split("\n").map(((o,i)=>i>0?Array(s+1).join(" ")+o:o)).join("\n")}(0,JSON.stringify(_,null,2))||"{}",Re.createElement("br",null)))}}const VP=operation_link_OperationLink,components_servers=({servers:s,currentServer:o,setSelectedServer:i,setServerVariableValue:a,getServerVariable:u,getEffectiveServerValue:_})=>{const w=(s.find((s=>s.get("url")===o))||(0,ze.OrderedMap)()).get("variables")||(0,ze.OrderedMap)(),x=0!==w.size;(0,Re.useEffect)((()=>{o||i(s.first()?.get("url"))}),[]),(0,Re.useEffect)((()=>{const u=s.find((s=>s.get("url")===o));if(!u)return void i(s.first().get("url"));(u.get("variables")||(0,ze.OrderedMap)()).map(((s,i)=>{a({server:o,key:i,val:s.get("default")||""})}))}),[o,s]);const C=(0,Re.useCallback)((s=>{i(s.target.value)}),[i]),j=(0,Re.useCallback)((s=>{const i=s.target.getAttribute("data-variable"),u=s.target.value;a({server:o,key:i,val:u})}),[a,o]);return Re.createElement("div",{className:"servers"},Re.createElement("label",{htmlFor:"servers"},Re.createElement("select",{onChange:C,value:o,id:"servers"},s.valueSeq().map((s=>Re.createElement("option",{value:s.get("url"),key:s.get("url")},s.get("url"),s.get("description")&&` - ${s.get("description")}`))).toArray())),x&&Re.createElement("div",null,Re.createElement("div",{className:"computed-url"},"Computed URL:",Re.createElement("code",null,_(o))),Re.createElement("h4",null,"Server variables"),Re.createElement("table",null,Re.createElement("tbody",null,w.entrySeq().map((([s,i])=>Re.createElement("tr",{key:s},Re.createElement("td",null,s),Re.createElement("td",null,i.get("enum")?Re.createElement("select",{"data-variable":s,onChange:j},i.get("enum").map((i=>Re.createElement("option",{selected:i===u(o,s),key:i,value:i},i)))):Re.createElement("input",{type:"text",value:u(o,s)||"",onChange:j,"data-variable":s})))))))))};class ServersContainer extends Re.Component{render(){const{specSelectors:s,oas3Selectors:o,oas3Actions:i,getComponent:a}=this.props,u=s.servers(),_=a("Servers");return u&&u.size?Re.createElement("div",null,Re.createElement("span",{className:"servers-title"},"Servers"),Re.createElement(_,{servers:u,currentServer:o.selectedServer(),setSelectedServer:i.setSelectedServer,setServerVariableValue:i.setServerVariableValue,getServerVariable:o.serverVariableValue,getEffectiveServerValue:o.serverEffectiveValue})):null}}const zP=Function.prototype;class RequestBodyEditor extends Re.PureComponent{static defaultProps={onChange:zP,userHasEditedBody:!1};constructor(s,o){super(s,o),this.state={value:stringify(s.value)||s.defaultValue},s.onChange(s.value)}applyDefaultValue=s=>{const{onChange:o,defaultValue:i}=s||this.props;return this.setState({value:i}),o(i)};onChange=s=>{this.props.onChange(stringify(s))};onDomChange=s=>{const o=s.target.value;this.setState({value:o},(()=>this.onChange(o)))};UNSAFE_componentWillReceiveProps(s){this.props.value!==s.value&&s.value!==this.state.value&&this.setState({value:stringify(s.value)}),!s.value&&s.defaultValue&&this.state.value&&this.applyDefaultValue(s)}render(){let{getComponent:s,errors:o}=this.props,{value:i}=this.state,a=o.size>0;const u=s("TextArea");return Re.createElement("div",{className:"body-param"},Re.createElement(u,{className:Jn()("body-param__text",{invalid:a}),title:o.size?o.join(", "):"",value:i,onChange:this.onDomChange}))}}class HttpAuth extends Re.Component{constructor(s,o){super(s,o);let{name:i,schema:a}=this.props,u=this.getValue();this.state={name:i,schema:a,value:u}}getValue(){let{name:s,authorized:o}=this.props;return o&&o.getIn([s,"value"])}onChange=s=>{let{onChange:o}=this.props,{value:i,name:a}=s.target,u=Object.assign({},this.state.value);a?u[a]=i:u=i,this.setState({value:u},(()=>o(this.state)))};render(){let{schema:s,getComponent:o,errSelectors:i,name:a,authSelectors:u}=this.props;const _=o("Input"),w=o("Row"),x=o("Col"),C=o("authError"),j=o("Markdown",!0),L=o("JumpToPath",!0),B=(s.get("scheme")||"").toLowerCase(),$=u.selectAuthPath(a);let U=this.getValue(),V=i.allErrors().filter((s=>s.get("authId")===a));if("basic"===B){let o=U?U.get("username"):null;return Re.createElement("div",null,Re.createElement("h4",null,Re.createElement("code",null,a),"  (http, Basic)",Re.createElement(L,{path:$})),o&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(j,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-basic-username"},"Username:"),o?Re.createElement("code",null," ",o," "):Re.createElement(x,null,Re.createElement(_,{id:"auth-basic-username",type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-basic-password"},"Password:"),o?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"auth-basic-password",autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),V.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o}))))}return"bearer"===B?Re.createElement("div",null,Re.createElement("h4",null,Re.createElement("code",null,a),"  (http, Bearer)",Re.createElement(L,{path:$})),U&&Re.createElement("h6",null,"Authorized"),Re.createElement(w,null,Re.createElement(j,{source:s.get("description")})),Re.createElement(w,null,Re.createElement("label",{htmlFor:"auth-bearer-value"},"Value:"),U?Re.createElement("code",null," ****** "):Re.createElement(x,null,Re.createElement(_,{id:"auth-bearer-value",type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),V.valueSeq().map(((s,o)=>Re.createElement(C,{error:s,key:o})))):Re.createElement("div",null,Re.createElement("em",null,Re.createElement("b",null,a)," HTTP authentication: unsupported scheme ",`'${B}'`))}}class operation_servers_OperationServers extends Re.Component{setSelectedServer=s=>{const{path:o,method:i}=this.props;return this.forceUpdate(),this.props.setSelectedServer(s,`${o}:${i}`)};setServerVariableValue=s=>{const{path:o,method:i}=this.props;return this.forceUpdate(),this.props.setServerVariableValue({...s,namespace:`${o}:${i}`})};getSelectedServer=()=>{const{path:s,method:o}=this.props;return this.props.getSelectedServer(`${s}:${o}`)};getServerVariable=(s,o)=>{const{path:i,method:a}=this.props;return this.props.getServerVariable({namespace:`${i}:${a}`,server:s},o)};getEffectiveServerValue=s=>{const{path:o,method:i}=this.props;return this.props.getEffectiveServerValue({server:s,namespace:`${o}:${i}`})};render(){const{operationServers:s,pathServers:o,getComponent:i}=this.props;if(!s&&!o)return null;const a=i("Servers"),u=s||o,_=s?"operation":"path";return Re.createElement("div",{className:"opblock-section operation-servers"},Re.createElement("div",{className:"opblock-section-header"},Re.createElement("div",{className:"tab-header"},Re.createElement("h4",{className:"opblock-title"},"Servers"))),Re.createElement("div",{className:"opblock-description-wrapper"},Re.createElement("h4",{className:"message"},"These ",_,"-level options override the global server options."),Re.createElement(a,{servers:u,currentServer:this.getSelectedServer(),setSelectedServer:this.setSelectedServer,setServerVariableValue:this.setServerVariableValue,getServerVariable:this.getServerVariable,getEffectiveServerValue:this.getEffectiveServerValue})))}}const WP={Callbacks:callbacks,HttpAuth,RequestBody:components_request_body,Servers:components_servers,ServersContainer,RequestBodyEditor,OperationServers:operation_servers_OperationServers,operationLink:VP},JP=new Remarkable("commonmark");JP.block.ruler.enable(["table"]),JP.set({linkTarget:"_blank"});const HP=OAS3ComponentWrapFactory((({source:s,className:o="",getConfigs:i=()=>({useUnsafeMarkdown:!1})})=>{if("string"!=typeof s)return null;if(s){const{useUnsafeMarkdown:a}=i(),u=sanitizer(JP.render(s),{useUnsafeMarkdown:a});let _;return"string"==typeof u&&(_=u.trim()),Re.createElement("div",{dangerouslySetInnerHTML:{__html:_},className:Jn()(o,"renderedMarkdown")})}return null})),KP=OAS3ComponentWrapFactory((({Ori:s,...o})=>{const{schema:i,getComponent:a,errSelectors:u,authorized:_,onAuthChange:w,name:x,authSelectors:C}=o,j=a("HttpAuth");return"http"===i.get("type")?Re.createElement(j,{key:x,schema:i,name:x,errSelectors:u,authorized:_,getComponent:a,onChange:w,authSelectors:C}):Re.createElement(s,o)})),GP=OAS3ComponentWrapFactory(OnlineValidatorBadge);class ModelComponent extends Re.Component{render(){let{getConfigs:s,schema:o,Ori:i}=this.props,a=["model-box"],u=null;return!0===o.get("deprecated")&&(a.push("deprecated"),u=Re.createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),Re.createElement("div",{className:a.join(" ")},u,Re.createElement(i,Mn()({},this.props,{getConfigs:s,depth:1,expandDepth:this.props.expandDepth||0})))}}const YP=OAS3ComponentWrapFactory(ModelComponent),XP=OAS3ComponentWrapFactory((({Ori:s,...o})=>{const{schema:i,getComponent:a,errors:u,onChange:_,fn:w}=o,x=w.isFileUploadIntended(i),C=a("Input");return x?Re.createElement(C,{type:"file",className:u.length?"invalid":"",title:u.length?u:"",onChange:s=>{_(s.target.files[0])},disabled:s.isDisabled}):Re.createElement(s,o)})),QP={Markdown:HP,AuthItem:KP,OpenAPIVersion:function OAS30ComponentWrapFactory(s){return(o,i)=>a=>"function"==typeof i.specSelectors?.isOAS30?i.specSelectors.isOAS30()?Re.createElement(s,Mn()({},a,i,{Ori:o})):Re.createElement(o,a):(console.warn("OAS30 wrapper: couldn't get spec"),null)}((s=>{const{Ori:o}=s;return Re.createElement(o,{oasVersion:"3.0"})})),JsonSchema_string:XP,model:YP,onlineValidatorBadge:GP},ZP="oas3_set_servers",eI="oas3_set_request_body_value",tI="oas3_set_request_body_retain_flag",rI="oas3_set_request_body_inclusion",nI="oas3_set_active_examples_member",sI="oas3_set_request_content_type",oI="oas3_set_response_content_type",iI="oas3_set_server_variable_value",aI="oas3_set_request_body_validate_error",cI="oas3_clear_request_body_validate_error",lI="oas3_clear_request_body_value";function setSelectedServer(s,o){return{type:ZP,payload:{selectedServerUrl:s,namespace:o}}}function setRequestBodyValue({value:s,pathMethod:o}){return{type:eI,payload:{value:s,pathMethod:o}}}const setRetainRequestBodyValueFlag=({value:s,pathMethod:o})=>({type:tI,payload:{value:s,pathMethod:o}});function setRequestBodyInclusion({value:s,pathMethod:o,name:i}){return{type:rI,payload:{value:s,pathMethod:o,name:i}}}function setActiveExamplesMember({name:s,pathMethod:o,contextType:i,contextName:a}){return{type:nI,payload:{name:s,pathMethod:o,contextType:i,contextName:a}}}function setRequestContentType({value:s,pathMethod:o}){return{type:sI,payload:{value:s,pathMethod:o}}}function setResponseContentType({value:s,path:o,method:i}){return{type:oI,payload:{value:s,path:o,method:i}}}function setServerVariableValue({server:s,namespace:o,key:i,val:a}){return{type:iI,payload:{server:s,namespace:o,key:i,val:a}}}const setRequestBodyValidateError=({path:s,method:o,validationErrors:i})=>({type:aI,payload:{path:s,method:o,validationErrors:i}}),clearRequestBodyValidateError=({path:s,method:o})=>({type:cI,payload:{path:s,method:o}}),initRequestBodyValidateError=({pathMethod:s})=>({type:cI,payload:{path:s[0],method:s[1]}}),clearRequestBodyValue=({pathMethod:s})=>({type:lI,payload:{pathMethod:s}});var uI=__webpack_require__(60680),pI=__webpack_require__.n(uI);const oas3_selectors_onlyOAS3=s=>(o,...i)=>a=>{if(a.getSystem().specSelectors.isOAS3()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null};const hI=oas3_selectors_onlyOAS3(((s,o)=>{const i=o?[o,"selectedServer"]:["selectedServer"];return s.getIn(i)||""})),dI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"bodyValue"])||null)),fI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"retainBodyValue"])||!1)),selectDefaultRequestBodyValue=(s,o,i)=>s=>{const{oas3Selectors:a,specSelectors:u,fn:_}=s.getSystem();if(u.isOAS3()){const s=a.requestContentType(o,i);if(s)return getDefaultRequestBodyValue(u.specResolvedSubtree(["paths",o,i,"requestBody"]),s,a.activeExamplesMember(o,i,"requestBody","requestBody"),_)}return null},mI=oas3_selectors_onlyOAS3(((s,o,i)=>s=>{const{oas3Selectors:a,specSelectors:u,fn:_}=s;let w=!1;const x=a.requestContentType(o,i);let C=a.requestBodyValue(o,i);const j=u.specResolvedSubtree(["paths",o,i,"requestBody"]);if(!j)return!1;if(ze.Map.isMap(C)&&(C=stringify(C.mapEntries((s=>ze.Map.isMap(s[1])?[s[0],s[1].get("value")]:s)).toJS())),ze.List.isList(C)&&(C=stringify(C)),x){const s=getDefaultRequestBodyValue(j,x,a.activeExamplesMember(o,i,"requestBody","requestBody"),_);w=!!C&&C!==s}return w})),gI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"bodyInclusion"])||(0,ze.Map)())),yI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"errors"])||null)),vI=oas3_selectors_onlyOAS3(((s,o,i,a,u)=>s.getIn(["examples",o,i,a,u,"activeExample"])||null)),bI=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"requestContentType"])||null)),_I=oas3_selectors_onlyOAS3(((s,o,i)=>s.getIn(["requestData",o,i,"responseContentType"])||null)),SI=oas3_selectors_onlyOAS3(((s,o,i)=>{let a;if("string"!=typeof o){const{server:s,namespace:u}=o;a=u?[u,"serverVariableValues",s,i]:["serverVariableValues",s,i]}else{a=["serverVariableValues",o,i]}return s.getIn(a)||null})),EI=oas3_selectors_onlyOAS3(((s,o)=>{let i;if("string"!=typeof o){const{server:s,namespace:a}=o;i=a?[a,"serverVariableValues",s]:["serverVariableValues",s]}else{i=["serverVariableValues",o]}return s.getIn(i)||(0,ze.OrderedMap)()})),wI=oas3_selectors_onlyOAS3(((s,o)=>{var i,a;if("string"!=typeof o){const{server:u,namespace:_}=o;a=u,i=_?s.getIn([_,"serverVariableValues",a]):s.getIn(["serverVariableValues",a])}else a=o,i=s.getIn(["serverVariableValues",a]);i=i||(0,ze.OrderedMap)();let u=a;return i.map(((s,o)=>{u=u.replace(new RegExp(`{${pI()(o)}}`,"g"),s)})),u})),xI=function validateRequestBodyIsRequired(s){return(...o)=>i=>{const a=i.getSystem().specSelectors.specJson();let u=[...o][1]||[];return!a.getIn(["paths",...u,"requestBody","required"])||s(...o)}}(((s,o)=>((s,o)=>(o=o||[],!!s.getIn(["requestData",...o,"bodyValue"])))(s,o))),validateShallowRequired=(s,{oas3RequiredRequestBodyContentType:o,oas3RequestContentType:i,oas3RequestBodyValue:a})=>{let u=[];if(!ze.Map.isMap(a))return u;let _=[];return Object.keys(o.requestContentType).forEach((s=>{if(s===i){o.requestContentType[s].forEach((s=>{_.indexOf(s)<0&&_.push(s)}))}})),_.forEach((s=>{a.getIn([s,"value"])||u.push(s)})),u},kI=xs()(["get","put","post","delete","options","head","patch","trace"]),OI={[ZP]:(s,{payload:{selectedServerUrl:o,namespace:i}})=>{const a=i?[i,"selectedServer"]:["selectedServer"];return s.setIn(a,o)},[eI]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;if(!ze.Map.isMap(o))return s.setIn(["requestData",a,u,"bodyValue"],o);let _=s.getIn(["requestData",a,u,"bodyValue"])||(0,ze.Map)();ze.Map.isMap(_)||(_=(0,ze.Map)());let w=_;const[...x]=o.keys();return x.forEach((s=>{let i=o.getIn([s]);w.has(s)&&ze.Map.isMap(i)||(w=w.setIn([s,"value"],i))})),s.setIn(["requestData",a,u,"bodyValue"],w)},[tI]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;return s.setIn(["requestData",a,u,"retainBodyValue"],o)},[rI]:(s,{payload:{value:o,pathMethod:i,name:a}})=>{let[u,_]=i;return s.setIn(["requestData",u,_,"bodyInclusion",a],o)},[nI]:(s,{payload:{name:o,pathMethod:i,contextType:a,contextName:u}})=>{let[_,w]=i;return s.setIn(["examples",_,w,a,u,"activeExample"],o)},[sI]:(s,{payload:{value:o,pathMethod:i}})=>{let[a,u]=i;return s.setIn(["requestData",a,u,"requestContentType"],o)},[oI]:(s,{payload:{value:o,path:i,method:a}})=>s.setIn(["requestData",i,a,"responseContentType"],o),[iI]:(s,{payload:{server:o,namespace:i,key:a,val:u}})=>{const _=i?[i,"serverVariableValues",o,a]:["serverVariableValues",o,a];return s.setIn(_,u)},[aI]:(s,{payload:{path:o,method:i,validationErrors:a}})=>{let u=[];if(u.push("Required field is not provided"),a.missingBodyValue)return s.setIn(["requestData",o,i,"errors"],(0,ze.fromJS)(u));if(a.missingRequiredKeys&&a.missingRequiredKeys.length>0){const{missingRequiredKeys:_}=a;return s.updateIn(["requestData",o,i,"bodyValue"],(0,ze.fromJS)({}),(s=>_.reduce(((s,o)=>s.setIn([o,"errors"],(0,ze.fromJS)(u))),s)))}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),s},[cI]:(s,{payload:{path:o,method:i}})=>{const a=s.getIn(["requestData",o,i,"bodyValue"]);if(!ze.Map.isMap(a))return s.setIn(["requestData",o,i,"errors"],(0,ze.fromJS)([]));const[...u]=a.keys();return u?s.updateIn(["requestData",o,i,"bodyValue"],(0,ze.fromJS)({}),(s=>u.reduce(((s,o)=>s.setIn([o,"errors"],(0,ze.fromJS)([]))),s))):s},[lI]:(s,{payload:{pathMethod:o}})=>{let[i,a]=o;const u=s.getIn(["requestData",i,a,"bodyValue"]);return u?ze.Map.isMap(u)?s.setIn(["requestData",i,a,"bodyValue"],(0,ze.Map)()):s.setIn(["requestData",i,a,"bodyValue"],""):s}};function oas3({getSystem:s}){const o=(s=>(o,i=null)=>{const{getConfigs:a,fn:u}=s(),{fileUploadMediaTypes:_}=a();if("string"==typeof i&&_.some((s=>i.startsWith(s))))return!0;const w=ze.Map.isMap(o);if(!w&&!as()(o))return!1;const x=w?o.get("format"):o.format;return u.hasSchemaType(o,"string")&&["binary","byte"].includes(x)})(s);return{components:WP,wrapComponents:QP,statePlugins:{spec:{wrapSelectors:Se,selectors:xe},auth:{wrapSelectors:we},oas3:{actions:{...Pe},reducers:OI,selectors:{...Te}}},fn:{isFileUploadIntended:o,isFileUploadIntendedOAS30:o}}}const webhooks=({specSelectors:s,getComponent:o})=>{const i=s.selectWebhooksOperations(),a=Object.keys(i),u=o("OperationContainer",!0);return 0===a.length?null:Re.createElement("div",{className:"webhooks"},Re.createElement("h2",null,"Webhooks"),a.map((s=>Re.createElement("div",{key:`${s}-webhook`},i[s].map((o=>Re.createElement(u,{key:`${s}-${o.method}-webhook`,op:o.operation,tag:"webhooks",method:o.method,path:s,specPath:(0,ze.List)(o.specPath),allowTryItOut:!1})))))))},oas31_components_license=({getComponent:s,specSelectors:o})=>{const i=o.selectLicenseNameField(),a=o.selectLicenseUrl(),u=s("Link");return Re.createElement("div",{className:"info__license"},a?Re.createElement("div",{className:"info__license__url"},Re.createElement(u,{target:"_blank",href:sanitizeUrl(a)},i)):Re.createElement("span",null,i))},oas31_components_contact=({getComponent:s,specSelectors:o})=>{const i=o.selectContactNameField(),a=o.selectContactUrl(),u=o.selectContactEmailField(),_=s("Link");return Re.createElement("div",{className:"info__contact"},a&&Re.createElement("div",null,Re.createElement(_,{href:sanitizeUrl(a),target:"_blank"},i," - Website")),u&&Re.createElement(_,{href:sanitizeUrl(`mailto:${u}`)},a?`Send email to ${i}`:`Contact ${i}`))},oas31_components_info=({getComponent:s,specSelectors:o})=>{const i=o.version(),a=o.url(),u=o.basePath(),_=o.host(),w=o.selectInfoSummaryField(),x=o.selectInfoDescriptionField(),C=o.selectInfoTitleField(),j=o.selectInfoTermsOfServiceUrl(),L=o.selectExternalDocsUrl(),B=o.selectExternalDocsDescriptionField(),$=o.contact(),U=o.license(),V=s("Markdown",!0),z=s("Link"),Y=s("VersionStamp"),Z=s("OpenAPIVersion"),ee=s("InfoUrl"),ie=s("InfoBasePath"),ae=s("License",!0),ce=s("Contact",!0),le=s("JsonSchemaDialect",!0);return Re.createElement("div",{className:"info"},Re.createElement("hgroup",{className:"main"},Re.createElement("h1",{className:"title"},C,Re.createElement("span",null,i&&Re.createElement(Y,{version:i}),Re.createElement(Z,{oasVersion:"3.1"}))),(_||u)&&Re.createElement(ie,{host:_,basePath:u}),a&&Re.createElement(ee,{getComponent:s,url:a})),w&&Re.createElement("p",{className:"info__summary"},w),Re.createElement("div",{className:"info__description description"},Re.createElement(V,{source:x})),j&&Re.createElement("div",{className:"info__tos"},Re.createElement(z,{target:"_blank",href:sanitizeUrl(j)},"Terms of service")),$.size>0&&Re.createElement(ce,null),U.size>0&&Re.createElement(ae,null),L&&Re.createElement(z,{className:"info__extdocs",target:"_blank",href:sanitizeUrl(L)},B||L),Re.createElement(le,null))},json_schema_dialect=({getComponent:s,specSelectors:o})=>{const i=o.selectJsonSchemaDialectField(),a=o.selectJsonSchemaDialectDefault(),u=s("Link");return Re.createElement(Re.Fragment,null,i&&i===a&&Re.createElement("p",{className:"info__jsonschemadialect"},"JSON Schema dialect:"," ",Re.createElement(u,{target:"_blank",href:sanitizeUrl(i)},i)),i&&i!==a&&Re.createElement("div",{className:"error-wrapper"},Re.createElement("div",{className:"no-margin"},Re.createElement("div",{className:"errors"},Re.createElement("div",{className:"errors-wrapper"},Re.createElement("h4",{className:"center"},"Warning"),Re.createElement("p",{className:"message"},Re.createElement("strong",null,"OpenAPI.jsonSchemaDialect")," field contains a value different from the default value of"," ",Re.createElement(u,{target:"_blank",href:a},a),". Values different from the default one are currently not supported. Please either omit the field or provide it with the default value."))))))},version_pragma_filter=({bypass:s,isSwagger2:o,isOAS3:i,isOAS31:a,alsoShow:u,children:_})=>s?Re.createElement("div",null,_):o&&(i||a)?Re.createElement("div",{className:"version-pragma"},u,Re.createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,Re.createElement("code",null,"swagger")," and ",Re.createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),Re.createElement("p",null,"Supported version fields are ",Re.createElement("code",null,'swagger: "2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",Re.createElement("code",null,"openapi: 3.1.0"),").")))):o||i||a?Re.createElement("div",null,_):Re.createElement("div",{className:"version-pragma"},u,Re.createElement("div",{className:"version-pragma__message version-pragma__message--missing"},Re.createElement("div",null,Re.createElement("h3",null,"Unable to render this definition"),Re.createElement("p",null,"The provided definition does not specify a valid version field."),Re.createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",Re.createElement("code",null,'swagger: "2.0"')," and those that match ",Re.createElement("code",null,"openapi: 3.x.y")," (for example,"," ",Re.createElement("code",null,"openapi: 3.1.0"),").")))),getModelName=s=>"string"==typeof s&&s.includes("#/components/schemas/")?(s=>{const o=s.replace(/~1/g,"/").replace(/~0/g,"~");try{return decodeURIComponent(o)}catch{return o}})(s.replace(/^.*#\/components\/schemas\//,"")):null,AI=(0,Re.forwardRef)((({schema:s,getComponent:o,onToggle:i=()=>{},specPath:a},u)=>{const _=o("JSONSchema202012"),w=getModelName(s.get("$$ref")),x=(0,Re.useCallback)(((s,o)=>{i(w,o)}),[w,i]);return Re.createElement(_,{name:w,schema:s.toJS(),ref:u,onExpand:x,identifier:a.toJS().join("_")})})),CI=AI,models=({specActions:s,specSelectors:o,layoutSelectors:i,layoutActions:a,getComponent:u,getConfigs:_,fn:w})=>{const x=o.selectSchemas(),C=Object.keys(x).length>0,j=["components","schemas"],{docExpansion:L,defaultModelsExpandDepth:B}=_(),$=B>0&&"none"!==L,U=i.isShown(j,$),V=u("Collapse"),z=u("JSONSchema202012"),Y=u("ArrowUpIcon"),Z=u("ArrowDownIcon"),{getTitle:ee}=w.jsonSchema202012.useFn();(0,Re.useEffect)((()=>{const a=Object.entries(x).some((([s])=>i.isShown([...j,s],!1))),u=U&&(B>1||a),_=null!=o.specResolvedSubtree(j);u&&!_&&s.requestResolvedSubtree(j)}),[U,B]);const ie=(0,Re.useCallback)((()=>{a.show(j,!U)}),[U]),ae=(0,Re.useCallback)((s=>{null!==s&&a.readyToScroll(j,s)}),[]),handleJSONSchema202012Ref=s=>o=>{null!==o&&a.readyToScroll([...j,s],o)},handleJSONSchema202012Expand=i=>(u,_)=>{const w=[...j,i];if(_){null!=o.specResolvedSubtree(w)||s.requestResolvedSubtree([...j,i]),a.show(w,!0)}else a.show(w,!1)};return!C||B<0?null:Re.createElement("section",{className:Jn()("models",{"is-open":U}),ref:ae},Re.createElement("h4",null,Re.createElement("button",{"aria-expanded":U,className:"models-control",onClick:ie},Re.createElement("span",null,"Schemas"),U?Re.createElement(Y,null):Re.createElement(Z,null))),Re.createElement(V,{isOpened:U},Object.entries(x).map((([s,o])=>{const i=ee(o,{lookup:"basic"})||s;return Re.createElement(z,{key:s,ref:handleJSONSchema202012Ref(s),schema:o,name:i,onExpand:handleJSONSchema202012Expand(s)})}))))},mutual_tls_auth=({schema:s,getComponent:o,name:i,authSelectors:a})=>{const u=o("JumpToPath",!0),_=a.selectAuthPath(i);return Re.createElement("div",null,Re.createElement("h4",null,i," (mutualTLS) ",Re.createElement(u,{path:_})),Re.createElement("p",null,"Mutual TLS is required by this API/Operation. Certificates are managed via your Operating System and/or your browser."),Re.createElement("p",null,s.get("description")))};class auths_Auths extends Re.Component{constructor(s,o){super(s,o),this.state={}}onAuthChange=s=>{let{name:o}=s;this.setState({[o]:s})};submitAuth=s=>{s.preventDefault();let{authActions:o}=this.props;o.authorizeWithPersistOption(this.state)};logoutClick=s=>{s.preventDefault();let{authActions:o,definitions:i}=this.props,a=i.map(((s,o)=>o)).toArray();this.setState(a.reduce(((s,o)=>(s[o]="",s)),{})),o.logoutWithPersistOption(a)};close=s=>{s.preventDefault();let{authActions:o}=this.props;o.showDefinitions(!1)};render(){let{definitions:s,getComponent:o,authSelectors:i,errSelectors:a}=this.props;const u=o("AuthItem"),_=o("oauth2",!0),w=o("Button"),x=i.authorized(),C=s.filter(((s,o)=>!!x.get(o))),j=s.filter((s=>"oauth2"!==s.get("type")&&"mutualTLS"!==s.get("type"))),L=s.filter((s=>"oauth2"===s.get("type"))),B=s.filter((s=>"mutualTLS"===s.get("type")));return Re.createElement("div",{className:"auth-container"},j.size>0&&Re.createElement("form",{onSubmit:this.submitAuth},j.map(((s,_)=>Re.createElement(u,{key:_,schema:s,name:_,getComponent:o,onAuthChange:this.onAuthChange,authorized:x,errSelectors:a,authSelectors:i}))).toArray(),Re.createElement("div",{className:"auth-btn-wrapper"},j.size===C.size?Re.createElement(w,{className:"btn modal-btn auth",onClick:this.logoutClick,"aria-label":"Remove authorization"},"Logout"):Re.createElement(w,{type:"submit",className:"btn modal-btn auth authorize","aria-label":"Apply credentials"},"Authorize"),Re.createElement(w,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close"))),L.size>0?Re.createElement("div",null,Re.createElement("div",{className:"scope-def"},Re.createElement("p",null,"Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes."),Re.createElement("p",null,"API requires the following scopes. Select which ones you want to grant to Swagger UI.")),s.filter((s=>"oauth2"===s.get("type"))).map(((s,o)=>Re.createElement("div",{key:o},Re.createElement(_,{authorized:x,schema:s,name:o})))).toArray()):null,B.size>0&&Re.createElement("div",null,B.map(((s,_)=>Re.createElement(u,{key:_,schema:s,name:_,getComponent:o,onAuthChange:this.onAuthChange,authorized:x,errSelectors:a,authSelectors:i}))).toArray()))}}const jI=auths_Auths,isOAS31=s=>{const o=s.get("openapi");return"string"==typeof o&&/^3\.1\.(?:[1-9]\d*|0)$/.test(o)},fn_createOnlyOAS31Selector=s=>(o,...i)=>a=>{if(a.getSystem().specSelectors.isOAS31()){const u=s(o,...i);return"function"==typeof u?u(a):u}return null},createOnlyOAS31SelectorWrapper=s=>(o,i)=>(a,...u)=>{if(i.getSystem().specSelectors.isOAS31()){const _=s(a,...u);return"function"==typeof _?_(o,i):_}return o(...u)},fn_createSystemSelector=s=>(o,...i)=>a=>{const u=s(o,a,...i);return"function"==typeof u?u(a):u},createOnlyOAS31ComponentWrapper=s=>(o,i)=>a=>i.specSelectors.isOAS31()?Re.createElement(s,Mn()({},a,{originalComponent:o,getSystem:i.getSystem})):Re.createElement(o,a),wrapOAS31Fn=(s,o)=>{const{fn:i,specSelectors:a}=o;return Object.fromEntries(Object.entries(s).map((([s,o])=>{const u=i[s];return[s,(...s)=>a.isOAS31()?o(...s):"function"==typeof u?u(...s):void 0]})))},PI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31License",!0);return Re.createElement(o,null)})),II=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31Contact",!0);return Re.createElement(o,null)})),TI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const o=s().getComponent("OAS31Info",!0);return Re.createElement(o,null)})),getProperties=(s,{includeReadOnly:o,includeWriteOnly:i})=>{if(!s?.properties)return{};const a=Object.entries(s.properties).filter((([,s])=>(!(!0===s?.readOnly)||o)&&(!(!0===s?.writeOnly)||i)));return Object.fromEntries(a)},makeGetSchemaKeywords=s=>{if("function"!=typeof s)return null;const o=s();return()=>[...o,"discriminator","xml","externalDocs","example","$$ref"]},NI=createOnlyOAS31ComponentWrapper((({getSystem:s,...o})=>{const i=s(),{getComponent:a,fn:u,getConfigs:_}=i,w=_(),x=a("OAS31Model"),C=a("withJSONSchema202012SystemContext");return NI.ModelWithJSONSchemaContext??=C(x,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:w.defaultModelExpandDepth,includeReadOnly:o.includeReadOnly,includeWriteOnly:o.includeWriteOnly},fn:{getProperties:u.jsonSchema202012.getProperties,isExpandable:u.jsonSchema202012.isExpandable,getSchemaKeywords:makeGetSchemaKeywords(u.jsonSchema202012.getSchemaKeywords)}}),Re.createElement(NI.ModelWithJSONSchemaContext,o)})),MI=NI,RI=createOnlyOAS31ComponentWrapper((({getSystem:s})=>{const{getComponent:o,fn:i,getConfigs:a}=s(),u=a();if(RI.ModelsWithJSONSchemaContext)return Re.createElement(RI.ModelsWithJSONSchemaContext,null);const _=o("OAS31Models",!0),w=o("withJSONSchema202012SystemContext");return RI.ModelsWithJSONSchemaContext??=w(_,{config:{default$schema:"https://spec.openapis.org/oas/3.1/dialect/base",defaultExpandedLevels:u.defaultModelsExpandDepth-1,includeReadOnly:!0,includeWriteOnly:!0},fn:{getProperties:i.jsonSchema202012.getProperties,isExpandable:i.jsonSchema202012.isExpandable,getSchemaKeywords:makeGetSchemaKeywords(i.jsonSchema202012.getSchemaKeywords)}}),Re.createElement(RI.ModelsWithJSONSchemaContext,null)}));RI.ModelsWithJSONSchemaContext=null;const DI=RI,wrap_components_version_pragma_filter=(s,o)=>s=>{const i=o.specSelectors.isOAS31(),a=o.getComponent("OAS31VersionPragmaFilter");return Re.createElement(a,Mn()({isOAS31:i},s))},LI=createOnlyOAS31ComponentWrapper((({originalComponent:s,...o})=>{const{getComponent:i,schema:a,name:u}=o,_=i("MutualTLSAuth",!0);return"mutualTLS"===a.get("type")?Re.createElement(_,{schema:a,name:u}):Re.createElement(s,o)})),FI=LI,BI=createOnlyOAS31ComponentWrapper((({getSystem:s,...o})=>{const i=s().getComponent("OAS31Auths",!0);return Re.createElement(i,o)})),$I=(0,ze.Map)(),qI=Ut(((s,o)=>o.specSelectors.specJson()),isOAS31),selectors_webhooks=()=>s=>{const o=s.specSelectors.specJson().get("webhooks");return ze.Map.isMap(o)?o:$I},UI=Ut([(s,o)=>o.specSelectors.webhooks(),(s,o)=>o.specSelectors.validOperationMethods(),(s,o)=>o.specSelectors.specResolvedSubtree(["webhooks"])],((s,o)=>s.reduce(((s,i,a)=>{if(!ze.Map.isMap(i))return s;const u=i.entrySeq().filter((([s])=>o.includes(s))).map((([s,o])=>({operation:(0,ze.Map)({operation:o}),method:s,path:a,specPath:["webhooks",a,s]})));return s.concat(u)}),(0,ze.List)()).groupBy((s=>s.path)).map((s=>s.toArray())).toObject())),selectors_license=()=>s=>{const o=s.specSelectors.info().get("license");return ze.Map.isMap(o)?o:$I},selectLicenseNameField=()=>s=>s.specSelectors.license().get("name","License"),selectLicenseUrlField=()=>s=>s.specSelectors.license().get("url"),VI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectLicenseUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectLicenseIdentifierField=()=>s=>s.specSelectors.license().get("identifier"),selectors_contact=()=>s=>{const o=s.specSelectors.info().get("contact");return ze.Map.isMap(o)?o:$I},selectContactNameField=()=>s=>s.specSelectors.contact().get("name","the developer"),selectContactEmailField=()=>s=>s.specSelectors.contact().get("email"),selectContactUrlField=()=>s=>s.specSelectors.contact().get("url"),zI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectContactUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectInfoTitleField=()=>s=>s.specSelectors.info().get("title"),selectInfoSummaryField=()=>s=>s.specSelectors.info().get("summary"),selectInfoDescriptionField=()=>s=>s.specSelectors.info().get("description"),selectInfoTermsOfServiceField=()=>s=>s.specSelectors.info().get("termsOfService"),WI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectInfoTermsOfServiceField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectExternalDocsDescriptionField=()=>s=>s.specSelectors.externalDocs().get("description"),selectExternalDocsUrlField=()=>s=>s.specSelectors.externalDocs().get("url"),JI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectExternalDocsUrlField()],((s,o,i)=>{if(i)return safeBuildUrl(i,s,{selectedServer:o})})),selectJsonSchemaDialectField=()=>s=>s.specSelectors.specJson().get("jsonSchemaDialect"),selectJsonSchemaDialectDefault=()=>"https://spec.openapis.org/oas/3.1/dialect/base",HI=Ut(((s,o)=>o.specSelectors.definitions()),((s,o)=>o.specSelectors.specResolvedSubtree(["components","schemas"])),((s,o)=>ze.Map.isMap(s)?ze.Map.isMap(o)?Object.entries(s.toJS()).reduce(((s,[i,a])=>{const u=o.get(i);return s[i]=u?.toJS()||a,s}),{}):s.toJS():{})),wrap_selectors_isOAS3=(s,o)=>(i,...a)=>o.specSelectors.isOAS31()||s(...a),KI=createOnlyOAS31SelectorWrapper((()=>(s,o)=>o.oas31Selectors.selectLicenseUrl())),GI=createOnlyOAS31SelectorWrapper((()=>(s,o)=>{const i=o.specSelectors.securityDefinitions();let a=s();return i?(i.entrySeq().forEach((([s,o])=>{const i=o?.get("type");"mutualTLS"===i&&(a=a.push(new ze.Map({[s]:o})))})),a):a})),YI=Ut([(s,o)=>o.specSelectors.url(),(s,o)=>o.oas3Selectors.selectedServer(),(s,o)=>o.specSelectors.selectLicenseUrlField(),(s,o)=>o.specSelectors.selectLicenseIdentifierField()],((s,o,i,a)=>i?safeBuildUrl(i,s,{selectedServer:o}):a?`https://spdx.org/licenses/${a}.html`:void 0)),keywords_Example=({schema:s,getSystem:o})=>{const{fn:i,getComponent:a}=o(),{hasKeyword:u}=i.jsonSchema202012.useFn(),_=a("JSONSchema202012JSONViewer");return u(s,"example")?Re.createElement(_,{name:"Example",value:s.example,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--example"}):null},keywords_Xml=({schema:s,getSystem:o})=>{const i=s?.xml||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,{path:B}=j("xml"),{isExpanded:$,setExpanded:U,setCollapsed:V}=C("xml"),[z,Y]=L(),Z=w?getExtensions(i):[],ee=!!(i.name||i.namespace||i.prefix||Z.length>0),ie=x("Accordion"),ae=x("ExpandDeepButton"),ce=u("OpenAPI31Extensions"),le=u("JSONSchema202012PathContext")(),pe=u("JSONSchema202012LevelContext")(),de=(0,Re.useCallback)((()=>{$?V():U()}),[$,U,V]),fe=(0,Re.useCallback)(((s,o)=>{o?U({deep:!0}):V({deep:!0})}),[U,V]);return 0===Object.keys(i).length?null:Re.createElement(le.Provider,{value:B},Re.createElement(pe.Provider,{value:Y},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--xml","data-json-schema-level":z},ee?Re.createElement(Re.Fragment,null,Re.createElement(ie,{expanded:$,onChange:de},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML")),Re.createElement(ae,{expanded:$,onClick:fe})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"XML"),!0===i.attribute&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"attribute"),!0===i.wrapped&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"wrapped"),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!$})},$&&Re.createElement(Re.Fragment,null,i.name&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"name"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.name))),i.namespace&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"namespace"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.namespace))),i.prefix&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"prefix"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},i.prefix)))),Z.length>0&&Re.createElement(ce,{openAPISpecObj:i,openAPIExtensions:Z,getSystem:o})))))},Discriminator_DiscriminatorMapping=({discriminator:s})=>{const o=s?.mapping||{};return 0===Object.keys(o).length?null:Object.entries(o).map((([s,o])=>Re.createElement("div",{key:`${s}-${o}`,className:"json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},s),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},o))))},keywords_Discriminator_Discriminator=({schema:s,getSystem:o})=>{const i=s?.discriminator||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,B="discriminator",{path:$}=j(B),{isExpanded:U,setExpanded:V,setCollapsed:z}=C(B),[Y,Z]=L(),ee=w?getExtensions(i):[],ie=!!(i.mapping||ee.length>0),ae=x("Accordion"),ce=x("ExpandDeepButton"),le=u("OpenAPI31Extensions"),pe=u("JSONSchema202012PathContext")(),de=u("JSONSchema202012LevelContext")(),fe=(0,Re.useCallback)((()=>{U?z():V()}),[U,V,z]),ye=(0,Re.useCallback)(((s,o)=>{o?V({deep:!0}):z({deep:!0})}),[V,z]);return 0===Object.keys(i).length?null:Re.createElement(pe.Provider,{value:$},Re.createElement(de.Provider,{value:Z},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--discriminator","data-json-schema-level":Y},ie?Re.createElement(Re.Fragment,null,Re.createElement(ae,{expanded:U,onChange:fe},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator")),Re.createElement(ce,{expanded:U,onClick:ye})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"Discriminator"),i.propertyName&&Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},i.propertyName),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!U})},U&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement(Discriminator_DiscriminatorMapping,{discriminator:i})),ee.length>0&&Re.createElement(le,{openAPISpecObj:i,openAPIExtensions:ee,getSystem:o})))))},keywords_OpenAPIExtensions=({openAPISpecObj:s,getSystem:o,openAPIExtensions:i})=>{const{fn:a}=o(),{useComponent:u}=a.jsonSchema202012,_=u("JSONViewer");return i.map((o=>Re.createElement(_,{key:o,name:o,value:s[o],className:"json-schema-2020-12-json-viewer-extension-keyword"})))},keywords_ExternalDocs=({schema:s,getSystem:o})=>{const i=s?.externalDocs||{},{fn:a,getComponent:u,getConfigs:_}=o(),{showExtensions:w}=_(),{useComponent:x,useIsExpanded:C,usePath:j,useLevel:L}=a.jsonSchema202012,B="externalDocs",{path:$}=j(B),{isExpanded:U,setExpanded:V,setCollapsed:z}=C(B),[Y,Z]=L(),ee=w?getExtensions(i):[],ie=!!(i.description||i.url||ee.length>0),ae=x("Accordion"),ce=x("ExpandDeepButton"),le=u("JSONSchema202012KeywordDescription"),pe=u("Link"),de=u("OpenAPI31Extensions"),fe=u("JSONSchema202012PathContext")(),ye=u("JSONSchema202012LevelContext")(),be=(0,Re.useCallback)((()=>{U?z():V()}),[U,V,z]),_e=(0,Re.useCallback)(((s,o)=>{o?V({deep:!0}):z({deep:!0})}),[V,z]);return 0===Object.keys(i).length?null:Re.createElement(fe.Provider,{value:$},Re.createElement(ye.Provider,{value:Z},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--externalDocs","data-json-schema-level":Y},ie?Re.createElement(Re.Fragment,null,Re.createElement(ae,{expanded:U,onChange:be},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation")),Re.createElement(ce,{expanded:U,onClick:_e})):Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"External documentation"),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!U})},U&&Re.createElement(Re.Fragment,null,i.description&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement(le,{schema:i,getSystem:o})),i.url&&Re.createElement("li",{className:"json-schema-2020-12-property"},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"url"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},Re.createElement(pe,{target:"_blank",href:sanitizeUrl(i.url)},i.url))))),ee.length>0&&Re.createElement(de,{openAPISpecObj:i,openAPIExtensions:ee,getSystem:o})))))},keywords_Description=({schema:s,getSystem:o})=>{if(!s?.description)return null;const{getComponent:i}=o(),a=i("Markdown");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},Re.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},Re.createElement(a,{source:s.description})))},XI=createOnlyOAS31ComponentWrapper(keywords_Description),QI=createOnlyOAS31ComponentWrapper((({schema:s,getSystem:o,originalComponent:i})=>{const{getComponent:a}=o(),u=a("JSONSchema202012KeywordDiscriminator"),_=a("JSONSchema202012KeywordXml"),w=a("JSONSchema202012KeywordExample"),x=a("JSONSchema202012KeywordExternalDocs");return Re.createElement(Re.Fragment,null,Re.createElement(i,{schema:s}),Re.createElement(u,{schema:s,getSystem:o}),Re.createElement(_,{schema:s,getSystem:o}),Re.createElement(x,{schema:s,getSystem:o}),Re.createElement(w,{schema:s,getSystem:o}))})),ZI=QI,keywords_Properties=({schema:s,getSystem:o})=>{const{fn:i,getComponent:a}=o(),{useComponent:u,usePath:_}=i.jsonSchema202012,{getDependentRequired:w,getProperties:x}=i.jsonSchema202012.useFn(),C=i.jsonSchema202012.useConfig(),j=Array.isArray(s?.required)?s.required:[],{path:L}=_("properties"),B=u("JSONSchema"),$=a("JSONSchema202012PathContext")(),U=x(s,C);return 0===Object.keys(U).length?null:Re.createElement($.Provider,{value:L},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},Re.createElement("ul",null,Object.entries(U).map((([o,i])=>{const a=j.includes(o),u=w(o,s);return Re.createElement("li",{key:o,className:Jn()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":a})},Re.createElement(B,{name:o,schema:i,dependentRequired:u}))})))))},eT=createOnlyOAS31ComponentWrapper(keywords_Properties);const tT=function oas31_after_load_afterLoad({fn:s,getSystem:o}){if(s.jsonSchema202012){const i=((s,o)=>{const{fn:i}=o();if("function"!=typeof s)return null;const{hasKeyword:a}=i.jsonSchema202012;return o=>s(o)||a(o,"example")||o?.xml||o?.discriminator||o?.externalDocs})(s.jsonSchema202012.isExpandable,o);Object.assign(this.fn.jsonSchema202012,{isExpandable:i,getProperties})}if("function"==typeof s.sampleFromSchema&&s.jsonSchema202012){const i=wrapOAS31Fn({sampleFromSchema:s.jsonSchema202012.sampleFromSchema,sampleFromSchemaGeneric:s.jsonSchema202012.sampleFromSchemaGeneric,createXMLExample:s.jsonSchema202012.createXMLExample,memoizedSampleFromSchema:s.jsonSchema202012.memoizedSampleFromSchema,memoizedCreateXMLExample:s.jsonSchema202012.memoizedCreateXMLExample,getJsonSampleSchema:s.jsonSchema202012.getJsonSampleSchema,getYamlSampleSchema:s.jsonSchema202012.getYamlSampleSchema,getXmlSampleSchema:s.jsonSchema202012.getXmlSampleSchema,getSampleSchema:s.jsonSchema202012.getSampleSchema,mergeJsonSchema:s.jsonSchema202012.mergeJsonSchema,getSchemaObjectTypeLabel:o=>s.jsonSchema202012.getType(immutableToJS(o)),getSchemaObjectType:o=>s.jsonSchema202012.foldType(immutableToJS(o)?.type)},o());Object.assign(this.fn,i)}const i=(s=>(o,i=null)=>{const{fn:a}=s();if(a.isFileUploadIntendedOAS30(o,i))return!0;const u=ze.Map.isMap(o);if(!u&&!as()(o))return!1;const _=u?o.get("contentMediaType"):o.contentMediaType,w=u?o.get("contentEncoding"):o.contentEncoding;return"string"==typeof _&&""!==_||"string"==typeof w&&""!==w})(o),{isFileUploadIntended:a}=wrapOAS31Fn({isFileUploadIntended:i},o());if(this.fn.isFileUploadIntended=a,this.fn.isFileUploadIntendedOAS31=i,s.jsonSchema202012){const{hasSchemaType:i}=wrapOAS31Fn({hasSchemaType:s.jsonSchema202012.hasSchemaType},o());this.fn.hasSchemaType=i}},oas31=({fn:s})=>{const o=s.createSystemSelector||fn_createSystemSelector,i=s.createOnlyOAS31Selector||fn_createOnlyOAS31Selector;return{afterLoad:tT,fn:{isOAS31,createSystemSelector:fn_createSystemSelector,createOnlyOAS31Selector:fn_createOnlyOAS31Selector},components:{Webhooks:webhooks,JsonSchemaDialect:json_schema_dialect,MutualTLSAuth:mutual_tls_auth,OAS31Info:oas31_components_info,OAS31License:oas31_components_license,OAS31Contact:oas31_components_contact,OAS31VersionPragmaFilter:version_pragma_filter,OAS31Model:CI,OAS31Models:models,OAS31Auths:jI,JSONSchema202012KeywordExample:keywords_Example,JSONSchema202012KeywordXml:keywords_Xml,JSONSchema202012KeywordDiscriminator:keywords_Discriminator_Discriminator,JSONSchema202012KeywordExternalDocs:keywords_ExternalDocs,OpenAPI31Extensions:keywords_OpenAPIExtensions},wrapComponents:{InfoContainer:TI,License:PI,Contact:II,VersionPragmaFilter:wrap_components_version_pragma_filter,Model:MI,Models:DI,AuthItem:FI,auths:BI,JSONSchema202012KeywordDescription:XI,JSONSchema202012KeywordExamples:ZI,JSONSchema202012KeywordProperties:eT},statePlugins:{auth:{wrapSelectors:{definitionsToAuthorize:GI}},spec:{selectors:{isOAS31:o(qI),license:selectors_license,selectLicenseNameField,selectLicenseUrlField,selectLicenseIdentifierField:i(selectLicenseIdentifierField),selectLicenseUrl:o(VI),contact:selectors_contact,selectContactNameField,selectContactEmailField,selectContactUrlField,selectContactUrl:o(zI),selectInfoTitleField,selectInfoSummaryField:i(selectInfoSummaryField),selectInfoDescriptionField,selectInfoTermsOfServiceField,selectInfoTermsOfServiceUrl:o(WI),selectExternalDocsDescriptionField,selectExternalDocsUrlField,selectExternalDocsUrl:o(JI),webhooks:i(selectors_webhooks),selectWebhooksOperations:i(o(UI)),selectJsonSchemaDialectField,selectJsonSchemaDialectDefault,selectSchemas:o(HI)},wrapSelectors:{isOAS3:wrap_selectors_isOAS3,selectLicenseUrl:KI}},oas31:{selectors:{selectLicenseUrl:i(o(YI))}}}}},rT=es().object,nT=es().bool,sT=(es().oneOfType([rT,nT]),(0,Re.createContext)(null));sT.displayName="JSONSchemaContext";const oT=(0,Re.createContext)(0);oT.displayName="JSONSchemaLevelContext";const iT=(0,Re.createContext)(new Set),aT=(0,Re.createContext)([]);class JSONSchemaIsExpandedState{static Collapsed="collapsed";static Expanded="expanded";static DeeplyExpanded="deeply-expanded"}const useConfig=()=>{const{config:s}=(0,Re.useContext)(sT);return s},useComponent=s=>{const{components:o}=(0,Re.useContext)(sT);return o[s]||null},useFn=(s=void 0)=>{const{fn:o}=(0,Re.useContext)(sT);return void 0!==s?o[s]:o},useJSONSchemaContextState=()=>{const[,s]=(0,Re.useState)(null),{state:o}=(0,Re.useContext)(sT);return{state:o,setState:i=>{i(o),s({})}}},useLevel=()=>{const s=(0,Re.useContext)(oT);return[s,s+1]},usePath=s=>{const o=(0,Re.useContext)(aT),{setState:i}=useJSONSchemaContextState(),a="string"==typeof s?[...o,s]:o;return{path:a,pathMutator:(s,o={deep:!1})=>{const u=a.toString(),updateFn=o=>{o.paths[u]=s,s===JSONSchemaIsExpandedState.Collapsed&&Object.keys(o.paths).forEach((s=>{s.startsWith(u)&&o.paths[s]===JSONSchemaIsExpandedState.DeeplyExpanded&&(o.paths[s]=JSONSchemaIsExpandedState.Expanded)}))},updateDeepFn=o=>{Object.keys(o.paths).forEach((i=>{i.startsWith(u)&&(o.paths[i]=s)}))};o.deep?i(updateDeepFn):i(updateFn)}}},useIsExpanded=s=>{const[o]=useLevel(),{defaultExpandedLevels:i}=useConfig(),{path:a,pathMutator:u}=usePath(s),{path:_}=usePath(),{state:w}=useJSONSchemaContextState(),x=w.paths[a.toString()],C=w.paths[_.toString()]??w.paths[_.slice(0,-1).toString()],j=x??(i-o>0?JSONSchemaIsExpandedState.Expanded:JSONSchemaIsExpandedState.Collapsed),L=j!==JSONSchemaIsExpandedState.Collapsed;(0,Re.useEffect)((()=>{u(C===JSONSchemaIsExpandedState.DeeplyExpanded?JSONSchemaIsExpandedState.DeeplyExpanded:j)}),[C]);return{isExpanded:L,setExpanded:(0,Re.useCallback)(((s={deep:!1})=>{u(s.deep?JSONSchemaIsExpandedState.DeeplyExpanded:JSONSchemaIsExpandedState.Expanded)}),[]),setCollapsed:(0,Re.useCallback)(((s={deep:!1})=>{u(JSONSchemaIsExpandedState.Collapsed,s)}),[])}},useRenderedSchemas=(s=void 0)=>{if(void 0===s)return(0,Re.useContext)(iT);const o=(0,Re.useContext)(iT);return new Set([...o,s])},cT=(0,Re.forwardRef)((({schema:s,name:o="",dependentRequired:i=[],onExpand:a=()=>{},identifier:u=""},_)=>{const w=useFn(),x=u||s?.$id||o,{path:C}=usePath(x),{isExpanded:j,setExpanded:L,setCollapsed:B}=useIsExpanded(x),[$,U]=useLevel(),V=(()=>{const[s]=useLevel();return s>0})(),z=w.isExpandable(s)||i.length>0,Y=(s=>useRenderedSchemas().has(s))(s),Z=useRenderedSchemas(s),ee=w.stringifyConstraints(s),ie=useComponent("Accordion"),ae=useComponent("Keyword$schema"),ce=useComponent("Keyword$vocabulary"),le=useComponent("Keyword$id"),pe=useComponent("Keyword$anchor"),de=useComponent("Keyword$dynamicAnchor"),fe=useComponent("Keyword$ref"),ye=useComponent("Keyword$dynamicRef"),be=useComponent("Keyword$defs"),_e=useComponent("Keyword$comment"),Se=useComponent("KeywordAllOf"),we=useComponent("KeywordAnyOf"),xe=useComponent("KeywordOneOf"),Pe=useComponent("KeywordNot"),Te=useComponent("KeywordIf"),$e=useComponent("KeywordThen"),qe=useComponent("KeywordElse"),ze=useComponent("KeywordDependentSchemas"),We=useComponent("KeywordPrefixItems"),He=useComponent("KeywordItems"),Ye=useComponent("KeywordContains"),Xe=useComponent("KeywordProperties"),Qe=useComponent("KeywordPatternProperties"),et=useComponent("KeywordAdditionalProperties"),tt=useComponent("KeywordPropertyNames"),rt=useComponent("KeywordUnevaluatedItems"),nt=useComponent("KeywordUnevaluatedProperties"),st=useComponent("KeywordType"),ot=useComponent("KeywordEnum"),it=useComponent("KeywordConst"),at=useComponent("KeywordConstraint"),ct=useComponent("KeywordDependentRequired"),lt=useComponent("KeywordContentSchema"),ut=useComponent("KeywordTitle"),pt=useComponent("KeywordDescription"),ht=useComponent("KeywordDefault"),dt=useComponent("KeywordDeprecated"),mt=useComponent("KeywordReadOnly"),gt=useComponent("KeywordWriteOnly"),yt=useComponent("KeywordExamples"),vt=useComponent("ExtensionKeywords"),bt=useComponent("ExpandDeepButton"),_t=(0,Re.useCallback)(((s,o)=>{o?L():B(),a(s,o,!1)}),[a,L,B]),St=(0,Re.useCallback)(((s,o)=>{o?L({deep:!0}):B({deep:!0}),a(s,o,!0)}),[a,L,B]);return Re.createElement(aT.Provider,{value:C},Re.createElement(oT.Provider,{value:U},Re.createElement(iT.Provider,{value:Z},Re.createElement("article",{ref:_,"data-json-schema-level":$,className:Jn()("json-schema-2020-12",{"json-schema-2020-12--embedded":V,"json-schema-2020-12--circular":Y})},Re.createElement("div",{className:"json-schema-2020-12-head"},z&&!Y?Re.createElement(Re.Fragment,null,Re.createElement(ie,{expanded:j,onChange:_t},Re.createElement(ut,{title:o,schema:s})),Re.createElement(bt,{expanded:j,onClick:St})):Re.createElement(ut,{title:o,schema:s}),Re.createElement(dt,{schema:s}),Re.createElement(mt,{schema:s}),Re.createElement(gt,{schema:s}),Re.createElement(st,{schema:s,isCircular:Y}),ee.length>0&&ee.map((s=>Re.createElement(at,{key:`${s.scope}-${s.value}`,constraint:s})))),Re.createElement("div",{className:Jn()("json-schema-2020-12-body",{"json-schema-2020-12-body--collapsed":!j})},j&&Re.createElement(Re.Fragment,null,Re.createElement(pt,{schema:s}),!Y&&z&&Re.createElement(Re.Fragment,null,Re.createElement(Xe,{schema:s}),Re.createElement(Qe,{schema:s}),Re.createElement(et,{schema:s}),Re.createElement(nt,{schema:s}),Re.createElement(tt,{schema:s}),Re.createElement(Se,{schema:s}),Re.createElement(we,{schema:s}),Re.createElement(xe,{schema:s}),Re.createElement(Pe,{schema:s}),Re.createElement(Te,{schema:s}),Re.createElement($e,{schema:s}),Re.createElement(qe,{schema:s}),Re.createElement(ze,{schema:s}),Re.createElement(We,{schema:s}),Re.createElement(He,{schema:s}),Re.createElement(rt,{schema:s}),Re.createElement(Ye,{schema:s}),Re.createElement(lt,{schema:s})),Re.createElement(ot,{schema:s}),Re.createElement(it,{schema:s}),Re.createElement(ct,{schema:s,dependentRequired:i}),Re.createElement(ht,{schema:s}),Re.createElement(yt,{schema:s}),Re.createElement(ae,{schema:s}),Re.createElement(ce,{schema:s}),Re.createElement(le,{schema:s}),Re.createElement(pe,{schema:s}),Re.createElement(de,{schema:s}),Re.createElement(fe,{schema:s}),!Y&&z&&Re.createElement(be,{schema:s}),Re.createElement(ye,{schema:s}),Re.createElement(_e,{schema:s}),Re.createElement(vt,{schema:s})))))))})),lT=cT,keywords_$schema=({schema:s})=>s?.$schema?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$schema"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$schema"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$schema)):null,$vocabulary_$vocabulary=({schema:s})=>{const o="$vocabulary",{path:i}=usePath(o),{isExpanded:a,setExpanded:u,setCollapsed:_}=useIsExpanded(o),w=useComponent("Accordion"),x=(0,Re.useCallback)((()=>{a?_():u()}),[a,u,_]);return s?.$vocabulary?"object"!=typeof s.$vocabulary?null:Re.createElement(aT.Provider,{value:i},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$vocabulary"},Re.createElement(w,{expanded:a,onChange:x},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$vocabulary")),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",null,a&&Object.entries(s.$vocabulary).map((([s,o])=>Re.createElement("li",{key:s,className:Jn()("json-schema-2020-12-$vocabulary-uri",{"json-schema-2020-12-$vocabulary-uri--disabled":!o})},Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s))))))):null},keywords_$id=({schema:s})=>s?.$id?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$id"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$id"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$id)):null,keywords_$anchor=({schema:s})=>s?.$anchor?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$anchor"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$anchor"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$anchor)):null,keywords_$dynamicAnchor=({schema:s})=>s?.$dynamicAnchor?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicAnchor"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicAnchor"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicAnchor)):null,keywords_$ref=({schema:s})=>s?.$ref?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$ref"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$ref"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$ref)):null,keywords_$dynamicRef=({schema:s})=>s?.$dynamicRef?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicRef"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$dynamicRef"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$dynamicRef)):null,keywords_$defs=({schema:s})=>{const o=s?.$defs||{},i="$defs",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONSchema"),$=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),U=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return 0===Object.keys(o).length?null:Re.createElement(aT.Provider,{value:a},Re.createElement(oT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$defs","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:$},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$defs")),Re.createElement(L,{expanded:u,onClick:U}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(B,{name:s,schema:o})))))))))},keywords_$comment=({schema:s})=>s?.$comment?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--$comment"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary"},"$comment"),Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary"},s.$comment)):null,keywords_AllOf=({schema:s})=>{const o=s?.allOf||[],i=useFn(),a="allOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(aT.Provider,{value:u},Re.createElement(oT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--allOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"All of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{allOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_AnyOf=({schema:s})=>{const o=s?.anyOf||[],i=useFn(),a="anyOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(aT.Provider,{value:u},Re.createElement(oT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--anyOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Any of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{anyOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_OneOf=({schema:s})=>{const o=s?.oneOf||[],i=useFn(),a="oneOf",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(aT.Provider,{value:u},Re.createElement(oT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--oneOf","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"One of")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{oneOf:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_Not=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"not"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Not");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--not"},Re.createElement(i,{name:a,schema:s.not,identifier:"not"}))},keywords_If=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"if"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"If");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},Re.createElement(i,{name:a,schema:s.if,identifier:"if"}))},keywords_Then=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"then"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Then");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--then"},Re.createElement(i,{name:a,schema:s.then,identifier:"then"}))},keywords_Else=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"else"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Else");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--if"},Re.createElement(i,{name:a,schema:s.else,identifier:"else"}))},keywords_DependentSchemas=({schema:s})=>{const o=s?.dependentSchemas||[],i="dependentSchemas",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONSchema"),$=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),U=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return"object"!=typeof o||0===Object.keys(o).length?null:Re.createElement(aT.Provider,{value:a},Re.createElement(oT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentSchemas","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:$},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Dependent schemas")),Re.createElement(L,{expanded:u,onClick:U}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(B,{name:s,schema:o})))))))))},keywords_PrefixItems=({schema:s})=>{const o=s?.prefixItems||[],i=useFn(),a="prefixItems",{path:u}=usePath(a),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(a),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$=useComponent("JSONSchema"),U=useComponent("KeywordType"),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return Array.isArray(o)&&0!==o.length?Re.createElement(aT.Provider,{value:u},Re.createElement(oT.Provider,{value:j},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--prefixItems","data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Prefix items")),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement(U,{schema:{prefixItems:o}}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement($,{name:`#${o} ${i.getTitle(s)}`,schema:s}))))))))):null},keywords_Items=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"items"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Items");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--items"},Re.createElement(i,{name:a,schema:s.items,identifier:"items"}))},keywords_Contains=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"contains"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Contains");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contains"},Re.createElement(i,{name:a,schema:s.contains,identifier:"contains"}))},keywords_Properties_Properties=({schema:s})=>{const o=useFn(),i=s?.properties||{},a=Array.isArray(s?.required)?s.required:[],u=useComponent("JSONSchema"),{path:_}=usePath("properties");return 0===Object.keys(i).length?null:Re.createElement(aT.Provider,{value:_},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--properties"},Re.createElement("ul",null,Object.entries(i).map((([i,_])=>{const w=a.includes(i),x=o.getDependentRequired(i,s);return Re.createElement("li",{key:i,className:Jn()("json-schema-2020-12-property",{"json-schema-2020-12-property--required":w})},Re.createElement(u,{name:i,schema:_,dependentRequired:x}))})))))},PatternProperties_PatternProperties=({schema:s})=>{const o=s?.patternProperties||{},i=useComponent("JSONSchema"),{path:a}=usePath("patternProperties");return 0===Object.keys(o).length?null:Re.createElement(aT.Provider,{value:a},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--patternProperties"},Re.createElement("ul",null,Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(i,{name:s,schema:o})))))))},keywords_AdditionalProperties=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"additionalProperties"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Additional properties");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--additionalProperties"},!0===s.additionalProperties?Re.createElement(Re.Fragment,null,a,Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"allowed")):!1===s.additionalProperties?Re.createElement(Re.Fragment,null,a,Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},"forbidden")):Re.createElement(i,{name:a,schema:s.additionalProperties,identifier:"additionalProperties"}))},keywords_PropertyNames=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema"),a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Property names");return o.hasKeyword(s,"propertyNames")?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--propertyNames"},Re.createElement(i,{name:a,schema:s.propertyNames,identifier:"propertyNames"})):null},keywords_UnevaluatedItems=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"unevaluatedItems"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated items");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedItems"},Re.createElement(i,{name:a,schema:s.unevaluatedItems,identifier:"unevaluatedItems"}))},keywords_UnevaluatedProperties=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"unevaluatedProperties"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Unevaluated properties");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedProperties"},Re.createElement(i,{name:a,schema:s.unevaluatedProperties,identifier:"unevaluatedProperties"}))},keywords_Type=({schema:s,isCircular:o=!1})=>{const i=useFn().getType(s),a=o?" [circular]":"";return Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},`${i}${a}`)},Enum_Enum=({schema:s})=>{const o=useComponent("JSONViewer");return Array.isArray(s?.enum)?Re.createElement(o,{name:"Enum",value:s.enum,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--enum"}):null},Const_Const=({schema:s})=>{const o=useFn(),i=useComponent("JSONViewer");return o.hasKeyword(s,"const")?Re.createElement(i,{name:"Const",value:s.const,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--const"}):null},fn_upperFirst=s=>"string"==typeof s?`${s.charAt(0).toUpperCase()}${s.slice(1)}`:s,makeGetTitle=s=>(o,{lookup:i="extended"}={})=>{const a=s();if(null!=o?.title)return a.upperFirst(String(o.title));if("extended"===i){if(null!=o?.$anchor)return a.upperFirst(String(o.$anchor));if(null!=o?.$id)return String(o.$id)}return""},makeGetType=s=>{const getType=(o,i=new WeakSet)=>{const a=s();if(null==o)return"any";if(a.isBooleanJSONSchema(o))return o?"any":"never";if("object"!=typeof o)return"any";if(i.has(o))return"any";i.add(o);const{type:u,prefixItems:_,items:w}=o,getArrayType=()=>{if(Array.isArray(_)){const s=_.map((s=>getType(s,i))),o=w?getType(w,i):"any";return`array<[${s.join(", ")}], ${o}>`}if(w){return`array<${getType(w,i)}>`}return"array"};if(o.not&&"any"===getType(o.not))return"never";const handleCombiningKeywords=(s,a)=>{if(Array.isArray(o[s])){return`(${o[s].map((s=>getType(s,i))).join(a)})`}return null},x=[Array.isArray(u)?u.map((s=>"array"===s?getArrayType():s)).join(" | "):"array"===u?getArrayType():["null","boolean","object","array","number","integer","string"].includes(u)?u:(()=>{if(Object.hasOwn(o,"prefixItems")||Object.hasOwn(o,"items")||Object.hasOwn(o,"contains"))return getArrayType();if(Object.hasOwn(o,"properties")||Object.hasOwn(o,"additionalProperties")||Object.hasOwn(o,"patternProperties"))return"object";if(["int32","int64"].includes(o.format))return"integer";if(["float","double"].includes(o.format))return"number";if(Object.hasOwn(o,"minimum")||Object.hasOwn(o,"maximum")||Object.hasOwn(o,"exclusiveMinimum")||Object.hasOwn(o,"exclusiveMaximum")||Object.hasOwn(o,"multipleOf"))return"number | integer";if(Object.hasOwn(o,"pattern")||Object.hasOwn(o,"format")||Object.hasOwn(o,"minLength")||Object.hasOwn(o,"maxLength")||Object.hasOwn(o,"contentEncoding")||Object.hasOwn(o,"contentMediaType"))return"string";if(void 0!==o.const){if(null===o.const)return"null";if("boolean"==typeof o.const)return"boolean";if("number"==typeof o.const)return Number.isInteger(o.const)?"integer":"number";if("string"==typeof o.const)return"string";if(Array.isArray(o.const))return"array";if("object"==typeof o.const)return"object"}return null})(),handleCombiningKeywords("oneOf"," | "),handleCombiningKeywords("anyOf"," | "),handleCombiningKeywords("allOf"," & ")].filter(Boolean).join(" | ");return i.delete(o),x||"any"};return getType},isBooleanJSONSchema=s=>"boolean"==typeof s,hasKeyword=(s,o)=>null!==s&&"object"==typeof s&&Object.hasOwn(s,o),fn_makeIsExpandable=s=>o=>{const i=s();return o?.$schema||o?.$vocabulary||o?.$id||o?.$anchor||o?.$dynamicAnchor||o?.$ref||o?.$dynamicRef||o?.$defs||o?.$comment||o?.allOf||o?.anyOf||o?.oneOf||i.hasKeyword(o,"not")||i.hasKeyword(o,"if")||i.hasKeyword(o,"then")||i.hasKeyword(o,"else")||o?.dependentSchemas||o?.prefixItems||i.hasKeyword(o,"items")||i.hasKeyword(o,"contains")||o?.properties||o?.patternProperties||i.hasKeyword(o,"additionalProperties")||i.hasKeyword(o,"propertyNames")||i.hasKeyword(o,"unevaluatedItems")||i.hasKeyword(o,"unevaluatedProperties")||o?.description||o?.enum||i.hasKeyword(o,"const")||i.hasKeyword(o,"contentSchema")||i.hasKeyword(o,"default")||o?.examples||i.getExtensionKeywords(o).length>0},fn_stringify=s=>null===s||["number","bigint","boolean"].includes(typeof s)?String(s):Array.isArray(s)?`[${s.map(fn_stringify).join(", ")}]`:JSON.stringify(s),stringifyConstraintRange=(s,o,i)=>{const a="number"==typeof o,u="number"==typeof i;return a&&u?o===i?`${o} ${s}`:`[${o}, ${i}] ${s}`:a?`≥ ${o} ${s}`:u?`≤ ${i} ${s}`:null},stringifyConstraints=s=>{const o=[],i=(s=>{if("number"!=typeof s?.multipleOf)return null;if(s.multipleOf<=0)return null;if(1===s.multipleOf)return null;const{multipleOf:o}=s;if(Number.isInteger(o))return`multiple of ${o}`;const i=10**o.toString().split(".")[1].length;return`multiple of ${o*i}/${i}`})(s);null!==i&&o.push({scope:"number",value:i});const a=(s=>{const o=s?.minimum,i=s?.maximum,a=s?.exclusiveMinimum,u=s?.exclusiveMaximum,_="number"==typeof o,w="number"==typeof i,x="number"==typeof a,C="number"==typeof u,j=x&&(!_||ou);if((_||x)&&(w||C))return`${j?"(":"["}${j?a:o}, ${L?u:i}${L?")":"]"}`;if(_||x)return`${j?">":"≥"} ${j?a:o}`;if(w||C)return`${L?"<":"≤"} ${L?u:i}`;return null})(s);null!==a&&o.push({scope:"number",value:a}),s?.format&&o.push({scope:"string",value:s.format});const u=stringifyConstraintRange("characters",s?.minLength,s?.maxLength);null!==u&&o.push({scope:"string",value:u}),s?.pattern&&o.push({scope:"string",value:`matches ${s?.pattern}`}),s?.contentMediaType&&o.push({scope:"string",value:`media type: ${s.contentMediaType}`}),s?.contentEncoding&&o.push({scope:"string",value:`encoding: ${s.contentEncoding}`});const _=stringifyConstraintRange(s?.uniqueItems?"unique items":"items",s?.minItems,s?.maxItems);null!==_&&o.push({scope:"array",value:_}),s?.uniqueItems&&!_&&o.push({scope:"array",value:"unique"});const w=stringifyConstraintRange("contained items",s?.minContains,s?.maxContains);null!==w&&o.push({scope:"array",value:w});const x=stringifyConstraintRange("properties",s?.minProperties,s?.maxProperties);return null!==x&&o.push({scope:"object",value:x}),o},getDependentRequired=(s,o)=>o?.dependentRequired?Array.from(Object.entries(o.dependentRequired).reduce(((o,[i,a])=>Array.isArray(a)&&a.includes(s)?(o.add(i),o):o),new Set)):[],fn_isPlainObject=s=>"object"==typeof s&&null!==s&&!Array.isArray(s)&&(null===Object.getPrototypeOf(s)||Object.getPrototypeOf(s)===Object.prototype),getSchemaKeywords=()=>["$schema","$vocabulary","$id","$anchor","$dynamicAnchor","$dynamicRef","$ref","$defs","$comment","allOf","anyOf","oneOf","not","if","then","else","dependentSchemas","prefixItems","items","contains","properties","patternProperties","additionalProperties","propertyNames","unevaluatedItems","unevaluatedProperties","type","enum","const","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","maxContains","minContains","maxProperties","minProperties","required","dependentRequired","title","description","default","deprecated","readOnly","writeOnly","examples","format","contentEncoding","contentMediaType","contentSchema"],makeGetExtensionKeywords=s=>o=>{const i=s().getSchemaKeywords();return fn_isPlainObject(o)?((s,o)=>{const i=new Set(o);return s.filter((s=>!i.has(s)))})(Object.keys(o),i):[]},fn_hasSchemaType=(s,o)=>{const i=ze.Map.isMap(s);if(!i&&!fn_isPlainObject(s))return!1;const hasType=s=>o===s||Array.isArray(o)&&o.includes(s),a=i?s.get("type"):s.type;return ze.List.isList(a)||Array.isArray(a)?a.some((s=>hasType(s))):hasType(a)},Constraint=({constraint:s})=>fn_isPlainObject(s)&&"string"==typeof s.scope&&"string"==typeof s.value?Re.createElement("span",{className:`json-schema-2020-12__constraint json-schema-2020-12__constraint--${s.scope}`},s.value):null,uT=Re.memo(Constraint),DependentRequired_DependentRequired=({dependentRequired:s})=>Array.isArray(s)&&0!==s.length?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentRequired"},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Required when defined"),Re.createElement("ul",null,s.map((s=>Re.createElement("li",{key:s},Re.createElement("span",{className:"json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--warning"},s)))))):null,keywords_ContentSchema=({schema:s})=>{const o=useFn(),i=useComponent("JSONSchema");if(!o.hasKeyword(s,"contentSchema"))return null;const a=Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary"},"Content schema");return Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--contentSchema"},Re.createElement(i,{name:a,schema:s.contentSchema,identifier:"contentSchema"}))},Title_Title=({title:s="",schema:o})=>{const i=useFn(),a=s||i.getTitle(o);return a?Re.createElement("div",{className:"json-schema-2020-12__title"},a):null},keywords_Description_Description=({schema:s})=>s?.description?Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--description"},Re.createElement("div",{className:"json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary"},s.description)):null,Default_Default=({schema:s})=>{const o=useFn(),i=useComponent("JSONViewer");return o.hasKeyword(s,"default")?Re.createElement(i,{name:"Default",value:s.default,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--default"}):null},keywords_Deprecated=({schema:s})=>!0!==s?.deprecated?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--warning"},"deprecated"),keywords_ReadOnly=({schema:s})=>!0!==s?.readOnly?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"read-only"),keywords_WriteOnly=({schema:s})=>!0!==s?.writeOnly?null:Re.createElement("span",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--muted"},"write-only"),keywords_Examples_Examples=({schema:s})=>{const o=s?.examples||[],i=useComponent("JSONViewer");return Array.isArray(o)&&0!==o.length?Re.createElement(i,{name:"Examples",value:s.examples,className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--examples"}):null},ExtensionKeywords_ExtensionKeywords=({schema:s})=>{const o=useFn(),i="ExtensionKeywords",{path:a}=usePath(i),{isExpanded:u,setExpanded:_,setCollapsed:w}=useIsExpanded(i),[x,C]=useLevel(),j=useComponent("Accordion"),L=useComponent("ExpandDeepButton"),B=useComponent("JSONViewer"),{showExtensionKeywords:$}=useConfig(),U=o.getExtensionKeywords(s),V=(0,Re.useCallback)((()=>{u?w():_()}),[u,_,w]),z=(0,Re.useCallback)(((s,o)=>{o?_({deep:!0}):w({deep:!0})}),[_,w]);return $&&0!==U.length?Re.createElement(aT.Provider,{value:a},Re.createElement(oT.Provider,{value:C},Re.createElement("div",{className:"json-schema-2020-12-keyword json-schema-2020-12-keyword--extension-keywords","data-json-schema-level":x},Re.createElement(j,{expanded:u,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--extension"},"Extension Keywords")),Re.createElement(L,{expanded:u,onClick:z}),Re.createElement("ul",{className:Jn()("json-schema-2020-12-keyword__children",{"json-schema-2020-12-keyword__children--collapsed":!u})},u&&Re.createElement(Re.Fragment,null,U.map((o=>Re.createElement(B,{key:o,name:o,value:s[o],className:"json-schema-2020-12-json-viewer-extension-keyword"})))))))):null},JSONViewer=({name:s,value:o,className:i})=>{const a=useFn(),{path:u}=usePath(s),{isExpanded:_,setExpanded:w,setCollapsed:x}=useIsExpanded(s),[C,j]=useLevel(),L=useComponent("Accordion"),B=useComponent("ExpandDeepButton"),$="string"==typeof o||"number"==typeof o||"bigint"==typeof o||"boolean"==typeof o||"symbol"==typeof o||null==o,U=(s=>fn_isPlainObject(s)&&0===Object.keys(s).length)(o)||(s=>Array.isArray(s)&&0===s.length)(o),V=(0,Re.useCallback)((()=>{_?x():w()}),[_,w,x]),z=(0,Re.useCallback)(((s,o)=>{o?w({deep:!0}):x({deep:!0})}),[w,x]);return $?Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i)},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s),Re.createElement("span",{className:"json-schema-2020-12-json-viewer__value json-schema-2020-12-json-viewer__value--secondary"},a.stringify(o))):U?Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i)},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},Array.isArray(o)?"empty array":"empty object")):Re.createElement(aT.Provider,{value:u},Re.createElement(oT.Provider,{value:j},Re.createElement("div",{className:Jn()("json-schema-2020-12-json-viewer",i),"data-json-schema-level":C},Re.createElement(L,{expanded:_,onChange:V},Re.createElement("span",{className:"json-schema-2020-12-json-viewer__name json-schema-2020-12-json-viewer__name--secondary"},s)),Re.createElement(B,{expanded:_,onClick:z}),Re.createElement("strong",{className:"json-schema-2020-12__attribute json-schema-2020-12__attribute--primary"},Array.isArray(o)?"array":"object"),Re.createElement("ul",{className:Jn()("json-schema-2020-12-json-viewer__children",{"json-schema-2020-12-json-viewer__children--collapsed":!_})},_&&Re.createElement(Re.Fragment,null,Array.isArray(o)?o.map(((s,o)=>Re.createElement("li",{key:`#${o}`,className:"json-schema-2020-12-property"},Re.createElement(JSONViewer,{name:`#${o}`,value:s,className:i})))):Object.entries(o).map((([s,o])=>Re.createElement("li",{key:s,className:"json-schema-2020-12-property"},Re.createElement(JSONViewer,{name:s,value:o,className:i})))))))))},pT=JSONViewer,Accordion_Accordion=({expanded:s=!1,children:o,onChange:i})=>{const a=useComponent("ChevronRightIcon"),u=(0,Re.useCallback)((o=>{i(o,!s)}),[s,i]);return Re.createElement("button",{type:"button",className:"json-schema-2020-12-accordion",onClick:u},Re.createElement("div",{className:"json-schema-2020-12-accordion__children"},o),Re.createElement("span",{className:Jn()("json-schema-2020-12-accordion__icon",{"json-schema-2020-12-accordion__icon--expanded":s,"json-schema-2020-12-accordion__icon--collapsed":!s})},Re.createElement(a,null)))},ExpandDeepButton_ExpandDeepButton=({expanded:s,onClick:o})=>{const i=(0,Re.useCallback)((i=>{o(i,!s)}),[s,o]);return Re.createElement("button",{type:"button",className:"json-schema-2020-12-expand-deep-button",onClick:i},s?"Collapse all":"Expand all")},icons_ChevronRight=()=>Re.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},Re.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),withJSONSchemaContext=(s,o={})=>{const i={components:{JSONSchema:lT,Keyword$schema:keywords_$schema,Keyword$vocabulary:$vocabulary_$vocabulary,Keyword$id:keywords_$id,Keyword$anchor:keywords_$anchor,Keyword$dynamicAnchor:keywords_$dynamicAnchor,Keyword$ref:keywords_$ref,Keyword$dynamicRef:keywords_$dynamicRef,Keyword$defs:keywords_$defs,Keyword$comment:keywords_$comment,KeywordAllOf:keywords_AllOf,KeywordAnyOf:keywords_AnyOf,KeywordOneOf:keywords_OneOf,KeywordNot:keywords_Not,KeywordIf:keywords_If,KeywordThen:keywords_Then,KeywordElse:keywords_Else,KeywordDependentSchemas:keywords_DependentSchemas,KeywordPrefixItems:keywords_PrefixItems,KeywordItems:keywords_Items,KeywordContains:keywords_Contains,KeywordProperties:keywords_Properties_Properties,KeywordPatternProperties:PatternProperties_PatternProperties,KeywordAdditionalProperties:keywords_AdditionalProperties,KeywordPropertyNames:keywords_PropertyNames,KeywordUnevaluatedItems:keywords_UnevaluatedItems,KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,KeywordType:keywords_Type,KeywordEnum:Enum_Enum,KeywordConst:Const_Const,KeywordConstraint:uT,KeywordDependentRequired:DependentRequired_DependentRequired,KeywordContentSchema:keywords_ContentSchema,KeywordTitle:Title_Title,KeywordDescription:keywords_Description_Description,KeywordDefault:Default_Default,KeywordDeprecated:keywords_Deprecated,KeywordReadOnly:keywords_ReadOnly,KeywordWriteOnly:keywords_WriteOnly,KeywordExamples:keywords_Examples_Examples,ExtensionKeywords:ExtensionKeywords_ExtensionKeywords,JSONViewer:pT,Accordion:Accordion_Accordion,ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,ChevronRightIcon:icons_ChevronRight,...o.components},config:{default$schema:"https://json-schema.org/draft/2020-12/schema",defaultExpandedLevels:0,showExtensionKeywords:!0,...o.config},fn:{upperFirst:fn_upperFirst,getTitle:makeGetTitle(useFn),getType:makeGetType(useFn),isBooleanJSONSchema,hasKeyword,isExpandable:fn_makeIsExpandable(useFn),stringify:fn_stringify,stringifyConstraints,getDependentRequired,getSchemaKeywords,getExtensionKeywords:makeGetExtensionKeywords(useFn),...o.fn},state:{paths:{}}},HOC=o=>Re.createElement(sT.Provider,{value:i},Re.createElement(s,o));return HOC.contexts={JSONSchemaContext:sT},HOC.displayName=s.displayName,HOC},makeWithJSONSchemaSystemContext=({getSystem:s})=>(o,i={})=>{const{getComponent:a,getConfigs:u}=s(),_=u(),w=a("JSONSchema202012"),x=a("JSONSchema202012Keyword$schema"),C=a("JSONSchema202012Keyword$vocabulary"),j=a("JSONSchema202012Keyword$id"),L=a("JSONSchema202012Keyword$anchor"),B=a("JSONSchema202012Keyword$dynamicAnchor"),$=a("JSONSchema202012Keyword$ref"),U=a("JSONSchema202012Keyword$dynamicRef"),V=a("JSONSchema202012Keyword$defs"),z=a("JSONSchema202012Keyword$comment"),Y=a("JSONSchema202012KeywordAllOf"),Z=a("JSONSchema202012KeywordAnyOf"),ee=a("JSONSchema202012KeywordOneOf"),ie=a("JSONSchema202012KeywordNot"),ae=a("JSONSchema202012KeywordIf"),ce=a("JSONSchema202012KeywordThen"),le=a("JSONSchema202012KeywordElse"),pe=a("JSONSchema202012KeywordDependentSchemas"),de=a("JSONSchema202012KeywordPrefixItems"),fe=a("JSONSchema202012KeywordItems"),ye=a("JSONSchema202012KeywordContains"),be=a("JSONSchema202012KeywordProperties"),_e=a("JSONSchema202012KeywordPatternProperties"),Se=a("JSONSchema202012KeywordAdditionalProperties"),we=a("JSONSchema202012KeywordPropertyNames"),xe=a("JSONSchema202012KeywordUnevaluatedItems"),Pe=a("JSONSchema202012KeywordUnevaluatedProperties"),Te=a("JSONSchema202012KeywordType"),Re=a("JSONSchema202012KeywordEnum"),$e=a("JSONSchema202012KeywordConst"),qe=a("JSONSchema202012KeywordConstraint"),ze=a("JSONSchema202012KeywordDependentRequired"),We=a("JSONSchema202012KeywordContentSchema"),He=a("JSONSchema202012KeywordTitle"),Ye=a("JSONSchema202012KeywordDescription"),Xe=a("JSONSchema202012KeywordDefault"),Qe=a("JSONSchema202012KeywordDeprecated"),et=a("JSONSchema202012KeywordReadOnly"),tt=a("JSONSchema202012KeywordWriteOnly"),rt=a("JSONSchema202012KeywordExamples"),nt=a("JSONSchema202012ExtensionKeywords"),st=a("JSONSchema202012JSONViewer"),ot=a("JSONSchema202012Accordion"),it=a("JSONSchema202012ExpandDeepButton"),at=a("JSONSchema202012ChevronRightIcon");return withJSONSchemaContext(o,{components:{JSONSchema:w,Keyword$schema:x,Keyword$vocabulary:C,Keyword$id:j,Keyword$anchor:L,Keyword$dynamicAnchor:B,Keyword$ref:$,Keyword$dynamicRef:U,Keyword$defs:V,Keyword$comment:z,KeywordAllOf:Y,KeywordAnyOf:Z,KeywordOneOf:ee,KeywordNot:ie,KeywordIf:ae,KeywordThen:ce,KeywordElse:le,KeywordDependentSchemas:pe,KeywordPrefixItems:de,KeywordItems:fe,KeywordContains:ye,KeywordProperties:be,KeywordPatternProperties:_e,KeywordAdditionalProperties:Se,KeywordPropertyNames:we,KeywordUnevaluatedItems:xe,KeywordUnevaluatedProperties:Pe,KeywordType:Te,KeywordEnum:Re,KeywordConst:$e,KeywordConstraint:qe,KeywordDependentRequired:ze,KeywordContentSchema:We,KeywordTitle:He,KeywordDescription:Ye,KeywordDefault:Xe,KeywordDeprecated:Qe,KeywordReadOnly:et,KeywordWriteOnly:tt,KeywordExamples:rt,ExtensionKeywords:nt,JSONViewer:st,Accordion:ot,ExpandDeepButton:it,ChevronRightIcon:at,...i.components},config:{showExtensionKeywords:_.showExtensions,...i.config},fn:{...i.fn}})},json_schema_2020_12=({getSystem:s,fn:o})=>{const fnAccessor=()=>({upperFirst:o.upperFirst,...o.jsonSchema202012});return{components:{JSONSchema202012:lT,JSONSchema202012Keyword$schema:keywords_$schema,JSONSchema202012Keyword$vocabulary:$vocabulary_$vocabulary,JSONSchema202012Keyword$id:keywords_$id,JSONSchema202012Keyword$anchor:keywords_$anchor,JSONSchema202012Keyword$dynamicAnchor:keywords_$dynamicAnchor,JSONSchema202012Keyword$ref:keywords_$ref,JSONSchema202012Keyword$dynamicRef:keywords_$dynamicRef,JSONSchema202012Keyword$defs:keywords_$defs,JSONSchema202012Keyword$comment:keywords_$comment,JSONSchema202012KeywordAllOf:keywords_AllOf,JSONSchema202012KeywordAnyOf:keywords_AnyOf,JSONSchema202012KeywordOneOf:keywords_OneOf,JSONSchema202012KeywordNot:keywords_Not,JSONSchema202012KeywordIf:keywords_If,JSONSchema202012KeywordThen:keywords_Then,JSONSchema202012KeywordElse:keywords_Else,JSONSchema202012KeywordDependentSchemas:keywords_DependentSchemas,JSONSchema202012KeywordPrefixItems:keywords_PrefixItems,JSONSchema202012KeywordItems:keywords_Items,JSONSchema202012KeywordContains:keywords_Contains,JSONSchema202012KeywordProperties:keywords_Properties_Properties,JSONSchema202012KeywordPatternProperties:PatternProperties_PatternProperties,JSONSchema202012KeywordAdditionalProperties:keywords_AdditionalProperties,JSONSchema202012KeywordPropertyNames:keywords_PropertyNames,JSONSchema202012KeywordUnevaluatedItems:keywords_UnevaluatedItems,JSONSchema202012KeywordUnevaluatedProperties:keywords_UnevaluatedProperties,JSONSchema202012KeywordType:keywords_Type,JSONSchema202012KeywordEnum:Enum_Enum,JSONSchema202012KeywordConst:Const_Const,JSONSchema202012KeywordConstraint:uT,JSONSchema202012KeywordDependentRequired:DependentRequired_DependentRequired,JSONSchema202012KeywordContentSchema:keywords_ContentSchema,JSONSchema202012KeywordTitle:Title_Title,JSONSchema202012KeywordDescription:keywords_Description_Description,JSONSchema202012KeywordDefault:Default_Default,JSONSchema202012KeywordDeprecated:keywords_Deprecated,JSONSchema202012KeywordReadOnly:keywords_ReadOnly,JSONSchema202012KeywordWriteOnly:keywords_WriteOnly,JSONSchema202012KeywordExamples:keywords_Examples_Examples,JSONSchema202012ExtensionKeywords:ExtensionKeywords_ExtensionKeywords,JSONSchema202012JSONViewer:pT,JSONSchema202012Accordion:Accordion_Accordion,JSONSchema202012ExpandDeepButton:ExpandDeepButton_ExpandDeepButton,JSONSchema202012ChevronRightIcon:icons_ChevronRight,withJSONSchema202012Context:withJSONSchemaContext,withJSONSchema202012SystemContext:makeWithJSONSchemaSystemContext(s()),JSONSchema202012PathContext:()=>aT,JSONSchema202012LevelContext:()=>oT},fn:{upperFirst:fn_upperFirst,jsonSchema202012:{getTitle:makeGetTitle(fnAccessor),getType:makeGetType(fnAccessor),isExpandable:fn_makeIsExpandable(fnAccessor),isBooleanJSONSchema,hasKeyword,useFn,useConfig,useComponent,useIsExpanded,usePath,useLevel,getSchemaKeywords,getExtensionKeywords:makeGetExtensionKeywords(fnAccessor),hasSchemaType:fn_hasSchemaType}}}},array=(s,{sample:o=[]}={})=>((s,o={})=>{const{minItems:i,maxItems:a,uniqueItems:u}=o,{contains:_,minContains:w,maxContains:x}=o;let C=[...s];if(null!=_&&"object"==typeof _){if(Number.isInteger(w)&&w>1){const s=C.at(0);for(let o=1;o0&&(C=s.slice(0,a)),Number.isInteger(i)&&i>0)for(let s=0;C.length{throw new Error("Not implemented")},bytes=s=>xt()(s),random_pick=s=>s.at(0),predicates_isBooleanJSONSchema=s=>"boolean"==typeof s,isJSONSchemaObject=s=>as()(s),isJSONSchema=s=>predicates_isBooleanJSONSchema(s)||isJSONSchemaObject(s);const hT=class Registry{data={};register(s,o){this.data[s]=o}unregister(s){void 0===s?this.data={}:delete this.data[s]}get(s){return this.data[s]}},int32=()=>0,int64=()=>0,generators_float=()=>.1,generators_double=()=>.1,email=()=>"user@example.com",idn_email=()=>"실례@example.com",hostname=()=>"example.com",idn_hostname=()=>"실례.com",ipv4=()=>"198.51.100.42",ipv6=()=>"2001:0db8:5b96:0000:0000:426f:8e17:642a",uri=()=>"https://example.com/",uri_reference=()=>"path/index.html",iri=()=>"https://실례.com/",iri_reference=()=>"path/실례.html",uuid=()=>"3fa85f64-5717-4562-b3fc-2c963f66afa6",uri_template=()=>"https://example.com/dictionary/{term:1}/{term}",generators_json_pointer=()=>"/a/b/c",relative_json_pointer=()=>"1/0",date_time=()=>(new Date).toISOString(),date=()=>(new Date).toISOString().substring(0,10),time=()=>(new Date).toISOString().substring(11),duration=()=>"P3D",generators_password=()=>"********",regex=()=>"^[a-z]+$";const dT=new class FormatRegistry extends hT{#s={int32,int64,float:generators_float,double:generators_double,email,"idn-email":idn_email,hostname,"idn-hostname":idn_hostname,ipv4,ipv6,uri,"uri-reference":uri_reference,iri,"iri-reference":iri_reference,uuid,"uri-template":uri_template,"json-pointer":generators_json_pointer,"relative-json-pointer":relative_json_pointer,"date-time":date_time,date,time,duration,password:generators_password,regex};data={...this.#s};get defaults(){return{...this.#s}}},formatAPI=(s,o)=>"function"==typeof o?dT.register(s,o):null===o?dT.unregister(s):dT.get(s);formatAPI.getDefaults=()=>dT.defaults;const fT=formatAPI;var mT=__webpack_require__(48287).Buffer;const _7bit=s=>mT.from(s).toString("ascii");var gT=__webpack_require__(48287).Buffer;const _8bit=s=>gT.from(s).toString("utf8");var yT=__webpack_require__(48287).Buffer;const encoders_binary=s=>yT.from(s).toString("binary"),quoted_printable=s=>{let o="";for(let i=0;i=33&&a<=60||a>=62&&a<=126||9===a||32===a)o+=s.charAt(i);else if(13===a||10===a)o+="\r\n";else if(a>126){const a=unescape(encodeURIComponent(s.charAt(i)));for(let s=0;svT.from(s).toString("hex");var bT=__webpack_require__(48287).Buffer;const base32=s=>{const o=bT.from(s).toString("utf8"),i="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";let a=0,u="",_=0,w=0;for(let s=0;s=5;)u+=i.charAt(_>>>w-5&31),w-=5;w>0&&(u+=i.charAt(_<<5-w&31),a=(8-8*o.length%5)%5);for(let s=0;s_T.from(s).toString("base64");var ST=__webpack_require__(48287).Buffer;const base64url=s=>ST.from(s).toString("base64url");const ET=new class EncoderRegistry extends hT{#s={"7bit":_7bit,"8bit":_8bit,binary:encoders_binary,"quoted-printable":quoted_printable,base16,base32,base64,base64url};data={...this.#s};get defaults(){return{...this.#s}}},encoderAPI=(s,o)=>"function"==typeof o?ET.register(s,o):null===o?ET.unregister(s):ET.get(s);encoderAPI.getDefaults=()=>ET.defaults;const wT=encoderAPI,xT={"text/plain":()=>"string","text/css":()=>".selector { border: 1px solid red }","text/csv":()=>"value1,value2,value3","text/html":()=>"

    content

    ","text/calendar":()=>"BEGIN:VCALENDAR","text/javascript":()=>"console.dir('Hello world!');","text/xml":()=>'John Doe',"text/*":()=>"string"},kT={"image/*":()=>bytes(25).toString("binary")},OT={"audio/*":()=>bytes(25).toString("binary")},AT={"video/*":()=>bytes(25).toString("binary")},CT={"application/json":()=>'{"key":"value"}',"application/ld+json":()=>'{"name": "John Doe"}',"application/x-httpd-php":()=>"Hello World!

    '; ?>","application/rtf":()=>String.raw`{\rtf1\adeflang1025\ansi\ansicpg1252\uc1`,"application/x-sh":()=>'echo "Hello World!"',"application/xhtml+xml":()=>"

    content

    ","application/*":()=>bytes(25).toString("binary")};const jT=new class MediaTypeRegistry extends hT{#s={...xT,...kT,...OT,...AT,...CT};data={...this.#s};get defaults(){return{...this.#s}}},mediaTypeAPI=(s,o)=>{if("function"==typeof o)return jT.register(s,o);if(null===o)return jT.unregister(s);const i=s.split(";").at(0),a=`${i.split("/").at(0)}/*`;return jT.get(s)||jT.get(i)||jT.get(a)};mediaTypeAPI.getDefaults=()=>jT.defaults;const PT=mediaTypeAPI,applyStringConstraints=(s,o={})=>{const{maxLength:i,minLength:a}=o;let u=s;if(Number.isInteger(i)&&i>0&&(u=u.slice(0,i)),Number.isInteger(a)&&a>0){let s=0;for(;u.length{const{contentEncoding:i,contentMediaType:a,contentSchema:u}=s,{pattern:_,format:w}=s,x=wT(i)||vO();let C;return C="string"==typeof _?applyStringConstraints((s=>{try{const o=/(?<=(?{const{format:o}=s,i=fT(o);return"function"==typeof i?i(s):"string"})(s):isJSONSchema(u)&&"string"==typeof a&&void 0!==o?Array.isArray(o)||"object"==typeof o?JSON.stringify(o):applyStringConstraints(String(o),s):"string"==typeof a?(s=>{const{contentMediaType:o}=s,i=PT(o);return"function"==typeof i?i(s):"string"})(s):applyStringConstraints("string",s),x(C)},applyNumberConstraints=(s,o={})=>{const{minimum:i,maximum:a,exclusiveMinimum:u,exclusiveMaximum:_}=o,{multipleOf:w}=o,x=Number.isInteger(s)?1:Number.EPSILON;let C="number"==typeof i?i:null,j="number"==typeof a?a:null,L=s;if("number"==typeof u&&(C=null!==C?Math.max(C,u+x):u+x),"number"==typeof _&&(j=null!==j?Math.min(j,_-x):_-x),L=C>j&&s||C||j||L,"number"==typeof w&&w>0){const s=L%w;L=0===s?L:L+w-s}return L},types_number=s=>{const{format:o}=s;let i;return i="string"==typeof o?(s=>{const{format:o}=s,i=fT(o);return"function"==typeof i?i(s):0})(s):0,applyNumberConstraints(i,s)},types_integer=s=>{const{format:o}=s;let i;return i="string"==typeof o?(s=>{const{format:o}=s,i=fT(o);if("function"==typeof i)return i(s);switch(o){case"int32":return int32();case"int64":return int64()}return 0})(s):0,applyNumberConstraints(i,s)},types_boolean=s=>"boolean"!=typeof s.default||s.default,IT=new Proxy({array,object,string:types_string,number:types_number,integer:types_integer,boolean:types_boolean,null:()=>null},{get:(s,o)=>"string"==typeof o&&Object.hasOwn(s,o)?s[o]:()=>`Unknown Type: ${o}`}),TT=["array","object","number","integer","string","boolean","null"],hasExample=s=>{if(!isJSONSchemaObject(s))return!1;const{examples:o,example:i,default:a}=s;return!!(Array.isArray(o)&&o.length>=1)||(void 0!==a||void 0!==i)},extractExample=s=>{if(!isJSONSchemaObject(s))return null;const{examples:o,example:i,default:a}=s;return Array.isArray(o)&&o.length>=1?o.at(0):void 0!==a?a:void 0!==i?i:void 0},NT={array:["items","prefixItems","contains","maxContains","minContains","maxItems","minItems","uniqueItems","unevaluatedItems"],object:["properties","additionalProperties","patternProperties","propertyNames","minProperties","maxProperties","required","dependentSchemas","dependentRequired","unevaluatedProperties"],string:["pattern","format","minLength","maxLength","contentEncoding","contentMediaType","contentSchema"],integer:["minimum","maximum","exclusiveMinimum","exclusiveMaximum","multipleOf"]};NT.number=NT.integer;const MT="string",inferTypeFromValue=s=>void 0===s?null:null===s?"null":Array.isArray(s)?"array":Number.isInteger(s)?"integer":typeof s,foldType=s=>{if(Array.isArray(s)&&s.length>=1){if(s.includes("array"))return"array";if(s.includes("object"))return"object";{const o=s.filter((s=>"null"!==s)),i=random_pick(o.length>0?o:s);if(TT.includes(i))return i}}return TT.includes(s)?s:null},inferType=(s,o=new WeakSet)=>{if(!isJSONSchemaObject(s))return MT;if(o.has(s))return MT;o.add(s);let{type:i,const:a}=s;if(i=foldType(i),"string"!=typeof i){const o=Object.keys(NT);e:for(let a=0;a{if(Array.isArray(s[i])){const a=s[i].map((s=>inferType(s,o)));return foldType(a)}return null},a=combineTypes("allOf"),u=combineTypes("anyOf"),_=combineTypes("oneOf"),w=s.not?inferType(s.not,o):null;(a||u||_||w)&&(i=foldType([a,u,_,w].filter(Boolean)))}if("string"!=typeof i&&hasExample(s)){const o=extractExample(s),a=inferTypeFromValue(o);i="string"==typeof a?a:i}return o.delete(s),i||MT},type_getType=s=>inferType(s),typeCast=s=>predicates_isBooleanJSONSchema(s)?(s=>!1===s?{not:{}}:{})(s):isJSONSchemaObject(s)?s:{},merge_merge=(s,o,i={})=>{if(predicates_isBooleanJSONSchema(s)&&!0===s)return!0;if(predicates_isBooleanJSONSchema(s)&&!1===s)return!1;if(predicates_isBooleanJSONSchema(o)&&!0===o)return!0;if(predicates_isBooleanJSONSchema(o)&&!1===o)return!1;if(!isJSONSchema(s))return o;if(!isJSONSchema(o))return s;const a={...o,...s};if(o.type&&s.type&&Array.isArray(o.type)&&"string"==typeof o.type){const i=normalizeArray(o.type).concat(s.type);a.type=Array.from(new Set(i))}if(Array.isArray(o.required)&&Array.isArray(s.required)&&(a.required=[...new Set([...s.required,...o.required])]),o.properties&&s.properties){const u=new Set([...Object.keys(o.properties),...Object.keys(s.properties)]);a.properties={};for(const _ of u){const u=o.properties[_]||{},w=s.properties[_]||{};u.readOnly&&!i.includeReadOnly||u.writeOnly&&!i.includeWriteOnly?a.required=(a.required||[]).filter((s=>s!==_)):a.properties[_]=merge_merge(w,u,i)}}return isJSONSchema(o.items)&&isJSONSchema(s.items)&&(a.items=merge_merge(s.items,o.items,i)),isJSONSchema(o.contains)&&isJSONSchema(s.contains)&&(a.contains=merge_merge(s.contains,o.contains,i)),isJSONSchema(o.contentSchema)&&isJSONSchema(s.contentSchema)&&(a.contentSchema=merge_merge(s.contentSchema,o.contentSchema,i)),a},RT=merge_merge,main_sampleFromSchemaGeneric=(s,o={},i=void 0,a=!1)=>{if(null==s&&void 0===i)return;"function"==typeof s?.toJS&&(s=s.toJS()),s=typeCast(s);let u=void 0!==i||hasExample(s);const _=!u&&Array.isArray(s.oneOf)&&s.oneOf.length>0,w=!u&&Array.isArray(s.anyOf)&&s.anyOf.length>0;if(!u&&(_||w)){const i=typeCast(random_pick(_?s.oneOf:s.anyOf));!(s=RT(s,i,o)).xml&&i.xml&&(s.xml=i.xml),hasExample(s)&&hasExample(i)&&(u=!0)}const x={};let{xml:C,properties:j,additionalProperties:L,items:B,contains:$}=s||{},U=type_getType(s),{includeReadOnly:V,includeWriteOnly:z}=o;C=C||{};let Y,{name:Z,prefix:ee,namespace:ie}=C,ae={};if(Object.hasOwn(s,"type")||(s.type=U),a&&(Z=Z||"notagname",Y=(ee?`${ee}:`:"")+Z,ie)){x[ee?`xmlns:${ee}`:"xmlns"]=ie}a&&(ae[Y]=[]);const ce=objectify(j);let le,pe=0;const hasExceededMaxProperties=()=>Number.isInteger(s.maxProperties)&&s.maxProperties>0&&pe>=s.maxProperties,canAddProperty=o=>!(Number.isInteger(s.maxProperties)&&s.maxProperties>0)||!hasExceededMaxProperties()&&(!(o=>!Array.isArray(s.required)||0===s.required.length||!s.required.includes(o))(o)||s.maxProperties-pe-(()=>{if(!Array.isArray(s.required)||0===s.required.length)return 0;let o=0;return a?s.required.forEach((s=>o+=void 0===ae[s]?0:1)):s.required.forEach((s=>{o+=void 0===ae[Y]?.find((o=>void 0!==o[s]))?0:1})),s.required.length-o})()>0);if(le=a?(i,u=void 0)=>{if(s&&ce[i]){if(ce[i].xml=ce[i].xml||{},ce[i].xml.attribute){const s=Array.isArray(ce[i].enum)?random_pick(ce[i].enum):void 0;if(hasExample(ce[i]))x[ce[i].xml.name||i]=extractExample(ce[i]);else if(void 0!==s)x[ce[i].xml.name||i]=s;else{const s=typeCast(ce[i]),a=type_getType(s),_=ce[i].xml.name||i;if("array"===a){const s=main_sampleFromSchemaGeneric(ce[i],o,u,!1);x[_]=s.map((s=>as()(s)?"UnknownTypeObject":Array.isArray(s)?"UnknownTypeArray":s)).join(" ")}else x[_]="object"===a?"UnknownTypeObject":IT[a](s)}return}ce[i].xml.name=ce[i].xml.name||i}else ce[i]||!1===L||(ce[i]={xml:{name:i}});let _=main_sampleFromSchemaGeneric(ce[i],o,u,a);canAddProperty(i)&&(pe++,Array.isArray(_)?ae[Y]=ae[Y].concat(_):ae[Y].push(_))}:(i,u)=>{if(canAddProperty(i)){if(as()(s.discriminator?.mapping)&&s.discriminator.propertyName===i&&"string"==typeof s.$$ref){for(const o in s.discriminator.mapping)if(-1!==s.$$ref.search(s.discriminator.mapping[o])){ae[i]=o;break}}else ae[i]=main_sampleFromSchemaGeneric(ce[i],o,u,a);pe++}},u){let u;if(u=void 0!==i?i:extractExample(s),!a){if("number"==typeof u&&"string"===U)return`${u}`;if("string"!=typeof u||"string"===U)return u;try{return JSON.parse(u)}catch{return u}}if("array"===U){if(!Array.isArray(u)){if("string"==typeof u)return u;u=[u]}let i=[];return isJSONSchemaObject(B)&&(B.xml=B.xml||C||{},B.xml.name=B.xml.name||C.name,i=u.map((s=>main_sampleFromSchemaGeneric(B,o,s,a)))),isJSONSchemaObject($)&&($.xml=$.xml||C||{},$.xml.name=$.xml.name||C.name,i=[main_sampleFromSchemaGeneric($,o,void 0,a),...i]),i=IT.array(s,{sample:i}),C.wrapped?(ae[Y]=i,ds()(x)||ae[Y].push({_attr:x})):ae=i,ae}if("object"===U){if("string"==typeof u)return u;for(const s in u)Object.hasOwn(u,s)&&(ce[s]?.readOnly&&!V||ce[s]?.writeOnly&&!z||(ce[s]?.xml?.attribute?x[ce[s].xml.name||s]=u[s]:le(s,u[s])));return ds()(x)||ae[Y].push({_attr:x}),ae}return ae[Y]=ds()(x)?u:[{_attr:x},u],ae}if("array"===U){let i=[];if(isJSONSchemaObject($))if(a&&($.xml=$.xml||s.xml||{},$.xml.name=$.xml.name||C.name),Array.isArray($.anyOf)){const{anyOf:s,...u}=B;i.push(...$.anyOf.map((s=>main_sampleFromSchemaGeneric(RT(s,u,o),o,void 0,a))))}else if(Array.isArray($.oneOf)){const{oneOf:s,...u}=B;i.push(...$.oneOf.map((s=>main_sampleFromSchemaGeneric(RT(s,u,o),o,void 0,a))))}else{if(!(!a||a&&C.wrapped))return main_sampleFromSchemaGeneric($,o,void 0,a);i.push(main_sampleFromSchemaGeneric($,o,void 0,a))}if(isJSONSchemaObject(B))if(a&&(B.xml=B.xml||s.xml||{},B.xml.name=B.xml.name||C.name),Array.isArray(B.anyOf)){const{anyOf:s,...u}=B;i.push(...B.anyOf.map((s=>main_sampleFromSchemaGeneric(RT(s,u,o),o,void 0,a))))}else if(Array.isArray(B.oneOf)){const{oneOf:s,...u}=B;i.push(...B.oneOf.map((s=>main_sampleFromSchemaGeneric(RT(s,u,o),o,void 0,a))))}else{if(!(!a||a&&C.wrapped))return main_sampleFromSchemaGeneric(B,o,void 0,a);i.push(main_sampleFromSchemaGeneric(B,o,void 0,a))}return i=IT.array(s,{sample:i}),a&&C.wrapped?(ae[Y]=i,ds()(x)||ae[Y].push({_attr:x}),ae):i}if("object"===U){for(let s in ce)Object.hasOwn(ce,s)&&(ce[s]?.deprecated||ce[s]?.readOnly&&!V||ce[s]?.writeOnly&&!z||le(s));if(a&&x&&ae[Y].push({_attr:x}),hasExceededMaxProperties())return ae;if(predicates_isBooleanJSONSchema(L)&&L)a?ae[Y].push({additionalProp:"Anything can be here"}):ae.additionalProp1={},pe++;else if(isJSONSchemaObject(L)){const i=L,u=main_sampleFromSchemaGeneric(i,o,void 0,a);if(a&&"string"==typeof i?.xml?.name&&"notagname"!==i?.xml?.name)ae[Y].push(u);else{const o=i?.["x-additionalPropertiesName"]||"additionalProp",_=Number.isInteger(s.minProperties)&&s.minProperties>0&&pe{const a=main_sampleFromSchemaGeneric(s,o,i,!0);if(a)return"string"==typeof a?a:ls()(a,{declaration:!0,indent:"\t"})},main_sampleFromSchema=(s,o,i)=>main_sampleFromSchemaGeneric(s,o,i,!1),main_resolver=(s,o,i)=>[s,JSON.stringify(o),JSON.stringify(i)],DT=utils_memoizeN(main_createXMLExample,main_resolver),LT=utils_memoizeN(main_sampleFromSchema,main_resolver);const FT=new class OptionRegistry extends hT{#s={};data={...this.#s};get defaults(){return{...this.#s}}},api_optionAPI=(s,o)=>(void 0!==o&&FT.register(s,o),FT.get(s)),BT=[{when:/json/,shouldStringifyTypes:["string"]}],$T=["object"],fn_get_json_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.jsonSchema202012.memoizedSampleFromSchema(o,i,u),x=typeof w,C=BT.reduce(((s,o)=>o.when.test(a)?[...s,...o.shouldStringifyTypes]:s),$T);return gt()(C,(s=>s===x))?JSON.stringify(w,null,2):w},fn_get_yaml_sample_schema=s=>(o,i,a,u)=>{const{fn:_}=s(),w=_.jsonSchema202012.getJsonSampleSchema(o,i,a,u);let x;try{x=fn.dump(fn.load(w),{lineWidth:-1},{schema:rn}),"\n"===x[x.length-1]&&(x=x.slice(0,x.length-1))}catch(s){return console.error(s),"error: could not generate yaml example"}return x.replace(/\t/g," ")},fn_get_xml_sample_schema=s=>(o,i,a)=>{const{fn:u}=s();if(o&&!o.xml&&(o.xml={}),o&&!o.xml.name){if(!o.$$ref&&(o.type||o.items||o.properties||o.additionalProperties))return'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e';if(o.$$ref){let s=o.$$ref.match(/\S*\/(\S+)$/);o.xml.name=s[1]}}return u.jsonSchema202012.memoizedCreateXMLExample(o,i,a)},fn_get_sample_schema=s=>(o,i="",a={},u=void 0)=>{const{fn:_}=s();return"function"==typeof o?.toJS&&(o=o.toJS()),"function"==typeof u?.toJS&&(u=u.toJS()),/xml/.test(i)?_.jsonSchema202012.getXmlSampleSchema(o,a,u):/(yaml|yml)/.test(i)?_.jsonSchema202012.getYamlSampleSchema(o,a,i,u):_.jsonSchema202012.getJsonSampleSchema(o,a,i,u)},json_schema_2020_12_samples=({getSystem:s})=>{const o=fn_get_json_sample_schema(s),i=fn_get_yaml_sample_schema(s),a=fn_get_xml_sample_schema(s),u=fn_get_sample_schema(s);return{fn:{jsonSchema202012:{sampleFromSchema:main_sampleFromSchema,sampleFromSchemaGeneric:main_sampleFromSchemaGeneric,sampleOptionAPI:api_optionAPI,sampleEncoderAPI:wT,sampleFormatAPI:fT,sampleMediaTypeAPI:PT,createXMLExample:main_createXMLExample,memoizedSampleFromSchema:LT,memoizedCreateXMLExample:DT,getJsonSampleSchema:o,getYamlSampleSchema:i,getXmlSampleSchema:a,getSampleSchema:u,mergeJsonSchema:RT,foldType}}}};function PresetApis(){return[base,oas3,json_schema_2020_12,json_schema_2020_12_samples,oas31]}const inline_plugin=s=>()=>({fn:s.fn,components:s.components}),factorization_system=s=>{const o=Ye()({layout:{layout:s.layout,filter:s.filter},spec:{spec:"",url:s.url},requestSnippets:s.requestSnippets},s.initialState);if(s.initialState)for(const[i,a]of Object.entries(s.initialState))void 0===a&&delete o[i];return{system:{configs:s.configs},plugins:s.presets,state:o}},sources_query=()=>s=>{const o=s.queryConfigEnabled?(()=>{const s=new URLSearchParams(lt.location.search);return Object.fromEntries(s)})():{};return Object.entries(o).reduce(((s,[o,i])=>("config"===o?s.configUrl=i:"urls.primaryName"===o?s[o]=i:s=co()(s,o,i),s)),{})},sources_url=({url:s,system:o})=>async i=>{if(!s)return{};if("function"!=typeof o.configsActions?.getConfigByUrl)return{};const a=(()=>{const s={};return s.promise=new Promise(((o,i)=>{s.resolve=o,s.reject=i})),s})();return o.configsActions.getConfigByUrl({url:s,loadRemoteConfig:!0,requestInterceptor:i.requestInterceptor,responseInterceptor:i.responseInterceptor},(s=>{a.resolve(s)})),a.promise},runtime=()=>()=>{const s={};return globalThis.location&&(s.oauth2RedirectUrl=`${globalThis.location.protocol}//${globalThis.location.host}${globalThis.location.pathname.substring(0,globalThis.location.pathname.lastIndexOf("/"))}/oauth2-redirect.html`),s},qT=Object.freeze({dom_id:null,domNode:null,spec:{},url:"",urls:null,configUrl:null,layout:"BaseLayout",docExpansion:"list",maxDisplayedTags:-1,filter:!1,validatorUrl:"https://validator.swagger.io/validator",oauth2RedirectUrl:void 0,persistAuthorization:!1,configs:{},displayOperationId:!1,displayRequestDuration:!1,deepLinking:!1,tryItOutEnabled:!1,requestInterceptor:s=>(s.curlOptions=[],s),responseInterceptor:s=>s,showMutatedRequest:!0,defaultModelRendering:"example",defaultModelExpandDepth:1,defaultModelsExpandDepth:1,showExtensions:!1,showCommonExtensions:!1,withCredentials:!1,requestSnippetsEnabled:!1,requestSnippets:{generators:{curl_bash:{title:"cURL (bash)",syntax:"bash"},curl_powershell:{title:"cURL (PowerShell)",syntax:"powershell"},curl_cmd:{title:"cURL (CMD)",syntax:"bash"}},defaultExpanded:!0,languages:null},supportedSubmitMethods:["get","put","post","delete","options","head","patch","trace"],queryConfigEnabled:!1,presets:[PresetApis],plugins:[],initialState:{},fn:{},components:{},syntaxHighlight:{activated:!0,theme:"agate"},operationsSorter:null,tagsSorter:null,onComplete:null,modelPropertyMacro:null,parameterMacro:null,fileUploadMediaTypes:["application/octet-stream","image/","audio/","video/"],uncaughtExceptionHandler:null});var UT=__webpack_require__(61448),VT=__webpack_require__.n(UT),zT=__webpack_require__(77731),WT=__webpack_require__.n(zT);const type_casters_array=(s,o=[])=>Array.isArray(s)?s:o,type_casters_boolean=(s,o=!1)=>!0===s||"true"===s||1===s||"1"===s||!1!==s&&"false"!==s&&0!==s&&"0"!==s&&o,dom_node=s=>null===s||"null"===s?null:s,type_casters_filter=s=>{const o=String(s);return type_casters_boolean(s,o)},type_casters_function=(s,o)=>"function"==typeof s?s:o,nullable_array=s=>Array.isArray(s)?s:null,nullable_function=s=>"function"==typeof s?s:null,nullable_string=s=>null===s||"null"===s?null:String(s),type_casters_number=(s,o=-1)=>{const i=parseInt(s,10);return Number.isNaN(i)?o:i},type_casters_object=(s,o={})=>as()(s)?s:o,sorter=s=>"function"==typeof s||"string"==typeof s?s:null,type_casters_string=s=>String(s),syntax_highlight=(s,o)=>as()(s)?s:!1===s||"false"===s||0===s||"0"===s?{activated:!1}:o,undefined_string=s=>void 0===s||"undefined"===s?void 0:String(s),JT={components:{typeCaster:type_casters_object},configs:{typeCaster:type_casters_object},configUrl:{typeCaster:nullable_string},deepLinking:{typeCaster:type_casters_boolean,defaultValue:qT.deepLinking},defaultModelExpandDepth:{typeCaster:type_casters_number,defaultValue:qT.defaultModelExpandDepth},defaultModelRendering:{typeCaster:type_casters_string},defaultModelsExpandDepth:{typeCaster:type_casters_number,defaultValue:qT.defaultModelsExpandDepth},displayOperationId:{typeCaster:type_casters_boolean,defaultValue:qT.displayOperationId},displayRequestDuration:{typeCaster:type_casters_boolean,defaultValue:qT.displayRequestDuration},docExpansion:{typeCaster:type_casters_string},dom_id:{typeCaster:nullable_string},domNode:{typeCaster:dom_node},fileUploadMediaTypes:{typeCaster:type_casters_array,defaultValue:qT.fileUploadMediaTypes},filter:{typeCaster:type_casters_filter},fn:{typeCaster:type_casters_object},initialState:{typeCaster:type_casters_object},layout:{typeCaster:type_casters_string},maxDisplayedTags:{typeCaster:type_casters_number,defaultValue:qT.maxDisplayedTags},modelPropertyMacro:{typeCaster:nullable_function},oauth2RedirectUrl:{typeCaster:undefined_string},onComplete:{typeCaster:nullable_function},operationsSorter:{typeCaster:sorter},paramaterMacro:{typeCaster:nullable_function},persistAuthorization:{typeCaster:type_casters_boolean,defaultValue:qT.persistAuthorization},plugins:{typeCaster:type_casters_array,defaultValue:qT.plugins},presets:{typeCaster:type_casters_array,defaultValue:qT.presets},requestInterceptor:{typeCaster:type_casters_function,defaultValue:qT.requestInterceptor},requestSnippets:{typeCaster:type_casters_object,defaultValue:qT.requestSnippets},requestSnippetsEnabled:{typeCaster:type_casters_boolean,defaultValue:qT.requestSnippetsEnabled},responseInterceptor:{typeCaster:type_casters_function,defaultValue:qT.responseInterceptor},showCommonExtensions:{typeCaster:type_casters_boolean,defaultValue:qT.showCommonExtensions},showExtensions:{typeCaster:type_casters_boolean,defaultValue:qT.showExtensions},showMutatedRequest:{typeCaster:type_casters_boolean,defaultValue:qT.showMutatedRequest},spec:{typeCaster:type_casters_object,defaultValue:qT.spec},supportedSubmitMethods:{typeCaster:type_casters_array,defaultValue:qT.supportedSubmitMethods},syntaxHighlight:{typeCaster:syntax_highlight,defaultValue:qT.syntaxHighlight},"syntaxHighlight.activated":{typeCaster:type_casters_boolean,defaultValue:qT.syntaxHighlight.activated},"syntaxHighlight.theme":{typeCaster:type_casters_string},tagsSorter:{typeCaster:sorter},tryItOutEnabled:{typeCaster:type_casters_boolean,defaultValue:qT.tryItOutEnabled},url:{typeCaster:type_casters_string},urls:{typeCaster:nullable_array},"urls.primaryName":{typeCaster:type_casters_string},validatorUrl:{typeCaster:nullable_string},withCredentials:{typeCaster:type_casters_boolean,defaultValue:qT.withCredentials},uncaughtExceptionHandler:{typeCaster:nullable_function}},type_cast=s=>Object.entries(JT).reduce(((s,[o,{typeCaster:i,defaultValue:a}])=>{if(VT()(s,o)){const u=i(Cn()(s,o),a);s=WT()(o,u,s)}return s}),{...s}),config_merge=(s,...o)=>{let i=Symbol.for("domNode"),a=Symbol.for("primaryName");const u=[];for(const s of o){const o={...s};Object.hasOwn(o,"domNode")&&(i=o.domNode,delete o.domNode),Object.hasOwn(o,"urls.primaryName")?(a=o["urls.primaryName"],delete o["urls.primaryName"]):Array.isArray(o.urls)&&Object.hasOwn(o.urls,"primaryName")&&(a=o.urls.primaryName,delete o.urls.primaryName),u.push(o)}const _=Ye()(s,...u);return i!==Symbol.for("domNode")&&(_.domNode=i),a!==Symbol.for("primaryName")&&Array.isArray(_.urls)&&(_.urls.primaryName=a),type_cast(_)};function SwaggerUI(s){const o=sources_query()(s),i=runtime()(),a=SwaggerUI.config.merge({},SwaggerUI.config.defaults,i,s,o),u=factorization_system(a),_=inline_plugin(a),w=new Store(u);w.register([a.plugins,_]);const x=w.getSystem(),persistConfigs=s=>{w.setConfigs(s),x.configsActions.loaded()},updateSpec=s=>{!o.url&&"object"==typeof s.spec&&Object.keys(s.spec).length>0?(x.specActions.updateUrl(""),x.specActions.updateLoadingStatus("success"),x.specActions.updateSpec(JSON.stringify(s.spec))):"function"==typeof x.specActions.download&&s.url&&!s.urls&&(x.specActions.updateUrl(s.url),x.specActions.download(s.url))},render=s=>{if(s.domNode)x.render(s.domNode,"App");else if(s.dom_id){const o=document.querySelector(s.dom_id);x.render(o,"App")}else null===s.dom_id||null===s.domNode||console.error("Skipped rendering: no `dom_id` or `domNode` was specified")};return a.configUrl?((async()=>{const{configUrl:s}=a,i=await sources_url({url:s,system:x})(a),u=SwaggerUI.config.merge({},a,i,o);persistConfigs(u),null!==i&&updateSpec(u),render(u)})(),x):(persistConfigs(a),updateSpec(a),render(a),x)}SwaggerUI.System=Store,SwaggerUI.config={defaults:qT,merge:config_merge,typeCast:type_cast,typeCastMappings:JT},SwaggerUI.presets={base,apis:PresetApis},SwaggerUI.plugins={Auth:auth,Configs:configsPlugin,DeepLining:deep_linking,Err:err,Filter:filter,Icons:icons,JSONSchema5:json_schema_5,JSONSchema5Samples:json_schema_5_samples,JSONSchema202012:json_schema_2020_12,JSONSchema202012Samples:json_schema_2020_12_samples,Layout:plugins_layout,Logs:logs,OpenAPI30:oas3,OpenAPI31:oas3,OnComplete:on_complete,RequestSnippets:plugins_request_snippets,Spec:plugins_spec,SwaggerClient:swagger_client,Util:util,View:view,ViewLegacy:view_legacy,DownloadUrl:downloadUrlPlugin,SyntaxHighlighting:syntax_highlighting,Versions:versions,SafeRender:safe_render};const HT=SwaggerUI})(),i=i.default})())); diff --git a/LightRAG/lightrag/api/static/swagger-ui/swagger-ui.css b/LightRAG/lightrag/api/static/swagger-ui/swagger-ui.css new file mode 100644 index 00000000..5c844aea --- /dev/null +++ b/LightRAG/lightrag/api/static/swagger-ui/swagger-ui.css @@ -0,0 +1,3 @@ +.swagger-ui{color:#3b4151;font-family:sans-serif}.swagger-ui html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}.swagger-ui body{margin:0}.swagger-ui article,.swagger-ui aside,.swagger-ui footer,.swagger-ui header,.swagger-ui nav,.swagger-ui section{display:block}.swagger-ui h1{font-size:2em;margin:.67em 0}.swagger-ui figcaption,.swagger-ui figure,.swagger-ui main{display:block}.swagger-ui figure{margin:1em 40px}.swagger-ui hr{box-sizing:content-box;height:0;overflow:visible}.swagger-ui pre{font-family:monospace,monospace;font-size:1em}.swagger-ui a{background-color:transparent;-webkit-text-decoration-skip:objects}.swagger-ui abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.swagger-ui b,.swagger-ui strong{font-weight:inherit;font-weight:bolder}.swagger-ui code,.swagger-ui kbd,.swagger-ui samp{font-family:monospace,monospace;font-size:1em}.swagger-ui dfn{font-style:italic}.swagger-ui mark{background-color:#ff0;color:#000}.swagger-ui small{font-size:80%}.swagger-ui sub,.swagger-ui sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.swagger-ui sub{bottom:-.25em}.swagger-ui sup{top:-.5em}.swagger-ui audio,.swagger-ui video{display:inline-block}.swagger-ui audio:not([controls]){display:none;height:0}.swagger-ui img{border-style:none}.swagger-ui svg:not(:root){overflow:hidden}.swagger-ui button,.swagger-ui input,.swagger-ui optgroup,.swagger-ui select,.swagger-ui textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}.swagger-ui button,.swagger-ui input{overflow:visible}.swagger-ui button,.swagger-ui select{text-transform:none}.swagger-ui [type=reset],.swagger-ui [type=submit],.swagger-ui button,.swagger-ui html [type=button]{-webkit-appearance:button}.swagger-ui [type=button]::-moz-focus-inner,.swagger-ui [type=reset]::-moz-focus-inner,.swagger-ui [type=submit]::-moz-focus-inner,.swagger-ui button::-moz-focus-inner{border-style:none;padding:0}.swagger-ui [type=button]:-moz-focusring,.swagger-ui [type=reset]:-moz-focusring,.swagger-ui [type=submit]:-moz-focusring,.swagger-ui button:-moz-focusring{outline:1px dotted ButtonText}.swagger-ui fieldset{padding:.35em .75em .625em}.swagger-ui legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}.swagger-ui progress{display:inline-block;vertical-align:baseline}.swagger-ui textarea{overflow:auto}.swagger-ui [type=checkbox],.swagger-ui [type=radio]{box-sizing:border-box;padding:0}.swagger-ui [type=number]::-webkit-inner-spin-button,.swagger-ui [type=number]::-webkit-outer-spin-button{height:auto}.swagger-ui [type=search]{-webkit-appearance:textfield;outline-offset:-2px}.swagger-ui [type=search]::-webkit-search-cancel-button,.swagger-ui [type=search]::-webkit-search-decoration{-webkit-appearance:none}.swagger-ui ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.swagger-ui details,.swagger-ui menu{display:block}.swagger-ui summary{display:list-item}.swagger-ui canvas{display:inline-block}.swagger-ui [hidden],.swagger-ui template{display:none}.swagger-ui .debug *{outline:1px solid gold}.swagger-ui .debug-white *{outline:1px solid #fff}.swagger-ui .debug-black *{outline:1px solid #000}.swagger-ui .debug-grid{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) repeat 0 0}.swagger-ui .debug-grid-16{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) repeat 0 0}.swagger-ui .debug-grid-8-solid{background:#fff url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) repeat 0 0}.swagger-ui .debug-grid-16-solid{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) repeat 0 0}.swagger-ui .border-box,.swagger-ui a,.swagger-ui article,.swagger-ui body,.swagger-ui code,.swagger-ui dd,.swagger-ui div,.swagger-ui dl,.swagger-ui dt,.swagger-ui fieldset,.swagger-ui footer,.swagger-ui form,.swagger-ui h1,.swagger-ui h2,.swagger-ui h3,.swagger-ui h4,.swagger-ui h5,.swagger-ui h6,.swagger-ui header,.swagger-ui html,.swagger-ui input[type=email],.swagger-ui input[type=number],.swagger-ui input[type=password],.swagger-ui input[type=tel],.swagger-ui input[type=text],.swagger-ui input[type=url],.swagger-ui legend,.swagger-ui li,.swagger-ui main,.swagger-ui ol,.swagger-ui p,.swagger-ui pre,.swagger-ui section,.swagger-ui table,.swagger-ui td,.swagger-ui textarea,.swagger-ui th,.swagger-ui tr,.swagger-ui ul{box-sizing:border-box}.swagger-ui .aspect-ratio{height:0;position:relative}.swagger-ui .aspect-ratio--16x9{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1{padding-bottom:100%}.swagger-ui .aspect-ratio--object{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}@media screen and (min-width:30em){.swagger-ui .aspect-ratio-ns{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-ns{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-ns{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-ns{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-ns{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-ns{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-ns{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-ns{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-ns{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-ns{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-ns{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-ns{padding-bottom:100%}.swagger-ui .aspect-ratio--object-ns{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .aspect-ratio-m{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-m{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-m{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-m{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-m{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-m{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-m{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-m{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-m{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-m{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-m{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-m{padding-bottom:100%}.swagger-ui .aspect-ratio--object-m{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}@media screen and (min-width:60em){.swagger-ui .aspect-ratio-l{height:0;position:relative}.swagger-ui .aspect-ratio--16x9-l{padding-bottom:56.25%}.swagger-ui .aspect-ratio--9x16-l{padding-bottom:177.77%}.swagger-ui .aspect-ratio--4x3-l{padding-bottom:75%}.swagger-ui .aspect-ratio--3x4-l{padding-bottom:133.33%}.swagger-ui .aspect-ratio--6x4-l{padding-bottom:66.6%}.swagger-ui .aspect-ratio--4x6-l{padding-bottom:150%}.swagger-ui .aspect-ratio--8x5-l{padding-bottom:62.5%}.swagger-ui .aspect-ratio--5x8-l{padding-bottom:160%}.swagger-ui .aspect-ratio--7x5-l{padding-bottom:71.42%}.swagger-ui .aspect-ratio--5x7-l{padding-bottom:140%}.swagger-ui .aspect-ratio--1x1-l{padding-bottom:100%}.swagger-ui .aspect-ratio--object-l{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%;z-index:100}}.swagger-ui img{max-width:100%}.swagger-ui .cover{background-size:cover!important}.swagger-ui .contain{background-size:contain!important}@media screen and (min-width:30em){.swagger-ui .cover-ns{background-size:cover!important}.swagger-ui .contain-ns{background-size:contain!important}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cover-m{background-size:cover!important}.swagger-ui .contain-m{background-size:contain!important}}@media screen and (min-width:60em){.swagger-ui .cover-l{background-size:cover!important}.swagger-ui .contain-l{background-size:contain!important}}.swagger-ui .bg-center{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left{background-position:0;background-repeat:no-repeat}@media screen and (min-width:30em){.swagger-ui .bg-center-ns{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-ns{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-ns{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-ns{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-ns{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bg-center-m{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-m{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-m{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-m{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-m{background-position:0;background-repeat:no-repeat}}@media screen and (min-width:60em){.swagger-ui .bg-center-l{background-position:50%;background-repeat:no-repeat}.swagger-ui .bg-top-l{background-position:top;background-repeat:no-repeat}.swagger-ui .bg-right-l{background-position:100%;background-repeat:no-repeat}.swagger-ui .bg-bottom-l{background-position:bottom;background-repeat:no-repeat}.swagger-ui .bg-left-l{background-position:0;background-repeat:no-repeat}}.swagger-ui .outline{outline:1px solid}.swagger-ui .outline-transparent{outline:1px solid transparent}.swagger-ui .outline-0{outline:0}@media screen and (min-width:30em){.swagger-ui .outline-ns{outline:1px solid}.swagger-ui .outline-transparent-ns{outline:1px solid transparent}.swagger-ui .outline-0-ns{outline:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .outline-m{outline:1px solid}.swagger-ui .outline-transparent-m{outline:1px solid transparent}.swagger-ui .outline-0-m{outline:0}}@media screen and (min-width:60em){.swagger-ui .outline-l{outline:1px solid}.swagger-ui .outline-transparent-l{outline:1px solid transparent}.swagger-ui .outline-0-l{outline:0}}.swagger-ui .ba{border-style:solid;border-width:1px}.swagger-ui .bt{border-top-style:solid;border-top-width:1px}.swagger-ui .br{border-right-style:solid;border-right-width:1px}.swagger-ui .bb{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl{border-left-style:solid;border-left-width:1px}.swagger-ui .bn{border-style:none;border-width:0}@media screen and (min-width:30em){.swagger-ui .ba-ns{border-style:solid;border-width:1px}.swagger-ui .bt-ns{border-top-style:solid;border-top-width:1px}.swagger-ui .br-ns{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-ns{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-ns{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-ns{border-style:none;border-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ba-m{border-style:solid;border-width:1px}.swagger-ui .bt-m{border-top-style:solid;border-top-width:1px}.swagger-ui .br-m{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-m{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-m{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-m{border-style:none;border-width:0}}@media screen and (min-width:60em){.swagger-ui .ba-l{border-style:solid;border-width:1px}.swagger-ui .bt-l{border-top-style:solid;border-top-width:1px}.swagger-ui .br-l{border-right-style:solid;border-right-width:1px}.swagger-ui .bb-l{border-bottom-style:solid;border-bottom-width:1px}.swagger-ui .bl-l{border-left-style:solid;border-left-width:1px}.swagger-ui .bn-l{border-style:none;border-width:0}}.swagger-ui .b--black{border-color:#000}.swagger-ui .b--near-black{border-color:#111}.swagger-ui .b--dark-gray{border-color:#333}.swagger-ui .b--mid-gray{border-color:#555}.swagger-ui .b--gray{border-color:#777}.swagger-ui .b--silver{border-color:#999}.swagger-ui .b--light-silver{border-color:#aaa}.swagger-ui .b--moon-gray{border-color:#ccc}.swagger-ui .b--light-gray{border-color:#eee}.swagger-ui .b--near-white{border-color:#f4f4f4}.swagger-ui .b--white{border-color:#fff}.swagger-ui .b--white-90{border-color:hsla(0,0%,100%,.9)}.swagger-ui .b--white-80{border-color:hsla(0,0%,100%,.8)}.swagger-ui .b--white-70{border-color:hsla(0,0%,100%,.7)}.swagger-ui .b--white-60{border-color:hsla(0,0%,100%,.6)}.swagger-ui .b--white-50{border-color:hsla(0,0%,100%,.5)}.swagger-ui .b--white-40{border-color:hsla(0,0%,100%,.4)}.swagger-ui .b--white-30{border-color:hsla(0,0%,100%,.3)}.swagger-ui .b--white-20{border-color:hsla(0,0%,100%,.2)}.swagger-ui .b--white-10{border-color:hsla(0,0%,100%,.1)}.swagger-ui .b--white-05{border-color:hsla(0,0%,100%,.05)}.swagger-ui .b--white-025{border-color:hsla(0,0%,100%,.025)}.swagger-ui .b--white-0125{border-color:hsla(0,0%,100%,.013)}.swagger-ui .b--black-90{border-color:rgba(0,0,0,.9)}.swagger-ui .b--black-80{border-color:rgba(0,0,0,.8)}.swagger-ui .b--black-70{border-color:rgba(0,0,0,.7)}.swagger-ui .b--black-60{border-color:rgba(0,0,0,.6)}.swagger-ui .b--black-50{border-color:rgba(0,0,0,.5)}.swagger-ui .b--black-40{border-color:rgba(0,0,0,.4)}.swagger-ui .b--black-30{border-color:rgba(0,0,0,.3)}.swagger-ui .b--black-20{border-color:rgba(0,0,0,.2)}.swagger-ui .b--black-10{border-color:rgba(0,0,0,.1)}.swagger-ui .b--black-05{border-color:rgba(0,0,0,.05)}.swagger-ui .b--black-025{border-color:rgba(0,0,0,.025)}.swagger-ui .b--black-0125{border-color:rgba(0,0,0,.013)}.swagger-ui .b--dark-red{border-color:#e7040f}.swagger-ui .b--red{border-color:#ff4136}.swagger-ui .b--light-red{border-color:#ff725c}.swagger-ui .b--orange{border-color:#ff6300}.swagger-ui .b--gold{border-color:#ffb700}.swagger-ui .b--yellow{border-color:gold}.swagger-ui .b--light-yellow{border-color:#fbf1a9}.swagger-ui .b--purple{border-color:#5e2ca5}.swagger-ui .b--light-purple{border-color:#a463f2}.swagger-ui .b--dark-pink{border-color:#d5008f}.swagger-ui .b--hot-pink{border-color:#ff41b4}.swagger-ui .b--pink{border-color:#ff80cc}.swagger-ui .b--light-pink{border-color:#ffa3d7}.swagger-ui .b--dark-green{border-color:#137752}.swagger-ui .b--green{border-color:#19a974}.swagger-ui .b--light-green{border-color:#9eebcf}.swagger-ui .b--navy{border-color:#001b44}.swagger-ui .b--dark-blue{border-color:#00449e}.swagger-ui .b--blue{border-color:#357edd}.swagger-ui .b--light-blue{border-color:#96ccff}.swagger-ui .b--lightest-blue{border-color:#cdecff}.swagger-ui .b--washed-blue{border-color:#f6fffe}.swagger-ui .b--washed-green{border-color:#e8fdf5}.swagger-ui .b--washed-yellow{border-color:#fffceb}.swagger-ui .b--washed-red{border-color:#ffdfdf}.swagger-ui .b--transparent{border-color:transparent}.swagger-ui .b--inherit{border-color:inherit}.swagger-ui .br0{border-radius:0}.swagger-ui .br1{border-radius:.125rem}.swagger-ui .br2{border-radius:.25rem}.swagger-ui .br3{border-radius:.5rem}.swagger-ui .br4{border-radius:1rem}.swagger-ui .br-100{border-radius:100%}.swagger-ui .br-pill{border-radius:9999px}.swagger-ui .br--bottom{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left{border-bottom-right-radius:0;border-top-right-radius:0}@media screen and (min-width:30em){.swagger-ui .br0-ns{border-radius:0}.swagger-ui .br1-ns{border-radius:.125rem}.swagger-ui .br2-ns{border-radius:.25rem}.swagger-ui .br3-ns{border-radius:.5rem}.swagger-ui .br4-ns{border-radius:1rem}.swagger-ui .br-100-ns{border-radius:100%}.swagger-ui .br-pill-ns{border-radius:9999px}.swagger-ui .br--bottom-ns{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-ns{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-ns{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-ns{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .br0-m{border-radius:0}.swagger-ui .br1-m{border-radius:.125rem}.swagger-ui .br2-m{border-radius:.25rem}.swagger-ui .br3-m{border-radius:.5rem}.swagger-ui .br4-m{border-radius:1rem}.swagger-ui .br-100-m{border-radius:100%}.swagger-ui .br-pill-m{border-radius:9999px}.swagger-ui .br--bottom-m{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-m{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-m{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-m{border-bottom-right-radius:0;border-top-right-radius:0}}@media screen and (min-width:60em){.swagger-ui .br0-l{border-radius:0}.swagger-ui .br1-l{border-radius:.125rem}.swagger-ui .br2-l{border-radius:.25rem}.swagger-ui .br3-l{border-radius:.5rem}.swagger-ui .br4-l{border-radius:1rem}.swagger-ui .br-100-l{border-radius:100%}.swagger-ui .br-pill-l{border-radius:9999px}.swagger-ui .br--bottom-l{border-top-left-radius:0;border-top-right-radius:0}.swagger-ui .br--top-l{border-bottom-left-radius:0;border-bottom-right-radius:0}.swagger-ui .br--right-l{border-bottom-left-radius:0;border-top-left-radius:0}.swagger-ui .br--left-l{border-bottom-right-radius:0;border-top-right-radius:0}}.swagger-ui .b--dotted{border-style:dotted}.swagger-ui .b--dashed{border-style:dashed}.swagger-ui .b--solid{border-style:solid}.swagger-ui .b--none{border-style:none}@media screen and (min-width:30em){.swagger-ui .b--dotted-ns{border-style:dotted}.swagger-ui .b--dashed-ns{border-style:dashed}.swagger-ui .b--solid-ns{border-style:solid}.swagger-ui .b--none-ns{border-style:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .b--dotted-m{border-style:dotted}.swagger-ui .b--dashed-m{border-style:dashed}.swagger-ui .b--solid-m{border-style:solid}.swagger-ui .b--none-m{border-style:none}}@media screen and (min-width:60em){.swagger-ui .b--dotted-l{border-style:dotted}.swagger-ui .b--dashed-l{border-style:dashed}.swagger-ui .b--solid-l{border-style:solid}.swagger-ui .b--none-l{border-style:none}}.swagger-ui .bw0{border-width:0}.swagger-ui .bw1{border-width:.125rem}.swagger-ui .bw2{border-width:.25rem}.swagger-ui .bw3{border-width:.5rem}.swagger-ui .bw4{border-width:1rem}.swagger-ui .bw5{border-width:2rem}.swagger-ui .bt-0{border-top-width:0}.swagger-ui .br-0{border-right-width:0}.swagger-ui .bb-0{border-bottom-width:0}.swagger-ui .bl-0{border-left-width:0}@media screen and (min-width:30em){.swagger-ui .bw0-ns{border-width:0}.swagger-ui .bw1-ns{border-width:.125rem}.swagger-ui .bw2-ns{border-width:.25rem}.swagger-ui .bw3-ns{border-width:.5rem}.swagger-ui .bw4-ns{border-width:1rem}.swagger-ui .bw5-ns{border-width:2rem}.swagger-ui .bt-0-ns{border-top-width:0}.swagger-ui .br-0-ns{border-right-width:0}.swagger-ui .bb-0-ns{border-bottom-width:0}.swagger-ui .bl-0-ns{border-left-width:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .bw0-m{border-width:0}.swagger-ui .bw1-m{border-width:.125rem}.swagger-ui .bw2-m{border-width:.25rem}.swagger-ui .bw3-m{border-width:.5rem}.swagger-ui .bw4-m{border-width:1rem}.swagger-ui .bw5-m{border-width:2rem}.swagger-ui .bt-0-m{border-top-width:0}.swagger-ui .br-0-m{border-right-width:0}.swagger-ui .bb-0-m{border-bottom-width:0}.swagger-ui .bl-0-m{border-left-width:0}}@media screen and (min-width:60em){.swagger-ui .bw0-l{border-width:0}.swagger-ui .bw1-l{border-width:.125rem}.swagger-ui .bw2-l{border-width:.25rem}.swagger-ui .bw3-l{border-width:.5rem}.swagger-ui .bw4-l{border-width:1rem}.swagger-ui .bw5-l{border-width:2rem}.swagger-ui .bt-0-l{border-top-width:0}.swagger-ui .br-0-l{border-right-width:0}.swagger-ui .bb-0-l{border-bottom-width:0}.swagger-ui .bl-0-l{border-left-width:0}}.swagger-ui .shadow-1{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}@media screen and (min-width:30em){.swagger-ui .shadow-1-ns{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-ns{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-ns{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-ns{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-ns{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .shadow-1-m{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-m{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-m{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-m{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-m{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}@media screen and (min-width:60em){.swagger-ui .shadow-1-l{box-shadow:0 0 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-2-l{box-shadow:0 0 8px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-3-l{box-shadow:2px 2px 4px 2px rgba(0,0,0,.2)}.swagger-ui .shadow-4-l{box-shadow:2px 2px 8px 0 rgba(0,0,0,.2)}.swagger-ui .shadow-5-l{box-shadow:4px 4px 8px 0 rgba(0,0,0,.2)}}.swagger-ui .pre{overflow-x:auto;overflow-y:hidden;overflow:scroll}.swagger-ui .top-0{top:0}.swagger-ui .right-0{right:0}.swagger-ui .bottom-0{bottom:0}.swagger-ui .left-0{left:0}.swagger-ui .top-1{top:1rem}.swagger-ui .right-1{right:1rem}.swagger-ui .bottom-1{bottom:1rem}.swagger-ui .left-1{left:1rem}.swagger-ui .top-2{top:2rem}.swagger-ui .right-2{right:2rem}.swagger-ui .bottom-2{bottom:2rem}.swagger-ui .left-2{left:2rem}.swagger-ui .top--1{top:-1rem}.swagger-ui .right--1{right:-1rem}.swagger-ui .bottom--1{bottom:-1rem}.swagger-ui .left--1{left:-1rem}.swagger-ui .top--2{top:-2rem}.swagger-ui .right--2{right:-2rem}.swagger-ui .bottom--2{bottom:-2rem}.swagger-ui .left--2{left:-2rem}.swagger-ui .absolute--fill{bottom:0;left:0;right:0;top:0}@media screen and (min-width:30em){.swagger-ui .top-0-ns{top:0}.swagger-ui .left-0-ns{left:0}.swagger-ui .right-0-ns{right:0}.swagger-ui .bottom-0-ns{bottom:0}.swagger-ui .top-1-ns{top:1rem}.swagger-ui .left-1-ns{left:1rem}.swagger-ui .right-1-ns{right:1rem}.swagger-ui .bottom-1-ns{bottom:1rem}.swagger-ui .top-2-ns{top:2rem}.swagger-ui .left-2-ns{left:2rem}.swagger-ui .right-2-ns{right:2rem}.swagger-ui .bottom-2-ns{bottom:2rem}.swagger-ui .top--1-ns{top:-1rem}.swagger-ui .right--1-ns{right:-1rem}.swagger-ui .bottom--1-ns{bottom:-1rem}.swagger-ui .left--1-ns{left:-1rem}.swagger-ui .top--2-ns{top:-2rem}.swagger-ui .right--2-ns{right:-2rem}.swagger-ui .bottom--2-ns{bottom:-2rem}.swagger-ui .left--2-ns{left:-2rem}.swagger-ui .absolute--fill-ns{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .top-0-m{top:0}.swagger-ui .left-0-m{left:0}.swagger-ui .right-0-m{right:0}.swagger-ui .bottom-0-m{bottom:0}.swagger-ui .top-1-m{top:1rem}.swagger-ui .left-1-m{left:1rem}.swagger-ui .right-1-m{right:1rem}.swagger-ui .bottom-1-m{bottom:1rem}.swagger-ui .top-2-m{top:2rem}.swagger-ui .left-2-m{left:2rem}.swagger-ui .right-2-m{right:2rem}.swagger-ui .bottom-2-m{bottom:2rem}.swagger-ui .top--1-m{top:-1rem}.swagger-ui .right--1-m{right:-1rem}.swagger-ui .bottom--1-m{bottom:-1rem}.swagger-ui .left--1-m{left:-1rem}.swagger-ui .top--2-m{top:-2rem}.swagger-ui .right--2-m{right:-2rem}.swagger-ui .bottom--2-m{bottom:-2rem}.swagger-ui .left--2-m{left:-2rem}.swagger-ui .absolute--fill-m{bottom:0;left:0;right:0;top:0}}@media screen and (min-width:60em){.swagger-ui .top-0-l{top:0}.swagger-ui .left-0-l{left:0}.swagger-ui .right-0-l{right:0}.swagger-ui .bottom-0-l{bottom:0}.swagger-ui .top-1-l{top:1rem}.swagger-ui .left-1-l{left:1rem}.swagger-ui .right-1-l{right:1rem}.swagger-ui .bottom-1-l{bottom:1rem}.swagger-ui .top-2-l{top:2rem}.swagger-ui .left-2-l{left:2rem}.swagger-ui .right-2-l{right:2rem}.swagger-ui .bottom-2-l{bottom:2rem}.swagger-ui .top--1-l{top:-1rem}.swagger-ui .right--1-l{right:-1rem}.swagger-ui .bottom--1-l{bottom:-1rem}.swagger-ui .left--1-l{left:-1rem}.swagger-ui .top--2-l{top:-2rem}.swagger-ui .right--2-l{right:-2rem}.swagger-ui .bottom--2-l{bottom:-2rem}.swagger-ui .left--2-l{left:-2rem}.swagger-ui .absolute--fill-l{bottom:0;left:0;right:0;top:0}}.swagger-ui .cf:after,.swagger-ui .cf:before{content:" ";display:table}.swagger-ui .cf:after{clear:both}.swagger-ui .cf{zoom:1}.swagger-ui .cl{clear:left}.swagger-ui .cr{clear:right}.swagger-ui .cb{clear:both}.swagger-ui .cn{clear:none}@media screen and (min-width:30em){.swagger-ui .cl-ns{clear:left}.swagger-ui .cr-ns{clear:right}.swagger-ui .cb-ns{clear:both}.swagger-ui .cn-ns{clear:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .cl-m{clear:left}.swagger-ui .cr-m{clear:right}.swagger-ui .cb-m{clear:both}.swagger-ui .cn-m{clear:none}}@media screen and (min-width:60em){.swagger-ui .cl-l{clear:left}.swagger-ui .cr-l{clear:right}.swagger-ui .cb-l{clear:both}.swagger-ui .cn-l{clear:none}}.swagger-ui .flex{display:flex}.swagger-ui .inline-flex{display:inline-flex}.swagger-ui .flex-auto{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none{flex:none}.swagger-ui .flex-column{flex-direction:column}.swagger-ui .flex-row{flex-direction:row}.swagger-ui .flex-wrap{flex-wrap:wrap}.swagger-ui .flex-nowrap{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse{flex-direction:column-reverse}.swagger-ui .flex-row-reverse{flex-direction:row-reverse}.swagger-ui .items-start{align-items:flex-start}.swagger-ui .items-end{align-items:flex-end}.swagger-ui .items-center{align-items:center}.swagger-ui .items-baseline{align-items:baseline}.swagger-ui .items-stretch{align-items:stretch}.swagger-ui .self-start{align-self:flex-start}.swagger-ui .self-end{align-self:flex-end}.swagger-ui .self-center{align-self:center}.swagger-ui .self-baseline{align-self:baseline}.swagger-ui .self-stretch{align-self:stretch}.swagger-ui .justify-start{justify-content:flex-start}.swagger-ui .justify-end{justify-content:flex-end}.swagger-ui .justify-center{justify-content:center}.swagger-ui .justify-between{justify-content:space-between}.swagger-ui .justify-around{justify-content:space-around}.swagger-ui .content-start{align-content:flex-start}.swagger-ui .content-end{align-content:flex-end}.swagger-ui .content-center{align-content:center}.swagger-ui .content-between{align-content:space-between}.swagger-ui .content-around{align-content:space-around}.swagger-ui .content-stretch{align-content:stretch}.swagger-ui .order-0{order:0}.swagger-ui .order-1{order:1}.swagger-ui .order-2{order:2}.swagger-ui .order-3{order:3}.swagger-ui .order-4{order:4}.swagger-ui .order-5{order:5}.swagger-ui .order-6{order:6}.swagger-ui .order-7{order:7}.swagger-ui .order-8{order:8}.swagger-ui .order-last{order:99999}.swagger-ui .flex-grow-0{flex-grow:0}.swagger-ui .flex-grow-1{flex-grow:1}.swagger-ui .flex-shrink-0{flex-shrink:0}.swagger-ui .flex-shrink-1{flex-shrink:1}@media screen and (min-width:30em){.swagger-ui .flex-ns{display:flex}.swagger-ui .inline-flex-ns{display:inline-flex}.swagger-ui .flex-auto-ns{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-ns{flex:none}.swagger-ui .flex-column-ns{flex-direction:column}.swagger-ui .flex-row-ns{flex-direction:row}.swagger-ui .flex-wrap-ns{flex-wrap:wrap}.swagger-ui .flex-nowrap-ns{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-ns{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-ns{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-ns{flex-direction:row-reverse}.swagger-ui .items-start-ns{align-items:flex-start}.swagger-ui .items-end-ns{align-items:flex-end}.swagger-ui .items-center-ns{align-items:center}.swagger-ui .items-baseline-ns{align-items:baseline}.swagger-ui .items-stretch-ns{align-items:stretch}.swagger-ui .self-start-ns{align-self:flex-start}.swagger-ui .self-end-ns{align-self:flex-end}.swagger-ui .self-center-ns{align-self:center}.swagger-ui .self-baseline-ns{align-self:baseline}.swagger-ui .self-stretch-ns{align-self:stretch}.swagger-ui .justify-start-ns{justify-content:flex-start}.swagger-ui .justify-end-ns{justify-content:flex-end}.swagger-ui .justify-center-ns{justify-content:center}.swagger-ui .justify-between-ns{justify-content:space-between}.swagger-ui .justify-around-ns{justify-content:space-around}.swagger-ui .content-start-ns{align-content:flex-start}.swagger-ui .content-end-ns{align-content:flex-end}.swagger-ui .content-center-ns{align-content:center}.swagger-ui .content-between-ns{align-content:space-between}.swagger-ui .content-around-ns{align-content:space-around}.swagger-ui .content-stretch-ns{align-content:stretch}.swagger-ui .order-0-ns{order:0}.swagger-ui .order-1-ns{order:1}.swagger-ui .order-2-ns{order:2}.swagger-ui .order-3-ns{order:3}.swagger-ui .order-4-ns{order:4}.swagger-ui .order-5-ns{order:5}.swagger-ui .order-6-ns{order:6}.swagger-ui .order-7-ns{order:7}.swagger-ui .order-8-ns{order:8}.swagger-ui .order-last-ns{order:99999}.swagger-ui .flex-grow-0-ns{flex-grow:0}.swagger-ui .flex-grow-1-ns{flex-grow:1}.swagger-ui .flex-shrink-0-ns{flex-shrink:0}.swagger-ui .flex-shrink-1-ns{flex-shrink:1}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .flex-m{display:flex}.swagger-ui .inline-flex-m{display:inline-flex}.swagger-ui .flex-auto-m{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-m{flex:none}.swagger-ui .flex-column-m{flex-direction:column}.swagger-ui .flex-row-m{flex-direction:row}.swagger-ui .flex-wrap-m{flex-wrap:wrap}.swagger-ui .flex-nowrap-m{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-m{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-m{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-m{flex-direction:row-reverse}.swagger-ui .items-start-m{align-items:flex-start}.swagger-ui .items-end-m{align-items:flex-end}.swagger-ui .items-center-m{align-items:center}.swagger-ui .items-baseline-m{align-items:baseline}.swagger-ui .items-stretch-m{align-items:stretch}.swagger-ui .self-start-m{align-self:flex-start}.swagger-ui .self-end-m{align-self:flex-end}.swagger-ui .self-center-m{align-self:center}.swagger-ui .self-baseline-m{align-self:baseline}.swagger-ui .self-stretch-m{align-self:stretch}.swagger-ui .justify-start-m{justify-content:flex-start}.swagger-ui .justify-end-m{justify-content:flex-end}.swagger-ui .justify-center-m{justify-content:center}.swagger-ui .justify-between-m{justify-content:space-between}.swagger-ui .justify-around-m{justify-content:space-around}.swagger-ui .content-start-m{align-content:flex-start}.swagger-ui .content-end-m{align-content:flex-end}.swagger-ui .content-center-m{align-content:center}.swagger-ui .content-between-m{align-content:space-between}.swagger-ui .content-around-m{align-content:space-around}.swagger-ui .content-stretch-m{align-content:stretch}.swagger-ui .order-0-m{order:0}.swagger-ui .order-1-m{order:1}.swagger-ui .order-2-m{order:2}.swagger-ui .order-3-m{order:3}.swagger-ui .order-4-m{order:4}.swagger-ui .order-5-m{order:5}.swagger-ui .order-6-m{order:6}.swagger-ui .order-7-m{order:7}.swagger-ui .order-8-m{order:8}.swagger-ui .order-last-m{order:99999}.swagger-ui .flex-grow-0-m{flex-grow:0}.swagger-ui .flex-grow-1-m{flex-grow:1}.swagger-ui .flex-shrink-0-m{flex-shrink:0}.swagger-ui .flex-shrink-1-m{flex-shrink:1}}@media screen and (min-width:60em){.swagger-ui .flex-l{display:flex}.swagger-ui .inline-flex-l{display:inline-flex}.swagger-ui .flex-auto-l{flex:1 1 auto;min-height:0;min-width:0}.swagger-ui .flex-none-l{flex:none}.swagger-ui .flex-column-l{flex-direction:column}.swagger-ui .flex-row-l{flex-direction:row}.swagger-ui .flex-wrap-l{flex-wrap:wrap}.swagger-ui .flex-nowrap-l{flex-wrap:nowrap}.swagger-ui .flex-wrap-reverse-l{flex-wrap:wrap-reverse}.swagger-ui .flex-column-reverse-l{flex-direction:column-reverse}.swagger-ui .flex-row-reverse-l{flex-direction:row-reverse}.swagger-ui .items-start-l{align-items:flex-start}.swagger-ui .items-end-l{align-items:flex-end}.swagger-ui .items-center-l{align-items:center}.swagger-ui .items-baseline-l{align-items:baseline}.swagger-ui .items-stretch-l{align-items:stretch}.swagger-ui .self-start-l{align-self:flex-start}.swagger-ui .self-end-l{align-self:flex-end}.swagger-ui .self-center-l{align-self:center}.swagger-ui .self-baseline-l{align-self:baseline}.swagger-ui .self-stretch-l{align-self:stretch}.swagger-ui .justify-start-l{justify-content:flex-start}.swagger-ui .justify-end-l{justify-content:flex-end}.swagger-ui .justify-center-l{justify-content:center}.swagger-ui .justify-between-l{justify-content:space-between}.swagger-ui .justify-around-l{justify-content:space-around}.swagger-ui .content-start-l{align-content:flex-start}.swagger-ui .content-end-l{align-content:flex-end}.swagger-ui .content-center-l{align-content:center}.swagger-ui .content-between-l{align-content:space-between}.swagger-ui .content-around-l{align-content:space-around}.swagger-ui .content-stretch-l{align-content:stretch}.swagger-ui .order-0-l{order:0}.swagger-ui .order-1-l{order:1}.swagger-ui .order-2-l{order:2}.swagger-ui .order-3-l{order:3}.swagger-ui .order-4-l{order:4}.swagger-ui .order-5-l{order:5}.swagger-ui .order-6-l{order:6}.swagger-ui .order-7-l{order:7}.swagger-ui .order-8-l{order:8}.swagger-ui .order-last-l{order:99999}.swagger-ui .flex-grow-0-l{flex-grow:0}.swagger-ui .flex-grow-1-l{flex-grow:1}.swagger-ui .flex-shrink-0-l{flex-shrink:0}.swagger-ui .flex-shrink-1-l{flex-shrink:1}}.swagger-ui .dn{display:none}.swagger-ui .di{display:inline}.swagger-ui .db{display:block}.swagger-ui .dib{display:inline-block}.swagger-ui .dit{display:inline-table}.swagger-ui .dt{display:table}.swagger-ui .dtc{display:table-cell}.swagger-ui .dt-row{display:table-row}.swagger-ui .dt-row-group{display:table-row-group}.swagger-ui .dt-column{display:table-column}.swagger-ui .dt-column-group{display:table-column-group}.swagger-ui .dt--fixed{table-layout:fixed;width:100%}@media screen and (min-width:30em){.swagger-ui .dn-ns{display:none}.swagger-ui .di-ns{display:inline}.swagger-ui .db-ns{display:block}.swagger-ui .dib-ns{display:inline-block}.swagger-ui .dit-ns{display:inline-table}.swagger-ui .dt-ns{display:table}.swagger-ui .dtc-ns{display:table-cell}.swagger-ui .dt-row-ns{display:table-row}.swagger-ui .dt-row-group-ns{display:table-row-group}.swagger-ui .dt-column-ns{display:table-column}.swagger-ui .dt-column-group-ns{display:table-column-group}.swagger-ui .dt--fixed-ns{table-layout:fixed;width:100%}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .dn-m{display:none}.swagger-ui .di-m{display:inline}.swagger-ui .db-m{display:block}.swagger-ui .dib-m{display:inline-block}.swagger-ui .dit-m{display:inline-table}.swagger-ui .dt-m{display:table}.swagger-ui .dtc-m{display:table-cell}.swagger-ui .dt-row-m{display:table-row}.swagger-ui .dt-row-group-m{display:table-row-group}.swagger-ui .dt-column-m{display:table-column}.swagger-ui .dt-column-group-m{display:table-column-group}.swagger-ui .dt--fixed-m{table-layout:fixed;width:100%}}@media screen and (min-width:60em){.swagger-ui .dn-l{display:none}.swagger-ui .di-l{display:inline}.swagger-ui .db-l{display:block}.swagger-ui .dib-l{display:inline-block}.swagger-ui .dit-l{display:inline-table}.swagger-ui .dt-l{display:table}.swagger-ui .dtc-l{display:table-cell}.swagger-ui .dt-row-l{display:table-row}.swagger-ui .dt-row-group-l{display:table-row-group}.swagger-ui .dt-column-l{display:table-column}.swagger-ui .dt-column-group-l{display:table-column-group}.swagger-ui .dt--fixed-l{table-layout:fixed;width:100%}}.swagger-ui .fl{_display:inline;float:left}.swagger-ui .fr{_display:inline;float:right}.swagger-ui .fn{float:none}@media screen and (min-width:30em){.swagger-ui .fl-ns{_display:inline;float:left}.swagger-ui .fr-ns{_display:inline;float:right}.swagger-ui .fn-ns{float:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .fl-m{_display:inline;float:left}.swagger-ui .fr-m{_display:inline;float:right}.swagger-ui .fn-m{float:none}}@media screen and (min-width:60em){.swagger-ui .fl-l{_display:inline;float:left}.swagger-ui .fr-l{_display:inline;float:right}.swagger-ui .fn-l{float:none}}.swagger-ui .sans-serif{font-family:-apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica,helvetica neue,ubuntu,roboto,noto,segoe ui,arial,sans-serif}.swagger-ui .serif{font-family:georgia,serif}.swagger-ui .system-sans-serif{font-family:sans-serif}.swagger-ui .system-serif{font-family:serif}.swagger-ui .code,.swagger-ui code{font-family:Consolas,monaco,monospace}.swagger-ui .courier{font-family:Courier Next,courier,monospace}.swagger-ui .helvetica{font-family:helvetica neue,helvetica,sans-serif}.swagger-ui .avenir{font-family:avenir next,avenir,sans-serif}.swagger-ui .athelas{font-family:athelas,georgia,serif}.swagger-ui .georgia{font-family:georgia,serif}.swagger-ui .times{font-family:times,serif}.swagger-ui .bodoni{font-family:Bodoni MT,serif}.swagger-ui .calisto{font-family:Calisto MT,serif}.swagger-ui .garamond{font-family:garamond,serif}.swagger-ui .baskerville{font-family:baskerville,serif}.swagger-ui .i{font-style:italic}.swagger-ui .fs-normal{font-style:normal}@media screen and (min-width:30em){.swagger-ui .i-ns{font-style:italic}.swagger-ui .fs-normal-ns{font-style:normal}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .i-m{font-style:italic}.swagger-ui .fs-normal-m{font-style:normal}}@media screen and (min-width:60em){.swagger-ui .i-l{font-style:italic}.swagger-ui .fs-normal-l{font-style:normal}}.swagger-ui .normal{font-weight:400}.swagger-ui .b{font-weight:700}.swagger-ui .fw1{font-weight:100}.swagger-ui .fw2{font-weight:200}.swagger-ui .fw3{font-weight:300}.swagger-ui .fw4{font-weight:400}.swagger-ui .fw5{font-weight:500}.swagger-ui .fw6{font-weight:600}.swagger-ui .fw7{font-weight:700}.swagger-ui .fw8{font-weight:800}.swagger-ui .fw9{font-weight:900}@media screen and (min-width:30em){.swagger-ui .normal-ns{font-weight:400}.swagger-ui .b-ns{font-weight:700}.swagger-ui .fw1-ns{font-weight:100}.swagger-ui .fw2-ns{font-weight:200}.swagger-ui .fw3-ns{font-weight:300}.swagger-ui .fw4-ns{font-weight:400}.swagger-ui .fw5-ns{font-weight:500}.swagger-ui .fw6-ns{font-weight:600}.swagger-ui .fw7-ns{font-weight:700}.swagger-ui .fw8-ns{font-weight:800}.swagger-ui .fw9-ns{font-weight:900}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .normal-m{font-weight:400}.swagger-ui .b-m{font-weight:700}.swagger-ui .fw1-m{font-weight:100}.swagger-ui .fw2-m{font-weight:200}.swagger-ui .fw3-m{font-weight:300}.swagger-ui .fw4-m{font-weight:400}.swagger-ui .fw5-m{font-weight:500}.swagger-ui .fw6-m{font-weight:600}.swagger-ui .fw7-m{font-weight:700}.swagger-ui .fw8-m{font-weight:800}.swagger-ui .fw9-m{font-weight:900}}@media screen and (min-width:60em){.swagger-ui .normal-l{font-weight:400}.swagger-ui .b-l{font-weight:700}.swagger-ui .fw1-l{font-weight:100}.swagger-ui .fw2-l{font-weight:200}.swagger-ui .fw3-l{font-weight:300}.swagger-ui .fw4-l{font-weight:400}.swagger-ui .fw5-l{font-weight:500}.swagger-ui .fw6-l{font-weight:600}.swagger-ui .fw7-l{font-weight:700}.swagger-ui .fw8-l{font-weight:800}.swagger-ui .fw9-l{font-weight:900}}.swagger-ui .input-reset{-webkit-appearance:none;-moz-appearance:none}.swagger-ui .button-reset::-moz-focus-inner,.swagger-ui .input-reset::-moz-focus-inner{border:0;padding:0}.swagger-ui .h1{height:1rem}.swagger-ui .h2{height:2rem}.swagger-ui .h3{height:4rem}.swagger-ui .h4{height:8rem}.swagger-ui .h5{height:16rem}.swagger-ui .h-25{height:25%}.swagger-ui .h-50{height:50%}.swagger-ui .h-75{height:75%}.swagger-ui .h-100{height:100%}.swagger-ui .min-h-100{min-height:100%}.swagger-ui .vh-25{height:25vh}.swagger-ui .vh-50{height:50vh}.swagger-ui .vh-75{height:75vh}.swagger-ui .vh-100{height:100vh}.swagger-ui .min-vh-100{min-height:100vh}.swagger-ui .h-auto{height:auto}.swagger-ui .h-inherit{height:inherit}@media screen and (min-width:30em){.swagger-ui .h1-ns{height:1rem}.swagger-ui .h2-ns{height:2rem}.swagger-ui .h3-ns{height:4rem}.swagger-ui .h4-ns{height:8rem}.swagger-ui .h5-ns{height:16rem}.swagger-ui .h-25-ns{height:25%}.swagger-ui .h-50-ns{height:50%}.swagger-ui .h-75-ns{height:75%}.swagger-ui .h-100-ns{height:100%}.swagger-ui .min-h-100-ns{min-height:100%}.swagger-ui .vh-25-ns{height:25vh}.swagger-ui .vh-50-ns{height:50vh}.swagger-ui .vh-75-ns{height:75vh}.swagger-ui .vh-100-ns{height:100vh}.swagger-ui .min-vh-100-ns{min-height:100vh}.swagger-ui .h-auto-ns{height:auto}.swagger-ui .h-inherit-ns{height:inherit}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .h1-m{height:1rem}.swagger-ui .h2-m{height:2rem}.swagger-ui .h3-m{height:4rem}.swagger-ui .h4-m{height:8rem}.swagger-ui .h5-m{height:16rem}.swagger-ui .h-25-m{height:25%}.swagger-ui .h-50-m{height:50%}.swagger-ui .h-75-m{height:75%}.swagger-ui .h-100-m{height:100%}.swagger-ui .min-h-100-m{min-height:100%}.swagger-ui .vh-25-m{height:25vh}.swagger-ui .vh-50-m{height:50vh}.swagger-ui .vh-75-m{height:75vh}.swagger-ui .vh-100-m{height:100vh}.swagger-ui .min-vh-100-m{min-height:100vh}.swagger-ui .h-auto-m{height:auto}.swagger-ui .h-inherit-m{height:inherit}}@media screen and (min-width:60em){.swagger-ui .h1-l{height:1rem}.swagger-ui .h2-l{height:2rem}.swagger-ui .h3-l{height:4rem}.swagger-ui .h4-l{height:8rem}.swagger-ui .h5-l{height:16rem}.swagger-ui .h-25-l{height:25%}.swagger-ui .h-50-l{height:50%}.swagger-ui .h-75-l{height:75%}.swagger-ui .h-100-l{height:100%}.swagger-ui .min-h-100-l{min-height:100%}.swagger-ui .vh-25-l{height:25vh}.swagger-ui .vh-50-l{height:50vh}.swagger-ui .vh-75-l{height:75vh}.swagger-ui .vh-100-l{height:100vh}.swagger-ui .min-vh-100-l{min-height:100vh}.swagger-ui .h-auto-l{height:auto}.swagger-ui .h-inherit-l{height:inherit}}.swagger-ui .tracked{letter-spacing:.1em}.swagger-ui .tracked-tight{letter-spacing:-.05em}.swagger-ui .tracked-mega{letter-spacing:.25em}@media screen and (min-width:30em){.swagger-ui .tracked-ns{letter-spacing:.1em}.swagger-ui .tracked-tight-ns{letter-spacing:-.05em}.swagger-ui .tracked-mega-ns{letter-spacing:.25em}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tracked-m{letter-spacing:.1em}.swagger-ui .tracked-tight-m{letter-spacing:-.05em}.swagger-ui .tracked-mega-m{letter-spacing:.25em}}@media screen and (min-width:60em){.swagger-ui .tracked-l{letter-spacing:.1em}.swagger-ui .tracked-tight-l{letter-spacing:-.05em}.swagger-ui .tracked-mega-l{letter-spacing:.25em}}.swagger-ui .lh-solid{line-height:1}.swagger-ui .lh-title{line-height:1.25}.swagger-ui .lh-copy{line-height:1.5}@media screen and (min-width:30em){.swagger-ui .lh-solid-ns{line-height:1}.swagger-ui .lh-title-ns{line-height:1.25}.swagger-ui .lh-copy-ns{line-height:1.5}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .lh-solid-m{line-height:1}.swagger-ui .lh-title-m{line-height:1.25}.swagger-ui .lh-copy-m{line-height:1.5}}@media screen and (min-width:60em){.swagger-ui .lh-solid-l{line-height:1}.swagger-ui .lh-title-l{line-height:1.25}.swagger-ui .lh-copy-l{line-height:1.5}}.swagger-ui .link{-webkit-text-decoration:none;text-decoration:none}.swagger-ui .link,.swagger-ui .link:active,.swagger-ui .link:focus,.swagger-ui .link:hover,.swagger-ui .link:link,.swagger-ui .link:visited{transition:color .15s ease-in}.swagger-ui .link:focus{outline:1px dotted currentColor}.swagger-ui .list{list-style-type:none}.swagger-ui .mw-100{max-width:100%}.swagger-ui .mw1{max-width:1rem}.swagger-ui .mw2{max-width:2rem}.swagger-ui .mw3{max-width:4rem}.swagger-ui .mw4{max-width:8rem}.swagger-ui .mw5{max-width:16rem}.swagger-ui .mw6{max-width:32rem}.swagger-ui .mw7{max-width:48rem}.swagger-ui .mw8{max-width:64rem}.swagger-ui .mw9{max-width:96rem}.swagger-ui .mw-none{max-width:none}@media screen and (min-width:30em){.swagger-ui .mw-100-ns{max-width:100%}.swagger-ui .mw1-ns{max-width:1rem}.swagger-ui .mw2-ns{max-width:2rem}.swagger-ui .mw3-ns{max-width:4rem}.swagger-ui .mw4-ns{max-width:8rem}.swagger-ui .mw5-ns{max-width:16rem}.swagger-ui .mw6-ns{max-width:32rem}.swagger-ui .mw7-ns{max-width:48rem}.swagger-ui .mw8-ns{max-width:64rem}.swagger-ui .mw9-ns{max-width:96rem}.swagger-ui .mw-none-ns{max-width:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .mw-100-m{max-width:100%}.swagger-ui .mw1-m{max-width:1rem}.swagger-ui .mw2-m{max-width:2rem}.swagger-ui .mw3-m{max-width:4rem}.swagger-ui .mw4-m{max-width:8rem}.swagger-ui .mw5-m{max-width:16rem}.swagger-ui .mw6-m{max-width:32rem}.swagger-ui .mw7-m{max-width:48rem}.swagger-ui .mw8-m{max-width:64rem}.swagger-ui .mw9-m{max-width:96rem}.swagger-ui .mw-none-m{max-width:none}}@media screen and (min-width:60em){.swagger-ui .mw-100-l{max-width:100%}.swagger-ui .mw1-l{max-width:1rem}.swagger-ui .mw2-l{max-width:2rem}.swagger-ui .mw3-l{max-width:4rem}.swagger-ui .mw4-l{max-width:8rem}.swagger-ui .mw5-l{max-width:16rem}.swagger-ui .mw6-l{max-width:32rem}.swagger-ui .mw7-l{max-width:48rem}.swagger-ui .mw8-l{max-width:64rem}.swagger-ui .mw9-l{max-width:96rem}.swagger-ui .mw-none-l{max-width:none}}.swagger-ui .w1{width:1rem}.swagger-ui .w2{width:2rem}.swagger-ui .w3{width:4rem}.swagger-ui .w4{width:8rem}.swagger-ui .w5{width:16rem}.swagger-ui .w-10{width:10%}.swagger-ui .w-20{width:20%}.swagger-ui .w-25{width:25%}.swagger-ui .w-30{width:30%}.swagger-ui .w-33{width:33%}.swagger-ui .w-34{width:34%}.swagger-ui .w-40{width:40%}.swagger-ui .w-50{width:50%}.swagger-ui .w-60{width:60%}.swagger-ui .w-70{width:70%}.swagger-ui .w-75{width:75%}.swagger-ui .w-80{width:80%}.swagger-ui .w-90{width:90%}.swagger-ui .w-100{width:100%}.swagger-ui .w-third{width:33.3333333333%}.swagger-ui .w-two-thirds{width:66.6666666667%}.swagger-ui .w-auto{width:auto}@media screen and (min-width:30em){.swagger-ui .w1-ns{width:1rem}.swagger-ui .w2-ns{width:2rem}.swagger-ui .w3-ns{width:4rem}.swagger-ui .w4-ns{width:8rem}.swagger-ui .w5-ns{width:16rem}.swagger-ui .w-10-ns{width:10%}.swagger-ui .w-20-ns{width:20%}.swagger-ui .w-25-ns{width:25%}.swagger-ui .w-30-ns{width:30%}.swagger-ui .w-33-ns{width:33%}.swagger-ui .w-34-ns{width:34%}.swagger-ui .w-40-ns{width:40%}.swagger-ui .w-50-ns{width:50%}.swagger-ui .w-60-ns{width:60%}.swagger-ui .w-70-ns{width:70%}.swagger-ui .w-75-ns{width:75%}.swagger-ui .w-80-ns{width:80%}.swagger-ui .w-90-ns{width:90%}.swagger-ui .w-100-ns{width:100%}.swagger-ui .w-third-ns{width:33.3333333333%}.swagger-ui .w-two-thirds-ns{width:66.6666666667%}.swagger-ui .w-auto-ns{width:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .w1-m{width:1rem}.swagger-ui .w2-m{width:2rem}.swagger-ui .w3-m{width:4rem}.swagger-ui .w4-m{width:8rem}.swagger-ui .w5-m{width:16rem}.swagger-ui .w-10-m{width:10%}.swagger-ui .w-20-m{width:20%}.swagger-ui .w-25-m{width:25%}.swagger-ui .w-30-m{width:30%}.swagger-ui .w-33-m{width:33%}.swagger-ui .w-34-m{width:34%}.swagger-ui .w-40-m{width:40%}.swagger-ui .w-50-m{width:50%}.swagger-ui .w-60-m{width:60%}.swagger-ui .w-70-m{width:70%}.swagger-ui .w-75-m{width:75%}.swagger-ui .w-80-m{width:80%}.swagger-ui .w-90-m{width:90%}.swagger-ui .w-100-m{width:100%}.swagger-ui .w-third-m{width:33.3333333333%}.swagger-ui .w-two-thirds-m{width:66.6666666667%}.swagger-ui .w-auto-m{width:auto}}@media screen and (min-width:60em){.swagger-ui .w1-l{width:1rem}.swagger-ui .w2-l{width:2rem}.swagger-ui .w3-l{width:4rem}.swagger-ui .w4-l{width:8rem}.swagger-ui .w5-l{width:16rem}.swagger-ui .w-10-l{width:10%}.swagger-ui .w-20-l{width:20%}.swagger-ui .w-25-l{width:25%}.swagger-ui .w-30-l{width:30%}.swagger-ui .w-33-l{width:33%}.swagger-ui .w-34-l{width:34%}.swagger-ui .w-40-l{width:40%}.swagger-ui .w-50-l{width:50%}.swagger-ui .w-60-l{width:60%}.swagger-ui .w-70-l{width:70%}.swagger-ui .w-75-l{width:75%}.swagger-ui .w-80-l{width:80%}.swagger-ui .w-90-l{width:90%}.swagger-ui .w-100-l{width:100%}.swagger-ui .w-third-l{width:33.3333333333%}.swagger-ui .w-two-thirds-l{width:66.6666666667%}.swagger-ui .w-auto-l{width:auto}}.swagger-ui .overflow-visible{overflow:visible}.swagger-ui .overflow-hidden{overflow:hidden}.swagger-ui .overflow-scroll{overflow:scroll}.swagger-ui .overflow-auto{overflow:auto}.swagger-ui .overflow-x-visible{overflow-x:visible}.swagger-ui .overflow-x-hidden{overflow-x:hidden}.swagger-ui .overflow-x-scroll{overflow-x:scroll}.swagger-ui .overflow-x-auto{overflow-x:auto}.swagger-ui .overflow-y-visible{overflow-y:visible}.swagger-ui .overflow-y-hidden{overflow-y:hidden}.swagger-ui .overflow-y-scroll{overflow-y:scroll}.swagger-ui .overflow-y-auto{overflow-y:auto}@media screen and (min-width:30em){.swagger-ui .overflow-visible-ns{overflow:visible}.swagger-ui .overflow-hidden-ns{overflow:hidden}.swagger-ui .overflow-scroll-ns{overflow:scroll}.swagger-ui .overflow-auto-ns{overflow:auto}.swagger-ui .overflow-x-visible-ns{overflow-x:visible}.swagger-ui .overflow-x-hidden-ns{overflow-x:hidden}.swagger-ui .overflow-x-scroll-ns{overflow-x:scroll}.swagger-ui .overflow-x-auto-ns{overflow-x:auto}.swagger-ui .overflow-y-visible-ns{overflow-y:visible}.swagger-ui .overflow-y-hidden-ns{overflow-y:hidden}.swagger-ui .overflow-y-scroll-ns{overflow-y:scroll}.swagger-ui .overflow-y-auto-ns{overflow-y:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .overflow-visible-m{overflow:visible}.swagger-ui .overflow-hidden-m{overflow:hidden}.swagger-ui .overflow-scroll-m{overflow:scroll}.swagger-ui .overflow-auto-m{overflow:auto}.swagger-ui .overflow-x-visible-m{overflow-x:visible}.swagger-ui .overflow-x-hidden-m{overflow-x:hidden}.swagger-ui .overflow-x-scroll-m{overflow-x:scroll}.swagger-ui .overflow-x-auto-m{overflow-x:auto}.swagger-ui .overflow-y-visible-m{overflow-y:visible}.swagger-ui .overflow-y-hidden-m{overflow-y:hidden}.swagger-ui .overflow-y-scroll-m{overflow-y:scroll}.swagger-ui .overflow-y-auto-m{overflow-y:auto}}@media screen and (min-width:60em){.swagger-ui .overflow-visible-l{overflow:visible}.swagger-ui .overflow-hidden-l{overflow:hidden}.swagger-ui .overflow-scroll-l{overflow:scroll}.swagger-ui .overflow-auto-l{overflow:auto}.swagger-ui .overflow-x-visible-l{overflow-x:visible}.swagger-ui .overflow-x-hidden-l{overflow-x:hidden}.swagger-ui .overflow-x-scroll-l{overflow-x:scroll}.swagger-ui .overflow-x-auto-l{overflow-x:auto}.swagger-ui .overflow-y-visible-l{overflow-y:visible}.swagger-ui .overflow-y-hidden-l{overflow-y:hidden}.swagger-ui .overflow-y-scroll-l{overflow-y:scroll}.swagger-ui .overflow-y-auto-l{overflow-y:auto}}.swagger-ui .static{position:static}.swagger-ui .relative{position:relative}.swagger-ui .absolute{position:absolute}.swagger-ui .fixed{position:fixed}@media screen and (min-width:30em){.swagger-ui .static-ns{position:static}.swagger-ui .relative-ns{position:relative}.swagger-ui .absolute-ns{position:absolute}.swagger-ui .fixed-ns{position:fixed}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .static-m{position:static}.swagger-ui .relative-m{position:relative}.swagger-ui .absolute-m{position:absolute}.swagger-ui .fixed-m{position:fixed}}@media screen and (min-width:60em){.swagger-ui .static-l{position:static}.swagger-ui .relative-l{position:relative}.swagger-ui .absolute-l{position:absolute}.swagger-ui .fixed-l{position:fixed}}.swagger-ui .o-100{opacity:1}.swagger-ui .o-90{opacity:.9}.swagger-ui .o-80{opacity:.8}.swagger-ui .o-70{opacity:.7}.swagger-ui .o-60{opacity:.6}.swagger-ui .o-50{opacity:.5}.swagger-ui .o-40{opacity:.4}.swagger-ui .o-30{opacity:.3}.swagger-ui .o-20{opacity:.2}.swagger-ui .o-10{opacity:.1}.swagger-ui .o-05{opacity:.05}.swagger-ui .o-025{opacity:.025}.swagger-ui .o-0{opacity:0}.swagger-ui .rotate-45{transform:rotate(45deg)}.swagger-ui .rotate-90{transform:rotate(90deg)}.swagger-ui .rotate-135{transform:rotate(135deg)}.swagger-ui .rotate-180{transform:rotate(180deg)}.swagger-ui .rotate-225{transform:rotate(225deg)}.swagger-ui .rotate-270{transform:rotate(270deg)}.swagger-ui .rotate-315{transform:rotate(315deg)}@media screen and (min-width:30em){.swagger-ui .rotate-45-ns{transform:rotate(45deg)}.swagger-ui .rotate-90-ns{transform:rotate(90deg)}.swagger-ui .rotate-135-ns{transform:rotate(135deg)}.swagger-ui .rotate-180-ns{transform:rotate(180deg)}.swagger-ui .rotate-225-ns{transform:rotate(225deg)}.swagger-ui .rotate-270-ns{transform:rotate(270deg)}.swagger-ui .rotate-315-ns{transform:rotate(315deg)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .rotate-45-m{transform:rotate(45deg)}.swagger-ui .rotate-90-m{transform:rotate(90deg)}.swagger-ui .rotate-135-m{transform:rotate(135deg)}.swagger-ui .rotate-180-m{transform:rotate(180deg)}.swagger-ui .rotate-225-m{transform:rotate(225deg)}.swagger-ui .rotate-270-m{transform:rotate(270deg)}.swagger-ui .rotate-315-m{transform:rotate(315deg)}}@media screen and (min-width:60em){.swagger-ui .rotate-45-l{transform:rotate(45deg)}.swagger-ui .rotate-90-l{transform:rotate(90deg)}.swagger-ui .rotate-135-l{transform:rotate(135deg)}.swagger-ui .rotate-180-l{transform:rotate(180deg)}.swagger-ui .rotate-225-l{transform:rotate(225deg)}.swagger-ui .rotate-270-l{transform:rotate(270deg)}.swagger-ui .rotate-315-l{transform:rotate(315deg)}}.swagger-ui .black-90{color:rgba(0,0,0,.9)}.swagger-ui .black-80{color:rgba(0,0,0,.8)}.swagger-ui .black-70{color:rgba(0,0,0,.7)}.swagger-ui .black-60{color:rgba(0,0,0,.6)}.swagger-ui .black-50{color:rgba(0,0,0,.5)}.swagger-ui .black-40{color:rgba(0,0,0,.4)}.swagger-ui .black-30{color:rgba(0,0,0,.3)}.swagger-ui .black-20{color:rgba(0,0,0,.2)}.swagger-ui .black-10{color:rgba(0,0,0,.1)}.swagger-ui .black-05{color:rgba(0,0,0,.05)}.swagger-ui .white-90{color:hsla(0,0%,100%,.9)}.swagger-ui .white-80{color:hsla(0,0%,100%,.8)}.swagger-ui .white-70{color:hsla(0,0%,100%,.7)}.swagger-ui .white-60{color:hsla(0,0%,100%,.6)}.swagger-ui .white-50{color:hsla(0,0%,100%,.5)}.swagger-ui .white-40{color:hsla(0,0%,100%,.4)}.swagger-ui .white-30{color:hsla(0,0%,100%,.3)}.swagger-ui .white-20{color:hsla(0,0%,100%,.2)}.swagger-ui .white-10{color:hsla(0,0%,100%,.1)}.swagger-ui .black{color:#000}.swagger-ui .near-black{color:#111}.swagger-ui .dark-gray{color:#333}.swagger-ui .mid-gray{color:#555}.swagger-ui .gray{color:#777}.swagger-ui .silver{color:#999}.swagger-ui .light-silver{color:#aaa}.swagger-ui .moon-gray{color:#ccc}.swagger-ui .light-gray{color:#eee}.swagger-ui .near-white{color:#f4f4f4}.swagger-ui .white{color:#fff}.swagger-ui .dark-red{color:#e7040f}.swagger-ui .red{color:#ff4136}.swagger-ui .light-red{color:#ff725c}.swagger-ui .orange{color:#ff6300}.swagger-ui .gold{color:#ffb700}.swagger-ui .yellow{color:gold}.swagger-ui .light-yellow{color:#fbf1a9}.swagger-ui .purple{color:#5e2ca5}.swagger-ui .light-purple{color:#a463f2}.swagger-ui .dark-pink{color:#d5008f}.swagger-ui .hot-pink{color:#ff41b4}.swagger-ui .pink{color:#ff80cc}.swagger-ui .light-pink{color:#ffa3d7}.swagger-ui .dark-green{color:#137752}.swagger-ui .green{color:#19a974}.swagger-ui .light-green{color:#9eebcf}.swagger-ui .navy{color:#001b44}.swagger-ui .dark-blue{color:#00449e}.swagger-ui .blue{color:#357edd}.swagger-ui .light-blue{color:#96ccff}.swagger-ui .lightest-blue{color:#cdecff}.swagger-ui .washed-blue{color:#f6fffe}.swagger-ui .washed-green{color:#e8fdf5}.swagger-ui .washed-yellow{color:#fffceb}.swagger-ui .washed-red{color:#ffdfdf}.swagger-ui .color-inherit{color:inherit}.swagger-ui .bg-black-90{background-color:rgba(0,0,0,.9)}.swagger-ui .bg-black-80{background-color:rgba(0,0,0,.8)}.swagger-ui .bg-black-70{background-color:rgba(0,0,0,.7)}.swagger-ui .bg-black-60{background-color:rgba(0,0,0,.6)}.swagger-ui .bg-black-50{background-color:rgba(0,0,0,.5)}.swagger-ui .bg-black-40{background-color:rgba(0,0,0,.4)}.swagger-ui .bg-black-30{background-color:rgba(0,0,0,.3)}.swagger-ui .bg-black-20{background-color:rgba(0,0,0,.2)}.swagger-ui .bg-black-10{background-color:rgba(0,0,0,.1)}.swagger-ui .bg-black-05{background-color:rgba(0,0,0,.05)}.swagger-ui .bg-white-90{background-color:hsla(0,0%,100%,.9)}.swagger-ui .bg-white-80{background-color:hsla(0,0%,100%,.8)}.swagger-ui .bg-white-70{background-color:hsla(0,0%,100%,.7)}.swagger-ui .bg-white-60{background-color:hsla(0,0%,100%,.6)}.swagger-ui .bg-white-50{background-color:hsla(0,0%,100%,.5)}.swagger-ui .bg-white-40{background-color:hsla(0,0%,100%,.4)}.swagger-ui .bg-white-30{background-color:hsla(0,0%,100%,.3)}.swagger-ui .bg-white-20{background-color:hsla(0,0%,100%,.2)}.swagger-ui .bg-white-10{background-color:hsla(0,0%,100%,.1)}.swagger-ui .bg-black{background-color:#000}.swagger-ui .bg-near-black{background-color:#111}.swagger-ui .bg-dark-gray{background-color:#333}.swagger-ui .bg-mid-gray{background-color:#555}.swagger-ui .bg-gray{background-color:#777}.swagger-ui .bg-silver{background-color:#999}.swagger-ui .bg-light-silver{background-color:#aaa}.swagger-ui .bg-moon-gray{background-color:#ccc}.swagger-ui .bg-light-gray{background-color:#eee}.swagger-ui .bg-near-white{background-color:#f4f4f4}.swagger-ui .bg-white{background-color:#fff}.swagger-ui .bg-transparent{background-color:transparent}.swagger-ui .bg-dark-red{background-color:#e7040f}.swagger-ui .bg-red{background-color:#ff4136}.swagger-ui .bg-light-red{background-color:#ff725c}.swagger-ui .bg-orange{background-color:#ff6300}.swagger-ui .bg-gold{background-color:#ffb700}.swagger-ui .bg-yellow{background-color:gold}.swagger-ui .bg-light-yellow{background-color:#fbf1a9}.swagger-ui .bg-purple{background-color:#5e2ca5}.swagger-ui .bg-light-purple{background-color:#a463f2}.swagger-ui .bg-dark-pink{background-color:#d5008f}.swagger-ui .bg-hot-pink{background-color:#ff41b4}.swagger-ui .bg-pink{background-color:#ff80cc}.swagger-ui .bg-light-pink{background-color:#ffa3d7}.swagger-ui .bg-dark-green{background-color:#137752}.swagger-ui .bg-green{background-color:#19a974}.swagger-ui .bg-light-green{background-color:#9eebcf}.swagger-ui .bg-navy{background-color:#001b44}.swagger-ui .bg-dark-blue{background-color:#00449e}.swagger-ui .bg-blue{background-color:#357edd}.swagger-ui .bg-light-blue{background-color:#96ccff}.swagger-ui .bg-lightest-blue{background-color:#cdecff}.swagger-ui .bg-washed-blue{background-color:#f6fffe}.swagger-ui .bg-washed-green{background-color:#e8fdf5}.swagger-ui .bg-washed-yellow{background-color:#fffceb}.swagger-ui .bg-washed-red{background-color:#ffdfdf}.swagger-ui .bg-inherit{background-color:inherit}.swagger-ui .hover-black:focus,.swagger-ui .hover-black:hover{color:#000}.swagger-ui .hover-near-black:focus,.swagger-ui .hover-near-black:hover{color:#111}.swagger-ui .hover-dark-gray:focus,.swagger-ui .hover-dark-gray:hover{color:#333}.swagger-ui .hover-mid-gray:focus,.swagger-ui .hover-mid-gray:hover{color:#555}.swagger-ui .hover-gray:focus,.swagger-ui .hover-gray:hover{color:#777}.swagger-ui .hover-silver:focus,.swagger-ui .hover-silver:hover{color:#999}.swagger-ui .hover-light-silver:focus,.swagger-ui .hover-light-silver:hover{color:#aaa}.swagger-ui .hover-moon-gray:focus,.swagger-ui .hover-moon-gray:hover{color:#ccc}.swagger-ui .hover-light-gray:focus,.swagger-ui .hover-light-gray:hover{color:#eee}.swagger-ui .hover-near-white:focus,.swagger-ui .hover-near-white:hover{color:#f4f4f4}.swagger-ui .hover-white:focus,.swagger-ui .hover-white:hover{color:#fff}.swagger-ui .hover-black-90:focus,.swagger-ui .hover-black-90:hover{color:rgba(0,0,0,.9)}.swagger-ui .hover-black-80:focus,.swagger-ui .hover-black-80:hover{color:rgba(0,0,0,.8)}.swagger-ui .hover-black-70:focus,.swagger-ui .hover-black-70:hover{color:rgba(0,0,0,.7)}.swagger-ui .hover-black-60:focus,.swagger-ui .hover-black-60:hover{color:rgba(0,0,0,.6)}.swagger-ui .hover-black-50:focus,.swagger-ui .hover-black-50:hover{color:rgba(0,0,0,.5)}.swagger-ui .hover-black-40:focus,.swagger-ui .hover-black-40:hover{color:rgba(0,0,0,.4)}.swagger-ui .hover-black-30:focus,.swagger-ui .hover-black-30:hover{color:rgba(0,0,0,.3)}.swagger-ui .hover-black-20:focus,.swagger-ui .hover-black-20:hover{color:rgba(0,0,0,.2)}.swagger-ui .hover-black-10:focus,.swagger-ui .hover-black-10:hover{color:rgba(0,0,0,.1)}.swagger-ui .hover-white-90:focus,.swagger-ui .hover-white-90:hover{color:hsla(0,0%,100%,.9)}.swagger-ui .hover-white-80:focus,.swagger-ui .hover-white-80:hover{color:hsla(0,0%,100%,.8)}.swagger-ui .hover-white-70:focus,.swagger-ui .hover-white-70:hover{color:hsla(0,0%,100%,.7)}.swagger-ui .hover-white-60:focus,.swagger-ui .hover-white-60:hover{color:hsla(0,0%,100%,.6)}.swagger-ui .hover-white-50:focus,.swagger-ui .hover-white-50:hover{color:hsla(0,0%,100%,.5)}.swagger-ui .hover-white-40:focus,.swagger-ui .hover-white-40:hover{color:hsla(0,0%,100%,.4)}.swagger-ui .hover-white-30:focus,.swagger-ui .hover-white-30:hover{color:hsla(0,0%,100%,.3)}.swagger-ui .hover-white-20:focus,.swagger-ui .hover-white-20:hover{color:hsla(0,0%,100%,.2)}.swagger-ui .hover-white-10:focus,.swagger-ui .hover-white-10:hover{color:hsla(0,0%,100%,.1)}.swagger-ui .hover-inherit:focus,.swagger-ui .hover-inherit:hover{color:inherit}.swagger-ui .hover-bg-black:focus,.swagger-ui .hover-bg-black:hover{background-color:#000}.swagger-ui .hover-bg-near-black:focus,.swagger-ui .hover-bg-near-black:hover{background-color:#111}.swagger-ui .hover-bg-dark-gray:focus,.swagger-ui .hover-bg-dark-gray:hover{background-color:#333}.swagger-ui .hover-bg-mid-gray:focus,.swagger-ui .hover-bg-mid-gray:hover{background-color:#555}.swagger-ui .hover-bg-gray:focus,.swagger-ui .hover-bg-gray:hover{background-color:#777}.swagger-ui .hover-bg-silver:focus,.swagger-ui .hover-bg-silver:hover{background-color:#999}.swagger-ui .hover-bg-light-silver:focus,.swagger-ui .hover-bg-light-silver:hover{background-color:#aaa}.swagger-ui .hover-bg-moon-gray:focus,.swagger-ui .hover-bg-moon-gray:hover{background-color:#ccc}.swagger-ui .hover-bg-light-gray:focus,.swagger-ui .hover-bg-light-gray:hover{background-color:#eee}.swagger-ui .hover-bg-near-white:focus,.swagger-ui .hover-bg-near-white:hover{background-color:#f4f4f4}.swagger-ui .hover-bg-white:focus,.swagger-ui .hover-bg-white:hover{background-color:#fff}.swagger-ui .hover-bg-transparent:focus,.swagger-ui .hover-bg-transparent:hover{background-color:transparent}.swagger-ui .hover-bg-black-90:focus,.swagger-ui .hover-bg-black-90:hover{background-color:rgba(0,0,0,.9)}.swagger-ui .hover-bg-black-80:focus,.swagger-ui .hover-bg-black-80:hover{background-color:rgba(0,0,0,.8)}.swagger-ui .hover-bg-black-70:focus,.swagger-ui .hover-bg-black-70:hover{background-color:rgba(0,0,0,.7)}.swagger-ui .hover-bg-black-60:focus,.swagger-ui .hover-bg-black-60:hover{background-color:rgba(0,0,0,.6)}.swagger-ui .hover-bg-black-50:focus,.swagger-ui .hover-bg-black-50:hover{background-color:rgba(0,0,0,.5)}.swagger-ui .hover-bg-black-40:focus,.swagger-ui .hover-bg-black-40:hover{background-color:rgba(0,0,0,.4)}.swagger-ui .hover-bg-black-30:focus,.swagger-ui .hover-bg-black-30:hover{background-color:rgba(0,0,0,.3)}.swagger-ui .hover-bg-black-20:focus,.swagger-ui .hover-bg-black-20:hover{background-color:rgba(0,0,0,.2)}.swagger-ui .hover-bg-black-10:focus,.swagger-ui .hover-bg-black-10:hover{background-color:rgba(0,0,0,.1)}.swagger-ui .hover-bg-white-90:focus,.swagger-ui .hover-bg-white-90:hover{background-color:hsla(0,0%,100%,.9)}.swagger-ui .hover-bg-white-80:focus,.swagger-ui .hover-bg-white-80:hover{background-color:hsla(0,0%,100%,.8)}.swagger-ui .hover-bg-white-70:focus,.swagger-ui .hover-bg-white-70:hover{background-color:hsla(0,0%,100%,.7)}.swagger-ui .hover-bg-white-60:focus,.swagger-ui .hover-bg-white-60:hover{background-color:hsla(0,0%,100%,.6)}.swagger-ui .hover-bg-white-50:focus,.swagger-ui .hover-bg-white-50:hover{background-color:hsla(0,0%,100%,.5)}.swagger-ui .hover-bg-white-40:focus,.swagger-ui .hover-bg-white-40:hover{background-color:hsla(0,0%,100%,.4)}.swagger-ui .hover-bg-white-30:focus,.swagger-ui .hover-bg-white-30:hover{background-color:hsla(0,0%,100%,.3)}.swagger-ui .hover-bg-white-20:focus,.swagger-ui .hover-bg-white-20:hover{background-color:hsla(0,0%,100%,.2)}.swagger-ui .hover-bg-white-10:focus,.swagger-ui .hover-bg-white-10:hover{background-color:hsla(0,0%,100%,.1)}.swagger-ui .hover-dark-red:focus,.swagger-ui .hover-dark-red:hover{color:#e7040f}.swagger-ui .hover-red:focus,.swagger-ui .hover-red:hover{color:#ff4136}.swagger-ui .hover-light-red:focus,.swagger-ui .hover-light-red:hover{color:#ff725c}.swagger-ui .hover-orange:focus,.swagger-ui .hover-orange:hover{color:#ff6300}.swagger-ui .hover-gold:focus,.swagger-ui .hover-gold:hover{color:#ffb700}.swagger-ui .hover-yellow:focus,.swagger-ui .hover-yellow:hover{color:gold}.swagger-ui .hover-light-yellow:focus,.swagger-ui .hover-light-yellow:hover{color:#fbf1a9}.swagger-ui .hover-purple:focus,.swagger-ui .hover-purple:hover{color:#5e2ca5}.swagger-ui .hover-light-purple:focus,.swagger-ui .hover-light-purple:hover{color:#a463f2}.swagger-ui .hover-dark-pink:focus,.swagger-ui .hover-dark-pink:hover{color:#d5008f}.swagger-ui .hover-hot-pink:focus,.swagger-ui .hover-hot-pink:hover{color:#ff41b4}.swagger-ui .hover-pink:focus,.swagger-ui .hover-pink:hover{color:#ff80cc}.swagger-ui .hover-light-pink:focus,.swagger-ui .hover-light-pink:hover{color:#ffa3d7}.swagger-ui .hover-dark-green:focus,.swagger-ui .hover-dark-green:hover{color:#137752}.swagger-ui .hover-green:focus,.swagger-ui .hover-green:hover{color:#19a974}.swagger-ui .hover-light-green:focus,.swagger-ui .hover-light-green:hover{color:#9eebcf}.swagger-ui .hover-navy:focus,.swagger-ui .hover-navy:hover{color:#001b44}.swagger-ui .hover-dark-blue:focus,.swagger-ui .hover-dark-blue:hover{color:#00449e}.swagger-ui .hover-blue:focus,.swagger-ui .hover-blue:hover{color:#357edd}.swagger-ui .hover-light-blue:focus,.swagger-ui .hover-light-blue:hover{color:#96ccff}.swagger-ui .hover-lightest-blue:focus,.swagger-ui .hover-lightest-blue:hover{color:#cdecff}.swagger-ui .hover-washed-blue:focus,.swagger-ui .hover-washed-blue:hover{color:#f6fffe}.swagger-ui .hover-washed-green:focus,.swagger-ui .hover-washed-green:hover{color:#e8fdf5}.swagger-ui .hover-washed-yellow:focus,.swagger-ui .hover-washed-yellow:hover{color:#fffceb}.swagger-ui .hover-washed-red:focus,.swagger-ui .hover-washed-red:hover{color:#ffdfdf}.swagger-ui .hover-bg-dark-red:focus,.swagger-ui .hover-bg-dark-red:hover{background-color:#e7040f}.swagger-ui .hover-bg-red:focus,.swagger-ui .hover-bg-red:hover{background-color:#ff4136}.swagger-ui .hover-bg-light-red:focus,.swagger-ui .hover-bg-light-red:hover{background-color:#ff725c}.swagger-ui .hover-bg-orange:focus,.swagger-ui .hover-bg-orange:hover{background-color:#ff6300}.swagger-ui .hover-bg-gold:focus,.swagger-ui .hover-bg-gold:hover{background-color:#ffb700}.swagger-ui .hover-bg-yellow:focus,.swagger-ui .hover-bg-yellow:hover{background-color:gold}.swagger-ui .hover-bg-light-yellow:focus,.swagger-ui .hover-bg-light-yellow:hover{background-color:#fbf1a9}.swagger-ui .hover-bg-purple:focus,.swagger-ui .hover-bg-purple:hover{background-color:#5e2ca5}.swagger-ui .hover-bg-light-purple:focus,.swagger-ui .hover-bg-light-purple:hover{background-color:#a463f2}.swagger-ui .hover-bg-dark-pink:focus,.swagger-ui .hover-bg-dark-pink:hover{background-color:#d5008f}.swagger-ui .hover-bg-hot-pink:focus,.swagger-ui .hover-bg-hot-pink:hover{background-color:#ff41b4}.swagger-ui .hover-bg-pink:focus,.swagger-ui .hover-bg-pink:hover{background-color:#ff80cc}.swagger-ui .hover-bg-light-pink:focus,.swagger-ui .hover-bg-light-pink:hover{background-color:#ffa3d7}.swagger-ui .hover-bg-dark-green:focus,.swagger-ui .hover-bg-dark-green:hover{background-color:#137752}.swagger-ui .hover-bg-green:focus,.swagger-ui .hover-bg-green:hover{background-color:#19a974}.swagger-ui .hover-bg-light-green:focus,.swagger-ui .hover-bg-light-green:hover{background-color:#9eebcf}.swagger-ui .hover-bg-navy:focus,.swagger-ui .hover-bg-navy:hover{background-color:#001b44}.swagger-ui .hover-bg-dark-blue:focus,.swagger-ui .hover-bg-dark-blue:hover{background-color:#00449e}.swagger-ui .hover-bg-blue:focus,.swagger-ui .hover-bg-blue:hover{background-color:#357edd}.swagger-ui .hover-bg-light-blue:focus,.swagger-ui .hover-bg-light-blue:hover{background-color:#96ccff}.swagger-ui .hover-bg-lightest-blue:focus,.swagger-ui .hover-bg-lightest-blue:hover{background-color:#cdecff}.swagger-ui .hover-bg-washed-blue:focus,.swagger-ui .hover-bg-washed-blue:hover{background-color:#f6fffe}.swagger-ui .hover-bg-washed-green:focus,.swagger-ui .hover-bg-washed-green:hover{background-color:#e8fdf5}.swagger-ui .hover-bg-washed-yellow:focus,.swagger-ui .hover-bg-washed-yellow:hover{background-color:#fffceb}.swagger-ui .hover-bg-washed-red:focus,.swagger-ui .hover-bg-washed-red:hover{background-color:#ffdfdf}.swagger-ui .hover-bg-inherit:focus,.swagger-ui .hover-bg-inherit:hover{background-color:inherit}.swagger-ui .pa0{padding:0}.swagger-ui .pa1{padding:.25rem}.swagger-ui .pa2{padding:.5rem}.swagger-ui .pa3{padding:1rem}.swagger-ui .pa4{padding:2rem}.swagger-ui .pa5{padding:4rem}.swagger-ui .pa6{padding:8rem}.swagger-ui .pa7{padding:16rem}.swagger-ui .pl0{padding-left:0}.swagger-ui .pl1{padding-left:.25rem}.swagger-ui .pl2{padding-left:.5rem}.swagger-ui .pl3{padding-left:1rem}.swagger-ui .pl4{padding-left:2rem}.swagger-ui .pl5{padding-left:4rem}.swagger-ui .pl6{padding-left:8rem}.swagger-ui .pl7{padding-left:16rem}.swagger-ui .pr0{padding-right:0}.swagger-ui .pr1{padding-right:.25rem}.swagger-ui .pr2{padding-right:.5rem}.swagger-ui .pr3{padding-right:1rem}.swagger-ui .pr4{padding-right:2rem}.swagger-ui .pr5{padding-right:4rem}.swagger-ui .pr6{padding-right:8rem}.swagger-ui .pr7{padding-right:16rem}.swagger-ui .pb0{padding-bottom:0}.swagger-ui .pb1{padding-bottom:.25rem}.swagger-ui .pb2{padding-bottom:.5rem}.swagger-ui .pb3{padding-bottom:1rem}.swagger-ui .pb4{padding-bottom:2rem}.swagger-ui .pb5{padding-bottom:4rem}.swagger-ui .pb6{padding-bottom:8rem}.swagger-ui .pb7{padding-bottom:16rem}.swagger-ui .pt0{padding-top:0}.swagger-ui .pt1{padding-top:.25rem}.swagger-ui .pt2{padding-top:.5rem}.swagger-ui .pt3{padding-top:1rem}.swagger-ui .pt4{padding-top:2rem}.swagger-ui .pt5{padding-top:4rem}.swagger-ui .pt6{padding-top:8rem}.swagger-ui .pt7{padding-top:16rem}.swagger-ui .pv0{padding-bottom:0;padding-top:0}.swagger-ui .pv1{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0{padding-left:0;padding-right:0}.swagger-ui .ph1{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0{margin:0}.swagger-ui .ma1{margin:.25rem}.swagger-ui .ma2{margin:.5rem}.swagger-ui .ma3{margin:1rem}.swagger-ui .ma4{margin:2rem}.swagger-ui .ma5{margin:4rem}.swagger-ui .ma6{margin:8rem}.swagger-ui .ma7{margin:16rem}.swagger-ui .ml0{margin-left:0}.swagger-ui .ml1{margin-left:.25rem}.swagger-ui .ml2{margin-left:.5rem}.swagger-ui .ml3{margin-left:1rem}.swagger-ui .ml4{margin-left:2rem}.swagger-ui .ml5{margin-left:4rem}.swagger-ui .ml6{margin-left:8rem}.swagger-ui .ml7{margin-left:16rem}.swagger-ui .mr0{margin-right:0}.swagger-ui .mr1{margin-right:.25rem}.swagger-ui .mr2{margin-right:.5rem}.swagger-ui .mr3{margin-right:1rem}.swagger-ui .mr4{margin-right:2rem}.swagger-ui .mr5{margin-right:4rem}.swagger-ui .mr6{margin-right:8rem}.swagger-ui .mr7{margin-right:16rem}.swagger-ui .mb0{margin-bottom:0}.swagger-ui .mb1{margin-bottom:.25rem}.swagger-ui .mb2{margin-bottom:.5rem}.swagger-ui .mb3{margin-bottom:1rem}.swagger-ui .mb4{margin-bottom:2rem}.swagger-ui .mb5{margin-bottom:4rem}.swagger-ui .mb6{margin-bottom:8rem}.swagger-ui .mb7{margin-bottom:16rem}.swagger-ui .mt0{margin-top:0}.swagger-ui .mt1{margin-top:.25rem}.swagger-ui .mt2{margin-top:.5rem}.swagger-ui .mt3{margin-top:1rem}.swagger-ui .mt4{margin-top:2rem}.swagger-ui .mt5{margin-top:4rem}.swagger-ui .mt6{margin-top:8rem}.swagger-ui .mt7{margin-top:16rem}.swagger-ui .mv0{margin-bottom:0;margin-top:0}.swagger-ui .mv1{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0{margin-left:0;margin-right:0}.swagger-ui .mh1{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7{margin-left:16rem;margin-right:16rem}@media screen and (min-width:30em){.swagger-ui .pa0-ns{padding:0}.swagger-ui .pa1-ns{padding:.25rem}.swagger-ui .pa2-ns{padding:.5rem}.swagger-ui .pa3-ns{padding:1rem}.swagger-ui .pa4-ns{padding:2rem}.swagger-ui .pa5-ns{padding:4rem}.swagger-ui .pa6-ns{padding:8rem}.swagger-ui .pa7-ns{padding:16rem}.swagger-ui .pl0-ns{padding-left:0}.swagger-ui .pl1-ns{padding-left:.25rem}.swagger-ui .pl2-ns{padding-left:.5rem}.swagger-ui .pl3-ns{padding-left:1rem}.swagger-ui .pl4-ns{padding-left:2rem}.swagger-ui .pl5-ns{padding-left:4rem}.swagger-ui .pl6-ns{padding-left:8rem}.swagger-ui .pl7-ns{padding-left:16rem}.swagger-ui .pr0-ns{padding-right:0}.swagger-ui .pr1-ns{padding-right:.25rem}.swagger-ui .pr2-ns{padding-right:.5rem}.swagger-ui .pr3-ns{padding-right:1rem}.swagger-ui .pr4-ns{padding-right:2rem}.swagger-ui .pr5-ns{padding-right:4rem}.swagger-ui .pr6-ns{padding-right:8rem}.swagger-ui .pr7-ns{padding-right:16rem}.swagger-ui .pb0-ns{padding-bottom:0}.swagger-ui .pb1-ns{padding-bottom:.25rem}.swagger-ui .pb2-ns{padding-bottom:.5rem}.swagger-ui .pb3-ns{padding-bottom:1rem}.swagger-ui .pb4-ns{padding-bottom:2rem}.swagger-ui .pb5-ns{padding-bottom:4rem}.swagger-ui .pb6-ns{padding-bottom:8rem}.swagger-ui .pb7-ns{padding-bottom:16rem}.swagger-ui .pt0-ns{padding-top:0}.swagger-ui .pt1-ns{padding-top:.25rem}.swagger-ui .pt2-ns{padding-top:.5rem}.swagger-ui .pt3-ns{padding-top:1rem}.swagger-ui .pt4-ns{padding-top:2rem}.swagger-ui .pt5-ns{padding-top:4rem}.swagger-ui .pt6-ns{padding-top:8rem}.swagger-ui .pt7-ns{padding-top:16rem}.swagger-ui .pv0-ns{padding-bottom:0;padding-top:0}.swagger-ui .pv1-ns{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-ns{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-ns{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-ns{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-ns{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-ns{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-ns{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-ns{padding-left:0;padding-right:0}.swagger-ui .ph1-ns{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-ns{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-ns{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-ns{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-ns{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-ns{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-ns{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-ns{margin:0}.swagger-ui .ma1-ns{margin:.25rem}.swagger-ui .ma2-ns{margin:.5rem}.swagger-ui .ma3-ns{margin:1rem}.swagger-ui .ma4-ns{margin:2rem}.swagger-ui .ma5-ns{margin:4rem}.swagger-ui .ma6-ns{margin:8rem}.swagger-ui .ma7-ns{margin:16rem}.swagger-ui .ml0-ns{margin-left:0}.swagger-ui .ml1-ns{margin-left:.25rem}.swagger-ui .ml2-ns{margin-left:.5rem}.swagger-ui .ml3-ns{margin-left:1rem}.swagger-ui .ml4-ns{margin-left:2rem}.swagger-ui .ml5-ns{margin-left:4rem}.swagger-ui .ml6-ns{margin-left:8rem}.swagger-ui .ml7-ns{margin-left:16rem}.swagger-ui .mr0-ns{margin-right:0}.swagger-ui .mr1-ns{margin-right:.25rem}.swagger-ui .mr2-ns{margin-right:.5rem}.swagger-ui .mr3-ns{margin-right:1rem}.swagger-ui .mr4-ns{margin-right:2rem}.swagger-ui .mr5-ns{margin-right:4rem}.swagger-ui .mr6-ns{margin-right:8rem}.swagger-ui .mr7-ns{margin-right:16rem}.swagger-ui .mb0-ns{margin-bottom:0}.swagger-ui .mb1-ns{margin-bottom:.25rem}.swagger-ui .mb2-ns{margin-bottom:.5rem}.swagger-ui .mb3-ns{margin-bottom:1rem}.swagger-ui .mb4-ns{margin-bottom:2rem}.swagger-ui .mb5-ns{margin-bottom:4rem}.swagger-ui .mb6-ns{margin-bottom:8rem}.swagger-ui .mb7-ns{margin-bottom:16rem}.swagger-ui .mt0-ns{margin-top:0}.swagger-ui .mt1-ns{margin-top:.25rem}.swagger-ui .mt2-ns{margin-top:.5rem}.swagger-ui .mt3-ns{margin-top:1rem}.swagger-ui .mt4-ns{margin-top:2rem}.swagger-ui .mt5-ns{margin-top:4rem}.swagger-ui .mt6-ns{margin-top:8rem}.swagger-ui .mt7-ns{margin-top:16rem}.swagger-ui .mv0-ns{margin-bottom:0;margin-top:0}.swagger-ui .mv1-ns{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-ns{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-ns{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-ns{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-ns{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-ns{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-ns{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-ns{margin-left:0;margin-right:0}.swagger-ui .mh1-ns{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-ns{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-ns{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-ns{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-ns{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-ns{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-ns{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .pa0-m{padding:0}.swagger-ui .pa1-m{padding:.25rem}.swagger-ui .pa2-m{padding:.5rem}.swagger-ui .pa3-m{padding:1rem}.swagger-ui .pa4-m{padding:2rem}.swagger-ui .pa5-m{padding:4rem}.swagger-ui .pa6-m{padding:8rem}.swagger-ui .pa7-m{padding:16rem}.swagger-ui .pl0-m{padding-left:0}.swagger-ui .pl1-m{padding-left:.25rem}.swagger-ui .pl2-m{padding-left:.5rem}.swagger-ui .pl3-m{padding-left:1rem}.swagger-ui .pl4-m{padding-left:2rem}.swagger-ui .pl5-m{padding-left:4rem}.swagger-ui .pl6-m{padding-left:8rem}.swagger-ui .pl7-m{padding-left:16rem}.swagger-ui .pr0-m{padding-right:0}.swagger-ui .pr1-m{padding-right:.25rem}.swagger-ui .pr2-m{padding-right:.5rem}.swagger-ui .pr3-m{padding-right:1rem}.swagger-ui .pr4-m{padding-right:2rem}.swagger-ui .pr5-m{padding-right:4rem}.swagger-ui .pr6-m{padding-right:8rem}.swagger-ui .pr7-m{padding-right:16rem}.swagger-ui .pb0-m{padding-bottom:0}.swagger-ui .pb1-m{padding-bottom:.25rem}.swagger-ui .pb2-m{padding-bottom:.5rem}.swagger-ui .pb3-m{padding-bottom:1rem}.swagger-ui .pb4-m{padding-bottom:2rem}.swagger-ui .pb5-m{padding-bottom:4rem}.swagger-ui .pb6-m{padding-bottom:8rem}.swagger-ui .pb7-m{padding-bottom:16rem}.swagger-ui .pt0-m{padding-top:0}.swagger-ui .pt1-m{padding-top:.25rem}.swagger-ui .pt2-m{padding-top:.5rem}.swagger-ui .pt3-m{padding-top:1rem}.swagger-ui .pt4-m{padding-top:2rem}.swagger-ui .pt5-m{padding-top:4rem}.swagger-ui .pt6-m{padding-top:8rem}.swagger-ui .pt7-m{padding-top:16rem}.swagger-ui .pv0-m{padding-bottom:0;padding-top:0}.swagger-ui .pv1-m{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-m{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-m{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-m{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-m{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-m{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-m{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-m{padding-left:0;padding-right:0}.swagger-ui .ph1-m{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-m{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-m{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-m{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-m{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-m{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-m{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-m{margin:0}.swagger-ui .ma1-m{margin:.25rem}.swagger-ui .ma2-m{margin:.5rem}.swagger-ui .ma3-m{margin:1rem}.swagger-ui .ma4-m{margin:2rem}.swagger-ui .ma5-m{margin:4rem}.swagger-ui .ma6-m{margin:8rem}.swagger-ui .ma7-m{margin:16rem}.swagger-ui .ml0-m{margin-left:0}.swagger-ui .ml1-m{margin-left:.25rem}.swagger-ui .ml2-m{margin-left:.5rem}.swagger-ui .ml3-m{margin-left:1rem}.swagger-ui .ml4-m{margin-left:2rem}.swagger-ui .ml5-m{margin-left:4rem}.swagger-ui .ml6-m{margin-left:8rem}.swagger-ui .ml7-m{margin-left:16rem}.swagger-ui .mr0-m{margin-right:0}.swagger-ui .mr1-m{margin-right:.25rem}.swagger-ui .mr2-m{margin-right:.5rem}.swagger-ui .mr3-m{margin-right:1rem}.swagger-ui .mr4-m{margin-right:2rem}.swagger-ui .mr5-m{margin-right:4rem}.swagger-ui .mr6-m{margin-right:8rem}.swagger-ui .mr7-m{margin-right:16rem}.swagger-ui .mb0-m{margin-bottom:0}.swagger-ui .mb1-m{margin-bottom:.25rem}.swagger-ui .mb2-m{margin-bottom:.5rem}.swagger-ui .mb3-m{margin-bottom:1rem}.swagger-ui .mb4-m{margin-bottom:2rem}.swagger-ui .mb5-m{margin-bottom:4rem}.swagger-ui .mb6-m{margin-bottom:8rem}.swagger-ui .mb7-m{margin-bottom:16rem}.swagger-ui .mt0-m{margin-top:0}.swagger-ui .mt1-m{margin-top:.25rem}.swagger-ui .mt2-m{margin-top:.5rem}.swagger-ui .mt3-m{margin-top:1rem}.swagger-ui .mt4-m{margin-top:2rem}.swagger-ui .mt5-m{margin-top:4rem}.swagger-ui .mt6-m{margin-top:8rem}.swagger-ui .mt7-m{margin-top:16rem}.swagger-ui .mv0-m{margin-bottom:0;margin-top:0}.swagger-ui .mv1-m{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-m{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-m{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-m{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-m{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-m{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-m{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-m{margin-left:0;margin-right:0}.swagger-ui .mh1-m{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-m{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-m{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-m{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-m{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-m{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-m{margin-left:16rem;margin-right:16rem}}@media screen and (min-width:60em){.swagger-ui .pa0-l{padding:0}.swagger-ui .pa1-l{padding:.25rem}.swagger-ui .pa2-l{padding:.5rem}.swagger-ui .pa3-l{padding:1rem}.swagger-ui .pa4-l{padding:2rem}.swagger-ui .pa5-l{padding:4rem}.swagger-ui .pa6-l{padding:8rem}.swagger-ui .pa7-l{padding:16rem}.swagger-ui .pl0-l{padding-left:0}.swagger-ui .pl1-l{padding-left:.25rem}.swagger-ui .pl2-l{padding-left:.5rem}.swagger-ui .pl3-l{padding-left:1rem}.swagger-ui .pl4-l{padding-left:2rem}.swagger-ui .pl5-l{padding-left:4rem}.swagger-ui .pl6-l{padding-left:8rem}.swagger-ui .pl7-l{padding-left:16rem}.swagger-ui .pr0-l{padding-right:0}.swagger-ui .pr1-l{padding-right:.25rem}.swagger-ui .pr2-l{padding-right:.5rem}.swagger-ui .pr3-l{padding-right:1rem}.swagger-ui .pr4-l{padding-right:2rem}.swagger-ui .pr5-l{padding-right:4rem}.swagger-ui .pr6-l{padding-right:8rem}.swagger-ui .pr7-l{padding-right:16rem}.swagger-ui .pb0-l{padding-bottom:0}.swagger-ui .pb1-l{padding-bottom:.25rem}.swagger-ui .pb2-l{padding-bottom:.5rem}.swagger-ui .pb3-l{padding-bottom:1rem}.swagger-ui .pb4-l{padding-bottom:2rem}.swagger-ui .pb5-l{padding-bottom:4rem}.swagger-ui .pb6-l{padding-bottom:8rem}.swagger-ui .pb7-l{padding-bottom:16rem}.swagger-ui .pt0-l{padding-top:0}.swagger-ui .pt1-l{padding-top:.25rem}.swagger-ui .pt2-l{padding-top:.5rem}.swagger-ui .pt3-l{padding-top:1rem}.swagger-ui .pt4-l{padding-top:2rem}.swagger-ui .pt5-l{padding-top:4rem}.swagger-ui .pt6-l{padding-top:8rem}.swagger-ui .pt7-l{padding-top:16rem}.swagger-ui .pv0-l{padding-bottom:0;padding-top:0}.swagger-ui .pv1-l{padding-bottom:.25rem;padding-top:.25rem}.swagger-ui .pv2-l{padding-bottom:.5rem;padding-top:.5rem}.swagger-ui .pv3-l{padding-bottom:1rem;padding-top:1rem}.swagger-ui .pv4-l{padding-bottom:2rem;padding-top:2rem}.swagger-ui .pv5-l{padding-bottom:4rem;padding-top:4rem}.swagger-ui .pv6-l{padding-bottom:8rem;padding-top:8rem}.swagger-ui .pv7-l{padding-bottom:16rem;padding-top:16rem}.swagger-ui .ph0-l{padding-left:0;padding-right:0}.swagger-ui .ph1-l{padding-left:.25rem;padding-right:.25rem}.swagger-ui .ph2-l{padding-left:.5rem;padding-right:.5rem}.swagger-ui .ph3-l{padding-left:1rem;padding-right:1rem}.swagger-ui .ph4-l{padding-left:2rem;padding-right:2rem}.swagger-ui .ph5-l{padding-left:4rem;padding-right:4rem}.swagger-ui .ph6-l{padding-left:8rem;padding-right:8rem}.swagger-ui .ph7-l{padding-left:16rem;padding-right:16rem}.swagger-ui .ma0-l{margin:0}.swagger-ui .ma1-l{margin:.25rem}.swagger-ui .ma2-l{margin:.5rem}.swagger-ui .ma3-l{margin:1rem}.swagger-ui .ma4-l{margin:2rem}.swagger-ui .ma5-l{margin:4rem}.swagger-ui .ma6-l{margin:8rem}.swagger-ui .ma7-l{margin:16rem}.swagger-ui .ml0-l{margin-left:0}.swagger-ui .ml1-l{margin-left:.25rem}.swagger-ui .ml2-l{margin-left:.5rem}.swagger-ui .ml3-l{margin-left:1rem}.swagger-ui .ml4-l{margin-left:2rem}.swagger-ui .ml5-l{margin-left:4rem}.swagger-ui .ml6-l{margin-left:8rem}.swagger-ui .ml7-l{margin-left:16rem}.swagger-ui .mr0-l{margin-right:0}.swagger-ui .mr1-l{margin-right:.25rem}.swagger-ui .mr2-l{margin-right:.5rem}.swagger-ui .mr3-l{margin-right:1rem}.swagger-ui .mr4-l{margin-right:2rem}.swagger-ui .mr5-l{margin-right:4rem}.swagger-ui .mr6-l{margin-right:8rem}.swagger-ui .mr7-l{margin-right:16rem}.swagger-ui .mb0-l{margin-bottom:0}.swagger-ui .mb1-l{margin-bottom:.25rem}.swagger-ui .mb2-l{margin-bottom:.5rem}.swagger-ui .mb3-l{margin-bottom:1rem}.swagger-ui .mb4-l{margin-bottom:2rem}.swagger-ui .mb5-l{margin-bottom:4rem}.swagger-ui .mb6-l{margin-bottom:8rem}.swagger-ui .mb7-l{margin-bottom:16rem}.swagger-ui .mt0-l{margin-top:0}.swagger-ui .mt1-l{margin-top:.25rem}.swagger-ui .mt2-l{margin-top:.5rem}.swagger-ui .mt3-l{margin-top:1rem}.swagger-ui .mt4-l{margin-top:2rem}.swagger-ui .mt5-l{margin-top:4rem}.swagger-ui .mt6-l{margin-top:8rem}.swagger-ui .mt7-l{margin-top:16rem}.swagger-ui .mv0-l{margin-bottom:0;margin-top:0}.swagger-ui .mv1-l{margin-bottom:.25rem;margin-top:.25rem}.swagger-ui .mv2-l{margin-bottom:.5rem;margin-top:.5rem}.swagger-ui .mv3-l{margin-bottom:1rem;margin-top:1rem}.swagger-ui .mv4-l{margin-bottom:2rem;margin-top:2rem}.swagger-ui .mv5-l{margin-bottom:4rem;margin-top:4rem}.swagger-ui .mv6-l{margin-bottom:8rem;margin-top:8rem}.swagger-ui .mv7-l{margin-bottom:16rem;margin-top:16rem}.swagger-ui .mh0-l{margin-left:0;margin-right:0}.swagger-ui .mh1-l{margin-left:.25rem;margin-right:.25rem}.swagger-ui .mh2-l{margin-left:.5rem;margin-right:.5rem}.swagger-ui .mh3-l{margin-left:1rem;margin-right:1rem}.swagger-ui .mh4-l{margin-left:2rem;margin-right:2rem}.swagger-ui .mh5-l{margin-left:4rem;margin-right:4rem}.swagger-ui .mh6-l{margin-left:8rem;margin-right:8rem}.swagger-ui .mh7-l{margin-left:16rem;margin-right:16rem}}.swagger-ui .na1{margin:-.25rem}.swagger-ui .na2{margin:-.5rem}.swagger-ui .na3{margin:-1rem}.swagger-ui .na4{margin:-2rem}.swagger-ui .na5{margin:-4rem}.swagger-ui .na6{margin:-8rem}.swagger-ui .na7{margin:-16rem}.swagger-ui .nl1{margin-left:-.25rem}.swagger-ui .nl2{margin-left:-.5rem}.swagger-ui .nl3{margin-left:-1rem}.swagger-ui .nl4{margin-left:-2rem}.swagger-ui .nl5{margin-left:-4rem}.swagger-ui .nl6{margin-left:-8rem}.swagger-ui .nl7{margin-left:-16rem}.swagger-ui .nr1{margin-right:-.25rem}.swagger-ui .nr2{margin-right:-.5rem}.swagger-ui .nr3{margin-right:-1rem}.swagger-ui .nr4{margin-right:-2rem}.swagger-ui .nr5{margin-right:-4rem}.swagger-ui .nr6{margin-right:-8rem}.swagger-ui .nr7{margin-right:-16rem}.swagger-ui .nb1{margin-bottom:-.25rem}.swagger-ui .nb2{margin-bottom:-.5rem}.swagger-ui .nb3{margin-bottom:-1rem}.swagger-ui .nb4{margin-bottom:-2rem}.swagger-ui .nb5{margin-bottom:-4rem}.swagger-ui .nb6{margin-bottom:-8rem}.swagger-ui .nb7{margin-bottom:-16rem}.swagger-ui .nt1{margin-top:-.25rem}.swagger-ui .nt2{margin-top:-.5rem}.swagger-ui .nt3{margin-top:-1rem}.swagger-ui .nt4{margin-top:-2rem}.swagger-ui .nt5{margin-top:-4rem}.swagger-ui .nt6{margin-top:-8rem}.swagger-ui .nt7{margin-top:-16rem}@media screen and (min-width:30em){.swagger-ui .na1-ns{margin:-.25rem}.swagger-ui .na2-ns{margin:-.5rem}.swagger-ui .na3-ns{margin:-1rem}.swagger-ui .na4-ns{margin:-2rem}.swagger-ui .na5-ns{margin:-4rem}.swagger-ui .na6-ns{margin:-8rem}.swagger-ui .na7-ns{margin:-16rem}.swagger-ui .nl1-ns{margin-left:-.25rem}.swagger-ui .nl2-ns{margin-left:-.5rem}.swagger-ui .nl3-ns{margin-left:-1rem}.swagger-ui .nl4-ns{margin-left:-2rem}.swagger-ui .nl5-ns{margin-left:-4rem}.swagger-ui .nl6-ns{margin-left:-8rem}.swagger-ui .nl7-ns{margin-left:-16rem}.swagger-ui .nr1-ns{margin-right:-.25rem}.swagger-ui .nr2-ns{margin-right:-.5rem}.swagger-ui .nr3-ns{margin-right:-1rem}.swagger-ui .nr4-ns{margin-right:-2rem}.swagger-ui .nr5-ns{margin-right:-4rem}.swagger-ui .nr6-ns{margin-right:-8rem}.swagger-ui .nr7-ns{margin-right:-16rem}.swagger-ui .nb1-ns{margin-bottom:-.25rem}.swagger-ui .nb2-ns{margin-bottom:-.5rem}.swagger-ui .nb3-ns{margin-bottom:-1rem}.swagger-ui .nb4-ns{margin-bottom:-2rem}.swagger-ui .nb5-ns{margin-bottom:-4rem}.swagger-ui .nb6-ns{margin-bottom:-8rem}.swagger-ui .nb7-ns{margin-bottom:-16rem}.swagger-ui .nt1-ns{margin-top:-.25rem}.swagger-ui .nt2-ns{margin-top:-.5rem}.swagger-ui .nt3-ns{margin-top:-1rem}.swagger-ui .nt4-ns{margin-top:-2rem}.swagger-ui .nt5-ns{margin-top:-4rem}.swagger-ui .nt6-ns{margin-top:-8rem}.swagger-ui .nt7-ns{margin-top:-16rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .na1-m{margin:-.25rem}.swagger-ui .na2-m{margin:-.5rem}.swagger-ui .na3-m{margin:-1rem}.swagger-ui .na4-m{margin:-2rem}.swagger-ui .na5-m{margin:-4rem}.swagger-ui .na6-m{margin:-8rem}.swagger-ui .na7-m{margin:-16rem}.swagger-ui .nl1-m{margin-left:-.25rem}.swagger-ui .nl2-m{margin-left:-.5rem}.swagger-ui .nl3-m{margin-left:-1rem}.swagger-ui .nl4-m{margin-left:-2rem}.swagger-ui .nl5-m{margin-left:-4rem}.swagger-ui .nl6-m{margin-left:-8rem}.swagger-ui .nl7-m{margin-left:-16rem}.swagger-ui .nr1-m{margin-right:-.25rem}.swagger-ui .nr2-m{margin-right:-.5rem}.swagger-ui .nr3-m{margin-right:-1rem}.swagger-ui .nr4-m{margin-right:-2rem}.swagger-ui .nr5-m{margin-right:-4rem}.swagger-ui .nr6-m{margin-right:-8rem}.swagger-ui .nr7-m{margin-right:-16rem}.swagger-ui .nb1-m{margin-bottom:-.25rem}.swagger-ui .nb2-m{margin-bottom:-.5rem}.swagger-ui .nb3-m{margin-bottom:-1rem}.swagger-ui .nb4-m{margin-bottom:-2rem}.swagger-ui .nb5-m{margin-bottom:-4rem}.swagger-ui .nb6-m{margin-bottom:-8rem}.swagger-ui .nb7-m{margin-bottom:-16rem}.swagger-ui .nt1-m{margin-top:-.25rem}.swagger-ui .nt2-m{margin-top:-.5rem}.swagger-ui .nt3-m{margin-top:-1rem}.swagger-ui .nt4-m{margin-top:-2rem}.swagger-ui .nt5-m{margin-top:-4rem}.swagger-ui .nt6-m{margin-top:-8rem}.swagger-ui .nt7-m{margin-top:-16rem}}@media screen and (min-width:60em){.swagger-ui .na1-l{margin:-.25rem}.swagger-ui .na2-l{margin:-.5rem}.swagger-ui .na3-l{margin:-1rem}.swagger-ui .na4-l{margin:-2rem}.swagger-ui .na5-l{margin:-4rem}.swagger-ui .na6-l{margin:-8rem}.swagger-ui .na7-l{margin:-16rem}.swagger-ui .nl1-l{margin-left:-.25rem}.swagger-ui .nl2-l{margin-left:-.5rem}.swagger-ui .nl3-l{margin-left:-1rem}.swagger-ui .nl4-l{margin-left:-2rem}.swagger-ui .nl5-l{margin-left:-4rem}.swagger-ui .nl6-l{margin-left:-8rem}.swagger-ui .nl7-l{margin-left:-16rem}.swagger-ui .nr1-l{margin-right:-.25rem}.swagger-ui .nr2-l{margin-right:-.5rem}.swagger-ui .nr3-l{margin-right:-1rem}.swagger-ui .nr4-l{margin-right:-2rem}.swagger-ui .nr5-l{margin-right:-4rem}.swagger-ui .nr6-l{margin-right:-8rem}.swagger-ui .nr7-l{margin-right:-16rem}.swagger-ui .nb1-l{margin-bottom:-.25rem}.swagger-ui .nb2-l{margin-bottom:-.5rem}.swagger-ui .nb3-l{margin-bottom:-1rem}.swagger-ui .nb4-l{margin-bottom:-2rem}.swagger-ui .nb5-l{margin-bottom:-4rem}.swagger-ui .nb6-l{margin-bottom:-8rem}.swagger-ui .nb7-l{margin-bottom:-16rem}.swagger-ui .nt1-l{margin-top:-.25rem}.swagger-ui .nt2-l{margin-top:-.5rem}.swagger-ui .nt3-l{margin-top:-1rem}.swagger-ui .nt4-l{margin-top:-2rem}.swagger-ui .nt5-l{margin-top:-4rem}.swagger-ui .nt6-l{margin-top:-8rem}.swagger-ui .nt7-l{margin-top:-16rem}}.swagger-ui .collapse{border-collapse:collapse;border-spacing:0}.swagger-ui .striped--light-silver:nth-child(odd){background-color:#aaa}.swagger-ui .striped--moon-gray:nth-child(odd){background-color:#ccc}.swagger-ui .striped--light-gray:nth-child(odd){background-color:#eee}.swagger-ui .striped--near-white:nth-child(odd){background-color:#f4f4f4}.swagger-ui .stripe-light:nth-child(odd){background-color:hsla(0,0%,100%,.1)}.swagger-ui .stripe-dark:nth-child(odd){background-color:rgba(0,0,0,.1)}.swagger-ui .strike{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline{-webkit-text-decoration:none;text-decoration:none}@media screen and (min-width:30em){.swagger-ui .strike-ns{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-ns{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-ns{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .strike-m{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-m{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-m{-webkit-text-decoration:none;text-decoration:none}}@media screen and (min-width:60em){.swagger-ui .strike-l{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .underline-l{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .no-underline-l{-webkit-text-decoration:none;text-decoration:none}}.swagger-ui .tl{text-align:left}.swagger-ui .tr{text-align:right}.swagger-ui .tc{text-align:center}.swagger-ui .tj{text-align:justify}@media screen and (min-width:30em){.swagger-ui .tl-ns{text-align:left}.swagger-ui .tr-ns{text-align:right}.swagger-ui .tc-ns{text-align:center}.swagger-ui .tj-ns{text-align:justify}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .tl-m{text-align:left}.swagger-ui .tr-m{text-align:right}.swagger-ui .tc-m{text-align:center}.swagger-ui .tj-m{text-align:justify}}@media screen and (min-width:60em){.swagger-ui .tl-l{text-align:left}.swagger-ui .tr-l{text-align:right}.swagger-ui .tc-l{text-align:center}.swagger-ui .tj-l{text-align:justify}}.swagger-ui .ttc{text-transform:capitalize}.swagger-ui .ttl{text-transform:lowercase}.swagger-ui .ttu{text-transform:uppercase}.swagger-ui .ttn{text-transform:none}@media screen and (min-width:30em){.swagger-ui .ttc-ns{text-transform:capitalize}.swagger-ui .ttl-ns{text-transform:lowercase}.swagger-ui .ttu-ns{text-transform:uppercase}.swagger-ui .ttn-ns{text-transform:none}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ttc-m{text-transform:capitalize}.swagger-ui .ttl-m{text-transform:lowercase}.swagger-ui .ttu-m{text-transform:uppercase}.swagger-ui .ttn-m{text-transform:none}}@media screen and (min-width:60em){.swagger-ui .ttc-l{text-transform:capitalize}.swagger-ui .ttl-l{text-transform:lowercase}.swagger-ui .ttu-l{text-transform:uppercase}.swagger-ui .ttn-l{text-transform:none}}.swagger-ui .f-6,.swagger-ui .f-headline{font-size:6rem}.swagger-ui .f-5,.swagger-ui .f-subheadline{font-size:5rem}.swagger-ui .f1{font-size:3rem}.swagger-ui .f2{font-size:2.25rem}.swagger-ui .f3{font-size:1.5rem}.swagger-ui .f4{font-size:1.25rem}.swagger-ui .f5{font-size:1rem}.swagger-ui .f6{font-size:.875rem}.swagger-ui .f7{font-size:.75rem}@media screen and (min-width:30em){.swagger-ui .f-6-ns,.swagger-ui .f-headline-ns{font-size:6rem}.swagger-ui .f-5-ns,.swagger-ui .f-subheadline-ns{font-size:5rem}.swagger-ui .f1-ns{font-size:3rem}.swagger-ui .f2-ns{font-size:2.25rem}.swagger-ui .f3-ns{font-size:1.5rem}.swagger-ui .f4-ns{font-size:1.25rem}.swagger-ui .f5-ns{font-size:1rem}.swagger-ui .f6-ns{font-size:.875rem}.swagger-ui .f7-ns{font-size:.75rem}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .f-6-m,.swagger-ui .f-headline-m{font-size:6rem}.swagger-ui .f-5-m,.swagger-ui .f-subheadline-m{font-size:5rem}.swagger-ui .f1-m{font-size:3rem}.swagger-ui .f2-m{font-size:2.25rem}.swagger-ui .f3-m{font-size:1.5rem}.swagger-ui .f4-m{font-size:1.25rem}.swagger-ui .f5-m{font-size:1rem}.swagger-ui .f6-m{font-size:.875rem}.swagger-ui .f7-m{font-size:.75rem}}@media screen and (min-width:60em){.swagger-ui .f-6-l,.swagger-ui .f-headline-l{font-size:6rem}.swagger-ui .f-5-l,.swagger-ui .f-subheadline-l{font-size:5rem}.swagger-ui .f1-l{font-size:3rem}.swagger-ui .f2-l{font-size:2.25rem}.swagger-ui .f3-l{font-size:1.5rem}.swagger-ui .f4-l{font-size:1.25rem}.swagger-ui .f5-l{font-size:1rem}.swagger-ui .f6-l{font-size:.875rem}.swagger-ui .f7-l{font-size:.75rem}}.swagger-ui .measure{max-width:30em}.swagger-ui .measure-wide{max-width:34em}.swagger-ui .measure-narrow{max-width:20em}.swagger-ui .indent{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media screen and (min-width:30em){.swagger-ui .measure-ns{max-width:30em}.swagger-ui .measure-wide-ns{max-width:34em}.swagger-ui .measure-narrow-ns{max-width:20em}.swagger-ui .indent-ns{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-ns{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-ns{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .measure-m{max-width:30em}.swagger-ui .measure-wide-m{max-width:34em}.swagger-ui .measure-narrow-m{max-width:20em}.swagger-ui .indent-m{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-m{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-m{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}@media screen and (min-width:60em){.swagger-ui .measure-l{max-width:30em}.swagger-ui .measure-wide-l{max-width:34em}.swagger-ui .measure-narrow-l{max-width:20em}.swagger-ui .indent-l{margin-bottom:0;margin-top:0;text-indent:1em}.swagger-ui .small-caps-l{font-feature-settings:"smcp";font-variant:small-caps}.swagger-ui .truncate-l{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.swagger-ui .overflow-container{overflow-y:scroll}.swagger-ui .center{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto{margin-right:auto}.swagger-ui .ml-auto{margin-left:auto}@media screen and (min-width:30em){.swagger-ui .center-ns{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-ns{margin-right:auto}.swagger-ui .ml-auto-ns{margin-left:auto}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .center-m{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-m{margin-right:auto}.swagger-ui .ml-auto-m{margin-left:auto}}@media screen and (min-width:60em){.swagger-ui .center-l{margin-left:auto;margin-right:auto}.swagger-ui .mr-auto-l{margin-right:auto}.swagger-ui .ml-auto-l{margin-left:auto}}.swagger-ui .clip{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}@media screen and (min-width:30em){.swagger-ui .clip-ns{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .clip-m{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}@media screen and (min-width:60em){.swagger-ui .clip-l{position:fixed!important;_position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}}.swagger-ui .ws-normal{white-space:normal}.swagger-ui .nowrap{white-space:nowrap}.swagger-ui .pre{white-space:pre}@media screen and (min-width:30em){.swagger-ui .ws-normal-ns{white-space:normal}.swagger-ui .nowrap-ns{white-space:nowrap}.swagger-ui .pre-ns{white-space:pre}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .ws-normal-m{white-space:normal}.swagger-ui .nowrap-m{white-space:nowrap}.swagger-ui .pre-m{white-space:pre}}@media screen and (min-width:60em){.swagger-ui .ws-normal-l{white-space:normal}.swagger-ui .nowrap-l{white-space:nowrap}.swagger-ui .pre-l{white-space:pre}}.swagger-ui .v-base{vertical-align:baseline}.swagger-ui .v-mid{vertical-align:middle}.swagger-ui .v-top{vertical-align:top}.swagger-ui .v-btm{vertical-align:bottom}@media screen and (min-width:30em){.swagger-ui .v-base-ns{vertical-align:baseline}.swagger-ui .v-mid-ns{vertical-align:middle}.swagger-ui .v-top-ns{vertical-align:top}.swagger-ui .v-btm-ns{vertical-align:bottom}}@media screen and (min-width:30em)and (max-width:60em){.swagger-ui .v-base-m{vertical-align:baseline}.swagger-ui .v-mid-m{vertical-align:middle}.swagger-ui .v-top-m{vertical-align:top}.swagger-ui .v-btm-m{vertical-align:bottom}}@media screen and (min-width:60em){.swagger-ui .v-base-l{vertical-align:baseline}.swagger-ui .v-mid-l{vertical-align:middle}.swagger-ui .v-top-l{vertical-align:top}.swagger-ui .v-btm-l{vertical-align:bottom}}.swagger-ui .dim{opacity:1;transition:opacity .15s ease-in}.swagger-ui .dim:focus,.swagger-ui .dim:hover{opacity:.5;transition:opacity .15s ease-in}.swagger-ui .dim:active{opacity:.8;transition:opacity .15s ease-out}.swagger-ui .glow{transition:opacity .15s ease-in}.swagger-ui .glow:focus,.swagger-ui .glow:hover{opacity:1;transition:opacity .15s ease-in}.swagger-ui .hide-child .child{opacity:0;transition:opacity .15s ease-in}.swagger-ui .hide-child:active .child,.swagger-ui .hide-child:focus .child,.swagger-ui .hide-child:hover .child{opacity:1;transition:opacity .15s ease-in}.swagger-ui .underline-hover:focus,.swagger-ui .underline-hover:hover{-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .grow{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-out}.swagger-ui .grow:focus,.swagger-ui .grow:hover{transform:scale(1.05)}.swagger-ui .grow:active{transform:scale(.9)}.swagger-ui .grow-large{-moz-osx-font-smoothing:grayscale;backface-visibility:hidden;transform:translateZ(0);transition:transform .25s ease-in-out}.swagger-ui .grow-large:focus,.swagger-ui .grow-large:hover{transform:scale(1.2)}.swagger-ui .grow-large:active{transform:scale(.95)}.swagger-ui .pointer:hover{cursor:pointer}.swagger-ui .shadow-hover{cursor:pointer;position:relative;transition:all .5s cubic-bezier(.165,.84,.44,1)}.swagger-ui .shadow-hover:after{border-radius:inherit;box-shadow:0 0 16px 2px rgba(0,0,0,.2);content:"";height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .5s cubic-bezier(.165,.84,.44,1);width:100%;z-index:-1}.swagger-ui .shadow-hover:focus:after,.swagger-ui .shadow-hover:hover:after{opacity:1}.swagger-ui .bg-animate,.swagger-ui .bg-animate:focus,.swagger-ui .bg-animate:hover{transition:background-color .15s ease-in-out}.swagger-ui .z-0{z-index:0}.swagger-ui .z-1{z-index:1}.swagger-ui .z-2{z-index:2}.swagger-ui .z-3{z-index:3}.swagger-ui .z-4{z-index:4}.swagger-ui .z-5{z-index:5}.swagger-ui .z-999{z-index:999}.swagger-ui .z-9999{z-index:9999}.swagger-ui .z-max{z-index:2147483647}.swagger-ui .z-inherit{z-index:inherit}.swagger-ui .z-initial,.swagger-ui .z-unset{z-index:auto}.swagger-ui .nested-copy-line-height ol,.swagger-ui .nested-copy-line-height p,.swagger-ui .nested-copy-line-height ul{line-height:1.5}.swagger-ui .nested-headline-line-height h1,.swagger-ui .nested-headline-line-height h2,.swagger-ui .nested-headline-line-height h3,.swagger-ui .nested-headline-line-height h4,.swagger-ui .nested-headline-line-height h5,.swagger-ui .nested-headline-line-height h6{line-height:1.25}.swagger-ui .nested-list-reset ol,.swagger-ui .nested-list-reset ul{list-style-type:none;margin-left:0;padding-left:0}.swagger-ui .nested-copy-indent p+p{margin-bottom:0;margin-top:0;text-indent:.1em}.swagger-ui .nested-copy-seperator p+p{margin-top:1.5em}.swagger-ui .nested-img img{display:block;max-width:100%;width:100%}.swagger-ui .nested-links a{color:#357edd;transition:color .15s ease-in}.swagger-ui .nested-links a:focus,.swagger-ui .nested-links a:hover{color:#96ccff;transition:color .15s ease-in}.swagger-ui .wrapper{box-sizing:border-box;margin:0 auto;max-width:1460px;padding:0 20px;width:100%}.swagger-ui .opblock-tag-section{display:flex;flex-direction:column}.swagger-ui .try-out.btn-group{display:flex;flex:.1 2 auto;padding:0}.swagger-ui .try-out__btn{margin-left:1.25rem}.swagger-ui .opblock-tag{align-items:center;border-bottom:1px solid rgba(59,65,81,.3);cursor:pointer;display:flex;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui .opblock-tag:hover{background:rgba(0,0,0,.02)}.swagger-ui .opblock-tag{color:#3b4151;font-family:sans-serif;font-size:24px;margin:0 0 5px}.swagger-ui .opblock-tag.no-desc span{flex:1}.swagger-ui .opblock-tag svg{transition:all .4s}.swagger-ui .opblock-tag small{color:#3b4151;flex:2;font-family:sans-serif;font-size:14px;font-weight:400;padding:0 10px}.swagger-ui .opblock-tag>div{flex:1 1 150px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(max-width:640px){.swagger-ui .opblock-tag small,.swagger-ui .opblock-tag>div{flex:1}}.swagger-ui .opblock-tag .info__externaldocs{text-align:right}.swagger-ui .parameter__type{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;padding:5px 0}.swagger-ui .parameter-controls{margin-top:.75em}.swagger-ui .examples__title{display:block;font-size:1.1em;font-weight:700;margin-bottom:.75em}.swagger-ui .examples__section{margin-top:1.5em}.swagger-ui .examples__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .examples-select{display:inline-block;margin-bottom:.75em}.swagger-ui .examples-select .examples-select-element{width:100%}.swagger-ui .examples-select__section-label{font-size:.9rem;font-weight:700;margin-right:.5rem}.swagger-ui .example__section{margin-top:1.5em}.swagger-ui .example__section-header{font-size:.9rem;font-weight:700;margin-bottom:.5rem}.swagger-ui .view-line-link{cursor:pointer;margin:0 5px;position:relative;top:3px;transition:all .5s;width:20px}.swagger-ui .opblock{border:1px solid #000;border-radius:4px;box-shadow:0 0 3px rgba(0,0,0,.19);margin:0 0 15px}.swagger-ui .opblock .tab-header{display:flex;flex:1}.swagger-ui .opblock .tab-header .tab-item{cursor:pointer;padding:0 40px}.swagger-ui .opblock .tab-header .tab-item:first-of-type{padding:0 40px 0 0}.swagger-ui .opblock .tab-header .tab-item.active h4 span{position:relative}.swagger-ui .opblock .tab-header .tab-item.active h4 span:after{background:grey;bottom:-15px;content:"";height:4px;left:50%;position:absolute;transform:translateX(-50%);width:120%}.swagger-ui .opblock.is-open .opblock-summary{border-bottom:1px solid #000}.swagger-ui .opblock .opblock-section-header{align-items:center;background:hsla(0,0%,100%,.8);box-shadow:0 1px 2px rgba(0,0,0,.1);display:flex;min-height:50px;padding:8px 20px}.swagger-ui .opblock .opblock-section-header>label{align-items:center;color:#3b4151;display:flex;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 0 auto}.swagger-ui .opblock .opblock-section-header>label>span{padding:0 10px 0 0}.swagger-ui .opblock .opblock-section-header h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock .opblock-summary-method{background:#000;border-radius:3px;color:#fff;font-family:sans-serif;font-size:14px;font-weight:700;min-width:80px;padding:6px 0;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1)}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-method{font-size:12px}}.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{align-items:center;color:#3b4151;display:flex;font-family:monospace;font-size:16px;font-weight:600;word-break:break-word}@media(max-width:768px){.swagger-ui .opblock .opblock-summary-operation-id,.swagger-ui .opblock .opblock-summary-path,.swagger-ui .opblock .opblock-summary-path__deprecated{font-size:12px}}.swagger-ui .opblock .opblock-summary-path{flex-shrink:1}@media(max-width:640px){.swagger-ui .opblock .opblock-summary-path{max-width:100%}}.swagger-ui .opblock .opblock-summary-path__deprecated{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .opblock .opblock-summary-operation-id{font-size:14px}.swagger-ui .opblock .opblock-summary-description{color:#3b4151;font-family:sans-serif;font-size:13px;word-break:break-word}.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:center;display:flex;flex-direction:row;flex-grow:1;flex-wrap:wrap;gap:0 10px;padding:0 10px}@media(max-width:550px){.swagger-ui .opblock .opblock-summary-path-description-wrapper{align-items:flex-start;flex-direction:column}}.swagger-ui .opblock .opblock-summary{align-items:center;cursor:pointer;display:flex;padding:5px}.swagger-ui .opblock .opblock-summary .view-line-link{cursor:pointer;margin:0;position:relative;top:2px;transition:all .5s;width:0}.swagger-ui .opblock .opblock-summary:hover .view-line-link{margin:0 5px;width:18px}.swagger-ui .opblock .opblock-summary:hover .view-line-link.copy-to-clipboard{width:24px}.swagger-ui .opblock.opblock-post{background:rgba(73,204,144,.1);border-color:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary-method{background:#49cc90}.swagger-ui .opblock.opblock-post .opblock-summary{border-color:#49cc90}.swagger-ui .opblock.opblock-post .tab-header .tab-item.active h4 span:after{background:#49cc90}.swagger-ui .opblock.opblock-put{background:rgba(252,161,48,.1);border-color:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary-method{background:#fca130}.swagger-ui .opblock.opblock-put .opblock-summary{border-color:#fca130}.swagger-ui .opblock.opblock-put .tab-header .tab-item.active h4 span:after{background:#fca130}.swagger-ui .opblock.opblock-delete{background:rgba(249,62,62,.1);border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#f93e3e}.swagger-ui .opblock.opblock-delete .opblock-summary{border-color:#f93e3e}.swagger-ui .opblock.opblock-delete .tab-header .tab-item.active h4 span:after{background:#f93e3e}.swagger-ui .opblock.opblock-get{background:rgba(97,175,254,.1);border-color:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary-method{background:#61affe}.swagger-ui .opblock.opblock-get .opblock-summary{border-color:#61affe}.swagger-ui .opblock.opblock-get .tab-header .tab-item.active h4 span:after{background:#61affe}.swagger-ui .opblock.opblock-patch{background:rgba(80,227,194,.1);border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#50e3c2}.swagger-ui .opblock.opblock-patch .opblock-summary{border-color:#50e3c2}.swagger-ui .opblock.opblock-patch .tab-header .tab-item.active h4 span:after{background:#50e3c2}.swagger-ui .opblock.opblock-head{background:rgba(144,18,254,.1);border-color:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary-method{background:#9012fe}.swagger-ui .opblock.opblock-head .opblock-summary{border-color:#9012fe}.swagger-ui .opblock.opblock-head .tab-header .tab-item.active h4 span:after{background:#9012fe}.swagger-ui .opblock.opblock-options{background:rgba(13,90,167,.1);border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary-method{background:#0d5aa7}.swagger-ui .opblock.opblock-options .opblock-summary{border-color:#0d5aa7}.swagger-ui .opblock.opblock-options .tab-header .tab-item.active h4 span:after{background:#0d5aa7}.swagger-ui .opblock.opblock-deprecated{background:hsla(0,0%,92%,.1);border-color:#ebebeb;opacity:.6}.swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#ebebeb}.swagger-ui .opblock.opblock-deprecated .opblock-summary{border-color:#ebebeb}.swagger-ui .opblock.opblock-deprecated .tab-header .tab-item.active h4 span:after{background:#ebebeb}.swagger-ui .opblock .opblock-schemes{padding:8px 20px}.swagger-ui .opblock .opblock-schemes .schemes-title{padding:0 10px 0 0}.swagger-ui .filter .operation-filter-input{border:2px solid #d8dde7;margin:20px 0;padding:10px;width:100%}.swagger-ui .download-url-wrapper .failed,.swagger-ui .filter .failed{color:red}.swagger-ui .download-url-wrapper .loading,.swagger-ui .filter .loading{color:#aaa}.swagger-ui .model-example{margin-top:1em}.swagger-ui .model-example .model-container{overflow-x:auto;width:100%}.swagger-ui .model-example .model-container .model-hint:not(.model-hint--embedded){top:-1.15em}.swagger-ui .tab{display:flex;list-style:none;padding:0}.swagger-ui .tab li{color:#3b4151;cursor:pointer;font-family:sans-serif;font-size:12px;min-width:60px;padding:0}.swagger-ui .tab li:first-of-type{padding-left:0;padding-right:12px;position:relative}.swagger-ui .tab li:first-of-type:after{background:rgba(0,0,0,.2);content:"";height:100%;position:absolute;right:6px;top:0;width:1px}.swagger-ui .tab li.active{font-weight:700}.swagger-ui .tab li button.tablinks{background:none;border:0;color:inherit;font-family:inherit;font-weight:inherit;padding:0}.swagger-ui .opblock-description-wrapper,.swagger-ui .opblock-external-docs-wrapper,.swagger-ui .opblock-title_normal{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px;padding:15px 20px}.swagger-ui .opblock-description-wrapper h4,.swagger-ui .opblock-external-docs-wrapper h4,.swagger-ui .opblock-title_normal h4{color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .opblock-description-wrapper p,.swagger-ui .opblock-external-docs-wrapper p,.swagger-ui .opblock-title_normal p{color:#3b4151;font-family:sans-serif;font-size:14px;margin:0}.swagger-ui .opblock-external-docs-wrapper h4{padding-left:0}.swagger-ui .execute-wrapper{padding:20px;text-align:right}.swagger-ui .execute-wrapper .btn{padding:8px 40px;width:100%}.swagger-ui .body-param-options{display:flex;flex-direction:column}.swagger-ui .body-param-options .body-param-edit{padding:10px 0}.swagger-ui .body-param-options label{padding:8px 0}.swagger-ui .body-param-options label select{margin:3px 0 0}.swagger-ui .responses-inner{padding:20px}.swagger-ui .responses-inner h4,.swagger-ui .responses-inner h5{color:#3b4151;font-family:sans-serif;font-size:12px;margin:10px 0 5px}.swagger-ui .responses-inner .curl{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .response-col_status{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .response-col_status .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links{color:#3b4151;font-family:sans-serif;font-size:14px;max-width:40em;padding-left:2em}.swagger-ui .response-col_links .response-undocumented{color:#909090;font-family:monospace;font-size:11px;font-weight:600}.swagger-ui .response-col_links .operation-link{margin-bottom:1.5em}.swagger-ui .response-col_links .operation-link .description{margin-bottom:.5em}.swagger-ui .opblock-body .opblock-loading-animation{display:block;margin:3em auto}.swagger-ui .opblock-body pre.microlight{background:#333;border-radius:4px;font-size:12px;hyphens:auto;margin:0;padding:10px;white-space:pre-wrap;word-break:break-all;word-break:break-word;word-wrap:break-word;color:#fff;font-family:monospace;font-weight:600}.swagger-ui .opblock-body pre.microlight .headerline{display:block}.swagger-ui .highlight-code{position:relative}.swagger-ui .highlight-code>.microlight{max-height:400px;min-height:6em;overflow-y:auto}.swagger-ui .highlight-code>.microlight code{white-space:pre-wrap!important;word-break:break-all}.swagger-ui .curl-command{position:relative}.swagger-ui .download-contents{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;color:#fff;display:flex;font-family:sans-serif;font-size:14px;font-weight:600;height:30px;justify-content:center;padding:5px;position:absolute;right:10px;text-align:center}.swagger-ui .scheme-container{background:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.15);margin:0 0 20px;padding:30px 0}.swagger-ui .scheme-container .schemes{align-items:flex-end;display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between}.swagger-ui .scheme-container .schemes>.schemes-server-container{display:flex;flex-wrap:wrap;gap:10px}.swagger-ui .scheme-container .schemes>.schemes-server-container>label{color:#3b4151;display:flex;flex-direction:column;font-family:sans-serif;font-size:12px;font-weight:700;margin:-20px 15px 0 0}.swagger-ui .scheme-container .schemes>.schemes-server-container>label select{min-width:130px;text-transform:uppercase}.swagger-ui .scheme-container .schemes:not(:has(.schemes-server-container)){justify-content:flex-end}.swagger-ui .scheme-container .schemes .auth-wrapper{flex:none;justify-content:start}.swagger-ui .scheme-container .schemes .auth-wrapper .authorize{display:flex;flex-wrap:nowrap;margin:0;padding-right:20px}.swagger-ui .loading-container{align-items:center;display:flex;flex-direction:column;justify-content:center;margin-top:1em;min-height:1px;padding:40px 0 60px}.swagger-ui .loading-container .loading{position:relative}.swagger-ui .loading-container .loading:after{color:#3b4151;content:"loading";font-family:sans-serif;font-size:10px;font-weight:700;left:50%;position:absolute;text-transform:uppercase;top:50%;transform:translate(-50%,-50%)}.swagger-ui .loading-container .loading:before{animation:rotation 1s linear infinite,opacity .5s;backface-visibility:hidden;border:2px solid rgba(85,85,85,.1);border-radius:100%;border-top-color:rgba(0,0,0,.6);content:"";display:block;height:60px;left:50%;margin:-30px;opacity:1;position:absolute;top:50%;width:60px}@keyframes rotation{to{transform:rotate(1turn)}}.swagger-ui .response-controls{display:flex;padding-top:1em}.swagger-ui .response-control-media-type{margin-right:1em}.swagger-ui .response-control-media-type--accept-controller select{border-color:green}.swagger-ui .response-control-media-type__accept-message{color:green;font-size:.7em}.swagger-ui .response-control-examples__title,.swagger-ui .response-control-media-type__title{display:block;font-size:.7em;margin-bottom:.2em}@keyframes blinker{50%{opacity:0}}.swagger-ui .hidden{display:none}.swagger-ui .no-margin{border:none;height:auto;margin:0;padding:0}.swagger-ui .float-right{float:right}.swagger-ui .svg-assets{height:0;position:absolute;width:0}.swagger-ui section h3{color:#3b4151;font-family:sans-serif}.swagger-ui a.nostyle{display:inline}.swagger-ui a.nostyle,.swagger-ui a.nostyle:visited{color:inherit;cursor:pointer;text-decoration:inherit}.swagger-ui .fallback{color:#aaa;padding:1em}.swagger-ui .version-pragma{height:100%;padding:5em 0}.swagger-ui .version-pragma__message{display:flex;font-size:1.2em;height:100%;justify-content:center;line-height:1.5em;padding:0 .6em;text-align:center}.swagger-ui .version-pragma__message>div{flex:1;max-width:55ch}.swagger-ui .version-pragma__message code{background-color:#dedede;padding:4px 4px 2px;white-space:pre}.swagger-ui .opblock-link{font-weight:400}.swagger-ui .opblock-link.shown{font-weight:700}.swagger-ui span.token-string{color:#555}.swagger-ui span.token-not-formatted{color:#555;font-weight:700}.swagger-ui .btn{background:transparent;border:2px solid grey;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.1);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 23px;transition:all .3s}.swagger-ui .btn.btn-sm{font-size:12px;padding:4px 23px}.swagger-ui .btn[disabled]{cursor:not-allowed;opacity:.3}.swagger-ui .btn:hover{box-shadow:0 0 5px rgba(0,0,0,.3)}.swagger-ui .btn.cancel{background-color:transparent;border-color:#ff6060;color:#ff6060;font-family:sans-serif}.swagger-ui .btn.authorize{background-color:transparent;border-color:#49cc90;color:#49cc90;display:inline;line-height:1}.swagger-ui .btn.authorize span{float:left;padding:4px 20px 0 0}.swagger-ui .btn.authorize svg{fill:#49cc90}.swagger-ui .btn.execute{background-color:#4990e2;border-color:#4990e2;color:#fff}.swagger-ui .btn-group{display:flex;padding:30px}.swagger-ui .btn-group .btn{flex:1}.swagger-ui .btn-group .btn:first-child{border-radius:4px 0 0 4px}.swagger-ui .btn-group .btn:last-child{border-radius:0 4px 4px 0}.swagger-ui .authorization__btn{background:none;border:none;padding:0 0 0 10px}.swagger-ui .authorization__btn .locked{opacity:1}.swagger-ui .authorization__btn .unlocked{opacity:.4}.swagger-ui .model-box-control,.swagger-ui .models-control,.swagger-ui .opblock-summary-control{all:inherit;border-bottom:0;cursor:pointer;flex:1;padding:0}.swagger-ui .model-box-control:focus,.swagger-ui .models-control:focus,.swagger-ui .opblock-summary-control:focus{outline:auto}.swagger-ui .expand-methods,.swagger-ui .expand-operation{background:none;border:none}.swagger-ui .expand-methods svg,.swagger-ui .expand-operation svg{height:20px;width:20px}.swagger-ui .expand-methods{padding:0 10px}.swagger-ui .expand-methods:hover svg{fill:#404040}.swagger-ui .expand-methods svg{transition:all .3s;fill:#707070}.swagger-ui button{cursor:pointer}.swagger-ui button.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .copy-to-clipboard{align-items:center;background:#7d8293;border:none;border-radius:4px;bottom:10px;display:flex;height:30px;justify-content:center;position:absolute;right:100px;width:30px}.swagger-ui .copy-to-clipboard button{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;border:none;flex-grow:1;flex-shrink:1;height:25px}.swagger-ui .copy-to-clipboard:active{background:#5e626f}.swagger-ui .opblock-control-arrow{background:none;border:none;text-align:center}.swagger-ui .curl-command .copy-to-clipboard{bottom:5px;height:20px;right:10px;width:20px}.swagger-ui .curl-command .copy-to-clipboard button{height:18px}.swagger-ui .opblock .opblock-summary .view-line-link.copy-to-clipboard{height:26px;position:static}.swagger-ui select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#f7f7f7 url("data:image/svg+xml;charset=utf-8,") right 10px center no-repeat;background-size:20px;border:2px solid #41444e;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.25);color:#3b4151;font-family:sans-serif;font-size:14px;font-weight:700;padding:5px 40px 5px 10px}.swagger-ui select[multiple]{background:#f7f7f7;margin:5px 0;padding:5px}.swagger-ui select.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui .opblock-body select{min-width:230px}@media(max-width:768px){.swagger-ui .opblock-body select{min-width:180px}}@media(max-width:640px){.swagger-ui .opblock-body select{min-width:100%;width:100%}}.swagger-ui label{color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;margin:0 0 5px}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{line-height:1}@media(max-width:768px){.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text]{max-width:175px}}.swagger-ui input[type=email],.swagger-ui input[type=file],.swagger-ui input[type=password],.swagger-ui input[type=search],.swagger-ui input[type=text],.swagger-ui textarea{background:#fff;border:1px solid #d9d9d9;border-radius:4px;margin:5px 0;min-width:100px;padding:8px 10px}.swagger-ui input[type=email].invalid,.swagger-ui input[type=file].invalid,.swagger-ui input[type=password].invalid,.swagger-ui input[type=search].invalid,.swagger-ui input[type=text].invalid,.swagger-ui textarea.invalid{animation:shake .4s 1;background:#feebeb;border-color:#f93e3e}.swagger-ui input[disabled],.swagger-ui select[disabled],.swagger-ui textarea[disabled]{background-color:#fafafa;color:#888;cursor:not-allowed}.swagger-ui select[disabled]{border-color:#888}.swagger-ui textarea[disabled]{background-color:#41444e;color:#fff}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.swagger-ui textarea{background:hsla(0,0%,100%,.8);border:none;border-radius:4px;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;min-height:280px;outline:none;padding:10px;width:100%}.swagger-ui textarea:focus{border:2px solid #61affe}.swagger-ui textarea.curl{background:#41444e;border-radius:4px;color:#fff;font-family:monospace;font-size:12px;font-weight:600;margin:0;min-height:100px;padding:10px;resize:none}.swagger-ui .checkbox{color:#303030;padding:5px 0 10px;transition:opacity .5s}.swagger-ui .checkbox label{display:flex}.swagger-ui .checkbox p{color:#3b4151;font-family:monospace;font-style:italic;font-weight:400!important;font-weight:600;margin:0!important}.swagger-ui .checkbox input[type=checkbox]{display:none}.swagger-ui .checkbox input[type=checkbox]+label>.item{background:#e8e8e8;border-radius:1px;box-shadow:0 0 0 2px #e8e8e8;cursor:pointer;display:inline-block;flex:none;height:16px;margin:0 8px 0 0;padding:5px;position:relative;top:3px;width:16px}.swagger-ui .checkbox input[type=checkbox]+label>.item:active{transform:scale(.9)}.swagger-ui .checkbox input[type=checkbox]:checked+label>.item{background:#e8e8e8 url("data:image/svg+xml;charset=utf-8,") 50% no-repeat}.swagger-ui .dialog-ux{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999}.swagger-ui .dialog-ux .backdrop-ux{background:rgba(0,0,0,.8);bottom:0;left:0;position:fixed;right:0;top:0}.swagger-ui .dialog-ux .modal-ux{background:#fff;border:1px solid #ebebeb;border-radius:4px;box-shadow:0 10px 30px 0 rgba(0,0,0,.2);left:50%;max-width:650px;min-width:300px;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%;z-index:9999}.swagger-ui .dialog-ux .modal-ux-content{max-height:540px;overflow-y:auto;padding:20px}.swagger-ui .dialog-ux .modal-ux-content p{color:#41444e;color:#3b4151;font-family:sans-serif;font-size:12px;margin:0 0 5px}.swagger-ui .dialog-ux .modal-ux-content h4{color:#3b4151;font-family:sans-serif;font-size:18px;font-weight:600;margin:15px 0 0}.swagger-ui .dialog-ux .modal-ux-header{align-items:center;border-bottom:1px solid #ebebeb;display:flex;padding:12px 0}.swagger-ui .dialog-ux .modal-ux-header .close-modal{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:none;padding:0 10px}.swagger-ui .dialog-ux .modal-ux-header h3{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;font-weight:600;margin:0;padding:0 20px}.swagger-ui .model{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600}.swagger-ui .model .deprecated span,.swagger-ui .model .deprecated td{color:#a0a0a0!important}.swagger-ui .model .deprecated>td:first-of-type{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .model-toggle{cursor:pointer;display:inline-block;font-size:10px;margin:auto .3em;position:relative;top:6px;transform:rotate(90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .model-toggle.collapsed{transform:rotate(0deg)}.swagger-ui .model-toggle:after{background:url("data:image/svg+xml;charset=utf-8,") 50% no-repeat;background-size:100%;content:"";display:block;height:20px;width:20px}.swagger-ui .model-jump-to-path{cursor:pointer;position:relative}.swagger-ui .model-jump-to-path .view-line-link{cursor:pointer;position:absolute;top:-.4em}.swagger-ui .model-title{position:relative}.swagger-ui .model-title:hover .model-hint{display:block}.swagger-ui .model-hint{background:rgba(0,0,0,.7);border-radius:4px;color:#ebebeb;display:none;padding:.1em .5em;position:absolute;top:-1.8em;white-space:nowrap}.swagger-ui .model p{margin:0 0 1em}.swagger-ui .model .property{color:#999;font-style:italic}.swagger-ui .model .property.primitive{color:#6b6b6b}.swagger-ui .model .property.primitive.extension{display:block}.swagger-ui .model .property.primitive.extension>td:first-child{padding-left:0;padding-right:0;width:auto}.swagger-ui .model .property.primitive.extension>td:first-child:after{content:": "}.swagger-ui .model .external-docs,.swagger-ui table.model tr.description{color:#666;font-weight:400}.swagger-ui table.model tr.description td:first-child,.swagger-ui table.model tr.property-row.required td:first-child{font-weight:700}.swagger-ui table.model tr.property-row td{vertical-align:top}.swagger-ui table.model tr.property-row td:first-child{padding-right:.2em}.swagger-ui table.model tr.property-row .star{color:red}.swagger-ui table.model tr.extension{color:#777}.swagger-ui table.model tr.extension td:last-child{vertical-align:top}.swagger-ui table.model tr.external-docs td:first-child{font-weight:700}.swagger-ui table.model tr .renderedMarkdown p:first-child{margin-top:0}.swagger-ui section.models{border:1px solid rgba(59,65,81,.3);border-radius:4px;margin:30px 0}.swagger-ui section.models .pointer{cursor:pointer}.swagger-ui section.models.is-open{padding:0 0 20px}.swagger-ui section.models.is-open h4{border-bottom:1px solid rgba(59,65,81,.3);margin:0 0 5px}.swagger-ui section.models h4{align-items:center;color:#606060;cursor:pointer;display:flex;font-family:sans-serif;font-size:16px;margin:0;padding:10px 20px 10px 10px;transition:all .2s}.swagger-ui section.models h4 svg{transition:all .4s}.swagger-ui section.models h4 span{flex:1}.swagger-ui section.models h4:hover{background:rgba(0,0,0,.02)}.swagger-ui section.models h5{color:#707070;font-family:sans-serif;font-size:16px;margin:0 0 10px}.swagger-ui section.models .model-jump-to-path{position:relative;top:5px}.swagger-ui section.models .model-container{background:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;position:relative;transition:all .5s}.swagger-ui section.models .model-container:hover{background:rgba(0,0,0,.07)}.swagger-ui section.models .model-container:first-of-type{margin:20px}.swagger-ui section.models .model-container:last-of-type{margin:0 20px}.swagger-ui section.models .model-container .models-jump-to-path{opacity:.65;position:absolute;right:5px;top:8px}.swagger-ui section.models .model-box{background:none}.swagger-ui section.models .model-box:has(.model-box){overflow-x:auto;width:100%}.swagger-ui .model-box{background:rgba(0,0,0,.1);border-radius:4px;display:inline-block;padding:10px}.swagger-ui .model-box .model-jump-to-path{position:relative;top:4px}.swagger-ui .model-box.deprecated{opacity:.5}.swagger-ui .model-title{color:#505050;font-family:sans-serif;font-size:16px}.swagger-ui .model-title img{bottom:0;margin-left:1em;position:relative}.swagger-ui .model-deprecated-warning{color:#f93e3e;font-family:sans-serif;font-size:16px;font-weight:600;margin-right:1em}.swagger-ui span>span.model .brace-close{padding:0 0 0 10px}.swagger-ui .prop-name{display:inline-block;margin-right:1em}.swagger-ui .prop-type{color:#55a}.swagger-ui .prop-enum{display:block}.swagger-ui .prop-format{color:#606060}.swagger-ui .servers>label{color:#3b4151;font-family:sans-serif;font-size:12px;margin:-20px 15px 0 0}.swagger-ui .servers>label select{max-width:100%;min-width:130px;width:100%}.swagger-ui .servers h4.message{padding-bottom:2em}.swagger-ui .servers table tr{width:30em}.swagger-ui .servers table td{display:inline-block;max-width:15em;padding-bottom:10px;padding-top:10px;vertical-align:middle}.swagger-ui .servers table td:first-of-type{padding-right:1em}.swagger-ui .servers table td input{height:100%;width:100%}.swagger-ui .servers .computed-url{margin:2em 0}.swagger-ui .servers .computed-url code{display:inline-block;font-size:16px;margin:0 1em;padding:4px}.swagger-ui .servers-title{font-size:12px;font-weight:700}.swagger-ui .operation-servers h4.message{margin-bottom:2em}.swagger-ui table{border-collapse:collapse;padding:0 10px;width:100%}.swagger-ui table.model tbody tr td{padding:0 0 0 1em;vertical-align:top}.swagger-ui table.model tbody tr td:first-of-type{padding:0 0 0 2em;width:174px}.swagger-ui table.headers td{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300;font-weight:600;vertical-align:middle}.swagger-ui table.headers .header-example{color:#999;font-style:italic}.swagger-ui table tbody tr td{padding:10px 0 0;vertical-align:top}.swagger-ui table tbody tr td:first-of-type{min-width:6em;padding:10px 0}.swagger-ui table tbody tr td:has(.model-box){max-width:1px}.swagger-ui table thead tr td,.swagger-ui table thead tr th{border-bottom:1px solid rgba(59,65,81,.2);color:#3b4151;font-family:sans-serif;font-size:12px;font-weight:700;padding:12px 0;text-align:left}.swagger-ui .parameters-col_description{margin-bottom:2em;width:99%}.swagger-ui .parameters-col_description input{max-width:340px;width:100%}.swagger-ui .parameters-col_description select{border-width:1px}.swagger-ui .parameters-col_description .markdown:first-child p:first-child,.swagger-ui .parameters-col_description .renderedMarkdown:first-child p:first-child{margin:0}.swagger-ui .parameter__name{color:#3b4151;font-family:sans-serif;font-size:16px;font-weight:400;margin-right:.75em}.swagger-ui .parameter__name.required{font-weight:700}.swagger-ui .parameter__name.required span{color:red}.swagger-ui .parameter__name.required:after{color:rgba(255,0,0,.6);content:"required";font-size:10px;padding:5px;position:relative;top:-6px}.swagger-ui .parameter__extension,.swagger-ui .parameter__in{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__deprecated{color:red;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .parameter__empty_value_toggle{display:block;font-size:13px;padding-bottom:12px;padding-top:5px}.swagger-ui .parameter__empty_value_toggle input{margin-right:7px;width:auto}.swagger-ui .parameter__empty_value_toggle.disabled{opacity:.7}.swagger-ui .table-container{padding:20px}.swagger-ui .response-col_description{width:99%}.swagger-ui .response-col_description .markdown p:first-child,.swagger-ui .response-col_description .renderedMarkdown p:first-child{margin:0}.swagger-ui .response-col_description .markdown p:last-child,.swagger-ui .response-col_description .renderedMarkdown p:last-child{margin-bottom:0}.swagger-ui .response-col_links{min-width:6em}.swagger-ui .response__extension{color:grey;font-family:monospace;font-size:12px;font-style:italic;font-weight:600}.swagger-ui .topbar{background-color:#1b1b1b;padding:10px 0}.swagger-ui .topbar .topbar-wrapper{align-items:center;display:flex;flex-wrap:wrap;gap:10px}@media(max-width:550px){.swagger-ui .topbar .topbar-wrapper{align-items:start;flex-direction:column}}.swagger-ui .topbar a{align-items:center;color:#fff;display:flex;flex:1;font-family:sans-serif;font-size:1.5em;font-weight:700;max-width:300px;-webkit-text-decoration:none;text-decoration:none}.swagger-ui .topbar a span{margin:0;padding:0 10px}.swagger-ui .topbar .download-url-wrapper{display:flex;flex:3;justify-content:flex-end}.swagger-ui .topbar .download-url-wrapper input[type=text]{border:2px solid #62a03f;border-radius:4px 0 0 4px;margin:0;max-width:100%;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label{align-items:center;color:#f0f0f0;display:flex;margin:0;max-width:600px;width:100%}.swagger-ui .topbar .download-url-wrapper .select-label span{flex:1;font-size:16px;padding:0 10px 0 0;text-align:right}.swagger-ui .topbar .download-url-wrapper .select-label select{border:2px solid #62a03f;box-shadow:none;flex:2;outline:none;width:100%}.swagger-ui .topbar .download-url-wrapper .download-url-button{background:#62a03f;border:none;border-radius:0 4px 4px 0;color:#fff;font-family:sans-serif;font-size:16px;font-weight:700;padding:4px 30px}@media(max-width:550px){.swagger-ui .topbar .download-url-wrapper{width:100%}}.swagger-ui .info{margin:50px 0}.swagger-ui .info.failed-config{margin-left:auto;margin-right:auto;max-width:880px;text-align:center}.swagger-ui .info hgroup.main{margin:0 0 20px}.swagger-ui .info hgroup.main a{font-size:12px}.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info pre,.swagger-ui .info table{font-size:14px}.swagger-ui .info h1,.swagger-ui .info h2,.swagger-ui .info h3,.swagger-ui .info h4,.swagger-ui .info h5,.swagger-ui .info li,.swagger-ui .info p,.swagger-ui .info table{color:#3b4151;font-family:sans-serif}.swagger-ui .info a{color:#4990e2;font-family:sans-serif;font-size:14px;transition:all .4s}.swagger-ui .info a:hover{color:#1f69c0}.swagger-ui .info>div{margin:0 0 5px}.swagger-ui .info .base-url{color:#3b4151;font-family:monospace;font-size:12px;font-weight:300!important;font-weight:600;margin:0}.swagger-ui .info .title{color:#3b4151;font-family:sans-serif;font-size:36px;margin:0}.swagger-ui .info .title small{background:#7d8492;border-radius:57px;display:inline-block;font-size:10px;margin:0 0 0 5px;padding:2px 4px;position:relative;top:-5px;vertical-align:super}.swagger-ui .info .title small.version-stamp{background-color:#89bf04}.swagger-ui .info .title small pre{color:#fff;font-family:sans-serif;margin:0;padding:0}.swagger-ui .auth-btn-wrapper{display:flex;justify-content:center;padding:10px 0}.swagger-ui .auth-btn-wrapper .btn-done{margin-right:1em}.swagger-ui .auth-wrapper{display:flex;flex:1;justify-content:flex-end}.swagger-ui .auth-wrapper .authorize{margin-left:10px;margin-right:10px;padding-right:20px}.swagger-ui .auth-container{border-bottom:1px solid #ebebeb;margin:0 0 10px;padding:10px 20px}.swagger-ui .auth-container:last-of-type{border:0;margin:0;padding:10px 20px}.swagger-ui .auth-container h4{margin:5px 0 15px!important}.swagger-ui .auth-container .wrapper{margin:0;padding:0}.swagger-ui .auth-container input[type=password],.swagger-ui .auth-container input[type=text]{min-width:230px}.swagger-ui .auth-container .errors{background-color:#fee;border-radius:4px;color:red;color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;margin:1em;padding:10px}.swagger-ui .auth-container .errors b{margin-right:1em;text-transform:capitalize}.swagger-ui .scopes h2{color:#3b4151;font-family:sans-serif;font-size:14px}.swagger-ui .scopes h2 a{color:#4990e2;cursor:pointer;font-size:12px;padding-left:10px;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .scope-def{padding:0 0 20px}.swagger-ui .errors-wrapper{animation:scaleUp .5s;background:rgba(249,62,62,.1);border:2px solid #f93e3e;border-radius:4px;margin:20px;padding:10px 20px}.swagger-ui .errors-wrapper .error-wrapper{margin:0 0 10px}.swagger-ui .errors-wrapper .errors h4{color:#3b4151;font-family:monospace;font-size:14px;font-weight:600;margin:0}.swagger-ui .errors-wrapper .errors small{color:#606060}.swagger-ui .errors-wrapper .errors .message{white-space:pre-line}.swagger-ui .errors-wrapper .errors .message.thrown{max-width:100%}.swagger-ui .errors-wrapper .errors .error-line{cursor:pointer;-webkit-text-decoration:underline;text-decoration:underline}.swagger-ui .errors-wrapper hgroup{align-items:center;display:flex}.swagger-ui .errors-wrapper hgroup h4{color:#3b4151;flex:1;font-family:sans-serif;font-size:20px;margin:0}@keyframes scaleUp{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.swagger-ui .Resizer.vertical.disabled{display:none}.swagger-ui .markdown p,.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown p,.swagger-ui .renderedMarkdown pre{margin:1em auto;word-break:break-all;word-break:break-word}.swagger-ui .markdown pre,.swagger-ui .renderedMarkdown pre{background:none;color:#000;font-weight:400;padding:0;white-space:pre-wrap}.swagger-ui .markdown code,.swagger-ui .renderedMarkdown code{background:rgba(0,0,0,.05);border-radius:4px;color:#9012fe;font-family:monospace;font-size:14px;font-weight:600;padding:5px 7px}.swagger-ui .markdown pre>code,.swagger-ui .renderedMarkdown pre>code{display:block}.swagger-ui .json-schema-2020-12-keyword--\$vocabulary ul{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri{margin-left:35px}.swagger-ui .json-schema-2020-12-\$vocabulary-uri--disabled{-webkit-text-decoration:line-through;text-decoration:line-through}.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--const .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12__constraint{background-color:#805ad5;border-radius:4px;color:#3b4151;color:#fff;font-family:monospace;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 3px}.swagger-ui .json-schema-2020-12__constraint--string{background-color:#d69e2e;color:#fff}.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--default .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul{display:inline-block;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--dependentRequired>ul li{display:inline;list-style-type:none}.swagger-ui .json-schema-2020-12-keyword--description{color:#6b6b6b;font-size:12px;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword--description p{margin:0}.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--enum .json-schema-2020-12-json-viewer__value,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-keyword--examples .json-schema-2020-12-json-viewer__value{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__name,.swagger-ui .json-schema-2020-12-json-viewer-extension-keyword .json-schema-2020-12-json-viewer__value{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword--patternProperties ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:after,.swagger-ui .json-schema-2020-12-keyword--patternProperties .json-schema-2020-12__title:first-of-type:before{color:#55a;content:"/"}.swagger-ui .json-schema-2020-12-keyword--properties>ul{border:none;margin:0;padding:0}.swagger-ui .json-schema-2020-12-property{list-style-type:none}.swagger-ui .json-schema-2020-12-property--required>.json-schema-2020-12:first-of-type>.json-schema-2020-12-head .json-schema-2020-12__title:after{color:red;content:"*";font-weight:700}.swagger-ui .json-schema-2020-12__title{color:#505050;display:inline-block;font-family:sans-serif;font-size:12px;font-weight:700;line-height:normal}.swagger-ui .json-schema-2020-12__title .json-schema-2020-12-keyword__name{margin:0}.swagger-ui .json-schema-2020-12-property{margin:7px 0}.swagger-ui .json-schema-2020-12-property .json-schema-2020-12__title{color:#3b4151;font-family:monospace;font-size:12px;font-weight:600;vertical-align:middle}.swagger-ui .json-schema-2020-12-keyword{margin:5px 0}.swagger-ui .json-schema-2020-12-keyword__children{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px;padding:0}.swagger-ui .json-schema-2020-12-keyword__children--collapsed{display:none}.swagger-ui .json-schema-2020-12-keyword__name{font-size:12px;font-weight:700;margin-left:20px}.swagger-ui .json-schema-2020-12-keyword__name--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__name--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__name--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value{color:#6b6b6b;font-size:12px;font-style:italic;font-weight:400}.swagger-ui .json-schema-2020-12-keyword__value--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-keyword__value--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-keyword__value--warning{border:1px dashed red;border-radius:4px;color:#3b4151;color:red;display:inline-block;font-family:monospace;font-style:normal;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 4px}.swagger-ui .json-schema-2020-12-keyword__name--secondary+.json-schema-2020-12-keyword__value--secondary:before{content:"="}.swagger-ui .json-schema-2020-12__attribute{color:#3b4151;font-family:monospace;font-size:12px;padding-left:10px;text-transform:lowercase}.swagger-ui .json-schema-2020-12__attribute--primary{color:#55a}.swagger-ui .json-schema-2020-12__attribute--muted{color:gray}.swagger-ui .json-schema-2020-12__attribute--warning{color:red}.swagger-ui .json-schema-2020-12-json-viewer{margin:5px 0}.swagger-ui .json-schema-2020-12-json-viewer__children{border-left:1px dashed rgba(0,0,0,.1);margin:0 0 0 20px;padding:0}.swagger-ui .json-schema-2020-12-json-viewer__children--collapsed{display:none}.swagger-ui .json-schema-2020-12-json-viewer__name{font-size:12px;font-weight:700;margin-left:20px}.swagger-ui .json-schema-2020-12-json-viewer__name--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer__name--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__name--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value{color:#6b6b6b;font-size:12px;font-style:italic;font-weight:400}.swagger-ui .json-schema-2020-12-json-viewer__value--primary{color:#3b4151;font-style:normal}.swagger-ui .json-schema-2020-12-json-viewer__value--secondary{color:#6b6b6b;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value--extension{color:#929292;font-style:italic}.swagger-ui .json-schema-2020-12-json-viewer__value--warning{border:1px dashed red;border-radius:4px;color:#3b4151;color:red;display:inline-block;font-family:monospace;font-style:normal;font-weight:600;line-height:1.5;margin-left:10px;padding:1px 4px}.swagger-ui .json-schema-2020-12-json-viewer__name--secondary+.json-schema-2020-12-json-viewer__value--secondary:before{content:"="}.swagger-ui .json-schema-2020-12{background-color:rgba(0,0,0,.05);border-radius:4px;margin:0 20px 15px;padding:12px 0 12px 20px}.swagger-ui .json-schema-2020-12:first-of-type{margin:20px}.swagger-ui .json-schema-2020-12:last-of-type{margin:0 20px}.swagger-ui .json-schema-2020-12--embedded{background-color:inherit;padding-bottom:0;padding-left:inherit;padding-right:inherit;padding-top:0}.swagger-ui .json-schema-2020-12-body{border-left:1px dashed rgba(0,0,0,.1);margin:2px 0}.swagger-ui .json-schema-2020-12-body--collapsed{display:none}.swagger-ui .json-schema-2020-12-accordion{border:none;outline:none;padding-left:0}.swagger-ui .json-schema-2020-12-accordion__children{display:inline-block}.swagger-ui .json-schema-2020-12-accordion__icon{display:inline-block;height:18px;vertical-align:bottom;width:18px}.swagger-ui .json-schema-2020-12-accordion__icon--expanded{transform:rotate(-90deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon--collapsed{transform:rotate(0deg);transform-origin:50% 50%;transition:transform .15s ease-in}.swagger-ui .json-schema-2020-12-accordion__icon svg{height:20px;width:20px}.swagger-ui .json-schema-2020-12-expand-deep-button{border:none;color:#505050;color:#afaeae;font-family:sans-serif;font-size:12px;padding-right:0}.swagger-ui .model-box .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px}.swagger-ui .model-box>.json-schema-2020-12{margin:0}.swagger-ui .model-box .json-schema-2020-12{background-color:transparent;padding:0}.swagger-ui .model-box .json-schema-2020-12-accordion,.swagger-ui .model-box .json-schema-2020-12-expand-deep-button{background-color:transparent}.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded)>.json-schema-2020-12-head .json-schema-2020-12__title:first-of-type{font-size:16px}.swagger-ui .models .json-schema-2020-12:not(.json-schema-2020-12--embedded){overflow-x:auto;width:calc(100% - 40px)} + +/*# sourceMappingURL=swagger-ui.css.map*/ diff --git a/LightRAG/lightrag/api/utils_api.py b/LightRAG/lightrag/api/utils_api.py new file mode 100644 index 00000000..47751772 --- /dev/null +++ b/LightRAG/lightrag/api/utils_api.py @@ -0,0 +1,342 @@ +""" +Utility functions for the LightRAG API. +""" + +import os +import argparse +from typing import Optional, List, Tuple +import sys +from ascii_colors import ASCIIColors +from lightrag.api import __api_version__ as api_version +from lightrag import __version__ as core_version +from lightrag.constants import ( + DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, +) +from fastapi import HTTPException, Security, Request, status +from fastapi.security import APIKeyHeader, OAuth2PasswordBearer +from starlette.status import HTTP_403_FORBIDDEN +from .auth import auth_handler +from .config import ollama_server_infos, global_args, get_env_value + + +def check_env_file(): + """ + Check if .env file exists and handle user confirmation if needed. + Returns True if should continue, False if should exit. + """ + if not os.path.exists(".env"): + warning_msg = "Warning: Startup directory must contain .env file for multi-instance support." + ASCIIColors.yellow(warning_msg) + + # Check if running in interactive terminal + if sys.stdin.isatty(): + response = input("Do you want to continue? (yes/no): ") + if response.lower() != "yes": + ASCIIColors.red("Server startup cancelled") + return False + return True + + +# Get whitelist paths from global_args, only once during initialization +whitelist_paths = global_args.whitelist_paths.split(",") + +# Pre-compile path matching patterns +whitelist_patterns: List[Tuple[str, bool]] = [] +for path in whitelist_paths: + path = path.strip() + if path: + # If path ends with /*, match all paths with that prefix + if path.endswith("/*"): + prefix = path[:-2] + whitelist_patterns.append((prefix, True)) # (prefix, is_prefix_match) + else: + whitelist_patterns.append((path, False)) # (exact_path, is_prefix_match) + +# Global authentication configuration +auth_configured = bool(auth_handler.accounts) + + +def get_combined_auth_dependency(api_key: Optional[str] = None): + """ + Create a combined authentication dependency that implements authentication logic + based on API key, OAuth2 token, and whitelist paths. + + Args: + api_key (Optional[str]): API key for validation + + Returns: + Callable: A dependency function that implements the authentication logic + """ + # Use global whitelist_patterns and auth_configured variables + # whitelist_patterns and auth_configured are already initialized at module level + + # Only calculate api_key_configured as it depends on the function parameter + api_key_configured = bool(api_key) + + # Create security dependencies with proper descriptions for Swagger UI + oauth2_scheme = OAuth2PasswordBearer( + tokenUrl="login", auto_error=False, description="OAuth2 Password Authentication" + ) + + # If API key is configured, create an API key header security + api_key_header = None + if api_key_configured: + api_key_header = APIKeyHeader( + name="X-API-Key", auto_error=False, description="API Key Authentication" + ) + + async def combined_dependency( + request: Request, + token: str = Security(oauth2_scheme), + api_key_header_value: Optional[str] = None + if api_key_header is None + else Security(api_key_header), + ): + # 1. Check if path is in whitelist + path = request.url.path + for pattern, is_prefix in whitelist_patterns: + if (is_prefix and path.startswith(pattern)) or ( + not is_prefix and path == pattern + ): + return # Whitelist path, allow access + + # 2. Validate token first if provided in the request (Ensure 401 error if token is invalid) + if token: + try: + token_info = auth_handler.validate_token(token) + # Accept guest token if no auth is configured + if not auth_configured and token_info.get("role") == "guest": + return + # Accept non-guest token if auth is configured + if auth_configured and token_info.get("role") != "guest": + return + + # Token validation failed, immediately return 401 error + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid token. Please login again.", + ) + except HTTPException as e: + # If already a 401 error, re-raise it + if e.status_code == status.HTTP_401_UNAUTHORIZED: + raise + # For other exceptions, continue processing + + # 3. Acept all request if no API protection needed + if not auth_configured and not api_key_configured: + return + + # 4. Validate API key if provided and API-Key authentication is configured + if ( + api_key_configured + and api_key_header_value + and api_key_header_value == api_key + ): + return # API key validation successful + + ### Authentication failed #### + + # if password authentication is configured but not provided, ensure 401 error if auth_configured + if auth_configured and not token: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="No credentials provided. Please login.", + ) + + # if api key is provided but validation failed + if api_key_header_value: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="Invalid API Key", + ) + + # if api_key_configured but not provided + if api_key_configured and not api_key_header_value: + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="API Key required", + ) + + # Otherwise: refuse access and return 403 error + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="API Key required or login authentication required.", + ) + + return combined_dependency + + +def display_splash_screen(args: argparse.Namespace) -> None: + """ + Display a colorful splash screen showing LightRAG server configuration + + Args: + args: Parsed command line arguments + """ + # Banner + # Banner + top_border = "╔══════════════════════════════════════════════════════════════╗" + bottom_border = "╚══════════════════════════════════════════════════════════════╝" + width = len(top_border) - 4 # width inside the borders + + line1_text = f"LightRAG Server v{core_version}/{api_version}" + line2_text = "Fast, Lightweight RAG Server Implementation" + + line1 = f"║ {line1_text.center(width)} ║" + line2 = f"║ {line2_text.center(width)} ║" + + banner = f""" + {top_border} + {line1} + {line2} + {bottom_border} + """ + ASCIIColors.cyan(banner) + + # Server Configuration + ASCIIColors.magenta("\n📡 Server Configuration:") + ASCIIColors.white(" ├─ Host: ", end="") + ASCIIColors.yellow(f"{args.host}") + ASCIIColors.white(" ├─ Port: ", end="") + ASCIIColors.yellow(f"{args.port}") + ASCIIColors.white(" ├─ Workers: ", end="") + ASCIIColors.yellow(f"{args.workers}") + ASCIIColors.white(" ├─ Timeout: ", end="") + ASCIIColors.yellow(f"{args.timeout}") + ASCIIColors.white(" ├─ CORS Origins: ", end="") + ASCIIColors.yellow(f"{args.cors_origins}") + ASCIIColors.white(" ├─ SSL Enabled: ", end="") + ASCIIColors.yellow(f"{args.ssl}") + if args.ssl: + ASCIIColors.white(" ├─ SSL Cert: ", end="") + ASCIIColors.yellow(f"{args.ssl_certfile}") + ASCIIColors.white(" ├─ SSL Key: ", end="") + ASCIIColors.yellow(f"{args.ssl_keyfile}") + ASCIIColors.white(" ├─ Ollama Emulating Model: ", end="") + ASCIIColors.yellow(f"{ollama_server_infos.LIGHTRAG_MODEL}") + ASCIIColors.white(" ├─ Log Level: ", end="") + ASCIIColors.yellow(f"{args.log_level}") + ASCIIColors.white(" ├─ Verbose Debug: ", end="") + ASCIIColors.yellow(f"{args.verbose}") + ASCIIColors.white(" ├─ API Key: ", end="") + ASCIIColors.yellow("Set" if args.key else "Not Set") + ASCIIColors.white(" └─ JWT Auth: ", end="") + ASCIIColors.yellow("Enabled" if args.auth_accounts else "Disabled") + + # Directory Configuration + ASCIIColors.magenta("\n📂 Directory Configuration:") + ASCIIColors.white(" ├─ Working Directory: ", end="") + ASCIIColors.yellow(f"{args.working_dir}") + ASCIIColors.white(" └─ Input Directory: ", end="") + ASCIIColors.yellow(f"{args.input_dir}") + + # LLM Configuration + ASCIIColors.magenta("\n🤖 LLM Configuration:") + ASCIIColors.white(" ├─ Binding: ", end="") + ASCIIColors.yellow(f"{args.llm_binding}") + ASCIIColors.white(" ├─ Host: ", end="") + ASCIIColors.yellow(f"{args.llm_binding_host}") + ASCIIColors.white(" ├─ Model: ", end="") + ASCIIColors.yellow(f"{args.llm_model}") + ASCIIColors.white(" ├─ Max Async for LLM: ", end="") + ASCIIColors.yellow(f"{args.max_async}") + ASCIIColors.white(" ├─ Summary Context Size: ", end="") + ASCIIColors.yellow(f"{args.summary_context_size}") + ASCIIColors.white(" ├─ LLM Cache Enabled: ", end="") + ASCIIColors.yellow(f"{args.enable_llm_cache}") + ASCIIColors.white(" └─ LLM Cache for Extraction Enabled: ", end="") + ASCIIColors.yellow(f"{args.enable_llm_cache_for_extract}") + + # Embedding Configuration + ASCIIColors.magenta("\n📊 Embedding Configuration:") + ASCIIColors.white(" ├─ Binding: ", end="") + ASCIIColors.yellow(f"{args.embedding_binding}") + ASCIIColors.white(" ├─ Host: ", end="") + ASCIIColors.yellow(f"{args.embedding_binding_host}") + ASCIIColors.white(" ├─ Model: ", end="") + ASCIIColors.yellow(f"{args.embedding_model}") + ASCIIColors.white(" └─ Dimensions: ", end="") + ASCIIColors.yellow(f"{args.embedding_dim}") + + # RAG Configuration + ASCIIColors.magenta("\n⚙️ RAG Configuration:") + ASCIIColors.white(" ├─ Summary Language: ", end="") + ASCIIColors.yellow(f"{args.summary_language}") + ASCIIColors.white(" ├─ Entity Types: ", end="") + ASCIIColors.yellow(f"{args.entity_types}") + ASCIIColors.white(" ├─ Max Parallel Insert: ", end="") + ASCIIColors.yellow(f"{args.max_parallel_insert}") + ASCIIColors.white(" ├─ Chunk Size: ", end="") + ASCIIColors.yellow(f"{args.chunk_size}") + ASCIIColors.white(" ├─ Chunk Overlap Size: ", end="") + ASCIIColors.yellow(f"{args.chunk_overlap_size}") + ASCIIColors.white(" ├─ Cosine Threshold: ", end="") + ASCIIColors.yellow(f"{args.cosine_threshold}") + ASCIIColors.white(" ├─ Top-K: ", end="") + ASCIIColors.yellow(f"{args.top_k}") + ASCIIColors.white(" └─ Force LLM Summary on Merge: ", end="") + ASCIIColors.yellow( + f"{get_env_value('FORCE_LLM_SUMMARY_ON_MERGE', DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, int)}" + ) + + # System Configuration + ASCIIColors.magenta("\n💾 Storage Configuration:") + ASCIIColors.white(" ├─ KV Storage: ", end="") + ASCIIColors.yellow(f"{args.kv_storage}") + ASCIIColors.white(" ├─ Vector Storage: ", end="") + ASCIIColors.yellow(f"{args.vector_storage}") + ASCIIColors.white(" ├─ Graph Storage: ", end="") + ASCIIColors.yellow(f"{args.graph_storage}") + ASCIIColors.white(" ├─ Document Status Storage: ", end="") + ASCIIColors.yellow(f"{args.doc_status_storage}") + ASCIIColors.white(" └─ Workspace: ", end="") + ASCIIColors.yellow(f"{args.workspace if args.workspace else '-'}") + + # Server Status + ASCIIColors.green("\n✨ Server starting up...\n") + + # Server Access Information + protocol = "https" if args.ssl else "http" + if args.host == "0.0.0.0": + ASCIIColors.magenta("\n🌐 Server Access Information:") + ASCIIColors.white(" ├─ WebUI (local): ", end="") + ASCIIColors.yellow(f"{protocol}://localhost:{args.port}") + ASCIIColors.white(" ├─ Remote Access: ", end="") + ASCIIColors.yellow(f"{protocol}://:{args.port}") + ASCIIColors.white(" ├─ API Documentation (local): ", end="") + ASCIIColors.yellow(f"{protocol}://localhost:{args.port}/docs") + ASCIIColors.white(" └─ Alternative Documentation (local): ", end="") + ASCIIColors.yellow(f"{protocol}://localhost:{args.port}/redoc") + + ASCIIColors.magenta("\n📝 Note:") + ASCIIColors.cyan(""" Since the server is running on 0.0.0.0: + - Use 'localhost' or '127.0.0.1' for local access + - Use your machine's IP address for remote access + - To find your IP address: + • Windows: Run 'ipconfig' in terminal + • Linux/Mac: Run 'ifconfig' or 'ip addr' in terminal + """) + else: + base_url = f"{protocol}://{args.host}:{args.port}" + ASCIIColors.magenta("\n🌐 Server Access Information:") + ASCIIColors.white(" ├─ WebUI (local): ", end="") + ASCIIColors.yellow(f"{base_url}") + ASCIIColors.white(" ├─ API Documentation: ", end="") + ASCIIColors.yellow(f"{base_url}/docs") + ASCIIColors.white(" └─ Alternative Documentation: ", end="") + ASCIIColors.yellow(f"{base_url}/redoc") + + # Security Notice + if args.key: + ASCIIColors.yellow("\n⚠️ Security Notice:") + ASCIIColors.white(""" API Key authentication is enabled. + Make sure to include the X-API-Key header in all your requests. + """) + if args.auth_accounts: + ASCIIColors.yellow("\n⚠️ Security Notice:") + ASCIIColors.white(""" JWT authentication is enabled. + Make sure to login before making the request, and include the 'Authorization' in the header. + """) + + # Ensure splash output flush to system log + sys.stdout.flush() diff --git a/LightRAG/lightrag/base.py b/LightRAG/lightrag/base.py new file mode 100644 index 00000000..bae0728b --- /dev/null +++ b/LightRAG/lightrag/base.py @@ -0,0 +1,869 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from enum import Enum +import os +from dotenv import load_dotenv +from dataclasses import dataclass, field +from typing import ( + Any, + Literal, + TypedDict, + TypeVar, + Callable, + Optional, + Dict, + List, + AsyncIterator, +) +from .utils import EmbeddingFunc +from .types import KnowledgeGraph +from .constants import ( + DEFAULT_TOP_K, + DEFAULT_CHUNK_TOP_K, + DEFAULT_MAX_ENTITY_TOKENS, + DEFAULT_MAX_RELATION_TOKENS, + DEFAULT_MAX_TOTAL_TOKENS, + DEFAULT_HISTORY_TURNS, + DEFAULT_OLLAMA_MODEL_NAME, + DEFAULT_OLLAMA_MODEL_TAG, + DEFAULT_OLLAMA_MODEL_SIZE, + DEFAULT_OLLAMA_CREATED_AT, + DEFAULT_OLLAMA_DIGEST, +) + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +class OllamaServerInfos: + def __init__(self, name=None, tag=None): + self._lightrag_name = name or os.getenv( + "OLLAMA_EMULATING_MODEL_NAME", DEFAULT_OLLAMA_MODEL_NAME + ) + self._lightrag_tag = tag or os.getenv( + "OLLAMA_EMULATING_MODEL_TAG", DEFAULT_OLLAMA_MODEL_TAG + ) + self.LIGHTRAG_SIZE = DEFAULT_OLLAMA_MODEL_SIZE + self.LIGHTRAG_CREATED_AT = DEFAULT_OLLAMA_CREATED_AT + self.LIGHTRAG_DIGEST = DEFAULT_OLLAMA_DIGEST + + @property + def LIGHTRAG_NAME(self): + return self._lightrag_name + + @LIGHTRAG_NAME.setter + def LIGHTRAG_NAME(self, value): + self._lightrag_name = value + + @property + def LIGHTRAG_TAG(self): + return self._lightrag_tag + + @LIGHTRAG_TAG.setter + def LIGHTRAG_TAG(self, value): + self._lightrag_tag = value + + @property + def LIGHTRAG_MODEL(self): + return f"{self._lightrag_name}:{self._lightrag_tag}" + + +class TextChunkSchema(TypedDict): + tokens: int + content: str + full_doc_id: str + chunk_order_index: int + + +T = TypeVar("T") + + +@dataclass +class QueryParam: + """Configuration parameters for query execution in LightRAG.""" + + mode: Literal["local", "global", "hybrid", "naive", "mix", "bypass"] = "mix" + """Specifies the retrieval mode: + - "local": Focuses on context-dependent information. + - "global": Utilizes global knowledge. + - "hybrid": Combines local and global retrieval methods. + - "naive": Performs a basic search without advanced techniques. + - "mix": Integrates knowledge graph and vector retrieval. + """ + + only_need_context: bool = False + """If True, only returns the retrieved context without generating a response.""" + + only_need_prompt: bool = False + """If True, only returns the generated prompt without producing a response.""" + + response_type: str = "Multiple Paragraphs" + """Defines the response format. Examples: 'Multiple Paragraphs', 'Single Paragraph', 'Bullet Points'.""" + + stream: bool = False + """If True, enables streaming output for real-time responses.""" + + top_k: int = int(os.getenv("TOP_K", str(DEFAULT_TOP_K))) + """Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode.""" + + chunk_top_k: int = int(os.getenv("CHUNK_TOP_K", str(DEFAULT_CHUNK_TOP_K))) + """Number of text chunks to retrieve initially from vector search and keep after reranking. + If None, defaults to top_k value. + """ + + max_entity_tokens: int = int( + os.getenv("MAX_ENTITY_TOKENS", str(DEFAULT_MAX_ENTITY_TOKENS)) + ) + """Maximum number of tokens allocated for entity context in unified token control system.""" + + max_relation_tokens: int = int( + os.getenv("MAX_RELATION_TOKENS", str(DEFAULT_MAX_RELATION_TOKENS)) + ) + """Maximum number of tokens allocated for relationship context in unified token control system.""" + + max_total_tokens: int = int( + os.getenv("MAX_TOTAL_TOKENS", str(DEFAULT_MAX_TOTAL_TOKENS)) + ) + """Maximum total tokens budget for the entire query context (entities + relations + chunks + system prompt).""" + + hl_keywords: list[str] = field(default_factory=list) + """List of high-level keywords to prioritize in retrieval.""" + + ll_keywords: list[str] = field(default_factory=list) + """List of low-level keywords to refine retrieval focus.""" + + # History mesages is only send to LLM for context, not used for retrieval + conversation_history: list[dict[str, str]] = field(default_factory=list) + """Stores past conversation history to maintain context. + Format: [{"role": "user/assistant", "content": "message"}]. + """ + + # TODO: deprecated. No longer used in the codebase, all conversation_history messages is send to LLM + history_turns: int = int(os.getenv("HISTORY_TURNS", str(DEFAULT_HISTORY_TURNS))) + """Number of complete conversation turns (user-assistant pairs) to consider in the response context.""" + + model_func: Callable[..., object] | None = None + """Optional override for the LLM model function to use for this specific query. + If provided, this will be used instead of the global model function. + This allows using different models for different query modes. + """ + + user_prompt: str | None = None + """User-provided prompt for the query. + Addition instructions for LLM. If provided, this will be inject into the prompt template. + It's purpose is the let user customize the way LLM generate the response. + """ + + enable_rerank: bool = os.getenv("RERANK_BY_DEFAULT", "true").lower() == "true" + """Enable reranking for retrieved text chunks. If True but no rerank model is configured, a warning will be issued. + Default is True to enable reranking when rerank model is available. + """ + + include_references: bool = False + """If True, includes reference list in the response for supported endpoints. + This parameter controls whether the API response includes a references field + containing citation information for the retrieved content. + """ + + +@dataclass +class StorageNameSpace(ABC): + namespace: str + workspace: str + global_config: dict[str, Any] + + async def initialize(self): + """Initialize the storage""" + pass + + async def finalize(self): + """Finalize the storage""" + pass + + @abstractmethod + async def index_done_callback(self) -> None: + """Commit the storage operations after indexing""" + + @abstractmethod + async def drop(self) -> dict[str, str]: + """Drop all data from storage and clean up resources + + This abstract method defines the contract for dropping all data from a storage implementation. + Each storage type must implement this method to: + 1. Clear all data from memory and/or external storage + 2. Remove any associated storage files if applicable + 3. Reset the storage to its initial state + 4. Handle cleanup of any resources + 5. Notify other processes if necessary + 6. This action should persistent the data to disk immediately. + + Returns: + dict[str, str]: Operation status and message with the following format: + { + "status": str, # "success" or "error" + "message": str # "data dropped" on success, error details on failure + } + + Implementation specific: + - On success: return {"status": "success", "message": "data dropped"} + - On failure: return {"status": "error", "message": ""} + - If not supported: return {"status": "error", "message": "unsupported"} + """ + + +@dataclass +class BaseVectorStorage(StorageNameSpace, ABC): + embedding_func: EmbeddingFunc + cosine_better_than_threshold: float = field(default=0.2) + meta_fields: set[str] = field(default_factory=set) + + @abstractmethod + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + """Query the vector storage and retrieve top_k results. + + Args: + query: The query string to search for + top_k: Number of top results to return + query_embedding: Optional pre-computed embedding for the query. + If provided, skips embedding computation for better performance. + """ + + @abstractmethod + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """Insert or update vectors in the storage. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + + @abstractmethod + async def delete_entity(self, entity_name: str) -> None: + """Delete a single entity by its name. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + + @abstractmethod + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete relations for a given entity. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + + @abstractmethod + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + pass + + @abstractmethod + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + pass + + @abstractmethod + async def delete(self, ids: list[str]): + """Delete vectors with specified IDs + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + ids: List of vector IDs to be deleted + """ + + @abstractmethod + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + pass + + +@dataclass +class BaseKVStorage(StorageNameSpace, ABC): + embedding_func: EmbeddingFunc + + @abstractmethod + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get value by id""" + + @abstractmethod + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get values by ids""" + + @abstractmethod + async def filter_keys(self, keys: set[str]) -> set[str]: + """Return un-exist keys""" + + @abstractmethod + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """Upsert data + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + """ + + @abstractmethod + async def delete(self, ids: list[str]) -> None: + """Delete specific records from storage by their IDs + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + + Args: + ids (list[str]): List of document IDs to be deleted from storage + + Returns: + None + """ + + @abstractmethod + async def is_empty(self) -> bool: + """Check if the storage is empty + + Returns: + bool: True if storage contains no data, False otherwise + """ + + +@dataclass +class BaseGraphStorage(StorageNameSpace, ABC): + """All operations related to edges in graph should be undirected.""" + + embedding_func: EmbeddingFunc + + @abstractmethod + async def has_node(self, node_id: str) -> bool: + """Check if a node exists in the graph. + + Args: + node_id: The ID of the node to check + + Returns: + True if the node exists, False otherwise + """ + + @abstractmethod + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + """Check if an edge exists between two nodes. + + Args: + source_node_id: The ID of the source node + target_node_id: The ID of the target node + + Returns: + True if the edge exists, False otherwise + """ + + @abstractmethod + async def node_degree(self, node_id: str) -> int: + """Get the degree (number of connected edges) of a node. + + Args: + node_id: The ID of the node + + Returns: + The number of edges connected to the node + """ + + @abstractmethod + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + """Get the total degree of an edge (sum of degrees of its source and target nodes). + + Args: + src_id: The ID of the source node + tgt_id: The ID of the target node + + Returns: + The sum of the degrees of the source and target nodes + """ + + @abstractmethod + async def get_node(self, node_id: str) -> dict[str, str] | None: + """Get node by its ID, returning only node properties. + + Args: + node_id: The ID of the node to retrieve + + Returns: + A dictionary of node properties if found, None otherwise + """ + + @abstractmethod + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + """Get edge properties between two nodes. + + Args: + source_node_id: The ID of the source node + target_node_id: The ID of the target node + + Returns: + A dictionary of edge properties if found, None otherwise + """ + + @abstractmethod + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + """Get all edges connected to a node. + + Args: + source_node_id: The ID of the node to get edges for + + Returns: + A list of (source_id, target_id) tuples representing edges, + or None if the node doesn't exist + """ + + async def get_nodes_batch(self, node_ids: list[str]) -> dict[str, dict]: + """Get nodes as a batch using UNWIND + + Default implementation fetches nodes one by one. + Override this method for better performance in storage backends + that support batch operations. + """ + result = {} + for node_id in node_ids: + node = await self.get_node(node_id) + if node is not None: + result[node_id] = node + return result + + async def node_degrees_batch(self, node_ids: list[str]) -> dict[str, int]: + """Node degrees as a batch using UNWIND + + Default implementation fetches node degrees one by one. + Override this method for better performance in storage backends + that support batch operations. + """ + result = {} + for node_id in node_ids: + degree = await self.node_degree(node_id) + result[node_id] = degree + return result + + async def edge_degrees_batch( + self, edge_pairs: list[tuple[str, str]] + ) -> dict[tuple[str, str], int]: + """Edge degrees as a batch using UNWIND also uses node_degrees_batch + + Default implementation calculates edge degrees one by one. + Override this method for better performance in storage backends + that support batch operations. + """ + result = {} + for src_id, tgt_id in edge_pairs: + degree = await self.edge_degree(src_id, tgt_id) + result[(src_id, tgt_id)] = degree + return result + + async def get_edges_batch( + self, pairs: list[dict[str, str]] + ) -> dict[tuple[str, str], dict]: + """Get edges as a batch using UNWIND + + Default implementation fetches edges one by one. + Override this method for better performance in storage backends + that support batch operations. + """ + result = {} + for pair in pairs: + src_id = pair["src"] + tgt_id = pair["tgt"] + edge = await self.get_edge(src_id, tgt_id) + if edge is not None: + result[(src_id, tgt_id)] = edge + return result + + async def get_nodes_edges_batch( + self, node_ids: list[str] + ) -> dict[str, list[tuple[str, str]]]: + """Get nodes edges as a batch using UNWIND + + Default implementation fetches node edges one by one. + Override this method for better performance in storage backends + that support batch operations. + """ + result = {} + for node_id in node_ids: + edges = await self.get_node_edges(node_id) + result[node_id] = edges if edges is not None else [] + return result + + @abstractmethod + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """Insert a new node or update an existing node in the graph. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + node_id: The ID of the node to insert or update + node_data: A dictionary of node properties + """ + + @abstractmethod + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """Insert a new edge or update an existing edge in the graph. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + source_node_id: The ID of the source node + target_node_id: The ID of the target node + edge_data: A dictionary of edge properties + """ + + @abstractmethod + async def delete_node(self, node_id: str) -> None: + """Delete a node from the graph. + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + node_id: The ID of the node to delete + """ + + @abstractmethod + async def remove_nodes(self, nodes: list[str]): + """Delete multiple nodes + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + nodes: List of node IDs to be deleted + """ + + @abstractmethod + async def remove_edges(self, edges: list[tuple[str, str]]): + """Delete multiple edges + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + edges: List of edges to be deleted, each edge is a (source, target) tuple + """ + + # TODO: deprecated + @abstractmethod + async def get_all_labels(self) -> list[str]: + """Get all labels in the graph. + + Returns: + A list of all node labels in the graph, sorted alphabetically + """ + + @abstractmethod + async def get_knowledge_graph( + self, node_label: str, max_depth: int = 3, max_nodes: int = 1000 + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node,* means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maxiumu nodes to return, Defaults to 1000(BFS if possible) + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + """ + + @abstractmethod + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + (Edge is bidirectional for some storage implementation; deduplication must be handled by the caller) + """ + + @abstractmethod + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + """ + + @abstractmethod + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """Get popular labels by node degree (most connected entities) + + Args: + limit: Maximum number of labels to return + + Returns: + List of labels sorted by degree (highest first) + """ + + @abstractmethod + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """Search labels with fuzzy matching + + Args: + query: Search query string + limit: Maximum number of results to return + + Returns: + List of matching labels sorted by relevance + """ + + +class DocStatus(str, Enum): + """Document processing status""" + + PENDING = "pending" + PROCESSING = "processing" + PREPROCESSED = "preprocessed" + PROCESSED = "processed" + FAILED = "failed" + + +@dataclass +class DocProcessingStatus: + """Document processing status data structure""" + + content_summary: str + """First 100 chars of document content, used for preview""" + content_length: int + """Total length of document""" + file_path: str + """File path of the document""" + status: DocStatus + """Current processing status""" + created_at: str + """ISO format timestamp when document was created""" + updated_at: str + """ISO format timestamp when document was last updated""" + track_id: str | None = None + """Tracking ID for monitoring progress""" + chunks_count: int | None = None + """Number of chunks after splitting, used for processing""" + chunks_list: list[str] | None = field(default_factory=list) + """List of chunk IDs associated with this document, used for deletion""" + error_msg: str | None = None + """Error message if failed""" + metadata: dict[str, Any] = field(default_factory=dict) + """Additional metadata""" + multimodal_processed: bool | None = field(default=None, repr=False) + """Internal field: indicates if multimodal processing is complete. Not shown in repr() but accessible for debugging.""" + + def __post_init__(self): + """ + Handle status conversion based on multimodal_processed field. + + Business rules: + - If multimodal_processed is False and status is PROCESSED, + then change status to PREPROCESSED + - The multimodal_processed field is kept (with repr=False) for internal use and debugging + """ + # Apply status conversion logic + if self.multimodal_processed is not None: + if ( + self.multimodal_processed is False + and self.status == DocStatus.PROCESSED + ): + self.status = DocStatus.PREPROCESSED + + +@dataclass +class DocStatusStorage(BaseKVStorage, ABC): + """Base class for document status storage""" + + @abstractmethod + async def get_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status""" + + @abstractmethod + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific status""" + + @abstractmethod + async def get_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific track_id""" + + @abstractmethod + async def get_docs_paginated( + self, + status_filter: DocStatus | None = None, + page: int = 1, + page_size: int = 50, + sort_field: str = "updated_at", + sort_direction: str = "desc", + ) -> tuple[list[tuple[str, DocProcessingStatus]], int]: + """Get documents with pagination support + + Args: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', 'id') + sort_direction: Sort direction ('asc' or 'desc') + + Returns: + Tuple of (list of (doc_id, DocProcessingStatus) tuples, total_count) + """ + + @abstractmethod + async def get_all_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status for all documents + + Returns: + Dictionary mapping status names to counts + """ + + @abstractmethod + async def get_doc_by_file_path(self, file_path: str) -> dict[str, Any] | None: + """Get document by file path + + Args: + file_path: The file path to search for + + Returns: + dict[str, Any] | None: Document data if found, None otherwise + Returns the same format as get_by_ids method + """ + + +class StoragesStatus(str, Enum): + """Storages status""" + + NOT_CREATED = "not_created" + CREATED = "created" + INITIALIZED = "initialized" + FINALIZED = "finalized" + + +@dataclass +class DeletionResult: + """Represents the result of a deletion operation.""" + + status: Literal["success", "not_found", "fail"] + doc_id: str + message: str + status_code: int = 200 + file_path: str | None = None + + +# Unified Query Result Data Structures for Reference List Support + + +@dataclass +class QueryResult: + """ + Unified query result data structure for all query modes. + + Attributes: + content: Text content for non-streaming responses + response_iterator: Streaming response iterator for streaming responses + raw_data: Complete structured data including references and metadata + is_streaming: Whether this is a streaming result + """ + + content: Optional[str] = None + response_iterator: Optional[AsyncIterator[str]] = None + raw_data: Optional[Dict[str, Any]] = None + is_streaming: bool = False + + @property + def reference_list(self) -> List[Dict[str, str]]: + """ + Convenient property to extract reference list from raw_data. + + Returns: + List[Dict[str, str]]: Reference list in format: + [{"reference_id": "1", "file_path": "/path/to/file.pdf"}, ...] + """ + if self.raw_data: + return self.raw_data.get("data", {}).get("references", []) + return [] + + @property + def metadata(self) -> Dict[str, Any]: + """ + Convenient property to extract metadata from raw_data. + + Returns: + Dict[str, Any]: Query metadata including query_mode, keywords, etc. + """ + if self.raw_data: + return self.raw_data.get("metadata", {}) + return {} + + +@dataclass +class QueryContextResult: + """ + Unified query context result data structure. + + Attributes: + context: LLM context string + raw_data: Complete structured data including reference_list + """ + + context: str + raw_data: Dict[str, Any] + + @property + def reference_list(self) -> List[Dict[str, str]]: + """Convenient property to extract reference list from raw_data.""" + return self.raw_data.get("data", {}).get("references", []) diff --git a/LightRAG/lightrag/constants.py b/LightRAG/lightrag/constants.py new file mode 100644 index 00000000..eedecd65 --- /dev/null +++ b/LightRAG/lightrag/constants.py @@ -0,0 +1,111 @@ +""" +Centralized configuration constants for LightRAG. + +This module defines default values for configuration constants used across +different parts of the LightRAG system. Centralizing these values ensures +consistency and makes maintenance easier. +""" + +# Default values for server settings +DEFAULT_WOKERS = 2 +DEFAULT_MAX_GRAPH_NODES = 1000 + +# Default values for extraction settings +DEFAULT_SUMMARY_LANGUAGE = "English" # Default language for document processing +DEFAULT_MAX_GLEANING = 1 +DEFAULT_ENTITY_NAME_MAX_LENGTH = 256 + +# Number of description fragments to trigger LLM summary +DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE = 8 +# Max description token size to trigger LLM summary +DEFAULT_SUMMARY_MAX_TOKENS = 1200 +# Recommended LLM summary output length in tokens +DEFAULT_SUMMARY_LENGTH_RECOMMENDED = 600 +# Maximum token size sent to LLM for summary +DEFAULT_SUMMARY_CONTEXT_SIZE = 12000 +# Default entities to extract if ENTITY_TYPES is not specified in .env +DEFAULT_ENTITY_TYPES = [ + "Person", + "Creature", + "Organization", + "Location", + "Event", + "Concept", + "Method", + "Content", + "Data", + "Artifact", + "NaturalObject", +] + +# Separator for: description, source_id and relation-key fields(Can not be changed after data inserted) +GRAPH_FIELD_SEP = "" + +# Query and retrieval configuration defaults +DEFAULT_TOP_K = 40 +DEFAULT_CHUNK_TOP_K = 20 +DEFAULT_MAX_ENTITY_TOKENS = 6000 +DEFAULT_MAX_RELATION_TOKENS = 8000 +DEFAULT_MAX_TOTAL_TOKENS = 30000 +DEFAULT_COSINE_THRESHOLD = 0.2 +DEFAULT_RELATED_CHUNK_NUMBER = 5 +DEFAULT_KG_CHUNK_PICK_METHOD = "VECTOR" + +# TODO: Deprated. All conversation_history messages is send to LLM. +DEFAULT_HISTORY_TURNS = 0 + +# Rerank configuration defaults +DEFAULT_MIN_RERANK_SCORE = 0.0 +DEFAULT_RERANK_BINDING = "null" + +# Default source ids limit in meta data for entity and relation +DEFAULT_MAX_SOURCE_IDS_PER_ENTITY = 300 +DEFAULT_MAX_SOURCE_IDS_PER_RELATION = 300 +### control chunk_ids limitation method: FIFO, FIFO +### FIFO: First in first out +### KEEP: Keep oldest (less merge action and faster) +SOURCE_IDS_LIMIT_METHOD_KEEP = "KEEP" +SOURCE_IDS_LIMIT_METHOD_FIFO = "FIFO" +DEFAULT_SOURCE_IDS_LIMIT_METHOD = SOURCE_IDS_LIMIT_METHOD_FIFO +VALID_SOURCE_IDS_LIMIT_METHODS = { + SOURCE_IDS_LIMIT_METHOD_KEEP, + SOURCE_IDS_LIMIT_METHOD_FIFO, +} +# Maximum number of file paths stored in entity/relation file_path field (For displayed only, does not affect query performance) +DEFAULT_MAX_FILE_PATHS = 100 + +# Field length of file_path in Milvus Schema for entity and relation (Should not be changed) +# file_path must store all file paths up to the DEFAULT_MAX_FILE_PATHS limit within the metadata. +DEFAULT_MAX_FILE_PATH_LENGTH = 32768 +# Placeholder for more file paths in meta data for entity and relation (Should not be changed) +DEFAULT_FILE_PATH_MORE_PLACEHOLDER = "truncated" + +# Default temperature for LLM +DEFAULT_TEMPERATURE = 1.0 + +# Async configuration defaults +DEFAULT_MAX_ASYNC = 4 # Default maximum async operations +DEFAULT_MAX_PARALLEL_INSERT = 2 # Default maximum parallel insert operations + +# Embedding configuration defaults +DEFAULT_EMBEDDING_FUNC_MAX_ASYNC = 8 # Default max async for embedding functions +DEFAULT_EMBEDDING_BATCH_NUM = 10 # Default batch size for embedding computations + +# Gunicorn worker timeout +DEFAULT_TIMEOUT = 300 + +# Default llm and embedding timeout +DEFAULT_LLM_TIMEOUT = 180 +DEFAULT_EMBEDDING_TIMEOUT = 30 + +# Logging configuration defaults +DEFAULT_LOG_MAX_BYTES = 10485760 # Default 10MB +DEFAULT_LOG_BACKUP_COUNT = 5 # Default 5 backups +DEFAULT_LOG_FILENAME = "lightrag.log" # Default log filename + +# Ollama server configuration defaults +DEFAULT_OLLAMA_MODEL_NAME = "lightrag" +DEFAULT_OLLAMA_MODEL_TAG = "latest" +DEFAULT_OLLAMA_MODEL_SIZE = 7365960935 +DEFAULT_OLLAMA_CREATED_AT = "2024-01-15T00:00:00Z" +DEFAULT_OLLAMA_DIGEST = "sha256:lightrag" diff --git a/LightRAG/lightrag/evaluation/README_EVALUASTION_RAGAS.md b/LightRAG/lightrag/evaluation/README_EVALUASTION_RAGAS.md new file mode 100644 index 00000000..de1845ef --- /dev/null +++ b/LightRAG/lightrag/evaluation/README_EVALUASTION_RAGAS.md @@ -0,0 +1,487 @@ +# 📊 RAGAS-based Evaluation Framework + +## What is RAGAS? + +**RAGAS** (Retrieval Augmented Generation Assessment) is a framework for reference-free evaluation of RAG systems using LLMs. RAGAS uses state-of-the-art evaluation metrics: + +### Core Metrics + +| Metric | What It Measures | Good Score | +|--------|-----------------|-----------| +| **Faithfulness** | Is the answer factually accurate based on retrieved context? | > 0.80 | +| **Answer Relevance** | Is the answer relevant to the user's question? | > 0.80 | +| **Context Recall** | Was all relevant information retrieved from documents? | > 0.80 | +| **Context Precision** | Is retrieved context clean without irrelevant noise? | > 0.80 | +| **RAGAS Score** | Overall quality metric (average of above) | > 0.80 | + +### 📁 LightRAG Evalua'tion Framework Directory Structure + +``` +lightrag/evaluation/ +├── eval_rag_quality.py # Main evaluation script +├── sample_dataset.json # 3 test questions about LightRAG +├── sample_documents/ # Matching markdown files for testing +│ ├── 01_lightrag_overview.md +│ ├── 02_rag_architecture.md +│ ├── 03_lightrag_improvements.md +│ ├── 04_supported_databases.md +│ ├── 05_evaluation_and_deployment.md +│ └── README.md +├── __init__.py # Package init +├── results/ # Output directory +│ ├── results_YYYYMMDD_HHMMSS.json # Raw metrics in JSON +│ └── results_YYYYMMDD_HHMMSS.csv # Metrics in CSV format +└── README.md # This file +``` + +**Quick Test:** Index files from `sample_documents/` into LightRAG, then run the evaluator to reproduce results (~89-100% RAGAS score per question). + + + +## 🚀 Quick Start + +### 1. Install Dependencies + +```bash +pip install ragas datasets langfuse +``` + +Or use your project dependencies (already included in pyproject.toml): + +```bash +pip install -e ".[evaluation]" +``` + +### 2. Run Evaluation + +**Basic usage (uses defaults):** +```bash +cd /path/to/LightRAG +python lightrag/evaluation/eval_rag_quality.py +``` + +**Specify custom dataset:** +```bash +python lightrag/evaluation/eval_rag_quality.py --dataset my_test.json +``` + +**Specify custom RAG endpoint:** +```bash +python lightrag/evaluation/eval_rag_quality.py --ragendpoint http://my-server.com:9621 +``` + +**Specify both (short form):** +```bash +python lightrag/evaluation/eval_rag_quality.py -d my_test.json -r http://localhost:9621 +``` + +**Get help:** +```bash +python lightrag/evaluation/eval_rag_quality.py --help +``` + +### 3. View Results + +Results are saved automatically in `lightrag/evaluation/results/`: + +``` +results/ +├── results_20241023_143022.json ← Raw metrics in JSON format +└── results_20241023_143022.csv ← Metrics in CSV format (for spreadsheets) +``` + +**Results include:** +- ✅ Overall RAGAS score +- 📊 Per-metric averages (Faithfulness, Answer Relevance, Context Recall, Context Precision) +- 📋 Individual test case results +- 📈 Performance breakdown by question + + + +## 📋 Command-Line Arguments + +The evaluation script supports command-line arguments for easy configuration: + +| Argument | Short | Default | Description | +|----------|-------|---------|-------------| +| `--dataset` | `-d` | `sample_dataset.json` | Path to test dataset JSON file | +| `--ragendpoint` | `-r` | `http://localhost:9621` or `$LIGHTRAG_API_URL` | LightRAG API endpoint URL | + +### Usage Examples + +**Use default dataset and endpoint:** +```bash +python lightrag/evaluation/eval_rag_quality.py +``` + +**Custom dataset with default endpoint:** +```bash +python lightrag/evaluation/eval_rag_quality.py --dataset path/to/my_dataset.json +``` + +**Default dataset with custom endpoint:** +```bash +python lightrag/evaluation/eval_rag_quality.py --ragendpoint http://my-server.com:9621 +``` + +**Custom dataset and endpoint:** +```bash +python lightrag/evaluation/eval_rag_quality.py -d my_dataset.json -r http://localhost:9621 +``` + +**Absolute path to dataset:** +```bash +python lightrag/evaluation/eval_rag_quality.py -d /path/to/custom_dataset.json +``` + +**Show help message:** +```bash +python lightrag/evaluation/eval_rag_quality.py --help +``` + + + +## ⚙️ Configuration + +### Environment Variables + +The evaluation framework supports customization through environment variables: + +**⚠️ IMPORTANT: Both LLM and Embedding endpoints MUST be OpenAI-compatible** +- The RAGAS framework requires OpenAI-compatible API interfaces +- Custom endpoints must implement the OpenAI API format (e.g., vLLM, SGLang, LocalAI) +- Non-compatible endpoints will cause evaluation failures + +| Variable | Default | Description | +|----------|---------|-------------| +| **LLM Configuration** | | | +| `EVAL_LLM_MODEL` | `gpt-4o-mini` | LLM model used for RAGAS evaluation | +| `EVAL_LLM_BINDING_API_KEY` | falls back to `OPENAI_API_KEY` | API key for LLM evaluation | +| `EVAL_LLM_BINDING_HOST` | (optional) | Custom OpenAI-compatible endpoint URL for LLM | +| **Embedding Configuration** | | | +| `EVAL_EMBEDDING_MODEL` | `text-embedding-3-large` | Embedding model for evaluation | +| `EVAL_EMBEDDING_BINDING_API_KEY` | falls back to `EVAL_LLM_BINDING_API_KEY` → `OPENAI_API_KEY` | API key for embeddings | +| `EVAL_EMBEDDING_BINDING_HOST` | falls back to `EVAL_LLM_BINDING_HOST` | Custom OpenAI-compatible endpoint URL for embeddings | +| **Performance Tuning** | | | +| `EVAL_MAX_CONCURRENT` | 2 | Number of concurrent test case evaluations (1=serial) | +| `EVAL_QUERY_TOP_K` | 10 | Number of documents to retrieve per query | +| `EVAL_LLM_MAX_RETRIES` | 5 | Maximum LLM request retries | +| `EVAL_LLM_TIMEOUT` | 180 | LLM request timeout in seconds | + +### Usage Examples + +**Example 1: Default Configuration (OpenAI Official API)** +```bash +export OPENAI_API_KEY=sk-xxx +python lightrag/evaluation/eval_rag_quality.py +``` +Both LLM and embeddings use OpenAI's official API with default models. + +**Example 2: Custom Models on OpenAI** +```bash +export OPENAI_API_KEY=sk-xxx +export EVAL_LLM_MODEL=gpt-4o-mini +export EVAL_EMBEDDING_MODEL=text-embedding-3-large +python lightrag/evaluation/eval_rag_quality.py +``` + +**Example 3: Same Custom OpenAI-Compatible Endpoint for Both** +```bash +# Both LLM and embeddings use the same custom endpoint +export EVAL_LLM_BINDING_API_KEY=your-custom-key +export EVAL_LLM_BINDING_HOST=http://localhost:8000/v1 +export EVAL_LLM_MODEL=qwen-plus +export EVAL_EMBEDDING_MODEL=BAAI/bge-m3 +python lightrag/evaluation/eval_rag_quality.py +``` +Embeddings automatically inherit LLM endpoint configuration. + +**Example 4: Separate Endpoints (Cost Optimization)** +```bash +# Use OpenAI for LLM (high quality) +export EVAL_LLM_BINDING_API_KEY=sk-openai-key +export EVAL_LLM_MODEL=gpt-4o-mini +# No EVAL_LLM_BINDING_HOST means use OpenAI official API + +# Use local vLLM for embeddings (cost-effective) +export EVAL_EMBEDDING_BINDING_API_KEY=local-key +export EVAL_EMBEDDING_BINDING_HOST=http://localhost:8001/v1 +export EVAL_EMBEDDING_MODEL=BAAI/bge-m3 + +python lightrag/evaluation/eval_rag_quality.py +``` +LLM uses OpenAI official API, embeddings use local custom endpoint. + +**Example 5: Different Custom Endpoints for LLM and Embeddings** +```bash +# LLM on one OpenAI-compatible server +export EVAL_LLM_BINDING_API_KEY=key1 +export EVAL_LLM_BINDING_HOST=http://llm-server:8000/v1 +export EVAL_LLM_MODEL=custom-llm + +# Embeddings on another OpenAI-compatible server +export EVAL_EMBEDDING_BINDING_API_KEY=key2 +export EVAL_EMBEDDING_BINDING_HOST=http://embedding-server:8001/v1 +export EVAL_EMBEDDING_MODEL=custom-embedding + +python lightrag/evaluation/eval_rag_quality.py +``` +Both use different custom OpenAI-compatible endpoints. + +**Example 6: Using Environment Variables from .env File** +```bash +# Create .env file in project root +cat > .env << EOF +EVAL_LLM_BINDING_API_KEY=your-key +EVAL_LLM_BINDING_HOST=http://localhost:8000/v1 +EVAL_LLM_MODEL=qwen-plus +EVAL_EMBEDDING_MODEL=BAAI/bge-m3 +EOF + +# Run evaluation (automatically loads .env) +python lightrag/evaluation/eval_rag_quality.py +``` + +### Concurrency Control & Rate Limiting + +The evaluation framework includes built-in concurrency control to prevent API rate limiting issues: + +**Why Concurrency Control Matters:** +- RAGAS internally makes many concurrent LLM calls for each test case +- Context Precision metric calls LLM once per retrieved document +- Without control, this can easily exceed API rate limits + +**Default Configuration (Conservative):** +```bash +EVAL_MAX_CONCURRENT=2 # Serial evaluation (one test at a time) +EVAL_QUERY_TOP_K=10 # OP_K query parameter of LightRAG +EVAL_LLM_MAX_RETRIES=5 # Retry failed requests 5 times +EVAL_LLM_TIMEOUT=180 # 3-minute timeout per request +``` + +**Common Issues and Solutions:** + +| Issue | Solution | +|-------|----------| +| **Warning: "LM returned 1 generations instead of 3"** | Reduce `EVAL_MAX_CONCURRENT` to 1 or decrease `EVAL_QUERY_TOP_K` | +| **Context Precision returns NaN** | Lower `EVAL_QUERY_TOP_K` to reduce LLM calls per test case | +| **Rate limit errors (429)** | Increase `EVAL_LLM_MAX_RETRIES` and decrease `EVAL_MAX_CONCURRENT` | +| **Request timeouts** | Increase `EVAL_LLM_TIMEOUT` to 180 or higher | + + + +## 📝 Test Dataset + +`sample_dataset.json` contains 3 generic questions about LightRAG. Replace with questions matching YOUR indexed documents. + +**Custom Test Cases:** + +```json +{ + "test_cases": [ + { + "question": "Your question here", + "ground_truth": "Expected answer from your data", + "project": "evaluation_project_name" + } + ] +} +``` + +--- + +## 📊 Interpreting Results + +### Score Ranges + +- **0.80-1.00**: ✅ Excellent (Production-ready) +- **0.60-0.80**: ⚠️ Good (Room for improvement) +- **0.40-0.60**: ❌ Poor (Needs optimization) +- **0.00-0.40**: 🔴 Critical (Major issues) + +### What Low Scores Mean + +| Metric | Low Score Indicates | +|--------|-------------------| +| **Faithfulness** | Responses contain hallucinations or incorrect information | +| **Answer Relevance** | Answers don't match what users asked | +| **Context Recall** | Missing important information in retrieval | +| **Context Precision** | Retrieved documents contain irrelevant noise | + +### Optimization Tips + +1. **Low Faithfulness**: + - Improve entity extraction quality + - Better document chunking + - Tune retrieval temperature + +2. **Low Answer Relevance**: + - Improve prompt engineering + - Better query understanding + - Check semantic similarity threshold + +3. **Low Context Recall**: + - Increase retrieval `top_k` results + - Improve embedding model + - Better document preprocessing + +4. **Low Context Precision**: + - Smaller, focused chunks + - Better filtering + - Improve chunking strategy + +--- + +## 📚 Resources + +- [RAGAS Documentation](https://docs.ragas.io/) +- [RAGAS GitHub](https://github.com/explodinggradients/ragas) + +--- + +## 🐛 Troubleshooting + +### "ModuleNotFoundError: No module named 'ragas'" + +```bash +pip install ragas datasets +``` + +### "Warning: LM returned 1 generations instead of requested 3" or Context Precision NaN + +**Cause**: This warning indicates API rate limiting or concurrent request overload: +- RAGAS makes multiple LLM calls per test case (faithfulness, relevancy, recall, precision) +- Context Precision calls LLM once per retrieved document (with `EVAL_QUERY_TOP_K=10`, that's 10 calls) +- Concurrent evaluation multiplies these calls: `EVAL_MAX_CONCURRENT × LLM calls per test` + +**Solutions** (in order of effectiveness): + +1. **Serial Evaluation** (Default): + ```bash + export EVAL_MAX_CONCURRENT=1 + python lightrag/evaluation/eval_rag_quality.py + ``` + +2. **Reduce Retrieved Documents**: + ```bash + export EVAL_QUERY_TOP_K=5 # Halves Context Precision LLM calls + python lightrag/evaluation/eval_rag_quality.py + ``` + +3. **Increase Retry & Timeout**: + ```bash + export EVAL_LLM_MAX_RETRIES=10 + export EVAL_LLM_TIMEOUT=180 + python lightrag/evaluation/eval_rag_quality.py + ``` + +4. **Use Higher Quota API** (if available): + - Upgrade to OpenAI Tier 2+ for higher RPM limits + - Use self-hosted OpenAI-compatible service with no rate limits + +### "AttributeError: 'InstructorLLM' object has no attribute 'agenerate_prompt'" or NaN results + +This error occurs with RAGAS 0.3.x when LLM and Embeddings are not explicitly configured. The evaluation framework now handles this automatically by: +- Using environment variables to configure evaluation models +- Creating proper LLM and Embeddings instances for RAGAS + +**Solution**: Ensure you have set one of the following: +- `OPENAI_API_KEY` environment variable (default) +- `EVAL_LLM_BINDING_API_KEY` for custom API key + +The framework will automatically configure the evaluation models. + +### "No sample_dataset.json found" + +Make sure you're running from the project root: + +```bash +cd /path/to/LightRAG +python lightrag/evaluation/eval_rag_quality.py +``` + +### "LightRAG query API errors during evaluation" + +The evaluation uses your configured LLM (OpenAI by default). Ensure: +- API keys are set in `.env` +- Network connection is stable + +### Evaluation requires running LightRAG API + +The evaluator queries a running LightRAG API server at `http://localhost:9621`. Make sure: +1. LightRAG API server is running (`python lightrag/api/lightrag_server.py`) +2. Documents are indexed in your LightRAG instance +3. API is accessible at the configured URL + + + +## 📝 Next Steps + +1. Start LightRAG API server +2. Upload sample documents into LightRAG throught WebUI +3. Run `python lightrag/evaluation/eval_rag_quality.py` +4. Review results (JSON/CSV) in `results/` folder + +Evaluation Result Sample: + +``` +INFO: ====================================================================== +INFO: 🔍 RAGAS Evaluation - Using Real LightRAG API +INFO: ====================================================================== +INFO: Evaluation Models: +INFO: • LLM Model: gpt-4.1 +INFO: • Embedding Model: text-embedding-3-large +INFO: • Endpoint: OpenAI Official API +INFO: Concurrency & Rate Limiting: +INFO: • Query Top-K: 10 Entities/Relations +INFO: • LLM Max Retries: 5 +INFO: • LLM Timeout: 180 seconds +INFO: Test Configuration: +INFO: • Total Test Cases: 6 +INFO: • Test Dataset: sample_dataset.json +INFO: • LightRAG API: http://localhost:9621 +INFO: • Results Directory: results +INFO: ====================================================================== +INFO: 🚀 Starting RAGAS Evaluation of LightRAG System +INFO: 🔧 RAGAS Evaluation (Stage 2): 2 concurrent +INFO: ====================================================================== +INFO: +INFO: =================================================================================================================== +INFO: 📊 EVALUATION RESULTS SUMMARY +INFO: =================================================================================================================== +INFO: # | Question | Faith | AnswRel | CtxRec | CtxPrec | RAGAS | Status +INFO: ------------------------------------------------------------------------------------------------------------------- +INFO: 1 | How does LightRAG solve the hallucination probl... | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | ✓ +INFO: 2 | What are the three main components required in ... | 0.8500 | 0.5790 | 1.0000 | 1.0000 | 0.8573 | ✓ +INFO: 3 | How does LightRAG's retrieval performance compa... | 0.8056 | 1.0000 | 1.0000 | 1.0000 | 0.9514 | ✓ +INFO: 4 | What vector databases does LightRAG support and... | 0.8182 | 0.9807 | 1.0000 | 1.0000 | 0.9497 | ✓ +INFO: 5 | What are the four key metrics for evaluating RA... | 1.0000 | 0.7452 | 1.0000 | 1.0000 | 0.9363 | ✓ +INFO: 6 | What are the core benefits of LightRAG and how ... | 0.9583 | 0.8829 | 1.0000 | 1.0000 | 0.9603 | ✓ +INFO: =================================================================================================================== +INFO: +INFO: ====================================================================== +INFO: 📊 EVALUATION COMPLETE +INFO: ====================================================================== +INFO: Total Tests: 6 +INFO: Successful: 6 +INFO: Failed: 0 +INFO: Success Rate: 100.00% +INFO: Elapsed Time: 161.10 seconds +INFO: Avg Time/Test: 26.85 seconds +INFO: +INFO: ====================================================================== +INFO: 📈 BENCHMARK RESULTS (Average) +INFO: ====================================================================== +INFO: Average Faithfulness: 0.9053 +INFO: Average Answer Relevance: 0.8646 +INFO: Average Context Recall: 1.0000 +INFO: Average Context Precision: 1.0000 +INFO: Average RAGAS Score: 0.9425 +INFO: ---------------------------------------------------------------------- +INFO: Min RAGAS Score: 0.8573 +INFO: Max RAGAS Score: 1.0000 +``` + +--- + +**Happy Evaluating! 🚀** diff --git a/LightRAG/lightrag/evaluation/__init__.py b/LightRAG/lightrag/evaluation/__init__.py new file mode 100644 index 00000000..49eb189e --- /dev/null +++ b/LightRAG/lightrag/evaluation/__init__.py @@ -0,0 +1,25 @@ +""" +LightRAG Evaluation Module + +RAGAS-based evaluation framework for assessing RAG system quality. + +Usage: + from lightrag.evaluation import RAGEvaluator + + evaluator = RAGEvaluator() + results = await evaluator.run() + +Note: RAGEvaluator is imported lazily to avoid import errors +when ragas/datasets are not installed. +""" + +__all__ = ["RAGEvaluator"] + + +def __getattr__(name): + """Lazy import to avoid dependency errors when ragas is not installed.""" + if name == "RAGEvaluator": + from .eval_rag_quality import RAGEvaluator + + return RAGEvaluator + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/LightRAG/lightrag/evaluation/eval_rag_quality.py b/LightRAG/lightrag/evaluation/eval_rag_quality.py new file mode 100644 index 00000000..7b415090 --- /dev/null +++ b/LightRAG/lightrag/evaluation/eval_rag_quality.py @@ -0,0 +1,1016 @@ +#!/usr/bin/env python3 +""" +RAGAS Evaluation Script for LightRAG System + +Evaluates RAG response quality using RAGAS metrics: +- Faithfulness: Is the answer factually accurate based on context? +- Answer Relevance: Is the answer relevant to the question? +- Context Recall: Is all relevant information retrieved? +- Context Precision: Is retrieved context clean without noise? + +Usage: + # Use defaults (sample_dataset.json, http://localhost:9621) + python lightrag/evaluation/eval_rag_quality.py + + # Specify custom dataset + python lightrag/evaluation/eval_rag_quality.py --dataset my_test.json + python lightrag/evaluation/eval_rag_quality.py -d my_test.json + + # Specify custom RAG endpoint + python lightrag/evaluation/eval_rag_quality.py --ragendpoint http://my-server.com:9621 + python lightrag/evaluation/eval_rag_quality.py -r http://my-server.com:9621 + + # Specify both + python lightrag/evaluation/eval_rag_quality.py -d my_test.json -r http://localhost:9621 + + # Get help + python lightrag/evaluation/eval_rag_quality.py --help + +Results are saved to: lightrag/evaluation/results/ + - results_YYYYMMDD_HHMMSS.csv (CSV export for analysis) + - results_YYYYMMDD_HHMMSS.json (Full results with details) + +Technical Notes: + - Uses stable RAGAS API (LangchainLLMWrapper) for maximum compatibility + - Supports custom OpenAI-compatible endpoints via EVAL_LLM_BINDING_HOST + - Enables bypass_n mode for endpoints that don't support 'n' parameter + - Deprecation warnings are suppressed for cleaner output +""" + +import argparse +import asyncio +import csv +import json +import math +import os +import sys +import time +import warnings +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List + +import httpx +from dotenv import load_dotenv +from lightrag.utils import logger + +# Suppress LangchainLLMWrapper deprecation warning +# We use LangchainLLMWrapper for stability and compatibility with all RAGAS versions +warnings.filterwarnings( + "ignore", + message=".*LangchainLLMWrapper is deprecated.*", + category=DeprecationWarning, +) + +# Suppress token usage warning for custom OpenAI-compatible endpoints +# Custom endpoints (vLLM, SGLang, etc.) often don't return usage information +# This is non-critical as token tracking is not required for RAGAS evaluation +warnings.filterwarnings( + "ignore", + message=".*Unexpected type for token usage.*", + category=UserWarning, +) + +# Add parent directory to path +sys.path.insert(0, str(Path(__file__).parent.parent.parent)) + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +# Conditional imports - will raise ImportError if dependencies not installed +try: + from datasets import Dataset + from ragas import evaluate + from ragas.metrics import ( + AnswerRelevancy, + ContextPrecision, + ContextRecall, + Faithfulness, + ) + from ragas.llms import LangchainLLMWrapper + from langchain_openai import ChatOpenAI, OpenAIEmbeddings + from tqdm.auto import tqdm + + RAGAS_AVAILABLE = True + +except ImportError: + RAGAS_AVAILABLE = False + Dataset = None + evaluate = None + LangchainLLMWrapper = None + + +CONNECT_TIMEOUT_SECONDS = 180.0 +READ_TIMEOUT_SECONDS = 300.0 +TOTAL_TIMEOUT_SECONDS = 180.0 + + +def _is_nan(value: Any) -> bool: + """Return True when value is a float NaN.""" + return isinstance(value, float) and math.isnan(value) + + +class RAGEvaluator: + """Evaluate RAG system quality using RAGAS metrics""" + + def __init__(self, test_dataset_path: str = None, rag_api_url: str = None): + """ + Initialize evaluator with test dataset + + Args: + test_dataset_path: Path to test dataset JSON file + rag_api_url: Base URL of LightRAG API (e.g., http://localhost:9621) + If None, will try to read from environment or use default + + Environment Variables: + EVAL_LLM_MODEL: LLM model for evaluation (default: gpt-4o-mini) + EVAL_EMBEDDING_MODEL: Embedding model for evaluation (default: text-embedding-3-small) + EVAL_LLM_BINDING_API_KEY: API key for LLM (fallback to OPENAI_API_KEY) + EVAL_LLM_BINDING_HOST: Custom endpoint URL for LLM (optional) + EVAL_EMBEDDING_BINDING_API_KEY: API key for embeddings (fallback: EVAL_LLM_BINDING_API_KEY -> OPENAI_API_KEY) + EVAL_EMBEDDING_BINDING_HOST: Custom endpoint URL for embeddings (fallback: EVAL_LLM_BINDING_HOST) + + Raises: + ImportError: If ragas or datasets packages are not installed + EnvironmentError: If EVAL_LLM_BINDING_API_KEY and OPENAI_API_KEY are both not set + """ + # Validate RAGAS dependencies are installed + if not RAGAS_AVAILABLE: + raise ImportError( + "RAGAS dependencies not installed. " + "Install with: pip install ragas datasets" + ) + + # Configure evaluation LLM (for RAGAS scoring) + eval_llm_api_key = os.getenv("EVAL_LLM_BINDING_API_KEY") or os.getenv( + "OPENAI_API_KEY" + ) + if not eval_llm_api_key: + raise EnvironmentError( + "EVAL_LLM_BINDING_API_KEY or OPENAI_API_KEY is required for evaluation. " + "Set EVAL_LLM_BINDING_API_KEY to use a custom API key, " + "or ensure OPENAI_API_KEY is set." + ) + + eval_model = os.getenv("EVAL_LLM_MODEL", "gpt-4o-mini") + eval_llm_base_url = os.getenv("EVAL_LLM_BINDING_HOST") + + # Configure evaluation embeddings (for RAGAS scoring) + # Fallback chain: EVAL_EMBEDDING_BINDING_API_KEY -> EVAL_LLM_BINDING_API_KEY -> OPENAI_API_KEY + eval_embedding_api_key = ( + os.getenv("EVAL_EMBEDDING_BINDING_API_KEY") + or os.getenv("EVAL_LLM_BINDING_API_KEY") + or os.getenv("OPENAI_API_KEY") + ) + eval_embedding_model = os.getenv( + "EVAL_EMBEDDING_MODEL", "text-embedding-3-large" + ) + # Fallback chain: EVAL_EMBEDDING_BINDING_HOST -> EVAL_LLM_BINDING_HOST -> None + eval_embedding_base_url = os.getenv("EVAL_EMBEDDING_BINDING_HOST") or os.getenv( + "EVAL_LLM_BINDING_HOST" + ) + + # Create LLM and Embeddings instances for RAGAS + llm_kwargs = { + "model": eval_model, + "api_key": eval_llm_api_key, + "max_retries": int(os.getenv("EVAL_LLM_MAX_RETRIES", "5")), + "request_timeout": int(os.getenv("EVAL_LLM_TIMEOUT", "180")), + } + embedding_kwargs = { + "model": eval_embedding_model, + "api_key": eval_embedding_api_key, + } + + if eval_llm_base_url: + llm_kwargs["base_url"] = eval_llm_base_url + + if eval_embedding_base_url: + embedding_kwargs["base_url"] = eval_embedding_base_url + + # Create base LangChain LLM + base_llm = ChatOpenAI(**llm_kwargs) + self.eval_embeddings = OpenAIEmbeddings(**embedding_kwargs) + + # Wrap LLM with LangchainLLMWrapper and enable bypass_n mode for custom endpoints + # This ensures compatibility with endpoints that don't support the 'n' parameter + # by generating multiple outputs through repeated prompts instead of using 'n' parameter + try: + self.eval_llm = LangchainLLMWrapper( + langchain_llm=base_llm, + bypass_n=True, # Enable bypass_n to avoid passing 'n' to OpenAI API + ) + logger.debug("Successfully configured bypass_n mode for LLM wrapper") + except Exception as e: + logger.warning( + "Could not configure LangchainLLMWrapper with bypass_n: %s. " + "Using base LLM directly, which may cause warnings with custom endpoints.", + e, + ) + self.eval_llm = base_llm + + if test_dataset_path is None: + test_dataset_path = Path(__file__).parent / "sample_dataset.json" + + if rag_api_url is None: + rag_api_url = os.getenv("LIGHTRAG_API_URL", "http://localhost:9621") + + self.test_dataset_path = Path(test_dataset_path) + self.rag_api_url = rag_api_url.rstrip("/") + self.results_dir = Path(__file__).parent / "results" + self.results_dir.mkdir(exist_ok=True) + + # Load test dataset + self.test_cases = self._load_test_dataset() + + # Store configuration values for display + self.eval_model = eval_model + self.eval_embedding_model = eval_embedding_model + self.eval_llm_base_url = eval_llm_base_url + self.eval_embedding_base_url = eval_embedding_base_url + self.eval_max_retries = llm_kwargs["max_retries"] + self.eval_timeout = llm_kwargs["request_timeout"] + + # Display configuration + self._display_configuration() + + def _display_configuration(self): + """Display all evaluation configuration settings""" + logger.info("Evaluation Models:") + logger.info(" • LLM Model: %s", self.eval_model) + logger.info(" • Embedding Model: %s", self.eval_embedding_model) + + # Display LLM endpoint + if self.eval_llm_base_url: + logger.info(" • LLM Endpoint: %s", self.eval_llm_base_url) + logger.info( + " • Bypass N-Parameter: Enabled (use LangchainLLMWrapper for compatibility)" + ) + else: + logger.info(" • LLM Endpoint: OpenAI Official API") + + # Display Embedding endpoint (only if different from LLM) + if self.eval_embedding_base_url: + if self.eval_embedding_base_url != self.eval_llm_base_url: + logger.info( + " • Embedding Endpoint: %s", self.eval_embedding_base_url + ) + # If same as LLM endpoint, no need to display separately + elif not self.eval_llm_base_url: + # Both using OpenAI - already displayed above + pass + else: + # LLM uses custom endpoint, but embeddings use OpenAI + logger.info(" • Embedding Endpoint: OpenAI Official API") + + logger.info("Concurrency & Rate Limiting:") + query_top_k = int(os.getenv("EVAL_QUERY_TOP_K", "10")) + logger.info(" • Query Top-K: %s Entities/Relations", query_top_k) + logger.info(" • LLM Max Retries: %s", self.eval_max_retries) + logger.info(" • LLM Timeout: %s seconds", self.eval_timeout) + + logger.info("Test Configuration:") + logger.info(" • Total Test Cases: %s", len(self.test_cases)) + logger.info(" • Test Dataset: %s", self.test_dataset_path.name) + logger.info(" • LightRAG API: %s", self.rag_api_url) + logger.info(" • Results Directory: %s", self.results_dir.name) + + def _load_test_dataset(self) -> List[Dict[str, str]]: + """Load test cases from JSON file""" + if not self.test_dataset_path.exists(): + raise FileNotFoundError(f"Test dataset not found: {self.test_dataset_path}") + + with open(self.test_dataset_path) as f: + data = json.load(f) + + return data.get("test_cases", []) + + async def generate_rag_response( + self, + question: str, + client: httpx.AsyncClient, + ) -> Dict[str, Any]: + """ + Generate RAG response by calling LightRAG API. + + Args: + question: The user query. + client: Shared httpx AsyncClient for connection pooling. + + Returns: + Dictionary with 'answer' and 'contexts' keys. + 'contexts' is a list of strings (one per retrieved document). + + Raises: + Exception: If LightRAG API is unavailable. + """ + try: + payload = { + "query": question, + "mode": "mix", + "include_references": True, + "include_chunk_content": True, # NEW: Request chunk content in references + "response_type": "Multiple Paragraphs", + "top_k": int(os.getenv("EVAL_QUERY_TOP_K", "10")), + } + + # Get API key from environment for authentication + api_key = os.getenv("LIGHTRAG_API_KEY") + + # Prepare headers with optional authentication + headers = {} + if api_key: + headers["X-API-Key"] = api_key + + # Single optimized API call - gets both answer AND chunk content + response = await client.post( + f"{self.rag_api_url}/query", + json=payload, + headers=headers if headers else None, + ) + response.raise_for_status() + result = response.json() + + answer = result.get("response", "No response generated") + references = result.get("references", []) + + # DEBUG: Inspect the API response + logger.debug("🔍 References Count: %s", len(references)) + if references: + first_ref = references[0] + logger.debug("🔍 First Reference Keys: %s", list(first_ref.keys())) + if "content" in first_ref: + content_preview = first_ref["content"] + if isinstance(content_preview, list) and content_preview: + logger.debug( + "🔍 Content Preview (first chunk): %s...", + content_preview[0][:100], + ) + elif isinstance(content_preview, str): + logger.debug("🔍 Content Preview: %s...", content_preview[:100]) + + # Extract chunk content from enriched references + # Note: content is now a list of chunks per reference (one file may have multiple chunks) + contexts = [] + for ref in references: + content = ref.get("content", []) + if isinstance(content, list): + # Flatten the list: each chunk becomes a separate context + contexts.extend(content) + elif isinstance(content, str): + # Backward compatibility: if content is still a string (shouldn't happen) + contexts.append(content) + + return { + "answer": answer, + "contexts": contexts, # List of strings from actual retrieved chunks + } + + except httpx.ConnectError as e: + raise Exception( + f"❌ Cannot connect to LightRAG API at {self.rag_api_url}\n" + f" Make sure LightRAG server is running:\n" + f" python -m lightrag.api.lightrag_server\n" + f" Error: {str(e)}" + ) + except httpx.HTTPStatusError as e: + raise Exception( + f"LightRAG API error {e.response.status_code}: {e.response.text}" + ) + except httpx.ReadTimeout as e: + raise Exception( + f"Request timeout after waiting for response\n" + f" Question: {question[:100]}...\n" + f" Error: {str(e)}" + ) + except Exception as e: + raise Exception(f"Error calling LightRAG API: {type(e).__name__}: {str(e)}") + + async def evaluate_single_case( + self, + idx: int, + test_case: Dict[str, str], + rag_semaphore: asyncio.Semaphore, + eval_semaphore: asyncio.Semaphore, + client: httpx.AsyncClient, + progress_counter: Dict[str, int], + position_pool: asyncio.Queue, + pbar_creation_lock: asyncio.Lock, + ) -> Dict[str, Any]: + """ + Evaluate a single test case with two-stage pipeline concurrency control + + Args: + idx: Test case index (1-based) + test_case: Test case dictionary with question and ground_truth + rag_semaphore: Semaphore to control overall concurrency (covers entire function) + eval_semaphore: Semaphore to control RAGAS evaluation concurrency (Stage 2) + client: Shared httpx AsyncClient for connection pooling + progress_counter: Shared dictionary for progress tracking + position_pool: Queue of available tqdm position indices + pbar_creation_lock: Lock to serialize tqdm creation and prevent race conditions + + Returns: + Evaluation result dictionary + """ + # rag_semaphore controls the entire evaluation process to prevent + # all RAG responses from being generated at once when eval is slow + async with rag_semaphore: + question = test_case["question"] + ground_truth = test_case["ground_truth"] + + # Stage 1: Generate RAG response + try: + rag_response = await self.generate_rag_response( + question=question, client=client + ) + except Exception as e: + logger.error("Error generating response for test %s: %s", idx, str(e)) + progress_counter["completed"] += 1 + return { + "test_number": idx, + "question": question, + "error": str(e), + "metrics": {}, + "ragas_score": 0, + "timestamp": datetime.now().isoformat(), + } + + # *** CRITICAL FIX: Use actual retrieved contexts, NOT ground_truth *** + retrieved_contexts = rag_response["contexts"] + + # Prepare dataset for RAGAS evaluation with CORRECT contexts + eval_dataset = Dataset.from_dict( + { + "question": [question], + "answer": [rag_response["answer"]], + "contexts": [retrieved_contexts], + "ground_truth": [ground_truth], + } + ) + + # Stage 2: Run RAGAS evaluation (controlled by eval_semaphore) + # IMPORTANT: Create fresh metric instances for each evaluation to avoid + # concurrent state conflicts when multiple tasks run in parallel + async with eval_semaphore: + pbar = None + position = None + try: + # Acquire a position from the pool for this tqdm progress bar + position = await position_pool.get() + + # Serialize tqdm creation to prevent race conditions + # Multiple tasks creating tqdm simultaneously can cause display conflicts + async with pbar_creation_lock: + # Create tqdm progress bar with assigned position to avoid overlapping + # leave=False ensures the progress bar is cleared after completion, + # preventing accumulation of completed bars and allowing position reuse + pbar = tqdm( + total=4, + desc=f"Eval-{idx:02d}", + position=position, + leave=False, + ) + # Give tqdm time to initialize and claim its screen position + await asyncio.sleep(0.05) + + eval_results = evaluate( + dataset=eval_dataset, + metrics=[ + Faithfulness(), + AnswerRelevancy(), + ContextRecall(), + ContextPrecision(), + ], + llm=self.eval_llm, + embeddings=self.eval_embeddings, + _pbar=pbar, + ) + + # Convert to DataFrame (RAGAS v0.3+ API) + df = eval_results.to_pandas() + + # Extract scores from first row + scores_row = df.iloc[0] + + # Extract scores (RAGAS v0.3+ uses .to_pandas()) + result = { + "test_number": idx, + "question": question, + "answer": rag_response["answer"][:200] + "..." + if len(rag_response["answer"]) > 200 + else rag_response["answer"], + "ground_truth": ground_truth[:200] + "..." + if len(ground_truth) > 200 + else ground_truth, + "project": test_case.get("project", "unknown"), + "metrics": { + "faithfulness": float(scores_row.get("faithfulness", 0)), + "answer_relevance": float( + scores_row.get("answer_relevancy", 0) + ), + "context_recall": float( + scores_row.get("context_recall", 0) + ), + "context_precision": float( + scores_row.get("context_precision", 0) + ), + }, + "timestamp": datetime.now().isoformat(), + } + + # Calculate RAGAS score (average of all metrics, excluding NaN values) + metrics = result["metrics"] + valid_metrics = [v for v in metrics.values() if not _is_nan(v)] + ragas_score = ( + sum(valid_metrics) / len(valid_metrics) if valid_metrics else 0 + ) + result["ragas_score"] = round(ragas_score, 4) + + # Update progress counter + progress_counter["completed"] += 1 + + return result + + except Exception as e: + logger.error("Error evaluating test %s: %s", idx, str(e)) + progress_counter["completed"] += 1 + return { + "test_number": idx, + "question": question, + "error": str(e), + "metrics": {}, + "ragas_score": 0, + "timestamp": datetime.now().isoformat(), + } + finally: + # Force close progress bar to ensure completion + if pbar is not None: + pbar.close() + # Release the position back to the pool for reuse + if position is not None: + await position_pool.put(position) + + async def evaluate_responses(self) -> List[Dict[str, Any]]: + """ + Evaluate all test cases in parallel with two-stage pipeline and return metrics + + Returns: + List of evaluation results with metrics + """ + # Get evaluation concurrency from environment (default to 2 for parallel evaluation) + max_async = int(os.getenv("EVAL_MAX_CONCURRENT", "2")) + + logger.info("%s", "=" * 70) + logger.info("🚀 Starting RAGAS Evaluation of LightRAG System") + logger.info("🔧 RAGAS Evaluation (Stage 2): %s concurrent", max_async) + logger.info("%s", "=" * 70) + + # Create two-stage pipeline semaphores + # Stage 1: RAG generation - allow x2 concurrency to keep evaluation fed + rag_semaphore = asyncio.Semaphore(max_async * 2) + # Stage 2: RAGAS evaluation - primary bottleneck + eval_semaphore = asyncio.Semaphore(max_async) + + # Create progress counter (shared across all tasks) + progress_counter = {"completed": 0} + + # Create position pool for tqdm progress bars + # Positions range from 0 to max_async-1, ensuring no overlapping displays + position_pool = asyncio.Queue() + for i in range(max_async): + await position_pool.put(i) + + # Create lock to serialize tqdm creation and prevent race conditions + # This ensures progress bars are created one at a time, avoiding display conflicts + pbar_creation_lock = asyncio.Lock() + + # Create shared HTTP client with connection pooling and proper timeouts + # Timeout: 3 minutes for connect, 5 minutes for read (LLM can be slow) + timeout = httpx.Timeout( + TOTAL_TIMEOUT_SECONDS, + connect=CONNECT_TIMEOUT_SECONDS, + read=READ_TIMEOUT_SECONDS, + ) + limits = httpx.Limits( + max_connections=(max_async + 1) * 2, # Allow buffer for RAG stage + max_keepalive_connections=max_async + 1, + ) + + async with httpx.AsyncClient(timeout=timeout, limits=limits) as client: + # Create tasks for all test cases + tasks = [ + self.evaluate_single_case( + idx, + test_case, + rag_semaphore, + eval_semaphore, + client, + progress_counter, + position_pool, + pbar_creation_lock, + ) + for idx, test_case in enumerate(self.test_cases, 1) + ] + + # Run all evaluations in parallel (limited by two-stage semaphores) + results = await asyncio.gather(*tasks) + + return list(results) + + def _export_to_csv(self, results: List[Dict[str, Any]]) -> Path: + """ + Export evaluation results to CSV file + + Args: + results: List of evaluation results + + Returns: + Path to the CSV file + + CSV Format: + - question: The test question + - project: Project context + - faithfulness: Faithfulness score (0-1) + - answer_relevance: Answer relevance score (0-1) + - context_recall: Context recall score (0-1) + - context_precision: Context precision score (0-1) + - ragas_score: Overall RAGAS score (0-1) + - timestamp: When evaluation was run + """ + csv_path = ( + self.results_dir / f"results_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" + ) + + with open(csv_path, "w", newline="", encoding="utf-8") as f: + fieldnames = [ + "test_number", + "question", + "project", + "faithfulness", + "answer_relevance", + "context_recall", + "context_precision", + "ragas_score", + "status", + "timestamp", + ] + + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + + for idx, result in enumerate(results, 1): + metrics = result.get("metrics", {}) + writer.writerow( + { + "test_number": idx, + "question": result.get("question", ""), + "project": result.get("project", "unknown"), + "faithfulness": f"{metrics.get('faithfulness', 0):.4f}", + "answer_relevance": f"{metrics.get('answer_relevance', 0):.4f}", + "context_recall": f"{metrics.get('context_recall', 0):.4f}", + "context_precision": f"{metrics.get('context_precision', 0):.4f}", + "ragas_score": f"{result.get('ragas_score', 0):.4f}", + "status": "success" if metrics else "error", + "timestamp": result.get("timestamp", ""), + } + ) + + return csv_path + + def _format_metric(self, value: float, width: int = 6) -> str: + """ + Format a metric value for display, handling NaN gracefully + + Args: + value: The metric value to format + width: The width of the formatted string + + Returns: + Formatted string (e.g., "0.8523" or " N/A ") + """ + if _is_nan(value): + return "N/A".center(width) + return f"{value:.4f}".rjust(width) + + def _display_results_table(self, results: List[Dict[str, Any]]): + """ + Display evaluation results in a formatted table + + Args: + results: List of evaluation results + """ + logger.info("") + logger.info("%s", "=" * 115) + logger.info("📊 EVALUATION RESULTS SUMMARY") + logger.info("%s", "=" * 115) + + # Table header + logger.info( + "%-4s | %-50s | %6s | %7s | %6s | %7s | %6s | %6s", + "#", + "Question", + "Faith", + "AnswRel", + "CtxRec", + "CtxPrec", + "RAGAS", + "Status", + ) + logger.info("%s", "-" * 115) + + # Table rows + for result in results: + test_num = result.get("test_number", 0) + question = result.get("question", "") + # Truncate question to 50 chars + question_display = ( + (question[:47] + "...") if len(question) > 50 else question + ) + + metrics = result.get("metrics", {}) + if metrics: + # Success case - format each metric, handling NaN values + faith = metrics.get("faithfulness", 0) + ans_rel = metrics.get("answer_relevance", 0) + ctx_rec = metrics.get("context_recall", 0) + ctx_prec = metrics.get("context_precision", 0) + ragas = result.get("ragas_score", 0) + status = "✓" + + logger.info( + "%-4d | %-50s | %s | %s | %s | %s | %s | %6s", + test_num, + question_display, + self._format_metric(faith, 6), + self._format_metric(ans_rel, 7), + self._format_metric(ctx_rec, 6), + self._format_metric(ctx_prec, 7), + self._format_metric(ragas, 6), + status, + ) + else: + # Error case + error = result.get("error", "Unknown error") + error_display = (error[:20] + "...") if len(error) > 23 else error + logger.info( + "%-4d | %-50s | %6s | %7s | %6s | %7s | %6s | ✗ %s", + test_num, + question_display, + "N/A", + "N/A", + "N/A", + "N/A", + "N/A", + error_display, + ) + + logger.info("%s", "=" * 115) + + def _calculate_benchmark_stats( + self, results: List[Dict[str, Any]] + ) -> Dict[str, Any]: + """ + Calculate benchmark statistics from evaluation results + + Args: + results: List of evaluation results + + Returns: + Dictionary with benchmark statistics + """ + # Filter out results with errors + valid_results = [r for r in results if r.get("metrics")] + total_tests = len(results) + successful_tests = len(valid_results) + failed_tests = total_tests - successful_tests + + if not valid_results: + return { + "total_tests": total_tests, + "successful_tests": 0, + "failed_tests": failed_tests, + "success_rate": 0.0, + } + + # Calculate averages for each metric (handling NaN values correctly) + # Track both sum and count for each metric to handle NaN values properly + metrics_data = { + "faithfulness": {"sum": 0.0, "count": 0}, + "answer_relevance": {"sum": 0.0, "count": 0}, + "context_recall": {"sum": 0.0, "count": 0}, + "context_precision": {"sum": 0.0, "count": 0}, + "ragas_score": {"sum": 0.0, "count": 0}, + } + + for result in valid_results: + metrics = result.get("metrics", {}) + + # For each metric, sum non-NaN values and count them + faithfulness = metrics.get("faithfulness", 0) + if not _is_nan(faithfulness): + metrics_data["faithfulness"]["sum"] += faithfulness + metrics_data["faithfulness"]["count"] += 1 + + answer_relevance = metrics.get("answer_relevance", 0) + if not _is_nan(answer_relevance): + metrics_data["answer_relevance"]["sum"] += answer_relevance + metrics_data["answer_relevance"]["count"] += 1 + + context_recall = metrics.get("context_recall", 0) + if not _is_nan(context_recall): + metrics_data["context_recall"]["sum"] += context_recall + metrics_data["context_recall"]["count"] += 1 + + context_precision = metrics.get("context_precision", 0) + if not _is_nan(context_precision): + metrics_data["context_precision"]["sum"] += context_precision + metrics_data["context_precision"]["count"] += 1 + + ragas_score = result.get("ragas_score", 0) + if not _is_nan(ragas_score): + metrics_data["ragas_score"]["sum"] += ragas_score + metrics_data["ragas_score"]["count"] += 1 + + # Calculate averages using actual counts for each metric + avg_metrics = {} + for metric_name, data in metrics_data.items(): + if data["count"] > 0: + avg_val = data["sum"] / data["count"] + avg_metrics[metric_name] = ( + round(avg_val, 4) if not _is_nan(avg_val) else 0.0 + ) + else: + avg_metrics[metric_name] = 0.0 + + # Find min and max RAGAS scores (filter out NaN) + ragas_scores = [] + for r in valid_results: + score = r.get("ragas_score", 0) + if _is_nan(score): + continue # Skip NaN values + ragas_scores.append(score) + + min_score = min(ragas_scores) if ragas_scores else 0 + max_score = max(ragas_scores) if ragas_scores else 0 + + return { + "total_tests": total_tests, + "successful_tests": successful_tests, + "failed_tests": failed_tests, + "success_rate": round(successful_tests / total_tests * 100, 2), + "average_metrics": avg_metrics, + "min_ragas_score": round(min_score, 4), + "max_ragas_score": round(max_score, 4), + } + + async def run(self) -> Dict[str, Any]: + """Run complete evaluation pipeline""" + + start_time = time.time() + + # Evaluate responses + results = await self.evaluate_responses() + + elapsed_time = time.time() - start_time + + # Calculate benchmark statistics + benchmark_stats = self._calculate_benchmark_stats(results) + + # Save results + summary = { + "timestamp": datetime.now().isoformat(), + "total_tests": len(results), + "elapsed_time_seconds": round(elapsed_time, 2), + "benchmark_stats": benchmark_stats, + "results": results, + } + + # Display results table + self._display_results_table(results) + + # Save JSON results + json_path = ( + self.results_dir + / f"results_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" + ) + with open(json_path, "w") as f: + json.dump(summary, f, indent=2) + + # Export to CSV + csv_path = self._export_to_csv(results) + + # Print summary + logger.info("") + logger.info("%s", "=" * 70) + logger.info("📊 EVALUATION COMPLETE") + logger.info("%s", "=" * 70) + logger.info("Total Tests: %s", len(results)) + logger.info("Successful: %s", benchmark_stats["successful_tests"]) + logger.info("Failed: %s", benchmark_stats["failed_tests"]) + logger.info("Success Rate: %.2f%%", benchmark_stats["success_rate"]) + logger.info("Elapsed Time: %.2f seconds", elapsed_time) + logger.info("Avg Time/Test: %.2f seconds", elapsed_time / len(results)) + + # Print benchmark metrics + logger.info("") + logger.info("%s", "=" * 70) + logger.info("📈 BENCHMARK RESULTS (Average)") + logger.info("%s", "=" * 70) + avg = benchmark_stats["average_metrics"] + logger.info("Average Faithfulness: %.4f", avg["faithfulness"]) + logger.info("Average Answer Relevance: %.4f", avg["answer_relevance"]) + logger.info("Average Context Recall: %.4f", avg["context_recall"]) + logger.info("Average Context Precision: %.4f", avg["context_precision"]) + logger.info("Average RAGAS Score: %.4f", avg["ragas_score"]) + logger.info("%s", "-" * 70) + logger.info( + "Min RAGAS Score: %.4f", + benchmark_stats["min_ragas_score"], + ) + logger.info( + "Max RAGAS Score: %.4f", + benchmark_stats["max_ragas_score"], + ) + + logger.info("") + logger.info("%s", "=" * 70) + logger.info("📁 GENERATED FILES") + logger.info("%s", "=" * 70) + logger.info("Results Dir: %s", self.results_dir.absolute()) + logger.info(" • CSV: %s", csv_path.name) + logger.info(" • JSON: %s", json_path.name) + logger.info("%s", "=" * 70) + + return summary + + +async def main(): + """ + Main entry point for RAGAS evaluation + + Command-line arguments: + --dataset, -d: Path to test dataset JSON file (default: sample_dataset.json) + --ragendpoint, -r: LightRAG API endpoint URL (default: http://localhost:9621 or $LIGHTRAG_API_URL) + + Usage: + python lightrag/evaluation/eval_rag_quality.py + python lightrag/evaluation/eval_rag_quality.py --dataset my_test.json + python lightrag/evaluation/eval_rag_quality.py -d my_test.json -r http://localhost:9621 + """ + try: + # Parse command-line arguments + parser = argparse.ArgumentParser( + description="RAGAS Evaluation Script for LightRAG System", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Use defaults + python lightrag/evaluation/eval_rag_quality.py + + # Specify custom dataset + python lightrag/evaluation/eval_rag_quality.py --dataset my_test.json + + # Specify custom RAG endpoint + python lightrag/evaluation/eval_rag_quality.py --ragendpoint http://my-server.com:9621 + + # Specify both + python lightrag/evaluation/eval_rag_quality.py -d my_test.json -r http://localhost:9621 + """, + ) + + parser.add_argument( + "--dataset", + "-d", + type=str, + default=None, + help="Path to test dataset JSON file (default: sample_dataset.json in evaluation directory)", + ) + + parser.add_argument( + "--ragendpoint", + "-r", + type=str, + default=None, + help="LightRAG API endpoint URL (default: http://localhost:9621 or $LIGHTRAG_API_URL environment variable)", + ) + + args = parser.parse_args() + + logger.info("%s", "=" * 70) + logger.info("🔍 RAGAS Evaluation - Using Real LightRAG API") + logger.info("%s", "=" * 70) + + evaluator = RAGEvaluator( + test_dataset_path=args.dataset, rag_api_url=args.ragendpoint + ) + await evaluator.run() + except Exception as e: + logger.exception("❌ Error: %s", e) + sys.exit(1) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/LightRAG/lightrag/evaluation/sample_dataset.json b/LightRAG/lightrag/evaluation/sample_dataset.json new file mode 100644 index 00000000..0e452467 --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_dataset.json @@ -0,0 +1,34 @@ +{ + "test_cases": [ + { + "question": "How does LightRAG solve the hallucination problem in large language models?", + "ground_truth": "LightRAG solves the hallucination problem by combining large language models with external knowledge retrieval. The framework ensures accurate responses by grounding LLM outputs in actual documents. LightRAG provides contextual responses that reduce hallucinations significantly.", + "project": "lightrag_evaluation_sample" + }, + { + "question": "What are the three main components required in a RAG system?", + "ground_truth": "A RAG system requires three main components: a retrieval system (vector database or search engine) to find relevant documents, an embedding model to convert text into vector representations for similarity search, and a large language model (LLM) to generate responses based on retrieved context.", + "project": "lightrag_evaluation_sample" + }, + { + "question": "How does LightRAG's retrieval performance compare to traditional RAG approaches?", + "ground_truth": "LightRAG delivers faster retrieval performance than traditional RAG approaches. The framework optimizes document retrieval operations for speed. Traditional RAG systems often suffer from slow query response times. LightRAG achieves high quality results with improved performance. The framework combines speed with accuracy in retrieval operations, prioritizing ease of use without sacrificing quality.", + "project": "lightrag_evaluation_sample" + }, + { + "question": "What vector databases does LightRAG support and what are their key characteristics?", + "ground_truth": "LightRAG supports multiple vector databases including ChromaDB for simple deployment and efficient similarity search, Neo4j for graph-based knowledge representation with vector capabilities, Milvus for high-performance vector search at scale, Qdrant for fast similarity search with filtering and production-ready infrastructure, MongoDB Atlas for combined document storage and vector search, Redis for in-memory low-latency vector search, and a built-in nano-vectordb that eliminates external dependencies for small projects. This multi-database support enables developers to choose appropriate backends based on scale, performance, and infrastructure requirements.", + "project": "lightrag_evaluation_sample" + }, + { + "question": "What are the four key metrics for evaluating RAG system quality and what does each metric measure?", + "ground_truth": "RAG system quality is measured through four key metrics: Faithfulness measures whether answers are factually grounded in retrieved context and detects hallucinations. Answer Relevance measures how well answers address the user question and evaluates response appropriateness. Context Recall measures completeness of retrieval and whether all relevant information was retrieved from documents. Context Precision measures quality and relevance of retrieved documents without noise or irrelevant content.", + "project": "lightrag_evaluation_sample" + }, + { + "question": "What are the core benefits of LightRAG and how does it improve upon traditional RAG systems?", + "ground_truth": "LightRAG offers five core benefits: accuracy through document-grounded responses, up-to-date information without model retraining, domain expertise through specialized document collections, cost-effectiveness by avoiding expensive fine-tuning, and transparency by showing source documents. Compared to traditional RAG systems, LightRAG provides a simpler API with intuitive interfaces, faster retrieval performance with optimized operations, better integration with multiple vector database backends for flexible selection, and optimized prompting strategies with refined templates. LightRAG prioritizes ease of use while maintaining quality and combines speed with accuracy.", + "project": "lightrag_evaluation_sample" + } + ] +} diff --git a/LightRAG/lightrag/evaluation/sample_documents/01_lightrag_overview.md b/LightRAG/lightrag/evaluation/sample_documents/01_lightrag_overview.md new file mode 100644 index 00000000..be9781a9 --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/01_lightrag_overview.md @@ -0,0 +1,17 @@ +# LightRAG Framework Overview + +## What is LightRAG? + +**LightRAG** is a Simple and Fast Retrieval-Augmented Generation framework. LightRAG was developed by HKUDS (Hong Kong University Data Science Lab). The framework provides developers with tools to build RAG applications efficiently. + +## Problem Statement + +Large language models face several limitations. LLMs have a knowledge cutoff date that prevents them from accessing recent information. Large language models generate hallucinations when providing responses without factual grounding. LLMs lack domain-specific expertise in specialized fields. + +## How LightRAG Solves These Problems + +LightRAG solves the hallucination problem by combining large language models with external knowledge retrieval. The framework ensures accurate responses by grounding LLM outputs in actual documents. LightRAG provides contextual responses that reduce hallucinations significantly. The system enables efficient retrieval from external knowledge bases to supplement LLM capabilities. + +## Core Benefits + +LightRAG offers accuracy through document-grounded responses. The framework provides up-to-date information without model retraining. LightRAG enables domain expertise through specialized document collections. The system delivers cost-effectiveness by avoiding expensive model fine-tuning. LightRAG ensures transparency by showing source documents for each response. diff --git a/LightRAG/lightrag/evaluation/sample_documents/02_rag_architecture.md b/LightRAG/lightrag/evaluation/sample_documents/02_rag_architecture.md new file mode 100644 index 00000000..d34e08e8 --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/02_rag_architecture.md @@ -0,0 +1,21 @@ +# RAG System Architecture + +## Main Components of RAG Systems + +A RAG system consists of three main components that work together to provide intelligent responses. + +### Component 1: Retrieval System + +The retrieval system is the first component of a RAG system. A retrieval system finds relevant documents from large document collections. Vector databases serve as the primary storage for the retrieval system. Search engines can also function as retrieval systems in RAG architectures. + +### Component 2: Embedding Model + +The embedding model is the second component of a RAG system. An embedding model converts text into vector representations for similarity search. The embedding model transforms documents and queries into numerical vectors. These vector representations enable semantic similarity matching between queries and documents. + +### Component 3: Large Language Model + +The large language model is the third component of a RAG system. An LLM generates responses based on retrieved context from documents. The large language model synthesizes information from multiple sources into coherent answers. LLMs provide natural language generation capabilities for the RAG system. + +## How Components Work Together + +The retrieval system fetches relevant documents for a user query. The embedding model enables similarity matching between query and documents. The LLM generates the final response using retrieved context. These three components collaborate to provide accurate, contextual responses. diff --git a/LightRAG/lightrag/evaluation/sample_documents/03_lightrag_improvements.md b/LightRAG/lightrag/evaluation/sample_documents/03_lightrag_improvements.md new file mode 100644 index 00000000..dc9b0f36 --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/03_lightrag_improvements.md @@ -0,0 +1,25 @@ +# LightRAG Improvements Over Traditional RAG + +## Key Improvements + +LightRAG improves upon traditional RAG approaches in several significant ways. + +### Simpler API Design + +LightRAG offers a simpler API compared to traditional RAG frameworks. The framework provides intuitive interfaces for developers. Traditional RAG systems often require complex configuration and setup. LightRAG focuses on ease of use while maintaining functionality. + +### Faster Retrieval Performance + +LightRAG delivers faster retrieval performance than traditional RAG approaches. The framework optimizes document retrieval operations for speed. Traditional RAG systems often suffer from slow query response times. LightRAG achieves high quality results with improved performance. + +### Better Vector Database Integration + +LightRAG provides better integration with various vector databases. The framework supports multiple vector database backends seamlessly. Traditional RAG approaches typically lock developers into specific database choices. LightRAG enables flexible storage backend selection. + +### Optimized Prompting Strategies + +LightRAG implements optimized prompting strategies for better results. The framework uses refined prompt templates for accurate responses. Traditional RAG systems often use generic prompting approaches. LightRAG balances simplicity with high quality output. + +## Design Philosophy + +LightRAG prioritizes ease of use without sacrificing quality. The framework combines speed with accuracy in retrieval operations. LightRAG maintains flexibility in database and model selection. diff --git a/LightRAG/lightrag/evaluation/sample_documents/04_supported_databases.md b/LightRAG/lightrag/evaluation/sample_documents/04_supported_databases.md new file mode 100644 index 00000000..9bb03dbb --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/04_supported_databases.md @@ -0,0 +1,37 @@ +# LightRAG Vector Database Support + +## Supported Vector Databases + +LightRAG supports multiple vector databases for flexible deployment options. + +### ChromaDB + +ChromaDB is a vector database supported by LightRAG. ChromaDB provides simple deployment for development environments. The database offers efficient vector similarity search capabilities. + +### Neo4j + +Neo4j is a graph database supported by LightRAG. Neo4j enables graph-based knowledge representation alongside vector search. The database combines relationship modeling with vector capabilities. + +### Milvus + +Milvus is a vector database supported by LightRAG. Milvus provides high-performance vector search at scale. The database handles large-scale vector collections efficiently. + +### Qdrant + +Qdrant is a vector database supported by LightRAG. Qdrant offers fast similarity search with filtering capabilities. The database provides production-ready vector search infrastructure. + +### MongoDB Atlas Vector Search + +MongoDB Atlas Vector Search is supported by LightRAG. MongoDB Atlas combines document storage with vector search capabilities. The database enables unified data management for RAG applications. + +### Redis + +Redis is supported by LightRAG for vector search operations. Redis provides in-memory vector search with low latency. The database offers fast retrieval for real-time applications. + +### Built-in Nano-VectorDB + +LightRAG includes a built-in nano-vectordb for simple deployments. Nano-vectordb eliminates external database dependencies for small projects. The built-in database provides basic vector search functionality without additional setup. + +## Database Selection Benefits + +The multiple database support enables developers to choose appropriate storage backends. LightRAG adapts to different deployment scenarios from development to production. Users can select databases based on scale, performance, and infrastructure requirements. diff --git a/LightRAG/lightrag/evaluation/sample_documents/05_evaluation_and_deployment.md b/LightRAG/lightrag/evaluation/sample_documents/05_evaluation_and_deployment.md new file mode 100644 index 00000000..39e8decc --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/05_evaluation_and_deployment.md @@ -0,0 +1,41 @@ +# RAG Evaluation Metrics and Deployment + +## Key RAG Evaluation Metrics + +RAG system quality is measured through four key metrics. + +### Faithfulness Metric + +Faithfulness measures whether answers are factually grounded in retrieved context. The faithfulness metric detects hallucinations in LLM responses. High faithfulness scores indicate answers based on actual document content. The metric evaluates factual accuracy of generated responses. + +### Answer Relevance Metric + +Answer Relevance measures how well answers address the user question. The answer relevance metric evaluates response quality and appropriateness. High answer relevance scores show responses that directly answer user queries. The metric assesses the connection between questions and generated answers. + +### Context Recall Metric + +Context Recall measures completeness of retrieval from documents. The context recall metric evaluates whether all relevant information was retrieved. High context recall scores indicate comprehensive document retrieval. The metric assesses retrieval system effectiveness. + +### Context Precision Metric + +Context Precision measures quality and relevance of retrieved documents. The context precision metric evaluates retrieval accuracy without noise. High context precision scores show clean retrieval without irrelevant content. The metric measures retrieval system selectivity. + +## LightRAG Deployment Options + +LightRAG can be deployed in production through multiple approaches. + +### Docker Container Deployment + +Docker containers enable consistent LightRAG deployment across environments. Docker provides isolated runtime environments for the framework. Container deployment simplifies dependency management and scaling. + +### REST API Server with FastAPI + +FastAPI serves as the REST API framework for LightRAG deployment. The FastAPI server exposes LightRAG functionality through HTTP endpoints. REST API deployment enables client-server architecture for RAG applications. + +### Direct Python Integration + +Direct Python integration embeds LightRAG into Python applications. Python integration provides programmatic access to RAG capabilities. Direct integration supports custom application workflows and pipelines. + +### Deployment Features + +LightRAG supports environment-based configuration for different deployment scenarios. The framework integrates with multiple LLM providers for flexibility. LightRAG enables horizontal scaling for production workloads. diff --git a/LightRAG/lightrag/evaluation/sample_documents/README.md b/LightRAG/lightrag/evaluation/sample_documents/README.md new file mode 100644 index 00000000..3027ca48 --- /dev/null +++ b/LightRAG/lightrag/evaluation/sample_documents/README.md @@ -0,0 +1,21 @@ +# Sample Documents for Evaluation + +These markdown files correspond to test questions in `../sample_dataset.json`. + +## Usage + +1. **Index documents** into LightRAG (via WebUI, API, or Python) +2. **Run evaluation**: `python lightrag/evaluation/eval_rag_quality.py` +3. **Expected results**: ~91-100% RAGAS score per question + +## Files + +- `01_lightrag_overview.md` - LightRAG framework and hallucination problem +- `02_rag_architecture.md` - RAG system components +- `03_lightrag_improvements.md` - LightRAG vs traditional RAG +- `04_supported_databases.md` - Vector database support +- `05_evaluation_and_deployment.md` - Metrics and deployment + +## Note + +Documents use clear entity-relationship patterns for LightRAG's default entity extraction prompts. For better results with your data, customize `lightrag/prompt.py`. diff --git a/LightRAG/lightrag/exceptions.py b/LightRAG/lightrag/exceptions.py new file mode 100644 index 00000000..303391c2 --- /dev/null +++ b/LightRAG/lightrag/exceptions.py @@ -0,0 +1,114 @@ +from __future__ import annotations + +import httpx +from typing import Literal + + +class APIStatusError(Exception): + """Raised when an API response has a status code of 4xx or 5xx.""" + + response: httpx.Response + status_code: int + request_id: str | None + + def __init__( + self, message: str, *, response: httpx.Response, body: object | None + ) -> None: + super().__init__(message, response.request, body=body) + self.response = response + self.status_code = response.status_code + self.request_id = response.headers.get("x-request-id") + + +class APIConnectionError(Exception): + def __init__( + self, *, message: str = "Connection error.", request: httpx.Request + ) -> None: + super().__init__(message, request, body=None) + + +class BadRequestError(APIStatusError): + status_code: Literal[400] = 400 # pyright: ignore[reportIncompatibleVariableOverride] + + +class AuthenticationError(APIStatusError): + status_code: Literal[401] = 401 # pyright: ignore[reportIncompatibleVariableOverride] + + +class PermissionDeniedError(APIStatusError): + status_code: Literal[403] = 403 # pyright: ignore[reportIncompatibleVariableOverride] + + +class NotFoundError(APIStatusError): + status_code: Literal[404] = 404 # pyright: ignore[reportIncompatibleVariableOverride] + + +class ConflictError(APIStatusError): + status_code: Literal[409] = 409 # pyright: ignore[reportIncompatibleVariableOverride] + + +class UnprocessableEntityError(APIStatusError): + status_code: Literal[422] = 422 # pyright: ignore[reportIncompatibleVariableOverride] + + +class RateLimitError(APIStatusError): + status_code: Literal[429] = 429 # pyright: ignore[reportIncompatibleVariableOverride] + + +class APITimeoutError(APIConnectionError): + def __init__(self, request: httpx.Request) -> None: + super().__init__(message="Request timed out.", request=request) + + +class StorageNotInitializedError(RuntimeError): + """Raised when storage operations are attempted before initialization.""" + + def __init__(self, storage_type: str = "Storage"): + super().__init__( + f"{storage_type} not initialized. Please ensure proper initialization:\n" + f"\n" + f" rag = LightRAG(...)\n" + f" await rag.initialize_storages() # Required\n" + f" \n" + f" from lightrag.kg.shared_storage import initialize_pipeline_status\n" + f" await initialize_pipeline_status() # Required for pipeline operations\n" + f"\n" + f"See: https://github.com/HKUDS/LightRAG#important-initialization-requirements" + ) + + +class PipelineNotInitializedError(KeyError): + """Raised when pipeline status is accessed before initialization.""" + + def __init__(self, namespace: str = ""): + msg = ( + f"Pipeline namespace '{namespace}' not found. " + f"This usually means pipeline status was not initialized.\n" + f"\n" + f"Please call 'await initialize_pipeline_status()' after initializing storages:\n" + f"\n" + f" from lightrag.kg.shared_storage import initialize_pipeline_status\n" + f" await initialize_pipeline_status()\n" + f"\n" + f"Full initialization sequence:\n" + f" rag = LightRAG(...)\n" + f" await rag.initialize_storages()\n" + f" await initialize_pipeline_status()" + ) + super().__init__(msg) + + +class PipelineCancelledException(Exception): + """Raised when pipeline processing is cancelled by user request.""" + + def __init__(self, message: str = "User cancelled"): + super().__init__(message) + self.message = message + + +class QdrantMigrationError(Exception): + """Raised when Qdrant data migration from legacy collections fails.""" + + def __init__(self, message: str): + super().__init__(message) + self.message = message diff --git a/LightRAG/lightrag/kg/__init__.py b/LightRAG/lightrag/kg/__init__.py new file mode 100644 index 00000000..c62f7a3d --- /dev/null +++ b/LightRAG/lightrag/kg/__init__.py @@ -0,0 +1,140 @@ +STORAGE_IMPLEMENTATIONS = { + "KV_STORAGE": { + "implementations": [ + "JsonKVStorage", + "RedisKVStorage", + "PGKVStorage", + "MongoKVStorage", + ], + "required_methods": ["get_by_id", "upsert"], + }, + "GRAPH_STORAGE": { + "implementations": [ + "NetworkXStorage", + "Neo4JStorage", + "PGGraphStorage", + "MongoGraphStorage", + "MemgraphStorage", + ], + "required_methods": ["upsert_node", "upsert_edge"], + }, + "VECTOR_STORAGE": { + "implementations": [ + "NanoVectorDBStorage", + "MilvusVectorDBStorage", + "PGVectorStorage", + "FaissVectorDBStorage", + "QdrantVectorDBStorage", + "MongoVectorDBStorage", + # "ChromaVectorDBStorage", + ], + "required_methods": ["query", "upsert"], + }, + "DOC_STATUS_STORAGE": { + "implementations": [ + "JsonDocStatusStorage", + "RedisDocStatusStorage", + "PGDocStatusStorage", + "MongoDocStatusStorage", + ], + "required_methods": ["get_docs_by_status"], + }, +} + +# Storage implementation environment variable without default value +STORAGE_ENV_REQUIREMENTS: dict[str, list[str]] = { + # KV Storage Implementations + "JsonKVStorage": [], + "MongoKVStorage": [ + "MONGO_URI", + "MONGO_DATABASE", + ], + "RedisKVStorage": ["REDIS_URI"], + "PGKVStorage": ["POSTGRES_USER", "POSTGRES_PASSWORD", "POSTGRES_DATABASE"], + # Graph Storage Implementations + "NetworkXStorage": [], + "Neo4JStorage": ["NEO4J_URI", "NEO4J_USERNAME", "NEO4J_PASSWORD"], + "MongoGraphStorage": [ + "MONGO_URI", + "MONGO_DATABASE", + ], + "MemgraphStorage": ["MEMGRAPH_URI"], + "AGEStorage": [ + "AGE_POSTGRES_DB", + "AGE_POSTGRES_USER", + "AGE_POSTGRES_PASSWORD", + ], + "PGGraphStorage": [ + "POSTGRES_USER", + "POSTGRES_PASSWORD", + "POSTGRES_DATABASE", + ], + # Vector Storage Implementations + "NanoVectorDBStorage": [], + "MilvusVectorDBStorage": [ + "MILVUS_URI", + "MILVUS_DB_NAME", + ], + # "ChromaVectorDBStorage": [], + "PGVectorStorage": ["POSTGRES_USER", "POSTGRES_PASSWORD", "POSTGRES_DATABASE"], + "FaissVectorDBStorage": [], + "QdrantVectorDBStorage": ["QDRANT_URL"], # QDRANT_API_KEY has default value None + "MongoVectorDBStorage": [ + "MONGO_URI", + "MONGO_DATABASE", + ], + # Document Status Storage Implementations + "JsonDocStatusStorage": [], + "RedisDocStatusStorage": ["REDIS_URI"], + "PGDocStatusStorage": ["POSTGRES_USER", "POSTGRES_PASSWORD", "POSTGRES_DATABASE"], + "MongoDocStatusStorage": [ + "MONGO_URI", + "MONGO_DATABASE", + ], +} + +# Storage implementation module mapping +STORAGES = { + "NetworkXStorage": ".kg.networkx_impl", + "JsonKVStorage": ".kg.json_kv_impl", + "NanoVectorDBStorage": ".kg.nano_vector_db_impl", + "JsonDocStatusStorage": ".kg.json_doc_status_impl", + "Neo4JStorage": ".kg.neo4j_impl", + "MilvusVectorDBStorage": ".kg.milvus_impl", + "MongoKVStorage": ".kg.mongo_impl", + "MongoDocStatusStorage": ".kg.mongo_impl", + "MongoGraphStorage": ".kg.mongo_impl", + "MongoVectorDBStorage": ".kg.mongo_impl", + "RedisKVStorage": ".kg.redis_impl", + "RedisDocStatusStorage": ".kg.redis_impl", + "ChromaVectorDBStorage": ".kg.chroma_impl", + "PGKVStorage": ".kg.postgres_impl", + "PGVectorStorage": ".kg.postgres_impl", + "AGEStorage": ".kg.age_impl", + "PGGraphStorage": ".kg.postgres_impl", + "PGDocStatusStorage": ".kg.postgres_impl", + "FaissVectorDBStorage": ".kg.faiss_impl", + "QdrantVectorDBStorage": ".kg.qdrant_impl", + "MemgraphStorage": ".kg.memgraph_impl", +} + + +def verify_storage_implementation(storage_type: str, storage_name: str) -> None: + """Verify if storage implementation is compatible with specified storage type + + Args: + storage_type: Storage type (KV_STORAGE, GRAPH_STORAGE etc.) + storage_name: Storage implementation name + + Raises: + ValueError: If storage implementation is incompatible or missing required methods + """ + if storage_type not in STORAGE_IMPLEMENTATIONS: + raise ValueError(f"Unknown storage type: {storage_type}") + + storage_info = STORAGE_IMPLEMENTATIONS[storage_type] + if storage_name not in storage_info["implementations"]: + raise ValueError( + f"Storage implementation '{storage_name}' is not compatible with {storage_type}. " + f"Compatible implementations are: {', '.join(storage_info['implementations'])}" + ) diff --git a/LightRAG/lightrag/kg/deprecated/chroma_impl.py b/LightRAG/lightrag/kg/deprecated/chroma_impl.py new file mode 100644 index 00000000..54bf9037 --- /dev/null +++ b/LightRAG/lightrag/kg/deprecated/chroma_impl.py @@ -0,0 +1,342 @@ +import asyncio +import os +from dataclasses import dataclass +from typing import Any, final +import numpy as np + +from lightrag.base import BaseVectorStorage +from lightrag.utils import logger +import pipmaster as pm + +if not pm.is_installed("chromadb"): + pm.install("chromadb") + +from chromadb import HttpClient, PersistentClient # type: ignore +from chromadb.config import Settings # type: ignore + + +@final +@dataclass +class ChromaVectorDBStorage(BaseVectorStorage): + """ChromaDB vector storage implementation.""" + + def __post_init__(self): + try: + config = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = config.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + user_collection_settings = config.get("collection_settings", {}) + # Default HNSW index settings for ChromaDB + default_collection_settings = { + # Distance metric used for similarity search (cosine similarity) + "hnsw:space": "cosine", + # Number of nearest neighbors to explore during index construction + # Higher values = better recall but slower indexing + "hnsw:construction_ef": 128, + # Number of nearest neighbors to explore during search + # Higher values = better recall but slower search + "hnsw:search_ef": 128, + # Number of connections per node in the HNSW graph + # Higher values = better recall but more memory usage + "hnsw:M": 16, + # Number of vectors to process in one batch during indexing + "hnsw:batch_size": 100, + # Number of updates before forcing index synchronization + # Lower values = more frequent syncs but slower indexing + "hnsw:sync_threshold": 1000, + } + collection_settings = { + **default_collection_settings, + **user_collection_settings, + } + + local_path = config.get("local_path", None) + if local_path: + self._client = PersistentClient( + path=local_path, + settings=Settings( + allow_reset=True, + anonymized_telemetry=False, + ), + ) + else: + auth_provider = config.get( + "auth_provider", "chromadb.auth.token_authn.TokenAuthClientProvider" + ) + auth_credentials = config.get("auth_token", "secret-token") + headers = {} + + if "token_authn" in auth_provider: + headers = { + config.get( + "auth_header_name", "X-Chroma-Token" + ): auth_credentials + } + elif "basic_authn" in auth_provider: + auth_credentials = config.get("auth_credentials", "admin:admin") + + self._client = HttpClient( + host=config.get("host", "localhost"), + port=config.get("port", 8000), + headers=headers, + settings=Settings( + chroma_api_impl="rest", + chroma_client_auth_provider=auth_provider, + chroma_client_auth_credentials=auth_credentials, + allow_reset=True, + anonymized_telemetry=False, + ), + ) + + self._collection = self._client.get_or_create_collection( + name=self.namespace, + metadata={ + **collection_settings, + "dimension": self.embedding_func.embedding_dim, + }, + ) + # Use batch size from collection settings if specified + self._max_batch_size = self.global_config.get( + "embedding_batch_num", collection_settings.get("hnsw:batch_size", 32) + ) + except Exception as e: + logger.error(f"ChromaDB initialization failed: {str(e)}") + raise + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"Inserting {len(data)} to {self.namespace}") + if not data: + return + + try: + import time + + current_time = int(time.time()) + + ids = list(data.keys()) + documents = [v["content"] for v in data.values()] + metadatas = [ + { + **{k: v for k, v in item.items() if k in self.meta_fields}, + "created_at": current_time, + } + or {"_default": "true", "created_at": current_time} + for item in data.values() + ] + + # Process in batches + batches = [ + documents[i : i + self._max_batch_size] + for i in range(0, len(documents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = [] + + # Pre-allocate embeddings_list with known size + embeddings_list = [None] * len(embedding_tasks) + + # Use asyncio.gather instead of as_completed if order doesn't matter + embeddings_results = await asyncio.gather(*embedding_tasks) + embeddings_list = list(embeddings_results) + + embeddings = np.concatenate(embeddings_list) + + # Upsert in batches + for i in range(0, len(ids), self._max_batch_size): + batch_slice = slice(i, i + self._max_batch_size) + + self._collection.upsert( + ids=ids[batch_slice], + embeddings=embeddings[batch_slice].tolist(), + documents=documents[batch_slice], + metadatas=metadatas[batch_slice], + ) + + return ids + + except Exception as e: + logger.error(f"Error during ChromaDB upsert: {str(e)}") + raise + + async def query(self, query: str, top_k: int) -> list[dict[str, Any]]: + try: + embedding = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + + results = self._collection.query( + query_embeddings=embedding.tolist() + if not isinstance(embedding, list) + else embedding, + n_results=top_k * 2, # Request more results to allow for filtering + include=["metadatas", "distances", "documents"], + ) + + # Filter results by cosine similarity threshold and take top k + # We request 2x results initially to have enough after filtering + # ChromaDB returns cosine similarity (1 = identical, 0 = orthogonal) + # We convert to distance (0 = identical, 1 = orthogonal) via (1 - similarity) + # Only keep results with distance below threshold, then take top k + return [ + { + "id": results["ids"][0][i], + "distance": 1 - results["distances"][0][i], + "content": results["documents"][0][i], + "created_at": results["metadatas"][0][i].get("created_at"), + **results["metadatas"][0][i], + } + for i in range(len(results["ids"][0])) + if (1 - results["distances"][0][i]) >= self.cosine_better_than_threshold + ][:top_k] + + except Exception as e: + logger.error(f"Error during ChromaDB query: {str(e)}") + raise + + async def index_done_callback(self) -> None: + # ChromaDB handles persistence automatically + pass + + async def delete_entity(self, entity_name: str) -> None: + """Delete an entity by its ID. + + Args: + entity_name: The ID of the entity to delete + """ + try: + logger.info(f"Deleting entity with ID {entity_name} from {self.namespace}") + self._collection.delete(ids=[entity_name]) + except Exception as e: + logger.error(f"Error during entity deletion: {str(e)}") + raise + + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete an entity and its relations by ID. + In vector DB context, this is equivalent to delete_entity. + + Args: + entity_name: The ID of the entity to delete + """ + await self.delete_entity(entity_name) + + async def delete(self, ids: list[str]) -> None: + """Delete vectors with specified IDs + + Args: + ids: List of vector IDs to be deleted + """ + try: + self._collection.delete(ids=ids) + logger.debug( + f"Successfully deleted {len(ids)} vectors from {self.namespace}" + ) + except Exception as e: + logger.error(f"Error while deleting vectors from {self.namespace}: {e}") + raise + + except Exception as e: + logger.error(f"Error during prefix search in ChromaDB: {str(e)}") + raise + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + try: + # Query the collection for a single vector by ID + result = self._collection.get( + ids=[id], include=["metadatas", "embeddings", "documents"] + ) + + if not result or not result["ids"] or len(result["ids"]) == 0: + return None + + # Format the result to match the expected structure + return { + "id": result["ids"][0], + "vector": result["embeddings"][0], + "content": result["documents"][0], + "created_at": result["metadatas"][0].get("created_at"), + **result["metadatas"][0], + } + except Exception as e: + logger.error(f"Error retrieving vector data for ID {id}: {e}") + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + try: + # Query the collection for multiple vectors by IDs + result = self._collection.get( + ids=ids, include=["metadatas", "embeddings", "documents"] + ) + + if not result or not result["ids"] or len(result["ids"]) == 0: + return [] + + # Format the results to match the expected structure and preserve ordering + formatted_map: dict[str, dict[str, Any]] = {} + for i, result_id in enumerate(result["ids"]): + record = { + "id": result_id, + "vector": result["embeddings"][i], + "content": result["documents"][i], + "created_at": result["metadatas"][i].get("created_at"), + **result["metadatas"][i], + } + formatted_map[str(result_id)] = record + + ordered_results: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered_results.append(formatted_map.get(str(requested_id))) + + return ordered_results + except Exception as e: + logger.error(f"Error retrieving vector data for IDs {ids}: {e}") + return [] + + async def drop(self) -> dict[str, str]: + """Drop all vector data from storage and clean up resources + + This method will delete all documents from the ChromaDB collection. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + # Get all IDs in the collection + result = self._collection.get(include=[]) + if result and result["ids"] and len(result["ids"]) > 0: + # Delete all documents + self._collection.delete(ids=result["ids"]) + + logger.info( + f"Process {os.getpid()} drop ChromaDB collection {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error(f"Error dropping ChromaDB collection {self.namespace}: {e}") + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/faiss_impl.py b/LightRAG/lightrag/kg/faiss_impl.py new file mode 100644 index 00000000..2f10ab1a --- /dev/null +++ b/LightRAG/lightrag/kg/faiss_impl.py @@ -0,0 +1,541 @@ +import os +import time +import asyncio +from typing import Any, final +import json +import numpy as np +from dataclasses import dataclass + +from lightrag.utils import logger, compute_mdhash_id +from lightrag.base import BaseVectorStorage + +from .shared_storage import ( + get_storage_lock, + get_update_flag, + set_all_update_flags, +) + +# You must manually install faiss-cpu or faiss-gpu before using FAISS vector db +import faiss # type: ignore + + +@final +@dataclass +class FaissVectorDBStorage(BaseVectorStorage): + """ + A Faiss-based Vector DB Storage for LightRAG. + Uses cosine similarity by storing normalized vectors in a Faiss index with inner product search. + """ + + def __post_init__(self): + # Grab config values if available + kwargs = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = kwargs.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + # Where to save index file if you want persistent storage + working_dir = self.global_config["working_dir"] + if self.workspace: + # Include workspace in the file path for data isolation + workspace_dir = os.path.join(working_dir, self.workspace) + self.final_namespace = f"{self.workspace}_{self.namespace}" + + else: + # Default behavior when workspace is empty + self.final_namespace = self.namespace + self.workspace = "_" + workspace_dir = working_dir + + os.makedirs(workspace_dir, exist_ok=True) + self._faiss_index_file = os.path.join( + workspace_dir, f"faiss_index_{self.namespace}.index" + ) + self._meta_file = self._faiss_index_file + ".meta.json" + + self._max_batch_size = self.global_config["embedding_batch_num"] + # Embedding dimension (e.g. 768) must match your embedding function + self._dim = self.embedding_func.embedding_dim + + # Create an empty Faiss index for inner product (useful for normalized vectors = cosine similarity). + # If you have a large number of vectors, you might want IVF or other indexes. + # For demonstration, we use a simple IndexFlatIP. + self._index = faiss.IndexFlatIP(self._dim) + # Keep a local store for metadata, IDs, etc. + # Maps → metadata (including your original ID). + self._id_to_meta = {} + + self._load_faiss_index() + + async def initialize(self): + """Initialize storage data""" + # Get the update flag for cross-process update notification + self.storage_updated = await get_update_flag(self.final_namespace) + # Get the storage lock for use in other methods + self._storage_lock = get_storage_lock() + + async def _get_index(self): + """Check if the shtorage should be reloaded""" + # Acquire lock to prevent concurrent read and write + async with self._storage_lock: + # Check if storage was updated by another process + if self.storage_updated.value: + logger.info( + f"[{self.workspace}] Process {os.getpid()} FAISS reloading {self.namespace} due to update by another process" + ) + # Reload data + self._index = faiss.IndexFlatIP(self._dim) + self._id_to_meta = {} + self._load_faiss_index() + self.storage_updated.value = False + return self._index + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """ + Insert or update vectors in the Faiss index. + + data: { + "custom_id_1": { + "content": , + ...metadata... + }, + "custom_id_2": { + "content": , + ...metadata... + }, + ... + } + """ + logger.debug( + f"[{self.workspace}] FAISS: Inserting {len(data)} to {self.namespace}" + ) + if not data: + return + + current_time = int(time.time()) + + # Prepare data for embedding + list_data = [] + contents = [] + for k, v in data.items(): + # Store only known meta fields if needed + meta = {mf: v[mf] for mf in self.meta_fields if mf in v} + meta["__id__"] = k + meta["__created_at__"] = current_time + list_data.append(meta) + contents.append(v["content"]) + + # Split into batches for embedding if needed + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + + # Flatten the list of arrays + embeddings = np.concatenate(embeddings_list, axis=0) + if len(embeddings) != len(list_data): + logger.error( + f"[{self.workspace}] Embedding size mismatch. Embeddings: {len(embeddings)}, Data: {len(list_data)}" + ) + return [] + + # Convert to float32 and normalize embeddings for cosine similarity (in-place) + embeddings = embeddings.astype(np.float32) + faiss.normalize_L2(embeddings) + + # Upsert logic: + # 1. Identify which vectors to remove if they exist + # 2. Remove them + # 3. Add the new vectors + existing_ids_to_remove = [] + for meta, emb in zip(list_data, embeddings): + faiss_internal_id = self._find_faiss_id_by_custom_id(meta["__id__"]) + if faiss_internal_id is not None: + existing_ids_to_remove.append(faiss_internal_id) + + if existing_ids_to_remove: + await self._remove_faiss_ids(existing_ids_to_remove) + + # Step 2: Add new vectors + index = await self._get_index() + start_idx = index.ntotal + index.add(embeddings) + + # Step 3: Store metadata + vector for each new ID + for i, meta in enumerate(list_data): + fid = start_idx + i + # Store the raw vector so we can rebuild if something is removed + meta["__vector__"] = embeddings[i].tolist() + self._id_to_meta.update({fid: meta}) + + logger.debug( + f"[{self.workspace}] Upserted {len(list_data)} vectors into Faiss index." + ) + return [m["__id__"] for m in list_data] + + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + """ + Search by a textual query; returns top_k results with their metadata + similarity distance. + """ + if query_embedding is not None: + embedding = np.array([query_embedding], dtype=np.float32) + else: + embedding = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + # embedding is shape (1, dim) + embedding = np.array(embedding, dtype=np.float32) + + faiss.normalize_L2(embedding) # we do in-place normalization + + # Perform the similarity search + index = await self._get_index() + distances, indices = index.search(embedding, top_k) + + distances = distances[0] + indices = indices[0] + + results = [] + for dist, idx in zip(distances, indices): + if idx == -1: + # Faiss returns -1 if no neighbor + continue + + # Cosine similarity threshold + if dist < self.cosine_better_than_threshold: + continue + + meta = self._id_to_meta.get(idx, {}) + # Filter out __vector__ from query results to avoid returning large vector data + filtered_meta = {k: v for k, v in meta.items() if k != "__vector__"} + results.append( + { + **filtered_meta, + "id": meta.get("__id__"), + "distance": float(dist), + "created_at": meta.get("__created_at__"), + } + ) + + return results + + @property + def client_storage(self): + # Return whatever structure LightRAG might need for debugging + return {"data": list(self._id_to_meta.values())} + + async def delete(self, ids: list[str]): + """ + Delete vectors for the provided custom IDs. + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + logger.debug( + f"[{self.workspace}] Deleting {len(ids)} vectors from {self.namespace}" + ) + to_remove = [] + for cid in ids: + fid = self._find_faiss_id_by_custom_id(cid) + if fid is not None: + to_remove.append(fid) + + if to_remove: + await self._remove_faiss_ids(to_remove) + logger.debug( + f"[{self.workspace}] Successfully deleted {len(to_remove)} vectors from {self.namespace}" + ) + + async def delete_entity(self, entity_name: str) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + logger.debug( + f"[{self.workspace}] Attempting to delete entity {entity_name} with ID {entity_id}" + ) + await self.delete([entity_id]) + + async def delete_entity_relation(self, entity_name: str) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + logger.debug(f"[{self.workspace}] Searching relations for entity {entity_name}") + relations = [] + for fid, meta in self._id_to_meta.items(): + if meta.get("src_id") == entity_name or meta.get("tgt_id") == entity_name: + relations.append(fid) + + logger.debug( + f"[{self.workspace}] Found {len(relations)} relations for {entity_name}" + ) + if relations: + await self._remove_faiss_ids(relations) + logger.debug( + f"[{self.workspace}] Deleted {len(relations)} relations for {entity_name}" + ) + + # -------------------------------------------------------------------------------- + # Internal helper methods + # -------------------------------------------------------------------------------- + + def _find_faiss_id_by_custom_id(self, custom_id: str): + """ + Return the Faiss internal ID for a given custom ID, or None if not found. + """ + for fid, meta in self._id_to_meta.items(): + if meta.get("__id__") == custom_id: + return fid + return None + + async def _remove_faiss_ids(self, fid_list): + """ + Remove a list of internal Faiss IDs from the index. + Because IndexFlatIP doesn't support 'removals', + we rebuild the index excluding those vectors. + """ + keep_fids = [fid for fid in self._id_to_meta if fid not in fid_list] + + # Rebuild the index + vectors_to_keep = [] + new_id_to_meta = {} + for new_fid, old_fid in enumerate(keep_fids): + vec_meta = self._id_to_meta[old_fid] + vectors_to_keep.append(vec_meta["__vector__"]) # stored as list + new_id_to_meta[new_fid] = vec_meta + + async with self._storage_lock: + # Re-init index + self._index = faiss.IndexFlatIP(self._dim) + if vectors_to_keep: + arr = np.array(vectors_to_keep, dtype=np.float32) + self._index.add(arr) + + self._id_to_meta = new_id_to_meta + + def _save_faiss_index(self): + """ + Save the current Faiss index + metadata to disk so it can persist across runs. + """ + faiss.write_index(self._index, self._faiss_index_file) + + # Save metadata dict to JSON. Convert all keys to strings for JSON storage. + # _id_to_meta is { int: { '__id__': doc_id, '__vector__': [float,...], ... } } + # We'll keep the int -> dict, but JSON requires string keys. + serializable_dict = {} + for fid, meta in self._id_to_meta.items(): + serializable_dict[str(fid)] = meta + + with open(self._meta_file, "w", encoding="utf-8") as f: + json.dump(serializable_dict, f) + + def _load_faiss_index(self): + """ + Load the Faiss index + metadata from disk if it exists, + and rebuild in-memory structures so we can query. + """ + if not os.path.exists(self._faiss_index_file): + logger.warning( + f"[{self.workspace}] No existing Faiss index file found for {self.namespace}" + ) + return + + try: + # Load the Faiss index + self._index = faiss.read_index(self._faiss_index_file) + # Load metadata + with open(self._meta_file, "r", encoding="utf-8") as f: + stored_dict = json.load(f) + + # Convert string keys back to int + self._id_to_meta = {} + for fid_str, meta in stored_dict.items(): + fid = int(fid_str) + self._id_to_meta[fid] = meta + + logger.info( + f"[{self.workspace}] Faiss index loaded with {self._index.ntotal} vectors from {self._faiss_index_file}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to load Faiss index or metadata: {e}" + ) + logger.warning(f"[{self.workspace}] Starting with an empty Faiss index.") + self._index = faiss.IndexFlatIP(self._dim) + self._id_to_meta = {} + + async def index_done_callback(self) -> None: + async with self._storage_lock: + # Check if storage was updated by another process + if self.storage_updated.value: + # Storage was updated by another process, reload data instead of saving + logger.warning( + f"[{self.workspace}] Storage for FAISS {self.namespace} was updated by another process, reloading..." + ) + self._index = faiss.IndexFlatIP(self._dim) + self._id_to_meta = {} + self._load_faiss_index() + self.storage_updated.value = False + return False # Return error + + # Acquire lock and perform persistence + async with self._storage_lock: + try: + # Save data to disk + self._save_faiss_index() + # Notify other processes that data has been updated + await set_all_update_flags(self.final_namespace) + # Reset own update flag to avoid self-reloading + self.storage_updated.value = False + except Exception as e: + logger.error( + f"[{self.workspace}] Error saving FAISS index for {self.namespace}: {e}" + ) + return False # Return error + + return True # Return success + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + # Find the Faiss internal ID for the custom ID + fid = self._find_faiss_id_by_custom_id(id) + if fid is None: + return None + + # Get the metadata for the found ID + metadata = self._id_to_meta.get(fid, {}) + if not metadata: + return None + + # Filter out __vector__ from metadata to avoid returning large vector data + filtered_metadata = {k: v for k, v in metadata.items() if k != "__vector__"} + return { + **filtered_metadata, + "id": metadata.get("__id__"), + "created_at": metadata.get("__created_at__"), + } + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + results: list[dict[str, Any] | None] = [] + for id in ids: + record = None + fid = self._find_faiss_id_by_custom_id(id) + if fid is not None: + metadata = self._id_to_meta.get(fid) + if metadata: + # Filter out __vector__ from metadata to avoid returning large vector data + filtered_metadata = { + k: v for k, v in metadata.items() if k != "__vector__" + } + record = { + **filtered_metadata, + "id": metadata.get("__id__"), + "created_at": metadata.get("__created_at__"), + } + results.append(record) + + return results + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + vectors_dict = {} + for id in ids: + # Find the Faiss internal ID for the custom ID + fid = self._find_faiss_id_by_custom_id(id) + if fid is not None and fid in self._id_to_meta: + metadata = self._id_to_meta[fid] + # Get the stored vector from metadata + if "__vector__" in metadata: + vectors_dict[id] = metadata["__vector__"] + + return vectors_dict + + async def drop(self) -> dict[str, str]: + """Drop all vector data from storage and clean up resources + + This method will: + 1. Remove the vector database storage file if it exists + 2. Reinitialize the vector database client + 3. Update flags to notify other processes + 4. Changes is persisted to disk immediately + + This method will remove all vectors from the Faiss index and delete the storage files. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + async with self._storage_lock: + # Reset the index + self._index = faiss.IndexFlatIP(self._dim) + self._id_to_meta = {} + + # Remove storage files if they exist + if os.path.exists(self._faiss_index_file): + os.remove(self._faiss_index_file) + if os.path.exists(self._meta_file): + os.remove(self._meta_file) + + self._id_to_meta = {} + self._load_faiss_index() + + # Notify other processes + await set_all_update_flags(self.final_namespace) + self.storage_updated.value = False + + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop FAISS index {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping FAISS index {self.namespace}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/json_doc_status_impl.py b/LightRAG/lightrag/kg/json_doc_status_impl.py new file mode 100644 index 00000000..bf6e7b17 --- /dev/null +++ b/LightRAG/lightrag/kg/json_doc_status_impl.py @@ -0,0 +1,401 @@ +from dataclasses import dataclass +import os +from typing import Any, Union, final + +from lightrag.base import ( + DocProcessingStatus, + DocStatus, + DocStatusStorage, +) +from lightrag.utils import ( + load_json, + logger, + write_json, + get_pinyin_sort_key, +) +from lightrag.exceptions import StorageNotInitializedError +from .shared_storage import ( + get_namespace_data, + get_storage_lock, + get_data_init_lock, + get_update_flag, + set_all_update_flags, + clear_all_update_flags, + try_initialize_namespace, +) + + +@final +@dataclass +class JsonDocStatusStorage(DocStatusStorage): + """JSON implementation of document status storage""" + + def __post_init__(self): + working_dir = self.global_config["working_dir"] + if self.workspace: + # Include workspace in the file path for data isolation + workspace_dir = os.path.join(working_dir, self.workspace) + self.final_namespace = f"{self.workspace}_{self.namespace}" + else: + # Default behavior when workspace is empty + self.final_namespace = self.namespace + self.workspace = "_" + workspace_dir = working_dir + + os.makedirs(workspace_dir, exist_ok=True) + self._file_name = os.path.join(workspace_dir, f"kv_store_{self.namespace}.json") + self._data = None + self._storage_lock = None + self.storage_updated = None + + async def initialize(self): + """Initialize storage data""" + self._storage_lock = get_storage_lock() + self.storage_updated = await get_update_flag(self.final_namespace) + async with get_data_init_lock(): + # check need_init must before get_namespace_data + need_init = await try_initialize_namespace(self.final_namespace) + self._data = await get_namespace_data(self.final_namespace) + if need_init: + loaded_data = load_json(self._file_name) or {} + async with self._storage_lock: + self._data.update(loaded_data) + logger.info( + f"[{self.workspace}] Process {os.getpid()} doc status load {self.namespace} with {len(loaded_data)} records" + ) + + async def filter_keys(self, keys: set[str]) -> set[str]: + """Return keys that should be processed (not in storage or not successfully processed)""" + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + async with self._storage_lock: + return set(keys) - set(self._data.keys()) + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + ordered_results: list[dict[str, Any] | None] = [] + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + async with self._storage_lock: + for id in ids: + data = self._data.get(id, None) + if data: + ordered_results.append(data.copy()) + else: + ordered_results.append(None) + return ordered_results + + async def get_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status""" + counts = {status.value: 0 for status in DocStatus} + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + async with self._storage_lock: + for doc in self._data.values(): + counts[doc["status"]] += 1 + return counts + + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific status""" + result = {} + async with self._storage_lock: + for k, v in self._data.items(): + if v["status"] == status.value: + try: + # Make a copy of the data to avoid modifying the original + data = v.copy() + # Remove deprecated content field if it exists + data.pop("content", None) + # If file_path is not in data, use document id as file path + if "file_path" not in data: + data["file_path"] = "no-file-path" + # Ensure new fields exist with default values + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + result[k] = DocProcessingStatus(**data) + except KeyError as e: + logger.error( + f"[{self.workspace}] Missing required field for document {k}: {e}" + ) + continue + return result + + async def get_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific track_id""" + result = {} + async with self._storage_lock: + for k, v in self._data.items(): + if v.get("track_id") == track_id: + try: + # Make a copy of the data to avoid modifying the original + data = v.copy() + # Remove deprecated content field if it exists + data.pop("content", None) + # If file_path is not in data, use document id as file path + if "file_path" not in data: + data["file_path"] = "no-file-path" + # Ensure new fields exist with default values + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + result[k] = DocProcessingStatus(**data) + except KeyError as e: + logger.error( + f"[{self.workspace}] Missing required field for document {k}: {e}" + ) + continue + return result + + async def index_done_callback(self) -> None: + async with self._storage_lock: + if self.storage_updated.value: + data_dict = ( + dict(self._data) if hasattr(self._data, "_getvalue") else self._data + ) + logger.debug( + f"[{self.workspace}] Process {os.getpid()} doc status writting {len(data_dict)} records to {self.namespace}" + ) + + # Write JSON and check if sanitization was applied + needs_reload = write_json(data_dict, self._file_name) + + # If data was sanitized, reload cleaned data to update shared memory + if needs_reload: + logger.info( + f"[{self.workspace}] Reloading sanitized data into shared memory for {self.namespace}" + ) + cleaned_data = load_json(self._file_name) + if cleaned_data is not None: + self._data.clear() + self._data.update(cleaned_data) + + await clear_all_update_flags(self.final_namespace) + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """ + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + """ + if not data: + return + logger.debug( + f"[{self.workspace}] Inserting {len(data)} records to {self.namespace}" + ) + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + async with self._storage_lock: + # Ensure chunks_list field exists for new documents + for doc_id, doc_data in data.items(): + if "chunks_list" not in doc_data: + doc_data["chunks_list"] = [] + self._data.update(data) + await set_all_update_flags(self.final_namespace) + + await self.index_done_callback() + + async def is_empty(self) -> bool: + """Check if the storage is empty + + Returns: + bool: True if storage is empty, False otherwise + + Raises: + StorageNotInitializedError: If storage is not initialized + """ + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + async with self._storage_lock: + return len(self._data) == 0 + + async def get_by_id(self, id: str) -> Union[dict[str, Any], None]: + async with self._storage_lock: + return self._data.get(id) + + async def get_docs_paginated( + self, + status_filter: DocStatus | None = None, + page: int = 1, + page_size: int = 50, + sort_field: str = "updated_at", + sort_direction: str = "desc", + ) -> tuple[list[tuple[str, DocProcessingStatus]], int]: + """Get documents with pagination support + + Args: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', 'id') + sort_direction: Sort direction ('asc' or 'desc') + + Returns: + Tuple of (list of (doc_id, DocProcessingStatus) tuples, total_count) + """ + # Validate parameters + if page < 1: + page = 1 + if page_size < 10: + page_size = 10 + elif page_size > 200: + page_size = 200 + + if sort_field not in ["created_at", "updated_at", "id", "file_path"]: + sort_field = "updated_at" + + if sort_direction.lower() not in ["asc", "desc"]: + sort_direction = "desc" + + # For JSON storage, we load all data and sort/filter in memory + all_docs = [] + + async with self._storage_lock: + for doc_id, doc_data in self._data.items(): + # Apply status filter + if ( + status_filter is not None + and doc_data.get("status") != status_filter.value + ): + continue + + try: + # Prepare document data + data = doc_data.copy() + data.pop("content", None) + if "file_path" not in data: + data["file_path"] = "no-file-path" + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + + doc_status = DocProcessingStatus(**data) + + # Add sort key for sorting + if sort_field == "id": + doc_status._sort_key = doc_id + elif sort_field == "file_path": + # Use pinyin sorting for file_path field to support Chinese characters + file_path_value = getattr(doc_status, sort_field, "") + doc_status._sort_key = get_pinyin_sort_key(file_path_value) + else: + doc_status._sort_key = getattr(doc_status, sort_field, "") + + all_docs.append((doc_id, doc_status)) + + except KeyError as e: + logger.error( + f"[{self.workspace}] Error processing document {doc_id}: {e}" + ) + continue + + # Sort documents + reverse_sort = sort_direction.lower() == "desc" + all_docs.sort( + key=lambda x: getattr(x[1], "_sort_key", ""), reverse=reverse_sort + ) + + # Remove sort key from documents + for doc_id, doc in all_docs: + if hasattr(doc, "_sort_key"): + delattr(doc, "_sort_key") + + total_count = len(all_docs) + + # Apply pagination + start_idx = (page - 1) * page_size + end_idx = start_idx + page_size + paginated_docs = all_docs[start_idx:end_idx] + + return paginated_docs, total_count + + async def get_all_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status for all documents + + Returns: + Dictionary mapping status names to counts, including 'all' field + """ + counts = await self.get_status_counts() + + # Add 'all' field with total count + total_count = sum(counts.values()) + counts["all"] = total_count + + return counts + + async def delete(self, doc_ids: list[str]) -> None: + """Delete specific records from storage by their IDs + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + + Args: + ids (list[str]): List of document IDs to be deleted from storage + + Returns: + None + """ + async with self._storage_lock: + any_deleted = False + for doc_id in doc_ids: + result = self._data.pop(doc_id, None) + if result is not None: + any_deleted = True + + if any_deleted: + await set_all_update_flags(self.final_namespace) + + async def get_doc_by_file_path(self, file_path: str) -> Union[dict[str, Any], None]: + """Get document by file path + + Args: + file_path: The file path to search for + + Returns: + Union[dict[str, Any], None]: Document data if found, None otherwise + Returns the same format as get_by_ids method + """ + if self._storage_lock is None: + raise StorageNotInitializedError("JsonDocStatusStorage") + + async with self._storage_lock: + for doc_id, doc_data in self._data.items(): + if doc_data.get("file_path") == file_path: + # Return complete document data, consistent with get_by_ids method + return doc_data + + return None + + async def drop(self) -> dict[str, str]: + """Drop all document status data from storage and clean up resources + + This method will: + 1. Clear all document status data from memory + 2. Update flags to notify other processes + 3. Trigger index_done_callback to save the empty state + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + async with self._storage_lock: + self._data.clear() + await set_all_update_flags(self.final_namespace) + + await self.index_done_callback() + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error(f"[{self.workspace}] Error dropping {self.namespace}: {e}") + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/json_kv_impl.py b/LightRAG/lightrag/kg/json_kv_impl.py new file mode 100644 index 00000000..f9adb20f --- /dev/null +++ b/LightRAG/lightrag/kg/json_kv_impl.py @@ -0,0 +1,296 @@ +import os +from dataclasses import dataclass +from typing import Any, final + +from lightrag.base import ( + BaseKVStorage, +) +from lightrag.utils import ( + load_json, + logger, + write_json, +) +from lightrag.exceptions import StorageNotInitializedError +from .shared_storage import ( + get_namespace_data, + get_storage_lock, + get_data_init_lock, + get_update_flag, + set_all_update_flags, + clear_all_update_flags, + try_initialize_namespace, +) + + +@final +@dataclass +class JsonKVStorage(BaseKVStorage): + def __post_init__(self): + working_dir = self.global_config["working_dir"] + if self.workspace: + # Include workspace in the file path for data isolation + workspace_dir = os.path.join(working_dir, self.workspace) + self.final_namespace = f"{self.workspace}_{self.namespace}" + else: + # Default behavior when workspace is empty + workspace_dir = working_dir + self.final_namespace = self.namespace + self.workspace = "_" + + os.makedirs(workspace_dir, exist_ok=True) + self._file_name = os.path.join(workspace_dir, f"kv_store_{self.namespace}.json") + + self._data = None + self._storage_lock = None + self.storage_updated = None + + async def initialize(self): + """Initialize storage data""" + self._storage_lock = get_storage_lock() + self.storage_updated = await get_update_flag(self.final_namespace) + async with get_data_init_lock(): + # check need_init must before get_namespace_data + need_init = await try_initialize_namespace(self.final_namespace) + self._data = await get_namespace_data(self.final_namespace) + if need_init: + loaded_data = load_json(self._file_name) or {} + async with self._storage_lock: + # Migrate legacy cache structure if needed + if self.namespace.endswith("_cache"): + loaded_data = await self._migrate_legacy_cache_structure( + loaded_data + ) + + self._data.update(loaded_data) + data_count = len(loaded_data) + + logger.info( + f"[{self.workspace}] Process {os.getpid()} KV load {self.namespace} with {data_count} records" + ) + + async def index_done_callback(self) -> None: + async with self._storage_lock: + if self.storage_updated.value: + data_dict = ( + dict(self._data) if hasattr(self._data, "_getvalue") else self._data + ) + + # Calculate data count - all data is now flattened + data_count = len(data_dict) + + logger.debug( + f"[{self.workspace}] Process {os.getpid()} KV writting {data_count} records to {self.namespace}" + ) + + # Write JSON and check if sanitization was applied + needs_reload = write_json(data_dict, self._file_name) + + # If data was sanitized, reload cleaned data to update shared memory + if needs_reload: + logger.info( + f"[{self.workspace}] Reloading sanitized data into shared memory for {self.namespace}" + ) + cleaned_data = load_json(self._file_name) + if cleaned_data is not None: + self._data.clear() + self._data.update(cleaned_data) + + await clear_all_update_flags(self.final_namespace) + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + async with self._storage_lock: + result = self._data.get(id) + if result: + # Create a copy to avoid modifying the original data + result = dict(result) + # Ensure time fields are present, provide default values for old data + result.setdefault("create_time", 0) + result.setdefault("update_time", 0) + # Ensure _id field contains the clean ID + result["_id"] = id + return result + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + async with self._storage_lock: + results = [] + for id in ids: + data = self._data.get(id, None) + if data: + # Create a copy to avoid modifying the original data + result = {k: v for k, v in data.items()} + # Ensure time fields are present, provide default values for old data + result.setdefault("create_time", 0) + result.setdefault("update_time", 0) + # Ensure _id field contains the clean ID + result["_id"] = id + results.append(result) + else: + results.append(None) + return results + + async def filter_keys(self, keys: set[str]) -> set[str]: + async with self._storage_lock: + return set(keys) - set(self._data.keys()) + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """ + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + """ + if not data: + return + + import time + + current_time = int(time.time()) # Get current Unix timestamp + + logger.debug( + f"[{self.workspace}] Inserting {len(data)} records to {self.namespace}" + ) + if self._storage_lock is None: + raise StorageNotInitializedError("JsonKVStorage") + async with self._storage_lock: + # Add timestamps to data based on whether key exists + for k, v in data.items(): + # For text_chunks namespace, ensure llm_cache_list field exists + if self.namespace.endswith("text_chunks"): + if "llm_cache_list" not in v: + v["llm_cache_list"] = [] + + # Add timestamps based on whether key exists + if k in self._data: # Key exists, only update update_time + v["update_time"] = current_time + else: # New key, set both create_time and update_time + v["create_time"] = current_time + v["update_time"] = current_time + + v["_id"] = k + + self._data.update(data) + await set_all_update_flags(self.final_namespace) + + async def delete(self, ids: list[str]) -> None: + """Delete specific records from storage by their IDs + + Importance notes for in-memory storage: + 1. Changes will be persisted to disk during the next index_done_callback + 2. update flags to notify other processes that data persistence is needed + + Args: + ids (list[str]): List of document IDs to be deleted from storage + + Returns: + None + """ + async with self._storage_lock: + any_deleted = False + for doc_id in ids: + result = self._data.pop(doc_id, None) + if result is not None: + any_deleted = True + + if any_deleted: + await set_all_update_flags(self.final_namespace) + + async def is_empty(self) -> bool: + """Check if the storage is empty + + Returns: + bool: True if storage contains no data, False otherwise + """ + async with self._storage_lock: + return len(self._data) == 0 + + async def drop(self) -> dict[str, str]: + """Drop all data from storage and clean up resources + This action will persistent the data to disk immediately. + + This method will: + 1. Clear all data from memory + 2. Update flags to notify other processes + 3. Trigger index_done_callback to save the empty state + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + async with self._storage_lock: + self._data.clear() + await set_all_update_flags(self.final_namespace) + + await self.index_done_callback() + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error(f"[{self.workspace}] Error dropping {self.namespace}: {e}") + return {"status": "error", "message": str(e)} + + async def _migrate_legacy_cache_structure(self, data: dict) -> dict: + """Migrate legacy nested cache structure to flattened structure + + Args: + data: Original data dictionary that may contain legacy structure + + Returns: + Migrated data dictionary with flattened cache keys (sanitized if needed) + """ + from lightrag.utils import generate_cache_key + + # Early return if data is empty + if not data: + return data + + # Check first entry to see if it's already in new format + first_key = next(iter(data.keys())) + if ":" in first_key and len(first_key.split(":")) == 3: + # Already in flattened format, return as-is + return data + + migrated_data = {} + migration_count = 0 + + for key, value in data.items(): + # Check if this is a legacy nested cache structure + if isinstance(value, dict) and all( + isinstance(v, dict) and "return" in v for v in value.values() + ): + # This looks like a legacy cache mode with nested structure + mode = key + for cache_hash, cache_entry in value.items(): + cache_type = cache_entry.get("cache_type", "extract") + flattened_key = generate_cache_key(mode, cache_type, cache_hash) + migrated_data[flattened_key] = cache_entry + migration_count += 1 + else: + # Keep non-cache data or already flattened cache data as-is + migrated_data[key] = value + + if migration_count > 0: + logger.info( + f"[{self.workspace}] Migrated {migration_count} legacy cache entries to flattened structure" + ) + # Persist migrated data immediately and check if sanitization was applied + needs_reload = write_json(migrated_data, self._file_name) + + # If data was sanitized during write, reload cleaned data + if needs_reload: + logger.info( + f"[{self.workspace}] Reloading sanitized migration data for {self.namespace}" + ) + cleaned_data = load_json(self._file_name) + if cleaned_data is not None: + return cleaned_data # Return cleaned data to update shared memory + + return migrated_data + + async def finalize(self): + """Finalize storage resources + Persistence cache data to disk before exiting + """ + if self.namespace.endswith("_cache"): + await self.index_done_callback() diff --git a/LightRAG/lightrag/kg/memgraph_impl.py b/LightRAG/lightrag/kg/memgraph_impl.py new file mode 100644 index 00000000..e82aceec --- /dev/null +++ b/LightRAG/lightrag/kg/memgraph_impl.py @@ -0,0 +1,1140 @@ +import os +import asyncio +import random +from dataclasses import dataclass +from typing import final +import configparser + +from ..utils import logger +from ..base import BaseGraphStorage +from ..types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge +from ..kg.shared_storage import get_data_init_lock, get_graph_db_lock +import pipmaster as pm + +if not pm.is_installed("neo4j"): + pm.install("neo4j") +from neo4j import ( + AsyncGraphDatabase, + AsyncManagedTransaction, +) +from neo4j.exceptions import TransientError, ResultFailedError + +from dotenv import load_dotenv + +# use the .env that is inside the current folder +load_dotenv(dotenv_path=".env", override=False) + +MAX_GRAPH_NODES = int(os.getenv("MAX_GRAPH_NODES", 1000)) + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + + +@final +@dataclass +class MemgraphStorage(BaseGraphStorage): + def __init__(self, namespace, global_config, embedding_func, workspace=None): + # Priority: 1) MEMGRAPH_WORKSPACE env 2) user arg 3) default 'base' + memgraph_workspace = os.environ.get("MEMGRAPH_WORKSPACE") + if memgraph_workspace and memgraph_workspace.strip(): + workspace = memgraph_workspace + + if not workspace or not str(workspace).strip(): + workspace = "base" + + super().__init__( + namespace=namespace, + workspace=workspace, + global_config=global_config, + embedding_func=embedding_func, + ) + self._driver = None + + def _get_workspace_label(self) -> str: + """Return workspace label (guaranteed non-empty during initialization)""" + return self.workspace + + async def initialize(self): + async with get_data_init_lock(): + URI = os.environ.get( + "MEMGRAPH_URI", + config.get("memgraph", "uri", fallback="bolt://localhost:7687"), + ) + USERNAME = os.environ.get( + "MEMGRAPH_USERNAME", config.get("memgraph", "username", fallback="") + ) + PASSWORD = os.environ.get( + "MEMGRAPH_PASSWORD", config.get("memgraph", "password", fallback="") + ) + DATABASE = os.environ.get( + "MEMGRAPH_DATABASE", + config.get("memgraph", "database", fallback="memgraph"), + ) + + self._driver = AsyncGraphDatabase.driver( + URI, + auth=(USERNAME, PASSWORD), + ) + self._DATABASE = DATABASE + try: + async with self._driver.session(database=DATABASE) as session: + # Create index for base nodes on entity_id if it doesn't exist + try: + workspace_label = self._get_workspace_label() + await session.run( + f"""CREATE INDEX ON :{workspace_label}(entity_id)""" + ) + logger.info( + f"[{self.workspace}] Created index on :{workspace_label}(entity_id) in Memgraph." + ) + except Exception as e: + # Index may already exist, which is not an error + logger.warning( + f"[{self.workspace}] Index creation on :{workspace_label}(entity_id) may have failed or already exists: {e}" + ) + await session.run("RETURN 1") + logger.info(f"[{self.workspace}] Connected to Memgraph at {URI}") + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to connect to Memgraph at {URI}: {e}" + ) + raise + + async def finalize(self): + async with get_graph_db_lock(): + if self._driver is not None: + await self._driver.close() + self._driver = None + + async def __aexit__(self, exc_type, exc, tb): + await self.finalize() + + async def index_done_callback(self): + # Memgraph handles persistence automatically + pass + + async def has_node(self, node_id: str) -> bool: + """ + Check if a node exists in the graph. + + Args: + node_id: The ID of the node to check. + + Returns: + bool: True if the node exists, False otherwise. + + Raises: + Exception: If there is an error checking the node existence. + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + workspace_label = self._get_workspace_label() + query = f"MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) RETURN count(n) > 0 AS node_exists" + result = await session.run(query, entity_id=node_id) + single_result = await result.single() + await result.consume() # Ensure result is fully consumed + return ( + single_result["node_exists"] if single_result is not None else False + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error checking node existence for {node_id}: {str(e)}" + ) + if result is not None: + await ( + result.consume() + ) # Ensure the result is consumed even on error + raise + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + """ + Check if an edge exists between two nodes in the graph. + + Args: + source_node_id: The ID of the source node. + target_node_id: The ID of the target node. + + Returns: + bool: True if the edge exists, False otherwise. + + Raises: + Exception: If there is an error checking the edge existence. + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + workspace_label = self._get_workspace_label() + query = ( + f"MATCH (a:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(b:`{workspace_label}` {{entity_id: $target_entity_id}}) " + "RETURN COUNT(r) > 0 AS edgeExists" + ) + result = await session.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + ) # type: ignore + single_result = await result.single() + await result.consume() # Ensure result is fully consumed + return ( + single_result["edgeExists"] if single_result is not None else False + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error checking edge existence between {source_node_id} and {target_node_id}: {str(e)}" + ) + if result is not None: + await ( + result.consume() + ) # Ensure the result is consumed even on error + raise + + async def get_node(self, node_id: str) -> dict[str, str] | None: + """Get node by its label identifier, return only node properties + + Args: + node_id: The node label to look up + + Returns: + dict: Node properties if found + None: If node not found + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + workspace_label = self._get_workspace_label() + query = ( + f"MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) RETURN n" + ) + result = await session.run(query, entity_id=node_id) + try: + records = await result.fetch( + 2 + ) # Get 2 records for duplication check + + if len(records) > 1: + logger.warning( + f"[{self.workspace}] Multiple nodes found with label '{node_id}'. Using first node." + ) + if records: + node = records[0]["n"] + node_dict = dict(node) + # Remove workspace label from labels list if it exists + if "labels" in node_dict: + node_dict["labels"] = [ + label + for label in node_dict["labels"] + if label != workspace_label + ] + return node_dict + return None + finally: + await result.consume() # Ensure result is fully consumed + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting node for {node_id}: {str(e)}" + ) + raise + + async def node_degree(self, node_id: str) -> int: + """Get the degree (number of relationships) of a node with the given label. + If multiple nodes have the same label, returns the degree of the first node. + If no node is found, returns 0. + + Args: + node_id: The label of the node + + Returns: + int: The number of relationships the node has, or 0 if no node found + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + workspace_label = self._get_workspace_label() + query = f""" + MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + OPTIONAL MATCH (n)-[r]-() + RETURN COUNT(r) AS degree + """ + result = await session.run(query, entity_id=node_id) + try: + record = await result.single() + + if not record: + logger.warning( + f"[{self.workspace}] No node found with label '{node_id}'" + ) + return 0 + + degree = record["degree"] + return degree + finally: + await result.consume() # Ensure result is fully consumed + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting node degree for {node_id}: {str(e)}" + ) + raise + + async def get_all_labels(self) -> list[str]: + """ + Get all existing node labels in the database + Returns: + ["Person", "Company", ...] # Alphabetically sorted label list + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + workspace_label = self._get_workspace_label() + query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + RETURN DISTINCT n.entity_id AS label + ORDER BY label + """ + result = await session.run(query) + labels = [] + async for record in result: + labels.append(record["label"]) + await result.consume() + return labels + except Exception as e: + logger.error(f"[{self.workspace}] Error getting all labels: {str(e)}") + if result is not None: + await ( + result.consume() + ) # Ensure the result is consumed even on error + raise + + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + """Retrieves all edges (relationships) for a particular node identified by its label. + + Args: + source_node_id: Label of the node to get edges for + + Returns: + list[tuple[str, str]]: List of (source_label, target_label) tuples representing edges + None: If no edges found + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + try: + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + results = None + try: + workspace_label = self._get_workspace_label() + query = f"""MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + OPTIONAL MATCH (n)-[r]-(connected:`{workspace_label}`) + WHERE connected.entity_id IS NOT NULL + RETURN n, r, connected""" + results = await session.run(query, entity_id=source_node_id) + + edges = [] + async for record in results: + source_node = record["n"] + connected_node = record["connected"] + + # Skip if either node is None + if not source_node or not connected_node: + continue + + source_label = ( + source_node.get("entity_id") + if source_node.get("entity_id") + else None + ) + target_label = ( + connected_node.get("entity_id") + if connected_node.get("entity_id") + else None + ) + + if source_label and target_label: + edges.append((source_label, target_label)) + + await results.consume() # Ensure results are consumed + return edges + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting edges for node {source_node_id}: {str(e)}" + ) + if results is not None: + await ( + results.consume() + ) # Ensure results are consumed even on error + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Error in get_node_edges for {source_node_id}: {str(e)}" + ) + raise + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + """Get edge properties between two nodes. + + Args: + source_node_id: Label of the source node + target_node_id: Label of the target node + + Returns: + dict: Edge properties if found, default properties if not found or on error + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + workspace_label = self._get_workspace_label() + query = f""" + MATCH (start:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(end:`{workspace_label}` {{entity_id: $target_entity_id}}) + RETURN properties(r) as edge_properties + """ + result = await session.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + ) + records = await result.fetch(2) + await result.consume() + if records: + edge_result = dict(records[0]["edge_properties"]) + for key, default_value in { + "weight": 1.0, + "source_id": None, + "description": None, + "keywords": None, + }.items(): + if key not in edge_result: + edge_result[key] = default_value + logger.warning( + f"[{self.workspace}] Edge between {source_node_id} and {target_node_id} is missing property: {key}. Using default value: {default_value}" + ) + return edge_result + return None + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting edge between {source_node_id} and {target_node_id}: {str(e)}" + ) + if result is not None: + await ( + result.consume() + ) # Ensure the result is consumed even on error + raise + + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """ + Upsert a node in the Memgraph database with manual transaction-level retry logic for transient errors. + + Args: + node_id: The unique identifier for the node (used as label) + node_data: Dictionary of node properties + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + properties = node_data + entity_type = properties["entity_type"] + if "entity_id" not in properties: + raise ValueError( + "Memgraph: node properties must contain an 'entity_id' field" + ) + + # Manual transaction-level retry following official Memgraph documentation + max_retries = 100 + initial_wait_time = 0.2 + backoff_factor = 1.1 + jitter_factor = 0.1 + + for attempt in range(max_retries): + try: + logger.debug( + f"[{self.workspace}] Attempting node upsert, attempt {attempt + 1}/{max_retries}" + ) + async with self._driver.session(database=self._DATABASE) as session: + workspace_label = self._get_workspace_label() + + async def execute_upsert(tx: AsyncManagedTransaction): + query = f""" + MERGE (n:`{workspace_label}` {{entity_id: $entity_id}}) + SET n += $properties + SET n:`{entity_type}` + """ + result = await tx.run( + query, entity_id=node_id, properties=properties + ) + await result.consume() # Ensure result is fully consumed + + await session.execute_write(execute_upsert) + break # Success - exit retry loop + + except (TransientError, ResultFailedError) as e: + # Check if the root cause is a TransientError + root_cause = e + while hasattr(root_cause, "__cause__") and root_cause.__cause__: + root_cause = root_cause.__cause__ + + # Check if this is a transient error that should be retried + is_transient = ( + isinstance(root_cause, TransientError) + or isinstance(e, TransientError) + or "TransientError" in str(e) + or "Cannot resolve conflicting transactions" in str(e) + ) + + if is_transient: + if attempt < max_retries - 1: + # Calculate wait time with exponential backoff and jitter + jitter = random.uniform(0, jitter_factor) * initial_wait_time + wait_time = ( + initial_wait_time * (backoff_factor**attempt) + jitter + ) + logger.warning( + f"[{self.workspace}] Node upsert failed. Attempt #{attempt + 1} retrying in {wait_time:.3f} seconds... Error: {str(e)}" + ) + await asyncio.sleep(wait_time) + else: + logger.error( + f"[{self.workspace}] Memgraph transient error during node upsert after {max_retries} retries: {str(e)}" + ) + raise + else: + # Non-transient error, don't retry + logger.error( + f"[{self.workspace}] Non-transient error during node upsert: {str(e)}" + ) + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Unexpected error during node upsert: {str(e)}" + ) + raise + + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """ + Upsert an edge and its properties between two nodes identified by their labels with manual transaction-level retry logic for transient errors. + Ensures both source and target nodes exist and are unique before creating the edge. + Uses entity_id property to uniquely identify nodes. + + Args: + source_node_id (str): Label of the source node (used as identifier) + target_node_id (str): Label of the target node (used as identifier) + edge_data (dict): Dictionary of properties to set on the edge + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + + edge_properties = edge_data + + # Manual transaction-level retry following official Memgraph documentation + max_retries = 100 + initial_wait_time = 0.2 + backoff_factor = 1.1 + jitter_factor = 0.1 + + for attempt in range(max_retries): + try: + logger.debug( + f"[{self.workspace}] Attempting edge upsert, attempt {attempt + 1}/{max_retries}" + ) + async with self._driver.session(database=self._DATABASE) as session: + + async def execute_upsert(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (source:`{workspace_label}` {{entity_id: $source_entity_id}}) + WITH source + MATCH (target:`{workspace_label}` {{entity_id: $target_entity_id}}) + MERGE (source)-[r:DIRECTED]-(target) + SET r += $properties + RETURN r, source, target + """ + result = await tx.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + properties=edge_properties, + ) + try: + await result.fetch(2) + finally: + await result.consume() # Ensure result is consumed + + await session.execute_write(execute_upsert) + break # Success - exit retry loop + + except (TransientError, ResultFailedError) as e: + # Check if the root cause is a TransientError + root_cause = e + while hasattr(root_cause, "__cause__") and root_cause.__cause__: + root_cause = root_cause.__cause__ + + # Check if this is a transient error that should be retried + is_transient = ( + isinstance(root_cause, TransientError) + or isinstance(e, TransientError) + or "TransientError" in str(e) + or "Cannot resolve conflicting transactions" in str(e) + ) + + if is_transient: + if attempt < max_retries - 1: + # Calculate wait time with exponential backoff and jitter + jitter = random.uniform(0, jitter_factor) * initial_wait_time + wait_time = ( + initial_wait_time * (backoff_factor**attempt) + jitter + ) + logger.warning( + f"[{self.workspace}] Edge upsert failed. Attempt #{attempt + 1} retrying in {wait_time:.3f} seconds... Error: {str(e)}" + ) + await asyncio.sleep(wait_time) + else: + logger.error( + f"[{self.workspace}] Memgraph transient error during edge upsert after {max_retries} retries: {str(e)}" + ) + raise + else: + # Non-transient error, don't retry + logger.error( + f"[{self.workspace}] Non-transient error during edge upsert: {str(e)}" + ) + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Unexpected error during edge upsert: {str(e)}" + ) + raise + + async def delete_node(self, node_id: str) -> None: + """Delete a node with the specified label + + Args: + node_id: The label of the node to delete + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + + async def _do_delete(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + DETACH DELETE n + """ + result = await tx.run(query, entity_id=node_id) + logger.debug(f"[{self.workspace}] Deleted node with label {node_id}") + await result.consume() + + try: + async with self._driver.session(database=self._DATABASE) as session: + await session.execute_write(_do_delete) + except Exception as e: + logger.error(f"[{self.workspace}] Error during node deletion: {str(e)}") + raise + + async def remove_nodes(self, nodes: list[str]): + """Delete multiple nodes + + Args: + nodes: List of node labels to be deleted + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + for node in nodes: + await self.delete_node(node) + + async def remove_edges(self, edges: list[tuple[str, str]]): + """Delete multiple edges + + Args: + edges: List of edges to be deleted, each edge is a (source, target) tuple + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + for source, target in edges: + + async def _do_delete_edge(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (source:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(target:`{workspace_label}` {{entity_id: $target_entity_id}}) + DELETE r + """ + result = await tx.run( + query, source_entity_id=source, target_entity_id=target + ) + logger.debug( + f"[{self.workspace}] Deleted edge from '{source}' to '{target}'" + ) + await result.consume() # Ensure result is fully consumed + + try: + async with self._driver.session(database=self._DATABASE) as session: + await session.execute_write(_do_delete_edge) + except Exception as e: + logger.error(f"[{self.workspace}] Error during edge deletion: {str(e)}") + raise + + async def drop(self) -> dict[str, str]: + """Drop all data from the current workspace and clean up resources + + This method will delete all nodes and relationships in the Memgraph database. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + + Raises: + Exception: If there is an error executing the query + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + async with get_graph_db_lock(): + try: + async with self._driver.session(database=self._DATABASE) as session: + workspace_label = self._get_workspace_label() + query = f"MATCH (n:`{workspace_label}`) DETACH DELETE n" + result = await session.run(query) + await result.consume() + logger.info( + f"[{self.workspace}] Dropped workspace {workspace_label} from Memgraph database {self._DATABASE}" + ) + return {"status": "success", "message": "workspace data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping workspace {workspace_label} from Memgraph database {self._DATABASE}: {e}" + ) + return {"status": "error", "message": str(e)} + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + """Get the total degree (sum of relationships) of two nodes. + + Args: + src_id: Label of the source node + tgt_id: Label of the target node + + Returns: + int: Sum of the degrees of both nodes + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + src_degree = await self.node_degree(src_id) + trg_degree = await self.node_degree(tgt_id) + + # Convert None to 0 for addition + src_degree = 0 if src_degree is None else src_degree + trg_degree = 0 if trg_degree is None else trg_degree + + degrees = int(src_degree) + int(trg_degree) + return degrees + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node, * means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maximum nodes to return by BFS, Defaults to 1000 + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + """ + # Get max_nodes from global_config if not provided + if max_nodes is None: + max_nodes = self.global_config.get("max_graph_nodes", 1000) + else: + # Limit max_nodes to not exceed global_config max_graph_nodes + max_nodes = min(max_nodes, self.global_config.get("max_graph_nodes", 1000)) + + workspace_label = self._get_workspace_label() + result = KnowledgeGraph() + seen_nodes = set() + seen_edges = set() + + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + if node_label == "*": + # First check total node count to determine if graph is truncated + count_query = ( + f"MATCH (n:`{workspace_label}`) RETURN count(n) as total" + ) + count_result = None + try: + count_result = await session.run(count_query) + count_record = await count_result.single() + + if count_record and count_record["total"] > max_nodes: + result.is_truncated = True + logger.info( + f"Graph truncated: {count_record['total']} nodes found, limited to {max_nodes}" + ) + finally: + if count_result: + await count_result.consume() + + # Run main query to get nodes with highest degree + main_query = f""" + MATCH (n:`{workspace_label}`) + OPTIONAL MATCH (n)-[r]-() + WITH n, COALESCE(count(r), 0) AS degree + ORDER BY degree DESC + LIMIT $max_nodes + WITH collect({{node: n}}) AS filtered_nodes + UNWIND filtered_nodes AS node_info + WITH collect(node_info.node) AS kept_nodes, filtered_nodes + OPTIONAL MATCH (a)-[r]-(b) + WHERE a IN kept_nodes AND b IN kept_nodes + RETURN filtered_nodes AS node_info, + collect(DISTINCT r) AS relationships + """ + result_set = None + try: + result_set = await session.run( + main_query, + {"max_nodes": max_nodes}, + ) + record = await result_set.single() + finally: + if result_set: + await result_set.consume() + + else: + # Run subgraph query for specific node_label + subgraph_query = f""" + MATCH (start:`{workspace_label}`) + WHERE start.entity_id = $entity_id + + MATCH path = (start)-[*BFS 0..{max_depth}]-(end:`{workspace_label}`) + WHERE ALL(n IN nodes(path) WHERE '{workspace_label}' IN labels(n)) + WITH collect(DISTINCT end) + start AS all_nodes_unlimited + WITH + CASE + WHEN size(all_nodes_unlimited) <= $max_nodes THEN all_nodes_unlimited + ELSE all_nodes_unlimited[0..$max_nodes] + END AS limited_nodes, + size(all_nodes_unlimited) > $max_nodes AS is_truncated + + UNWIND limited_nodes AS n + MATCH (n)-[r]-(m) + WHERE m IN limited_nodes + WITH collect(DISTINCT n) AS limited_nodes, collect(DISTINCT r) AS relationships, is_truncated + + RETURN + [node IN limited_nodes | {{node: node}}] AS node_info, + relationships, + is_truncated + """ + + result_set = None + try: + result_set = await session.run( + subgraph_query, + { + "entity_id": node_label, + "max_nodes": max_nodes, + }, + ) + record = await result_set.single() + + # If no record found, return empty KnowledgeGraph + if not record: + logger.debug( + f"[{self.workspace}] No nodes found for entity_id: {node_label}" + ) + return result + + # Check if the result was truncated + if record.get("is_truncated"): + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: breadth-first search limited to {max_nodes} nodes" + ) + + finally: + if result_set: + await result_set.consume() + + if record: + for node_info in record["node_info"]: + node = node_info["node"] + node_id = node.id + if node_id not in seen_nodes: + result.nodes.append( + KnowledgeGraphNode( + id=f"{node_id}", + labels=[node.get("entity_id")], + properties=dict(node), + ) + ) + seen_nodes.add(node_id) + + for rel in record["relationships"]: + edge_id = rel.id + if edge_id not in seen_edges: + start = rel.start_node + end = rel.end_node + result.edges.append( + KnowledgeGraphEdge( + id=f"{edge_id}", + type=rel.type, + source=f"{start.id}", + target=f"{end.id}", + properties=dict(rel), + ) + ) + seen_edges.add(edge_id) + + logger.info( + f"[{self.workspace}] Subgraph query successful | Node count: {len(result.nodes)} | Edge count: {len(result.edges)}" + ) + + except Exception as e: + logger.warning( + f"[{self.workspace}] Memgraph error during subgraph query: {str(e)}" + ) + + return result + + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (n:`{workspace_label}`) + RETURN n + """ + result = await session.run(query) + nodes = [] + async for record in result: + node = record["n"] + node_dict = dict(node) + # Add node id (entity_id) to the dictionary for easier access + node_dict["id"] = node_dict.get("entity_id") + nodes.append(node_dict) + await result.consume() + return nodes + + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (a:`{workspace_label}`)-[r]-(b:`{workspace_label}`) + RETURN DISTINCT a.entity_id AS source, b.entity_id AS target, properties(r) AS properties + """ + result = await session.run(query) + edges = [] + async for record in result: + edge_properties = record["properties"] + edge_properties["source"] = record["source"] + edge_properties["target"] = record["target"] + edges.append(edge_properties) + await result.consume() + return edges + + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """Get popular labels by node degree (most connected entities) + + Args: + limit: Maximum number of labels to return + + Returns: + List of labels sorted by degree (highest first) + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + + result = None + try: + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + OPTIONAL MATCH (n)-[r]-() + WITH n.entity_id AS label, count(r) AS degree + ORDER BY degree DESC, label ASC + LIMIT {limit} + RETURN label + """ + result = await session.run(query) + labels = [] + async for record in result: + labels.append(record["label"]) + await result.consume() + + logger.debug( + f"[{self.workspace}] Retrieved {len(labels)} popular labels (limit: {limit})" + ) + return labels + except Exception as e: + logger.error(f"[{self.workspace}] Error getting popular labels: {str(e)}") + if result is not None: + await result.consume() + return [] + + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """Search labels with fuzzy matching + + Args: + query: Search query string + limit: Maximum number of results to return + + Returns: + List of matching labels sorted by relevance + """ + if self._driver is None: + raise RuntimeError( + "Memgraph driver is not initialized. Call 'await initialize()' first." + ) + + query_lower = query.lower().strip() + + if not query_lower: + return [] + + result = None + try: + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + cypher_query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + WITH n.entity_id AS label, toLower(n.entity_id) AS label_lower + WHERE label_lower CONTAINS $query_lower + WITH label, label_lower, + CASE + WHEN label_lower = $query_lower THEN 1000 + WHEN label_lower STARTS WITH $query_lower THEN 500 + ELSE 100 - size(label) + END AS score + ORDER BY score DESC, label ASC + LIMIT {limit} + RETURN label + """ + + result = await session.run(cypher_query, query_lower=query_lower) + labels = [] + async for record in result: + labels.append(record["label"]) + await result.consume() + + logger.debug( + f"[{self.workspace}] Search query '{query}' returned {len(labels)} results (limit: {limit})" + ) + return labels + except Exception as e: + logger.error(f"[{self.workspace}] Error searching labels: {str(e)}") + if result is not None: + await result.consume() + return [] diff --git a/LightRAG/lightrag/kg/milvus_impl.py b/LightRAG/lightrag/kg/milvus_impl.py new file mode 100644 index 00000000..3c621c06 --- /dev/null +++ b/LightRAG/lightrag/kg/milvus_impl.py @@ -0,0 +1,1371 @@ +import asyncio +import os +from typing import Any, final +from dataclasses import dataclass +import numpy as np +from lightrag.utils import logger, compute_mdhash_id +from ..base import BaseVectorStorage +from ..constants import DEFAULT_MAX_FILE_PATH_LENGTH +from ..kg.shared_storage import get_data_init_lock, get_storage_lock +import pipmaster as pm + +if not pm.is_installed("pymilvus"): + pm.install("pymilvus>=2.6.2") + +import configparser +from pymilvus import MilvusClient, DataType, CollectionSchema, FieldSchema # type: ignore + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + + +@final +@dataclass +class MilvusVectorDBStorage(BaseVectorStorage): + def _create_schema_for_namespace(self) -> CollectionSchema: + """Create schema based on the current instance's namespace""" + + # Get vector dimension from embedding_func + dimension = self.embedding_func.embedding_dim + + # Base fields (common to all collections) + base_fields = [ + FieldSchema( + name="id", dtype=DataType.VARCHAR, max_length=64, is_primary=True + ), + FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=dimension), + FieldSchema(name="created_at", dtype=DataType.INT64), + ] + + # Determine specific fields based on namespace + if self.namespace.endswith("entities"): + specific_fields = [ + FieldSchema( + name="entity_name", + dtype=DataType.VARCHAR, + max_length=512, + nullable=True, + ), + FieldSchema( + name="file_path", + dtype=DataType.VARCHAR, + max_length=DEFAULT_MAX_FILE_PATH_LENGTH, + nullable=True, + ), + ] + description = "LightRAG entities vector storage" + + elif self.namespace.endswith("relationships"): + specific_fields = [ + FieldSchema( + name="src_id", dtype=DataType.VARCHAR, max_length=512, nullable=True + ), + FieldSchema( + name="tgt_id", dtype=DataType.VARCHAR, max_length=512, nullable=True + ), + FieldSchema( + name="file_path", + dtype=DataType.VARCHAR, + max_length=DEFAULT_MAX_FILE_PATH_LENGTH, + nullable=True, + ), + ] + description = "LightRAG relationships vector storage" + + elif self.namespace.endswith("chunks"): + specific_fields = [ + FieldSchema( + name="full_doc_id", + dtype=DataType.VARCHAR, + max_length=64, + nullable=True, + ), + FieldSchema( + name="file_path", + dtype=DataType.VARCHAR, + max_length=DEFAULT_MAX_FILE_PATH_LENGTH, + nullable=True, + ), + ] + description = "LightRAG chunks vector storage" + + else: + # Default generic schema (backward compatibility) + specific_fields = [ + FieldSchema( + name="file_path", + dtype=DataType.VARCHAR, + max_length=DEFAULT_MAX_FILE_PATH_LENGTH, + nullable=True, + ), + ] + description = "LightRAG generic vector storage" + + # Merge all fields + all_fields = base_fields + specific_fields + + return CollectionSchema( + fields=all_fields, + description=description, + enable_dynamic_field=True, # Support dynamic fields + ) + + def _get_index_params(self): + """Get IndexParams in a version-compatible way""" + try: + # Try to use client's prepare_index_params method (most common) + if hasattr(self._client, "prepare_index_params"): + return self._client.prepare_index_params() + except Exception: + pass + + try: + # Try to import IndexParams from different possible locations + from pymilvus.client.prepare import IndexParams + + return IndexParams() + except ImportError: + pass + + try: + from pymilvus.client.types import IndexParams + + return IndexParams() + except ImportError: + pass + + try: + from pymilvus import IndexParams + + return IndexParams() + except ImportError: + pass + + # If all else fails, return None to use fallback method + return None + + def _create_vector_index_fallback(self): + """Fallback method to create vector index using direct API""" + try: + self._client.create_index( + collection_name=self.final_namespace, + field_name="vector", + index_params={ + "index_type": "HNSW", + "metric_type": "COSINE", + "params": {"M": 16, "efConstruction": 256}, + }, + ) + logger.debug( + f"[{self.workspace}] Created vector index using fallback method" + ) + except Exception as e: + logger.warning( + f"[{self.workspace}] Failed to create vector index using fallback method: {e}" + ) + + def _create_scalar_index_fallback(self, field_name: str, index_type: str): + """Fallback method to create scalar index using direct API""" + # Skip unsupported index types + if index_type == "SORTED": + logger.info( + f"[{self.workspace}] Skipping SORTED index for {field_name} (not supported in this Milvus version)" + ) + return + + try: + self._client.create_index( + collection_name=self.final_namespace, + field_name=field_name, + index_params={"index_type": index_type}, + ) + logger.debug( + f"[{self.workspace}] Created {field_name} index using fallback method" + ) + except Exception as e: + logger.info( + f"[{self.workspace}] Could not create {field_name} index using fallback method: {e}" + ) + + def _create_indexes_after_collection(self): + """Create indexes after collection is created""" + try: + # Try to get IndexParams in a version-compatible way + IndexParamsClass = self._get_index_params() + + if IndexParamsClass is not None: + # Use IndexParams approach if available + try: + # Create vector index first (required for most operations) + vector_index = IndexParamsClass + vector_index.add_index( + field_name="vector", + index_type="HNSW", + metric_type="COSINE", + params={"M": 16, "efConstruction": 256}, + ) + self._client.create_index( + collection_name=self.final_namespace, index_params=vector_index + ) + logger.debug( + f"[{self.workspace}] Created vector index using IndexParams" + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] IndexParams method failed for vector index: {e}" + ) + self._create_vector_index_fallback() + + # Create scalar indexes based on namespace + if self.namespace.endswith("entities"): + # Create indexes for entity fields + try: + entity_name_index = self._get_index_params() + entity_name_index.add_index( + field_name="entity_name", index_type="INVERTED" + ) + self._client.create_index( + collection_name=self.final_namespace, + index_params=entity_name_index, + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] IndexParams method failed for entity_name: {e}" + ) + self._create_scalar_index_fallback("entity_name", "INVERTED") + + elif self.namespace.endswith("relationships"): + # Create indexes for relationship fields + try: + src_id_index = self._get_index_params() + src_id_index.add_index( + field_name="src_id", index_type="INVERTED" + ) + self._client.create_index( + collection_name=self.final_namespace, + index_params=src_id_index, + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] IndexParams method failed for src_id: {e}" + ) + self._create_scalar_index_fallback("src_id", "INVERTED") + + try: + tgt_id_index = self._get_index_params() + tgt_id_index.add_index( + field_name="tgt_id", index_type="INVERTED" + ) + self._client.create_index( + collection_name=self.final_namespace, + index_params=tgt_id_index, + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] IndexParams method failed for tgt_id: {e}" + ) + self._create_scalar_index_fallback("tgt_id", "INVERTED") + + elif self.namespace.endswith("chunks"): + # Create indexes for chunk fields + try: + doc_id_index = self._get_index_params() + doc_id_index.add_index( + field_name="full_doc_id", index_type="INVERTED" + ) + self._client.create_index( + collection_name=self.final_namespace, + index_params=doc_id_index, + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] IndexParams method failed for full_doc_id: {e}" + ) + self._create_scalar_index_fallback("full_doc_id", "INVERTED") + + # No common indexes needed + + else: + # Fallback to direct API calls if IndexParams is not available + logger.info( + f"[{self.workspace}] IndexParams not available, using fallback methods for {self.namespace}" + ) + + # Create vector index using fallback + self._create_vector_index_fallback() + + # Create scalar indexes using fallback + if self.namespace.endswith("entities"): + self._create_scalar_index_fallback("entity_name", "INVERTED") + elif self.namespace.endswith("relationships"): + self._create_scalar_index_fallback("src_id", "INVERTED") + self._create_scalar_index_fallback("tgt_id", "INVERTED") + elif self.namespace.endswith("chunks"): + self._create_scalar_index_fallback("full_doc_id", "INVERTED") + + logger.info( + f"[{self.workspace}] Created indexes for collection: {self.namespace}" + ) + + except Exception as e: + logger.warning( + f"[{self.workspace}] Failed to create some indexes for {self.namespace}: {e}" + ) + + def _get_required_fields_for_namespace(self) -> dict: + """Get required core field definitions for current namespace""" + + # Base fields (common to all types) + base_fields = { + "id": {"type": "VarChar", "is_primary": True}, + "vector": {"type": "FloatVector"}, + "created_at": {"type": "Int64"}, + } + + # Add specific fields based on namespace + if self.namespace.endswith("entities"): + specific_fields = { + "entity_name": {"type": "VarChar"}, + "file_path": {"type": "VarChar"}, + } + elif self.namespace.endswith("relationships"): + specific_fields = { + "src_id": {"type": "VarChar"}, + "tgt_id": {"type": "VarChar"}, + "file_path": {"type": "VarChar"}, + } + elif self.namespace.endswith("chunks"): + specific_fields = { + "full_doc_id": {"type": "VarChar"}, + "file_path": {"type": "VarChar"}, + } + else: + specific_fields = { + "file_path": {"type": "VarChar"}, + } + + return {**base_fields, **specific_fields} + + def _is_field_compatible(self, existing_field: dict, expected_config: dict) -> bool: + """Check compatibility of a single field""" + field_name = existing_field.get("name", "unknown") + existing_type = existing_field.get("type") + expected_type = expected_config.get("type") + + logger.debug( + f"[{self.workspace}] Checking field '{field_name}': existing_type={existing_type} (type={type(existing_type)}), expected_type={expected_type}" + ) + + # Convert DataType enum values to string names if needed + original_existing_type = existing_type + if hasattr(existing_type, "name"): + existing_type = existing_type.name + logger.debug( + f"[{self.workspace}] Converted enum to name: {original_existing_type} -> {existing_type}" + ) + elif isinstance(existing_type, int): + # Map common Milvus internal type codes to type names for backward compatibility + type_mapping = { + 21: "VarChar", + 101: "FloatVector", + 5: "Int64", + 9: "Double", + } + mapped_type = type_mapping.get(existing_type, str(existing_type)) + logger.debug( + f"[{self.workspace}] Mapped numeric type: {existing_type} -> {mapped_type}" + ) + existing_type = mapped_type + + # Normalize type names for comparison + type_aliases = { + "VARCHAR": "VarChar", + "String": "VarChar", + "FLOAT_VECTOR": "FloatVector", + "INT64": "Int64", + "BigInt": "Int64", + "DOUBLE": "Double", + "Float": "Double", + } + + original_existing = existing_type + original_expected = expected_type + existing_type = type_aliases.get(existing_type, existing_type) + expected_type = type_aliases.get(expected_type, expected_type) + + if original_existing != existing_type or original_expected != expected_type: + logger.debug( + f"[{self.workspace}] Applied aliases: {original_existing} -> {existing_type}, {original_expected} -> {expected_type}" + ) + + # Basic type compatibility check + type_compatible = existing_type == expected_type + logger.debug( + f"[{self.workspace}] Type compatibility for '{field_name}': {existing_type} == {expected_type} -> {type_compatible}" + ) + + if not type_compatible: + logger.warning( + f"[{self.workspace}] Type mismatch for field '{field_name}': expected {expected_type}, got {existing_type}" + ) + return False + + # Primary key check - be more flexible about primary key detection + if expected_config.get("is_primary"): + # Check multiple possible field names for primary key status + is_primary = ( + existing_field.get("is_primary_key", False) + or existing_field.get("is_primary", False) + or existing_field.get("primary_key", False) + ) + logger.debug( + f"[{self.workspace}] Primary key check for '{field_name}': expected=True, actual={is_primary}" + ) + logger.debug( + f"[{self.workspace}] Raw field data for '{field_name}': {existing_field}" + ) + + # For ID field, be more lenient - if it's the ID field, assume it should be primary + if field_name == "id" and not is_primary: + logger.info( + f"[{self.workspace}] ID field '{field_name}' not marked as primary in existing collection, but treating as compatible" + ) + # Don't fail for ID field primary key mismatch + elif not is_primary: + logger.warning( + f"[{self.workspace}] Primary key mismatch for field '{field_name}': expected primary key, but field is not primary" + ) + return False + + logger.debug(f"[{self.workspace}] Field '{field_name}' is compatible") + return True + + def _check_vector_dimension(self, collection_info: dict): + """Check vector dimension compatibility""" + current_dimension = self.embedding_func.embedding_dim + + # Find vector field dimension + for field in collection_info.get("fields", []): + if field.get("name") == "vector": + field_type = field.get("type") + + # Extract type name from DataType enum or string + type_name = None + if hasattr(field_type, "name"): + type_name = field_type.name + elif isinstance(field_type, str): + type_name = field_type + else: + type_name = str(field_type) + + # Check if it's a vector type (supports multiple formats) + if type_name in ["FloatVector", "FLOAT_VECTOR"]: + existing_dimension = field.get("params", {}).get("dim") + + # Convert both to int for comparison to handle type mismatches + # (Milvus API may return string "1024" vs int 1024) + try: + existing_dim_int = ( + int(existing_dimension) + if existing_dimension is not None + else None + ) + current_dim_int = ( + int(current_dimension) + if current_dimension is not None + else None + ) + except (TypeError, ValueError) as e: + logger.error( + f"[{self.workspace}] Failed to parse dimensions: existing={existing_dimension} (type={type(existing_dimension)}), " + f"current={current_dimension} (type={type(current_dimension)}), error={e}" + ) + raise ValueError( + f"Invalid dimension values for collection '{self.final_namespace}': " + f"existing={existing_dimension}, current={current_dimension}" + ) from e + + if existing_dim_int != current_dim_int: + raise ValueError( + f"Vector dimension mismatch for collection '{self.final_namespace}': " + f"existing={existing_dim_int}, current={current_dim_int}" + ) + + logger.debug( + f"[{self.workspace}] Vector dimension check passed: {current_dim_int}" + ) + return + + # If no vector field found, this might be an old collection created with simple schema + logger.warning( + f"[{self.workspace}] Vector field not found in collection '{self.namespace}'. This might be an old collection created with simple schema." + ) + logger.warning( + f"[{self.workspace}] Consider recreating the collection for optimal performance." + ) + return + + def _check_file_path_length_restriction(self, collection_info: dict) -> bool: + """Check if collection has file_path length restrictions that need migration + + Returns: + bool: True if migration is needed, False otherwise + """ + existing_fields = { + field["name"]: field for field in collection_info.get("fields", []) + } + + # Check if file_path field exists and has length restrictions + if "file_path" in existing_fields: + file_path_field = existing_fields["file_path"] + # Get max_length from field params + max_length = file_path_field.get("params", {}).get("max_length") + + if max_length and max_length < DEFAULT_MAX_FILE_PATH_LENGTH: + logger.info( + f"[{self.workspace}] Collection {self.namespace} has file_path max_length={max_length}, " + f"needs migration to {DEFAULT_MAX_FILE_PATH_LENGTH}" + ) + return True + + return False + + def _check_schema_compatibility(self, collection_info: dict): + """Check schema field compatibility and detect migration needs""" + existing_fields = { + field["name"]: field for field in collection_info.get("fields", []) + } + + # Check if this is an old collection created with simple schema + has_vector_field = any( + field.get("name") == "vector" for field in collection_info.get("fields", []) + ) + + if not has_vector_field: + logger.warning( + f"[{self.workspace}] Collection {self.namespace} appears to be created with old simple schema (no vector field)" + ) + logger.warning( + f"[{self.workspace}] This collection will work but may have suboptimal performance" + ) + logger.warning( + f"[{self.workspace}] Consider recreating the collection for optimal performance" + ) + return + + # Check if migration is needed for file_path length restrictions + if self._check_file_path_length_restriction(collection_info): + logger.info( + f"[{self.workspace}] Starting automatic migration for collection {self.namespace}" + ) + self._migrate_collection_schema() + return + + # For collections with vector field, check basic compatibility + # Only check for critical incompatibilities, not missing optional fields + critical_fields = {"id": {"type": "VarChar", "is_primary": True}} + + incompatible_fields = [] + + for field_name, expected_config in critical_fields.items(): + if field_name in existing_fields: + existing_field = existing_fields[field_name] + if not self._is_field_compatible(existing_field, expected_config): + incompatible_fields.append( + f"{field_name}: expected {expected_config['type']}, " + f"got {existing_field.get('type')}" + ) + + if incompatible_fields: + raise ValueError( + f"Critical schema incompatibility in collection '{self.final_namespace}': {incompatible_fields}" + ) + + # Get all expected fields for informational purposes + expected_fields = self._get_required_fields_for_namespace() + missing_fields = [ + field for field in expected_fields if field not in existing_fields + ] + + if missing_fields: + logger.info( + f"[{self.workspace}] Collection {self.namespace} missing optional fields: {missing_fields}" + ) + logger.info( + "These fields would be available in a newly created collection for better performance" + ) + + logger.debug( + f"[{self.workspace}] Schema compatibility check passed for {self.namespace}" + ) + + def _migrate_collection_schema(self): + """Migrate collection schema using query_iterator - completely solves query window limitations""" + original_collection_name = self.final_namespace + temp_collection_name = f"{self.final_namespace}_temp" + iterator = None + + try: + logger.info( + f"[{self.workspace}] Starting iterator-based schema migration for {self.namespace}" + ) + + # Step 1: Create temporary collection with new schema + logger.info( + f"[{self.workspace}] Step 1: Creating temporary collection: {temp_collection_name}" + ) + # Temporarily update final_namespace for index creation + self.final_namespace = temp_collection_name + new_schema = self._create_schema_for_namespace() + self._client.create_collection( + collection_name=temp_collection_name, schema=new_schema + ) + try: + self._create_indexes_after_collection() + except Exception as index_error: + logger.warning( + f"[{self.workspace}] Failed to create indexes for new collection: {index_error}" + ) + # Continue with migration even if index creation fails + + # Load the new collection + self._client.load_collection(temp_collection_name) + + # Step 2: Copy data using query_iterator (solves query window limitation) + logger.info( + f"[{self.workspace}] Step 2: Copying data using query_iterator from: {original_collection_name}" + ) + + # Create query iterator + try: + iterator = self._client.query_iterator( + collection_name=original_collection_name, + batch_size=2000, # Adjustable batch size for optimal performance + output_fields=["*"], # Get all fields + ) + logger.debug(f"[{self.workspace}] Query iterator created successfully") + except Exception as iterator_error: + logger.error( + f"[{self.workspace}] Failed to create query iterator: {iterator_error}" + ) + raise + + # Iterate through all data + total_migrated = 0 + batch_number = 1 + + while True: + try: + batch_data = iterator.next() + if not batch_data: + # No more data available + break + + # Insert batch data to new collection + try: + self._client.insert( + collection_name=temp_collection_name, data=batch_data + ) + total_migrated += len(batch_data) + + logger.info( + f"[{self.workspace}] Iterator batch {batch_number}: " + f"processed {len(batch_data)} records, total migrated: {total_migrated}" + ) + batch_number += 1 + + except Exception as batch_error: + logger.error( + f"[{self.workspace}] Failed to insert iterator batch {batch_number}: {batch_error}" + ) + raise + + except Exception as next_error: + logger.error( + f"[{self.workspace}] Iterator next() failed at batch {batch_number}: {next_error}" + ) + raise + + if total_migrated > 0: + logger.info( + f"[{self.workspace}] Successfully migrated {total_migrated} records using iterator" + ) + else: + logger.info( + f"[{self.workspace}] No data found in original collection, migration completed" + ) + + # Step 3: Rename origin collection (keep for safety) + logger.info( + f"[{self.workspace}] Step 3: Rename origin collection to {original_collection_name}_old" + ) + try: + self._client.rename_collection( + original_collection_name, f"{original_collection_name}_old" + ) + except Exception as rename_error: + try: + logger.warning( + f"[{self.workspace}] Try to drop origin collection instead" + ) + self._client.drop_collection(original_collection_name) + except Exception as e: + logger.error( + f"[{self.workspace}] Rename operation failed: {rename_error}" + ) + raise e + + # Step 4: Rename temporary collection to original name + logger.info( + f"[{self.workspace}] Step 4: Renaming collection {temp_collection_name} -> {original_collection_name}" + ) + try: + self._client.rename_collection( + temp_collection_name, original_collection_name + ) + logger.info(f"[{self.workspace}] Rename operation completed") + except Exception as rename_error: + logger.error( + f"[{self.workspace}] Rename operation failed: {rename_error}" + ) + raise RuntimeError( + f"Failed to rename collection: {rename_error}" + ) from rename_error + + # Restore final_namespace + self.final_namespace = original_collection_name + + except Exception as e: + logger.error( + f"[{self.workspace}] Iterator-based migration failed for {self.namespace}: {e}" + ) + + # Attempt cleanup of temporary collection if it exists + try: + if self._client and self._client.has_collection(temp_collection_name): + logger.info( + f"[{self.workspace}] Cleaning up failed migration temporary collection" + ) + self._client.drop_collection(temp_collection_name) + except Exception as cleanup_error: + logger.warning( + f"[{self.workspace}] Failed to cleanup temporary collection: {cleanup_error}" + ) + + # Re-raise the original error + raise RuntimeError( + f"Iterator-based migration failed for collection {self.namespace}: {e}" + ) from e + + finally: + # Ensure iterator is properly closed + if iterator: + try: + iterator.close() + logger.debug( + f"[{self.workspace}] Query iterator closed successfully" + ) + except Exception as close_error: + logger.warning( + f"[{self.workspace}] Failed to close query iterator: {close_error}" + ) + + def _validate_collection_compatibility(self): + """Validate existing collection's dimension and schema compatibility""" + try: + collection_info = self._client.describe_collection(self.final_namespace) + + # 1. Check vector dimension + self._check_vector_dimension(collection_info) + + # 2. Check schema compatibility + self._check_schema_compatibility(collection_info) + + logger.info( + f"[{self.workspace}] VectorDB Collection '{self.namespace}' compatibility validation passed" + ) + + except Exception as e: + logger.error( + f"[{self.workspace}] Collection compatibility validation failed for {self.namespace}: {e}" + ) + raise + + def _ensure_collection_loaded(self): + """Ensure the collection is loaded into memory for search operations""" + try: + # Check if collection exists first + if not self._client.has_collection(self.final_namespace): + logger.error( + f"[{self.workspace}] Collection {self.namespace} does not exist" + ) + raise ValueError(f"Collection {self.final_namespace} does not exist") + + # Load the collection if it's not already loaded + # In Milvus, collections need to be loaded before they can be searched + self._client.load_collection(self.final_namespace) + # logger.debug(f"[{self.workspace}] Collection {self.namespace} loaded successfully") + + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to load collection {self.namespace}: {e}" + ) + raise + + def _create_collection_if_not_exist(self): + """Create collection if not exists and check existing collection compatibility""" + + try: + # Check if our specific collection exists + collection_exists = self._client.has_collection(self.final_namespace) + logger.info( + f"[{self.workspace}] VectorDB collection '{self.namespace}' exists check: {collection_exists}" + ) + + if collection_exists: + # Double-check by trying to describe the collection + try: + self._client.describe_collection(self.final_namespace) + self._validate_collection_compatibility() + # Ensure the collection is loaded after validation + self._ensure_collection_loaded() + return + except Exception as validation_error: + # CRITICAL: Collection exists but validation failed + # This indicates potential data migration failure or incompatible schema + # Stop execution to prevent data loss and require manual intervention + logger.error( + f"[{self.workspace}] CRITICAL ERROR: Collection '{self.namespace}' exists but validation failed!" + ) + logger.error( + f"[{self.workspace}] This indicates potential data migration failure or schema incompatibility." + ) + logger.error( + f"[{self.workspace}] Validation error: {validation_error}" + ) + logger.error(f"[{self.workspace}] MANUAL INTERVENTION REQUIRED:") + logger.error( + f"[{self.workspace}] 1. Check the existing collection schema and data integrity" + ) + logger.error( + f"[{self.workspace}] 2. Backup existing data if needed" + ) + logger.error( + f"[{self.workspace}] 3. Manually resolve schema compatibility issues" + ) + logger.error( + f"[{self.workspace}] 4. Consider dropping and recreating the collection if data is not critical" + ) + logger.error( + f"[{self.workspace}] Program execution stopped to prevent potential data loss." + ) + + # Raise a specific exception to stop execution + raise RuntimeError( + f"Collection validation failed for '{self.final_namespace}'. " + f"Data migration failure detected. Manual intervention required to prevent data loss. " + f"Original error: {validation_error}" + ) + + # Collection doesn't exist, create new collection + logger.info(f"[{self.workspace}] Creating new collection: {self.namespace}") + schema = self._create_schema_for_namespace() + + # Create collection with schema only first + self._client.create_collection( + collection_name=self.final_namespace, schema=schema + ) + + # Then create indexes + self._create_indexes_after_collection() + + # Load the newly created collection + self._ensure_collection_loaded() + + logger.info( + f"[{self.workspace}] Successfully created Milvus collection: {self.namespace}" + ) + + except RuntimeError: + # Re-raise RuntimeError (validation failures) without modification + # These are critical errors that should stop execution + raise + + except Exception as e: + logger.error( + f"[{self.workspace}] Error in _create_collection_if_not_exist for {self.namespace}: {e}" + ) + + # If there's any error (other than validation failure), try to force create the collection + logger.info( + f"[{self.workspace}] Attempting to force create collection {self.namespace}..." + ) + try: + # Try to drop the collection first if it exists in a bad state + try: + if self._client.has_collection(self.final_namespace): + logger.info( + f"[{self.workspace}] Dropping potentially corrupted collection {self.namespace}" + ) + self._client.drop_collection(self.final_namespace) + except Exception as drop_error: + logger.warning( + f"[{self.workspace}] Could not drop collection {self.namespace}: {drop_error}" + ) + + # Create fresh collection + schema = self._create_schema_for_namespace() + self._client.create_collection( + collection_name=self.final_namespace, schema=schema + ) + self._create_indexes_after_collection() + + # Load the newly created collection + self._ensure_collection_loaded() + + logger.info( + f"[{self.workspace}] Successfully force-created collection {self.namespace}" + ) + + except Exception as create_error: + logger.error( + f"[{self.workspace}] Failed to force-create collection {self.namespace}: {create_error}" + ) + raise + + def __post_init__(self): + # Check for MILVUS_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all Milvus storage instances + milvus_workspace = os.environ.get("MILVUS_WORKSPACE") + if milvus_workspace and milvus_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = milvus_workspace.strip() + logger.info( + f"Using MILVUS_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + logger.debug(f"Final namespace (no workspace): '{self.final_namespace}'") + self.workspace = "_" + + kwargs = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = kwargs.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + # Ensure created_at is in meta_fields + if "created_at" not in self.meta_fields: + self.meta_fields.add("created_at") + + # Initialize client as None - will be created in initialize() method + self._client = None + self._max_batch_size = self.global_config["embedding_batch_num"] + self._initialized = False + + async def initialize(self): + """Initialize Milvus collection""" + async with get_data_init_lock(): + if self._initialized: + return + + try: + # Create MilvusClient if not already created + if self._client is None: + self._client = MilvusClient( + uri=os.environ.get( + "MILVUS_URI", + config.get( + "milvus", + "uri", + fallback=os.path.join( + self.global_config["working_dir"], "milvus_lite.db" + ), + ), + ), + user=os.environ.get( + "MILVUS_USER", config.get("milvus", "user", fallback=None) + ), + password=os.environ.get( + "MILVUS_PASSWORD", + config.get("milvus", "password", fallback=None), + ), + token=os.environ.get( + "MILVUS_TOKEN", config.get("milvus", "token", fallback=None) + ), + db_name=os.environ.get( + "MILVUS_DB_NAME", + config.get("milvus", "db_name", fallback=None), + ), + ) + logger.debug( + f"[{self.workspace}] MilvusClient created successfully" + ) + + # Create collection and check compatibility + self._create_collection_if_not_exist() + self._initialized = True + logger.info( + f"[{self.workspace}] Milvus collection '{self.namespace}' initialized successfully" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to initialize Milvus collection '{self.namespace}': {e}" + ) + raise + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + # logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + # Ensure collection is loaded before upserting + self._ensure_collection_loaded() + + import time + + current_time = int(time.time()) + + list_data: list[dict[str, Any]] = [ + { + "id": k, + "created_at": current_time, + **{k1: v1 for k1, v1 in v.items() if k1 in self.meta_fields}, + } + for k, v in data.items() + ] + contents = [v["content"] for v in data.values()] + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + + embeddings = np.concatenate(embeddings_list) + for i, d in enumerate(list_data): + d["vector"] = embeddings[i] + results = self._client.upsert( + collection_name=self.final_namespace, data=list_data + ) + return results + + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + # Ensure collection is loaded before querying + self._ensure_collection_loaded() + + # Use provided embedding or compute it + if query_embedding is not None: + embedding = [query_embedding] # Milvus expects a list of embeddings + else: + embedding = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + + # Include all meta_fields (created_at is now always included) + output_fields = list(self.meta_fields) + + results = self._client.search( + collection_name=self.final_namespace, + data=embedding, + limit=top_k, + output_fields=output_fields, + search_params={ + "metric_type": "COSINE", + "params": {"radius": self.cosine_better_than_threshold}, + }, + ) + return [ + { + **dp["entity"], + "id": dp["id"], + "distance": dp["distance"], + "created_at": dp.get("created_at"), + } + for dp in results[0] + ] + + async def index_done_callback(self) -> None: + # Milvus handles persistence automatically + pass + + async def delete_entity(self, entity_name: str) -> None: + """Delete an entity from the vector database + + Args: + entity_name: The name of the entity to delete + """ + try: + # Compute entity ID from name + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + logger.debug( + f"[{self.workspace}] Attempting to delete entity {entity_name} with ID {entity_id}" + ) + + # Delete the entity from Milvus collection + result = self._client.delete( + collection_name=self.final_namespace, pks=[entity_id] + ) + + if result and result.get("delete_count", 0) > 0: + logger.debug( + f"[{self.workspace}] Successfully deleted entity {entity_name}" + ) + else: + logger.debug( + f"[{self.workspace}] Entity {entity_name} not found in storage" + ) + + except Exception as e: + logger.error(f"[{self.workspace}] Error deleting entity {entity_name}: {e}") + + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete all relations associated with an entity + + Args: + entity_name: The name of the entity whose relations should be deleted + """ + try: + # Ensure collection is loaded before querying + self._ensure_collection_loaded() + + # Search for relations where entity is either source or target + expr = f'src_id == "{entity_name}" or tgt_id == "{entity_name}"' + + # Find all relations involving this entity + results = self._client.query( + collection_name=self.final_namespace, filter=expr, output_fields=["id"] + ) + + if not results or len(results) == 0: + logger.debug( + f"[{self.workspace}] No relations found for entity {entity_name}" + ) + return + + # Extract IDs of relations to delete + relation_ids = [item["id"] for item in results] + logger.debug( + f"[{self.workspace}] Found {len(relation_ids)} relations for entity {entity_name}" + ) + + # Delete the relations + if relation_ids: + delete_result = self._client.delete( + collection_name=self.final_namespace, pks=relation_ids + ) + + logger.debug( + f"[{self.workspace}] Deleted {delete_result.get('delete_count', 0)} relations for {entity_name}" + ) + + except Exception as e: + logger.error( + f"[{self.workspace}] Error deleting relations for {entity_name}: {e}" + ) + + async def delete(self, ids: list[str]) -> None: + """Delete vectors with specified IDs + + Args: + ids: List of vector IDs to be deleted + """ + try: + # Ensure collection is loaded before deleting + self._ensure_collection_loaded() + + # Delete vectors by IDs + result = self._client.delete(collection_name=self.final_namespace, pks=ids) + + if result and result.get("delete_count", 0) > 0: + logger.debug( + f"[{self.workspace}] Successfully deleted {result.get('delete_count', 0)} vectors from {self.namespace}" + ) + else: + logger.debug( + f"[{self.workspace}] No vectors were deleted from {self.namespace}" + ) + + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting vectors from {self.namespace}: {e}" + ) + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + try: + # Ensure collection is loaded before querying + self._ensure_collection_loaded() + + # Include all meta_fields (created_at is now always included) plus id + output_fields = list(self.meta_fields) + ["id"] + + # Query Milvus for a specific ID + result = self._client.query( + collection_name=self.final_namespace, + filter=f'id == "{id}"', + output_fields=output_fields, + ) + + if not result or len(result) == 0: + return None + + return result[0] + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for ID {id}: {e}" + ) + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + try: + # Ensure collection is loaded before querying + self._ensure_collection_loaded() + + # Include all meta_fields (created_at is now always included) plus id + output_fields = list(self.meta_fields) + ["id"] + + # Prepare the ID filter expression + id_list = '", "'.join(ids) + filter_expr = f'id in ["{id_list}"]' + + # Query Milvus with the filter + result = self._client.query( + collection_name=self.final_namespace, + filter=filter_expr, + output_fields=output_fields, + ) + + if not result: + return [] + + result_map: dict[str, dict[str, Any]] = {} + for row in result: + if not row: + continue + row_id = row.get("id") + if row_id is not None: + result_map[str(row_id)] = row + + ordered_results: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered_results.append(result_map.get(str(requested_id))) + + return ordered_results + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for IDs {ids}: {e}" + ) + return [] + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + try: + # Ensure collection is loaded before querying + self._ensure_collection_loaded() + + # Prepare the ID filter expression + id_list = '", "'.join(ids) + filter_expr = f'id in ["{id_list}"]' + + # Query Milvus with the filter, requesting only vector field + result = self._client.query( + collection_name=self.final_namespace, + filter=filter_expr, + output_fields=["vector"], + ) + + vectors_dict = {} + for item in result: + if item and "vector" in item and "id" in item: + # Convert numpy array to list if needed + vector_data = item["vector"] + if isinstance(vector_data, np.ndarray): + vector_data = vector_data.tolist() + vectors_dict[item["id"]] = vector_data + + return vectors_dict + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vectors by IDs from {self.namespace}: {e}" + ) + return {} + + async def drop(self) -> dict[str, str]: + """Drop all vector data from storage and clean up resources + + This method will delete all data from the Milvus collection. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + async with get_storage_lock(): + try: + # Drop the collection and recreate it + if self._client.has_collection(self.final_namespace): + self._client.drop_collection(self.final_namespace) + + # Recreate the collection + self._create_collection_if_not_exist() + + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop Milvus collection {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping Milvus collection {self.namespace}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/mongo_impl.py b/LightRAG/lightrag/kg/mongo_impl.py new file mode 100644 index 00000000..30452c74 --- /dev/null +++ b/LightRAG/lightrag/kg/mongo_impl.py @@ -0,0 +1,2487 @@ +import os +import re +import time +from dataclasses import dataclass, field +import numpy as np +import configparser +import asyncio + +from typing import Any, Union, final + +from ..base import ( + BaseGraphStorage, + BaseKVStorage, + BaseVectorStorage, + DocProcessingStatus, + DocStatus, + DocStatusStorage, +) +from ..utils import logger, compute_mdhash_id +from ..types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge +from ..constants import GRAPH_FIELD_SEP +from ..kg.shared_storage import get_data_init_lock, get_storage_lock, get_graph_db_lock + +import pipmaster as pm + +if not pm.is_installed("pymongo"): + pm.install("pymongo") + +from pymongo import AsyncMongoClient # type: ignore +from pymongo import UpdateOne # type: ignore +from pymongo.asynchronous.database import AsyncDatabase # type: ignore +from pymongo.asynchronous.collection import AsyncCollection # type: ignore +from pymongo.operations import SearchIndexModel # type: ignore +from pymongo.errors import PyMongoError # type: ignore + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + +GRAPH_BFS_MODE = os.getenv("MONGO_GRAPH_BFS_MODE", "bidirectional") + + +class ClientManager: + _instances = {"db": None, "ref_count": 0} + _lock = asyncio.Lock() + + @classmethod + async def get_client(cls) -> AsyncMongoClient: + async with cls._lock: + if cls._instances["db"] is None: + uri = os.environ.get( + "MONGO_URI", + config.get( + "mongodb", + "uri", + fallback="mongodb://root:root@localhost:27017/", + ), + ) + database_name = os.environ.get( + "MONGO_DATABASE", + config.get("mongodb", "database", fallback="LightRAG"), + ) + client = AsyncMongoClient(uri) + db = client.get_database(database_name) + cls._instances["db"] = db + cls._instances["ref_count"] = 0 + cls._instances["ref_count"] += 1 + return cls._instances["db"] + + @classmethod + async def release_client(cls, db: AsyncDatabase): + async with cls._lock: + if db is not None: + if db is cls._instances["db"]: + cls._instances["ref_count"] -= 1 + if cls._instances["ref_count"] == 0: + cls._instances["db"] = None + + +@final +@dataclass +class MongoKVStorage(BaseKVStorage): + db: AsyncDatabase = field(default=None) + _data: AsyncCollection = field(default=None) + + def __init__(self, namespace, global_config, embedding_func, workspace=None): + super().__init__( + namespace=namespace, + workspace=workspace or "", + global_config=global_config, + embedding_func=embedding_func, + ) + self.__post_init__() + + def __post_init__(self): + # Check for MONGODB_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all MongoDB storage instances + mongodb_workspace = os.environ.get("MONGODB_WORKSPACE") + if mongodb_workspace and mongodb_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = mongodb_workspace.strip() + logger.info( + f"Using MONGODB_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + self.workspace = effective_workspace + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug( + f"[{self.workspace}] Final namespace (no workspace): '{self.namespace}'" + ) + + self._collection_name = self.final_namespace + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + self._data = await get_or_create_collection(self.db, self._collection_name) + logger.debug( + f"[{self.workspace}] Use MongoDB as KV {self._collection_name}" + ) + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + self._data = None + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + # Unified handling for flattened keys + doc = await self._data.find_one({"_id": id}) + if doc: + # Ensure time fields are present, provide default values for old data + doc.setdefault("create_time", 0) + doc.setdefault("update_time", 0) + return doc + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + cursor = self._data.find({"_id": {"$in": ids}}) + docs = await cursor.to_list(length=None) + + doc_map: dict[str, dict[str, Any]] = {} + for doc in docs: + if not doc: + continue + doc.setdefault("create_time", 0) + doc.setdefault("update_time", 0) + doc_map[str(doc.get("_id"))] = doc + + ordered_results: list[dict[str, Any] | None] = [] + for id_value in ids: + ordered_results.append(doc_map.get(str(id_value))) + return ordered_results + + async def filter_keys(self, keys: set[str]) -> set[str]: + cursor = self._data.find({"_id": {"$in": list(keys)}}, {"_id": 1}) + existing_ids = {str(x["_id"]) async for x in cursor} + return keys - existing_ids + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + # Unified handling for all namespaces with flattened keys + # Use bulk_write for better performance + + operations = [] + current_time = int(time.time()) # Get current Unix timestamp + + for k, v in data.items(): + # For text_chunks namespace, ensure llm_cache_list field exists + if self.namespace.endswith("text_chunks"): + if "llm_cache_list" not in v: + v["llm_cache_list"] = [] + + # Create a copy of v for $set operation, excluding create_time to avoid conflicts + v_for_set = v.copy() + v_for_set["_id"] = k # Use flattened key as _id + v_for_set["update_time"] = current_time # Always update update_time + + # Remove create_time from $set to avoid conflict with $setOnInsert + v_for_set.pop("create_time", None) + + operations.append( + UpdateOne( + {"_id": k}, + { + "$set": v_for_set, # Update all fields except create_time + "$setOnInsert": { + "create_time": current_time + }, # Set create_time only on insert + }, + upsert=True, + ) + ) + + if operations: + await self._data.bulk_write(operations) + + async def index_done_callback(self) -> None: + # Mongo handles persistence automatically + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + try: + # Use count_documents with limit 1 for efficiency + count = await self._data.count_documents({}, limit=1) + return count == 0 + except PyMongoError as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + async def delete(self, ids: list[str]) -> None: + """Delete documents with specified IDs + + Args: + ids: List of document IDs to be deleted + """ + if not ids: + return + + # Convert to list if it's a set (MongoDB BSON cannot encode sets) + if isinstance(ids, set): + ids = list(ids) + + try: + result = await self._data.delete_many({"_id": {"$in": ids}}) + logger.info( + f"[{self.workspace}] Deleted {result.deleted_count} documents from {self.namespace}" + ) + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error deleting documents from {self.namespace}: {e}" + ) + + async def drop(self) -> dict[str, str]: + """Drop the storage by removing all documents in the collection. + + Returns: + dict[str, str]: Status of the operation with keys 'status' and 'message' + """ + async with get_storage_lock(): + try: + result = await self._data.delete_many({}) + deleted_count = result.deleted_count + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} documents from doc status {self._collection_name}" + ) + return { + "status": "success", + "message": f"{deleted_count} documents dropped", + } + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error dropping doc status {self._collection_name}: {e}" + ) + return {"status": "error", "message": str(e)} + + +@final +@dataclass +class MongoDocStatusStorage(DocStatusStorage): + db: AsyncDatabase = field(default=None) + _data: AsyncCollection = field(default=None) + + def _prepare_doc_status_data(self, doc: dict[str, Any]) -> dict[str, Any]: + """Normalize and migrate a raw Mongo document to DocProcessingStatus-compatible dict.""" + # Make a copy of the data to avoid modifying the original + data = doc.copy() + # Remove deprecated content field if it exists + data.pop("content", None) + # Remove MongoDB _id field if it exists + data.pop("_id", None) + # If file_path is not in data, use document id as file path + if "file_path" not in data: + data["file_path"] = "no-file-path" + # Ensure new fields exist with default values + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + # Backward compatibility: migrate legacy 'error' field to 'error_msg' + if "error" in data: + if "error_msg" not in data or data["error_msg"] in (None, ""): + data["error_msg"] = data.pop("error") + else: + data.pop("error", None) + return data + + def __init__(self, namespace, global_config, embedding_func, workspace=None): + super().__init__( + namespace=namespace, + workspace=workspace or "", + global_config=global_config, + embedding_func=embedding_func, + ) + self.__post_init__() + + def __post_init__(self): + # Check for MONGODB_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all MongoDB storage instances + mongodb_workspace = os.environ.get("MONGODB_WORKSPACE") + if mongodb_workspace and mongodb_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = mongodb_workspace.strip() + logger.info( + f"Using MONGODB_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + self.workspace = effective_workspace + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug(f"Final namespace (no workspace): '{self.final_namespace}'") + + self._collection_name = self.final_namespace + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + self._data = await get_or_create_collection(self.db, self._collection_name) + + # Create and migrate all indexes including Chinese collation for file_path + await self.create_and_migrate_indexes_if_not_exists() + + logger.debug( + f"[{self.workspace}] Use MongoDB as DocStatus {self._collection_name}" + ) + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + self._data = None + + async def get_by_id(self, id: str) -> Union[dict[str, Any], None]: + return await self._data.find_one({"_id": id}) + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + cursor = self._data.find({"_id": {"$in": ids}}) + docs = await cursor.to_list(length=None) + + doc_map: dict[str, dict[str, Any]] = {} + for doc in docs: + if not doc: + continue + doc_map[str(doc.get("_id"))] = doc + + ordered_results: list[dict[str, Any] | None] = [] + for id_value in ids: + ordered_results.append(doc_map.get(str(id_value))) + return ordered_results + + async def filter_keys(self, data: set[str]) -> set[str]: + cursor = self._data.find({"_id": {"$in": list(data)}}, {"_id": 1}) + existing_ids = {str(x["_id"]) async for x in cursor} + return data - existing_ids + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + update_tasks: list[Any] = [] + for k, v in data.items(): + # Ensure chunks_list field exists and is an array + if "chunks_list" not in v: + v["chunks_list"] = [] + data[k]["_id"] = k + update_tasks.append( + self._data.update_one({"_id": k}, {"$set": v}, upsert=True) + ) + await asyncio.gather(*update_tasks) + + async def get_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status""" + pipeline = [{"$group": {"_id": "$status", "count": {"$sum": 1}}}] + cursor = await self._data.aggregate(pipeline, allowDiskUse=True) + result = await cursor.to_list() + counts = {} + for doc in result: + counts[doc["_id"]] = doc["count"] + return counts + + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific status""" + cursor = self._data.find({"status": status.value}) + result = await cursor.to_list() + processed_result = {} + for doc in result: + try: + data = self._prepare_doc_status_data(doc) + processed_result[doc["_id"]] = DocProcessingStatus(**data) + except KeyError as e: + logger.error( + f"[{self.workspace}] Missing required field for document {doc['_id']}: {e}" + ) + continue + return processed_result + + async def get_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific track_id""" + cursor = self._data.find({"track_id": track_id}) + result = await cursor.to_list() + processed_result = {} + for doc in result: + try: + data = self._prepare_doc_status_data(doc) + processed_result[doc["_id"]] = DocProcessingStatus(**data) + except KeyError as e: + logger.error( + f"[{self.workspace}] Missing required field for document {doc['_id']}: {e}" + ) + continue + return processed_result + + async def index_done_callback(self) -> None: + # Mongo handles persistence automatically + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + try: + # Use count_documents with limit 1 for efficiency + count = await self._data.count_documents({}, limit=1) + return count == 0 + except PyMongoError as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + async def drop(self) -> dict[str, str]: + """Drop the storage by removing all documents in the collection. + + Returns: + dict[str, str]: Status of the operation with keys 'status' and 'message' + """ + async with get_storage_lock(): + try: + result = await self._data.delete_many({}) + deleted_count = result.deleted_count + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} documents from doc status {self._collection_name}" + ) + return { + "status": "success", + "message": f"{deleted_count} documents dropped", + } + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error dropping doc status {self._collection_name}: {e}" + ) + return {"status": "error", "message": str(e)} + + async def delete(self, ids: list[str]) -> None: + await self._data.delete_many({"_id": {"$in": ids}}) + + async def create_and_migrate_indexes_if_not_exists(self): + """Create indexes to optimize pagination queries and migrate file_path indexes for Chinese collation""" + try: + # Get indexes for the current collection only + indexes_cursor = await self._data.list_indexes() + existing_indexes = await indexes_cursor.to_list(length=None) + existing_index_names = {idx.get("name", "") for idx in existing_indexes} + + # Define collation configuration for Chinese pinyin sorting + collation_config = {"locale": "zh", "numericOrdering": True} + + # Use workspace-specific index names to avoid cross-workspace conflicts + workspace_prefix = f"{self.workspace}_" if self.workspace != "_" else "" + + # 1. Define all indexes needed with workspace-specific names + all_indexes = [ + # Original pagination indexes + { + "name": f"{workspace_prefix}status_updated_at", + "keys": [("status", 1), ("updated_at", -1)], + }, + { + "name": f"{workspace_prefix}status_created_at", + "keys": [("status", 1), ("created_at", -1)], + }, + {"name": f"{workspace_prefix}updated_at", "keys": [("updated_at", -1)]}, + {"name": f"{workspace_prefix}created_at", "keys": [("created_at", -1)]}, + {"name": f"{workspace_prefix}id", "keys": [("_id", 1)]}, + {"name": f"{workspace_prefix}track_id", "keys": [("track_id", 1)]}, + # New file_path indexes with Chinese collation and workspace-specific names + { + "name": f"{workspace_prefix}file_path_zh_collation", + "keys": [("file_path", 1)], + "collation": collation_config, + }, + { + "name": f"{workspace_prefix}status_file_path_zh_collation", + "keys": [("status", 1), ("file_path", 1)], + "collation": collation_config, + }, + ] + + # 2. Handle legacy index cleanup: only drop old indexes that exist in THIS collection + legacy_index_names = [ + "file_path_zh_collation", + "status_file_path_zh_collation", + "status_updated_at", + "status_created_at", + "updated_at", + "created_at", + "id", + "track_id", + ] + + for legacy_name in legacy_index_names: + if ( + legacy_name in existing_index_names + and legacy_name + != f"{workspace_prefix}{legacy_name.replace(workspace_prefix, '')}" + ): + try: + await self._data.drop_index(legacy_name) + logger.debug( + f"[{self.workspace}] Migrated: dropped legacy index '{legacy_name}' from collection {self._collection_name}" + ) + existing_index_names.discard(legacy_name) + except PyMongoError as drop_error: + logger.warning( + f"[{self.workspace}] Failed to drop legacy index '{legacy_name}' from collection {self._collection_name}: {drop_error}" + ) + + # 3. Create all needed indexes with workspace-specific names + for index_info in all_indexes: + index_name = index_info["name"] + if index_name not in existing_index_names: + create_kwargs = {"name": index_name} + if "collation" in index_info: + create_kwargs["collation"] = index_info["collation"] + + try: + await self._data.create_index( + index_info["keys"], **create_kwargs + ) + logger.debug( + f"[{self.workspace}] Created index '{index_name}' for collection {self._collection_name}" + ) + except PyMongoError as create_error: + # If creation still fails, log the error but continue with other indexes + logger.error( + f"[{self.workspace}] Failed to create index '{index_name}' for collection {self._collection_name}: {create_error}" + ) + else: + logger.debug( + f"[{self.workspace}] Index '{index_name}' already exists for collection {self._collection_name}" + ) + + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error creating/migrating indexes for {self._collection_name}: {e}" + ) + + async def get_docs_paginated( + self, + status_filter: DocStatus | None = None, + page: int = 1, + page_size: int = 50, + sort_field: str = "updated_at", + sort_direction: str = "desc", + ) -> tuple[list[tuple[str, DocProcessingStatus]], int]: + """Get documents with pagination support + + Args: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', '_id') + sort_direction: Sort direction ('asc' or 'desc') + + Returns: + Tuple of (list of (doc_id, DocProcessingStatus) tuples, total_count) + """ + # Validate parameters + if page < 1: + page = 1 + if page_size < 10: + page_size = 10 + elif page_size > 200: + page_size = 200 + + if sort_field not in ["created_at", "updated_at", "_id", "file_path"]: + sort_field = "updated_at" + + if sort_direction.lower() not in ["asc", "desc"]: + sort_direction = "desc" + + # Build query filter + query_filter = {} + if status_filter is not None: + query_filter["status"] = status_filter.value + + # Get total count + total_count = await self._data.count_documents(query_filter) + + # Calculate skip value + skip = (page - 1) * page_size + + # Build sort criteria + sort_direction_value = 1 if sort_direction.lower() == "asc" else -1 + sort_criteria = [(sort_field, sort_direction_value)] + + # Query for paginated data with Chinese collation for file_path sorting + if sort_field == "file_path": + # Use Chinese collation for pinyin sorting + cursor = ( + self._data.find(query_filter) + .sort(sort_criteria) + .collation({"locale": "zh", "numericOrdering": True}) + .skip(skip) + .limit(page_size) + ) + else: + # Use default sorting for other fields + cursor = ( + self._data.find(query_filter) + .sort(sort_criteria) + .skip(skip) + .limit(page_size) + ) + result = await cursor.to_list(length=page_size) + + # Convert to (doc_id, DocProcessingStatus) tuples + documents = [] + for doc in result: + try: + doc_id = doc["_id"] + + data = self._prepare_doc_status_data(doc) + + doc_status = DocProcessingStatus(**data) + documents.append((doc_id, doc_status)) + except KeyError as e: + logger.error( + f"[{self.workspace}] Missing required field for document {doc['_id']}: {e}" + ) + continue + + return documents, total_count + + async def get_all_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status for all documents + + Returns: + Dictionary mapping status names to counts, including 'all' field + """ + pipeline = [{"$group": {"_id": "$status", "count": {"$sum": 1}}}] + cursor = await self._data.aggregate(pipeline, allowDiskUse=True) + result = await cursor.to_list() + + counts = {} + total_count = 0 + for doc in result: + counts[doc["_id"]] = doc["count"] + total_count += doc["count"] + + # Add 'all' field with total count + counts["all"] = total_count + + return counts + + async def get_doc_by_file_path(self, file_path: str) -> Union[dict[str, Any], None]: + """Get document by file path + + Args: + file_path: The file path to search for + + Returns: + Union[dict[str, Any], None]: Document data if found, None otherwise + Returns the same format as get_by_id method + """ + return await self._data.find_one({"file_path": file_path}) + + +@final +@dataclass +class MongoGraphStorage(BaseGraphStorage): + """ + A concrete implementation using MongoDB's $graphLookup to demonstrate multi-hop queries. + """ + + db: AsyncDatabase = field(default=None) + # node collection storing node_id, node_properties + collection: AsyncCollection = field(default=None) + # edge collection storing source_node_id, target_node_id, and edge_properties + edgeCollection: AsyncCollection = field(default=None) + + def __init__(self, namespace, global_config, embedding_func, workspace=None): + super().__init__( + namespace=namespace, + workspace=workspace or "", + global_config=global_config, + embedding_func=embedding_func, + ) + # Check for MONGODB_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all MongoDB storage instances + mongodb_workspace = os.environ.get("MONGODB_WORKSPACE") + if mongodb_workspace and mongodb_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = mongodb_workspace.strip() + logger.info( + f"Using MONGODB_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + self.workspace = effective_workspace + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug(f"Final namespace (no workspace): '{self.final_namespace}'") + + self._collection_name = self.final_namespace + self._edge_collection_name = f"{self._collection_name}_edges" + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + self.collection = await get_or_create_collection( + self.db, self._collection_name + ) + self.edge_collection = await get_or_create_collection( + self.db, self._edge_collection_name + ) + + # Create Atlas Search index for better search performance if possible + await self.create_search_index_if_not_exists() + + logger.debug( + f"[{self.workspace}] Use MongoDB as KG {self._collection_name}" + ) + + async def finalize(self): + async with get_graph_db_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + self.collection = None + self.edge_collection = None + + # Sample entity document + # "source_ids" is Array representation of "source_id" split by GRAPH_FIELD_SEP + + # { + # "_id" : "CompanyA", + # "entity_id" : "CompanyA", + # "entity_type" : "Organization", + # "description" : "A major technology company", + # "source_id" : "chunk-eeec0036b909839e8ec4fa150c939eec", + # "source_ids": ["chunk-eeec0036b909839e8ec4fa150c939eec"], + # "file_path" : "custom_kg", + # "created_at" : 1749904575 + # } + + # Sample relation document + # { + # "_id" : ObjectId("6856ac6e7c6bad9b5470b678"), // MongoDB build-in ObjectId + # "description" : "CompanyA develops ProductX", + # "source_node_id" : "CompanyA", + # "target_node_id" : "ProductX", + # "relationship": "Develops", // To distinguish multiple same-target relations + # "weight" : Double("1"), + # "keywords" : "develop, produce", + # "source_id" : "chunk-eeec0036b909839e8ec4fa150c939eec", + # "source_ids": ["chunk-eeec0036b909839e8ec4fa150c939eec"], + # "file_path" : "custom_kg", + # "created_at" : 1749904575 + # } + + # + # ------------------------------------------------------------------------- + # BASIC QUERIES + # ------------------------------------------------------------------------- + # + + async def has_node(self, node_id: str) -> bool: + """ + Check if node_id is present in the collection by looking up its doc. + No real need for $graphLookup here, but let's keep it direct. + """ + doc = await self.collection.find_one({"_id": node_id}, {"_id": 1}) + return doc is not None + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + """ + Check if there's a direct single-hop edge between source_node_id and target_node_id. + """ + doc = await self.edge_collection.find_one( + { + "$or": [ + { + "source_node_id": source_node_id, + "target_node_id": target_node_id, + }, + { + "source_node_id": target_node_id, + "target_node_id": source_node_id, + }, + ] + }, + {"_id": 1}, + ) + return doc is not None + + # + # ------------------------------------------------------------------------- + # DEGREES + # ------------------------------------------------------------------------- + # + + async def node_degree(self, node_id: str) -> int: + """ + Returns the total number of edges connected to node_id (both inbound and outbound). + """ + return await self.edge_collection.count_documents( + {"$or": [{"source_node_id": node_id}, {"target_node_id": node_id}]} + ) + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + """Get the total degree (sum of relationships) of two nodes. + + Args: + src_id: Label of the source node + tgt_id: Label of the target node + + Returns: + int: Sum of the degrees of both nodes + """ + src_degree = await self.node_degree(src_id) + trg_degree = await self.node_degree(tgt_id) + + return src_degree + trg_degree + + # + # ------------------------------------------------------------------------- + # GETTERS + # ------------------------------------------------------------------------- + # + + async def get_node(self, node_id: str) -> dict[str, str] | None: + """ + Return the full node document, or None if missing. + """ + return await self.collection.find_one({"_id": node_id}) + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + return await self.edge_collection.find_one( + { + "$or": [ + { + "source_node_id": source_node_id, + "target_node_id": target_node_id, + }, + { + "source_node_id": target_node_id, + "target_node_id": source_node_id, + }, + ] + } + ) + + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + """ + Retrieves all edges (relationships) for a particular node identified by its label. + + Args: + source_node_id: Label of the node to get edges for + + Returns: + list[tuple[str, str]]: List of (source_label, target_label) tuples representing edges + None: If no edges found + """ + cursor = self.edge_collection.find( + { + "$or": [ + {"source_node_id": source_node_id}, + {"target_node_id": source_node_id}, + ] + }, + {"source_node_id": 1, "target_node_id": 1}, + ) + + return [ + (e.get("source_node_id"), e.get("target_node_id")) async for e in cursor + ] + + async def get_nodes_batch(self, node_ids: list[str]) -> dict[str, dict]: + result = {} + + async for doc in self.collection.find({"_id": {"$in": node_ids}}): + result[doc.get("_id")] = doc + return result + + async def node_degrees_batch(self, node_ids: list[str]) -> dict[str, int]: + # merge the outbound and inbound results with the same "_id" and sum the "degree" + merged_results = {} + + # Outbound degrees + outbound_pipeline = [ + {"$match": {"source_node_id": {"$in": node_ids}}}, + {"$group": {"_id": "$source_node_id", "degree": {"$sum": 1}}}, + ] + + cursor = await self.edge_collection.aggregate( + outbound_pipeline, allowDiskUse=True + ) + async for doc in cursor: + merged_results[doc.get("_id")] = doc.get("degree") + + # Inbound degrees + inbound_pipeline = [ + {"$match": {"target_node_id": {"$in": node_ids}}}, + {"$group": {"_id": "$target_node_id", "degree": {"$sum": 1}}}, + ] + + cursor = await self.edge_collection.aggregate( + inbound_pipeline, allowDiskUse=True + ) + async for doc in cursor: + merged_results[doc.get("_id")] = merged_results.get( + doc.get("_id"), 0 + ) + doc.get("degree") + + return merged_results + + async def get_nodes_edges_batch( + self, node_ids: list[str] + ) -> dict[str, list[tuple[str, str]]]: + """ + Batch retrieve edges for multiple nodes. + For each node, returns both outgoing and incoming edges to properly represent + the undirected graph nature. + + Args: + node_ids: List of node IDs (entity_id) for which to retrieve edges. + + Returns: + A dictionary mapping each node ID to its list of edge tuples (source, target). + For each node, the list includes both: + - Outgoing edges: (queried_node, connected_node) + - Incoming edges: (connected_node, queried_node) + """ + result = {node_id: [] for node_id in node_ids} + + # Query outgoing edges (where node is the source) + outgoing_cursor = self.edge_collection.find( + {"source_node_id": {"$in": node_ids}}, + {"source_node_id": 1, "target_node_id": 1}, + ) + async for edge in outgoing_cursor: + source = edge["source_node_id"] + target = edge["target_node_id"] + result[source].append((source, target)) + + # Query incoming edges (where node is the target) + incoming_cursor = self.edge_collection.find( + {"target_node_id": {"$in": node_ids}}, + {"source_node_id": 1, "target_node_id": 1}, + ) + async for edge in incoming_cursor: + source = edge["source_node_id"] + target = edge["target_node_id"] + result[target].append((source, target)) + + return result + + # + # ------------------------------------------------------------------------- + # UPSERTS + # ------------------------------------------------------------------------- + # + + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """ + Insert or update a node document. + """ + update_doc = {"$set": {**node_data}} + if node_data.get("source_id", ""): + update_doc["$set"]["source_ids"] = node_data["source_id"].split( + GRAPH_FIELD_SEP + ) + + await self.collection.update_one({"_id": node_id}, update_doc, upsert=True) + + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """ + Upsert an edge between source_node_id and target_node_id with optional 'relation'. + If an edge with the same target exists, we remove it and re-insert with updated data. + """ + # Ensure source node exists + await self.upsert_node(source_node_id, {}) + + update_doc = {"$set": edge_data} + if edge_data.get("source_id", ""): + update_doc["$set"]["source_ids"] = edge_data["source_id"].split( + GRAPH_FIELD_SEP + ) + + edge_data["source_node_id"] = source_node_id + edge_data["target_node_id"] = target_node_id + + await self.edge_collection.update_one( + { + "$or": [ + { + "source_node_id": source_node_id, + "target_node_id": target_node_id, + }, + { + "source_node_id": target_node_id, + "target_node_id": source_node_id, + }, + ] + }, + update_doc, + upsert=True, + ) + + # + # ------------------------------------------------------------------------- + # DELETION + # ------------------------------------------------------------------------- + # + + async def delete_node(self, node_id: str) -> None: + """ + 1) Remove node's doc entirely. + 2) Remove inbound & outbound edges from any doc that references node_id. + """ + # Remove all edges + await self.edge_collection.delete_many( + {"$or": [{"source_node_id": node_id}, {"target_node_id": node_id}]} + ) + + # Remove the node doc + await self.collection.delete_one({"_id": node_id}) + + # + # ------------------------------------------------------------------------- + # QUERY + # ------------------------------------------------------------------------- + # + + async def get_all_labels(self) -> list[str]: + """ + Get all existing node _id in the database + Returns: + [id1, id2, ...] # Alphabetically sorted id list + """ + + # Use aggregation with allowDiskUse for large datasets + pipeline = [{"$project": {"_id": 1}}, {"$sort": {"_id": 1}}] + cursor = await self.collection.aggregate(pipeline, allowDiskUse=True) + labels = [] + async for doc in cursor: + labels.append(doc["_id"]) + return labels + + def _construct_graph_node( + self, node_id, node_data: dict[str, str] + ) -> KnowledgeGraphNode: + return KnowledgeGraphNode( + id=node_id, + labels=[node_id], + properties={ + k: v + for k, v in node_data.items() + if k + not in [ + "_id", + "connected_edges", + "source_ids", + "edge_count", + ] + }, + ) + + def _construct_graph_edge(self, edge_id: str, edge: dict[str, str]): + return KnowledgeGraphEdge( + id=edge_id, + type=edge.get("relationship", ""), + source=edge["source_node_id"], + target=edge["target_node_id"], + properties={ + k: v + for k, v in edge.items() + if k + not in [ + "_id", + "source_node_id", + "target_node_id", + "relationship", + "source_ids", + ] + }, + ) + + async def get_knowledge_graph_all_by_degree( + self, max_depth: int, max_nodes: int + ) -> KnowledgeGraph: + """ + It's possible that the node with one or multiple relationships is retrieved, + while its neighbor is not. Then this node might seem like disconnected in UI. + """ + + total_node_count = await self.collection.count_documents({}) + result = KnowledgeGraph() + seen_edges = set() + + result.is_truncated = total_node_count > max_nodes + if result.is_truncated: + # Get all node_ids ranked by degree if max_nodes exceeds total node count + pipeline = [ + {"$project": {"source_node_id": 1, "_id": 0}}, + {"$group": {"_id": "$source_node_id", "degree": {"$sum": 1}}}, + { + "$unionWith": { + "coll": self._edge_collection_name, + "pipeline": [ + {"$project": {"target_node_id": 1, "_id": 0}}, + { + "$group": { + "_id": "$target_node_id", + "degree": {"$sum": 1}, + } + }, + ], + } + }, + {"$group": {"_id": "$_id", "degree": {"$sum": "$degree"}}}, + {"$sort": {"degree": -1}}, + {"$limit": max_nodes}, + ] + cursor = await self.edge_collection.aggregate(pipeline, allowDiskUse=True) + + node_ids = [] + async for doc in cursor: + node_id = str(doc["_id"]) + node_ids.append(node_id) + + cursor = self.collection.find({"_id": {"$in": node_ids}}, {"source_ids": 0}) + async for doc in cursor: + result.nodes.append(self._construct_graph_node(doc["_id"], doc)) + + # As node count reaches the limit, only need to fetch the edges that directly connect to these nodes + edge_cursor = self.edge_collection.find( + { + "$and": [ + {"source_node_id": {"$in": node_ids}}, + {"target_node_id": {"$in": node_ids}}, + ] + } + ) + else: + # All nodes and edges are needed + cursor = self.collection.find({}, {"source_ids": 0}) + + async for doc in cursor: + node_id = str(doc["_id"]) + result.nodes.append(self._construct_graph_node(doc["_id"], doc)) + + edge_cursor = self.edge_collection.find({}) + + async for edge in edge_cursor: + edge_id = f"{edge['source_node_id']}-{edge['target_node_id']}" + if edge_id not in seen_edges: + seen_edges.add(edge_id) + result.edges.append(self._construct_graph_edge(edge_id, edge)) + + return result + + async def _bidirectional_bfs_nodes( + self, + node_labels: list[str], + seen_nodes: set[str], + result: KnowledgeGraph, + depth: int, + max_depth: int, + max_nodes: int, + ) -> KnowledgeGraph: + if depth > max_depth or len(result.nodes) > max_nodes: + return result + + cursor = self.collection.find({"_id": {"$in": node_labels}}) + + async for node in cursor: + node_id = node["_id"] + if node_id not in seen_nodes: + seen_nodes.add(node_id) + result.nodes.append(self._construct_graph_node(node_id, node)) + if len(result.nodes) > max_nodes: + return result + + # Collect neighbors + # Get both inbound and outbound one hop nodes + cursor = self.edge_collection.find( + { + "$or": [ + {"source_node_id": {"$in": node_labels}}, + {"target_node_id": {"$in": node_labels}}, + ] + } + ) + + neighbor_nodes = [] + async for edge in cursor: + if edge["source_node_id"] not in seen_nodes: + neighbor_nodes.append(edge["source_node_id"]) + if edge["target_node_id"] not in seen_nodes: + neighbor_nodes.append(edge["target_node_id"]) + + if neighbor_nodes: + result = await self._bidirectional_bfs_nodes( + neighbor_nodes, seen_nodes, result, depth + 1, max_depth, max_nodes + ) + + return result + + async def get_knowledge_subgraph_bidirectional_bfs( + self, + node_label: str, + depth: int, + max_depth: int, + max_nodes: int, + ) -> KnowledgeGraph: + seen_nodes = set() + seen_edges = set() + result = KnowledgeGraph() + + result = await self._bidirectional_bfs_nodes( + [node_label], seen_nodes, result, depth, max_depth, max_nodes + ) + + # Get all edges from seen_nodes + all_node_ids = list(seen_nodes) + cursor = self.edge_collection.find( + { + "$and": [ + {"source_node_id": {"$in": all_node_ids}}, + {"target_node_id": {"$in": all_node_ids}}, + ] + } + ) + + async for edge in cursor: + edge_id = f"{edge['source_node_id']}-{edge['target_node_id']}" + if edge_id not in seen_edges: + result.edges.append(self._construct_graph_edge(edge_id, edge)) + seen_edges.add(edge_id) + + return result + + async def get_knowledge_subgraph_in_out_bound_bfs( + self, node_label: str, max_depth: int, max_nodes: int + ) -> KnowledgeGraph: + seen_nodes = set() + seen_edges = set() + result = KnowledgeGraph() + project_doc = { + "source_ids": 0, + "created_at": 0, + "entity_type": 0, + "file_path": 0, + } + + # Verify if starting node exists + start_node = await self.collection.find_one({"_id": node_label}) + if not start_node: + logger.warning( + f"[{self.workspace}] Starting node with label {node_label} does not exist!" + ) + return result + + seen_nodes.add(node_label) + result.nodes.append(self._construct_graph_node(node_label, start_node)) + + if max_depth == 0: + return result + + # In MongoDB, depth = 0 means one-hop + max_depth = max_depth - 1 + + pipeline = [ + {"$match": {"_id": node_label}}, + {"$project": project_doc}, + { + "$graphLookup": { + "from": self._edge_collection_name, + "startWith": "$_id", + "connectFromField": "target_node_id", + "connectToField": "source_node_id", + "maxDepth": max_depth, + "depthField": "depth", + "as": "connected_edges", + }, + }, + { + "$unionWith": { + "coll": self._collection_name, + "pipeline": [ + {"$match": {"_id": node_label}}, + {"$project": project_doc}, + { + "$graphLookup": { + "from": self._edge_collection_name, + "startWith": "$_id", + "connectFromField": "source_node_id", + "connectToField": "target_node_id", + "maxDepth": max_depth, + "depthField": "depth", + "as": "connected_edges", + } + }, + ], + } + }, + ] + + cursor = await self.collection.aggregate(pipeline, allowDiskUse=True) + node_edges = [] + + # Two records for node_label are returned capturing outbound and inbound connected_edges + async for doc in cursor: + if doc.get("connected_edges", []): + node_edges.extend(doc.get("connected_edges")) + + # Sort the connected edges by depth ascending and weight descending + # And stores the source_node_id and target_node_id in sequence to retrieve the neighbouring nodes + node_edges = sorted( + node_edges, + key=lambda x: (x["depth"], -x["weight"]), + ) + + # As order matters, we need to use another list to store the node_id + # And only take the first max_nodes ones + node_ids = [] + for edge in node_edges: + if len(node_ids) < max_nodes and edge["source_node_id"] not in seen_nodes: + node_ids.append(edge["source_node_id"]) + seen_nodes.add(edge["source_node_id"]) + + if len(node_ids) < max_nodes and edge["target_node_id"] not in seen_nodes: + node_ids.append(edge["target_node_id"]) + seen_nodes.add(edge["target_node_id"]) + + # Filter out all the node whose id is same as node_label so that we do not check existence next step + cursor = self.collection.find({"_id": {"$in": node_ids}}) + + async for doc in cursor: + result.nodes.append(self._construct_graph_node(str(doc["_id"]), doc)) + + for edge in node_edges: + if ( + edge["source_node_id"] not in seen_nodes + or edge["target_node_id"] not in seen_nodes + ): + continue + + edge_id = f"{edge['source_node_id']}-{edge['target_node_id']}" + if edge_id not in seen_edges: + result.edges.append(self._construct_graph_edge(edge_id, edge)) + seen_edges.add(edge_id) + + return result + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node, * means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maximum nodes to return, Defaults to global_config max_graph_nodes + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + + If a graph is like this and starting from B: + A → B ← C ← F, B -> E, C → D + + Outbound BFS: + B → E + + Inbound BFS: + A → B + C → B + F → C + + Bidirectional BFS: + A → B + B → E + F → C + C → B + C → D + """ + # Use global_config max_graph_nodes as default if max_nodes is None + if max_nodes is None: + max_nodes = self.global_config.get("max_graph_nodes", 1000) + else: + # Limit max_nodes to not exceed global_config max_graph_nodes + max_nodes = min(max_nodes, self.global_config.get("max_graph_nodes", 1000)) + + result = KnowledgeGraph() + start = time.perf_counter() + + try: + # Optimize pipeline to avoid memory issues with large datasets + if node_label == "*": + result = await self.get_knowledge_graph_all_by_degree( + max_depth, max_nodes + ) + elif GRAPH_BFS_MODE == "in_out_bound": + result = await self.get_knowledge_subgraph_in_out_bound_bfs( + node_label, max_depth, max_nodes + ) + else: + result = await self.get_knowledge_subgraph_bidirectional_bfs( + node_label, 0, max_depth, max_nodes + ) + + duration = time.perf_counter() - start + + logger.info( + f"[{self.workspace}] Subgraph query successful in {duration:.4f} seconds | Node count: {len(result.nodes)} | Edge count: {len(result.edges)} | Truncated: {result.is_truncated}" + ) + + except PyMongoError as e: + # Handle memory limit errors specifically + if "memory limit" in str(e).lower() or "sort exceeded" in str(e).lower(): + logger.warning( + f"[{self.workspace}] MongoDB memory limit exceeded, falling back to simple query: {str(e)}" + ) + # Fallback to a simple query without complex aggregation + try: + simple_cursor = self.collection.find({}).limit(max_nodes) + async for doc in simple_cursor: + result.nodes.append( + self._construct_graph_node(str(doc["_id"]), doc) + ) + result.is_truncated = True + logger.info( + f"[{self.workspace}] Fallback query completed | Node count: {len(result.nodes)}" + ) + except PyMongoError as fallback_error: + logger.error( + f"[{self.workspace}] Fallback query also failed: {str(fallback_error)}" + ) + else: + logger.error(f"[{self.workspace}] MongoDB query failed: {str(e)}") + + return result + + async def index_done_callback(self) -> None: + # Mongo handles persistence automatically + pass + + async def remove_nodes(self, nodes: list[str]) -> None: + """Delete multiple nodes + + Args: + nodes: List of node IDs to be deleted + """ + logger.info(f"[{self.workspace}] Deleting {len(nodes)} nodes") + if not nodes: + return + + # 1. Remove all edges referencing these nodes + await self.edge_collection.delete_many( + { + "$or": [ + {"source_node_id": {"$in": nodes}}, + {"target_node_id": {"$in": nodes}}, + ] + } + ) + + # 2. Delete the node documents + await self.collection.delete_many({"_id": {"$in": nodes}}) + + logger.debug(f"[{self.workspace}] Successfully deleted nodes: {nodes}") + + async def remove_edges(self, edges: list[tuple[str, str]]) -> None: + """Delete multiple edges + + Args: + edges: List of edges to be deleted, each edge is a (source, target) tuple + """ + logger.info(f"[{self.workspace}] Deleting {len(edges)} edges") + if not edges: + return + + all_edge_pairs = [] + for source_id, target_id in edges: + all_edge_pairs.append( + {"source_node_id": source_id, "target_node_id": target_id} + ) + all_edge_pairs.append( + {"source_node_id": target_id, "target_node_id": source_id} + ) + + await self.edge_collection.delete_many({"$or": all_edge_pairs}) + + logger.debug(f"[{self.workspace}] Successfully deleted edges: {edges}") + + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + """ + cursor = self.collection.find({}) + nodes = [] + async for node in cursor: + node_dict = dict(node) + # Add node id (entity_id) to the dictionary for easier access + node_dict["id"] = node_dict.get("_id") + nodes.append(node_dict) + return nodes + + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + """ + cursor = self.edge_collection.find({}) + edges = [] + async for edge in cursor: + edge_dict = dict(edge) + edge_dict["source"] = edge_dict.get("source_node_id") + edge_dict["target"] = edge_dict.get("target_node_id") + edges.append(edge_dict) + return edges + + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """Get popular labels by node degree (most connected entities) + + Args: + limit: Maximum number of labels to return + + Returns: + List of labels sorted by degree (highest first) + """ + try: + # Use aggregation pipeline to count edges per node and sort by degree + pipeline = [ + # Count outbound edges + {"$group": {"_id": "$source_node_id", "out_degree": {"$sum": 1}}}, + # Union with inbound edges count + { + "$unionWith": { + "coll": self._edge_collection_name, + "pipeline": [ + { + "$group": { + "_id": "$target_node_id", + "in_degree": {"$sum": 1}, + } + } + ], + } + }, + # Group by node_id and sum degrees + { + "$group": { + "_id": "$_id", + "total_degree": { + "$sum": { + "$add": [ + {"$ifNull": ["$out_degree", 0]}, + {"$ifNull": ["$in_degree", 0]}, + ] + } + }, + } + }, + # Sort by degree descending, then by label ascending + {"$sort": {"total_degree": -1, "_id": 1}}, + # Limit results + {"$limit": limit}, + # Project only the label + {"$project": {"_id": 1}}, + ] + + cursor = await self.edge_collection.aggregate(pipeline, allowDiskUse=True) + labels = [] + async for doc in cursor: + if doc.get("_id"): + labels.append(doc["_id"]) + + logger.debug( + f"[{self.workspace}] Retrieved {len(labels)} popular labels (limit: {limit})" + ) + return labels + except Exception as e: + logger.error(f"[{self.workspace}] Error getting popular labels: {str(e)}") + return [] + + async def _try_atlas_text_search(self, query_strip: str, limit: int) -> list[str]: + """Try Atlas Search using simple text search.""" + try: + pipeline = [ + { + "$search": { + "index": "entity_id_search_idx", + "text": {"query": query_strip, "path": "_id"}, + } + }, + {"$project": {"_id": 1, "score": {"$meta": "searchScore"}}}, + {"$limit": limit}, + ] + cursor = await self.collection.aggregate(pipeline) + labels = [doc["_id"] async for doc in cursor if doc.get("_id")] + if labels: + logger.debug( + f"[{self.workspace}] Atlas text search returned {len(labels)} results" + ) + return labels + return [] + except PyMongoError as e: + logger.debug(f"[{self.workspace}] Atlas text search failed: {e}") + return [] + + async def _try_atlas_autocomplete_search( + self, query_strip: str, limit: int + ) -> list[str]: + """Try Atlas Search using autocomplete for prefix matching.""" + try: + pipeline = [ + { + "$search": { + "index": "entity_id_search_idx", + "autocomplete": { + "query": query_strip, + "path": "_id", + "fuzzy": {"maxEdits": 1, "prefixLength": 1}, + }, + } + }, + {"$project": {"_id": 1, "score": {"$meta": "searchScore"}}}, + {"$limit": limit}, + ] + cursor = await self.collection.aggregate(pipeline) + labels = [doc["_id"] async for doc in cursor if doc.get("_id")] + if labels: + logger.debug( + f"[{self.workspace}] Atlas autocomplete search returned {len(labels)} results" + ) + return labels + return [] + except PyMongoError as e: + logger.debug(f"[{self.workspace}] Atlas autocomplete search failed: {e}") + return [] + + async def _try_atlas_compound_search( + self, query_strip: str, limit: int + ) -> list[str]: + """Try Atlas Search using compound query for comprehensive matching.""" + try: + pipeline = [ + { + "$search": { + "index": "entity_id_search_idx", + "compound": { + "should": [ + { + "text": { + "query": query_strip, + "path": "_id", + "score": {"boost": {"value": 10}}, + } + }, + { + "autocomplete": { + "query": query_strip, + "path": "_id", + "score": {"boost": {"value": 5}}, + "fuzzy": {"maxEdits": 1, "prefixLength": 1}, + } + }, + { + "wildcard": { + "query": f"*{query_strip}*", + "path": "_id", + "score": {"boost": {"value": 2}}, + } + }, + ], + "minimumShouldMatch": 1, + }, + } + }, + {"$project": {"_id": 1, "score": {"$meta": "searchScore"}}}, + {"$sort": {"score": {"$meta": "searchScore"}}}, + {"$limit": limit}, + ] + cursor = await self.collection.aggregate(pipeline) + labels = [doc["_id"] async for doc in cursor if doc.get("_id")] + if labels: + logger.debug( + f"[{self.workspace}] Atlas compound search returned {len(labels)} results" + ) + return labels + return [] + except PyMongoError as e: + logger.debug(f"[{self.workspace}] Atlas compound search failed: {e}") + return [] + + async def _fallback_regex_search(self, query_strip: str, limit: int) -> list[str]: + """Fallback to regex-based search when Atlas Search fails.""" + try: + logger.debug( + f"[{self.workspace}] Using regex fallback search for: '{query_strip}'" + ) + + escaped_query = re.escape(query_strip) + regex_condition = {"_id": {"$regex": escaped_query, "$options": "i"}} + cursor = self.collection.find(regex_condition, {"_id": 1}).limit(limit * 2) + docs = await cursor.to_list(length=limit * 2) + + # Extract labels + labels = [] + for doc in docs: + doc_id = doc.get("_id") + if doc_id: + labels.append(doc_id) + + # Sort results to prioritize exact matches and starts-with matches + def sort_key(label): + label_lower = label.lower() + query_lower_strip = query_strip.lower() + + if label_lower == query_lower_strip: + return (0, label_lower) # Exact match - highest priority + elif label_lower.startswith(query_lower_strip): + return (1, label_lower) # Starts with - medium priority + else: + return (2, label_lower) # Contains - lowest priority + + labels.sort(key=sort_key) + labels = labels[:limit] # Apply final limit after sorting + + logger.debug( + f"[{self.workspace}] Regex fallback search returned {len(labels)} results (limit: {limit})" + ) + return labels + + except Exception as e: + logger.error(f"[{self.workspace}] Regex fallback search failed: {e}") + import traceback + + logger.error(f"[{self.workspace}] Traceback: {traceback.format_exc()}") + return [] + + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """ + Search labels with progressive fallback strategy: + 1. Atlas text search (simple and fast) + 2. Atlas autocomplete search (prefix matching with fuzzy) + 3. Atlas compound search (comprehensive matching) + 4. Regex fallback (when Atlas Search is unavailable) + """ + query_strip = query.strip() + if not query_strip: + return [] + + # First check if we have any nodes at all + try: + node_count = await self.collection.count_documents({}) + if node_count == 0: + logger.debug( + f"[{self.workspace}] No nodes found in collection {self._collection_name}" + ) + return [] + except PyMongoError as e: + logger.error(f"[{self.workspace}] Error counting nodes: {e}") + return [] + + # Progressive search strategy + search_methods = [ + ("text", self._try_atlas_text_search), + ("autocomplete", self._try_atlas_autocomplete_search), + ("compound", self._try_atlas_compound_search), + ] + + # Try Atlas Search methods in order + for method_name, search_method in search_methods: + try: + labels = await search_method(query_strip, limit) + if labels: + logger.debug( + f"[{self.workspace}] Search successful using {method_name} method: {len(labels)} results" + ) + return labels + else: + logger.debug( + f"[{self.workspace}] {method_name} search returned no results, trying next method" + ) + except Exception as e: + logger.debug( + f"[{self.workspace}] {method_name} search failed: {e}, trying next method" + ) + continue + + # If all Atlas Search methods fail, use regex fallback + logger.info( + f"[{self.workspace}] All Atlas Search methods failed, using regex fallback search for: '{query_strip}'" + ) + return await self._fallback_regex_search(query_strip, limit) + + async def _check_if_index_needs_rebuild( + self, indexes: list, index_name: str + ) -> bool: + """Check if the existing index needs to be rebuilt due to configuration issues.""" + for index in indexes: + if index["name"] == index_name: + # Check if the index has the old problematic configuration + definition = index.get("latestDefinition", {}) + mappings = definition.get("mappings", {}) + fields = mappings.get("fields", {}) + id_field = fields.get("_id", {}) + + # If it's the old single-type autocomplete configuration, rebuild + if ( + isinstance(id_field, dict) + and id_field.get("type") == "autocomplete" + ): + logger.info( + f"[{self.workspace}] Found old index configuration for '{index_name}', will rebuild" + ) + return True + + # If it's not a list (multi-type configuration), rebuild + if not isinstance(id_field, list): + logger.info( + f"[{self.workspace}] Index '{index_name}' needs upgrade to multi-type configuration" + ) + return True + + logger.info( + f"[{self.workspace}] Index '{index_name}' has correct configuration" + ) + return False + return True # Index doesn't exist, needs creation + + async def _safely_drop_old_index(self, index_name: str): + """Safely drop the old search index.""" + try: + await self.collection.drop_search_index(index_name) + logger.info( + f"[{self.workspace}] Successfully dropped old search index '{index_name}'" + ) + except PyMongoError as e: + logger.warning( + f"[{self.workspace}] Could not drop old index '{index_name}': {e}" + ) + + async def _create_improved_search_index(self, index_name: str): + """Create an improved search index with multiple field types.""" + search_index_model = SearchIndexModel( + definition={ + "mappings": { + "dynamic": False, + "fields": { + "_id": [ + { + "type": "string", + }, + { + "type": "token", + }, + { + "type": "autocomplete", + "maxGrams": 15, + "minGrams": 2, + }, + ] + }, + }, + "analyzer": "lucene.standard", # Index-level analyzer for text processing + }, + name=index_name, + type="search", + ) + + await self.collection.create_search_index(search_index_model) + logger.info( + f"[{self.workspace}] Created improved Atlas Search index '{index_name}' for collection {self._collection_name}. " + ) + logger.info( + f"[{self.workspace}] Index will be built asynchronously, using regex fallback until ready." + ) + + async def create_search_index_if_not_exists(self): + """Creates an improved Atlas Search index for entity search, rebuilding if necessary.""" + index_name = "entity_id_search_idx" + + try: + # Check if we're using MongoDB Atlas (has search index capabilities) + indexes_cursor = await self.collection.list_search_indexes() + indexes = await indexes_cursor.to_list(length=None) + + # Check if we need to rebuild the index + needs_rebuild = await self._check_if_index_needs_rebuild( + indexes, index_name + ) + + if needs_rebuild: + # Check if index exists and drop it + index_exists = any(idx["name"] == index_name for idx in indexes) + if index_exists: + await self._safely_drop_old_index(index_name) + + # Create the improved search index (async, no waiting) + await self._create_improved_search_index(index_name) + else: + logger.info( + f"[{self.workspace}] Atlas Search index '{index_name}' already exists with correct configuration" + ) + + except PyMongoError as e: + # This is expected if not using MongoDB Atlas or if search indexes are not supported + logger.info( + f"[{self.workspace}] Could not create Atlas Search index for {self._collection_name}: {e}. " + "This is normal if not using MongoDB Atlas - search will use regex fallback." + ) + except Exception as e: + logger.warning( + f"[{self.workspace}] Unexpected error creating Atlas Search index for {self._collection_name}: {e}" + ) + + async def drop(self) -> dict[str, str]: + """Drop the storage by removing all documents in the collection. + + Returns: + dict[str, str]: Status of the operation with keys 'status' and 'message' + """ + async with get_graph_db_lock(): + try: + result = await self.collection.delete_many({}) + deleted_count = result.deleted_count + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} documents from graph {self._collection_name}" + ) + + result = await self.edge_collection.delete_many({}) + edge_count = result.deleted_count + logger.info( + f"[{self.workspace}] Dropped {edge_count} edges from graph {self._edge_collection_name}" + ) + + return { + "status": "success", + "message": f"{deleted_count} documents and {edge_count} edges dropped", + } + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error dropping graph {self._collection_name}: {e}" + ) + return {"status": "error", "message": str(e)} + + +@final +@dataclass +class MongoVectorDBStorage(BaseVectorStorage): + db: AsyncDatabase | None = field(default=None) + _data: AsyncCollection | None = field(default=None) + _index_name: str = field(default="", init=False) + + def __init__( + self, namespace, global_config, embedding_func, workspace=None, meta_fields=None + ): + super().__init__( + namespace=namespace, + workspace=workspace or "", + global_config=global_config, + embedding_func=embedding_func, + meta_fields=meta_fields or set(), + ) + self.__post_init__() + + def __post_init__(self): + # Check for MONGODB_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all MongoDB storage instances + mongodb_workspace = os.environ.get("MONGODB_WORKSPACE") + if mongodb_workspace and mongodb_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = mongodb_workspace.strip() + logger.info( + f"Using MONGODB_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + self.workspace = effective_workspace + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug(f"Final namespace (no workspace): '{self.final_namespace}'") + + # Set index name based on workspace for backward compatibility + if effective_workspace: + # Use collection-specific index name for workspaced collections to avoid conflicts + self._index_name = f"vector_knn_index_{self.final_namespace}" + else: + # Keep original index name for backward compatibility with existing deployments + self._index_name = "vector_knn_index" + + kwargs = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = kwargs.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + self._collection_name = self.final_namespace + self._max_batch_size = self.global_config["embedding_batch_num"] + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + self._data = await get_or_create_collection(self.db, self._collection_name) + + # Ensure vector index exists + await self.create_vector_index_if_not_exists() + + logger.debug( + f"[{self.workspace}] Use MongoDB as VDB {self._collection_name}" + ) + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + self._data = None + + async def create_vector_index_if_not_exists(self): + """Creates an Atlas Vector Search index.""" + try: + indexes_cursor = await self._data.list_search_indexes() + indexes = await indexes_cursor.to_list(length=None) + for index in indexes: + if index["name"] == self._index_name: + logger.info( + f"[{self.workspace}] vector index {self._index_name} already exist" + ) + return + + search_index_model = SearchIndexModel( + definition={ + "fields": [ + { + "type": "vector", + "numDimensions": self.embedding_func.embedding_dim, # Ensure correct dimensions + "path": "vector", + "similarity": "cosine", # Options: euclidean, cosine, dotProduct + } + ] + }, + name=self._index_name, + type="vectorSearch", + ) + + await self._data.create_search_index(search_index_model) + logger.info( + f"[{self.workspace}] Vector index {self._index_name} created successfully." + ) + + except PyMongoError as e: + error_msg = f"[{self.workspace}] Error creating vector index {self._index_name}: {e}" + logger.error(error_msg) + raise SystemExit( + f"Failed to create MongoDB vector index. Program cannot continue. {error_msg}" + ) + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + # Add current time as Unix timestamp + current_time = int(time.time()) + + list_data = [ + { + "_id": k, + "created_at": current_time, # Add created_at field as Unix timestamp + **{k1: v1 for k1, v1 in v.items() if k1 in self.meta_fields}, + } + for k, v in data.items() + ] + contents = [v["content"] for v in data.values()] + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + embeddings = np.concatenate(embeddings_list) + for i, d in enumerate(list_data): + d["vector"] = np.array(embeddings[i], dtype=np.float32).tolist() + + update_tasks = [] + for doc in list_data: + update_tasks.append( + self._data.update_one({"_id": doc["_id"]}, {"$set": doc}, upsert=True) + ) + await asyncio.gather(*update_tasks) + + return list_data + + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + """Queries the vector database using Atlas Vector Search.""" + if query_embedding is not None: + # Convert numpy array to list if needed for MongoDB compatibility + if hasattr(query_embedding, "tolist"): + query_vector = query_embedding.tolist() + else: + query_vector = list(query_embedding) + else: + # Generate the embedding + embedding = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + # Convert numpy array to a list to ensure compatibility with MongoDB + query_vector = embedding[0].tolist() + + # Define the aggregation pipeline with the converted query vector + pipeline = [ + { + "$vectorSearch": { + "index": self._index_name, # Use stored index name for consistency + "path": "vector", + "queryVector": query_vector, + "numCandidates": 100, # Adjust for performance + "limit": top_k, + } + }, + {"$addFields": {"score": {"$meta": "vectorSearchScore"}}}, + {"$match": {"score": {"$gte": self.cosine_better_than_threshold}}}, + {"$project": {"vector": 0}}, + ] + + # Execute the aggregation pipeline + cursor = await self._data.aggregate(pipeline, allowDiskUse=True) + results = await cursor.to_list(length=None) + + # Format and return the results with created_at field + return [ + { + **doc, + "id": doc["_id"], + "distance": doc.get("score", None), + "created_at": doc.get("created_at"), # Include created_at field + } + for doc in results + ] + + async def index_done_callback(self) -> None: + # Mongo handles persistence automatically + pass + + async def delete(self, ids: list[str]) -> None: + """Delete vectors with specified IDs + + Args: + ids: List of vector IDs to be deleted + """ + logger.debug( + f"[{self.workspace}] Deleting {len(ids)} vectors from {self.namespace}" + ) + if not ids: + return + + # Convert to list if it's a set (MongoDB BSON cannot encode sets) + if isinstance(ids, set): + ids = list(ids) + + try: + result = await self._data.delete_many({"_id": {"$in": ids}}) + logger.debug( + f"[{self.workspace}] Successfully deleted {result.deleted_count} vectors from {self.namespace}" + ) + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error while deleting vectors from {self.namespace}: {str(e)}" + ) + + async def delete_entity(self, entity_name: str) -> None: + """Delete an entity by its name + + Args: + entity_name: Name of the entity to delete + """ + try: + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + logger.debug( + f"[{self.workspace}] Attempting to delete entity {entity_name} with ID {entity_id}" + ) + + result = await self._data.delete_one({"_id": entity_id}) + if result.deleted_count > 0: + logger.debug( + f"[{self.workspace}] Successfully deleted entity {entity_name}" + ) + else: + logger.debug( + f"[{self.workspace}] Entity {entity_name} not found in storage" + ) + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error deleting entity {entity_name}: {str(e)}" + ) + + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete all relations associated with an entity + + Args: + entity_name: Name of the entity whose relations should be deleted + """ + try: + # Find relations where entity appears as source or target + relations_cursor = self._data.find( + {"$or": [{"src_id": entity_name}, {"tgt_id": entity_name}]} + ) + relations = await relations_cursor.to_list(length=None) + + if not relations: + logger.debug( + f"[{self.workspace}] No relations found for entity {entity_name}" + ) + return + + # Extract IDs of relations to delete + relation_ids = [relation["_id"] for relation in relations] + logger.debug( + f"[{self.workspace}] Found {len(relation_ids)} relations for entity {entity_name}" + ) + + # Delete the relations + result = await self._data.delete_many({"_id": {"$in": relation_ids}}) + logger.debug( + f"[{self.workspace}] Deleted {result.deleted_count} relations for {entity_name}" + ) + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error deleting relations for {entity_name}: {str(e)}" + ) + + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error searching by prefix in {self.namespace}: {str(e)}" + ) + return [] + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + try: + # Search for the specific ID in MongoDB + result = await self._data.find_one({"_id": id}) + if result: + # Format the result to include id field expected by API + result_dict = dict(result) + if "_id" in result_dict and "id" not in result_dict: + result_dict["id"] = result_dict["_id"] + return result_dict + return None + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for ID {id}: {e}" + ) + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + try: + # Query MongoDB for multiple IDs + cursor = self._data.find({"_id": {"$in": ids}}) + results = await cursor.to_list(length=None) + + # Format results to include id field expected by API and preserve ordering + formatted_map: dict[str, dict[str, Any]] = {} + for result in results: + result_dict = dict(result) + if "_id" in result_dict and "id" not in result_dict: + result_dict["id"] = result_dict["_id"] + key = str(result_dict.get("id", result_dict.get("_id"))) + formatted_map[key] = result_dict + + ordered_results: list[dict[str, Any] | None] = [] + for id_value in ids: + ordered_results.append(formatted_map.get(str(id_value))) + + return ordered_results + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for IDs {ids}: {e}" + ) + return [] + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + try: + # Query MongoDB for the specified IDs, only retrieving the vector field + cursor = self._data.find({"_id": {"$in": ids}}, {"vector": 1}) + results = await cursor.to_list(length=None) + + vectors_dict = {} + for result in results: + if result and "vector" in result and "_id" in result: + # MongoDB stores vectors as arrays, so they should already be lists + vectors_dict[result["_id"]] = result["vector"] + + return vectors_dict + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error retrieving vectors by IDs from {self.namespace}: {e}" + ) + return {} + + async def drop(self) -> dict[str, str]: + """Drop the storage by removing all documents in the collection and recreating vector index. + + Returns: + dict[str, str]: Status of the operation with keys 'status' and 'message' + """ + async with get_storage_lock(): + try: + # Delete all documents + result = await self._data.delete_many({}) + deleted_count = result.deleted_count + + # Recreate vector index + await self.create_vector_index_if_not_exists() + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} documents from vector storage {self._collection_name} and recreated vector index" + ) + return { + "status": "success", + "message": f"{deleted_count} documents dropped and vector index recreated", + } + except PyMongoError as e: + logger.error( + f"[{self.workspace}] Error dropping vector storage {self._collection_name}: {e}" + ) + return {"status": "error", "message": str(e)} + + +async def get_or_create_collection(db: AsyncDatabase, collection_name: str): + collection_names = await db.list_collection_names() + + if collection_name not in collection_names: + collection = await db.create_collection(collection_name) + logger.info(f"Created collection: {collection_name}") + return collection + else: + logger.debug(f"Collection '{collection_name}' already exists.") + return db.get_collection(collection_name) diff --git a/LightRAG/lightrag/kg/nano_vector_db_impl.py b/LightRAG/lightrag/kg/nano_vector_db_impl.py new file mode 100644 index 00000000..1185241c --- /dev/null +++ b/LightRAG/lightrag/kg/nano_vector_db_impl.py @@ -0,0 +1,423 @@ +import asyncio +import base64 +import os +import zlib +from typing import Any, final +from dataclasses import dataclass +import numpy as np +import time + +from lightrag.utils import ( + logger, + compute_mdhash_id, +) + +from lightrag.base import BaseVectorStorage +from nano_vectordb import NanoVectorDB +from .shared_storage import ( + get_storage_lock, + get_update_flag, + set_all_update_flags, +) + + +@final +@dataclass +class NanoVectorDBStorage(BaseVectorStorage): + def __post_init__(self): + # Initialize basic attributes + self._client = None + self._storage_lock = None + self.storage_updated = None + + # Use global config value if specified, otherwise use default + kwargs = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = kwargs.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + working_dir = self.global_config["working_dir"] + if self.workspace: + # Include workspace in the file path for data isolation + workspace_dir = os.path.join(working_dir, self.workspace) + self.final_namespace = f"{self.workspace}_{self.namespace}" + else: + # Default behavior when workspace is empty + self.final_namespace = self.namespace + self.workspace = "_" + workspace_dir = working_dir + + os.makedirs(workspace_dir, exist_ok=True) + self._client_file_name = os.path.join( + workspace_dir, f"vdb_{self.namespace}.json" + ) + + self._max_batch_size = self.global_config["embedding_batch_num"] + + self._client = NanoVectorDB( + self.embedding_func.embedding_dim, + storage_file=self._client_file_name, + ) + + async def initialize(self): + """Initialize storage data""" + # Get the update flag for cross-process update notification + self.storage_updated = await get_update_flag(self.final_namespace) + # Get the storage lock for use in other methods + self._storage_lock = get_storage_lock(enable_logging=False) + + async def _get_client(self): + """Check if the storage should be reloaded""" + # Acquire lock to prevent concurrent read and write + async with self._storage_lock: + # Check if data needs to be reloaded + if self.storage_updated.value: + logger.info( + f"[{self.workspace}] Process {os.getpid()} reloading {self.namespace} due to update by another process" + ) + # Reload data + self._client = NanoVectorDB( + self.embedding_func.embedding_dim, + storage_file=self._client_file_name, + ) + # Reset update flag + self.storage_updated.value = False + + return self._client + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + # logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + current_time = int(time.time()) + list_data = [ + { + "__id__": k, + "__created_at__": current_time, + **{k1: v1 for k1, v1 in v.items() if k1 in self.meta_fields}, + } + for k, v in data.items() + ] + contents = [v["content"] for v in data.values()] + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + # Execute embedding outside of lock to avoid long lock times + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + + embeddings = np.concatenate(embeddings_list) + if len(embeddings) == len(list_data): + for i, d in enumerate(list_data): + # Compress vector using Float16 + zlib + Base64 for storage optimization + vector_f16 = embeddings[i].astype(np.float16) + compressed_vector = zlib.compress(vector_f16.tobytes()) + encoded_vector = base64.b64encode(compressed_vector).decode("utf-8") + d["vector"] = encoded_vector + d["__vector__"] = embeddings[i] + client = await self._get_client() + results = client.upsert(datas=list_data) + return results + else: + # sometimes the embedding is not returned correctly. just log it. + logger.error( + f"[{self.workspace}] embedding is not 1-1 with data, {len(embeddings)} != {len(list_data)}" + ) + + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + # Use provided embedding or compute it + if query_embedding is not None: + embedding = query_embedding + else: + # Execute embedding outside of lock to avoid improve cocurrent + embedding = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + embedding = embedding[0] + + client = await self._get_client() + results = client.query( + query=embedding, + top_k=top_k, + better_than_threshold=self.cosine_better_than_threshold, + ) + results = [ + { + **{k: v for k, v in dp.items() if k != "vector"}, + "id": dp["__id__"], + "distance": dp["__metrics__"], + "created_at": dp.get("__created_at__"), + } + for dp in results + ] + return results + + @property + async def client_storage(self): + client = await self._get_client() + return getattr(client, "_NanoVectorDB__storage") + + async def delete(self, ids: list[str]): + """Delete vectors with specified IDs + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + ids: List of vector IDs to be deleted + """ + try: + client = await self._get_client() + # Record count before deletion + before_count = len(client) + + client.delete(ids) + + # Calculate actual deleted count + after_count = len(client) + deleted_count = before_count - after_count + + logger.debug( + f"[{self.workspace}] Successfully deleted {deleted_count} vectors from {self.namespace}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting vectors from {self.namespace}: {e}" + ) + + async def delete_entity(self, entity_name: str) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + + try: + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + logger.debug( + f"[{self.workspace}] Attempting to delete entity {entity_name} with ID {entity_id}" + ) + + # Check if the entity exists + client = await self._get_client() + if client.get([entity_id]): + client.delete([entity_id]) + logger.debug( + f"[{self.workspace}] Successfully deleted entity {entity_name}" + ) + else: + logger.debug( + f"[{self.workspace}] Entity {entity_name} not found in storage" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error deleting entity {entity_name}: {e}") + + async def delete_entity_relation(self, entity_name: str) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + + try: + client = await self._get_client() + storage = getattr(client, "_NanoVectorDB__storage") + relations = [ + dp + for dp in storage["data"] + if dp["src_id"] == entity_name or dp["tgt_id"] == entity_name + ] + logger.debug( + f"[{self.workspace}] Found {len(relations)} relations for entity {entity_name}" + ) + ids_to_delete = [relation["__id__"] for relation in relations] + + if ids_to_delete: + client = await self._get_client() + client.delete(ids_to_delete) + logger.debug( + f"[{self.workspace}] Deleted {len(ids_to_delete)} relations for {entity_name}" + ) + else: + logger.debug( + f"[{self.workspace}] No relations found for entity {entity_name}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error deleting relations for {entity_name}: {e}" + ) + + async def index_done_callback(self) -> bool: + """Save data to disk""" + async with self._storage_lock: + # Check if storage was updated by another process + if self.storage_updated.value: + # Storage was updated by another process, reload data instead of saving + logger.warning( + f"[{self.workspace}] Storage for {self.namespace} was updated by another process, reloading..." + ) + self._client = NanoVectorDB( + self.embedding_func.embedding_dim, + storage_file=self._client_file_name, + ) + # Reset update flag + self.storage_updated.value = False + return False # Return error + + # Acquire lock and perform persistence + async with self._storage_lock: + try: + # Save data to disk + self._client.save() + # Notify other processes that data has been updated + await set_all_update_flags(self.final_namespace) + # Reset own update flag to avoid self-reloading + self.storage_updated.value = False + return True # Return success + except Exception as e: + logger.error( + f"[{self.workspace}] Error saving data for {self.namespace}: {e}" + ) + return False # Return error + + return True # Return success + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + client = await self._get_client() + result = client.get([id]) + if result: + dp = result[0] + return { + **{k: v for k, v in dp.items() if k != "vector"}, + "id": dp.get("__id__"), + "created_at": dp.get("__created_at__"), + } + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + client = await self._get_client() + results = client.get(ids) + result_map: dict[str, dict[str, Any]] = {} + + for dp in results: + if not dp: + continue + record = { + **{k: v for k, v in dp.items() if k != "vector"}, + "id": dp.get("__id__"), + "created_at": dp.get("__created_at__"), + } + key = record.get("id") + if key is not None: + result_map[str(key)] = record + + ordered_results: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered_results.append(result_map.get(str(requested_id))) + + return ordered_results + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + client = await self._get_client() + results = client.get(ids) + + vectors_dict = {} + for result in results: + if result and "vector" in result and "__id__" in result: + # Decompress vector data (Base64 + zlib + Float16 compressed) + decoded = base64.b64decode(result["vector"]) + decompressed = zlib.decompress(decoded) + vector_f16 = np.frombuffer(decompressed, dtype=np.float16) + vector_f32 = vector_f16.astype(np.float32).tolist() + vectors_dict[result["__id__"]] = vector_f32 + + return vectors_dict + + async def drop(self) -> dict[str, str]: + """Drop all vector data from storage and clean up resources + + This method will: + 1. Remove the vector database storage file if it exists + 2. Reinitialize the vector database client + 3. Update flags to notify other processes + 4. Changes is persisted to disk immediately + + This method is intended for use in scenarios where all data needs to be removed, + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + async with self._storage_lock: + # delete _client_file_name + if os.path.exists(self._client_file_name): + os.remove(self._client_file_name) + + self._client = NanoVectorDB( + self.embedding_func.embedding_dim, + storage_file=self._client_file_name, + ) + + # Notify other processes that data has been updated + await set_all_update_flags(self.final_namespace) + # Reset own update flag to avoid self-reloading + self.storage_updated.value = False + + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop {self.namespace}(file:{self._client_file_name})" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error(f"[{self.workspace}] Error dropping {self.namespace}: {e}") + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/neo4j_impl.py b/LightRAG/lightrag/kg/neo4j_impl.py new file mode 100644 index 00000000..31df4623 --- /dev/null +++ b/LightRAG/lightrag/kg/neo4j_impl.py @@ -0,0 +1,1796 @@ +import os +import re +from dataclasses import dataclass +from typing import final +import configparser + + +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +import logging +from ..utils import logger +from ..base import BaseGraphStorage +from ..types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge +from ..kg.shared_storage import get_data_init_lock, get_graph_db_lock +import pipmaster as pm + +if not pm.is_installed("neo4j"): + pm.install("neo4j") + +from neo4j import ( # type: ignore + AsyncGraphDatabase, + exceptions as neo4jExceptions, + AsyncDriver, + AsyncManagedTransaction, +) + +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + + +# Set neo4j logger level to ERROR to suppress warning logs +logging.getLogger("neo4j").setLevel(logging.ERROR) + + +@final +@dataclass +class Neo4JStorage(BaseGraphStorage): + def __init__(self, namespace, global_config, embedding_func, workspace=None): + # Read env and override the arg if present + neo4j_workspace = os.environ.get("NEO4J_WORKSPACE") + if neo4j_workspace and neo4j_workspace.strip(): + workspace = neo4j_workspace + + # Default to 'base' when both arg and env are empty + if not workspace or not str(workspace).strip(): + workspace = "base" + + super().__init__( + namespace=namespace, + workspace=workspace, + global_config=global_config, + embedding_func=embedding_func, + ) + self._driver = None + + def _get_workspace_label(self) -> str: + """Return workspace label (guaranteed non-empty during initialization)""" + return self.workspace + + def _is_chinese_text(self, text: str) -> bool: + """Check if text contains Chinese characters.""" + chinese_pattern = re.compile(r"[\u4e00-\u9fff]+") + return bool(chinese_pattern.search(text)) + + async def initialize(self): + async with get_data_init_lock(): + URI = os.environ.get("NEO4J_URI", config.get("neo4j", "uri", fallback=None)) + USERNAME = os.environ.get( + "NEO4J_USERNAME", config.get("neo4j", "username", fallback=None) + ) + PASSWORD = os.environ.get( + "NEO4J_PASSWORD", config.get("neo4j", "password", fallback=None) + ) + MAX_CONNECTION_POOL_SIZE = int( + os.environ.get( + "NEO4J_MAX_CONNECTION_POOL_SIZE", + config.get("neo4j", "connection_pool_size", fallback=100), + ) + ) + CONNECTION_TIMEOUT = float( + os.environ.get( + "NEO4J_CONNECTION_TIMEOUT", + config.get("neo4j", "connection_timeout", fallback=30.0), + ), + ) + CONNECTION_ACQUISITION_TIMEOUT = float( + os.environ.get( + "NEO4J_CONNECTION_ACQUISITION_TIMEOUT", + config.get( + "neo4j", "connection_acquisition_timeout", fallback=30.0 + ), + ), + ) + MAX_TRANSACTION_RETRY_TIME = float( + os.environ.get( + "NEO4J_MAX_TRANSACTION_RETRY_TIME", + config.get("neo4j", "max_transaction_retry_time", fallback=30.0), + ), + ) + MAX_CONNECTION_LIFETIME = float( + os.environ.get( + "NEO4J_MAX_CONNECTION_LIFETIME", + config.get("neo4j", "max_connection_lifetime", fallback=300.0), + ), + ) + LIVENESS_CHECK_TIMEOUT = float( + os.environ.get( + "NEO4J_LIVENESS_CHECK_TIMEOUT", + config.get("neo4j", "liveness_check_timeout", fallback=30.0), + ), + ) + KEEP_ALIVE = os.environ.get( + "NEO4J_KEEP_ALIVE", + config.get("neo4j", "keep_alive", fallback="true"), + ).lower() in ("true", "1", "yes", "on") + DATABASE = os.environ.get( + "NEO4J_DATABASE", re.sub(r"[^a-zA-Z0-9-]", "-", self.namespace) + ) + """The default value approach for the DATABASE is only intended to maintain compatibility with legacy practices.""" + + self._driver: AsyncDriver = AsyncGraphDatabase.driver( + URI, + auth=(USERNAME, PASSWORD), + max_connection_pool_size=MAX_CONNECTION_POOL_SIZE, + connection_timeout=CONNECTION_TIMEOUT, + connection_acquisition_timeout=CONNECTION_ACQUISITION_TIMEOUT, + max_transaction_retry_time=MAX_TRANSACTION_RETRY_TIME, + max_connection_lifetime=MAX_CONNECTION_LIFETIME, + liveness_check_timeout=LIVENESS_CHECK_TIMEOUT, + keep_alive=KEEP_ALIVE, + ) + + # Try to connect to the database and create it if it doesn't exist + for database in (DATABASE, None): + self._DATABASE = database + connected = False + + try: + async with self._driver.session(database=database) as session: + try: + result = await session.run("MATCH (n) RETURN n LIMIT 0") + await result.consume() # Ensure result is consumed + logger.info( + f"[{self.workspace}] Connected to {database} at {URI}" + ) + connected = True + except neo4jExceptions.ServiceUnavailable as e: + logger.error( + f"[{self.workspace}] " + + f"Database {database} at {URI} is not available" + ) + raise e + except neo4jExceptions.AuthError as e: + logger.error( + f"[{self.workspace}] Authentication failed for {database} at {URI}" + ) + raise e + except neo4jExceptions.ClientError as e: + if e.code == "Neo.ClientError.Database.DatabaseNotFound": + logger.info( + f"[{self.workspace}] " + + f"Database {database} at {URI} not found. Try to create specified database." + ) + try: + async with self._driver.session() as session: + result = await session.run( + f"CREATE DATABASE `{database}` IF NOT EXISTS" + ) + await result.consume() # Ensure result is consumed + logger.info( + f"[{self.workspace}] " + + f"Database {database} at {URI} created" + ) + connected = True + except ( + neo4jExceptions.ClientError, + neo4jExceptions.DatabaseError, + ) as e: + if ( + e.code + == "Neo.ClientError.Statement.UnsupportedAdministrationCommand" + ) or ( + e.code == "Neo.DatabaseError.Statement.ExecutionFailed" + ): + if database is not None: + logger.warning( + f"[{self.workspace}] This Neo4j instance does not support creating databases. Try to use Neo4j Desktop/Enterprise version or DozerDB instead. Fallback to use the default database." + ) + if database is None: + logger.error( + f"[{self.workspace}] Failed to create {database} at {URI}" + ) + raise e + + if connected: + workspace_label = self._get_workspace_label() + # Create B-Tree index for entity_id for faster lookups + try: + async with self._driver.session(database=database) as session: + await session.run( + f"CREATE INDEX IF NOT EXISTS FOR (n:`{workspace_label}`) ON (n.entity_id)" + ) + logger.info( + f"[{self.workspace}] Ensured B-Tree index on entity_id for {workspace_label} in {database}" + ) + except Exception as e: + logger.warning( + f"[{self.workspace}] Failed to create B-Tree index: {str(e)}" + ) + + # Create full-text index for entity_id for faster text searches + await self._create_fulltext_index( + self._driver, self._DATABASE, workspace_label + ) + break + + async def _create_fulltext_index( + self, driver: AsyncDriver, database: str, workspace_label: str + ): + """Create a full-text index on the entity_id property with Chinese tokenizer support.""" + index_name = "entity_id_fulltext_idx" + try: + async with driver.session(database=database) as session: + # Check if the full-text index exists and get its configuration + check_index_query = "SHOW FULLTEXT INDEXES" + result = await session.run(check_index_query) + indexes = await result.data() + await result.consume() + + existing_index = None + for idx in indexes: + if idx["name"] == index_name: + existing_index = idx + break + + # Check if index exists and is online + if existing_index: + index_state = existing_index.get("state", "UNKNOWN") + logger.info( + f"[{self.workspace}] Found existing index '{index_name}' with state: {index_state}" + ) + + if index_state == "ONLINE": + logger.info( + f"[{self.workspace}] Full-text index '{index_name}' already exists and is online. Skipping recreation." + ) + return + else: + logger.warning( + f"[{self.workspace}] Existing index '{index_name}' is not online (state: {index_state}). Will recreate." + ) + else: + logger.info( + f"[{self.workspace}] No existing index '{index_name}' found. Creating new index." + ) + + # Create or recreate the index if needed + needs_recreation = ( + existing_index is not None + and existing_index.get("state") != "ONLINE" + ) + needs_creation = existing_index is None + + if needs_recreation or needs_creation: + # Drop existing index if it needs recreation + if needs_recreation: + try: + drop_query = f"DROP INDEX {index_name}" + result = await session.run(drop_query) + await result.consume() + logger.info( + f"[{self.workspace}] Dropped existing index '{index_name}'" + ) + except Exception as drop_error: + logger.warning( + f"[{self.workspace}] Failed to drop existing index: {str(drop_error)}" + ) + + # Create new index with CJK analyzer + logger.info( + f"[{self.workspace}] Creating full-text index '{index_name}' with Chinese tokenizer support." + ) + + try: + create_index_query = f""" + CREATE FULLTEXT INDEX {index_name} + FOR (n:`{workspace_label}`) ON EACH [n.entity_id] + OPTIONS {{ + indexConfig: {{ + `fulltext.analyzer`: 'cjk', + `fulltext.eventually_consistent`: true + }} + }} + """ + result = await session.run(create_index_query) + await result.consume() + logger.info( + f"[{self.workspace}] Successfully created full-text index '{index_name}' with CJK analyzer." + ) + except Exception as cjk_error: + # Fallback to standard analyzer if CJK is not supported + logger.warning( + f"[{self.workspace}] CJK analyzer not supported: {str(cjk_error)}. " + "Falling back to standard analyzer." + ) + create_index_query = f""" + CREATE FULLTEXT INDEX {index_name} + FOR (n:`{workspace_label}`) ON EACH [n.entity_id] + """ + result = await session.run(create_index_query) + await result.consume() + logger.info( + f"[{self.workspace}] Successfully created full-text index '{index_name}' with standard analyzer." + ) + + except Exception as e: + # Handle cases where the command might not be supported + if "Unknown command" in str(e) or "invalid syntax" in str(e).lower(): + logger.warning( + f"[{self.workspace}] Could not create or verify full-text index '{index_name}'. " + "This might be because you are using a Neo4j version that does not support it. " + "Search functionality will fall back to slower, non-indexed queries." + ) + else: + logger.error( + f"[{self.workspace}] Failed to create or verify full-text index '{index_name}': {str(e)}" + ) + + async def finalize(self): + """Close the Neo4j driver and release all resources""" + async with get_graph_db_lock(): + if self._driver: + await self._driver.close() + self._driver = None + + async def __aexit__(self, exc_type, exc, tb): + """Ensure driver is closed when context manager exits""" + await self.finalize() + + async def index_done_callback(self) -> None: + # Neo4J handles persistence automatically + pass + + async def has_node(self, node_id: str) -> bool: + """ + Check if a node with the given label exists in the database + + Args: + node_id: Label of the node to check + + Returns: + bool: True if node exists, False otherwise + + Raises: + ValueError: If node_id is invalid + Exception: If there is an error executing the query + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + query = f"MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) RETURN count(n) > 0 AS node_exists" + result = await session.run(query, entity_id=node_id) + single_result = await result.single() + await result.consume() # Ensure result is fully consumed + return single_result["node_exists"] + except Exception as e: + logger.error( + f"[{self.workspace}] Error checking node existence for {node_id}: {str(e)}" + ) + if result is not None: + await result.consume() # Ensure results are consumed even on error + raise + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + """ + Check if an edge exists between two nodes + + Args: + source_node_id: Label of the source node + target_node_id: Label of the target node + + Returns: + bool: True if edge exists, False otherwise + + Raises: + ValueError: If either node_id is invalid + Exception: If there is an error executing the query + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + query = ( + f"MATCH (a:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(b:`{workspace_label}` {{entity_id: $target_entity_id}}) " + "RETURN COUNT(r) > 0 AS edgeExists" + ) + result = await session.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + ) + single_result = await result.single() + await result.consume() # Ensure result is fully consumed + return single_result["edgeExists"] + except Exception as e: + logger.error( + f"[{self.workspace}] Error checking edge existence between {source_node_id} and {target_node_id}: {str(e)}" + ) + if result is not None: + await result.consume() # Ensure results are consumed even on error + raise + + async def get_node(self, node_id: str) -> dict[str, str] | None: + """Get node by its label identifier, return only node properties + + Args: + node_id: The node label to look up + + Returns: + dict: Node properties if found + None: If node not found + + Raises: + ValueError: If node_id is invalid + Exception: If there is an error executing the query + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + query = ( + f"MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) RETURN n" + ) + result = await session.run(query, entity_id=node_id) + try: + records = await result.fetch( + 2 + ) # Get 2 records for duplication check + + if len(records) > 1: + logger.warning( + f"[{self.workspace}] Multiple nodes found with label '{node_id}'. Using first node." + ) + if records: + node = records[0]["n"] + node_dict = dict(node) + # Remove workspace label from labels list if it exists + if "labels" in node_dict: + node_dict["labels"] = [ + label + for label in node_dict["labels"] + if label != workspace_label + ] + # logger.debug(f"Neo4j query node {query} return: {node_dict}") + return node_dict + return None + finally: + await result.consume() # Ensure result is fully consumed + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting node for {node_id}: {str(e)}" + ) + raise + + async def get_nodes_batch(self, node_ids: list[str]) -> dict[str, dict]: + """ + Retrieve multiple nodes in one query using UNWIND. + + Args: + node_ids: List of node entity IDs to fetch. + + Returns: + A dictionary mapping each node_id to its node data (or None if not found). + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + UNWIND $node_ids AS id + MATCH (n:`{workspace_label}` {{entity_id: id}}) + RETURN n.entity_id AS entity_id, n + """ + result = await session.run(query, node_ids=node_ids) + nodes = {} + async for record in result: + entity_id = record["entity_id"] + node = record["n"] + node_dict = dict(node) + # Remove the workspace label if present in a 'labels' property + if "labels" in node_dict: + node_dict["labels"] = [ + label + for label in node_dict["labels"] + if label != workspace_label + ] + nodes[entity_id] = node_dict + await result.consume() # Make sure to consume the result fully + return nodes + + async def node_degree(self, node_id: str) -> int: + """Get the degree (number of relationships) of a node with the given label. + If multiple nodes have the same label, returns the degree of the first node. + If no node is found, returns 0. + + Args: + node_id: The label of the node + + Returns: + int: The number of relationships the node has, or 0 if no node found + + Raises: + ValueError: If node_id is invalid + Exception: If there is an error executing the query + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + query = f""" + MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + OPTIONAL MATCH (n)-[r]-() + RETURN COUNT(r) AS degree + """ + result = await session.run(query, entity_id=node_id) + try: + record = await result.single() + + if not record: + logger.warning( + f"[{self.workspace}] No node found with label '{node_id}'" + ) + return 0 + + degree = record["degree"] + # logger.debug( + # f"[{self.workspace}] Neo4j query node degree for {node_id} return: {degree}" + # ) + return degree + finally: + await result.consume() # Ensure result is fully consumed + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting node degree for {node_id}: {str(e)}" + ) + raise + + async def node_degrees_batch(self, node_ids: list[str]) -> dict[str, int]: + """ + Retrieve the degree for multiple nodes in a single query using UNWIND. + + Args: + node_ids: List of node labels (entity_id values) to look up. + + Returns: + A dictionary mapping each node_id to its degree (number of relationships). + If a node is not found, its degree will be set to 0. + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + UNWIND $node_ids AS id + MATCH (n:`{workspace_label}` {{entity_id: id}}) + RETURN n.entity_id AS entity_id, count {{ (n)--() }} AS degree; + """ + result = await session.run(query, node_ids=node_ids) + degrees = {} + async for record in result: + entity_id = record["entity_id"] + degrees[entity_id] = record["degree"] + await result.consume() # Ensure result is fully consumed + + # For any node_id that did not return a record, set degree to 0. + for nid in node_ids: + if nid not in degrees: + logger.warning( + f"[{self.workspace}] No node found with label '{nid}'" + ) + degrees[nid] = 0 + + # logger.debug(f"[{self.workspace}] Neo4j batch node degree query returned: {degrees}") + return degrees + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + """Get the total degree (sum of relationships) of two nodes. + + Args: + src_id: Label of the source node + tgt_id: Label of the target node + + Returns: + int: Sum of the degrees of both nodes + """ + src_degree = await self.node_degree(src_id) + trg_degree = await self.node_degree(tgt_id) + + # Convert None to 0 for addition + src_degree = 0 if src_degree is None else src_degree + trg_degree = 0 if trg_degree is None else trg_degree + + degrees = int(src_degree) + int(trg_degree) + return degrees + + async def edge_degrees_batch( + self, edge_pairs: list[tuple[str, str]] + ) -> dict[tuple[str, str], int]: + """ + Calculate the combined degree for each edge (sum of the source and target node degrees) + in batch using the already implemented node_degrees_batch. + + Args: + edge_pairs: List of (src, tgt) tuples. + + Returns: + A dictionary mapping each (src, tgt) tuple to the sum of their degrees. + """ + # Collect unique node IDs from all edge pairs. + unique_node_ids = {src for src, _ in edge_pairs} + unique_node_ids.update({tgt for _, tgt in edge_pairs}) + + # Get degrees for all nodes in one go. + degrees = await self.node_degrees_batch(list(unique_node_ids)) + + # Sum up degrees for each edge pair. + edge_degrees = {} + for src, tgt in edge_pairs: + edge_degrees[(src, tgt)] = degrees.get(src, 0) + degrees.get(tgt, 0) + return edge_degrees + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + """Get edge properties between two nodes. + + Args: + source_node_id: Label of the source node + target_node_id: Label of the target node + + Returns: + dict: Edge properties if found, default properties if not found or on error + + Raises: + ValueError: If either node_id is invalid + Exception: If there is an error executing the query + """ + workspace_label = self._get_workspace_label() + try: + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (start:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(end:`{workspace_label}` {{entity_id: $target_entity_id}}) + RETURN properties(r) as edge_properties + """ + result = await session.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + ) + try: + records = await result.fetch(2) + + if len(records) > 1: + logger.warning( + f"[{self.workspace}] Multiple edges found between '{source_node_id}' and '{target_node_id}'. Using first edge." + ) + if records: + try: + edge_result = dict(records[0]["edge_properties"]) + # logger.debug(f"Result: {edge_result}") + # Ensure required keys exist with defaults + required_keys = { + "weight": 1.0, + "source_id": None, + "description": None, + "keywords": None, + } + for key, default_value in required_keys.items(): + if key not in edge_result: + edge_result[key] = default_value + logger.warning( + f"[{self.workspace}] Edge between {source_node_id} and {target_node_id} " + f"missing {key}, using default: {default_value}" + ) + + # logger.debug( + # f"{inspect.currentframe().f_code.co_name}:query:{query}:result:{edge_result}" + # ) + return edge_result + except (KeyError, TypeError, ValueError) as e: + logger.error( + f"[{self.workspace}] Error processing edge properties between {source_node_id} " + f"and {target_node_id}: {str(e)}" + ) + # Return default edge properties on error + return { + "weight": 1.0, + "source_id": None, + "description": None, + "keywords": None, + } + + # logger.debug( + # f"{inspect.currentframe().f_code.co_name}: No edge found between {source_node_id} and {target_node_id}" + # ) + # Return None when no edge found + return None + finally: + await result.consume() # Ensure result is fully consumed + + except Exception as e: + logger.error( + f"[{self.workspace}] Error in get_edge between {source_node_id} and {target_node_id}: {str(e)}" + ) + raise + + async def get_edges_batch( + self, pairs: list[dict[str, str]] + ) -> dict[tuple[str, str], dict]: + """ + Retrieve edge properties for multiple (src, tgt) pairs in one query. + + Args: + pairs: List of dictionaries, e.g. [{"src": "node1", "tgt": "node2"}, ...] + + Returns: + A dictionary mapping (src, tgt) tuples to their edge properties. + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + UNWIND $pairs AS pair + MATCH (start:`{workspace_label}` {{entity_id: pair.src}})-[r:DIRECTED]-(end:`{workspace_label}` {{entity_id: pair.tgt}}) + RETURN pair.src AS src_id, pair.tgt AS tgt_id, collect(properties(r)) AS edges + """ + result = await session.run(query, pairs=pairs) + edges_dict = {} + async for record in result: + src = record["src_id"] + tgt = record["tgt_id"] + edges = record["edges"] + if edges and len(edges) > 0: + edge_props = edges[0] # choose the first if multiple exist + # Ensure required keys exist with defaults + for key, default in { + "weight": 1.0, + "source_id": None, + "description": None, + "keywords": None, + }.items(): + if key not in edge_props: + edge_props[key] = default + edges_dict[(src, tgt)] = edge_props + else: + # No edge found – set default edge properties + edges_dict[(src, tgt)] = { + "weight": 1.0, + "source_id": None, + "description": None, + "keywords": None, + } + await result.consume() + return edges_dict + + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + """Retrieves all edges (relationships) for a particular node identified by its label. + + Args: + source_node_id: Label of the node to get edges for + + Returns: + list[tuple[str, str]]: List of (source_label, target_label) tuples representing edges + None: If no edges found + + Raises: + ValueError: If source_node_id is invalid + Exception: If there is an error executing the query + """ + try: + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + results = None + try: + workspace_label = self._get_workspace_label() + query = f"""MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + OPTIONAL MATCH (n)-[r]-(connected:`{workspace_label}`) + WHERE connected.entity_id IS NOT NULL + RETURN n, r, connected""" + results = await session.run(query, entity_id=source_node_id) + + edges = [] + async for record in results: + source_node = record["n"] + connected_node = record["connected"] + + # Skip if either node is None + if not source_node or not connected_node: + continue + + source_label = ( + source_node.get("entity_id") + if source_node.get("entity_id") + else None + ) + target_label = ( + connected_node.get("entity_id") + if connected_node.get("entity_id") + else None + ) + + if source_label and target_label: + edges.append((source_label, target_label)) + + await results.consume() # Ensure results are consumed + return edges + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting edges for node {source_node_id}: {str(e)}" + ) + if results is not None: + await ( + results.consume() + ) # Ensure results are consumed even on error + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Error in get_node_edges for {source_node_id}: {str(e)}" + ) + raise + + async def get_nodes_edges_batch( + self, node_ids: list[str] + ) -> dict[str, list[tuple[str, str]]]: + """ + Batch retrieve edges for multiple nodes in one query using UNWIND. + For each node, returns both outgoing and incoming edges to properly represent + the undirected graph nature. + + Args: + node_ids: List of node IDs (entity_id) for which to retrieve edges. + + Returns: + A dictionary mapping each node ID to its list of edge tuples (source, target). + For each node, the list includes both: + - Outgoing edges: (queried_node, connected_node) + - Incoming edges: (connected_node, queried_node) + """ + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + # Query to get both outgoing and incoming edges + workspace_label = self._get_workspace_label() + query = f""" + UNWIND $node_ids AS id + MATCH (n:`{workspace_label}` {{entity_id: id}}) + OPTIONAL MATCH (n)-[r]-(connected:`{workspace_label}`) + RETURN id AS queried_id, n.entity_id AS node_entity_id, + connected.entity_id AS connected_entity_id, + startNode(r).entity_id AS start_entity_id + """ + result = await session.run(query, node_ids=node_ids) + + # Initialize the dictionary with empty lists for each node ID + edges_dict = {node_id: [] for node_id in node_ids} + + # Process results to include both outgoing and incoming edges + async for record in result: + queried_id = record["queried_id"] + node_entity_id = record["node_entity_id"] + connected_entity_id = record["connected_entity_id"] + start_entity_id = record["start_entity_id"] + + # Skip if either node is None + if not node_entity_id or not connected_entity_id: + continue + + # Determine the actual direction of the edge + # If the start node is the queried node, it's an outgoing edge + # Otherwise, it's an incoming edge + if start_entity_id == node_entity_id: + # Outgoing edge: (queried_node -> connected_node) + edges_dict[queried_id].append((node_entity_id, connected_entity_id)) + else: + # Incoming edge: (connected_node -> queried_node) + edges_dict[queried_id].append((connected_entity_id, node_entity_id)) + + await result.consume() # Ensure results are fully consumed + return edges_dict + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + ( + neo4jExceptions.ServiceUnavailable, + neo4jExceptions.TransientError, + neo4jExceptions.WriteServiceUnavailable, + neo4jExceptions.ClientError, + neo4jExceptions.SessionExpired, + ConnectionResetError, + OSError, + ) + ), + ) + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """ + Upsert a node in the Neo4j database. + + Args: + node_id: The unique identifier for the node (used as label) + node_data: Dictionary of node properties + """ + workspace_label = self._get_workspace_label() + properties = node_data + entity_type = properties["entity_type"] + if "entity_id" not in properties: + raise ValueError("Neo4j: node properties must contain an 'entity_id' field") + + try: + async with self._driver.session(database=self._DATABASE) as session: + + async def execute_upsert(tx: AsyncManagedTransaction): + query = f""" + MERGE (n:`{workspace_label}` {{entity_id: $entity_id}}) + SET n += $properties + SET n:`{entity_type}` + """ + result = await tx.run( + query, entity_id=node_id, properties=properties + ) + await result.consume() # Ensure result is fully consumed + + await session.execute_write(execute_upsert) + except Exception as e: + logger.error(f"[{self.workspace}] Error during upsert: {str(e)}") + raise + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + ( + neo4jExceptions.ServiceUnavailable, + neo4jExceptions.TransientError, + neo4jExceptions.WriteServiceUnavailable, + neo4jExceptions.ClientError, + neo4jExceptions.SessionExpired, + ConnectionResetError, + OSError, + ) + ), + ) + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """ + Upsert an edge and its properties between two nodes identified by their labels. + Ensures both source and target nodes exist and are unique before creating the edge. + Uses entity_id property to uniquely identify nodes. + + Args: + source_node_id (str): Label of the source node (used as identifier) + target_node_id (str): Label of the target node (used as identifier) + edge_data (dict): Dictionary of properties to set on the edge + + Raises: + ValueError: If either source or target node does not exist or is not unique + """ + try: + edge_properties = edge_data + async with self._driver.session(database=self._DATABASE) as session: + + async def execute_upsert(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (source:`{workspace_label}` {{entity_id: $source_entity_id}}) + WITH source + MATCH (target:`{workspace_label}` {{entity_id: $target_entity_id}}) + MERGE (source)-[r:DIRECTED]-(target) + SET r += $properties + RETURN r, source, target + """ + result = await tx.run( + query, + source_entity_id=source_node_id, + target_entity_id=target_node_id, + properties=edge_properties, + ) + try: + await result.fetch(2) + finally: + await result.consume() # Ensure result is consumed + + await session.execute_write(execute_upsert) + except Exception as e: + logger.error(f"[{self.workspace}] Error during edge upsert: {str(e)}") + raise + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node, * means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maxiumu nodes to return by BFS, Defaults to 1000 + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + """ + # Get max_nodes from global_config if not provided + if max_nodes is None: + max_nodes = self.global_config.get("max_graph_nodes", 1000) + else: + # Limit max_nodes to not exceed global_config max_graph_nodes + max_nodes = min(max_nodes, self.global_config.get("max_graph_nodes", 1000)) + + workspace_label = self._get_workspace_label() + result = KnowledgeGraph() + seen_nodes = set() + seen_edges = set() + + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + try: + if node_label == "*": + # First check total node count to determine if graph is truncated + count_query = ( + f"MATCH (n:`{workspace_label}`) RETURN count(n) as total" + ) + count_result = None + try: + count_result = await session.run(count_query) + count_record = await count_result.single() + + if count_record and count_record["total"] > max_nodes: + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: {count_record['total']} nodes found, limited to {max_nodes}" + ) + finally: + if count_result: + await count_result.consume() + + # Run main query to get nodes with highest degree + main_query = f""" + MATCH (n:`{workspace_label}`) + OPTIONAL MATCH (n)-[r]-() + WITH n, COALESCE(count(r), 0) AS degree + ORDER BY degree DESC + LIMIT $max_nodes + WITH collect({{node: n}}) AS filtered_nodes + UNWIND filtered_nodes AS node_info + WITH collect(node_info.node) AS kept_nodes, filtered_nodes + OPTIONAL MATCH (a)-[r]-(b) + WHERE a IN kept_nodes AND b IN kept_nodes + RETURN filtered_nodes AS node_info, + collect(DISTINCT r) AS relationships + """ + result_set = None + try: + result_set = await session.run( + main_query, + {"max_nodes": max_nodes}, + ) + record = await result_set.single() + finally: + if result_set: + await result_set.consume() + + else: + # return await self._robust_fallback(node_label, max_depth, max_nodes) + # First try without limit to check if we need to truncate + full_query = f""" + MATCH (start:`{workspace_label}`) + WHERE start.entity_id = $entity_id + WITH start + CALL apoc.path.subgraphAll(start, {{ + relationshipFilter: '', + labelFilter: '{workspace_label}', + minLevel: 0, + maxLevel: $max_depth, + bfs: true + }}) + YIELD nodes, relationships + WITH nodes, relationships, size(nodes) AS total_nodes + UNWIND nodes AS node + WITH collect({{node: node}}) AS node_info, relationships, total_nodes + RETURN node_info, relationships, total_nodes + """ + + # Try to get full result + full_result = None + try: + full_result = await session.run( + full_query, + { + "entity_id": node_label, + "max_depth": max_depth, + }, + ) + full_record = await full_result.single() + + # If no record found, return empty KnowledgeGraph + if not full_record: + logger.debug( + f"[{self.workspace}] No nodes found for entity_id: {node_label}" + ) + return result + + # If record found, check node count + total_nodes = full_record["total_nodes"] + + if total_nodes <= max_nodes: + # If node count is within limit, use full result directly + logger.debug( + f"[{self.workspace}] Using full result with {total_nodes} nodes (no truncation needed)" + ) + record = full_record + else: + # If node count exceeds limit, set truncated flag and run limited query + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: {total_nodes} nodes found, breadth-first search limited to {max_nodes}" + ) + + # Run limited query + limited_query = f""" + MATCH (start:`{workspace_label}`) + WHERE start.entity_id = $entity_id + WITH start + CALL apoc.path.subgraphAll(start, {{ + relationshipFilter: '', + labelFilter: '{workspace_label}', + minLevel: 0, + maxLevel: $max_depth, + limit: $max_nodes, + bfs: true + }}) + YIELD nodes, relationships + UNWIND nodes AS node + WITH collect({{node: node}}) AS node_info, relationships + RETURN node_info, relationships + """ + result_set = None + try: + result_set = await session.run( + limited_query, + { + "entity_id": node_label, + "max_depth": max_depth, + "max_nodes": max_nodes, + }, + ) + record = await result_set.single() + finally: + if result_set: + await result_set.consume() + finally: + if full_result: + await full_result.consume() + + if record: + # Handle nodes (compatible with multi-label cases) + for node_info in record["node_info"]: + node = node_info["node"] + node_id = node.id + if node_id not in seen_nodes: + result.nodes.append( + KnowledgeGraphNode( + id=f"{node_id}", + labels=[node.get("entity_id")], + properties=dict(node), + ) + ) + seen_nodes.add(node_id) + + # Handle relationships (including direction information) + for rel in record["relationships"]: + edge_id = rel.id + if edge_id not in seen_edges: + start = rel.start_node + end = rel.end_node + result.edges.append( + KnowledgeGraphEdge( + id=f"{edge_id}", + type=rel.type, + source=f"{start.id}", + target=f"{end.id}", + properties=dict(rel), + ) + ) + seen_edges.add(edge_id) + + logger.info( + f"[{self.workspace}] Subgraph query successful | Node count: {len(result.nodes)} | Edge count: {len(result.edges)}" + ) + + except neo4jExceptions.ClientError as e: + logger.warning(f"[{self.workspace}] APOC plugin error: {str(e)}") + if node_label != "*": + logger.warning( + f"[{self.workspace}] Neo4j: falling back to basic Cypher recursive search..." + ) + return await self._robust_fallback(node_label, max_depth, max_nodes) + else: + logger.warning( + f"[{self.workspace}] Neo4j: APOC plugin error with wildcard query, returning empty result" + ) + + return result + + async def _robust_fallback( + self, node_label: str, max_depth: int, max_nodes: int + ) -> KnowledgeGraph: + """ + Fallback implementation when APOC plugin is not available or incompatible. + This method implements the same functionality as get_knowledge_graph but uses + only basic Cypher queries and true breadth-first traversal instead of APOC procedures. + """ + from collections import deque + + result = KnowledgeGraph() + visited_nodes = set() + visited_edges = set() + visited_edge_pairs = set() + + # Get the starting node's data + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + RETURN id(n) as node_id, n + """ + node_result = await session.run(query, entity_id=node_label) + try: + node_record = await node_result.single() + if not node_record: + return result + + # Create initial KnowledgeGraphNode + start_node = KnowledgeGraphNode( + id=f"{node_record['n'].get('entity_id')}", + labels=[node_record["n"].get("entity_id")], + properties=dict(node_record["n"]._properties), + ) + finally: + await node_result.consume() # Ensure results are consumed + + # Initialize queue for BFS with (node, edge, depth) tuples + # edge is None for the starting node + queue = deque([(start_node, None, 0)]) + + # True BFS implementation using a queue + while queue and len(visited_nodes) < max_nodes: + # Dequeue the next node to process + current_node, current_edge, current_depth = queue.popleft() + + # Skip if already visited or exceeds max depth + if current_node.id in visited_nodes: + continue + + if current_depth > max_depth: + logger.debug( + f"[{self.workspace}] Skipping node at depth {current_depth} (max_depth: {max_depth})" + ) + continue + + # Add current node to result + result.nodes.append(current_node) + visited_nodes.add(current_node.id) + + # Add edge to result if it exists and not already added + if current_edge and current_edge.id not in visited_edges: + result.edges.append(current_edge) + visited_edges.add(current_edge.id) + + # Stop if we've reached the node limit + if len(visited_nodes) >= max_nodes: + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: breadth-first search limited to: {max_nodes} nodes" + ) + break + + # Get all edges and target nodes for the current node (even at max_depth) + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + workspace_label = self._get_workspace_label() + query = f""" + MATCH (a:`{workspace_label}` {{entity_id: $entity_id}})-[r]-(b) + WITH r, b, id(r) as edge_id, id(b) as target_id + RETURN r, b, edge_id, target_id + """ + results = await session.run(query, entity_id=current_node.id) + + # Get all records and release database connection + records = await results.fetch(1000) # Max neighbor nodes we can handle + await results.consume() # Ensure results are consumed + + # Process all neighbors - capture all edges but only queue unvisited nodes + for record in records: + rel = record["r"] + edge_id = str(record["edge_id"]) + + if edge_id not in visited_edges: + b_node = record["b"] + target_id = b_node.get("entity_id") + + if target_id: # Only process if target node has entity_id + # Create KnowledgeGraphNode for target + target_node = KnowledgeGraphNode( + id=f"{target_id}", + labels=[target_id], + properties=dict(b_node._properties), + ) + + # Create KnowledgeGraphEdge + target_edge = KnowledgeGraphEdge( + id=f"{edge_id}", + type=rel.type, + source=f"{current_node.id}", + target=f"{target_id}", + properties=dict(rel), + ) + + # Sort source_id and target_id to ensure (A,B) and (B,A) are treated as the same edge + sorted_pair = tuple(sorted([current_node.id, target_id])) + + # Check if the same edge already exists (considering undirectedness) + if sorted_pair not in visited_edge_pairs: + # Only add the edge if the target node is already in the result or will be added + if target_id in visited_nodes or ( + target_id not in visited_nodes + and current_depth < max_depth + ): + result.edges.append(target_edge) + visited_edges.add(edge_id) + visited_edge_pairs.add(sorted_pair) + + # Only add unvisited nodes to the queue for further expansion + if target_id not in visited_nodes: + # Only add to queue if we're not at max depth yet + if current_depth < max_depth: + # Add node to queue with incremented depth + # Edge is already added to result, so we pass None as edge + queue.append((target_node, None, current_depth + 1)) + else: + # At max depth, we've already added the edge but we don't add the node + # This prevents adding nodes beyond max_depth to the result + logger.debug( + f"[{self.workspace}] Node {target_id} beyond max depth {max_depth}, edge added but node not included" + ) + else: + # If target node already exists in result, we don't need to add it again + logger.debug( + f"[{self.workspace}] Node {target_id} already visited, edge added but node not queued" + ) + else: + logger.warning( + f"[{self.workspace}] Skipping edge {edge_id} due to missing entity_id on target node" + ) + + logger.info( + f"[{self.workspace}] BFS subgraph query successful | Node count: {len(result.nodes)} | Edge count: {len(result.edges)}" + ) + return result + + async def get_all_labels(self) -> list[str]: + """ + Get all existing node labels in the database + Returns: + ["Person", "Company", ...] # Alphabetically sorted label list + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + # Method 1: Direct metadata query (Available for Neo4j 4.3+) + # query = "CALL db.labels() YIELD label RETURN label" + + # Method 2: Query compatible with older versions + query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + RETURN DISTINCT n.entity_id AS label + ORDER BY label + """ + result = await session.run(query) + labels = [] + try: + async for record in result: + labels.append(record["label"]) + finally: + await ( + result.consume() + ) # Ensure results are consumed even if processing fails + return labels + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + ( + neo4jExceptions.ServiceUnavailable, + neo4jExceptions.TransientError, + neo4jExceptions.WriteServiceUnavailable, + neo4jExceptions.ClientError, + neo4jExceptions.SessionExpired, + ConnectionResetError, + OSError, + ) + ), + ) + async def delete_node(self, node_id: str) -> None: + """Delete a node with the specified label + + Args: + node_id: The label of the node to delete + """ + + async def _do_delete(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (n:`{workspace_label}` {{entity_id: $entity_id}}) + DETACH DELETE n + """ + result = await tx.run(query, entity_id=node_id) + logger.debug(f"[{self.workspace}] Deleted node with label '{node_id}'") + await result.consume() # Ensure result is fully consumed + + try: + async with self._driver.session(database=self._DATABASE) as session: + await session.execute_write(_do_delete) + except Exception as e: + logger.error(f"[{self.workspace}] Error during node deletion: {str(e)}") + raise + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + ( + neo4jExceptions.ServiceUnavailable, + neo4jExceptions.TransientError, + neo4jExceptions.WriteServiceUnavailable, + neo4jExceptions.ClientError, + neo4jExceptions.SessionExpired, + ConnectionResetError, + OSError, + ) + ), + ) + async def remove_nodes(self, nodes: list[str]): + """Delete multiple nodes + + Args: + nodes: List of node labels to be deleted + """ + for node in nodes: + await self.delete_node(node) + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + ( + neo4jExceptions.ServiceUnavailable, + neo4jExceptions.TransientError, + neo4jExceptions.WriteServiceUnavailable, + neo4jExceptions.ClientError, + neo4jExceptions.SessionExpired, + ConnectionResetError, + OSError, + ) + ), + ) + async def remove_edges(self, edges: list[tuple[str, str]]): + """Delete multiple edges + + Args: + edges: List of edges to be deleted, each edge is a (source, target) tuple + """ + for source, target in edges: + + async def _do_delete_edge(tx: AsyncManagedTransaction): + workspace_label = self._get_workspace_label() + query = f""" + MATCH (source:`{workspace_label}` {{entity_id: $source_entity_id}})-[r]-(target:`{workspace_label}` {{entity_id: $target_entity_id}}) + DELETE r + """ + result = await tx.run( + query, source_entity_id=source, target_entity_id=target + ) + logger.debug( + f"[{self.workspace}] Deleted edge from '{source}' to '{target}'" + ) + await result.consume() # Ensure result is fully consumed + + try: + async with self._driver.session(database=self._DATABASE) as session: + await session.execute_write(_do_delete_edge) + except Exception as e: + logger.error(f"[{self.workspace}] Error during edge deletion: {str(e)}") + raise + + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (n:`{workspace_label}`) + RETURN n + """ + result = await session.run(query) + nodes = [] + async for record in result: + node = record["n"] + node_dict = dict(node) + # Add node id (entity_id) to the dictionary for easier access + node_dict["id"] = node_dict.get("entity_id") + nodes.append(node_dict) + await result.consume() + return nodes + + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + query = f""" + MATCH (a:`{workspace_label}`)-[r]-(b:`{workspace_label}`) + RETURN DISTINCT a.entity_id AS source, b.entity_id AS target, properties(r) AS properties + """ + result = await session.run(query) + edges = [] + async for record in result: + edge_properties = record["properties"] + edge_properties["source"] = record["source"] + edge_properties["target"] = record["target"] + edges.append(edge_properties) + await result.consume() + return edges + + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """Get popular labels by node degree (most connected entities) + + Args: + limit: Maximum number of labels to return + + Returns: + List of labels sorted by degree (highest first) + """ + workspace_label = self._get_workspace_label() + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + result = None + try: + query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + OPTIONAL MATCH (n)-[r]-() + WITH n.entity_id AS label, count(r) AS degree + ORDER BY degree DESC, label ASC + LIMIT $limit + RETURN label + """ + result = await session.run(query, limit=limit) + labels = [] + async for record in result: + labels.append(record["label"]) + await result.consume() + + logger.debug( + f"[{self.workspace}] Retrieved {len(labels)} popular labels (limit: {limit})" + ) + return labels + except Exception as e: + logger.error( + f"[{self.workspace}] Error getting popular labels: {str(e)}" + ) + if result is not None: + await result.consume() + raise + + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """ + Search labels with fuzzy matching, using a full-text index for performance if available. + Enhanced with Chinese text support using CJK analyzer. + Falls back to a slower CONTAINS search if the index is not available or fails. + """ + workspace_label = self._get_workspace_label() + query_strip = query.strip() + if not query_strip: + return [] + + query_lower = query_strip.lower() + is_chinese = self._is_chinese_text(query_strip) + index_name = "entity_id_fulltext_idx" + + # Attempt to use the full-text index first + try: + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + if is_chinese: + # For Chinese text, use different search strategies + cypher_query = f""" + CALL db.index.fulltext.queryNodes($index_name, $search_query) YIELD node, score + WITH node, score + WHERE node:`{workspace_label}` + WITH node.entity_id AS label, score + WITH label, score, + CASE + WHEN label = $query_strip THEN score + 1000 + WHEN label CONTAINS $query_strip THEN score + 500 + ELSE score + END AS final_score + RETURN label + ORDER BY final_score DESC, label ASC + LIMIT $limit + """ + # For Chinese, don't add wildcard as it may not work properly with CJK analyzer + search_query = query_strip + else: + # For non-Chinese text, use the original logic with wildcard + cypher_query = f""" + CALL db.index.fulltext.queryNodes($index_name, $search_query) YIELD node, score + WITH node, score + WHERE node:`{workspace_label}` + WITH node.entity_id AS label, toLower(node.entity_id) AS label_lower, score + WITH label, label_lower, score, + CASE + WHEN label_lower = $query_lower THEN score + 1000 + WHEN label_lower STARTS WITH $query_lower THEN score + 500 + WHEN label_lower CONTAINS ' ' + $query_lower OR label_lower CONTAINS '_' + $query_lower THEN score + 50 + ELSE score + END AS final_score + RETURN label + ORDER BY final_score DESC, label ASC + LIMIT $limit + """ + search_query = f"{query_strip}*" + + result = await session.run( + cypher_query, + index_name=index_name, + search_query=search_query, + query_lower=query_lower, + query_strip=query_strip, + limit=limit, + ) + labels = [record["label"] async for record in result] + await result.consume() + + logger.debug( + f"[{self.workspace}] Full-text search ({'Chinese' if is_chinese else 'Latin'}) for '{query}' returned {len(labels)} results (limit: {limit})" + ) + return labels + + except Exception as e: + # If the full-text search fails, fall back to CONTAINS search + logger.warning( + f"[{self.workspace}] Full-text search failed with error: {str(e)}. " + "Falling back to slower, non-indexed search." + ) + + # Enhanced fallback implementation + async with self._driver.session( + database=self._DATABASE, default_access_mode="READ" + ) as session: + if is_chinese: + # For Chinese text, use direct CONTAINS without case conversion + cypher_query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + WITH n.entity_id AS label + WHERE label CONTAINS $query_strip + WITH label, + CASE + WHEN label = $query_strip THEN 1000 + WHEN label STARTS WITH $query_strip THEN 500 + ELSE 100 - size(label) + END AS score + ORDER BY score DESC, label ASC + LIMIT $limit + RETURN label + """ + result = await session.run( + cypher_query, query_strip=query_strip, limit=limit + ) + else: + # For non-Chinese text, use the original fallback logic + cypher_query = f""" + MATCH (n:`{workspace_label}`) + WHERE n.entity_id IS NOT NULL + WITH n.entity_id AS label, toLower(n.entity_id) AS label_lower + WHERE label_lower CONTAINS $query_lower + WITH label, label_lower, + CASE + WHEN label_lower = $query_lower THEN 1000 + WHEN label_lower STARTS WITH $query_lower THEN 500 + ELSE 100 - size(label) + END AS score + ORDER BY score DESC, label ASC + LIMIT $limit + RETURN label + """ + result = await session.run( + cypher_query, query_lower=query_lower, limit=limit + ) + + labels = [record["label"] async for record in result] + await result.consume() + logger.debug( + f"[{self.workspace}] Fallback search ({'Chinese' if is_chinese else 'Latin'}) for '{query}' returned {len(labels)} results (limit: {limit})" + ) + return labels + + async def drop(self) -> dict[str, str]: + """Drop all data from current workspace storage and clean up resources + + This method will delete all nodes and relationships in the current workspace only. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "workspace data dropped"} + - On failure: {"status": "error", "message": ""} + """ + async with get_graph_db_lock(): + workspace_label = self._get_workspace_label() + try: + async with self._driver.session(database=self._DATABASE) as session: + # Delete all nodes and relationships in current workspace only + query = f"MATCH (n:`{workspace_label}`) DETACH DELETE n" + result = await session.run(query) + await result.consume() # Ensure result is fully consumed + + # logger.debug( + # f"[{self.workspace}] Process {os.getpid()} drop Neo4j workspace '{workspace_label}' in database {self._DATABASE}" + # ) + return { + "status": "success", + "message": f"workspace '{workspace_label}' data dropped", + } + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping Neo4j workspace '{workspace_label}' in database {self._DATABASE}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/networkx_impl.py b/LightRAG/lightrag/kg/networkx_impl.py new file mode 100644 index 00000000..48a2d2af --- /dev/null +++ b/LightRAG/lightrag/kg/networkx_impl.py @@ -0,0 +1,567 @@ +import os +from dataclasses import dataclass +from typing import final + +from lightrag.types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge +from lightrag.utils import logger +from lightrag.base import BaseGraphStorage +import networkx as nx +from .shared_storage import ( + get_storage_lock, + get_update_flag, + set_all_update_flags, +) + +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +@final +@dataclass +class NetworkXStorage(BaseGraphStorage): + @staticmethod + def load_nx_graph(file_name) -> nx.Graph: + if os.path.exists(file_name): + return nx.read_graphml(file_name) + return None + + @staticmethod + def write_nx_graph(graph: nx.Graph, file_name, workspace="_"): + logger.info( + f"[{workspace}] Writing graph with {graph.number_of_nodes()} nodes, {graph.number_of_edges()} edges" + ) + nx.write_graphml(graph, file_name) + + def __post_init__(self): + working_dir = self.global_config["working_dir"] + if self.workspace: + # Include workspace in the file path for data isolation + workspace_dir = os.path.join(working_dir, self.workspace) + self.final_namespace = f"{self.workspace}_{self.namespace}" + else: + # Default behavior when workspace is empty + self.final_namespace = self.namespace + workspace_dir = working_dir + self.workspace = "_" + + os.makedirs(workspace_dir, exist_ok=True) + self._graphml_xml_file = os.path.join( + workspace_dir, f"graph_{self.namespace}.graphml" + ) + self._storage_lock = None + self.storage_updated = None + self._graph = None + + # Load initial graph + preloaded_graph = NetworkXStorage.load_nx_graph(self._graphml_xml_file) + if preloaded_graph is not None: + logger.info( + f"[{self.workspace}] Loaded graph from {self._graphml_xml_file} with {preloaded_graph.number_of_nodes()} nodes, {preloaded_graph.number_of_edges()} edges" + ) + else: + logger.info( + f"[{self.workspace}] Created new empty graph file: {self._graphml_xml_file}" + ) + self._graph = preloaded_graph or nx.Graph() + + async def initialize(self): + """Initialize storage data""" + # Get the update flag for cross-process update notification + self.storage_updated = await get_update_flag(self.final_namespace) + # Get the storage lock for use in other methods + self._storage_lock = get_storage_lock() + + async def _get_graph(self): + """Check if the storage should be reloaded""" + # Acquire lock to prevent concurrent read and write + async with self._storage_lock: + # Check if data needs to be reloaded + if self.storage_updated.value: + logger.info( + f"[{self.workspace}] Process {os.getpid()} reloading graph {self._graphml_xml_file} due to modifications by another process" + ) + # Reload data + self._graph = ( + NetworkXStorage.load_nx_graph(self._graphml_xml_file) or nx.Graph() + ) + # Reset update flag + self.storage_updated.value = False + + return self._graph + + async def has_node(self, node_id: str) -> bool: + graph = await self._get_graph() + return graph.has_node(node_id) + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + graph = await self._get_graph() + return graph.has_edge(source_node_id, target_node_id) + + async def get_node(self, node_id: str) -> dict[str, str] | None: + graph = await self._get_graph() + return graph.nodes.get(node_id) + + async def node_degree(self, node_id: str) -> int: + graph = await self._get_graph() + return graph.degree(node_id) + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + graph = await self._get_graph() + src_degree = graph.degree(src_id) if graph.has_node(src_id) else 0 + tgt_degree = graph.degree(tgt_id) if graph.has_node(tgt_id) else 0 + return src_degree + tgt_degree + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + graph = await self._get_graph() + return graph.edges.get((source_node_id, target_node_id)) + + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + graph = await self._get_graph() + if graph.has_node(source_node_id): + return list(graph.edges(source_node_id)) + return None + + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + graph = await self._get_graph() + graph.add_node(node_id, **node_data) + + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + graph = await self._get_graph() + graph.add_edge(source_node_id, target_node_id, **edge_data) + + async def delete_node(self, node_id: str) -> None: + """ + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + """ + graph = await self._get_graph() + if graph.has_node(node_id): + graph.remove_node(node_id) + logger.debug(f"[{self.workspace}] Node {node_id} deleted from the graph") + else: + logger.warning( + f"[{self.workspace}] Node {node_id} not found in the graph for deletion" + ) + + async def remove_nodes(self, nodes: list[str]): + """Delete multiple nodes + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + nodes: List of node IDs to be deleted + """ + graph = await self._get_graph() + for node in nodes: + if graph.has_node(node): + graph.remove_node(node) + + async def remove_edges(self, edges: list[tuple[str, str]]): + """Delete multiple edges + + Importance notes: + 1. Changes will be persisted to disk during the next index_done_callback + 2. Only one process should updating the storage at a time before index_done_callback, + KG-storage-log should be used to avoid data corruption + + Args: + edges: List of edges to be deleted, each edge is a (source, target) tuple + """ + graph = await self._get_graph() + for source, target in edges: + if graph.has_edge(source, target): + graph.remove_edge(source, target) + + async def get_all_labels(self) -> list[str]: + """ + Get all node labels in the graph + Returns: + [label1, label2, ...] # Alphabetically sorted label list + """ + graph = await self._get_graph() + labels = set() + for node in graph.nodes(): + labels.add(str(node)) # Add node id as a label + + # Return sorted list + return sorted(list(labels)) + + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """ + Get popular labels by node degree (most connected entities) + + Args: + limit: Maximum number of labels to return + + Returns: + List of labels sorted by degree (highest first) + """ + graph = await self._get_graph() + + # Get degrees of all nodes and sort by degree descending + degrees = dict(graph.degree()) + sorted_nodes = sorted(degrees.items(), key=lambda x: x[1], reverse=True) + + # Return top labels limited by the specified limit + popular_labels = [str(node) for node, _ in sorted_nodes[:limit]] + + logger.debug( + f"[{self.workspace}] Retrieved {len(popular_labels)} popular labels (limit: {limit})" + ) + + return popular_labels + + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """ + Search labels with fuzzy matching + + Args: + query: Search query string + limit: Maximum number of results to return + + Returns: + List of matching labels sorted by relevance + """ + graph = await self._get_graph() + query_lower = query.lower().strip() + + if not query_lower: + return [] + + # Collect matching nodes with relevance scores + matches = [] + for node in graph.nodes(): + node_str = str(node) + node_lower = node_str.lower() + + # Skip if no match + if query_lower not in node_lower: + continue + + # Calculate relevance score + # Exact match gets highest score + if node_lower == query_lower: + score = 1000 + # Prefix match gets high score + elif node_lower.startswith(query_lower): + score = 500 + # Contains match gets base score, with bonus for shorter strings + else: + # Shorter strings with matches are more relevant + score = 100 - len(node_str) + # Bonus for word boundary matches + if f" {query_lower}" in node_lower or f"_{query_lower}" in node_lower: + score += 50 + + matches.append((node_str, score)) + + # Sort by relevance score (desc) then alphabetically + matches.sort(key=lambda x: (-x[1], x[0])) + + # Return top matches limited by the specified limit + search_results = [match[0] for match in matches[:limit]] + + logger.debug( + f"[{self.workspace}] Search query '{query}' returned {len(search_results)} results (limit: {limit})" + ) + + return search_results + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node,* means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maxiumu nodes to return by BFS, Defaults to 1000 + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + """ + # Get max_nodes from global_config if not provided + if max_nodes is None: + max_nodes = self.global_config.get("max_graph_nodes", 1000) + else: + # Limit max_nodes to not exceed global_config max_graph_nodes + max_nodes = min(max_nodes, self.global_config.get("max_graph_nodes", 1000)) + + graph = await self._get_graph() + + result = KnowledgeGraph() + + # Handle special case for "*" label + if node_label == "*": + # Get degrees of all nodes + degrees = dict(graph.degree()) + # Sort nodes by degree in descending order and take top max_nodes + sorted_nodes = sorted(degrees.items(), key=lambda x: x[1], reverse=True) + + # Check if graph is truncated + if len(sorted_nodes) > max_nodes: + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: {len(sorted_nodes)} nodes found, limited to {max_nodes}" + ) + + limited_nodes = [node for node, _ in sorted_nodes[:max_nodes]] + # Create subgraph with the highest degree nodes + subgraph = graph.subgraph(limited_nodes) + else: + # Check if node exists + if node_label not in graph: + logger.warning( + f"[{self.workspace}] Node {node_label} not found in the graph" + ) + return KnowledgeGraph() # Return empty graph + + # Use modified BFS to get nodes, prioritizing high-degree nodes at the same depth + bfs_nodes = [] + visited = set() + # Store (node, depth, degree) in the queue + queue = [(node_label, 0, graph.degree(node_label))] + + # Flag to track if there are unexplored neighbors due to depth limit + has_unexplored_neighbors = False + + # Modified breadth-first search with degree-based prioritization + while queue and len(bfs_nodes) < max_nodes: + # Get the current depth from the first node in queue + current_depth = queue[0][1] + + # Collect all nodes at the current depth + current_level_nodes = [] + while queue and queue[0][1] == current_depth: + current_level_nodes.append(queue.pop(0)) + + # Sort nodes at current depth by degree (highest first) + current_level_nodes.sort(key=lambda x: x[2], reverse=True) + + # Process all nodes at current depth in order of degree + for current_node, depth, degree in current_level_nodes: + if current_node not in visited: + visited.add(current_node) + bfs_nodes.append(current_node) + + # Only explore neighbors if we haven't reached max_depth + if depth < max_depth: + # Add neighbor nodes to queue with incremented depth + neighbors = list(graph.neighbors(current_node)) + # Filter out already visited neighbors + unvisited_neighbors = [ + n for n in neighbors if n not in visited + ] + # Add neighbors to the queue with their degrees + for neighbor in unvisited_neighbors: + neighbor_degree = graph.degree(neighbor) + queue.append((neighbor, depth + 1, neighbor_degree)) + else: + # Check if there are unexplored neighbors (skipped due to depth limit) + neighbors = list(graph.neighbors(current_node)) + unvisited_neighbors = [ + n for n in neighbors if n not in visited + ] + if unvisited_neighbors: + has_unexplored_neighbors = True + + # Check if we've reached max_nodes + if len(bfs_nodes) >= max_nodes: + break + + # Check if graph is truncated - either due to max_nodes limit or depth limit + if (queue and len(bfs_nodes) >= max_nodes) or has_unexplored_neighbors: + if len(bfs_nodes) >= max_nodes: + result.is_truncated = True + logger.info( + f"[{self.workspace}] Graph truncated: max_nodes limit {max_nodes} reached" + ) + else: + logger.info( + f"[{self.workspace}] Graph truncated: found {len(bfs_nodes)} nodes within max_depth {max_depth}" + ) + + # Create subgraph with BFS discovered nodes + subgraph = graph.subgraph(bfs_nodes) + + # Add nodes to result + seen_nodes = set() + seen_edges = set() + for node in subgraph.nodes(): + if str(node) in seen_nodes: + continue + + node_data = dict(subgraph.nodes[node]) + # Get entity_type as labels + labels = [] + if "entity_type" in node_data: + if isinstance(node_data["entity_type"], list): + labels.extend(node_data["entity_type"]) + else: + labels.append(node_data["entity_type"]) + + # Create node with properties + node_properties = {k: v for k, v in node_data.items()} + + result.nodes.append( + KnowledgeGraphNode( + id=str(node), labels=[str(node)], properties=node_properties + ) + ) + seen_nodes.add(str(node)) + + # Add edges to result + for edge in subgraph.edges(): + source, target = edge + # Esure unique edge_id for undirect graph + if str(source) > str(target): + source, target = target, source + edge_id = f"{source}-{target}" + if edge_id in seen_edges: + continue + + edge_data = dict(subgraph.edges[edge]) + + # Create edge with complete information + result.edges.append( + KnowledgeGraphEdge( + id=edge_id, + type="DIRECTED", + source=str(source), + target=str(target), + properties=edge_data, + ) + ) + seen_edges.add(edge_id) + + logger.info( + f"[{self.workspace}] Subgraph query successful | Node count: {len(result.nodes)} | Edge count: {len(result.edges)}" + ) + return result + + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + """ + graph = await self._get_graph() + all_nodes = [] + for node_id, node_data in graph.nodes(data=True): + node_data_with_id = node_data.copy() + node_data_with_id["id"] = node_id + all_nodes.append(node_data_with_id) + return all_nodes + + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + """ + graph = await self._get_graph() + all_edges = [] + for u, v, edge_data in graph.edges(data=True): + edge_data_with_nodes = edge_data.copy() + edge_data_with_nodes["source"] = u + edge_data_with_nodes["target"] = v + all_edges.append(edge_data_with_nodes) + return all_edges + + async def index_done_callback(self) -> bool: + """Save data to disk""" + async with self._storage_lock: + # Check if storage was updated by another process + if self.storage_updated.value: + # Storage was updated by another process, reload data instead of saving + logger.info( + f"[{self.workspace}] Graph was updated by another process, reloading..." + ) + self._graph = ( + NetworkXStorage.load_nx_graph(self._graphml_xml_file) or nx.Graph() + ) + # Reset update flag + self.storage_updated.value = False + return False # Return error + + # Acquire lock and perform persistence + async with self._storage_lock: + try: + # Save data to disk + NetworkXStorage.write_nx_graph( + self._graph, self._graphml_xml_file, self.workspace + ) + # Notify other processes that data has been updated + await set_all_update_flags(self.final_namespace) + # Reset own update flag to avoid self-reloading + self.storage_updated.value = False + return True # Return success + except Exception as e: + logger.error(f"[{self.workspace}] Error saving graph: {e}") + return False # Return error + + return True + + async def drop(self) -> dict[str, str]: + """Drop all graph data from storage and clean up resources + + This method will: + 1. Remove the graph storage file if it exists + 2. Reset the graph to an empty state + 3. Update flags to notify other processes + 4. Changes is persisted to disk immediately + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + try: + async with self._storage_lock: + # delete _client_file_name + if os.path.exists(self._graphml_xml_file): + os.remove(self._graphml_xml_file) + self._graph = nx.Graph() + # Notify other processes that data has been updated + await set_all_update_flags(self.final_namespace) + # Reset own update flag to avoid self-reloading + self.storage_updated.value = False + logger.info( + f"[{self.workspace}] Process {os.getpid()} drop graph file:{self._graphml_xml_file}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping graph file:{self._graphml_xml_file}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/postgres_impl.py b/LightRAG/lightrag/kg/postgres_impl.py new file mode 100644 index 00000000..d043176e --- /dev/null +++ b/LightRAG/lightrag/kg/postgres_impl.py @@ -0,0 +1,5116 @@ +import asyncio +import json +import os +import re +import datetime +from datetime import timezone +from dataclasses import dataclass, field +from typing import Any, Awaitable, Callable, TypeVar, Union, final +import numpy as np +import configparser +import ssl +import itertools + +from lightrag.types import KnowledgeGraph, KnowledgeGraphNode, KnowledgeGraphEdge + +from tenacity import ( + AsyncRetrying, + RetryCallState, + retry, + retry_if_exception_type, + stop_after_attempt, + wait_exponential, + wait_fixed, +) + +from ..base import ( + BaseGraphStorage, + BaseKVStorage, + BaseVectorStorage, + DocProcessingStatus, + DocStatus, + DocStatusStorage, +) +from ..namespace import NameSpace, is_namespace +from ..utils import logger +from ..kg.shared_storage import get_data_init_lock, get_graph_db_lock, get_storage_lock + +import pipmaster as pm + +if not pm.is_installed("asyncpg"): + pm.install("asyncpg") + +import asyncpg # type: ignore +from asyncpg import Pool # type: ignore + +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +T = TypeVar("T") + + +class PostgreSQLDB: + def __init__(self, config: dict[str, Any], **kwargs: Any): + self.host = config["host"] + self.port = config["port"] + self.user = config["user"] + self.password = config["password"] + self.database = config["database"] + self.workspace = config["workspace"] + self.max = int(config["max_connections"]) + self.increment = 1 + self.pool: Pool | None = None + + # SSL configuration + self.ssl_mode = config.get("ssl_mode") + self.ssl_cert = config.get("ssl_cert") + self.ssl_key = config.get("ssl_key") + self.ssl_root_cert = config.get("ssl_root_cert") + self.ssl_crl = config.get("ssl_crl") + + # Vector configuration + self.vector_index_type = config.get("vector_index_type") + self.hnsw_m = config.get("hnsw_m") + self.hnsw_ef = config.get("hnsw_ef") + self.ivfflat_lists = config.get("ivfflat_lists") + + # Server settings + self.server_settings = config.get("server_settings") + + # Statement LRU cache size (keep as-is, allow None for optional configuration) + self.statement_cache_size = config.get("statement_cache_size") + + if self.user is None or self.password is None or self.database is None: + raise ValueError("Missing database user, password, or database") + + # Guard concurrent pool resets + self._pool_reconnect_lock = asyncio.Lock() + + self._transient_exceptions = ( + asyncio.TimeoutError, + TimeoutError, + ConnectionError, + OSError, + asyncpg.exceptions.InterfaceError, + asyncpg.exceptions.TooManyConnectionsError, + asyncpg.exceptions.CannotConnectNowError, + asyncpg.exceptions.PostgresConnectionError, + asyncpg.exceptions.ConnectionDoesNotExistError, + asyncpg.exceptions.ConnectionFailureError, + ) + + # Connection retry configuration + self.connection_retry_attempts = config["connection_retry_attempts"] + self.connection_retry_backoff = config["connection_retry_backoff"] + self.connection_retry_backoff_max = max( + self.connection_retry_backoff, + config["connection_retry_backoff_max"], + ) + self.pool_close_timeout = config["pool_close_timeout"] + logger.info( + "PostgreSQL, Retry config: attempts=%s, backoff=%.1fs, backoff_max=%.1fs, pool_close_timeout=%.1fs", + self.connection_retry_attempts, + self.connection_retry_backoff, + self.connection_retry_backoff_max, + self.pool_close_timeout, + ) + + def _create_ssl_context(self) -> ssl.SSLContext | None: + """Create SSL context based on configuration parameters.""" + if not self.ssl_mode: + return None + + ssl_mode = self.ssl_mode.lower() + + # For simple modes that don't require custom context + if ssl_mode in ["disable", "allow", "prefer", "require"]: + if ssl_mode == "disable": + return None + elif ssl_mode in ["require", "prefer", "allow"]: + # Return None for simple SSL requirement, handled in initdb + return None + + # For modes that require certificate verification + if ssl_mode in ["verify-ca", "verify-full"]: + try: + context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) + + # Configure certificate verification + if ssl_mode == "verify-ca": + context.check_hostname = False + elif ssl_mode == "verify-full": + context.check_hostname = True + + # Load root certificate if provided + if self.ssl_root_cert: + if os.path.exists(self.ssl_root_cert): + context.load_verify_locations(cafile=self.ssl_root_cert) + logger.info( + f"PostgreSQL, Loaded SSL root certificate: {self.ssl_root_cert}" + ) + else: + logger.warning( + f"PostgreSQL, SSL root certificate file not found: {self.ssl_root_cert}" + ) + + # Load client certificate and key if provided + if self.ssl_cert and self.ssl_key: + if os.path.exists(self.ssl_cert) and os.path.exists(self.ssl_key): + context.load_cert_chain(self.ssl_cert, self.ssl_key) + logger.info( + f"PostgreSQL, Loaded SSL client certificate: {self.ssl_cert}" + ) + else: + logger.warning( + "PostgreSQL, SSL client certificate or key file not found" + ) + + # Load certificate revocation list if provided + if self.ssl_crl: + if os.path.exists(self.ssl_crl): + context.load_verify_locations(crlfile=self.ssl_crl) + logger.info(f"PostgreSQL, Loaded SSL CRL: {self.ssl_crl}") + else: + logger.warning( + f"PostgreSQL, SSL CRL file not found: {self.ssl_crl}" + ) + + return context + + except Exception as e: + logger.error(f"PostgreSQL, Failed to create SSL context: {e}") + raise ValueError(f"SSL configuration error: {e}") + + # Unknown SSL mode + logger.warning(f"PostgreSQL, Unknown SSL mode: {ssl_mode}, SSL disabled") + return None + + async def initdb(self): + # Prepare connection parameters + connection_params = { + "user": self.user, + "password": self.password, + "database": self.database, + "host": self.host, + "port": self.port, + "min_size": 1, + "max_size": self.max, + } + + # Only add statement_cache_size if it's configured + if self.statement_cache_size is not None: + connection_params["statement_cache_size"] = int(self.statement_cache_size) + logger.info( + f"PostgreSQL, statement LRU cache size set as: {self.statement_cache_size}" + ) + + # Add SSL configuration if provided + ssl_context = self._create_ssl_context() + if ssl_context is not None: + connection_params["ssl"] = ssl_context + logger.info("PostgreSQL, SSL configuration applied") + elif self.ssl_mode: + # Handle simple SSL modes without custom context + if self.ssl_mode.lower() in ["require", "prefer"]: + connection_params["ssl"] = True + elif self.ssl_mode.lower() == "disable": + connection_params["ssl"] = False + logger.info(f"PostgreSQL, SSL mode set to: {self.ssl_mode}") + + # Add server settings if provided + if self.server_settings: + try: + settings = {} + # The format is expected to be a query string, e.g., "key1=value1&key2=value2" + pairs = self.server_settings.split("&") + for pair in pairs: + if "=" in pair: + key, value = pair.split("=", 1) + settings[key] = value + if settings: + connection_params["server_settings"] = settings + logger.info(f"PostgreSQL, Server settings applied: {settings}") + except Exception as e: + logger.warning( + f"PostgreSQL, Failed to parse server_settings: {self.server_settings}, error: {e}" + ) + + wait_strategy = ( + wait_exponential( + multiplier=self.connection_retry_backoff, + min=self.connection_retry_backoff, + max=self.connection_retry_backoff_max, + ) + if self.connection_retry_backoff > 0 + else wait_fixed(0) + ) + + async def _create_pool_once() -> None: + pool = await asyncpg.create_pool(**connection_params) # type: ignore + try: + async with pool.acquire() as connection: + await self.configure_vector_extension(connection) + except Exception: + await pool.close() + raise + self.pool = pool + + try: + async for attempt in AsyncRetrying( + stop=stop_after_attempt(self.connection_retry_attempts), + retry=retry_if_exception_type(self._transient_exceptions), + wait=wait_strategy, + before_sleep=self._before_sleep, + reraise=True, + ): + with attempt: + await _create_pool_once() + + ssl_status = "with SSL" if connection_params.get("ssl") else "without SSL" + logger.info( + f"PostgreSQL, Connected to database at {self.host}:{self.port}/{self.database} {ssl_status}" + ) + except Exception as e: + logger.error( + f"PostgreSQL, Failed to connect database at {self.host}:{self.port}/{self.database}, Got:{e}" + ) + raise + + async def _ensure_pool(self) -> None: + """Ensure the connection pool is initialised.""" + if self.pool is None: + async with self._pool_reconnect_lock: + if self.pool is None: + await self.initdb() + + async def _reset_pool(self) -> None: + async with self._pool_reconnect_lock: + if self.pool is not None: + try: + await asyncio.wait_for( + self.pool.close(), timeout=self.pool_close_timeout + ) + except asyncio.TimeoutError: + logger.error( + "PostgreSQL, Timed out closing connection pool after %.2fs", + self.pool_close_timeout, + ) + except Exception as close_error: # pragma: no cover - defensive logging + logger.warning( + f"PostgreSQL, Failed to close existing connection pool cleanly: {close_error!r}" + ) + self.pool = None + + async def _before_sleep(self, retry_state: RetryCallState) -> None: + """Hook invoked by tenacity before sleeping between retries.""" + exc = retry_state.outcome.exception() if retry_state.outcome else None + logger.warning( + "PostgreSQL transient connection issue on attempt %s/%s: %r", + retry_state.attempt_number, + self.connection_retry_attempts, + exc, + ) + await self._reset_pool() + + async def _run_with_retry( + self, + operation: Callable[[asyncpg.Connection], Awaitable[T]], + *, + with_age: bool = False, + graph_name: str | None = None, + ) -> T: + """ + Execute a database operation with automatic retry for transient failures. + + Args: + operation: Async callable that receives an active connection. + with_age: Whether to configure Apache AGE on the connection. + graph_name: AGE graph name; required when with_age is True. + + Returns: + The result returned by the operation. + + Raises: + Exception: Propagates the last error if all retry attempts fail or a non-transient error occurs. + """ + wait_strategy = ( + wait_exponential( + multiplier=self.connection_retry_backoff, + min=self.connection_retry_backoff, + max=self.connection_retry_backoff_max, + ) + if self.connection_retry_backoff > 0 + else wait_fixed(0) + ) + + async for attempt in AsyncRetrying( + stop=stop_after_attempt(self.connection_retry_attempts), + retry=retry_if_exception_type(self._transient_exceptions), + wait=wait_strategy, + before_sleep=self._before_sleep, + reraise=True, + ): + with attempt: + await self._ensure_pool() + assert self.pool is not None + async with self.pool.acquire() as connection: # type: ignore[arg-type] + if with_age and graph_name: + await self.configure_age(connection, graph_name) + elif with_age and not graph_name: + raise ValueError("Graph name is required when with_age is True") + + return await operation(connection) + + @staticmethod + async def configure_vector_extension(connection: asyncpg.Connection) -> None: + """Create VECTOR extension if it doesn't exist for vector similarity operations.""" + try: + await connection.execute("CREATE EXTENSION IF NOT EXISTS vector") # type: ignore + logger.info("PostgreSQL, VECTOR extension enabled") + except Exception as e: + logger.warning(f"Could not create VECTOR extension: {e}") + # Don't raise - let the system continue without vector extension + + @staticmethod + async def configure_age_extension(connection: asyncpg.Connection) -> None: + """Create AGE extension if it doesn't exist for graph operations.""" + try: + await connection.execute("CREATE EXTENSION IF NOT EXISTS age") # type: ignore + logger.info("PostgreSQL, AGE extension enabled") + except Exception as e: + logger.warning(f"Could not create AGE extension: {e}") + # Don't raise - let the system continue without AGE extension + + @staticmethod + async def configure_age(connection: asyncpg.Connection, graph_name: str) -> None: + """Set the Apache AGE environment and creates a graph if it does not exist. + + This method: + - Sets the PostgreSQL `search_path` to include `ag_catalog`, ensuring that Apache AGE functions can be used without specifying the schema. + - Attempts to create a new graph with the provided `graph_name` if it does not already exist. + - Silently ignores errors related to the graph already existing. + + """ + try: + await connection.execute( # type: ignore + 'SET search_path = ag_catalog, "$user", public' + ) + await connection.execute( # type: ignore + f"select create_graph('{graph_name}')" + ) + except ( + asyncpg.exceptions.InvalidSchemaNameError, + asyncpg.exceptions.UniqueViolationError, + ): + pass + + async def _migrate_llm_cache_schema(self): + """Migrate LLM cache schema: add new columns and remove deprecated mode field""" + try: + # Check if all columns exist + check_columns_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_llm_cache' + AND column_name IN ('chunk_id', 'cache_type', 'queryparam', 'mode') + """ + + existing_columns = await self.query(check_columns_sql, multirows=True) + existing_column_names = ( + {col["column_name"] for col in existing_columns} + if existing_columns + else set() + ) + + # Add missing chunk_id column + if "chunk_id" not in existing_column_names: + logger.info("Adding chunk_id column to LIGHTRAG_LLM_CACHE table") + add_chunk_id_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + ADD COLUMN chunk_id VARCHAR(255) NULL + """ + await self.execute(add_chunk_id_sql) + logger.info( + "Successfully added chunk_id column to LIGHTRAG_LLM_CACHE table" + ) + else: + logger.info( + "chunk_id column already exists in LIGHTRAG_LLM_CACHE table" + ) + + # Add missing cache_type column + if "cache_type" not in existing_column_names: + logger.info("Adding cache_type column to LIGHTRAG_LLM_CACHE table") + add_cache_type_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + ADD COLUMN cache_type VARCHAR(32) NULL + """ + await self.execute(add_cache_type_sql) + logger.info( + "Successfully added cache_type column to LIGHTRAG_LLM_CACHE table" + ) + + # Migrate existing data using optimized regex pattern + logger.info( + "Migrating existing LLM cache data to populate cache_type field (optimized)" + ) + optimized_update_sql = """ + UPDATE LIGHTRAG_LLM_CACHE + SET cache_type = CASE + WHEN id ~ '^[^:]+:[^:]+:' THEN split_part(id, ':', 2) + ELSE 'extract' + END + WHERE cache_type IS NULL + """ + await self.execute(optimized_update_sql) + logger.info("Successfully migrated existing LLM cache data") + else: + logger.info( + "cache_type column already exists in LIGHTRAG_LLM_CACHE table" + ) + + # Add missing queryparam column + if "queryparam" not in existing_column_names: + logger.info("Adding queryparam column to LIGHTRAG_LLM_CACHE table") + add_queryparam_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + ADD COLUMN queryparam JSONB NULL + """ + await self.execute(add_queryparam_sql) + logger.info( + "Successfully added queryparam column to LIGHTRAG_LLM_CACHE table" + ) + else: + logger.info( + "queryparam column already exists in LIGHTRAG_LLM_CACHE table" + ) + + # Remove deprecated mode field if it exists + if "mode" in existing_column_names: + logger.info( + "Removing deprecated mode column from LIGHTRAG_LLM_CACHE table" + ) + + # First, drop the primary key constraint that includes mode + drop_pk_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + DROP CONSTRAINT IF EXISTS LIGHTRAG_LLM_CACHE_PK + """ + await self.execute(drop_pk_sql) + logger.info("Dropped old primary key constraint") + + # Drop the mode column + drop_mode_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + DROP COLUMN mode + """ + await self.execute(drop_mode_sql) + logger.info( + "Successfully removed mode column from LIGHTRAG_LLM_CACHE table" + ) + + # Create new primary key constraint without mode + add_pk_sql = """ + ALTER TABLE LIGHTRAG_LLM_CACHE + ADD CONSTRAINT LIGHTRAG_LLM_CACHE_PK PRIMARY KEY (workspace, id) + """ + await self.execute(add_pk_sql) + logger.info("Created new primary key constraint (workspace, id)") + else: + logger.info("mode column does not exist in LIGHTRAG_LLM_CACHE table") + + except Exception as e: + logger.warning(f"Failed to migrate LLM cache schema: {e}") + + async def _migrate_timestamp_columns(self): + """Migrate timestamp columns in tables to witimezone-free types, assuming original data is in UTC time""" + # Tables and columns that need migration + tables_to_migrate = { + "LIGHTRAG_VDB_ENTITY": ["create_time", "update_time"], + "LIGHTRAG_VDB_RELATION": ["create_time", "update_time"], + "LIGHTRAG_DOC_CHUNKS": ["create_time", "update_time"], + "LIGHTRAG_DOC_STATUS": ["created_at", "updated_at"], + } + + try: + # Optimization: Batch check all columns in one query instead of 8 separate queries + table_names_lower = [t.lower() for t in tables_to_migrate.keys()] + all_column_names = list( + set(col for cols in tables_to_migrate.values() for col in cols) + ) + + check_all_columns_sql = """ + SELECT table_name, column_name, data_type + FROM information_schema.columns + WHERE table_name = ANY($1) + AND column_name = ANY($2) + """ + + all_columns_result = await self.query( + check_all_columns_sql, + [table_names_lower, all_column_names], + multirows=True, + ) + + # Build lookup dict: (table_name, column_name) -> data_type + column_types = {} + if all_columns_result: + column_types = { + (row["table_name"].upper(), row["column_name"]): row["data_type"] + for row in all_columns_result + } + + # Now iterate and migrate only what's needed + for table_name, columns in tables_to_migrate.items(): + for column_name in columns: + try: + data_type = column_types.get((table_name, column_name)) + + if not data_type: + logger.warning( + f"Column {table_name}.{column_name} does not exist, skipping migration" + ) + continue + + # Check column type + if data_type == "timestamp without time zone": + logger.debug( + f"Column {table_name}.{column_name} is already witimezone-free, no migration needed" + ) + continue + + # Execute migration, explicitly specifying UTC timezone for interpreting original data + logger.info( + f"Migrating {table_name}.{column_name} from {data_type} to TIMESTAMP(0) type" + ) + migration_sql = f""" + ALTER TABLE {table_name} + ALTER COLUMN {column_name} TYPE TIMESTAMP(0), + ALTER COLUMN {column_name} SET DEFAULT CURRENT_TIMESTAMP + """ + + await self.execute(migration_sql) + logger.info( + f"Successfully migrated {table_name}.{column_name} to timezone-free type" + ) + except Exception as e: + # Log error but don't interrupt the process + logger.warning( + f"Failed to migrate {table_name}.{column_name}: {e}" + ) + except Exception as e: + logger.error(f"Failed to batch check timestamp columns: {e}") + + async def _migrate_doc_chunks_to_vdb_chunks(self): + """ + Migrate data from LIGHTRAG_DOC_CHUNKS to LIGHTRAG_VDB_CHUNKS if specific conditions are met. + This migration is intended for users who are upgrading and have an older table structure + where LIGHTRAG_DOC_CHUNKS contained a `content_vector` column. + + """ + try: + # 1. Check if the new table LIGHTRAG_VDB_CHUNKS is empty + vdb_chunks_count_sql = "SELECT COUNT(1) as count FROM LIGHTRAG_VDB_CHUNKS" + vdb_chunks_count_result = await self.query(vdb_chunks_count_sql) + if vdb_chunks_count_result and vdb_chunks_count_result["count"] > 0: + logger.info( + "Skipping migration: LIGHTRAG_VDB_CHUNKS already contains data." + ) + return + + # 2. Check if `content_vector` column exists in the old table + check_column_sql = """ + SELECT 1 FROM information_schema.columns + WHERE table_name = 'lightrag_doc_chunks' AND column_name = 'content_vector' + """ + column_exists = await self.query(check_column_sql) + if not column_exists: + logger.info( + "Skipping migration: `content_vector` not found in LIGHTRAG_DOC_CHUNKS" + ) + return + + # 3. Check if the old table LIGHTRAG_DOC_CHUNKS has data + doc_chunks_count_sql = "SELECT COUNT(1) as count FROM LIGHTRAG_DOC_CHUNKS" + doc_chunks_count_result = await self.query(doc_chunks_count_sql) + if not doc_chunks_count_result or doc_chunks_count_result["count"] == 0: + logger.info("Skipping migration: LIGHTRAG_DOC_CHUNKS is empty.") + return + + # 4. Perform the migration + logger.info( + "Starting data migration from LIGHTRAG_DOC_CHUNKS to LIGHTRAG_VDB_CHUNKS..." + ) + migration_sql = """ + INSERT INTO LIGHTRAG_VDB_CHUNKS ( + id, workspace, full_doc_id, chunk_order_index, tokens, content, + content_vector, file_path, create_time, update_time + ) + SELECT + id, workspace, full_doc_id, chunk_order_index, tokens, content, + content_vector, file_path, create_time, update_time + FROM LIGHTRAG_DOC_CHUNKS + ON CONFLICT (workspace, id) DO NOTHING; + """ + await self.execute(migration_sql) + logger.info("Data migration to LIGHTRAG_VDB_CHUNKS completed successfully.") + + except Exception as e: + logger.error(f"Failed during data migration to LIGHTRAG_VDB_CHUNKS: {e}") + # Do not re-raise, to allow the application to start + + async def _check_llm_cache_needs_migration(self): + """Check if LLM cache data needs migration by examining any record with old format""" + try: + # Optimized query: directly check for old format records without sorting + check_sql = """ + SELECT 1 FROM LIGHTRAG_LLM_CACHE + WHERE id NOT LIKE '%:%' + LIMIT 1 + """ + result = await self.query(check_sql) + + # If any old format record exists, migration is needed + return result is not None + + except Exception as e: + logger.warning(f"Failed to check LLM cache migration status: {e}") + return False + + async def _migrate_llm_cache_to_flattened_keys(self): + """Optimized version: directly execute single UPDATE migration to migrate old format cache keys to flattened format""" + try: + # Check if migration is needed + check_sql = """ + SELECT COUNT(*) as count FROM LIGHTRAG_LLM_CACHE + WHERE id NOT LIKE '%:%' + """ + result = await self.query(check_sql) + + if not result or result["count"] == 0: + logger.info("No old format LLM cache data found, skipping migration") + return + + old_count = result["count"] + logger.info(f"Found {old_count} old format cache records") + + # Check potential primary key conflicts (optional but recommended) + conflict_check_sql = """ + WITH new_ids AS ( + SELECT + workspace, + mode, + id as old_id, + mode || ':' || + CASE WHEN mode = 'default' THEN 'extract' ELSE 'unknown' END || ':' || + md5(original_prompt) as new_id + FROM LIGHTRAG_LLM_CACHE + WHERE id NOT LIKE '%:%' + ) + SELECT COUNT(*) as conflicts + FROM new_ids n1 + JOIN LIGHTRAG_LLM_CACHE existing + ON existing.workspace = n1.workspace + AND existing.mode = n1.mode + AND existing.id = n1.new_id + WHERE existing.id LIKE '%:%' -- Only check conflicts with existing new format records + """ + + conflict_result = await self.query(conflict_check_sql) + if conflict_result and conflict_result["conflicts"] > 0: + logger.warning( + f"Found {conflict_result['conflicts']} potential ID conflicts with existing records" + ) + # Can choose to continue or abort, here we choose to continue and log warning + + # Execute single UPDATE migration + logger.info("Starting optimized LLM cache migration...") + migration_sql = """ + UPDATE LIGHTRAG_LLM_CACHE + SET + id = mode || ':' || + CASE WHEN mode = 'default' THEN 'extract' ELSE 'unknown' END || ':' || + md5(original_prompt), + cache_type = CASE WHEN mode = 'default' THEN 'extract' ELSE 'unknown' END, + update_time = CURRENT_TIMESTAMP + WHERE id NOT LIKE '%:%' + """ + + # Execute migration + await self.execute(migration_sql) + + # Verify migration results + verify_sql = """ + SELECT COUNT(*) as remaining_old FROM LIGHTRAG_LLM_CACHE + WHERE id NOT LIKE '%:%' + """ + verify_result = await self.query(verify_sql) + remaining = verify_result["remaining_old"] if verify_result else -1 + + if remaining == 0: + logger.info( + f"✅ Successfully migrated {old_count} LLM cache records to flattened format" + ) + else: + logger.warning( + f"⚠️ Migration completed but {remaining} old format records remain" + ) + + except Exception as e: + logger.error(f"Optimized LLM cache migration failed: {e}") + raise + + async def _migrate_doc_status_add_chunks_list(self): + """Add chunks_list column to LIGHTRAG_DOC_STATUS table if it doesn't exist""" + try: + # Check if chunks_list column exists + check_column_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_doc_status' + AND column_name = 'chunks_list' + """ + + column_info = await self.query(check_column_sql) + if not column_info: + logger.info("Adding chunks_list column to LIGHTRAG_DOC_STATUS table") + add_column_sql = """ + ALTER TABLE LIGHTRAG_DOC_STATUS + ADD COLUMN chunks_list JSONB NULL DEFAULT '[]'::jsonb + """ + await self.execute(add_column_sql) + logger.info( + "Successfully added chunks_list column to LIGHTRAG_DOC_STATUS table" + ) + else: + logger.info( + "chunks_list column already exists in LIGHTRAG_DOC_STATUS table" + ) + except Exception as e: + logger.warning( + f"Failed to add chunks_list column to LIGHTRAG_DOC_STATUS: {e}" + ) + + async def _migrate_text_chunks_add_llm_cache_list(self): + """Add llm_cache_list column to LIGHTRAG_DOC_CHUNKS table if it doesn't exist""" + try: + # Check if llm_cache_list column exists + check_column_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_doc_chunks' + AND column_name = 'llm_cache_list' + """ + + column_info = await self.query(check_column_sql) + if not column_info: + logger.info("Adding llm_cache_list column to LIGHTRAG_DOC_CHUNKS table") + add_column_sql = """ + ALTER TABLE LIGHTRAG_DOC_CHUNKS + ADD COLUMN llm_cache_list JSONB NULL DEFAULT '[]'::jsonb + """ + await self.execute(add_column_sql) + logger.info( + "Successfully added llm_cache_list column to LIGHTRAG_DOC_CHUNKS table" + ) + else: + logger.info( + "llm_cache_list column already exists in LIGHTRAG_DOC_CHUNKS table" + ) + except Exception as e: + logger.warning( + f"Failed to add llm_cache_list column to LIGHTRAG_DOC_CHUNKS: {e}" + ) + + async def _migrate_doc_status_add_track_id(self): + """Add track_id column to LIGHTRAG_DOC_STATUS table if it doesn't exist and create index""" + try: + # Check if track_id column exists + check_column_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_doc_status' + AND column_name = 'track_id' + """ + + column_info = await self.query(check_column_sql) + if not column_info: + logger.info("Adding track_id column to LIGHTRAG_DOC_STATUS table") + add_column_sql = """ + ALTER TABLE LIGHTRAG_DOC_STATUS + ADD COLUMN track_id VARCHAR(255) NULL + """ + await self.execute(add_column_sql) + logger.info( + "Successfully added track_id column to LIGHTRAG_DOC_STATUS table" + ) + else: + logger.info( + "track_id column already exists in LIGHTRAG_DOC_STATUS table" + ) + + # Check if track_id index exists + check_index_sql = """ + SELECT indexname + FROM pg_indexes + WHERE tablename = 'lightrag_doc_status' + AND indexname = 'idx_lightrag_doc_status_track_id' + """ + + index_info = await self.query(check_index_sql) + if not index_info: + logger.info( + "Creating index on track_id column for LIGHTRAG_DOC_STATUS table" + ) + create_index_sql = """ + CREATE INDEX idx_lightrag_doc_status_track_id ON LIGHTRAG_DOC_STATUS (track_id) + """ + await self.execute(create_index_sql) + logger.info( + "Successfully created index on track_id column for LIGHTRAG_DOC_STATUS table" + ) + else: + logger.info( + "Index on track_id column already exists for LIGHTRAG_DOC_STATUS table" + ) + + except Exception as e: + logger.warning( + f"Failed to add track_id column or index to LIGHTRAG_DOC_STATUS: {e}" + ) + + async def _migrate_doc_status_add_metadata_error_msg(self): + """Add metadata and error_msg columns to LIGHTRAG_DOC_STATUS table if they don't exist""" + try: + # Check if metadata column exists + check_metadata_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_doc_status' + AND column_name = 'metadata' + """ + + metadata_info = await self.query(check_metadata_sql) + if not metadata_info: + logger.info("Adding metadata column to LIGHTRAG_DOC_STATUS table") + add_metadata_sql = """ + ALTER TABLE LIGHTRAG_DOC_STATUS + ADD COLUMN metadata JSONB NULL DEFAULT '{}'::jsonb + """ + await self.execute(add_metadata_sql) + logger.info( + "Successfully added metadata column to LIGHTRAG_DOC_STATUS table" + ) + else: + logger.info( + "metadata column already exists in LIGHTRAG_DOC_STATUS table" + ) + + # Check if error_msg column exists + check_error_msg_sql = """ + SELECT column_name + FROM information_schema.columns + WHERE table_name = 'lightrag_doc_status' + AND column_name = 'error_msg' + """ + + error_msg_info = await self.query(check_error_msg_sql) + if not error_msg_info: + logger.info("Adding error_msg column to LIGHTRAG_DOC_STATUS table") + add_error_msg_sql = """ + ALTER TABLE LIGHTRAG_DOC_STATUS + ADD COLUMN error_msg TEXT NULL + """ + await self.execute(add_error_msg_sql) + logger.info( + "Successfully added error_msg column to LIGHTRAG_DOC_STATUS table" + ) + else: + logger.info( + "error_msg column already exists in LIGHTRAG_DOC_STATUS table" + ) + + except Exception as e: + logger.warning( + f"Failed to add metadata/error_msg columns to LIGHTRAG_DOC_STATUS: {e}" + ) + + async def _migrate_field_lengths(self): + """Migrate database field lengths: entity_name, source_id, target_id, and file_path""" + # Define the field changes needed + field_migrations = [ + { + "table": "LIGHTRAG_VDB_ENTITY", + "column": "entity_name", + "old_type": "character varying(255)", + "new_type": "VARCHAR(512)", + "description": "entity_name from 255 to 512", + }, + { + "table": "LIGHTRAG_VDB_RELATION", + "column": "source_id", + "old_type": "character varying(256)", + "new_type": "VARCHAR(512)", + "description": "source_id from 256 to 512", + }, + { + "table": "LIGHTRAG_VDB_RELATION", + "column": "target_id", + "old_type": "character varying(256)", + "new_type": "VARCHAR(512)", + "description": "target_id from 256 to 512", + }, + { + "table": "LIGHTRAG_DOC_CHUNKS", + "column": "file_path", + "old_type": "character varying(256)", + "new_type": "TEXT", + "description": "file_path to TEXT NULL", + }, + { + "table": "LIGHTRAG_VDB_CHUNKS", + "column": "file_path", + "old_type": "character varying(256)", + "new_type": "TEXT", + "description": "file_path to TEXT NULL", + }, + ] + + try: + # Optimization: Batch check all columns in one query instead of 5 separate queries + unique_tables = list(set(m["table"].lower() for m in field_migrations)) + unique_columns = list(set(m["column"] for m in field_migrations)) + + check_all_columns_sql = """ + SELECT table_name, column_name, data_type, character_maximum_length, is_nullable + FROM information_schema.columns + WHERE table_name = ANY($1) + AND column_name = ANY($2) + """ + + all_columns_result = await self.query( + check_all_columns_sql, [unique_tables, unique_columns], multirows=True + ) + + # Build lookup dict: (table_name, column_name) -> column_info + column_info_map = {} + if all_columns_result: + column_info_map = { + (row["table_name"].upper(), row["column_name"]): row + for row in all_columns_result + } + + # Now iterate and migrate only what's needed + for migration in field_migrations: + try: + column_info = column_info_map.get( + (migration["table"], migration["column"]) + ) + + if not column_info: + logger.warning( + f"Column {migration['table']}.{migration['column']} does not exist, skipping migration" + ) + continue + + current_type = column_info.get("data_type", "").lower() + current_length = column_info.get("character_maximum_length") + + # Check if migration is needed + needs_migration = False + + if migration["column"] == "entity_name" and current_length == 255: + needs_migration = True + elif ( + migration["column"] in ["source_id", "target_id"] + and current_length == 256 + ): + needs_migration = True + elif ( + migration["column"] == "file_path" + and current_type == "character varying" + ): + needs_migration = True + + if needs_migration: + logger.info( + f"Migrating {migration['table']}.{migration['column']}: {migration['description']}" + ) + + # Execute the migration + alter_sql = f""" + ALTER TABLE {migration["table"]} + ALTER COLUMN {migration["column"]} TYPE {migration["new_type"]} + """ + + await self.execute(alter_sql) + logger.info( + f"Successfully migrated {migration['table']}.{migration['column']}" + ) + else: + logger.debug( + f"Column {migration['table']}.{migration['column']} already has correct type, no migration needed" + ) + + except Exception as e: + # Log error but don't interrupt the process + logger.warning( + f"Failed to migrate {migration['table']}.{migration['column']}: {e}" + ) + except Exception as e: + logger.error(f"Failed to batch check field lengths: {e}") + + async def check_tables(self): + # First create all tables + for k, v in TABLES.items(): + try: + await self.query(f"SELECT 1 FROM {k} LIMIT 1") + except Exception: + try: + logger.info(f"PostgreSQL, Try Creating table {k} in database") + await self.execute(v["ddl"]) + logger.info( + f"PostgreSQL, Creation success table {k} in PostgreSQL database" + ) + except Exception as e: + logger.error( + f"PostgreSQL, Failed to create table {k} in database, Please verify the connection with PostgreSQL database, Got: {e}" + ) + raise e + + # Batch check all indexes at once (optimization: single query instead of N queries) + try: + table_names = list(TABLES.keys()) + table_names_lower = [t.lower() for t in table_names] + + # Get all existing indexes for our tables in one query + check_all_indexes_sql = """ + SELECT indexname, tablename + FROM pg_indexes + WHERE tablename = ANY($1) + """ + existing_indexes_result = await self.query( + check_all_indexes_sql, [table_names_lower], multirows=True + ) + + # Build a set of existing index names for fast lookup + existing_indexes = set() + if existing_indexes_result: + existing_indexes = {row["indexname"] for row in existing_indexes_result} + + # Create missing indexes + for k in table_names: + # Create index for id column if missing + index_name = f"idx_{k.lower()}_id" + if index_name not in existing_indexes: + try: + create_index_sql = f"CREATE INDEX {index_name} ON {k}(id)" + logger.info( + f"PostgreSQL, Creating index {index_name} on table {k}" + ) + await self.execute(create_index_sql) + except Exception as e: + logger.error( + f"PostgreSQL, Failed to create index {index_name}, Got: {e}" + ) + + # Create composite index for (workspace, id) if missing + composite_index_name = f"idx_{k.lower()}_workspace_id" + if composite_index_name not in existing_indexes: + try: + create_composite_index_sql = ( + f"CREATE INDEX {composite_index_name} ON {k}(workspace, id)" + ) + logger.info( + f"PostgreSQL, Creating composite index {composite_index_name} on table {k}" + ) + await self.execute(create_composite_index_sql) + except Exception as e: + logger.error( + f"PostgreSQL, Failed to create composite index {composite_index_name}, Got: {e}" + ) + except Exception as e: + logger.error(f"PostgreSQL, Failed to batch check/create indexes: {e}") + + # Create vector indexs + if self.vector_index_type: + logger.info( + f"PostgreSQL, Create vector indexs, type: {self.vector_index_type}" + ) + try: + if self.vector_index_type == "HNSW": + await self._create_hnsw_vector_indexes() + elif self.vector_index_type == "IVFFLAT": + await self._create_ivfflat_vector_indexes() + elif self.vector_index_type == "FLAT": + logger.warning( + "FLAT index type is not supported by pgvector. Skipping vector index creation. " + "Please use 'HNSW' or 'IVFFLAT' instead." + ) + else: + logger.warning( + "Doesn't support this vector index type: {self.vector_index_type}. " + "Supported types: HNSW, IVFFLAT" + ) + except Exception as e: + logger.error( + f"PostgreSQL, Failed to create vector index, type: {self.vector_index_type}, Got: {e}" + ) + # After all tables are created, attempt to migrate timestamp fields + try: + await self._migrate_timestamp_columns() + except Exception as e: + logger.error(f"PostgreSQL, Failed to migrate timestamp columns: {e}") + # Don't throw an exception, allow the initialization process to continue + + # Migrate LLM cache schema: add new columns and remove deprecated mode field + try: + await self._migrate_llm_cache_schema() + except Exception as e: + logger.error(f"PostgreSQL, Failed to migrate LLM cache schema: {e}") + # Don't throw an exception, allow the initialization process to continue + + # Finally, attempt to migrate old doc chunks data if needed + try: + await self._migrate_doc_chunks_to_vdb_chunks() + except Exception as e: + logger.error(f"PostgreSQL, Failed to migrate doc_chunks to vdb_chunks: {e}") + + # Check and migrate LLM cache to flattened keys if needed + try: + if await self._check_llm_cache_needs_migration(): + await self._migrate_llm_cache_to_flattened_keys() + except Exception as e: + logger.error(f"PostgreSQL, LLM cache migration failed: {e}") + + # Migrate doc status to add chunks_list field if needed + try: + await self._migrate_doc_status_add_chunks_list() + except Exception as e: + logger.error( + f"PostgreSQL, Failed to migrate doc status chunks_list field: {e}" + ) + + # Migrate text chunks to add llm_cache_list field if needed + try: + await self._migrate_text_chunks_add_llm_cache_list() + except Exception as e: + logger.error( + f"PostgreSQL, Failed to migrate text chunks llm_cache_list field: {e}" + ) + + # Migrate field lengths for entity_name, source_id, target_id, and file_path + try: + await self._migrate_field_lengths() + except Exception as e: + logger.error(f"PostgreSQL, Failed to migrate field lengths: {e}") + + # Migrate doc status to add track_id field if needed + try: + await self._migrate_doc_status_add_track_id() + except Exception as e: + logger.error( + f"PostgreSQL, Failed to migrate doc status track_id field: {e}" + ) + + # Migrate doc status to add metadata and error_msg fields if needed + try: + await self._migrate_doc_status_add_metadata_error_msg() + except Exception as e: + logger.error( + f"PostgreSQL, Failed to migrate doc status metadata/error_msg fields: {e}" + ) + + # Create pagination optimization indexes for LIGHTRAG_DOC_STATUS + try: + await self._create_pagination_indexes() + except Exception as e: + logger.error(f"PostgreSQL, Failed to create pagination indexes: {e}") + + # Migrate to ensure new tables LIGHTRAG_FULL_ENTITIES and LIGHTRAG_FULL_RELATIONS exist + try: + await self._migrate_create_full_entities_relations_tables() + except Exception as e: + logger.error( + f"PostgreSQL, Failed to create full entities/relations tables: {e}" + ) + + async def _migrate_create_full_entities_relations_tables(self): + """Create LIGHTRAG_FULL_ENTITIES and LIGHTRAG_FULL_RELATIONS tables if they don't exist""" + tables_to_check = [ + { + "name": "LIGHTRAG_FULL_ENTITIES", + "ddl": TABLES["LIGHTRAG_FULL_ENTITIES"]["ddl"], + "description": "Full entities storage table", + }, + { + "name": "LIGHTRAG_FULL_RELATIONS", + "ddl": TABLES["LIGHTRAG_FULL_RELATIONS"]["ddl"], + "description": "Full relations storage table", + }, + ] + + for table_info in tables_to_check: + table_name = table_info["name"] + try: + # Check if table exists + check_table_sql = """ + SELECT table_name + FROM information_schema.tables + WHERE table_name = $1 + AND table_schema = 'public' + """ + params = {"table_name": table_name.lower()} + table_exists = await self.query(check_table_sql, list(params.values())) + + if not table_exists: + logger.info(f"Creating table {table_name}") + await self.execute(table_info["ddl"]) + logger.info( + f"Successfully created {table_info['description']}: {table_name}" + ) + + # Create basic indexes for the new table + try: + # Create index for id column + index_name = f"idx_{table_name.lower()}_id" + create_index_sql = ( + f"CREATE INDEX {index_name} ON {table_name}(id)" + ) + await self.execute(create_index_sql) + logger.info(f"Created index {index_name} on table {table_name}") + + # Create composite index for (workspace, id) columns + composite_index_name = f"idx_{table_name.lower()}_workspace_id" + create_composite_index_sql = f"CREATE INDEX {composite_index_name} ON {table_name}(workspace, id)" + await self.execute(create_composite_index_sql) + logger.info( + f"Created composite index {composite_index_name} on table {table_name}" + ) + + except Exception as e: + logger.warning( + f"Failed to create indexes for table {table_name}: {e}" + ) + + else: + logger.debug(f"Table {table_name} already exists") + + except Exception as e: + logger.error(f"Failed to create table {table_name}: {e}") + + async def _create_pagination_indexes(self): + """Create indexes to optimize pagination queries for LIGHTRAG_DOC_STATUS""" + indexes = [ + { + "name": "idx_lightrag_doc_status_workspace_status_updated_at", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_status_updated_at ON LIGHTRAG_DOC_STATUS (workspace, status, updated_at DESC)", + "description": "Composite index for workspace + status + updated_at pagination", + }, + { + "name": "idx_lightrag_doc_status_workspace_status_created_at", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_status_created_at ON LIGHTRAG_DOC_STATUS (workspace, status, created_at DESC)", + "description": "Composite index for workspace + status + created_at pagination", + }, + { + "name": "idx_lightrag_doc_status_workspace_updated_at", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_updated_at ON LIGHTRAG_DOC_STATUS (workspace, updated_at DESC)", + "description": "Index for workspace + updated_at pagination (all statuses)", + }, + { + "name": "idx_lightrag_doc_status_workspace_created_at", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_created_at ON LIGHTRAG_DOC_STATUS (workspace, created_at DESC)", + "description": "Index for workspace + created_at pagination (all statuses)", + }, + { + "name": "idx_lightrag_doc_status_workspace_id", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_id ON LIGHTRAG_DOC_STATUS (workspace, id)", + "description": "Index for workspace + id sorting", + }, + { + "name": "idx_lightrag_doc_status_workspace_file_path", + "sql": "CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_lightrag_doc_status_workspace_file_path ON LIGHTRAG_DOC_STATUS (workspace, file_path)", + "description": "Index for workspace + file_path sorting", + }, + ] + + for index in indexes: + try: + # Check if index already exists + check_sql = """ + SELECT indexname + FROM pg_indexes + WHERE tablename = 'lightrag_doc_status' + AND indexname = $1 + """ + + params = {"indexname": index["name"]} + existing = await self.query(check_sql, list(params.values())) + + if not existing: + logger.info(f"Creating pagination index: {index['description']}") + await self.execute(index["sql"]) + logger.info(f"Successfully created index: {index['name']}") + else: + logger.debug(f"Index already exists: {index['name']}") + + except Exception as e: + logger.warning(f"Failed to create index {index['name']}: {e}") + + async def _create_hnsw_vector_indexes(self): + vdb_tables = [ + "LIGHTRAG_VDB_CHUNKS", + "LIGHTRAG_VDB_ENTITY", + "LIGHTRAG_VDB_RELATION", + ] + + embedding_dim = int(os.environ.get("EMBEDDING_DIM", 1024)) + + for k in vdb_tables: + vector_index_name = f"idx_{k.lower()}_hnsw_cosine" + check_vector_index_sql = f""" + SELECT 1 FROM pg_indexes + WHERE indexname = '{vector_index_name}' + AND tablename = '{k.lower()}' + """ + try: + vector_index_exists = await self.query(check_vector_index_sql) + if not vector_index_exists: + # Only set vector dimension when index doesn't exist + alter_sql = f"ALTER TABLE {k} ALTER COLUMN content_vector TYPE VECTOR({embedding_dim})" + await self.execute(alter_sql) + logger.debug(f"Ensured vector dimension for {k}") + + create_vector_index_sql = f""" + CREATE INDEX {vector_index_name} + ON {k} USING hnsw (content_vector vector_cosine_ops) + WITH (m = {self.hnsw_m}, ef_construction = {self.hnsw_ef}) + """ + logger.info(f"Creating hnsw index {vector_index_name} on table {k}") + await self.execute(create_vector_index_sql) + logger.info( + f"Successfully created vector index {vector_index_name} on table {k}" + ) + else: + logger.info( + f"HNSW vector index {vector_index_name} already exists on table {k}" + ) + except Exception as e: + logger.error(f"Failed to create vector index on table {k}, Got: {e}") + + async def _create_ivfflat_vector_indexes(self): + vdb_tables = [ + "LIGHTRAG_VDB_CHUNKS", + "LIGHTRAG_VDB_ENTITY", + "LIGHTRAG_VDB_RELATION", + ] + + embedding_dim = int(os.environ.get("EMBEDDING_DIM", 1024)) + + for k in vdb_tables: + index_name = f"idx_{k.lower()}_ivfflat_cosine" + check_index_sql = f""" + SELECT 1 FROM pg_indexes + WHERE indexname = '{index_name}' AND tablename = '{k.lower()}' + """ + try: + exists = await self.query(check_index_sql) + if not exists: + # Only set vector dimension when index doesn't exist + alter_sql = f"ALTER TABLE {k} ALTER COLUMN content_vector TYPE VECTOR({embedding_dim})" + await self.execute(alter_sql) + logger.debug(f"Ensured vector dimension for {k}") + + create_sql = f""" + CREATE INDEX {index_name} + ON {k} USING ivfflat (content_vector vector_cosine_ops) + WITH (lists = {self.ivfflat_lists}) + """ + logger.info(f"Creating ivfflat index {index_name} on table {k}") + await self.execute(create_sql) + logger.info( + f"Successfully created ivfflat index {index_name} on table {k}" + ) + else: + logger.info( + f"Ivfflat vector index {index_name} already exists on table {k}" + ) + except Exception as e: + logger.error(f"Failed to create ivfflat index on {k}: {e}") + + async def query( + self, + sql: str, + params: list[Any] | None = None, + multirows: bool = False, + with_age: bool = False, + graph_name: str | None = None, + ) -> dict[str, Any] | None | list[dict[str, Any]]: + async def _operation(connection: asyncpg.Connection) -> Any: + prepared_params = tuple(params) if params else () + if prepared_params: + rows = await connection.fetch(sql, *prepared_params) + else: + rows = await connection.fetch(sql) + + if multirows: + if rows: + columns = [col for col in rows[0].keys()] + return [dict(zip(columns, row)) for row in rows] + return [] + + if rows: + columns = rows[0].keys() + return dict(zip(columns, rows[0])) + return None + + try: + return await self._run_with_retry( + _operation, with_age=with_age, graph_name=graph_name + ) + except Exception as e: + logger.error(f"PostgreSQL database, error:{e}") + raise + + async def execute( + self, + sql: str, + data: dict[str, Any] | None = None, + upsert: bool = False, + ignore_if_exists: bool = False, + with_age: bool = False, + graph_name: str | None = None, + ): + async def _operation(connection: asyncpg.Connection) -> Any: + prepared_values = tuple(data.values()) if data else () + try: + if not data: + return await connection.execute(sql) + return await connection.execute(sql, *prepared_values) + except ( + asyncpg.exceptions.UniqueViolationError, + asyncpg.exceptions.DuplicateTableError, + asyncpg.exceptions.DuplicateObjectError, + asyncpg.exceptions.InvalidSchemaNameError, + ) as e: + if ignore_if_exists: + logger.debug("PostgreSQL, ignoring duplicate during execute: %r", e) + return None + if upsert: + logger.info( + "PostgreSQL, duplicate detected but treated as upsert success: %r", + e, + ) + return None + raise + + try: + await self._run_with_retry( + _operation, with_age=with_age, graph_name=graph_name + ) + except Exception as e: + logger.error(f"PostgreSQL database,\nsql:{sql},\ndata:{data},\nerror:{e}") + raise + + +class ClientManager: + _instances: dict[str, Any] = {"db": None, "ref_count": 0} + _lock = asyncio.Lock() + + @staticmethod + def get_config() -> dict[str, Any]: + config = configparser.ConfigParser() + config.read("config.ini", "utf-8") + + return { + "host": os.environ.get( + "POSTGRES_HOST", + config.get("postgres", "host", fallback="localhost"), + ), + "port": os.environ.get( + "POSTGRES_PORT", config.get("postgres", "port", fallback=5432) + ), + "user": os.environ.get( + "POSTGRES_USER", config.get("postgres", "user", fallback="postgres") + ), + "password": os.environ.get( + "POSTGRES_PASSWORD", + config.get("postgres", "password", fallback=None), + ), + "database": os.environ.get( + "POSTGRES_DATABASE", + config.get("postgres", "database", fallback="postgres"), + ), + "workspace": os.environ.get( + "POSTGRES_WORKSPACE", + config.get("postgres", "workspace", fallback=None), + ), + "max_connections": os.environ.get( + "POSTGRES_MAX_CONNECTIONS", + config.get("postgres", "max_connections", fallback=50), + ), + # SSL configuration + "ssl_mode": os.environ.get( + "POSTGRES_SSL_MODE", + config.get("postgres", "ssl_mode", fallback=None), + ), + "ssl_cert": os.environ.get( + "POSTGRES_SSL_CERT", + config.get("postgres", "ssl_cert", fallback=None), + ), + "ssl_key": os.environ.get( + "POSTGRES_SSL_KEY", + config.get("postgres", "ssl_key", fallback=None), + ), + "ssl_root_cert": os.environ.get( + "POSTGRES_SSL_ROOT_CERT", + config.get("postgres", "ssl_root_cert", fallback=None), + ), + "ssl_crl": os.environ.get( + "POSTGRES_SSL_CRL", + config.get("postgres", "ssl_crl", fallback=None), + ), + "vector_index_type": os.environ.get( + "POSTGRES_VECTOR_INDEX_TYPE", + config.get("postgres", "vector_index_type", fallback="HNSW"), + ), + "hnsw_m": int( + os.environ.get( + "POSTGRES_HNSW_M", + config.get("postgres", "hnsw_m", fallback="16"), + ) + ), + "hnsw_ef": int( + os.environ.get( + "POSTGRES_HNSW_EF", + config.get("postgres", "hnsw_ef", fallback="64"), + ) + ), + "ivfflat_lists": int( + os.environ.get( + "POSTGRES_IVFFLAT_LISTS", + config.get("postgres", "ivfflat_lists", fallback="100"), + ) + ), + # Server settings for Supabase + "server_settings": os.environ.get( + "POSTGRES_SERVER_SETTINGS", + config.get("postgres", "server_options", fallback=None), + ), + "statement_cache_size": os.environ.get( + "POSTGRES_STATEMENT_CACHE_SIZE", + config.get("postgres", "statement_cache_size", fallback=None), + ), + # Connection retry configuration + "connection_retry_attempts": min( + 10, + int( + os.environ.get( + "POSTGRES_CONNECTION_RETRIES", + config.get("postgres", "connection_retries", fallback=3), + ) + ), + ), + "connection_retry_backoff": min( + 5.0, + float( + os.environ.get( + "POSTGRES_CONNECTION_RETRY_BACKOFF", + config.get( + "postgres", "connection_retry_backoff", fallback=0.5 + ), + ) + ), + ), + "connection_retry_backoff_max": min( + 60.0, + float( + os.environ.get( + "POSTGRES_CONNECTION_RETRY_BACKOFF_MAX", + config.get( + "postgres", + "connection_retry_backoff_max", + fallback=5.0, + ), + ) + ), + ), + "pool_close_timeout": min( + 30.0, + float( + os.environ.get( + "POSTGRES_POOL_CLOSE_TIMEOUT", + config.get("postgres", "pool_close_timeout", fallback=5.0), + ) + ), + ), + } + + @classmethod + async def get_client(cls) -> PostgreSQLDB: + async with cls._lock: + if cls._instances["db"] is None: + config = ClientManager.get_config() + db = PostgreSQLDB(config) + await db.initdb() + await db.check_tables() + cls._instances["db"] = db + cls._instances["ref_count"] = 0 + cls._instances["ref_count"] += 1 + return cls._instances["db"] + + @classmethod + async def release_client(cls, db: PostgreSQLDB): + async with cls._lock: + if db is not None: + if db is cls._instances["db"]: + cls._instances["ref_count"] -= 1 + if cls._instances["ref_count"] == 0: + await db.pool.close() + logger.info("Closed PostgreSQL database connection pool") + cls._instances["db"] = None + else: + await db.pool.close() + + +@final +@dataclass +class PGKVStorage(BaseKVStorage): + db: PostgreSQLDB = field(default=None) + + def __post_init__(self): + self._max_batch_size = self.global_config["embedding_batch_num"] + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + # Implement workspace priority: PostgreSQLDB.workspace > self.workspace > "default" + if self.db.workspace: + # Use PostgreSQLDB's workspace (highest priority) + self.workspace = self.db.workspace + elif hasattr(self, "workspace") and self.workspace: + # Use storage class's workspace (medium priority) + pass + else: + # Use "default" for compatibility (lowest priority) + self.workspace = "default" + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + + ################ QUERY METHODS ################ + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get data by id.""" + sql = SQL_TEMPLATES["get_by_id_" + self.namespace] + params = {"workspace": self.workspace, "id": id} + response = await self.db.query(sql, list(params.values())) + + if response and is_namespace(self.namespace, NameSpace.KV_STORE_TEXT_CHUNKS): + # Parse llm_cache_list JSON string back to list + llm_cache_list = response.get("llm_cache_list", []) + if isinstance(llm_cache_list, str): + try: + llm_cache_list = json.loads(llm_cache_list) + except json.JSONDecodeError: + llm_cache_list = [] + response["llm_cache_list"] = llm_cache_list + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + response["create_time"] = create_time + response["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for LLM cache to ensure compatibility with _get_cached_extraction_results + if response and is_namespace( + self.namespace, NameSpace.KV_STORE_LLM_RESPONSE_CACHE + ): + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + # Parse queryparam JSON string back to dict + queryparam = response.get("queryparam") + if isinstance(queryparam, str): + try: + queryparam = json.loads(queryparam) + except json.JSONDecodeError: + queryparam = None + # Map field names for compatibility (mode field removed) + response = { + **response, + "return": response.get("return_value", ""), + "cache_type": response.get("cache_type"), + "original_prompt": response.get("original_prompt", ""), + "chunk_id": response.get("chunk_id"), + "queryparam": queryparam, + "create_time": create_time, + "update_time": create_time if update_time == 0 else update_time, + } + + # Special handling for FULL_ENTITIES namespace + if response and is_namespace(self.namespace, NameSpace.KV_STORE_FULL_ENTITIES): + # Parse entity_names JSON string back to list + entity_names = response.get("entity_names", []) + if isinstance(entity_names, str): + try: + entity_names = json.loads(entity_names) + except json.JSONDecodeError: + entity_names = [] + response["entity_names"] = entity_names + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + response["create_time"] = create_time + response["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for FULL_RELATIONS namespace + if response and is_namespace(self.namespace, NameSpace.KV_STORE_FULL_RELATIONS): + # Parse relation_pairs JSON string back to list + relation_pairs = response.get("relation_pairs", []) + if isinstance(relation_pairs, str): + try: + relation_pairs = json.loads(relation_pairs) + except json.JSONDecodeError: + relation_pairs = [] + response["relation_pairs"] = relation_pairs + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + response["create_time"] = create_time + response["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for ENTITY_CHUNKS namespace + if response and is_namespace(self.namespace, NameSpace.KV_STORE_ENTITY_CHUNKS): + # Parse chunk_ids JSON string back to list + chunk_ids = response.get("chunk_ids", []) + if isinstance(chunk_ids, str): + try: + chunk_ids = json.loads(chunk_ids) + except json.JSONDecodeError: + chunk_ids = [] + response["chunk_ids"] = chunk_ids + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + response["create_time"] = create_time + response["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for RELATION_CHUNKS namespace + if response and is_namespace( + self.namespace, NameSpace.KV_STORE_RELATION_CHUNKS + ): + # Parse chunk_ids JSON string back to list + chunk_ids = response.get("chunk_ids", []) + if isinstance(chunk_ids, str): + try: + chunk_ids = json.loads(chunk_ids) + except json.JSONDecodeError: + chunk_ids = [] + response["chunk_ids"] = chunk_ids + create_time = response.get("create_time", 0) + update_time = response.get("update_time", 0) + response["create_time"] = create_time + response["update_time"] = create_time if update_time == 0 else update_time + + return response if response else None + + # Query by id + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get data by ids""" + if not ids: + return [] + + sql = SQL_TEMPLATES["get_by_ids_" + self.namespace] + params = {"workspace": self.workspace, "ids": ids} + results = await self.db.query(sql, list(params.values()), multirows=True) + + def _order_results( + rows: list[dict[str, Any]] | None, + ) -> list[dict[str, Any] | None]: + """Preserve the caller requested ordering for bulk id lookups.""" + if not rows: + return [None for _ in ids] + + id_map: dict[str, dict[str, Any]] = {} + for row in rows: + if row is None: + continue + row_id = row.get("id") + if row_id is not None: + id_map[str(row_id)] = row + + ordered: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered.append(id_map.get(str(requested_id))) + return ordered + + if results and is_namespace(self.namespace, NameSpace.KV_STORE_TEXT_CHUNKS): + # Parse llm_cache_list JSON string back to list for each result + for result in results: + llm_cache_list = result.get("llm_cache_list", []) + if isinstance(llm_cache_list, str): + try: + llm_cache_list = json.loads(llm_cache_list) + except json.JSONDecodeError: + llm_cache_list = [] + result["llm_cache_list"] = llm_cache_list + create_time = result.get("create_time", 0) + update_time = result.get("update_time", 0) + result["create_time"] = create_time + result["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for LLM cache to ensure compatibility with _get_cached_extraction_results + if results and is_namespace( + self.namespace, NameSpace.KV_STORE_LLM_RESPONSE_CACHE + ): + processed_results = [] + for row in results: + create_time = row.get("create_time", 0) + update_time = row.get("update_time", 0) + # Parse queryparam JSON string back to dict + queryparam = row.get("queryparam") + if isinstance(queryparam, str): + try: + queryparam = json.loads(queryparam) + except json.JSONDecodeError: + queryparam = None + # Map field names for compatibility (mode field removed) + processed_row = { + **row, + "return": row.get("return_value", ""), + "cache_type": row.get("cache_type"), + "original_prompt": row.get("original_prompt", ""), + "chunk_id": row.get("chunk_id"), + "queryparam": queryparam, + "create_time": create_time, + "update_time": create_time if update_time == 0 else update_time, + } + processed_results.append(processed_row) + return _order_results(processed_results) + + # Special handling for FULL_ENTITIES namespace + if results and is_namespace(self.namespace, NameSpace.KV_STORE_FULL_ENTITIES): + for result in results: + # Parse entity_names JSON string back to list + entity_names = result.get("entity_names", []) + if isinstance(entity_names, str): + try: + entity_names = json.loads(entity_names) + except json.JSONDecodeError: + entity_names = [] + result["entity_names"] = entity_names + create_time = result.get("create_time", 0) + update_time = result.get("update_time", 0) + result["create_time"] = create_time + result["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for FULL_RELATIONS namespace + if results and is_namespace(self.namespace, NameSpace.KV_STORE_FULL_RELATIONS): + for result in results: + # Parse relation_pairs JSON string back to list + relation_pairs = result.get("relation_pairs", []) + if isinstance(relation_pairs, str): + try: + relation_pairs = json.loads(relation_pairs) + except json.JSONDecodeError: + relation_pairs = [] + result["relation_pairs"] = relation_pairs + create_time = result.get("create_time", 0) + update_time = result.get("update_time", 0) + result["create_time"] = create_time + result["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for ENTITY_CHUNKS namespace + if results and is_namespace(self.namespace, NameSpace.KV_STORE_ENTITY_CHUNKS): + for result in results: + # Parse chunk_ids JSON string back to list + chunk_ids = result.get("chunk_ids", []) + if isinstance(chunk_ids, str): + try: + chunk_ids = json.loads(chunk_ids) + except json.JSONDecodeError: + chunk_ids = [] + result["chunk_ids"] = chunk_ids + create_time = result.get("create_time", 0) + update_time = result.get("update_time", 0) + result["create_time"] = create_time + result["update_time"] = create_time if update_time == 0 else update_time + + # Special handling for RELATION_CHUNKS namespace + if results and is_namespace(self.namespace, NameSpace.KV_STORE_RELATION_CHUNKS): + for result in results: + # Parse chunk_ids JSON string back to list + chunk_ids = result.get("chunk_ids", []) + if isinstance(chunk_ids, str): + try: + chunk_ids = json.loads(chunk_ids) + except json.JSONDecodeError: + chunk_ids = [] + result["chunk_ids"] = chunk_ids + create_time = result.get("create_time", 0) + update_time = result.get("update_time", 0) + result["create_time"] = create_time + result["update_time"] = create_time if update_time == 0 else update_time + + return _order_results(results) + + async def filter_keys(self, keys: set[str]) -> set[str]: + """Filter out duplicated content""" + if not keys: + return set() + + table_name = namespace_to_table_name(self.namespace) + sql = f"SELECT id FROM {table_name} WHERE workspace=$1 AND id = ANY($2)" + params = {"workspace": self.workspace, "ids": list(keys)} + try: + res = await self.db.query(sql, list(params.values()), multirows=True) + if res: + exist_keys = [key["id"] for key in res] + else: + exist_keys = [] + new_keys = set([s for s in keys if s not in exist_keys]) + return new_keys + except Exception as e: + logger.error( + f"[{self.workspace}] PostgreSQL database,\nsql:{sql},\nparams:{params},\nerror:{e}" + ) + raise + + ################ INSERT METHODS ################ + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + if is_namespace(self.namespace, NameSpace.KV_STORE_TEXT_CHUNKS): + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_text_chunk"] + _data = { + "workspace": self.workspace, + "id": k, + "tokens": v["tokens"], + "chunk_order_index": v["chunk_order_index"], + "full_doc_id": v["full_doc_id"], + "content": v["content"], + "file_path": v["file_path"], + "llm_cache_list": json.dumps(v.get("llm_cache_list", [])), + "create_time": current_time, + "update_time": current_time, + } + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_FULL_DOCS): + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_doc_full"] + _data = { + "id": k, + "content": v["content"], + "doc_name": v.get("file_path", ""), # Map file_path to doc_name + "workspace": self.workspace, + } + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_LLM_RESPONSE_CACHE): + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_llm_response_cache"] + _data = { + "workspace": self.workspace, + "id": k, # Use flattened key as id + "original_prompt": v["original_prompt"], + "return_value": v["return"], + "chunk_id": v.get("chunk_id"), + "cache_type": v.get( + "cache_type", "extract" + ), # Get cache_type from data + "queryparam": json.dumps(v.get("queryparam")) + if v.get("queryparam") + else None, + } + + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_FULL_ENTITIES): + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_full_entities"] + _data = { + "workspace": self.workspace, + "id": k, + "entity_names": json.dumps(v["entity_names"]), + "count": v["count"], + "create_time": current_time, + "update_time": current_time, + } + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_FULL_RELATIONS): + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_full_relations"] + _data = { + "workspace": self.workspace, + "id": k, + "relation_pairs": json.dumps(v["relation_pairs"]), + "count": v["count"], + "create_time": current_time, + "update_time": current_time, + } + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_ENTITY_CHUNKS): + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_entity_chunks"] + _data = { + "workspace": self.workspace, + "id": k, + "chunk_ids": json.dumps(v["chunk_ids"]), + "count": v["count"], + "create_time": current_time, + "update_time": current_time, + } + await self.db.execute(upsert_sql, _data) + elif is_namespace(self.namespace, NameSpace.KV_STORE_RELATION_CHUNKS): + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + for k, v in data.items(): + upsert_sql = SQL_TEMPLATES["upsert_relation_chunks"] + _data = { + "workspace": self.workspace, + "id": k, + "chunk_ids": json.dumps(v["chunk_ids"]), + "count": v["count"], + "create_time": current_time, + "update_time": current_time, + } + await self.db.execute(upsert_sql, _data) + + async def index_done_callback(self) -> None: + # PG handles persistence automatically + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for is_empty check: {self.namespace}" + ) + return True + + sql = f"SELECT EXISTS(SELECT 1 FROM {table_name} WHERE workspace=$1 LIMIT 1) as has_data" + + try: + result = await self.db.query(sql, [self.workspace]) + return not result.get("has_data", False) if result else True + except Exception as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + async def delete(self, ids: list[str]) -> None: + """Delete specific records from storage by their IDs + + Args: + ids (list[str]): List of document IDs to be deleted from storage + + Returns: + None + """ + if not ids: + return + + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for deletion: {self.namespace}" + ) + return + + delete_sql = f"DELETE FROM {table_name} WHERE workspace=$1 AND id = ANY($2)" + + try: + await self.db.execute(delete_sql, {"workspace": self.workspace, "ids": ids}) + logger.debug( + f"[{self.workspace}] Successfully deleted {len(ids)} records from {self.namespace}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting records from {self.namespace}: {e}" + ) + + async def drop(self) -> dict[str, str]: + """Drop the storage""" + async with get_storage_lock(): + try: + table_name = namespace_to_table_name(self.namespace) + if not table_name: + return { + "status": "error", + "message": f"Unknown namespace: {self.namespace}", + } + + drop_sql = SQL_TEMPLATES["drop_specifiy_table_workspace"].format( + table_name=table_name + ) + await self.db.execute(drop_sql, {"workspace": self.workspace}) + return {"status": "success", "message": "data dropped"} + except Exception as e: + return {"status": "error", "message": str(e)} + + +@final +@dataclass +class PGVectorStorage(BaseVectorStorage): + db: PostgreSQLDB | None = field(default=None) + + def __post_init__(self): + self._max_batch_size = self.global_config["embedding_batch_num"] + config = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = config.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + # Implement workspace priority: PostgreSQLDB.workspace > self.workspace > "default" + if self.db.workspace: + # Use PostgreSQLDB's workspace (highest priority) + self.workspace = self.db.workspace + elif hasattr(self, "workspace") and self.workspace: + # Use storage class's workspace (medium priority) + pass + else: + # Use "default" for compatibility (lowest priority) + self.workspace = "default" + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + + def _upsert_chunks( + self, item: dict[str, Any], current_time: datetime.datetime + ) -> tuple[str, dict[str, Any]]: + try: + upsert_sql = SQL_TEMPLATES["upsert_chunk"] + data: dict[str, Any] = { + "workspace": self.workspace, + "id": item["__id__"], + "tokens": item["tokens"], + "chunk_order_index": item["chunk_order_index"], + "full_doc_id": item["full_doc_id"], + "content": item["content"], + "content_vector": json.dumps(item["__vector__"].tolist()), + "file_path": item["file_path"], + "create_time": current_time, + "update_time": current_time, + } + except Exception as e: + logger.error( + f"[{self.workspace}] Error to prepare upsert,\nsql: {e}\nitem: {item}" + ) + raise + + return upsert_sql, data + + def _upsert_entities( + self, item: dict[str, Any], current_time: datetime.datetime + ) -> tuple[str, dict[str, Any]]: + upsert_sql = SQL_TEMPLATES["upsert_entity"] + source_id = item["source_id"] + if isinstance(source_id, str) and "" in source_id: + chunk_ids = source_id.split("") + else: + chunk_ids = [source_id] + + data: dict[str, Any] = { + "workspace": self.workspace, + "id": item["__id__"], + "entity_name": item["entity_name"], + "content": item["content"], + "content_vector": json.dumps(item["__vector__"].tolist()), + "chunk_ids": chunk_ids, + "file_path": item.get("file_path", None), + "create_time": current_time, + "update_time": current_time, + } + return upsert_sql, data + + def _upsert_relationships( + self, item: dict[str, Any], current_time: datetime.datetime + ) -> tuple[str, dict[str, Any]]: + upsert_sql = SQL_TEMPLATES["upsert_relationship"] + source_id = item["source_id"] + if isinstance(source_id, str) and "" in source_id: + chunk_ids = source_id.split("") + else: + chunk_ids = [source_id] + + data: dict[str, Any] = { + "workspace": self.workspace, + "id": item["__id__"], + "source_id": item["src_id"], + "target_id": item["tgt_id"], + "content": item["content"], + "content_vector": json.dumps(item["__vector__"].tolist()), + "chunk_ids": chunk_ids, + "file_path": item.get("file_path", None), + "create_time": current_time, + "update_time": current_time, + } + return upsert_sql, data + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + # Get current UTC time and convert to naive datetime for database storage + current_time = datetime.datetime.now(timezone.utc).replace(tzinfo=None) + list_data = [ + { + "__id__": k, + **{k1: v1 for k1, v1 in v.items()}, + } + for k, v in data.items() + ] + contents = [v["content"] for v in data.values()] + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + + embeddings = np.concatenate(embeddings_list) + for i, d in enumerate(list_data): + d["__vector__"] = embeddings[i] + for item in list_data: + if is_namespace(self.namespace, NameSpace.VECTOR_STORE_CHUNKS): + upsert_sql, data = self._upsert_chunks(item, current_time) + elif is_namespace(self.namespace, NameSpace.VECTOR_STORE_ENTITIES): + upsert_sql, data = self._upsert_entities(item, current_time) + elif is_namespace(self.namespace, NameSpace.VECTOR_STORE_RELATIONSHIPS): + upsert_sql, data = self._upsert_relationships(item, current_time) + else: + raise ValueError(f"{self.namespace} is not supported") + + await self.db.execute(upsert_sql, data) + + #################### query method ############### + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + if query_embedding is not None: + embedding = query_embedding + else: + embeddings = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + embedding = embeddings[0] + + embedding_string = ",".join(map(str, embedding)) + + sql = SQL_TEMPLATES[self.namespace].format(embedding_string=embedding_string) + params = { + "workspace": self.workspace, + "closer_than_threshold": 1 - self.cosine_better_than_threshold, + "top_k": top_k, + } + results = await self.db.query(sql, params=list(params.values()), multirows=True) + return results + + async def index_done_callback(self) -> None: + # PG handles persistence automatically + pass + + async def delete(self, ids: list[str]) -> None: + """Delete vectors with specified IDs from the storage. + + Args: + ids: List of vector IDs to be deleted + """ + if not ids: + return + + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for vector deletion: {self.namespace}" + ) + return + + delete_sql = f"DELETE FROM {table_name} WHERE workspace=$1 AND id = ANY($2)" + + try: + await self.db.execute(delete_sql, {"workspace": self.workspace, "ids": ids}) + logger.debug( + f"[{self.workspace}] Successfully deleted {len(ids)} vectors from {self.namespace}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting vectors from {self.namespace}: {e}" + ) + + async def delete_entity(self, entity_name: str) -> None: + """Delete an entity by its name from the vector storage. + + Args: + entity_name: The name of the entity to delete + """ + try: + # Construct SQL to delete the entity + delete_sql = """DELETE FROM LIGHTRAG_VDB_ENTITY + WHERE workspace=$1 AND entity_name=$2""" + + await self.db.execute( + delete_sql, {"workspace": self.workspace, "entity_name": entity_name} + ) + logger.debug( + f"[{self.workspace}] Successfully deleted entity {entity_name}" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error deleting entity {entity_name}: {e}") + + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete all relations associated with an entity. + + Args: + entity_name: The name of the entity whose relations should be deleted + """ + try: + # Delete relations where the entity is either the source or target + delete_sql = """DELETE FROM LIGHTRAG_VDB_RELATION + WHERE workspace=$1 AND (source_id=$2 OR target_id=$2)""" + + await self.db.execute( + delete_sql, {"workspace": self.workspace, "entity_name": entity_name} + ) + logger.debug( + f"[{self.workspace}] Successfully deleted relations for entity {entity_name}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error deleting relations for entity {entity_name}: {e}" + ) + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for ID lookup: {self.namespace}" + ) + return None + + query = f"SELECT *, EXTRACT(EPOCH FROM create_time)::BIGINT as created_at FROM {table_name} WHERE workspace=$1 AND id=$2" + params = {"workspace": self.workspace, "id": id} + + try: + result = await self.db.query(query, list(params.values())) + if result: + return dict(result) + return None + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for ID {id}: {e}" + ) + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for IDs lookup: {self.namespace}" + ) + return [] + + ids_str = ",".join([f"'{id}'" for id in ids]) + query = f"SELECT *, EXTRACT(EPOCH FROM create_time)::BIGINT as created_at FROM {table_name} WHERE workspace=$1 AND id IN ({ids_str})" + params = {"workspace": self.workspace} + + try: + results = await self.db.query(query, list(params.values()), multirows=True) + if not results: + return [] + + # Preserve caller requested ordering while normalizing asyncpg rows to dicts. + id_map: dict[str, dict[str, Any]] = {} + for record in results: + if record is None: + continue + record_dict = dict(record) + row_id = record_dict.get("id") + if row_id is not None: + id_map[str(row_id)] = record_dict + + ordered_results: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered_results.append(id_map.get(str(requested_id))) + return ordered_results + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for IDs {ids}: {e}" + ) + return [] + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for vector lookup: {self.namespace}" + ) + return {} + + ids_str = ",".join([f"'{id}'" for id in ids]) + query = f"SELECT id, content_vector FROM {table_name} WHERE workspace=$1 AND id IN ({ids_str})" + params = {"workspace": self.workspace} + + try: + results = await self.db.query(query, list(params.values()), multirows=True) + vectors_dict = {} + + for result in results: + if result and "content_vector" in result and "id" in result: + try: + # Parse JSON string to get vector as list of floats + vector_data = json.loads(result["content_vector"]) + if isinstance(vector_data, list): + vectors_dict[result["id"]] = vector_data + except (json.JSONDecodeError, TypeError) as e: + logger.warning( + f"[{self.workspace}] Failed to parse vector data for ID {result['id']}: {e}" + ) + + return vectors_dict + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vectors by IDs from {self.namespace}: {e}" + ) + return {} + + async def drop(self) -> dict[str, str]: + """Drop the storage""" + async with get_storage_lock(): + try: + table_name = namespace_to_table_name(self.namespace) + if not table_name: + return { + "status": "error", + "message": f"Unknown namespace: {self.namespace}", + } + + drop_sql = SQL_TEMPLATES["drop_specifiy_table_workspace"].format( + table_name=table_name + ) + await self.db.execute(drop_sql, {"workspace": self.workspace}) + return {"status": "success", "message": "data dropped"} + except Exception as e: + return {"status": "error", "message": str(e)} + + +@final +@dataclass +class PGDocStatusStorage(DocStatusStorage): + db: PostgreSQLDB = field(default=None) + + def _format_datetime_with_timezone(self, dt): + """Convert datetime to ISO format string with timezone info""" + if dt is None: + return None + # If no timezone info, assume it's UTC time (as stored in database) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + # If datetime already has timezone info, keep it as is + return dt.isoformat() + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + # Implement workspace priority: PostgreSQLDB.workspace > self.workspace > "default" + if self.db.workspace: + # Use PostgreSQLDB's workspace (highest priority) + self.workspace = self.db.workspace + elif hasattr(self, "workspace") and self.workspace: + # Use storage class's workspace (medium priority) + pass + else: + # Use "default" for compatibility (lowest priority) + self.workspace = "default" + + async def finalize(self): + async with get_storage_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + + async def filter_keys(self, keys: set[str]) -> set[str]: + """Filter out duplicated content""" + if not keys: + return set() + + table_name = namespace_to_table_name(self.namespace) + sql = f"SELECT id FROM {table_name} WHERE workspace=$1 AND id = ANY($2)" + params = {"workspace": self.workspace, "ids": list(keys)} + try: + res = await self.db.query(sql, list(params.values()), multirows=True) + if res: + exist_keys = [key["id"] for key in res] + else: + exist_keys = [] + new_keys = set([s for s in keys if s not in exist_keys]) + # print(f"keys: {keys}") + # print(f"new_keys: {new_keys}") + return new_keys + except Exception as e: + logger.error( + f"[{self.workspace}] PostgreSQL database,\nsql:{sql},\nparams:{params},\nerror:{e}" + ) + raise + + async def get_by_id(self, id: str) -> Union[dict[str, Any], None]: + sql = "select * from LIGHTRAG_DOC_STATUS where workspace=$1 and id=$2" + params = {"workspace": self.workspace, "id": id} + result = await self.db.query(sql, list(params.values()), True) + if result is None or result == []: + return None + else: + # Parse chunks_list JSON string back to list + chunks_list = result[0].get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = result[0].get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(result[0]["created_at"]) + updated_at = self._format_datetime_with_timezone(result[0]["updated_at"]) + + return dict( + content_length=result[0]["content_length"], + content_summary=result[0]["content_summary"], + status=result[0]["status"], + chunks_count=result[0]["chunks_count"], + created_at=created_at, + updated_at=updated_at, + file_path=result[0]["file_path"], + chunks_list=chunks_list, + metadata=metadata, + error_msg=result[0].get("error_msg"), + track_id=result[0].get("track_id"), + ) + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get doc_chunks data by multiple IDs.""" + if not ids: + return [] + + sql = "SELECT * FROM LIGHTRAG_DOC_STATUS WHERE workspace=$1 AND id = ANY($2)" + params = {"workspace": self.workspace, "ids": ids} + + results = await self.db.query(sql, list(params.values()), True) + + if not results: + return [] + + processed_map: dict[str, dict[str, Any]] = {} + for row in results: + # Parse chunks_list JSON string back to list + chunks_list = row.get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = row.get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(row["created_at"]) + updated_at = self._format_datetime_with_timezone(row["updated_at"]) + + processed_map[str(row.get("id"))] = { + "content_length": row["content_length"], + "content_summary": row["content_summary"], + "status": row["status"], + "chunks_count": row["chunks_count"], + "created_at": created_at, + "updated_at": updated_at, + "file_path": row["file_path"], + "chunks_list": chunks_list, + "metadata": metadata, + "error_msg": row.get("error_msg"), + "track_id": row.get("track_id"), + } + + ordered_results: list[dict[str, Any] | None] = [] + for requested_id in ids: + ordered_results.append(processed_map.get(str(requested_id))) + + return ordered_results + + async def get_doc_by_file_path(self, file_path: str) -> Union[dict[str, Any], None]: + """Get document by file path + + Args: + file_path: The file path to search for + + Returns: + Union[dict[str, Any], None]: Document data if found, None otherwise + Returns the same format as get_by_id method + """ + sql = "select * from LIGHTRAG_DOC_STATUS where workspace=$1 and file_path=$2" + params = {"workspace": self.workspace, "file_path": file_path} + result = await self.db.query(sql, list(params.values()), True) + + if result is None or result == []: + return None + else: + # Parse chunks_list JSON string back to list + chunks_list = result[0].get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = result[0].get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(result[0]["created_at"]) + updated_at = self._format_datetime_with_timezone(result[0]["updated_at"]) + + return dict( + content_length=result[0]["content_length"], + content_summary=result[0]["content_summary"], + status=result[0]["status"], + chunks_count=result[0]["chunks_count"], + created_at=created_at, + updated_at=updated_at, + file_path=result[0]["file_path"], + chunks_list=chunks_list, + metadata=metadata, + error_msg=result[0].get("error_msg"), + track_id=result[0].get("track_id"), + ) + + async def get_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status""" + sql = """SELECT status as "status", COUNT(1) as "count" + FROM LIGHTRAG_DOC_STATUS + where workspace=$1 GROUP BY STATUS + """ + params = {"workspace": self.workspace} + result = await self.db.query(sql, list(params.values()), True) + counts = {} + for doc in result: + counts[doc["status"]] = doc["count"] + return counts + + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """all documents with a specific status""" + sql = "select * from LIGHTRAG_DOC_STATUS where workspace=$1 and status=$2" + params = {"workspace": self.workspace, "status": status.value} + result = await self.db.query(sql, list(params.values()), True) + + docs_by_status = {} + for element in result: + # Parse chunks_list JSON string back to list + chunks_list = element.get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = element.get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + # Ensure metadata is a dict + if not isinstance(metadata, dict): + metadata = {} + + # Safe handling for file_path + file_path = element.get("file_path") + if file_path is None: + file_path = "no-file-path" + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(element["created_at"]) + updated_at = self._format_datetime_with_timezone(element["updated_at"]) + + docs_by_status[element["id"]] = DocProcessingStatus( + content_summary=element["content_summary"], + content_length=element["content_length"], + status=element["status"], + created_at=created_at, + updated_at=updated_at, + chunks_count=element["chunks_count"], + file_path=file_path, + chunks_list=chunks_list, + metadata=metadata, + error_msg=element.get("error_msg"), + track_id=element.get("track_id"), + ) + + return docs_by_status + + async def get_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific track_id""" + sql = "select * from LIGHTRAG_DOC_STATUS where workspace=$1 and track_id=$2" + params = {"workspace": self.workspace, "track_id": track_id} + result = await self.db.query(sql, list(params.values()), True) + + docs_by_track_id = {} + for element in result: + # Parse chunks_list JSON string back to list + chunks_list = element.get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = element.get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + # Ensure metadata is a dict + if not isinstance(metadata, dict): + metadata = {} + + # Safe handling for file_path + file_path = element.get("file_path") + if file_path is None: + file_path = "no-file-path" + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(element["created_at"]) + updated_at = self._format_datetime_with_timezone(element["updated_at"]) + + docs_by_track_id[element["id"]] = DocProcessingStatus( + content_summary=element["content_summary"], + content_length=element["content_length"], + status=element["status"], + created_at=created_at, + updated_at=updated_at, + chunks_count=element["chunks_count"], + file_path=file_path, + chunks_list=chunks_list, + track_id=element.get("track_id"), + metadata=metadata, + error_msg=element.get("error_msg"), + ) + + return docs_by_track_id + + async def get_docs_paginated( + self, + status_filter: DocStatus | None = None, + page: int = 1, + page_size: int = 50, + sort_field: str = "updated_at", + sort_direction: str = "desc", + ) -> tuple[list[tuple[str, DocProcessingStatus]], int]: + """Get documents with pagination support + + Args: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', 'id') + sort_direction: Sort direction ('asc' or 'desc') + + Returns: + Tuple of (list of (doc_id, DocProcessingStatus) tuples, total_count) + """ + # Validate parameters + if page < 1: + page = 1 + if page_size < 10: + page_size = 10 + elif page_size > 200: + page_size = 200 + + # Whitelist validation for sort_field to prevent SQL injection + allowed_sort_fields = {"created_at", "updated_at", "id", "file_path"} + if sort_field not in allowed_sort_fields: + sort_field = "updated_at" + + # Whitelist validation for sort_direction to prevent SQL injection + if sort_direction.lower() not in ["asc", "desc"]: + sort_direction = "desc" + else: + sort_direction = sort_direction.lower() + + # Calculate offset + offset = (page - 1) * page_size + + # Build parameterized query components + params = {"workspace": self.workspace} + param_count = 1 + + # Build WHERE clause with parameterized query + if status_filter is not None: + param_count += 1 + where_clause = "WHERE workspace=$1 AND status=$2" + params["status"] = status_filter.value + else: + where_clause = "WHERE workspace=$1" + + # Build ORDER BY clause using validated whitelist values + order_clause = f"ORDER BY {sort_field} {sort_direction.upper()}" + + # Query for total count + count_sql = f"SELECT COUNT(*) as total FROM LIGHTRAG_DOC_STATUS {where_clause}" + count_result = await self.db.query(count_sql, list(params.values())) + total_count = count_result["total"] if count_result else 0 + + # Query for paginated data with parameterized LIMIT and OFFSET + data_sql = f""" + SELECT * FROM LIGHTRAG_DOC_STATUS + {where_clause} + {order_clause} + LIMIT ${param_count + 1} OFFSET ${param_count + 2} + """ + params["limit"] = page_size + params["offset"] = offset + + result = await self.db.query(data_sql, list(params.values()), True) + + # Convert to (doc_id, DocProcessingStatus) tuples + documents = [] + for element in result: + doc_id = element["id"] + + # Parse chunks_list JSON string back to list + chunks_list = element.get("chunks_list", []) + if isinstance(chunks_list, str): + try: + chunks_list = json.loads(chunks_list) + except json.JSONDecodeError: + chunks_list = [] + + # Parse metadata JSON string back to dict + metadata = element.get("metadata", {}) + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + metadata = {} + + # Convert datetime objects to ISO format strings with timezone info + created_at = self._format_datetime_with_timezone(element["created_at"]) + updated_at = self._format_datetime_with_timezone(element["updated_at"]) + + doc_status = DocProcessingStatus( + content_summary=element["content_summary"], + content_length=element["content_length"], + status=element["status"], + created_at=created_at, + updated_at=updated_at, + chunks_count=element["chunks_count"], + file_path=element["file_path"], + chunks_list=chunks_list, + track_id=element.get("track_id"), + metadata=metadata, + error_msg=element.get("error_msg"), + ) + documents.append((doc_id, doc_status)) + + return documents, total_count + + async def get_all_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status for all documents + + Returns: + Dictionary mapping status names to counts, including 'all' field + """ + sql = """ + SELECT status, COUNT(*) as count + FROM LIGHTRAG_DOC_STATUS + WHERE workspace=$1 + GROUP BY status + """ + params = {"workspace": self.workspace} + result = await self.db.query(sql, list(params.values()), True) + + counts = {} + total_count = 0 + for row in result: + counts[row["status"]] = row["count"] + total_count += row["count"] + + # Add 'all' field with total count + counts["all"] = total_count + + return counts + + async def index_done_callback(self) -> None: + # PG handles persistence automatically + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for is_empty check: {self.namespace}" + ) + return True + + sql = f"SELECT EXISTS(SELECT 1 FROM {table_name} WHERE workspace=$1 LIMIT 1) as has_data" + + try: + result = await self.db.query(sql, [self.workspace]) + return not result.get("has_data", False) if result else True + except Exception as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + async def delete(self, ids: list[str]) -> None: + """Delete specific records from storage by their IDs + + Args: + ids (list[str]): List of document IDs to be deleted from storage + + Returns: + None + """ + if not ids: + return + + table_name = namespace_to_table_name(self.namespace) + if not table_name: + logger.error( + f"[{self.workspace}] Unknown namespace for deletion: {self.namespace}" + ) + return + + delete_sql = f"DELETE FROM {table_name} WHERE workspace=$1 AND id = ANY($2)" + + try: + await self.db.execute(delete_sql, {"workspace": self.workspace, "ids": ids}) + logger.debug( + f"[{self.workspace}] Successfully deleted {len(ids)} records from {self.namespace}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting records from {self.namespace}: {e}" + ) + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """Update or insert document status + + Args: + data: dictionary of document IDs and their status data + """ + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + def parse_datetime(dt_str): + """Parse datetime and ensure it's stored as UTC time in database""" + if dt_str is None: + return None + if isinstance(dt_str, (datetime.date, datetime.datetime)): + # If it's a datetime object + if isinstance(dt_str, datetime.datetime): + # If no timezone info, assume it's UTC + if dt_str.tzinfo is None: + dt_str = dt_str.replace(tzinfo=timezone.utc) + # Convert to UTC and remove timezone info for storage + return dt_str.astimezone(timezone.utc).replace(tzinfo=None) + return dt_str + try: + # Process ISO format string with timezone + dt = datetime.datetime.fromisoformat(dt_str) + # If no timezone info, assume it's UTC + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + # Convert to UTC and remove timezone info for storage + return dt.astimezone(timezone.utc).replace(tzinfo=None) + except (ValueError, TypeError): + logger.warning( + f"[{self.workspace}] Unable to parse datetime string: {dt_str}" + ) + return None + + # Modified SQL to include created_at, updated_at, chunks_list, track_id, metadata, and error_msg in both INSERT and UPDATE operations + # All fields are updated from the input data in both INSERT and UPDATE cases + sql = """insert into LIGHTRAG_DOC_STATUS(workspace,id,content_summary,content_length,chunks_count,status,file_path,chunks_list,track_id,metadata,error_msg,created_at,updated_at) + values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13) + on conflict(id,workspace) do update set + content_summary = EXCLUDED.content_summary, + content_length = EXCLUDED.content_length, + chunks_count = EXCLUDED.chunks_count, + status = EXCLUDED.status, + file_path = EXCLUDED.file_path, + chunks_list = EXCLUDED.chunks_list, + track_id = EXCLUDED.track_id, + metadata = EXCLUDED.metadata, + error_msg = EXCLUDED.error_msg, + created_at = EXCLUDED.created_at, + updated_at = EXCLUDED.updated_at""" + for k, v in data.items(): + # Remove timezone information, store utc time in db + created_at = parse_datetime(v.get("created_at")) + updated_at = parse_datetime(v.get("updated_at")) + + # chunks_count, chunks_list, track_id, metadata, and error_msg are optional + await self.db.execute( + sql, + { + "workspace": self.workspace, + "id": k, + "content_summary": v["content_summary"], + "content_length": v["content_length"], + "chunks_count": v["chunks_count"] if "chunks_count" in v else -1, + "status": v["status"], + "file_path": v["file_path"], + "chunks_list": json.dumps(v.get("chunks_list", [])), + "track_id": v.get("track_id"), # Add track_id support + "metadata": json.dumps( + v.get("metadata", {}) + ), # Add metadata support + "error_msg": v.get("error_msg"), # Add error_msg support + "created_at": created_at, # Use the converted datetime object + "updated_at": updated_at, # Use the converted datetime object + }, + ) + + async def drop(self) -> dict[str, str]: + """Drop the storage""" + async with get_storage_lock(): + try: + table_name = namespace_to_table_name(self.namespace) + if not table_name: + return { + "status": "error", + "message": f"Unknown namespace: {self.namespace}", + } + + drop_sql = SQL_TEMPLATES["drop_specifiy_table_workspace"].format( + table_name=table_name + ) + await self.db.execute(drop_sql, {"workspace": self.workspace}) + return {"status": "success", "message": "data dropped"} + except Exception as e: + return {"status": "error", "message": str(e)} + + +class PGGraphQueryException(Exception): + """Exception for the AGE queries.""" + + def __init__(self, exception: Union[str, dict[str, Any]]) -> None: + if isinstance(exception, dict): + self.message = exception["message"] if "message" in exception else "unknown" + self.details = exception["details"] if "details" in exception else "unknown" + else: + self.message = exception + self.details = "unknown" + + def get_message(self) -> str: + return self.message + + def get_details(self) -> Any: + return self.details + + +@final +@dataclass +class PGGraphStorage(BaseGraphStorage): + def __post_init__(self): + # Graph name will be dynamically generated in initialize() based on workspace + self.db: PostgreSQLDB | None = None + + def _get_workspace_graph_name(self) -> str: + """ + Generate graph name based on workspace and namespace for data isolation. + Rules: + - If workspace is empty or "default": graph_name = namespace + - If workspace has other value: graph_name = workspace_namespace + + Args: + None + + Returns: + str: The graph name for the current workspace + """ + workspace = self.workspace + namespace = self.namespace + + if workspace and workspace.strip() and workspace.strip().lower() != "default": + # Ensure names comply with PostgreSQL identifier specifications + safe_workspace = re.sub(r"[^a-zA-Z0-9_]", "_", workspace.strip()) + safe_namespace = re.sub(r"[^a-zA-Z0-9_]", "_", namespace) + return f"{safe_workspace}_{safe_namespace}" + else: + # When the workspace is "default", use the namespace directly (for backward compatibility with legacy implementations) + return re.sub(r"[^a-zA-Z0-9_]", "_", namespace) + + @staticmethod + def _normalize_node_id(node_id: str) -> str: + """ + Normalize node ID to ensure special characters are properly handled in Cypher queries. + + Args: + node_id: The original node ID + + Returns: + Normalized node ID suitable for Cypher queries + """ + # Escape backslashes + normalized_id = node_id + normalized_id = normalized_id.replace("\\", "\\\\") + normalized_id = normalized_id.replace('"', '\\"') + return normalized_id + + async def initialize(self): + async with get_data_init_lock(): + if self.db is None: + self.db = await ClientManager.get_client() + + # Implement workspace priority: PostgreSQLDB.workspace > self.workspace > "default" + if self.db.workspace: + # Use PostgreSQLDB's workspace (highest priority) + self.workspace = self.db.workspace + elif hasattr(self, "workspace") and self.workspace: + # Use storage class's workspace (medium priority) + pass + else: + # Use "default" for compatibility (lowest priority) + self.workspace = "default" + + # Dynamically generate graph name based on workspace + self.graph_name = self._get_workspace_graph_name() + + # Log the graph initialization for debugging + logger.info( + f"[{self.workspace}] PostgreSQL Graph initialized: graph_name='{self.graph_name}'" + ) + + # Create AGE extension and configure graph environment once at initialization + async with self.db.pool.acquire() as connection: + # First ensure AGE extension is created + await PostgreSQLDB.configure_age_extension(connection) + + # Execute each statement separately and ignore errors + queries = [ + f"SELECT create_graph('{self.graph_name}')", + f"SELECT create_vlabel('{self.graph_name}', 'base');", + f"SELECT create_elabel('{self.graph_name}', 'DIRECTED');", + # f'CREATE INDEX CONCURRENTLY vertex_p_idx ON {self.graph_name}."_ag_label_vertex" (id)', + f'CREATE INDEX CONCURRENTLY vertex_idx_node_id ON {self.graph_name}."_ag_label_vertex" (ag_catalog.agtype_access_operator(properties, \'"entity_id"\'::agtype))', + # f'CREATE INDEX CONCURRENTLY edge_p_idx ON {self.graph_name}."_ag_label_edge" (id)', + f'CREATE INDEX CONCURRENTLY edge_sid_idx ON {self.graph_name}."_ag_label_edge" (start_id)', + f'CREATE INDEX CONCURRENTLY edge_eid_idx ON {self.graph_name}."_ag_label_edge" (end_id)', + f'CREATE INDEX CONCURRENTLY edge_seid_idx ON {self.graph_name}."_ag_label_edge" (start_id,end_id)', + f'CREATE INDEX CONCURRENTLY directed_p_idx ON {self.graph_name}."DIRECTED" (id)', + f'CREATE INDEX CONCURRENTLY directed_eid_idx ON {self.graph_name}."DIRECTED" (end_id)', + f'CREATE INDEX CONCURRENTLY directed_sid_idx ON {self.graph_name}."DIRECTED" (start_id)', + f'CREATE INDEX CONCURRENTLY directed_seid_idx ON {self.graph_name}."DIRECTED" (start_id,end_id)', + f'CREATE INDEX CONCURRENTLY entity_p_idx ON {self.graph_name}."base" (id)', + f'CREATE INDEX CONCURRENTLY entity_idx_node_id ON {self.graph_name}."base" (ag_catalog.agtype_access_operator(properties, \'"entity_id"\'::agtype))', + f'CREATE INDEX CONCURRENTLY entity_node_id_gin_idx ON {self.graph_name}."base" using gin(properties)', + f'ALTER TABLE {self.graph_name}."DIRECTED" CLUSTER ON directed_sid_idx', + ] + + for query in queries: + # Use the new flag to silently ignore "already exists" errors + # at the source, preventing log spam. + await self.db.execute( + query, + upsert=True, + ignore_if_exists=True, # Pass the new flag + with_age=True, + graph_name=self.graph_name, + ) + + async def finalize(self): + async with get_graph_db_lock(): + if self.db is not None: + await ClientManager.release_client(self.db) + self.db = None + + async def index_done_callback(self) -> None: + # PG handles persistence automatically + pass + + @staticmethod + def _record_to_dict(record: asyncpg.Record) -> dict[str, Any]: + """ + Convert a record returned from an age query to a dictionary + + Args: + record (): a record from an age query result + + Returns: + dict[str, Any]: a dictionary representation of the record where + the dictionary key is the field name and the value is the + value converted to a python type + """ + + @staticmethod + def parse_agtype_string(agtype_str: str) -> tuple[str, str]: + """ + Parse agtype string precisely, separating JSON content and type identifier + + Args: + agtype_str: String like '{"json": "content"}::vertex' + + Returns: + (json_content, type_identifier) + """ + if not isinstance(agtype_str, str) or "::" not in agtype_str: + return agtype_str, "" + + # Find the last :: from the right, which is the start of type identifier + last_double_colon = agtype_str.rfind("::") + + if last_double_colon == -1: + return agtype_str, "" + + # Separate JSON content and type identifier + json_content = agtype_str[:last_double_colon] + type_identifier = agtype_str[last_double_colon + 2 :] + + return json_content, type_identifier + + @staticmethod + def safe_json_parse(json_str: str, context: str = "") -> dict: + """ + Safe JSON parsing with simplified error logging + """ + try: + return json.loads(json_str) + except json.JSONDecodeError as e: + logger.error(f"JSON parsing failed ({context}): {e}") + logger.error(f"Raw data (first 100 chars): {repr(json_str[:100])}") + logger.error(f"Error position: line {e.lineno}, column {e.colno}") + return None + + # result holder + d = {} + + # prebuild a mapping of vertex_id to vertex mappings to be used + # later to build edges + vertices = {} + + # First pass: preprocess vertices + for k in record.keys(): + v = record[k] + if isinstance(v, str) and "::" in v: + if v.startswith("[") and v.endswith("]"): + # Handle vertex arrays + json_content, type_id = parse_agtype_string(v) + if type_id == "vertex": + vertexes = safe_json_parse( + json_content, f"vertices array for {k}" + ) + if vertexes: + for vertex in vertexes: + vertices[vertex["id"]] = vertex.get("properties") + else: + # Handle single vertex + json_content, type_id = parse_agtype_string(v) + if type_id == "vertex": + vertex = safe_json_parse(json_content, f"single vertex for {k}") + if vertex: + vertices[vertex["id"]] = vertex.get("properties") + + # Second pass: process all fields + for k in record.keys(): + v = record[k] + if isinstance(v, str) and "::" in v: + if v.startswith("[") and v.endswith("]"): + # Handle array types + json_content, type_id = parse_agtype_string(v) + if type_id in ["vertex", "edge"]: + parsed_data = safe_json_parse( + json_content, f"array {type_id} for field {k}" + ) + d[k] = parsed_data if parsed_data is not None else None + else: + logger.warning(f"Unknown array type: {type_id}") + d[k] = None + else: + # Handle single objects + json_content, type_id = parse_agtype_string(v) + if type_id in ["vertex", "edge"]: + parsed_data = safe_json_parse( + json_content, f"single {type_id} for field {k}" + ) + d[k] = parsed_data if parsed_data is not None else None + else: + # May be other types of agtype data, keep as is + d[k] = v + else: + d[k] = v # Keep as string + + return d + + @staticmethod + def _format_properties( + properties: dict[str, Any], _id: Union[str, None] = None + ) -> str: + """ + Convert a dictionary of properties to a string representation that + can be used in a cypher query insert/merge statement. + + Args: + properties (dict[str,str]): a dictionary containing node/edge properties + _id (Union[str, None]): the id of the node or None if none exists + + Returns: + str: the properties dictionary as a properly formatted string + """ + props = [] + # wrap property key in backticks to escape + for k, v in properties.items(): + prop = f"`{k}`: {json.dumps(v)}" + props.append(prop) + if _id is not None and "id" not in properties: + props.append( + f"id: {json.dumps(_id)}" if isinstance(_id, str) else f"id: {_id}" + ) + return "{" + ", ".join(props) + "}" + + async def _query( + self, + query: str, + readonly: bool = True, + upsert: bool = False, + params: dict[str, Any] | None = None, + ) -> list[dict[str, Any]]: + """ + Query the graph by taking a cypher query, converting it to an + age compatible query, executing it and converting the result + + Args: + query (str): a cypher query to be executed + + Returns: + list[dict[str, Any]]: a list of dictionaries containing the result set + """ + try: + if readonly: + data = await self.db.query( + query, + list(params.values()) if params else None, + multirows=True, + with_age=True, + graph_name=self.graph_name, + ) + else: + data = await self.db.execute( + query, + upsert=upsert, + with_age=True, + graph_name=self.graph_name, + ) + + except Exception as e: + raise PGGraphQueryException( + { + "message": f"Error executing graph query: {query}", + "wrapped": query, + "detail": repr(e), + "error_type": e.__class__.__name__, + } + ) from e + + if data is None: + result = [] + # decode records + else: + result = [self._record_to_dict(d) for d in data] + + return result + + async def has_node(self, node_id: str) -> bool: + query = f""" + SELECT EXISTS ( + SELECT 1 + FROM {self.graph_name}.base + WHERE ag_catalog.agtype_access_operator( + VARIADIC ARRAY[properties, '"entity_id"'::agtype] + ) = (to_json($1::text)::text)::agtype + LIMIT 1 + ) AS node_exists; + """ + + params = {"node_id": node_id} + row = (await self._query(query, params=params))[0] + return bool(row["node_exists"]) + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + query = f""" + WITH a AS ( + SELECT id AS vid + FROM {self.graph_name}.base + WHERE ag_catalog.agtype_access_operator( + VARIADIC ARRAY[properties, '"entity_id"'::agtype] + ) = (to_json($1::text)::text)::agtype + ), + b AS ( + SELECT id AS vid + FROM {self.graph_name}.base + WHERE ag_catalog.agtype_access_operator( + VARIADIC ARRAY[properties, '"entity_id"'::agtype] + ) = (to_json($2::text)::text)::agtype + ) + SELECT EXISTS ( + SELECT 1 + FROM {self.graph_name}."DIRECTED" d + JOIN a ON d.start_id = a.vid + JOIN b ON d.end_id = b.vid + LIMIT 1 + ) + OR EXISTS ( + SELECT 1 + FROM {self.graph_name}."DIRECTED" d + JOIN a ON d.end_id = a.vid + JOIN b ON d.start_id = b.vid + LIMIT 1 + ) AS edge_exists; + """ + params = { + "source_node_id": source_node_id, + "target_node_id": target_node_id, + } + row = (await self._query(query, params=params))[0] + return bool(row["edge_exists"]) + + async def get_node(self, node_id: str) -> dict[str, str] | None: + """Get node by its label identifier, return only node properties""" + + result = await self.get_nodes_batch(node_ids=[node_id]) + if result and node_id in result: + return result[node_id] + return None + + async def node_degree(self, node_id: str) -> int: + result = await self.node_degrees_batch(node_ids=[node_id]) + if result and node_id in result: + return result[node_id] + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + result = await self.edge_degrees_batch(edges=[(src_id, tgt_id)]) + if result and (src_id, tgt_id) in result: + return result[(src_id, tgt_id)] + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> dict[str, str] | None: + """Get edge properties between two nodes""" + result = await self.get_edges_batch( + [{"src": source_node_id, "tgt": target_node_id}] + ) + if result and (source_node_id, target_node_id) in result: + return result[(source_node_id, target_node_id)] + return None + + async def get_node_edges(self, source_node_id: str) -> list[tuple[str, str]] | None: + """ + Retrieves all edges (relationships) for a particular node identified by its label. + :return: list of dictionaries containing edge information + """ + label = self._normalize_node_id(source_node_id) + + query = """SELECT * FROM cypher('%s', $$ + MATCH (n:base {entity_id: "%s"}) + OPTIONAL MATCH (n)-[]-(connected:base) + RETURN n.entity_id AS source_id, connected.entity_id AS connected_id + $$) AS (source_id text, connected_id text)""" % ( + self.graph_name, + label, + ) + + results = await self._query(query) + edges = [] + for record in results: + source_id = record["source_id"] + connected_id = record["connected_id"] + + if source_id and connected_id: + edges.append((source_id, connected_id)) + + return edges + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type((PGGraphQueryException,)), + ) + async def upsert_node(self, node_id: str, node_data: dict[str, str]) -> None: + """ + Upsert a node in the Neo4j database. + + Args: + node_id: The unique identifier for the node (used as label) + node_data: Dictionary of node properties + """ + if "entity_id" not in node_data: + raise ValueError( + "PostgreSQL: node properties must contain an 'entity_id' field" + ) + + label = self._normalize_node_id(node_id) + properties = self._format_properties(node_data) + + query = """SELECT * FROM cypher('%s', $$ + MERGE (n:base {entity_id: "%s"}) + SET n += %s + RETURN n + $$) AS (n agtype)""" % ( + self.graph_name, + label, + properties, + ) + + try: + await self._query(query, readonly=False, upsert=True) + + except Exception: + logger.error( + f"[{self.workspace}] POSTGRES, upsert_node error on node_id: `{node_id}`" + ) + raise + + @retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type((PGGraphQueryException,)), + ) + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ) -> None: + """ + Upsert an edge and its properties between two nodes identified by their labels. + + Args: + source_node_id (str): Label of the source node (used as identifier) + target_node_id (str): Label of the target node (used as identifier) + edge_data (dict): dictionary of properties to set on the edge + """ + src_label = self._normalize_node_id(source_node_id) + tgt_label = self._normalize_node_id(target_node_id) + edge_properties = self._format_properties(edge_data) + + query = """SELECT * FROM cypher('%s', $$ + MATCH (source:base {entity_id: "%s"}) + WITH source + MATCH (target:base {entity_id: "%s"}) + MERGE (source)-[r:DIRECTED]-(target) + SET r += %s + SET r += %s + RETURN r + $$) AS (r agtype)""" % ( + self.graph_name, + src_label, + tgt_label, + edge_properties, + edge_properties, # https://github.com/HKUDS/LightRAG/issues/1438#issuecomment-2826000195 + ) + + try: + await self._query(query, readonly=False, upsert=True) + + except Exception: + logger.error( + f"[{self.workspace}] POSTGRES, upsert_edge error on edge: `{source_node_id}`-`{target_node_id}`" + ) + raise + + async def delete_node(self, node_id: str) -> None: + """ + Delete a node from the graph. + + Args: + node_id (str): The ID of the node to delete. + """ + label = self._normalize_node_id(node_id) + + query = """SELECT * FROM cypher('%s', $$ + MATCH (n:base {entity_id: "%s"}) + DETACH DELETE n + $$) AS (n agtype)""" % (self.graph_name, label) + + try: + await self._query(query, readonly=False) + except Exception as e: + logger.error(f"[{self.workspace}] Error during node deletion: {e}") + raise + + async def remove_nodes(self, node_ids: list[str]) -> None: + """ + Remove multiple nodes from the graph. + + Args: + node_ids (list[str]): A list of node IDs to remove. + """ + node_ids = [self._normalize_node_id(node_id) for node_id in node_ids] + node_id_list = ", ".join([f'"{node_id}"' for node_id in node_ids]) + + query = """SELECT * FROM cypher('%s', $$ + MATCH (n:base) + WHERE n.entity_id IN [%s] + DETACH DELETE n + $$) AS (n agtype)""" % (self.graph_name, node_id_list) + + try: + await self._query(query, readonly=False) + except Exception as e: + logger.error(f"[{self.workspace}] Error during node removal: {e}") + raise + + async def remove_edges(self, edges: list[tuple[str, str]]) -> None: + """ + Remove multiple edges from the graph. + + Args: + edges (list[tuple[str, str]]): A list of edges to remove, where each edge is a tuple of (source_node_id, target_node_id). + """ + for source, target in edges: + src_label = self._normalize_node_id(source) + tgt_label = self._normalize_node_id(target) + + query = """SELECT * FROM cypher('%s', $$ + MATCH (a:base {entity_id: "%s"})-[r]-(b:base {entity_id: "%s"}) + DELETE r + $$) AS (r agtype)""" % (self.graph_name, src_label, tgt_label) + + try: + await self._query(query, readonly=False) + logger.debug( + f"[{self.workspace}] Deleted edge from '{source}' to '{target}'" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error during edge deletion: {str(e)}") + raise + + async def get_nodes_batch( + self, node_ids: list[str], batch_size: int = 1000 + ) -> dict[str, dict]: + """ + Retrieve multiple nodes in one query using UNWIND. + + Args: + node_ids: List of node entity IDs to fetch. + batch_size: Batch size for the query + + Returns: + A dictionary mapping each node_id to its node data (or None if not found). + """ + if not node_ids: + return {} + + seen: set[str] = set() + unique_ids: list[str] = [] + lookup: dict[str, str] = {} + requested: set[str] = set() + for nid in node_ids: + if nid not in seen: + seen.add(nid) + unique_ids.append(nid) + requested.add(nid) + lookup[nid] = nid + lookup[self._normalize_node_id(nid)] = nid + + # Build result dictionary + nodes_dict = {} + + for i in range(0, len(unique_ids), batch_size): + batch = unique_ids[i : i + batch_size] + + query = f""" + WITH input(v, ord) AS ( + SELECT v, ord + FROM unnest($1::text[]) WITH ORDINALITY AS t(v, ord) + ), + ids(node_id, ord) AS ( + SELECT (to_json(v)::text)::agtype AS node_id, ord + FROM input + ) + SELECT i.node_id::text AS node_id, + b.properties + FROM {self.graph_name}.base AS b + JOIN ids i + ON ag_catalog.agtype_access_operator( + VARIADIC ARRAY[b.properties, '"entity_id"'::agtype] + ) = i.node_id + ORDER BY i.ord; + """ + + results = await self._query(query, params={"ids": batch}) + + for result in results: + if result["node_id"] and result["properties"]: + node_dict = result["properties"] + + # Process string result, parse it to JSON dictionary + if isinstance(node_dict, str): + try: + node_dict = json.loads(node_dict) + except json.JSONDecodeError: + logger.warning( + f"[{self.workspace}] Failed to parse node string in batch: {node_dict}" + ) + + node_key = result["node_id"] + original_key = lookup.get(node_key) + if original_key is None: + logger.warning( + f"[{self.workspace}] Node {node_key} not found in lookup map" + ) + original_key = node_key + if original_key in requested: + nodes_dict[original_key] = node_dict + + return nodes_dict + + async def node_degrees_batch( + self, node_ids: list[str], batch_size: int = 500 + ) -> dict[str, int]: + """ + Retrieve the degree for multiple nodes in a single query using UNWIND. + Calculates the total degree by counting distinct relationships. + Uses separate queries for outgoing and incoming edges. + + Args: + node_ids: List of node labels (entity_id values) to look up. + batch_size: Batch size for the query + + Returns: + A dictionary mapping each node_id to its degree (total number of relationships). + If a node is not found, its degree will be set to 0. + """ + if not node_ids: + return {} + + seen: set[str] = set() + unique_ids: list[str] = [] + lookup: dict[str, str] = {} + requested: set[str] = set() + for nid in node_ids: + if nid not in seen: + seen.add(nid) + unique_ids.append(nid) + requested.add(nid) + lookup[nid] = nid + lookup[self._normalize_node_id(nid)] = nid + + out_degrees = {} + in_degrees = {} + + for i in range(0, len(unique_ids), batch_size): + batch = unique_ids[i : i + batch_size] + + query = f""" + WITH input(v, ord) AS ( + SELECT v, ord + FROM unnest($1::text[]) WITH ORDINALITY AS t(v, ord) + ), + ids(node_id, ord) AS ( + SELECT (to_json(v)::text)::agtype AS node_id, ord + FROM input + ), + vids AS ( + SELECT b.id AS vid, i.node_id, i.ord + FROM {self.graph_name}.base AS b + JOIN ids i + ON ag_catalog.agtype_access_operator( + VARIADIC ARRAY[b.properties, '"entity_id"'::agtype] + ) = i.node_id + ), + deg_out AS ( + SELECT d.start_id AS vid, COUNT(*)::bigint AS out_degree + FROM {self.graph_name}."DIRECTED" AS d + JOIN vids v ON v.vid = d.start_id + GROUP BY d.start_id + ), + deg_in AS ( + SELECT d.end_id AS vid, COUNT(*)::bigint AS in_degree + FROM {self.graph_name}."DIRECTED" AS d + JOIN vids v ON v.vid = d.end_id + GROUP BY d.end_id + ) + SELECT v.node_id::text AS node_id, + COALESCE(o.out_degree, 0) AS out_degree, + COALESCE(n.in_degree, 0) AS in_degree + FROM vids v + LEFT JOIN deg_out o ON o.vid = v.vid + LEFT JOIN deg_in n ON n.vid = v.vid + ORDER BY v.ord; + """ + + combined_results = await self._query(query, params={"ids": batch}) + + for row in combined_results: + node_id = row["node_id"] + if not node_id: + continue + node_key = node_id + original_key = lookup.get(node_key) + if original_key is None: + logger.warning( + f"[{self.workspace}] Node {node_key} not found in lookup map" + ) + original_key = node_key + if original_key in requested: + out_degrees[original_key] = int(row.get("out_degree", 0) or 0) + in_degrees[original_key] = int(row.get("in_degree", 0) or 0) + + degrees_dict = {} + for node_id in node_ids: + out_degree = out_degrees.get(node_id, 0) + in_degree = in_degrees.get(node_id, 0) + degrees_dict[node_id] = out_degree + in_degree + + return degrees_dict + + async def edge_degrees_batch( + self, edges: list[tuple[str, str]] + ) -> dict[tuple[str, str], int]: + """ + Calculate the combined degree for each edge (sum of the source and target node degrees) + in batch using the already implemented node_degrees_batch. + + Args: + edges: List of (source_node_id, target_node_id) tuples + + Returns: + Dictionary mapping edge tuples to their combined degrees + """ + if not edges: + return {} + + # Use node_degrees_batch to get all node degrees efficiently + all_nodes = set() + for src, tgt in edges: + all_nodes.add(src) + all_nodes.add(tgt) + + node_degrees = await self.node_degrees_batch(list(all_nodes)) + + # Calculate edge degrees + edge_degrees_dict = {} + for src, tgt in edges: + src_degree = node_degrees.get(src, 0) + tgt_degree = node_degrees.get(tgt, 0) + edge_degrees_dict[(src, tgt)] = src_degree + tgt_degree + + return edge_degrees_dict + + async def get_edges_batch( + self, pairs: list[dict[str, str]], batch_size: int = 500 + ) -> dict[tuple[str, str], dict]: + """ + Retrieve edge properties for multiple (src, tgt) pairs in one query. + Get forward and backward edges seperately and merge them before return + + Args: + pairs: List of dictionaries, e.g. [{"src": "node1", "tgt": "node2"}, ...] + batch_size: Batch size for the query + + Returns: + A dictionary mapping (src, tgt) tuples to their edge properties. + """ + if not pairs: + return {} + + seen = set() + uniq_pairs: list[dict[str, str]] = [] + for p in pairs: + s = self._normalize_node_id(p["src"]) + t = self._normalize_node_id(p["tgt"]) + key = (s, t) + if s and t and key not in seen: + seen.add(key) + uniq_pairs.append(p) + + edges_dict: dict[tuple[str, str], dict] = {} + + for i in range(0, len(uniq_pairs), batch_size): + batch = uniq_pairs[i : i + batch_size] + + pairs = [{"src": p["src"], "tgt": p["tgt"]} for p in batch] + + forward_cypher = """ + UNWIND $pairs AS p + WITH p.src AS src_eid, p.tgt AS tgt_eid + MATCH (a:base {entity_id: src_eid}) + MATCH (b:base {entity_id: tgt_eid}) + MATCH (a)-[r]->(b) + RETURN src_eid AS source, tgt_eid AS target, properties(r) AS edge_properties""" + backward_cypher = """ + UNWIND $pairs AS p + WITH p.src AS src_eid, p.tgt AS tgt_eid + MATCH (a:base {entity_id: src_eid}) + MATCH (b:base {entity_id: tgt_eid}) + MATCH (a)<-[r]-(b) + RETURN src_eid AS source, tgt_eid AS target, properties(r) AS edge_properties""" + + def dollar_quote(s: str, tag_prefix="AGE"): + s = "" if s is None else str(s) + for i in itertools.count(1): + tag = f"{tag_prefix}{i}" + wrapper = f"${tag}$" + if wrapper not in s: + return f"{wrapper}{s}{wrapper}" + + sql_fwd = f""" + SELECT * FROM cypher({dollar_quote(self.graph_name)}::name, + {dollar_quote(forward_cypher)}::cstring, + $1::agtype) + AS (source text, target text, edge_properties agtype) + """ + + sql_bwd = f""" + SELECT * FROM cypher({dollar_quote(self.graph_name)}::name, + {dollar_quote(backward_cypher)}::cstring, + $1::agtype) + AS (source text, target text, edge_properties agtype) + """ + + pg_params = {"params": json.dumps({"pairs": pairs}, ensure_ascii=False)} + + forward_results = await self._query(sql_fwd, params=pg_params) + backward_results = await self._query(sql_bwd, params=pg_params) + + for result in forward_results: + if result["source"] and result["target"] and result["edge_properties"]: + edge_props = result["edge_properties"] + + # Process string result, parse it to JSON dictionary + if isinstance(edge_props, str): + try: + edge_props = json.loads(edge_props) + except json.JSONDecodeError: + logger.warning( + f"[{self.workspace}]Failed to parse edge properties string: {edge_props}" + ) + continue + + edges_dict[(result["source"], result["target"])] = edge_props + + for result in backward_results: + if result["source"] and result["target"] and result["edge_properties"]: + edge_props = result["edge_properties"] + + # Process string result, parse it to JSON dictionary + if isinstance(edge_props, str): + try: + edge_props = json.loads(edge_props) + except json.JSONDecodeError: + logger.warning( + f"[{self.workspace}] Failed to parse edge properties string: {edge_props}" + ) + continue + + edges_dict[(result["source"], result["target"])] = edge_props + + return edges_dict + + async def get_nodes_edges_batch( + self, node_ids: list[str], batch_size: int = 500 + ) -> dict[str, list[tuple[str, str]]]: + """ + Get all edges (both outgoing and incoming) for multiple nodes in a single batch operation. + + Args: + node_ids: List of node IDs to get edges for + batch_size: Batch size for the query + + Returns: + Dictionary mapping node IDs to lists of (source, target) edge tuples + """ + if not node_ids: + return {} + + seen = set() + unique_ids: list[str] = [] + for nid in node_ids: + n = self._normalize_node_id(nid) + if n and n not in seen: + seen.add(n) + unique_ids.append(n) + + edges_norm: dict[str, list[tuple[str, str]]] = {n: [] for n in unique_ids} + + for i in range(0, len(unique_ids), batch_size): + batch = unique_ids[i : i + batch_size] + # Format node IDs for the query + formatted_ids = ", ".join([f'"{n}"' for n in batch]) + + outgoing_query = """SELECT * FROM cypher('%s', $$ + UNWIND [%s] AS node_id + MATCH (n:base {entity_id: node_id}) + OPTIONAL MATCH (n:base)-[]->(connected:base) + RETURN node_id, connected.entity_id AS connected_id + $$) AS (node_id text, connected_id text)""" % ( + self.graph_name, + formatted_ids, + ) + + incoming_query = """SELECT * FROM cypher('%s', $$ + UNWIND [%s] AS node_id + MATCH (n:base {entity_id: node_id}) + OPTIONAL MATCH (n:base)<-[]-(connected:base) + RETURN node_id, connected.entity_id AS connected_id + $$) AS (node_id text, connected_id text)""" % ( + self.graph_name, + formatted_ids, + ) + + outgoing_results = await self._query(outgoing_query) + incoming_results = await self._query(incoming_query) + + for result in outgoing_results: + if result["node_id"] and result["connected_id"]: + edges_norm[result["node_id"]].append( + (result["node_id"], result["connected_id"]) + ) + + for result in incoming_results: + if result["node_id"] and result["connected_id"]: + edges_norm[result["node_id"]].append( + (result["connected_id"], result["node_id"]) + ) + + out: dict[str, list[tuple[str, str]]] = {} + for orig in node_ids: + n = self._normalize_node_id(orig) + out[orig] = edges_norm.get(n, []) + + return out + + async def get_all_labels(self) -> list[str]: + """ + Get all labels (node IDs) in the graph. + + Returns: + list[str]: A list of all labels in the graph. + """ + query = ( + """SELECT * FROM cypher('%s', $$ + MATCH (n:base) + WHERE n.entity_id IS NOT NULL + RETURN DISTINCT n.entity_id AS label + ORDER BY n.entity_id + $$) AS (label text)""" + % self.graph_name + ) + + results = await self._query(query) + labels = [] + for result in results: + if result and isinstance(result, dict) and "label" in result: + labels.append(result["label"]) + return labels + + async def _bfs_subgraph( + self, node_label: str, max_depth: int, max_nodes: int + ) -> KnowledgeGraph: + """ + Implements a true breadth-first search algorithm for subgraph retrieval. + This method is used as a fallback when the standard Cypher query is too slow + or when we need to guarantee BFS ordering. + + Args: + node_label: Label of the starting node + max_depth: Maximum depth of the subgraph + max_nodes: Maximum number of nodes to return + + Returns: + KnowledgeGraph object containing nodes and edges + """ + from collections import deque + + result = KnowledgeGraph() + visited_nodes = set() + visited_node_ids = set() + visited_edges = set() + visited_edge_pairs = set() + + # Get starting node data + label = self._normalize_node_id(node_label) + query = """SELECT * FROM cypher('%s', $$ + MATCH (n:base {entity_id: "%s"}) + RETURN id(n) as node_id, n + $$) AS (node_id bigint, n agtype)""" % (self.graph_name, label) + + node_result = await self._query(query) + if not node_result or not node_result[0].get("n"): + return result + + # Create initial KnowledgeGraphNode + start_node_data = node_result[0]["n"] + entity_id = start_node_data["properties"]["entity_id"] + internal_id = str(start_node_data["id"]) + + start_node = KnowledgeGraphNode( + id=internal_id, + labels=[entity_id], + properties=start_node_data["properties"], + ) + + # Initialize BFS queue, each element is a tuple of (node, depth) + queue = deque([(start_node, 0)]) + + visited_nodes.add(entity_id) + visited_node_ids.add(internal_id) + result.nodes.append(start_node) + + result.is_truncated = False + + # BFS search main loop + while queue: + # Get all nodes at the current depth + current_level_nodes = [] + current_depth = None + + # Determine current depth + if queue: + current_depth = queue[0][1] + + # Extract all nodes at current depth from the queue + while queue and queue[0][1] == current_depth: + node, depth = queue.popleft() + if depth > max_depth: + continue + current_level_nodes.append(node) + + if not current_level_nodes: + continue + + # Check depth limit + if current_depth > max_depth: + continue + + # Prepare node IDs list + node_ids = [node.labels[0] for node in current_level_nodes] + formatted_ids = ", ".join( + [f'"{self._normalize_node_id(node_id)}"' for node_id in node_ids] + ) + + # Construct batch query for outgoing edges + outgoing_query = f"""SELECT * FROM cypher('{self.graph_name}', $$ + UNWIND [{formatted_ids}] AS node_id + MATCH (n:base {{entity_id: node_id}}) + OPTIONAL MATCH (n)-[r]->(neighbor:base) + RETURN node_id AS current_id, + id(n) AS current_internal_id, + id(neighbor) AS neighbor_internal_id, + neighbor.entity_id AS neighbor_id, + id(r) AS edge_id, + r, + neighbor, + true AS is_outgoing + $$) AS (current_id text, current_internal_id bigint, neighbor_internal_id bigint, + neighbor_id text, edge_id bigint, r agtype, neighbor agtype, is_outgoing bool)""" + + # Construct batch query for incoming edges + incoming_query = f"""SELECT * FROM cypher('{self.graph_name}', $$ + UNWIND [{formatted_ids}] AS node_id + MATCH (n:base {{entity_id: node_id}}) + OPTIONAL MATCH (n)<-[r]-(neighbor:base) + RETURN node_id AS current_id, + id(n) AS current_internal_id, + id(neighbor) AS neighbor_internal_id, + neighbor.entity_id AS neighbor_id, + id(r) AS edge_id, + r, + neighbor, + false AS is_outgoing + $$) AS (current_id text, current_internal_id bigint, neighbor_internal_id bigint, + neighbor_id text, edge_id bigint, r agtype, neighbor agtype, is_outgoing bool)""" + + # Execute queries + outgoing_results = await self._query(outgoing_query) + incoming_results = await self._query(incoming_query) + + # Combine results + neighbors = outgoing_results + incoming_results + + # Create mapping from node ID to node object + node_map = {node.labels[0]: node for node in current_level_nodes} + + # Process all results in a single loop + for record in neighbors: + if not record.get("neighbor") or not record.get("r"): + continue + + # Get current node information + current_entity_id = record["current_id"] + current_node = node_map[current_entity_id] + + # Get neighbor node information + neighbor_entity_id = record["neighbor_id"] + neighbor_internal_id = str(record["neighbor_internal_id"]) + is_outgoing = record["is_outgoing"] + + # Determine edge direction + if is_outgoing: + source_id = current_node.id + target_id = neighbor_internal_id + else: + source_id = neighbor_internal_id + target_id = current_node.id + + if not neighbor_entity_id: + continue + + # Get edge and node information + b_node = record["neighbor"] + rel = record["r"] + edge_id = str(record["edge_id"]) + + # Create neighbor node object + neighbor_node = KnowledgeGraphNode( + id=neighbor_internal_id, + labels=[neighbor_entity_id], + properties=b_node["properties"], + ) + + # Sort entity_ids to ensure (A,B) and (B,A) are treated as the same edge + sorted_pair = tuple(sorted([current_entity_id, neighbor_entity_id])) + + # Create edge object + edge = KnowledgeGraphEdge( + id=edge_id, + type=rel["label"], + source=source_id, + target=target_id, + properties=rel["properties"], + ) + + if neighbor_internal_id in visited_node_ids: + # Add backward edge if neighbor node is already visited + if ( + edge_id not in visited_edges + and sorted_pair not in visited_edge_pairs + ): + result.edges.append(edge) + visited_edges.add(edge_id) + visited_edge_pairs.add(sorted_pair) + else: + if len(visited_node_ids) < max_nodes and current_depth < max_depth: + # Add new node to result and queue + result.nodes.append(neighbor_node) + visited_nodes.add(neighbor_entity_id) + visited_node_ids.add(neighbor_internal_id) + + # Add node to queue with incremented depth + queue.append((neighbor_node, current_depth + 1)) + + # Add forward edge + if ( + edge_id not in visited_edges + and sorted_pair not in visited_edge_pairs + ): + result.edges.append(edge) + visited_edges.add(edge_id) + visited_edge_pairs.add(sorted_pair) + else: + if current_depth < max_depth: + result.is_truncated = True + + return result + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """ + Retrieve a connected subgraph of nodes where the label includes the specified `node_label`. + + Args: + node_label: Label of the starting node, * means all nodes + max_depth: Maximum depth of the subgraph, Defaults to 3 + max_nodes: Maximum nodes to return, Defaults to global_config max_graph_nodes + + Returns: + KnowledgeGraph object containing nodes and edges, with an is_truncated flag + indicating whether the graph was truncated due to max_nodes limit + """ + # Use global_config max_graph_nodes as default if max_nodes is None + if max_nodes is None: + max_nodes = self.global_config.get("max_graph_nodes", 1000) + else: + # Limit max_nodes to not exceed global_config max_graph_nodes + max_nodes = min(max_nodes, self.global_config.get("max_graph_nodes", 1000)) + kg = KnowledgeGraph() + + # Handle wildcard query - get all nodes + if node_label == "*": + # First check total node count to determine if graph should be truncated + count_query = f"""SELECT * FROM cypher('{self.graph_name}', $$ + MATCH (n:base) + RETURN count(distinct n) AS total_nodes + $$) AS (total_nodes bigint)""" + + count_result = await self._query(count_query) + total_nodes = count_result[0]["total_nodes"] if count_result else 0 + is_truncated = total_nodes > max_nodes + + # Get max_nodes with highest degrees + query_nodes = f"""SELECT * FROM cypher('{self.graph_name}', $$ + MATCH (n:base) + OPTIONAL MATCH (n)-[r]->() + RETURN id(n) as node_id, count(r) as degree + $$) AS (node_id BIGINT, degree BIGINT) + ORDER BY degree DESC + LIMIT {max_nodes}""" + node_results = await self._query(query_nodes) + + node_ids = [str(result["node_id"]) for result in node_results] + + logger.info( + f"[{self.workspace}] Total nodes: {total_nodes}, Selected nodes: {len(node_ids)}" + ) + + if node_ids: + formatted_ids = ", ".join(node_ids) + # Construct batch query for subgraph within max_nodes + query = f"""SELECT * FROM cypher('{self.graph_name}', $$ + WITH [{formatted_ids}] AS node_ids + MATCH (a) + WHERE id(a) IN node_ids + OPTIONAL MATCH (a)-[r]->(b) + WHERE id(b) IN node_ids + RETURN a, r, b + $$) AS (a AGTYPE, r AGTYPE, b AGTYPE)""" + results = await self._query(query) + + # Process query results, deduplicate nodes and edges + nodes_dict = {} + edges_dict = {} + for result in results: + # Process node a + if result.get("a") and isinstance(result["a"], dict): + node_a = result["a"] + node_id = str(node_a["id"]) + if node_id not in nodes_dict and "properties" in node_a: + nodes_dict[node_id] = KnowledgeGraphNode( + id=node_id, + labels=[node_a["properties"]["entity_id"]], + properties=node_a["properties"], + ) + + # Process node b + if result.get("b") and isinstance(result["b"], dict): + node_b = result["b"] + node_id = str(node_b["id"]) + if node_id not in nodes_dict and "properties" in node_b: + nodes_dict[node_id] = KnowledgeGraphNode( + id=node_id, + labels=[node_b["properties"]["entity_id"]], + properties=node_b["properties"], + ) + + # Process edge r + if result.get("r") and isinstance(result["r"], dict): + edge = result["r"] + edge_id = str(edge["id"]) + if edge_id not in edges_dict: + edges_dict[edge_id] = KnowledgeGraphEdge( + id=edge_id, + type=edge["label"], + source=str(edge["start_id"]), + target=str(edge["end_id"]), + properties=edge["properties"], + ) + + kg = KnowledgeGraph( + nodes=list(nodes_dict.values()), + edges=list(edges_dict.values()), + is_truncated=is_truncated, + ) + else: + # For single node query, use BFS algorithm + kg = await self._bfs_subgraph(node_label, max_depth, max_nodes) + + logger.info( + f"[{self.workspace}] Subgraph query successful | Node count: {len(kg.nodes)} | Edge count: {len(kg.edges)}" + ) + else: + # For non-wildcard queries, use the BFS algorithm + kg = await self._bfs_subgraph(node_label, max_depth, max_nodes) + logger.info( + f"[{self.workspace}] Subgraph query for '{node_label}' successful | Node count: {len(kg.nodes)} | Edge count: {len(kg.edges)}" + ) + + return kg + + async def get_all_nodes(self) -> list[dict]: + """Get all nodes in the graph. + + Returns: + A list of all nodes, where each node is a dictionary of its properties + """ + # Use native SQL to avoid Cypher wrapper overhead + # Original: SELECT * FROM cypher(...) with MATCH (n:base) + # Optimized: Direct table access for better performance + query = f""" + SELECT properties + FROM {self.graph_name}.base + """ + + results = await self._query(query) + nodes = [] + for result in results: + if result.get("properties"): + node_dict = result["properties"] + + # Process string result, parse it to JSON dictionary + if isinstance(node_dict, str): + try: + node_dict = json.loads(node_dict) + except json.JSONDecodeError: + logger.warning( + f"[{self.workspace}] Failed to parse node string: {node_dict}" + ) + continue + + # Add node id (entity_id) to the dictionary for easier access + node_dict["id"] = node_dict.get("entity_id") + nodes.append(node_dict) + return nodes + + async def get_all_edges(self) -> list[dict]: + """Get all edges in the graph. + + Returns: + A list of all edges, where each edge is a dictionary of its properties + (If 2 directional edges exist between the same pair of nodes, deduplication must be handled by the caller) + """ + # Use native SQL to avoid Cartesian product (N×N) in Cypher MATCH + # Original Cypher: MATCH (a:base)-[r]-(b:base) creates ~50 billion row combinations + # Optimized: Start from edges table, join to nodes only to get entity_id + # Performance: O(E) instead of O(N²), ~50,000x faster for large graphs + query = f""" + SELECT DISTINCT + (ag_catalog.agtype_access_operator(VARIADIC ARRAY[a.properties, '"entity_id"'::agtype]))::text AS source, + (ag_catalog.agtype_access_operator(VARIADIC ARRAY[b.properties, '"entity_id"'::agtype]))::text AS target, + r.properties + FROM {self.graph_name}."DIRECTED" r + JOIN {self.graph_name}.base a ON r.start_id = a.id + JOIN {self.graph_name}.base b ON r.end_id = b.id + """ + + results = await self._query(query) + edges = [] + for result in results: + edge_properties = result["properties"] + + # Process string result, parse it to JSON dictionary + if isinstance(edge_properties, str): + try: + edge_properties = json.loads(edge_properties) + except json.JSONDecodeError: + logger.warning( + f"[{self.workspace}] Failed to parse edge properties string: {edge_properties}" + ) + edge_properties = {} + + edge_properties["source"] = result["source"] + edge_properties["target"] = result["target"] + edges.append(edge_properties) + return edges + + async def get_popular_labels(self, limit: int = 300) -> list[str]: + """Get popular labels by node degree (most connected entities) using native SQL for performance.""" + try: + # Native SQL query to calculate node degrees directly from AGE's underlying tables + # This is significantly faster than using the cypher() function wrapper + query = f""" + WITH node_degrees AS ( + SELECT + node_id, + COUNT(*) AS degree + FROM ( + SELECT start_id AS node_id FROM {self.graph_name}._ag_label_edge + UNION ALL + SELECT end_id AS node_id FROM {self.graph_name}._ag_label_edge + ) AS all_edges + GROUP BY node_id + ) + SELECT + (ag_catalog.agtype_access_operator(VARIADIC ARRAY[v.properties, '"entity_id"'::agtype]))::text AS label + FROM + node_degrees d + JOIN + {self.graph_name}._ag_label_vertex v ON d.node_id = v.id + WHERE + ag_catalog.agtype_access_operator(VARIADIC ARRAY[v.properties, '"entity_id"'::agtype]) IS NOT NULL + ORDER BY + d.degree DESC, + label ASC + LIMIT $1; + """ + results = await self._query(query, params={"limit": limit}) + labels = [ + result["label"] for result in results if result and "label" in result + ] + + logger.debug( + f"[{self.workspace}] Retrieved {len(labels)} popular labels (limit: {limit})" + ) + return labels + except Exception as e: + logger.error(f"[{self.workspace}] Error getting popular labels: {str(e)}") + return [] + + async def search_labels(self, query: str, limit: int = 50) -> list[str]: + """Search labels with fuzzy matching using native, parameterized SQL for performance and security.""" + query_lower = query.lower().strip() + if not query_lower: + return [] + + try: + # Re-implementing with the correct agtype access operator and full scoring logic. + sql_query = f""" + WITH ranked_labels AS ( + SELECT + (ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '"entity_id"'::agtype]))::text AS label, + LOWER((ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '"entity_id"'::agtype]))::text) AS label_lower + FROM + {self.graph_name}._ag_label_vertex + WHERE + ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '"entity_id"'::agtype]) IS NOT NULL + AND LOWER((ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '"entity_id"'::agtype]))::text) ILIKE $1 + ) + SELECT + label + FROM ( + SELECT + label, + CASE + WHEN label_lower = $2 THEN 1000 + WHEN label_lower LIKE $3 THEN 500 + ELSE (100 - LENGTH(label)) + END + + CASE + WHEN label_lower LIKE $4 OR label_lower LIKE $5 THEN 50 + ELSE 0 + END AS score + FROM + ranked_labels + ) AS scored_labels + ORDER BY + score DESC, + label ASC + LIMIT $6; + """ + params = ( + f"%{query_lower}%", # For the main ILIKE clause ($1) + query_lower, # For exact match ($2) + f"{query_lower}%", # For prefix match ($3) + f"% {query_lower}%", # For word boundary (space) ($4) + f"%_{query_lower}%", # For word boundary (underscore) ($5) + limit, # For LIMIT ($6) + ) + results = await self._query(sql_query, params=dict(enumerate(params, 1))) + labels = [ + result["label"] for result in results if result and "label" in result + ] + + logger.debug( + f"[{self.workspace}] Search query '{query}' returned {len(labels)} results (limit: {limit})" + ) + return labels + except Exception as e: + logger.error( + f"[{self.workspace}] Error searching labels with query '{query}': {str(e)}" + ) + return [] + + async def drop(self) -> dict[str, str]: + """Drop the storage""" + async with get_graph_db_lock(): + try: + drop_query = f"""SELECT * FROM cypher('{self.graph_name}', $$ + MATCH (n) + DETACH DELETE n + $$) AS (result agtype)""" + + await self._query(drop_query, readonly=False) + return { + "status": "success", + "message": f"workspace '{self.workspace}' graph data dropped", + } + except Exception as e: + logger.error(f"[{self.workspace}] Error dropping graph: {e}") + return {"status": "error", "message": str(e)} + + +# Note: Order matters! More specific namespaces (e.g., "full_entities") must come before +# more general ones (e.g., "entities") because is_namespace() uses endswith() matching +NAMESPACE_TABLE_MAP = { + NameSpace.KV_STORE_FULL_DOCS: "LIGHTRAG_DOC_FULL", + NameSpace.KV_STORE_TEXT_CHUNKS: "LIGHTRAG_DOC_CHUNKS", + NameSpace.KV_STORE_FULL_ENTITIES: "LIGHTRAG_FULL_ENTITIES", + NameSpace.KV_STORE_FULL_RELATIONS: "LIGHTRAG_FULL_RELATIONS", + NameSpace.KV_STORE_ENTITY_CHUNKS: "LIGHTRAG_ENTITY_CHUNKS", + NameSpace.KV_STORE_RELATION_CHUNKS: "LIGHTRAG_RELATION_CHUNKS", + NameSpace.KV_STORE_LLM_RESPONSE_CACHE: "LIGHTRAG_LLM_CACHE", + NameSpace.VECTOR_STORE_CHUNKS: "LIGHTRAG_VDB_CHUNKS", + NameSpace.VECTOR_STORE_ENTITIES: "LIGHTRAG_VDB_ENTITY", + NameSpace.VECTOR_STORE_RELATIONSHIPS: "LIGHTRAG_VDB_RELATION", + NameSpace.DOC_STATUS: "LIGHTRAG_DOC_STATUS", +} + + +def namespace_to_table_name(namespace: str) -> str: + for k, v in NAMESPACE_TABLE_MAP.items(): + if is_namespace(namespace, k): + return v + + +TABLES = { + "LIGHTRAG_DOC_FULL": { + "ddl": """CREATE TABLE LIGHTRAG_DOC_FULL ( + id VARCHAR(255), + workspace VARCHAR(255), + doc_name VARCHAR(1024), + content TEXT, + meta JSONB, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_DOC_FULL_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_DOC_CHUNKS": { + "ddl": """CREATE TABLE LIGHTRAG_DOC_CHUNKS ( + id VARCHAR(255), + workspace VARCHAR(255), + full_doc_id VARCHAR(256), + chunk_order_index INTEGER, + tokens INTEGER, + content TEXT, + file_path TEXT NULL, + llm_cache_list JSONB NULL DEFAULT '[]'::jsonb, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_DOC_CHUNKS_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_VDB_CHUNKS": { + "ddl": f"""CREATE TABLE LIGHTRAG_VDB_CHUNKS ( + id VARCHAR(255), + workspace VARCHAR(255), + full_doc_id VARCHAR(256), + chunk_order_index INTEGER, + tokens INTEGER, + content TEXT, + content_vector VECTOR({os.environ.get("EMBEDDING_DIM", 1024)}), + file_path TEXT NULL, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_VDB_CHUNKS_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_VDB_ENTITY": { + "ddl": f"""CREATE TABLE LIGHTRAG_VDB_ENTITY ( + id VARCHAR(255), + workspace VARCHAR(255), + entity_name VARCHAR(512), + content TEXT, + content_vector VECTOR({os.environ.get("EMBEDDING_DIM", 1024)}), + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + chunk_ids VARCHAR(255)[] NULL, + file_path TEXT NULL, + CONSTRAINT LIGHTRAG_VDB_ENTITY_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_VDB_RELATION": { + "ddl": f"""CREATE TABLE LIGHTRAG_VDB_RELATION ( + id VARCHAR(255), + workspace VARCHAR(255), + source_id VARCHAR(512), + target_id VARCHAR(512), + content TEXT, + content_vector VECTOR({os.environ.get("EMBEDDING_DIM", 1024)}), + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + chunk_ids VARCHAR(255)[] NULL, + file_path TEXT NULL, + CONSTRAINT LIGHTRAG_VDB_RELATION_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_LLM_CACHE": { + "ddl": """CREATE TABLE LIGHTRAG_LLM_CACHE ( + workspace varchar(255) NOT NULL, + id varchar(255) NOT NULL, + original_prompt TEXT, + return_value TEXT, + chunk_id VARCHAR(255) NULL, + cache_type VARCHAR(32), + queryparam JSONB NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_LLM_CACHE_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_DOC_STATUS": { + "ddl": """CREATE TABLE LIGHTRAG_DOC_STATUS ( + workspace varchar(255) NOT NULL, + id varchar(255) NOT NULL, + content_summary varchar(255) NULL, + content_length int4 NULL, + chunks_count int4 NULL, + status varchar(64) NULL, + file_path TEXT NULL, + chunks_list JSONB NULL DEFAULT '[]'::jsonb, + track_id varchar(255) NULL, + metadata JSONB NULL DEFAULT '{}'::jsonb, + error_msg TEXT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_DOC_STATUS_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_FULL_ENTITIES": { + "ddl": """CREATE TABLE LIGHTRAG_FULL_ENTITIES ( + id VARCHAR(255), + workspace VARCHAR(255), + entity_names JSONB, + count INTEGER, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_FULL_ENTITIES_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_FULL_RELATIONS": { + "ddl": """CREATE TABLE LIGHTRAG_FULL_RELATIONS ( + id VARCHAR(255), + workspace VARCHAR(255), + relation_pairs JSONB, + count INTEGER, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_FULL_RELATIONS_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_ENTITY_CHUNKS": { + "ddl": """CREATE TABLE LIGHTRAG_ENTITY_CHUNKS ( + id VARCHAR(512), + workspace VARCHAR(255), + chunk_ids JSONB, + count INTEGER, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_ENTITY_CHUNKS_PK PRIMARY KEY (workspace, id) + )""" + }, + "LIGHTRAG_RELATION_CHUNKS": { + "ddl": """CREATE TABLE LIGHTRAG_RELATION_CHUNKS ( + id VARCHAR(512), + workspace VARCHAR(255), + chunk_ids JSONB, + count INTEGER, + create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT LIGHTRAG_RELATION_CHUNKS_PK PRIMARY KEY (workspace, id) + )""" + }, +} + + +SQL_TEMPLATES = { + # SQL for KVStorage + "get_by_id_full_docs": """SELECT id, COALESCE(content, '') as content, + COALESCE(doc_name, '') as file_path + FROM LIGHTRAG_DOC_FULL WHERE workspace=$1 AND id=$2 + """, + "get_by_id_text_chunks": """SELECT id, tokens, COALESCE(content, '') as content, + chunk_order_index, full_doc_id, file_path, + COALESCE(llm_cache_list, '[]'::jsonb) as llm_cache_list, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_DOC_CHUNKS WHERE workspace=$1 AND id=$2 + """, + "get_by_id_llm_response_cache": """SELECT id, original_prompt, return_value, chunk_id, cache_type, queryparam, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_LLM_CACHE WHERE workspace=$1 AND id=$2 + """, + "get_by_ids_full_docs": """SELECT id, COALESCE(content, '') as content, + COALESCE(doc_name, '') as file_path + FROM LIGHTRAG_DOC_FULL WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_ids_text_chunks": """SELECT id, tokens, COALESCE(content, '') as content, + chunk_order_index, full_doc_id, file_path, + COALESCE(llm_cache_list, '[]'::jsonb) as llm_cache_list, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_DOC_CHUNKS WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_ids_llm_response_cache": """SELECT id, original_prompt, return_value, chunk_id, cache_type, queryparam, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_LLM_CACHE WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_id_full_entities": """SELECT id, entity_names, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_FULL_ENTITIES WHERE workspace=$1 AND id=$2 + """, + "get_by_id_full_relations": """SELECT id, relation_pairs, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_FULL_RELATIONS WHERE workspace=$1 AND id=$2 + """, + "get_by_ids_full_entities": """SELECT id, entity_names, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_FULL_ENTITIES WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_ids_full_relations": """SELECT id, relation_pairs, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_FULL_RELATIONS WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_id_entity_chunks": """SELECT id, chunk_ids, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_ENTITY_CHUNKS WHERE workspace=$1 AND id=$2 + """, + "get_by_id_relation_chunks": """SELECT id, chunk_ids, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_RELATION_CHUNKS WHERE workspace=$1 AND id=$2 + """, + "get_by_ids_entity_chunks": """SELECT id, chunk_ids, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_ENTITY_CHUNKS WHERE workspace=$1 AND id = ANY($2) + """, + "get_by_ids_relation_chunks": """SELECT id, chunk_ids, count, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM LIGHTRAG_RELATION_CHUNKS WHERE workspace=$1 AND id = ANY($2) + """, + "filter_keys": "SELECT id FROM {table_name} WHERE workspace=$1 AND id IN ({ids})", + "upsert_doc_full": """INSERT INTO LIGHTRAG_DOC_FULL (id, content, doc_name, workspace) + VALUES ($1, $2, $3, $4) + ON CONFLICT (workspace,id) DO UPDATE + SET content = $2, + doc_name = $3, + update_time = CURRENT_TIMESTAMP + """, + "upsert_llm_response_cache": """INSERT INTO LIGHTRAG_LLM_CACHE(workspace,id,original_prompt,return_value,chunk_id,cache_type,queryparam) + VALUES ($1, $2, $3, $4, $5, $6, $7) + ON CONFLICT (workspace,id) DO UPDATE + SET original_prompt = EXCLUDED.original_prompt, + return_value=EXCLUDED.return_value, + chunk_id=EXCLUDED.chunk_id, + cache_type=EXCLUDED.cache_type, + queryparam=EXCLUDED.queryparam, + update_time = CURRENT_TIMESTAMP + """, + "upsert_text_chunk": """INSERT INTO LIGHTRAG_DOC_CHUNKS (workspace, id, tokens, + chunk_order_index, full_doc_id, content, file_path, llm_cache_list, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (workspace,id) DO UPDATE + SET tokens=EXCLUDED.tokens, + chunk_order_index=EXCLUDED.chunk_order_index, + full_doc_id=EXCLUDED.full_doc_id, + content = EXCLUDED.content, + file_path=EXCLUDED.file_path, + llm_cache_list=EXCLUDED.llm_cache_list, + update_time = EXCLUDED.update_time + """, + "upsert_full_entities": """INSERT INTO LIGHTRAG_FULL_ENTITIES (workspace, id, entity_names, count, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (workspace,id) DO UPDATE + SET entity_names=EXCLUDED.entity_names, + count=EXCLUDED.count, + update_time = EXCLUDED.update_time + """, + "upsert_full_relations": """INSERT INTO LIGHTRAG_FULL_RELATIONS (workspace, id, relation_pairs, count, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (workspace,id) DO UPDATE + SET relation_pairs=EXCLUDED.relation_pairs, + count=EXCLUDED.count, + update_time = EXCLUDED.update_time + """, + "upsert_entity_chunks": """INSERT INTO LIGHTRAG_ENTITY_CHUNKS (workspace, id, chunk_ids, count, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (workspace,id) DO UPDATE + SET chunk_ids=EXCLUDED.chunk_ids, + count=EXCLUDED.count, + update_time = EXCLUDED.update_time + """, + "upsert_relation_chunks": """INSERT INTO LIGHTRAG_RELATION_CHUNKS (workspace, id, chunk_ids, count, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (workspace,id) DO UPDATE + SET chunk_ids=EXCLUDED.chunk_ids, + count=EXCLUDED.count, + update_time = EXCLUDED.update_time + """, + # SQL for VectorStorage + "upsert_chunk": """INSERT INTO LIGHTRAG_VDB_CHUNKS (workspace, id, tokens, + chunk_order_index, full_doc_id, content, content_vector, file_path, + create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (workspace,id) DO UPDATE + SET tokens=EXCLUDED.tokens, + chunk_order_index=EXCLUDED.chunk_order_index, + full_doc_id=EXCLUDED.full_doc_id, + content = EXCLUDED.content, + content_vector=EXCLUDED.content_vector, + file_path=EXCLUDED.file_path, + update_time = EXCLUDED.update_time + """, + "upsert_entity": """INSERT INTO LIGHTRAG_VDB_ENTITY (workspace, id, entity_name, content, + content_vector, chunk_ids, file_path, create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6::varchar[], $7, $8, $9) + ON CONFLICT (workspace,id) DO UPDATE + SET entity_name=EXCLUDED.entity_name, + content=EXCLUDED.content, + content_vector=EXCLUDED.content_vector, + chunk_ids=EXCLUDED.chunk_ids, + file_path=EXCLUDED.file_path, + update_time=EXCLUDED.update_time + """, + "upsert_relationship": """INSERT INTO LIGHTRAG_VDB_RELATION (workspace, id, source_id, + target_id, content, content_vector, chunk_ids, file_path, create_time, update_time) + VALUES ($1, $2, $3, $4, $5, $6, $7::varchar[], $8, $9, $10) + ON CONFLICT (workspace,id) DO UPDATE + SET source_id=EXCLUDED.source_id, + target_id=EXCLUDED.target_id, + content=EXCLUDED.content, + content_vector=EXCLUDED.content_vector, + chunk_ids=EXCLUDED.chunk_ids, + file_path=EXCLUDED.file_path, + update_time = EXCLUDED.update_time + """, + "relationships": """ + SELECT r.source_id AS src_id, + r.target_id AS tgt_id, + EXTRACT(EPOCH FROM r.create_time)::BIGINT AS created_at + FROM LIGHTRAG_VDB_RELATION r + WHERE r.workspace = $1 + AND r.content_vector <=> '[{embedding_string}]'::vector < $2 + ORDER BY r.content_vector <=> '[{embedding_string}]'::vector + LIMIT $3; + """, + "entities": """ + SELECT e.entity_name, + EXTRACT(EPOCH FROM e.create_time)::BIGINT AS created_at + FROM LIGHTRAG_VDB_ENTITY e + WHERE e.workspace = $1 + AND e.content_vector <=> '[{embedding_string}]'::vector < $2 + ORDER BY e.content_vector <=> '[{embedding_string}]'::vector + LIMIT $3; + """, + "chunks": """ + SELECT c.id, + c.content, + c.file_path, + EXTRACT(EPOCH FROM c.create_time)::BIGINT AS created_at + FROM LIGHTRAG_VDB_CHUNKS c + WHERE c.workspace = $1 + AND c.content_vector <=> '[{embedding_string}]'::vector < $2 + ORDER BY c.content_vector <=> '[{embedding_string}]'::vector + LIMIT $3; + """, + # DROP tables + "drop_specifiy_table_workspace": """ + DELETE FROM {table_name} WHERE workspace=$1 + """, +} diff --git a/LightRAG/lightrag/kg/qdrant_impl.py b/LightRAG/lightrag/kg/qdrant_impl.py new file mode 100644 index 00000000..d51d8898 --- /dev/null +++ b/LightRAG/lightrag/kg/qdrant_impl.py @@ -0,0 +1,722 @@ +import asyncio +import configparser +import hashlib +import os +import uuid +from dataclasses import dataclass +from typing import Any, List, final + +import numpy as np +import pipmaster as pm + +from ..base import BaseVectorStorage +from ..exceptions import QdrantMigrationError +from ..kg.shared_storage import get_data_init_lock, get_storage_lock +from ..utils import compute_mdhash_id, logger + +if not pm.is_installed("qdrant-client"): + pm.install("qdrant-client") + +from qdrant_client import QdrantClient, models # type: ignore + +DEFAULT_WORKSPACE = "_" +WORKSPACE_ID_FIELD = "workspace_id" +ENTITY_PREFIX = "ent-" +CREATED_AT_FIELD = "created_at" +ID_FIELD = "id" + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + + +def compute_mdhash_id_for_qdrant( + content: str, prefix: str = "", style: str = "simple" +) -> str: + """ + Generate a UUID based on the content and support multiple formats. + + :param content: The content used to generate the UUID. + :param style: The format of the UUID, optional values are "simple", "hyphenated", "urn". + :return: A UUID that meets the requirements of Qdrant. + """ + if not content: + raise ValueError("Content must not be empty.") + + # Use the hash value of the content to create a UUID. + hashed_content = hashlib.sha256((prefix + content).encode("utf-8")).digest() + generated_uuid = uuid.UUID(bytes=hashed_content[:16], version=4) + + # Return the UUID according to the specified format. + if style == "simple": + return generated_uuid.hex + elif style == "hyphenated": + return str(generated_uuid) + elif style == "urn": + return f"urn:uuid:{generated_uuid}" + else: + raise ValueError("Invalid style. Choose from 'simple', 'hyphenated', or 'urn'.") + + +def workspace_filter_condition(workspace: str) -> models.FieldCondition: + """ + Create a workspace filter condition for Qdrant queries. + """ + return models.FieldCondition( + key=WORKSPACE_ID_FIELD, match=models.MatchValue(value=workspace) + ) + + +@final +@dataclass +class QdrantVectorDBStorage(BaseVectorStorage): + def __init__( + self, namespace, global_config, embedding_func, workspace=None, meta_fields=None + ): + super().__init__( + namespace=namespace, + workspace=workspace or "", + global_config=global_config, + embedding_func=embedding_func, + meta_fields=meta_fields or set(), + ) + self.__post_init__() + + @staticmethod + def setup_collection( + client: QdrantClient, + collection_name: str, + legacy_namespace: str = None, + workspace: str = None, + **kwargs, + ): + """ + Setup Qdrant collection with migration support from legacy collections. + + Args: + client: QdrantClient instance + collection_name: Name of the new collection + legacy_namespace: Name of the legacy collection (if exists) + workspace: Workspace identifier for data isolation + **kwargs: Additional arguments for collection creation (vectors_config, hnsw_config, etc.) + """ + new_collection_exists = client.collection_exists(collection_name) + legacy_exists = legacy_namespace and client.collection_exists(legacy_namespace) + + # Case 1: Both new and legacy collections exist - Warning only (no migration) + if new_collection_exists and legacy_exists: + logger.warning( + f"Qdrant: Legacy collection '{legacy_namespace}' still exist. Remove it if migration is complete." + ) + return + + # Case 2: Only new collection exists - Ensure index exists + if new_collection_exists: + # Check if workspace index exists, create if missing + try: + collection_info = client.get_collection(collection_name) + if WORKSPACE_ID_FIELD not in collection_info.payload_schema: + logger.info( + f"Qdrant: Creating missing workspace index for '{collection_name}'" + ) + client.create_payload_index( + collection_name=collection_name, + field_name=WORKSPACE_ID_FIELD, + field_schema=models.KeywordIndexParams( + type=models.KeywordIndexType.KEYWORD, + is_tenant=True, + ), + ) + except Exception as e: + logger.warning( + f"Qdrant: Could not verify/create workspace index for '{collection_name}': {e}" + ) + return + + # Case 3: Neither exists - Create new collection + if not legacy_exists: + logger.info(f"Qdrant: Creating new collection '{collection_name}'") + client.create_collection(collection_name, **kwargs) + client.create_payload_index( + collection_name=collection_name, + field_name=WORKSPACE_ID_FIELD, + field_schema=models.KeywordIndexParams( + type=models.KeywordIndexType.KEYWORD, + is_tenant=True, + ), + ) + logger.info(f"Qdrant: Collection '{collection_name}' created successfully") + return + + # Case 4: Only legacy exists - Migrate data + logger.info( + f"Qdrant: Migrating data from legacy collection '{legacy_namespace}'" + ) + + try: + # Get legacy collection count + legacy_count = client.count( + collection_name=legacy_namespace, exact=True + ).count + logger.info(f"Qdrant: Found {legacy_count} records in legacy collection") + + if legacy_count == 0: + logger.info("Qdrant: Legacy collection is empty, skipping migration") + # Create new empty collection + client.create_collection(collection_name, **kwargs) + client.create_payload_index( + collection_name=collection_name, + field_name=WORKSPACE_ID_FIELD, + field_schema=models.KeywordIndexParams( + type=models.KeywordIndexType.KEYWORD, + is_tenant=True, + ), + ) + return + + # Create new collection first + logger.info(f"Qdrant: Creating new collection '{collection_name}'") + client.create_collection(collection_name, **kwargs) + + # Batch migration (500 records per batch) + migrated_count = 0 + offset = None + batch_size = 500 + + while True: + # Scroll through legacy data + result = client.scroll( + collection_name=legacy_namespace, + limit=batch_size, + offset=offset, + with_vectors=True, + with_payload=True, + ) + points, next_offset = result + + if not points: + break + + # Transform points for new collection + new_points = [] + for point in points: + # Add workspace_id to payload + new_payload = dict(point.payload or {}) + new_payload[WORKSPACE_ID_FIELD] = workspace or DEFAULT_WORKSPACE + + # Create new point with workspace-prefixed ID + original_id = new_payload.get(ID_FIELD) + if original_id: + new_point_id = compute_mdhash_id_for_qdrant( + original_id, prefix=workspace or DEFAULT_WORKSPACE + ) + else: + # Fallback: use original point ID + new_point_id = str(point.id) + + new_points.append( + models.PointStruct( + id=new_point_id, + vector=point.vector, + payload=new_payload, + ) + ) + + # Upsert to new collection + client.upsert( + collection_name=collection_name, points=new_points, wait=True + ) + + migrated_count += len(points) + logger.info(f"Qdrant: {migrated_count}/{legacy_count} records migrated") + + # Check if we've reached the end + if next_offset is None: + break + offset = next_offset + + # Verify migration by comparing counts + logger.info("Verifying migration...") + new_count = client.count(collection_name=collection_name, exact=True).count + + if new_count != legacy_count: + error_msg = f"Qdrant: Migration verification failed, expected {legacy_count} records, got {new_count} in new collection" + logger.error(error_msg) + raise QdrantMigrationError(error_msg) + + logger.info( + f"Qdrant: Migration completed successfully: {migrated_count} records migrated" + ) + + # Create payload index after successful migration + logger.info("Qdrant: Creating workspace payload index...") + client.create_payload_index( + collection_name=collection_name, + field_name=WORKSPACE_ID_FIELD, + field_schema=models.KeywordIndexParams( + type=models.KeywordIndexType.KEYWORD, + is_tenant=True, + ), + ) + logger.info( + f"Qdrant: Migration from '{legacy_namespace}' to '{collection_name}' completed successfully" + ) + + except QdrantMigrationError: + # Re-raise migration errors without wrapping + raise + except Exception as e: + error_msg = f"Qdrant: Migration failed with error: {e}" + logger.error(error_msg) + raise QdrantMigrationError(error_msg) from e + + def __post_init__(self): + # Check for QDRANT_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all Qdrant storage instances + qdrant_workspace = os.environ.get("QDRANT_WORKSPACE") + if qdrant_workspace and qdrant_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = qdrant_workspace.strip() + logger.info( + f"Using QDRANT_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Get legacy namespace for data migration from old version + if effective_workspace: + self.legacy_namespace = f"{effective_workspace}_{self.namespace}" + else: + self.legacy_namespace = self.namespace + + self.effective_workspace = effective_workspace or DEFAULT_WORKSPACE + + # Use a shared collection with payload-based partitioning (Qdrant's recommended approach) + # Ref: https://qdrant.tech/documentation/guides/multiple-partitions/ + self.final_namespace = f"lightrag_vdb_{self.namespace}" + logger.debug( + f"Using shared collection '{self.final_namespace}' with workspace '{self.effective_workspace}' for payload-based partitioning" + ) + + kwargs = self.global_config.get("vector_db_storage_cls_kwargs", {}) + cosine_threshold = kwargs.get("cosine_better_than_threshold") + if cosine_threshold is None: + raise ValueError( + "cosine_better_than_threshold must be specified in vector_db_storage_cls_kwargs" + ) + self.cosine_better_than_threshold = cosine_threshold + + # Initialize client as None - will be created in initialize() method + self._client = None + self._max_batch_size = self.global_config["embedding_batch_num"] + self._initialized = False + + async def initialize(self): + """Initialize Qdrant collection""" + async with get_data_init_lock(): + if self._initialized: + return + + try: + # Create QdrantClient if not already created + if self._client is None: + self._client = QdrantClient( + url=os.environ.get( + "QDRANT_URL", config.get("qdrant", "uri", fallback=None) + ), + api_key=os.environ.get( + "QDRANT_API_KEY", + config.get("qdrant", "apikey", fallback=None), + ), + ) + logger.debug( + f"[{self.workspace}] QdrantClient created successfully" + ) + + # Setup collection (create if not exists and configure indexes) + # Pass legacy_namespace and workspace for migration support + QdrantVectorDBStorage.setup_collection( + self._client, + self.final_namespace, + legacy_namespace=self.legacy_namespace, + workspace=self.effective_workspace, + vectors_config=models.VectorParams( + size=self.embedding_func.embedding_dim, + distance=models.Distance.COSINE, + ), + hnsw_config=models.HnswConfigDiff( + payload_m=16, + m=0, + ), + ) + + self._initialized = True + logger.info( + f"[{self.workspace}] Qdrant collection '{self.namespace}' initialized successfully" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to initialize Qdrant collection '{self.namespace}': {e}" + ) + raise + + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + logger.debug(f"[{self.workspace}] Inserting {len(data)} to {self.namespace}") + if not data: + return + + import time + + current_time = int(time.time()) + + list_data = [ + { + ID_FIELD: k, + WORKSPACE_ID_FIELD: self.effective_workspace, + CREATED_AT_FIELD: current_time, + **{k1: v1 for k1, v1 in v.items() if k1 in self.meta_fields}, + } + for k, v in data.items() + ] + contents = [v["content"] for v in data.values()] + batches = [ + contents[i : i + self._max_batch_size] + for i in range(0, len(contents), self._max_batch_size) + ] + + embedding_tasks = [self.embedding_func(batch) for batch in batches] + embeddings_list = await asyncio.gather(*embedding_tasks) + + embeddings = np.concatenate(embeddings_list) + + list_points = [] + for i, d in enumerate(list_data): + list_points.append( + models.PointStruct( + id=compute_mdhash_id_for_qdrant( + d[ID_FIELD], prefix=self.effective_workspace + ), + vector=embeddings[i], + payload=d, + ) + ) + + results = self._client.upsert( + collection_name=self.final_namespace, points=list_points, wait=True + ) + return results + + async def query( + self, query: str, top_k: int, query_embedding: list[float] = None + ) -> list[dict[str, Any]]: + if query_embedding is not None: + embedding = query_embedding + else: + embedding_result = await self.embedding_func( + [query], _priority=5 + ) # higher priority for query + embedding = embedding_result[0] + + results = self._client.query_points( + collection_name=self.final_namespace, + query=embedding, + limit=top_k, + with_payload=True, + score_threshold=self.cosine_better_than_threshold, + query_filter=models.Filter( + must=[workspace_filter_condition(self.effective_workspace)] + ), + ).points + + return [ + { + **dp.payload, + "distance": dp.score, + CREATED_AT_FIELD: dp.payload.get(CREATED_AT_FIELD), + } + for dp in results + ] + + async def index_done_callback(self) -> None: + # Qdrant handles persistence automatically + pass + + async def delete(self, ids: List[str]) -> None: + """Delete vectors with specified IDs + + Args: + ids: List of vector IDs to be deleted + """ + try: + if not ids: + return + + # Convert regular ids to Qdrant compatible ids + qdrant_ids = [ + compute_mdhash_id_for_qdrant(id, prefix=self.effective_workspace) + for id in ids + ] + # Delete points from the collection with workspace filtering + self._client.delete( + collection_name=self.final_namespace, + points_selector=models.PointIdsList(points=qdrant_ids), + wait=True, + ) + logger.debug( + f"[{self.workspace}] Successfully deleted {len(ids)} vectors from {self.namespace}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error while deleting vectors from {self.namespace}: {e}" + ) + + async def delete_entity(self, entity_name: str) -> None: + """Delete an entity by name + + Args: + entity_name: Name of the entity to delete + """ + try: + # Generate the entity ID using the same function as used for storage + entity_id = compute_mdhash_id(entity_name, prefix=ENTITY_PREFIX) + qdrant_entity_id = compute_mdhash_id_for_qdrant( + entity_id, prefix=self.effective_workspace + ) + + # Delete the entity point by its Qdrant ID directly + self._client.delete( + collection_name=self.final_namespace, + points_selector=models.PointIdsList(points=[qdrant_entity_id]), + wait=True, + ) + logger.debug( + f"[{self.workspace}] Successfully deleted entity {entity_name}" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error deleting entity {entity_name}: {e}") + + async def delete_entity_relation(self, entity_name: str) -> None: + """Delete all relations associated with an entity + + Args: + entity_name: Name of the entity whose relations should be deleted + """ + try: + # Find relations where the entity is either source or target, with workspace filtering + results = self._client.scroll( + collection_name=self.final_namespace, + scroll_filter=models.Filter( + must=[workspace_filter_condition(self.effective_workspace)], + should=[ + models.FieldCondition( + key="src_id", match=models.MatchValue(value=entity_name) + ), + models.FieldCondition( + key="tgt_id", match=models.MatchValue(value=entity_name) + ), + ], + ), + with_payload=True, + limit=1000, # Adjust as needed for your use case + ) + + # Extract points that need to be deleted + relation_points = results[0] + ids_to_delete = [point.id for point in relation_points] + + if ids_to_delete: + # Delete the relations with workspace filtering + assert isinstance(self._client, QdrantClient) + self._client.delete( + collection_name=self.final_namespace, + points_selector=models.PointIdsList(points=ids_to_delete), + wait=True, + ) + logger.debug( + f"[{self.workspace}] Deleted {len(ids_to_delete)} relations for {entity_name}" + ) + else: + logger.debug( + f"[{self.workspace}] No relations found for entity {entity_name}" + ) + except Exception as e: + logger.error( + f"[{self.workspace}] Error deleting relations for {entity_name}: {e}" + ) + + async def get_by_id(self, id: str) -> dict[str, Any] | None: + """Get vector data by its ID + + Args: + id: The unique identifier of the vector + + Returns: + The vector data if found, or None if not found + """ + try: + # Convert to Qdrant compatible ID + qdrant_id = compute_mdhash_id_for_qdrant( + id, prefix=self.effective_workspace + ) + + # Retrieve the point by ID with workspace filtering + result = self._client.retrieve( + collection_name=self.final_namespace, + ids=[qdrant_id], + with_payload=True, + ) + + if not result: + return None + + payload = result[0].payload + if CREATED_AT_FIELD not in payload: + payload[CREATED_AT_FIELD] = None + + return payload + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for ID {id}: {e}" + ) + return None + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + """Get multiple vector data by their IDs + + Args: + ids: List of unique identifiers + + Returns: + List of vector data objects that were found + """ + if not ids: + return [] + + try: + # Convert to Qdrant compatible IDs + qdrant_ids = [ + compute_mdhash_id_for_qdrant(id, prefix=self.effective_workspace) + for id in ids + ] + + # Retrieve the points by IDs + results = self._client.retrieve( + collection_name=self.final_namespace, + ids=qdrant_ids, + with_payload=True, + ) + + # Ensure each result contains created_at field and preserve caller ordering + payload_by_original_id: dict[str, dict[str, Any]] = {} + payload_by_qdrant_id: dict[str, dict[str, Any]] = {} + + for point in results: + payload = dict(point.payload or {}) + if CREATED_AT_FIELD not in payload: + payload[CREATED_AT_FIELD] = None + + qdrant_point_id = str(point.id) if point.id is not None else "" + if qdrant_point_id: + payload_by_qdrant_id[qdrant_point_id] = payload + + original_id = payload.get(ID_FIELD) + if original_id is not None: + payload_by_original_id[str(original_id)] = payload + + ordered_payloads: list[dict[str, Any] | None] = [] + for requested_id, qdrant_id in zip(ids, qdrant_ids): + payload = payload_by_original_id.get(str(requested_id)) + if payload is None: + payload = payload_by_qdrant_id.get(str(qdrant_id)) + ordered_payloads.append(payload) + + return ordered_payloads + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vector data for IDs {ids}: {e}" + ) + return [] + + async def get_vectors_by_ids(self, ids: list[str]) -> dict[str, list[float]]: + """Get vectors by their IDs, returning only ID and vector data for efficiency + + Args: + ids: List of unique identifiers + + Returns: + Dictionary mapping IDs to their vector embeddings + Format: {id: [vector_values], ...} + """ + if not ids: + return {} + + try: + # Convert to Qdrant compatible IDs + qdrant_ids = [ + compute_mdhash_id_for_qdrant(id, prefix=self.effective_workspace) + for id in ids + ] + + # Retrieve the points by IDs with vectors + results = self._client.retrieve( + collection_name=self.final_namespace, + ids=qdrant_ids, + with_vectors=True, # Important: request vectors + with_payload=True, + ) + + vectors_dict = {} + for point in results: + if point and point.vector is not None and point.payload: + # Get original ID from payload + original_id = point.payload.get(ID_FIELD) + if original_id: + # Convert numpy array to list if needed + vector_data = point.vector + if isinstance(vector_data, np.ndarray): + vector_data = vector_data.tolist() + vectors_dict[original_id] = vector_data + + return vectors_dict + except Exception as e: + logger.error( + f"[{self.workspace}] Error retrieving vectors by IDs from {self.namespace}: {e}" + ) + return {} + + async def drop(self) -> dict[str, str]: + """Drop all vector data from storage and clean up resources + + This method will delete all data for the current workspace from the Qdrant collection. + + Returns: + dict[str, str]: Operation status and message + - On success: {"status": "success", "message": "data dropped"} + - On failure: {"status": "error", "message": ""} + """ + async with get_storage_lock(): + try: + # Delete all points for the current workspace + self._client.delete( + collection_name=self.final_namespace, + points_selector=models.FilterSelector( + filter=models.Filter( + must=[workspace_filter_condition(self.effective_workspace)] + ) + ), + wait=True, + ) + + logger.info( + f"[{self.workspace}] Process {os.getpid()} dropped workspace data from Qdrant collection {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping workspace data from Qdrant collection {self.namespace}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/redis_impl.py b/LightRAG/lightrag/kg/redis_impl.py new file mode 100644 index 00000000..2e9a7d43 --- /dev/null +++ b/LightRAG/lightrag/kg/redis_impl.py @@ -0,0 +1,1125 @@ +import os +import logging +from typing import Any, final, Union +from dataclasses import dataclass +import pipmaster as pm +import configparser +from contextlib import asynccontextmanager +import threading + +if not pm.is_installed("redis"): + pm.install("redis") + +# aioredis is a depricated library, replaced with redis +from redis.asyncio import Redis, ConnectionPool # type: ignore +from redis.exceptions import RedisError, ConnectionError, TimeoutError # type: ignore +from lightrag.utils import logger, get_pinyin_sort_key + +from lightrag.base import ( + BaseKVStorage, + DocStatusStorage, + DocStatus, + DocProcessingStatus, +) +from ..kg.shared_storage import get_data_init_lock, get_storage_lock +import json + +# Import tenacity for retry logic +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, + before_sleep_log, +) + +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + +# Constants for Redis connection pool with environment variable support +MAX_CONNECTIONS = int(os.getenv("REDIS_MAX_CONNECTIONS", "200")) +SOCKET_TIMEOUT = float(os.getenv("REDIS_SOCKET_TIMEOUT", "30.0")) +SOCKET_CONNECT_TIMEOUT = float(os.getenv("REDIS_CONNECT_TIMEOUT", "10.0")) +RETRY_ATTEMPTS = int(os.getenv("REDIS_RETRY_ATTEMPTS", "3")) + +# Tenacity retry decorator for Redis operations +redis_retry = retry( + stop=stop_after_attempt(RETRY_ATTEMPTS), + wait=wait_exponential(multiplier=1, min=1, max=8), + retry=( + retry_if_exception_type(ConnectionError) + | retry_if_exception_type(TimeoutError) + | retry_if_exception_type(RedisError) + ), + before_sleep=before_sleep_log(logger, logging.WARNING), +) + + +class RedisConnectionManager: + """Shared Redis connection pool manager to avoid creating multiple pools for the same Redis URI""" + + _pools = {} + _pool_refs = {} # Track reference count for each pool + _lock = threading.Lock() + + @classmethod + def get_pool(cls, redis_url: str) -> ConnectionPool: + """Get or create a connection pool for the given Redis URL""" + with cls._lock: + if redis_url not in cls._pools: + cls._pools[redis_url] = ConnectionPool.from_url( + redis_url, + max_connections=MAX_CONNECTIONS, + decode_responses=True, + socket_timeout=SOCKET_TIMEOUT, + socket_connect_timeout=SOCKET_CONNECT_TIMEOUT, + ) + cls._pool_refs[redis_url] = 0 + logger.info(f"Created shared Redis connection pool for {redis_url}") + + # Increment reference count + cls._pool_refs[redis_url] += 1 + logger.debug( + f"Redis pool {redis_url} reference count: {cls._pool_refs[redis_url]}" + ) + + return cls._pools[redis_url] + + @classmethod + def release_pool(cls, redis_url: str): + """Release a reference to the connection pool""" + with cls._lock: + if redis_url in cls._pool_refs: + cls._pool_refs[redis_url] -= 1 + logger.debug( + f"Redis pool {redis_url} reference count: {cls._pool_refs[redis_url]}" + ) + + # If no more references, close the pool + if cls._pool_refs[redis_url] <= 0: + try: + cls._pools[redis_url].disconnect() + logger.info( + f"Closed Redis connection pool for {redis_url} (no more references)" + ) + except Exception as e: + logger.error(f"Error closing Redis pool for {redis_url}: {e}") + finally: + del cls._pools[redis_url] + del cls._pool_refs[redis_url] + + @classmethod + def close_all_pools(cls): + """Close all connection pools (for cleanup)""" + with cls._lock: + for url, pool in cls._pools.items(): + try: + pool.disconnect() + logger.info(f"Closed Redis connection pool for {url}") + except Exception as e: + logger.error(f"Error closing Redis pool for {url}: {e}") + cls._pools.clear() + cls._pool_refs.clear() + + +@final +@dataclass +class RedisKVStorage(BaseKVStorage): + def __post_init__(self): + # Check for REDIS_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all Redis storage instances + redis_workspace = os.environ.get("REDIS_WORKSPACE") + if redis_workspace and redis_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = redis_workspace.strip() + logger.info( + f"Using REDIS_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + logger.debug( + f"Final namespace with workspace prefix: '{self.final_namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug(f"Final namespace (no workspace): '{self.final_namespace}'") + + self._redis_url = os.environ.get( + "REDIS_URI", config.get("redis", "uri", fallback="redis://localhost:6379") + ) + self._pool = None + self._redis = None + self._initialized = False + + try: + # Use shared connection pool + self._pool = RedisConnectionManager.get_pool(self._redis_url) + self._redis = Redis(connection_pool=self._pool) + logger.info( + f"[{self.workspace}] Initialized Redis KV storage for {self.namespace} using shared connection pool" + ) + except Exception as e: + # Clean up on initialization failure + if self._redis_url: + RedisConnectionManager.release_pool(self._redis_url) + logger.error( + f"[{self.workspace}] Failed to initialize Redis KV storage: {e}" + ) + raise + + async def initialize(self): + """Initialize Redis connection and migrate legacy cache structure if needed""" + async with get_data_init_lock(): + if self._initialized: + return + + # Test connection + try: + async with self._get_redis_connection() as redis: + await redis.ping() + logger.info( + f"[{self.workspace}] Connected to Redis for namespace {self.namespace}" + ) + self._initialized = True + except Exception as e: + logger.error(f"[{self.workspace}] Failed to connect to Redis: {e}") + # Clean up on connection failure + await self.close() + raise + + # Migrate legacy cache structure if this is a cache namespace + if self.namespace.endswith("_cache"): + try: + await self._migrate_legacy_cache_structure() + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to migrate legacy cache structure: {e}" + ) + # Don't fail initialization for migration errors, just log them + + @asynccontextmanager + async def _get_redis_connection(self): + """Safe context manager for Redis operations.""" + if not self._redis: + raise ConnectionError("Redis connection not initialized") + + try: + # Use the existing Redis instance with shared pool + yield self._redis + except ConnectionError as e: + logger.error( + f"[{self.workspace}] Redis connection error in {self.namespace}: {e}" + ) + raise + except RedisError as e: + logger.error( + f"[{self.workspace}] Redis operation error in {self.namespace}: {e}" + ) + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Unexpected error in Redis operation for {self.namespace}: {e}" + ) + raise + + async def close(self): + """Close the Redis connection and release pool reference to prevent resource leaks.""" + if hasattr(self, "_redis") and self._redis: + try: + await self._redis.close() + logger.debug( + f"[{self.workspace}] Closed Redis connection for {self.namespace}" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error closing Redis connection: {e}") + finally: + self._redis = None + + # Release the pool reference (will auto-close pool if no more references) + if hasattr(self, "_redis_url") and self._redis_url: + RedisConnectionManager.release_pool(self._redis_url) + self._pool = None + logger.debug( + f"[{self.workspace}] Released Redis connection pool reference for {self.namespace}" + ) + + async def __aenter__(self): + """Support for async context manager.""" + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Ensure Redis resources are cleaned up when exiting context.""" + await self.close() + + @redis_retry + async def get_by_id(self, id: str) -> dict[str, Any] | None: + async with self._get_redis_connection() as redis: + try: + data = await redis.get(f"{self.final_namespace}:{id}") + if data: + result = json.loads(data) + # Ensure time fields are present, provide default values for old data + result.setdefault("create_time", 0) + result.setdefault("update_time", 0) + return result + return None + except json.JSONDecodeError as e: + logger.error(f"[{self.workspace}] JSON decode error for id {id}: {e}") + return None + + @redis_retry + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + async with self._get_redis_connection() as redis: + try: + pipe = redis.pipeline() + for id in ids: + pipe.get(f"{self.final_namespace}:{id}") + results = await pipe.execute() + + processed_results = [] + for result in results: + if result: + data = json.loads(result) + # Ensure time fields are present for all documents + data.setdefault("create_time", 0) + data.setdefault("update_time", 0) + processed_results.append(data) + else: + processed_results.append(None) + + return processed_results + except json.JSONDecodeError as e: + logger.error(f"[{self.workspace}] JSON decode error in batch get: {e}") + return [None] * len(ids) + + async def filter_keys(self, keys: set[str]) -> set[str]: + async with self._get_redis_connection() as redis: + pipe = redis.pipeline() + keys_list = list(keys) # Convert set to list for indexing + for key in keys_list: + pipe.exists(f"{self.final_namespace}:{key}") + results = await pipe.execute() + + existing_ids = {keys_list[i] for i, exists in enumerate(results) if exists} + return set(keys) - existing_ids + + @redis_retry + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + if not data: + return + + import time + + current_time = int(time.time()) # Get current Unix timestamp + + async with self._get_redis_connection() as redis: + try: + # Check which keys already exist to determine create vs update + pipe = redis.pipeline() + for k in data.keys(): + pipe.exists(f"{self.final_namespace}:{k}") + exists_results = await pipe.execute() + + # Add timestamps to data + for i, (k, v) in enumerate(data.items()): + # For text_chunks namespace, ensure llm_cache_list field exists + if self.namespace.endswith("text_chunks"): + if "llm_cache_list" not in v: + v["llm_cache_list"] = [] + + # Add timestamps based on whether key exists + if exists_results[i]: # Key exists, only update update_time + v["update_time"] = current_time + else: # New key, set both create_time and update_time + v["create_time"] = current_time + v["update_time"] = current_time + + v["_id"] = k + + # Store the data + pipe = redis.pipeline() + for k, v in data.items(): + pipe.set(f"{self.final_namespace}:{k}", json.dumps(v)) + await pipe.execute() + + except json.JSONDecodeError as e: + logger.error(f"[{self.workspace}] JSON decode error during upsert: {e}") + raise + + async def index_done_callback(self) -> None: + # Redis handles persistence automatically + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + pattern = f"{self.final_namespace}:*" + try: + async with self._get_redis_connection() as redis: + # Use scan to check if any keys exist + async for key in redis.scan_iter(match=pattern, count=1): + return False # Found at least one key + return True # No keys found + except Exception as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + async def delete(self, ids: list[str]) -> None: + """Delete specific records from storage by their IDs""" + if not ids: + return + + async with self._get_redis_connection() as redis: + pipe = redis.pipeline() + for id in ids: + pipe.delete(f"{self.final_namespace}:{id}") + + results = await pipe.execute() + deleted_count = sum(results) + logger.info( + f"[{self.workspace}] Deleted {deleted_count} of {len(ids)} entries from {self.namespace}" + ) + + async def drop(self) -> dict[str, str]: + """Drop the storage by removing all keys under the current namespace. + + Returns: + dict[str, str]: Status of the operation with keys 'status' and 'message' + """ + async with get_storage_lock(): + async with self._get_redis_connection() as redis: + try: + # Use SCAN to find all keys with the namespace prefix + pattern = f"{self.final_namespace}:*" + cursor = 0 + deleted_count = 0 + + while True: + cursor, keys = await redis.scan( + cursor, match=pattern, count=1000 + ) + if keys: + # Delete keys in batches + pipe = redis.pipeline() + for key in keys: + pipe.delete(key) + results = await pipe.execute() + deleted_count += sum(results) + + if cursor == 0: + break + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} keys from {self.namespace}" + ) + return { + "status": "success", + "message": f"{deleted_count} keys dropped", + } + + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping keys from {self.namespace}: {e}" + ) + return {"status": "error", "message": str(e)} + + async def _migrate_legacy_cache_structure(self): + """Migrate legacy nested cache structure to flattened structure for Redis + + Redis already stores data in a flattened way, but we need to check for + legacy keys that might contain nested JSON structures and migrate them. + + Early exit if any flattened key is found (indicating migration already done). + """ + from lightrag.utils import generate_cache_key + + async with self._get_redis_connection() as redis: + # Get all keys for this namespace + keys = await redis.keys(f"{self.final_namespace}:*") + + if not keys: + return + + # Check if we have any flattened keys already - if so, skip migration + has_flattened_keys = False + keys_to_migrate = [] + + for key in keys: + # Extract the ID part (after namespace:) + key_id = key.split(":", 1)[1] + + # Check if already in flattened format (contains exactly 2 colons for mode:cache_type:hash) + if ":" in key_id and len(key_id.split(":")) == 3: + has_flattened_keys = True + break # Early exit - migration already done + + # Get the data to check if it's a legacy nested structure + data = await redis.get(key) + if data: + try: + parsed_data = json.loads(data) + # Check if this looks like a legacy cache mode with nested structure + if isinstance(parsed_data, dict) and all( + isinstance(v, dict) and "return" in v + for v in parsed_data.values() + ): + keys_to_migrate.append((key, key_id, parsed_data)) + except json.JSONDecodeError: + continue + + # If we found any flattened keys, assume migration is already done + if has_flattened_keys: + logger.debug( + f"[{self.workspace}] Found flattened cache keys in {self.namespace}, skipping migration" + ) + return + + if not keys_to_migrate: + return + + # Perform migration + pipe = redis.pipeline() + migration_count = 0 + + for old_key, mode, nested_data in keys_to_migrate: + # Delete the old key + pipe.delete(old_key) + + # Create new flattened keys + for cache_hash, cache_entry in nested_data.items(): + cache_type = cache_entry.get("cache_type", "extract") + flattened_key = generate_cache_key(mode, cache_type, cache_hash) + full_key = f"{self.final_namespace}:{flattened_key}" + pipe.set(full_key, json.dumps(cache_entry)) + migration_count += 1 + + await pipe.execute() + + if migration_count > 0: + logger.info( + f"[{self.workspace}] Migrated {migration_count} legacy cache entries to flattened structure in Redis" + ) + + +@final +@dataclass +class RedisDocStatusStorage(DocStatusStorage): + """Redis implementation of document status storage""" + + def __post_init__(self): + # Check for REDIS_WORKSPACE environment variable first (higher priority) + # This allows administrators to force a specific workspace for all Redis storage instances + redis_workspace = os.environ.get("REDIS_WORKSPACE") + if redis_workspace and redis_workspace.strip(): + # Use environment variable value, overriding the passed workspace parameter + effective_workspace = redis_workspace.strip() + logger.info( + f"Using REDIS_WORKSPACE environment variable: '{effective_workspace}' (overriding passed workspace: '{self.workspace}')" + ) + else: + # Use the workspace parameter passed during initialization + effective_workspace = self.workspace + if effective_workspace: + logger.debug( + f"Using passed workspace parameter: '{effective_workspace}'" + ) + + # Build final_namespace with workspace prefix for data isolation + # Keep original namespace unchanged for type detection logic + if effective_workspace: + self.final_namespace = f"{effective_workspace}_{self.namespace}" + logger.debug( + f"[{self.workspace}] Final namespace with workspace prefix: '{self.namespace}'" + ) + else: + # When workspace is empty, final_namespace equals original namespace + self.final_namespace = self.namespace + self.workspace = "_" + logger.debug( + f"[{self.workspace}] Final namespace (no workspace): '{self.namespace}'" + ) + + self._redis_url = os.environ.get( + "REDIS_URI", config.get("redis", "uri", fallback="redis://localhost:6379") + ) + self._pool = None + self._redis = None + self._initialized = False + + try: + # Use shared connection pool + self._pool = RedisConnectionManager.get_pool(self._redis_url) + self._redis = Redis(connection_pool=self._pool) + logger.info( + f"[{self.workspace}] Initialized Redis doc status storage for {self.namespace} using shared connection pool" + ) + except Exception as e: + # Clean up on initialization failure + if self._redis_url: + RedisConnectionManager.release_pool(self._redis_url) + logger.error( + f"[{self.workspace}] Failed to initialize Redis doc status storage: {e}" + ) + raise + + async def initialize(self): + """Initialize Redis connection""" + async with get_data_init_lock(): + if self._initialized: + return + + try: + async with self._get_redis_connection() as redis: + await redis.ping() + logger.info( + f"[{self.workspace}] Connected to Redis for doc status namespace {self.namespace}" + ) + self._initialized = True + except Exception as e: + logger.error( + f"[{self.workspace}] Failed to connect to Redis for doc status: {e}" + ) + # Clean up on connection failure + await self.close() + raise + + @asynccontextmanager + async def _get_redis_connection(self): + """Safe context manager for Redis operations.""" + if not self._redis: + raise ConnectionError("Redis connection not initialized") + + try: + # Use the existing Redis instance with shared pool + yield self._redis + except ConnectionError as e: + logger.error( + f"[{self.workspace}] Redis connection error in doc status {self.namespace}: {e}" + ) + raise + except RedisError as e: + logger.error( + f"[{self.workspace}] Redis operation error in doc status {self.namespace}: {e}" + ) + raise + except Exception as e: + logger.error( + f"[{self.workspace}] Unexpected error in Redis doc status operation for {self.namespace}: {e}" + ) + raise + + async def close(self): + """Close the Redis connection and release pool reference to prevent resource leaks.""" + if hasattr(self, "_redis") and self._redis: + try: + await self._redis.close() + logger.debug( + f"[{self.workspace}] Closed Redis connection for doc status {self.namespace}" + ) + except Exception as e: + logger.error(f"[{self.workspace}] Error closing Redis connection: {e}") + finally: + self._redis = None + + # Release the pool reference (will auto-close pool if no more references) + if hasattr(self, "_redis_url") and self._redis_url: + RedisConnectionManager.release_pool(self._redis_url) + self._pool = None + logger.debug( + f"[{self.workspace}] Released Redis connection pool reference for doc status {self.namespace}" + ) + + async def __aenter__(self): + """Support for async context manager.""" + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Ensure Redis resources are cleaned up when exiting context.""" + await self.close() + + async def filter_keys(self, keys: set[str]) -> set[str]: + """Return keys that should be processed (not in storage or not successfully processed)""" + async with self._get_redis_connection() as redis: + pipe = redis.pipeline() + keys_list = list(keys) + for key in keys_list: + pipe.exists(f"{self.final_namespace}:{key}") + results = await pipe.execute() + + existing_ids = {keys_list[i] for i, exists in enumerate(results) if exists} + return set(keys) - existing_ids + + async def get_by_ids(self, ids: list[str]) -> list[dict[str, Any]]: + ordered_results: list[dict[str, Any] | None] = [] + async with self._get_redis_connection() as redis: + try: + pipe = redis.pipeline() + for id in ids: + pipe.get(f"{self.final_namespace}:{id}") + results = await pipe.execute() + + for result_data in results: + if result_data: + try: + ordered_results.append(json.loads(result_data)) + except json.JSONDecodeError as e: + logger.error( + f"[{self.workspace}] JSON decode error in get_by_ids: {e}" + ) + ordered_results.append(None) + else: + ordered_results.append(None) + except Exception as e: + logger.error(f"[{self.workspace}] Error in get_by_ids: {e}") + return ordered_results + + async def get_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status""" + counts = {status.value: 0 for status in DocStatus} + async with self._get_redis_connection() as redis: + try: + # Use SCAN to iterate through all keys in the namespace + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=f"{self.final_namespace}:*", count=1000 + ) + if keys: + # Get all values in batch + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + # Count statuses + for value in values: + if value: + try: + doc_data = json.loads(value) + status = doc_data.get("status") + if status in counts: + counts[status] += 1 + except json.JSONDecodeError: + continue + + if cursor == 0: + break + except Exception as e: + logger.error(f"[{self.workspace}] Error getting status counts: {e}") + + return counts + + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific status""" + result = {} + async with self._get_redis_connection() as redis: + try: + # Use SCAN to iterate through all keys in the namespace + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=f"{self.final_namespace}:*", count=1000 + ) + if keys: + # Get all values in batch + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + # Filter by status and create DocProcessingStatus objects + for key, value in zip(keys, values): + if value: + try: + doc_data = json.loads(value) + if doc_data.get("status") == status.value: + # Extract document ID from key + doc_id = key.split(":", 1)[1] + + # Make a copy of the data to avoid modifying the original + data = doc_data.copy() + # Remove deprecated content field if it exists + data.pop("content", None) + # If file_path is not in data, use document id as file path + if "file_path" not in data: + data["file_path"] = "no-file-path" + # Ensure new fields exist with default values + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + + result[doc_id] = DocProcessingStatus(**data) + except (json.JSONDecodeError, KeyError) as e: + logger.error( + f"[{self.workspace}] Error processing document {key}: {e}" + ) + continue + + if cursor == 0: + break + except Exception as e: + logger.error(f"[{self.workspace}] Error getting docs by status: {e}") + + return result + + async def get_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get all documents with a specific track_id""" + result = {} + async with self._get_redis_connection() as redis: + try: + # Use SCAN to iterate through all keys in the namespace + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=f"{self.final_namespace}:*", count=1000 + ) + if keys: + # Get all values in batch + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + # Filter by track_id and create DocProcessingStatus objects + for key, value in zip(keys, values): + if value: + try: + doc_data = json.loads(value) + if doc_data.get("track_id") == track_id: + # Extract document ID from key + doc_id = key.split(":", 1)[1] + + # Make a copy of the data to avoid modifying the original + data = doc_data.copy() + # Remove deprecated content field if it exists + data.pop("content", None) + # If file_path is not in data, use document id as file path + if "file_path" not in data: + data["file_path"] = "no-file-path" + # Ensure new fields exist with default values + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + + result[doc_id] = DocProcessingStatus(**data) + except (json.JSONDecodeError, KeyError) as e: + logger.error( + f"[{self.workspace}] Error processing document {key}: {e}" + ) + continue + + if cursor == 0: + break + except Exception as e: + logger.error(f"[{self.workspace}] Error getting docs by track_id: {e}") + + return result + + async def index_done_callback(self) -> None: + """Redis handles persistence automatically""" + pass + + async def is_empty(self) -> bool: + """Check if the storage is empty for the current workspace and namespace + + Returns: + bool: True if storage is empty, False otherwise + """ + pattern = f"{self.final_namespace}:*" + try: + async with self._get_redis_connection() as redis: + # Use scan to check if any keys exist + async for key in redis.scan_iter(match=pattern, count=1): + return False # Found at least one key + return True # No keys found + except Exception as e: + logger.error(f"[{self.workspace}] Error checking if storage is empty: {e}") + return True + + @redis_retry + async def upsert(self, data: dict[str, dict[str, Any]]) -> None: + """Insert or update document status data""" + if not data: + return + + logger.debug( + f"[{self.workspace}] Inserting {len(data)} records to {self.namespace}" + ) + async with self._get_redis_connection() as redis: + try: + # Ensure chunks_list field exists for new documents + for doc_id, doc_data in data.items(): + if "chunks_list" not in doc_data: + doc_data["chunks_list"] = [] + + pipe = redis.pipeline() + for k, v in data.items(): + pipe.set(f"{self.final_namespace}:{k}", json.dumps(v)) + await pipe.execute() + except json.JSONDecodeError as e: + logger.error(f"[{self.workspace}] JSON decode error during upsert: {e}") + raise + + @redis_retry + async def get_by_id(self, id: str) -> Union[dict[str, Any], None]: + async with self._get_redis_connection() as redis: + try: + data = await redis.get(f"{self.final_namespace}:{id}") + return json.loads(data) if data else None + except json.JSONDecodeError as e: + logger.error(f"[{self.workspace}] JSON decode error for id {id}: {e}") + return None + + async def delete(self, doc_ids: list[str]) -> None: + """Delete specific records from storage by their IDs""" + if not doc_ids: + return + + async with self._get_redis_connection() as redis: + pipe = redis.pipeline() + for doc_id in doc_ids: + pipe.delete(f"{self.final_namespace}:{doc_id}") + + results = await pipe.execute() + deleted_count = sum(results) + logger.info( + f"[{self.workspace}] Deleted {deleted_count} of {len(doc_ids)} doc status entries from {self.namespace}" + ) + + async def get_docs_paginated( + self, + status_filter: DocStatus | None = None, + page: int = 1, + page_size: int = 50, + sort_field: str = "updated_at", + sort_direction: str = "desc", + ) -> tuple[list[tuple[str, DocProcessingStatus]], int]: + """Get documents with pagination support + + Args: + status_filter: Filter by document status, None for all statuses + page: Page number (1-based) + page_size: Number of documents per page (10-200) + sort_field: Field to sort by ('created_at', 'updated_at', 'id') + sort_direction: Sort direction ('asc' or 'desc') + + Returns: + Tuple of (list of (doc_id, DocProcessingStatus) tuples, total_count) + """ + # Validate parameters + if page < 1: + page = 1 + if page_size < 10: + page_size = 10 + elif page_size > 200: + page_size = 200 + + if sort_field not in ["created_at", "updated_at", "id", "file_path"]: + sort_field = "updated_at" + + if sort_direction.lower() not in ["asc", "desc"]: + sort_direction = "desc" + + # For Redis, we need to load all data and sort/filter in memory + all_docs = [] + total_count = 0 + + async with self._get_redis_connection() as redis: + try: + # Use SCAN to iterate through all keys in the namespace + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=f"{self.final_namespace}:*", count=1000 + ) + if keys: + # Get all values in batch + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + # Process documents + for key, value in zip(keys, values): + if value: + try: + doc_data = json.loads(value) + + # Apply status filter + if ( + status_filter is not None + and doc_data.get("status") + != status_filter.value + ): + continue + + # Extract document ID from key + doc_id = key.split(":", 1)[1] + + # Prepare document data + data = doc_data.copy() + data.pop("content", None) + if "file_path" not in data: + data["file_path"] = "no-file-path" + if "metadata" not in data: + data["metadata"] = {} + if "error_msg" not in data: + data["error_msg"] = None + + # Calculate sort key for sorting (but don't add to data) + if sort_field == "id": + sort_key = doc_id + elif sort_field == "file_path": + # Use pinyin sorting for file_path field to support Chinese characters + file_path_value = data.get(sort_field, "") + sort_key = get_pinyin_sort_key(file_path_value) + else: + sort_key = data.get(sort_field, "") + + doc_status = DocProcessingStatus(**data) + all_docs.append((doc_id, doc_status, sort_key)) + + except (json.JSONDecodeError, KeyError) as e: + logger.error( + f"[{self.workspace}] Error processing document {key}: {e}" + ) + continue + + if cursor == 0: + break + + except Exception as e: + logger.error(f"[{self.workspace}] Error getting paginated docs: {e}") + return [], 0 + + # Sort documents using the separate sort key + reverse_sort = sort_direction.lower() == "desc" + all_docs.sort(key=lambda x: x[2], reverse=reverse_sort) + + # Remove sort key from tuples and keep only (doc_id, doc_status) + all_docs = [(doc_id, doc_status) for doc_id, doc_status, _ in all_docs] + + total_count = len(all_docs) + + # Apply pagination + start_idx = (page - 1) * page_size + end_idx = start_idx + page_size + paginated_docs = all_docs[start_idx:end_idx] + + return paginated_docs, total_count + + async def get_all_status_counts(self) -> dict[str, int]: + """Get counts of documents in each status for all documents + + Returns: + Dictionary mapping status names to counts, including 'all' field + """ + counts = await self.get_status_counts() + + # Add 'all' field with total count + total_count = sum(counts.values()) + counts["all"] = total_count + + return counts + + async def get_doc_by_file_path(self, file_path: str) -> Union[dict[str, Any], None]: + """Get document by file path + + Args: + file_path: The file path to search for + + Returns: + Union[dict[str, Any], None]: Document data if found, None otherwise + Returns the same format as get_by_id method + """ + async with self._get_redis_connection() as redis: + try: + # Use SCAN to iterate through all keys in the namespace + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=f"{self.final_namespace}:*", count=1000 + ) + if keys: + # Get all values in batch + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + # Check each document for matching file_path + for value in values: + if value: + try: + doc_data = json.loads(value) + if doc_data.get("file_path") == file_path: + return doc_data + except json.JSONDecodeError as e: + logger.error( + f"[{self.workspace}] JSON decode error in get_doc_by_file_path: {e}" + ) + continue + + if cursor == 0: + break + + return None + except Exception as e: + logger.error(f"[{self.workspace}] Error in get_doc_by_file_path: {e}") + return None + + async def drop(self) -> dict[str, str]: + """Drop all document status data from storage and clean up resources""" + async with get_storage_lock(): + try: + async with self._get_redis_connection() as redis: + # Use SCAN to find all keys with the namespace prefix + pattern = f"{self.final_namespace}:*" + cursor = 0 + deleted_count = 0 + + while True: + cursor, keys = await redis.scan( + cursor, match=pattern, count=1000 + ) + if keys: + # Delete keys in batches + pipe = redis.pipeline() + for key in keys: + pipe.delete(key) + results = await pipe.execute() + deleted_count += sum(results) + + if cursor == 0: + break + + logger.info( + f"[{self.workspace}] Dropped {deleted_count} doc status keys from {self.namespace}" + ) + return {"status": "success", "message": "data dropped"} + except Exception as e: + logger.error( + f"[{self.workspace}] Error dropping doc status {self.namespace}: {e}" + ) + return {"status": "error", "message": str(e)} diff --git a/LightRAG/lightrag/kg/shared_storage.py b/LightRAG/lightrag/kg/shared_storage.py new file mode 100644 index 00000000..0abcf719 --- /dev/null +++ b/LightRAG/lightrag/kg/shared_storage.py @@ -0,0 +1,1536 @@ +import os +import sys +import asyncio +import multiprocessing as mp +from multiprocessing.synchronize import Lock as ProcessLock +from multiprocessing import Manager +import time +import logging +from typing import Any, Dict, List, Optional, Union, TypeVar, Generic + +from lightrag.exceptions import PipelineNotInitializedError + +DEBUG_LOCKS = False + + +# Define a direct print function for critical logs that must be visible in all processes +def direct_log(message, enable_output: bool = True, level: str = "DEBUG"): + """ + Log a message directly to stderr to ensure visibility in all processes, + including the Gunicorn master process. + + Args: + message: The message to log + level: Log level for message (control the visibility of the message by comparing with the current logger level) + enable_output: Enable or disable log message (Force to turn off the message,) + """ + if not enable_output: + return + + # Get the current logger level from the lightrag logger + try: + from lightrag.utils import logger + + current_level = logger.getEffectiveLevel() + except ImportError: + # Fallback if lightrag.utils is not available + current_level = 20 # INFO + + # Convert string level to numeric level for comparison + level_mapping = { + "DEBUG": 10, # DEBUG + "INFO": 20, # INFO + "WARNING": 30, # WARNING + "ERROR": 40, # ERROR + "CRITICAL": 50, # CRITICAL + } + message_level = level_mapping.get(level.upper(), logging.DEBUG) + + if message_level >= current_level: + print(f"{level}: {message}", file=sys.stderr, flush=True) + + +T = TypeVar("T") +LockType = Union[ProcessLock, asyncio.Lock] + +_is_multiprocess = None +_workers = None +_manager = None + +# Global singleton data for multi-process keyed locks +_lock_registry: Optional[Dict[str, mp.synchronize.Lock]] = None +_lock_registry_count: Optional[Dict[str, int]] = None +_lock_cleanup_data: Optional[Dict[str, time.time]] = None +_registry_guard = None +# Timeout for keyed locks in seconds (Default 300) +CLEANUP_KEYED_LOCKS_AFTER_SECONDS = 300 +# Cleanup pending list threshold for triggering cleanup (Default 500) +CLEANUP_THRESHOLD = 500 +# Minimum interval between cleanup operations in seconds (Default 30) +MIN_CLEANUP_INTERVAL_SECONDS = 30 +# Track the earliest cleanup time for efficient cleanup triggering (multiprocess locks only) +_earliest_mp_cleanup_time: Optional[float] = None +# Track the last cleanup time to enforce minimum interval (multiprocess locks only) +_last_mp_cleanup_time: Optional[float] = None + +_initialized = None + +# shared data for storage across processes +_shared_dicts: Optional[Dict[str, Any]] = None +_init_flags: Optional[Dict[str, bool]] = None # namespace -> initialized +_update_flags: Optional[Dict[str, bool]] = None # namespace -> updated + +# locks for mutex access +_storage_lock: Optional[LockType] = None +_internal_lock: Optional[LockType] = None +_pipeline_status_lock: Optional[LockType] = None +_graph_db_lock: Optional[LockType] = None +_data_init_lock: Optional[LockType] = None +# Manager for all keyed locks +_storage_keyed_lock: Optional["KeyedUnifiedLock"] = None + +# async locks for coroutine synchronization in multiprocess mode +_async_locks: Optional[Dict[str, asyncio.Lock]] = None + +_debug_n_locks_acquired: int = 0 + + +def inc_debug_n_locks_acquired(): + global _debug_n_locks_acquired + if DEBUG_LOCKS: + _debug_n_locks_acquired += 1 + print(f"DEBUG: Keyed Lock acquired, total: {_debug_n_locks_acquired:>5}") + + +def dec_debug_n_locks_acquired(): + global _debug_n_locks_acquired + if DEBUG_LOCKS: + if _debug_n_locks_acquired > 0: + _debug_n_locks_acquired -= 1 + print(f"DEBUG: Keyed Lock released, total: {_debug_n_locks_acquired:>5}") + else: + raise RuntimeError("Attempting to release lock when no locks are acquired") + + +def get_debug_n_locks_acquired(): + global _debug_n_locks_acquired + return _debug_n_locks_acquired + + +class UnifiedLock(Generic[T]): + """Provide a unified lock interface type for asyncio.Lock and multiprocessing.Lock""" + + def __init__( + self, + lock: Union[ProcessLock, asyncio.Lock], + is_async: bool, + name: str = "unnamed", + enable_logging: bool = True, + async_lock: Optional[asyncio.Lock] = None, + ): + self._lock = lock + self._is_async = is_async + self._pid = os.getpid() # for debug only + self._name = name # for debug only + self._enable_logging = enable_logging # for debug only + self._async_lock = async_lock # auxiliary lock for coroutine synchronization + + async def __aenter__(self) -> "UnifiedLock[T]": + try: + # If in multiprocess mode and async lock exists, acquire it first + if not self._is_async and self._async_lock is not None: + await self._async_lock.acquire() + direct_log( + f"== Lock == Process {self._pid}: Acquired async lock '{self._name}", + level="DEBUG", + enable_output=self._enable_logging, + ) + + # Then acquire the main lock + if self._is_async: + await self._lock.acquire() + else: + self._lock.acquire() + + direct_log( + f"== Lock == Process {self._pid}: Acquired lock {self._name} (async={self._is_async})", + level="INFO", + enable_output=self._enable_logging, + ) + return self + except Exception as e: + # If main lock acquisition fails, release the async lock if it was acquired + if ( + not self._is_async + and self._async_lock is not None + and self._async_lock.locked() + ): + self._async_lock.release() + + direct_log( + f"== Lock == Process {self._pid}: Failed to acquire lock '{self._name}': {e}", + level="ERROR", + enable_output=True, + ) + raise + + async def __aexit__(self, exc_type, exc_val, exc_tb): + main_lock_released = False + try: + # Release main lock first + if self._is_async: + self._lock.release() + else: + self._lock.release() + main_lock_released = True + + direct_log( + f"== Lock == Process {self._pid}: Released lock {self._name} (async={self._is_async})", + level="INFO", + enable_output=self._enable_logging, + ) + + # Then release async lock if in multiprocess mode + if not self._is_async and self._async_lock is not None: + self._async_lock.release() + direct_log( + f"== Lock == Process {self._pid}: Released async lock {self._name}", + level="DEBUG", + enable_output=self._enable_logging, + ) + + except Exception as e: + direct_log( + f"== Lock == Process {self._pid}: Failed to release lock '{self._name}': {e}", + level="ERROR", + enable_output=True, + ) + + # If main lock release failed but async lock hasn't been released, try to release it + if ( + not main_lock_released + and not self._is_async + and self._async_lock is not None + ): + try: + direct_log( + f"== Lock == Process {self._pid}: Attempting to release async lock after main lock failure", + level="DEBUG", + enable_output=self._enable_logging, + ) + self._async_lock.release() + direct_log( + f"== Lock == Process {self._pid}: Successfully released async lock after main lock failure", + level="INFO", + enable_output=self._enable_logging, + ) + except Exception as inner_e: + direct_log( + f"== Lock == Process {self._pid}: Failed to release async lock after main lock failure: {inner_e}", + level="ERROR", + enable_output=True, + ) + + raise + + def __enter__(self) -> "UnifiedLock[T]": + """For backward compatibility""" + try: + if self._is_async: + raise RuntimeError("Use 'async with' for shared_storage lock") + direct_log( + f"== Lock == Process {self._pid}: Acquiring lock {self._name} (sync)", + level="DEBUG", + enable_output=self._enable_logging, + ) + self._lock.acquire() + direct_log( + f"== Lock == Process {self._pid}: Acquired lock {self._name} (sync)", + level="INFO", + enable_output=self._enable_logging, + ) + return self + except Exception as e: + direct_log( + f"== Lock == Process {self._pid}: Failed to acquire lock '{self._name}' (sync): {e}", + level="ERROR", + enable_output=True, + ) + raise + + def __exit__(self, exc_type, exc_val, exc_tb): + """For backward compatibility""" + try: + if self._is_async: + raise RuntimeError("Use 'async with' for shared_storage lock") + direct_log( + f"== Lock == Process {self._pid}: Releasing lock '{self._name}' (sync)", + level="DEBUG", + enable_output=self._enable_logging, + ) + self._lock.release() + direct_log( + f"== Lock == Process {self._pid}: Released lock {self._name} (sync)", + level="INFO", + enable_output=self._enable_logging, + ) + except Exception as e: + direct_log( + f"== Lock == Process {self._pid}: Failed to release lock '{self._name}' (sync): {e}", + level="ERROR", + enable_output=True, + ) + raise + + def locked(self) -> bool: + if self._is_async: + return self._lock.locked() + else: + return self._lock.locked() + + +def _get_combined_key(factory_name: str, key: str) -> str: + """Return the combined key for the factory and key.""" + return f"{factory_name}:{key}" + + +def _perform_lock_cleanup( + lock_type: str, + cleanup_data: Dict[str, float], + lock_registry: Optional[Dict[str, Any]], + lock_count: Optional[Dict[str, int]], + earliest_cleanup_time: Optional[float], + last_cleanup_time: Optional[float], + current_time: float, + threshold_check: bool = True, +) -> tuple[int, Optional[float], Optional[float]]: + """ + Generic lock cleanup function to unify cleanup logic for both multiprocess and async locks. + + Args: + lock_type: Lock type identifier ("mp" or "async") + cleanup_data: Cleanup data dictionary + lock_registry: Lock registry dictionary (can be None for async locks) + lock_count: Lock count dictionary (can be None for async locks) + earliest_cleanup_time: Earliest cleanup time + last_cleanup_time: Last cleanup time + current_time: Current time + threshold_check: Whether to check threshold condition (default True, set to False in cleanup_expired_locks) + + Returns: + tuple: (cleaned_count, new_earliest_time, new_last_cleanup_time) + """ + if len(cleanup_data) == 0: + return 0, earliest_cleanup_time, last_cleanup_time + + # If threshold check is needed and threshold not reached, return directly + if threshold_check and len(cleanup_data) < CLEANUP_THRESHOLD: + return 0, earliest_cleanup_time, last_cleanup_time + + # Time rollback detection + if last_cleanup_time is not None and current_time < last_cleanup_time: + direct_log( + f"== {lock_type} Lock == Time rollback detected, resetting cleanup time", + level="WARNING", + enable_output=False, + ) + last_cleanup_time = None + + # Check cleanup conditions + has_expired_locks = ( + earliest_cleanup_time is not None + and current_time - earliest_cleanup_time > CLEANUP_KEYED_LOCKS_AFTER_SECONDS + ) + + interval_satisfied = ( + last_cleanup_time is None + or current_time - last_cleanup_time > MIN_CLEANUP_INTERVAL_SECONDS + ) + + if not (has_expired_locks and interval_satisfied): + return 0, earliest_cleanup_time, last_cleanup_time + + try: + cleaned_count = 0 + new_earliest_time = None + + # Calculate total count before cleanup + total_cleanup_len = len(cleanup_data) + + # Perform cleanup operation + for cleanup_key, cleanup_time in list(cleanup_data.items()): + if current_time - cleanup_time > CLEANUP_KEYED_LOCKS_AFTER_SECONDS: + # Remove from cleanup data + cleanup_data.pop(cleanup_key, None) + + # Remove from lock registry if exists + if lock_registry is not None: + lock_registry.pop(cleanup_key, None) + if lock_count is not None: + lock_count.pop(cleanup_key, None) + + cleaned_count += 1 + else: + # Track the earliest time among remaining locks + if new_earliest_time is None or cleanup_time < new_earliest_time: + new_earliest_time = cleanup_time + + # Update state only after successful cleanup + if cleaned_count > 0: + new_last_cleanup_time = current_time + + # Log cleanup results + next_cleanup_in = max( + (new_earliest_time + CLEANUP_KEYED_LOCKS_AFTER_SECONDS - current_time) + if new_earliest_time + else float("inf"), + MIN_CLEANUP_INTERVAL_SECONDS, + ) + + if lock_type == "async": + direct_log( + f"== {lock_type} Lock == Cleaned up {cleaned_count}/{total_cleanup_len} expired {lock_type} locks, " + f"next cleanup in {next_cleanup_in:.1f}s", + enable_output=False, + level="INFO", + ) + else: + direct_log( + f"== {lock_type} Lock == Cleaned up {cleaned_count}/{total_cleanup_len} expired locks, " + f"next cleanup in {next_cleanup_in:.1f}s", + enable_output=False, + level="INFO", + ) + + return cleaned_count, new_earliest_time, new_last_cleanup_time + else: + return 0, earliest_cleanup_time, last_cleanup_time + + except Exception as e: + direct_log( + f"== {lock_type} Lock == Cleanup failed: {e}", + level="ERROR", + enable_output=True, + ) + return 0, earliest_cleanup_time, last_cleanup_time + + +def _get_or_create_shared_raw_mp_lock( + factory_name: str, key: str +) -> Optional[mp.synchronize.Lock]: + """Return the *singleton* manager.Lock() proxy for keyed lock, creating if needed.""" + if not _is_multiprocess: + return None + + with _registry_guard: + combined_key = _get_combined_key(factory_name, key) + raw = _lock_registry.get(combined_key) + count = _lock_registry_count.get(combined_key) + if raw is None: + raw = _manager.Lock() + _lock_registry[combined_key] = raw + count = 0 + else: + if count is None: + raise RuntimeError( + f"Shared-Data lock registry for {factory_name} is corrupted for key {key}" + ) + if ( + count == 0 and combined_key in _lock_cleanup_data + ): # Reusing an key waiting for cleanup, remove it from cleanup list + _lock_cleanup_data.pop(combined_key) + count += 1 + _lock_registry_count[combined_key] = count + return raw + + +def _release_shared_raw_mp_lock(factory_name: str, key: str): + """Release the *singleton* manager.Lock() proxy for *key*.""" + if not _is_multiprocess: + return + + global _earliest_mp_cleanup_time, _last_mp_cleanup_time + + with _registry_guard: + combined_key = _get_combined_key(factory_name, key) + raw = _lock_registry.get(combined_key) + count = _lock_registry_count.get(combined_key) + if raw is None and count is None: + return + elif raw is None or count is None: + raise RuntimeError( + f"Shared-Data lock registry for {factory_name} is corrupted for key {key}" + ) + + count -= 1 + if count < 0: + raise RuntimeError( + f"Attempting to release lock for {key} more times than it was acquired" + ) + + _lock_registry_count[combined_key] = count + + current_time = time.time() + if count == 0: + _lock_cleanup_data[combined_key] = current_time + + # Update earliest multiprocess cleanup time (only when earlier) + if ( + _earliest_mp_cleanup_time is None + or current_time < _earliest_mp_cleanup_time + ): + _earliest_mp_cleanup_time = current_time + + # Use generic cleanup function + cleaned_count, new_earliest_time, new_last_cleanup_time = _perform_lock_cleanup( + lock_type="mp", + cleanup_data=_lock_cleanup_data, + lock_registry=_lock_registry, + lock_count=_lock_registry_count, + earliest_cleanup_time=_earliest_mp_cleanup_time, + last_cleanup_time=_last_mp_cleanup_time, + current_time=current_time, + threshold_check=True, + ) + + # Update global state if cleanup was performed + if cleaned_count > 0: + _earliest_mp_cleanup_time = new_earliest_time + _last_mp_cleanup_time = new_last_cleanup_time + + +class KeyedUnifiedLock: + """ + Manager for unified keyed locks, supporting both single and multi-process + + • Keeps only a table of async keyed locks locally + • Fetches the multi-process keyed lock on every acquire + • Builds a fresh `UnifiedLock` each time, so `enable_logging` + (or future options) can vary per call. + • Supports dynamic namespaces specified at lock usage time + """ + + def __init__(self, *, default_enable_logging: bool = True) -> None: + self._default_enable_logging = default_enable_logging + self._async_lock: Dict[str, asyncio.Lock] = {} # local keyed locks + self._async_lock_count: Dict[ + str, int + ] = {} # local keyed locks referenced count + self._async_lock_cleanup_data: Dict[ + str, time.time + ] = {} # local keyed locks timeout + self._mp_locks: Dict[ + str, mp.synchronize.Lock + ] = {} # multi-process lock proxies + self._earliest_async_cleanup_time: Optional[float] = ( + None # track earliest async cleanup time + ) + self._last_async_cleanup_time: Optional[float] = ( + None # track last async cleanup time for minimum interval + ) + + def __call__( + self, namespace: str, keys: list[str], *, enable_logging: Optional[bool] = None + ): + """ + Ergonomic helper so you can write: + + async with storage_keyed_lock("namespace", ["key1", "key2"]): + ... + """ + if enable_logging is None: + enable_logging = self._default_enable_logging + return _KeyedLockContext( + self, + namespace=namespace, + keys=keys, + enable_logging=enable_logging, + ) + + def _get_or_create_async_lock(self, combined_key: str) -> asyncio.Lock: + async_lock = self._async_lock.get(combined_key) + count = self._async_lock_count.get(combined_key, 0) + if async_lock is None: + async_lock = asyncio.Lock() + self._async_lock[combined_key] = async_lock + elif count == 0 and combined_key in self._async_lock_cleanup_data: + self._async_lock_cleanup_data.pop(combined_key) + count += 1 + self._async_lock_count[combined_key] = count + return async_lock + + def _release_async_lock(self, combined_key: str): + count = self._async_lock_count.get(combined_key, 0) + count -= 1 + + current_time = time.time() + if count == 0: + self._async_lock_cleanup_data[combined_key] = current_time + + # Update earliest async cleanup time (only when earlier) + if ( + self._earliest_async_cleanup_time is None + or current_time < self._earliest_async_cleanup_time + ): + self._earliest_async_cleanup_time = current_time + self._async_lock_count[combined_key] = count + + # Use generic cleanup function + cleaned_count, new_earliest_time, new_last_cleanup_time = _perform_lock_cleanup( + lock_type="async", + cleanup_data=self._async_lock_cleanup_data, + lock_registry=self._async_lock, + lock_count=self._async_lock_count, + earliest_cleanup_time=self._earliest_async_cleanup_time, + last_cleanup_time=self._last_async_cleanup_time, + current_time=current_time, + threshold_check=True, + ) + + # Update instance state if cleanup was performed + if cleaned_count > 0: + self._earliest_async_cleanup_time = new_earliest_time + self._last_async_cleanup_time = new_last_cleanup_time + + def _get_lock_for_key( + self, namespace: str, key: str, enable_logging: bool = False + ) -> UnifiedLock: + # 1. Create combined key for this namespace:key combination + combined_key = _get_combined_key(namespace, key) + + # 2. get (or create) the per‑process async gate for this combined key + # Is synchronous, so no need to acquire a lock + async_lock = self._get_or_create_async_lock(combined_key) + + # 3. fetch the shared raw lock + raw_lock = _get_or_create_shared_raw_mp_lock(namespace, key) + is_multiprocess = raw_lock is not None + if not is_multiprocess: + raw_lock = async_lock + + # 4. build a *fresh* UnifiedLock with the chosen logging flag + if is_multiprocess: + return UnifiedLock( + lock=raw_lock, + is_async=False, # manager.Lock is synchronous + name=combined_key, + enable_logging=enable_logging, + async_lock=async_lock, # prevents event‑loop blocking + ) + else: + return UnifiedLock( + lock=raw_lock, + is_async=True, + name=combined_key, + enable_logging=enable_logging, + async_lock=None, # No need for async lock in single process mode + ) + + def _release_lock_for_key(self, namespace: str, key: str): + combined_key = _get_combined_key(namespace, key) + self._release_async_lock(combined_key) + _release_shared_raw_mp_lock(namespace, key) + + def cleanup_expired_locks(self) -> Dict[str, Any]: + """ + Cleanup expired locks for both async and multiprocess locks following the same + conditions as _release_shared_raw_mp_lock and _release_async_lock functions. + + Only performs cleanup when both has_expired_locks and interval_satisfied conditions are met + to avoid too frequent cleanup operations. + + Since async and multiprocess locks work together, this method cleans up + both types of expired locks and returns comprehensive statistics. + + Returns: + Dict containing cleanup statistics and current status: + { + "process_id": 12345, + "cleanup_performed": { + "mp_cleaned": 5, + "async_cleaned": 3 + }, + "current_status": { + "total_mp_locks": 10, + "pending_mp_cleanup": 2, + "total_async_locks": 8, + "pending_async_cleanup": 1 + } + } + """ + global _lock_registry, _lock_registry_count, _lock_cleanup_data + global _registry_guard, _earliest_mp_cleanup_time, _last_mp_cleanup_time + + cleanup_stats = {"mp_cleaned": 0, "async_cleaned": 0} + + current_time = time.time() + + # 1. Cleanup multiprocess locks using generic function + if ( + _is_multiprocess + and _lock_registry is not None + and _registry_guard is not None + ): + try: + with _registry_guard: + if _lock_cleanup_data is not None: + # Use generic cleanup function without threshold check + cleaned_count, new_earliest_time, new_last_cleanup_time = ( + _perform_lock_cleanup( + lock_type="mp", + cleanup_data=_lock_cleanup_data, + lock_registry=_lock_registry, + lock_count=_lock_registry_count, + earliest_cleanup_time=_earliest_mp_cleanup_time, + last_cleanup_time=_last_mp_cleanup_time, + current_time=current_time, + threshold_check=False, # Force cleanup in cleanup_expired_locks + ) + ) + + # Update global state if cleanup was performed + if cleaned_count > 0: + _earliest_mp_cleanup_time = new_earliest_time + _last_mp_cleanup_time = new_last_cleanup_time + cleanup_stats["mp_cleaned"] = cleaned_count + + except Exception as e: + direct_log( + f"Error during multiprocess lock cleanup: {e}", + level="ERROR", + enable_output=True, + ) + + # 2. Cleanup async locks using generic function + try: + # Use generic cleanup function without threshold check + cleaned_count, new_earliest_time, new_last_cleanup_time = ( + _perform_lock_cleanup( + lock_type="async", + cleanup_data=self._async_lock_cleanup_data, + lock_registry=self._async_lock, + lock_count=self._async_lock_count, + earliest_cleanup_time=self._earliest_async_cleanup_time, + last_cleanup_time=self._last_async_cleanup_time, + current_time=current_time, + threshold_check=False, # Force cleanup in cleanup_expired_locks + ) + ) + + # Update instance state if cleanup was performed + if cleaned_count > 0: + self._earliest_async_cleanup_time = new_earliest_time + self._last_async_cleanup_time = new_last_cleanup_time + cleanup_stats["async_cleaned"] = cleaned_count + + except Exception as e: + direct_log( + f"Error during async lock cleanup: {e}", + level="ERROR", + enable_output=True, + ) + + # 3. Get current status after cleanup + current_status = self.get_lock_status() + + return { + "process_id": os.getpid(), + "cleanup_performed": cleanup_stats, + "current_status": current_status, + } + + def get_lock_status(self) -> Dict[str, int]: + """ + Get current status of both async and multiprocess locks. + + Returns comprehensive lock counts for both types of locks since + they work together in the keyed lock system. + + Returns: + Dict containing lock counts: + { + "total_mp_locks": 10, + "pending_mp_cleanup": 2, + "total_async_locks": 8, + "pending_async_cleanup": 1 + } + """ + global _lock_registry_count, _lock_cleanup_data, _registry_guard + + status = { + "total_mp_locks": 0, + "pending_mp_cleanup": 0, + "total_async_locks": 0, + "pending_async_cleanup": 0, + } + + try: + # Count multiprocess locks + if _is_multiprocess and _lock_registry_count is not None: + if _registry_guard is not None: + with _registry_guard: + status["total_mp_locks"] = len(_lock_registry_count) + if _lock_cleanup_data is not None: + status["pending_mp_cleanup"] = len(_lock_cleanup_data) + + # Count async locks + status["total_async_locks"] = len(self._async_lock_count) + status["pending_async_cleanup"] = len(self._async_lock_cleanup_data) + + except Exception as e: + direct_log( + f"Error getting keyed lock status: {e}", + level="ERROR", + enable_output=True, + ) + + return status + + +class _KeyedLockContext: + def __init__( + self, + parent: KeyedUnifiedLock, + namespace: str, + keys: list[str], + enable_logging: bool, + ) -> None: + self._parent = parent + self._namespace = namespace + + # The sorting is critical to ensure proper lock and release order + # to avoid deadlocks + self._keys = sorted(keys) + self._enable_logging = ( + enable_logging + if enable_logging is not None + else parent._default_enable_logging + ) + self._ul: Optional[List[Dict[str, Any]]] = None # set in __aenter__ + + # ----- enter ----- + async def __aenter__(self): + if self._ul is not None: + raise RuntimeError("KeyedUnifiedLock already acquired in current context") + + self._ul = [] + + try: + # Acquire locks for all keys in the namespace + for key in self._keys: + lock = None + entry = None + + try: + # 1. Get lock object (reference count is incremented here) + lock = self._parent._get_lock_for_key( + self._namespace, key, enable_logging=self._enable_logging + ) + + # 2. Immediately create and add entry to list (critical for rollback to work) + entry = { + "key": key, + "lock": lock, + "entered": False, + "debug_inc": False, + "ref_incremented": True, # Mark that reference count has been incremented + } + self._ul.append( + entry + ) # Add immediately after _get_lock_for_key for rollback to work + + # 3. Try to acquire the lock + # Use try-finally to ensure state is updated atomically + lock_acquired = False + try: + await lock.__aenter__() + lock_acquired = True # Lock successfully acquired + finally: + if lock_acquired: + entry["entered"] = True + inc_debug_n_locks_acquired() + entry["debug_inc"] = True + + except asyncio.CancelledError: + # Lock acquisition was cancelled + # The finally block above ensures entry["entered"] is correct + direct_log( + f"Lock acquisition cancelled for key {key}", + level="WARNING", + enable_output=self._enable_logging, + ) + raise + except Exception as e: + # Other exceptions, log and re-raise + direct_log( + f"Lock acquisition failed for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + raise + + return self + + except BaseException: + # Critical: if any exception occurs (including CancelledError) during lock acquisition, + # we must rollback all already acquired locks to prevent lock leaks + # Use shield to ensure rollback completes + await asyncio.shield(self._rollback_acquired_locks()) + raise + + async def _rollback_acquired_locks(self): + """Rollback all acquired locks in case of exception during __aenter__""" + if not self._ul: + return + + async def rollback_single_entry(entry): + """Rollback a single lock acquisition""" + key = entry["key"] + lock = entry["lock"] + debug_inc = entry["debug_inc"] + entered = entry["entered"] + ref_incremented = entry.get( + "ref_incremented", True + ) # Default to True for safety + + errors = [] + + # 1. If lock was acquired, release it + if entered: + try: + await lock.__aexit__(None, None, None) + except Exception as e: + errors.append(("lock_exit", e)) + direct_log( + f"Lock rollback error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + # 2. Release reference count (if it was incremented) + if ref_incremented: + try: + self._parent._release_lock_for_key(self._namespace, key) + except Exception as e: + errors.append(("ref_release", e)) + direct_log( + f"Lock rollback reference release error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + # 3. Decrement debug counter + if debug_inc: + try: + dec_debug_n_locks_acquired() + except Exception as e: + errors.append(("debug_dec", e)) + direct_log( + f"Lock rollback counter decrementing error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + return errors + + # Release already acquired locks in reverse order + for entry in reversed(self._ul): + # Use shield to protect each lock's rollback + try: + await asyncio.shield(rollback_single_entry(entry)) + except Exception as e: + # Log but continue rolling back other locks + direct_log( + f"Lock rollback unexpected error for {entry['key']}: {e}", + level="ERROR", + enable_output=True, + ) + + self._ul = None + + # ----- exit ----- + async def __aexit__(self, exc_type, exc, tb): + if self._ul is None: + return + + async def release_all_locks(): + """Release all locks with comprehensive error handling, protected from cancellation""" + + async def release_single_entry(entry, exc_type, exc, tb): + """Release a single lock with full protection""" + key = entry["key"] + lock = entry["lock"] + debug_inc = entry["debug_inc"] + entered = entry["entered"] + + errors = [] + + # 1. Release the lock + if entered: + try: + await lock.__aexit__(exc_type, exc, tb) + except Exception as e: + errors.append(("lock_exit", e)) + direct_log( + f"Lock release error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + # 2. Release reference count + try: + self._parent._release_lock_for_key(self._namespace, key) + except Exception as e: + errors.append(("ref_release", e)) + direct_log( + f"Lock release reference error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + # 3. Decrement debug counter + if debug_inc: + try: + dec_debug_n_locks_acquired() + except Exception as e: + errors.append(("debug_dec", e)) + direct_log( + f"Lock release counter decrementing error for key {key}: {e}", + level="ERROR", + enable_output=True, + ) + + return errors + + all_errors = [] + + # Release locks in reverse order + # This entire loop is protected by the outer shield + for entry in reversed(self._ul): + try: + errors = await release_single_entry(entry, exc_type, exc, tb) + for error_type, error in errors: + all_errors.append((entry["key"], error_type, error)) + except Exception as e: + all_errors.append((entry["key"], "unexpected", e)) + direct_log( + f"Lock release unexpected error for {entry['key']}: {e}", + level="ERROR", + enable_output=True, + ) + + return all_errors + + # CRITICAL: Protect the entire release process with shield + # This ensures that even if cancellation occurs, all locks are released + try: + all_errors = await asyncio.shield(release_all_locks()) + except Exception as e: + direct_log( + f"Critical error during __aexit__ cleanup: {e}", + level="ERROR", + enable_output=True, + ) + all_errors = [] + finally: + # Always clear the lock list, even if shield was cancelled + self._ul = None + + # If there were release errors and no other exception, raise the first release error + if all_errors and exc_type is None: + raise all_errors[0][2] # (key, error_type, error) + + +def get_internal_lock(enable_logging: bool = False) -> UnifiedLock: + """return unified storage lock for data consistency""" + async_lock = _async_locks.get("internal_lock") if _is_multiprocess else None + return UnifiedLock( + lock=_internal_lock, + is_async=not _is_multiprocess, + name="internal_lock", + enable_logging=enable_logging, + async_lock=async_lock, + ) + + +def get_storage_lock(enable_logging: bool = False) -> UnifiedLock: + """return unified storage lock for data consistency""" + async_lock = _async_locks.get("storage_lock") if _is_multiprocess else None + return UnifiedLock( + lock=_storage_lock, + is_async=not _is_multiprocess, + name="storage_lock", + enable_logging=enable_logging, + async_lock=async_lock, + ) + + +def get_pipeline_status_lock(enable_logging: bool = False) -> UnifiedLock: + """return unified storage lock for data consistency""" + async_lock = _async_locks.get("pipeline_status_lock") if _is_multiprocess else None + return UnifiedLock( + lock=_pipeline_status_lock, + is_async=not _is_multiprocess, + name="pipeline_status_lock", + enable_logging=enable_logging, + async_lock=async_lock, + ) + + +def get_graph_db_lock(enable_logging: bool = False) -> UnifiedLock: + """return unified graph database lock for ensuring atomic operations""" + async_lock = _async_locks.get("graph_db_lock") if _is_multiprocess else None + return UnifiedLock( + lock=_graph_db_lock, + is_async=not _is_multiprocess, + name="graph_db_lock", + enable_logging=enable_logging, + async_lock=async_lock, + ) + + +def get_storage_keyed_lock( + keys: str | list[str], namespace: str = "default", enable_logging: bool = False +) -> _KeyedLockContext: + """Return unified storage keyed lock for ensuring atomic operations across different namespaces""" + global _storage_keyed_lock + if _storage_keyed_lock is None: + raise RuntimeError("Shared-Data is not initialized") + if isinstance(keys, str): + keys = [keys] + return _storage_keyed_lock(namespace, keys, enable_logging=enable_logging) + + +def get_data_init_lock(enable_logging: bool = False) -> UnifiedLock: + """return unified data initialization lock for ensuring atomic data initialization""" + async_lock = _async_locks.get("data_init_lock") if _is_multiprocess else None + return UnifiedLock( + lock=_data_init_lock, + is_async=not _is_multiprocess, + name="data_init_lock", + enable_logging=enable_logging, + async_lock=async_lock, + ) + + +def cleanup_keyed_lock() -> Dict[str, Any]: + """ + Force cleanup of expired keyed locks and return comprehensive status information. + + This function actively cleans up expired locks for both async and multiprocess locks, + then returns detailed statistics about the cleanup operation and current lock status. + + Returns: + Same as cleanup_expired_locks in KeyedUnifiedLock + """ + global _storage_keyed_lock + + # Check if shared storage is initialized + if not _initialized or _storage_keyed_lock is None: + return { + "process_id": os.getpid(), + "cleanup_performed": {"mp_cleaned": 0, "async_cleaned": 0}, + "current_status": { + "total_mp_locks": 0, + "pending_mp_cleanup": 0, + "total_async_locks": 0, + "pending_async_cleanup": 0, + }, + } + + return _storage_keyed_lock.cleanup_expired_locks() + + +def get_keyed_lock_status() -> Dict[str, Any]: + """ + Get current status of keyed locks without performing cleanup. + + This function provides a read-only view of the current lock counts + for both multiprocess and async locks, including pending cleanup counts. + + Returns: + Same as get_lock_status in KeyedUnifiedLock + """ + global _storage_keyed_lock + + # Check if shared storage is initialized + if not _initialized or _storage_keyed_lock is None: + return { + "process_id": os.getpid(), + "total_mp_locks": 0, + "pending_mp_cleanup": 0, + "total_async_locks": 0, + "pending_async_cleanup": 0, + } + + status = _storage_keyed_lock.get_lock_status() + status["process_id"] = os.getpid() + return status + + +def initialize_share_data(workers: int = 1): + """ + Initialize shared storage data for single or multi-process mode. + + When used with Gunicorn's preload feature, this function is called once in the + master process before forking worker processes, allowing all workers to share + the same initialized data. + + In single-process mode, this function is called in FASTAPI lifespan function. + + The function determines whether to use cross-process shared variables for data storage + based on the number of workers. If workers=1, it uses thread locks and local dictionaries. + If workers>1, it uses process locks and shared dictionaries managed by multiprocessing.Manager. + + Args: + workers (int): Number of worker processes. If 1, single-process mode is used. + If > 1, multi-process mode with shared memory is used. + """ + global \ + _manager, \ + _workers, \ + _is_multiprocess, \ + _storage_lock, \ + _lock_registry, \ + _lock_registry_count, \ + _lock_cleanup_data, \ + _registry_guard, \ + _internal_lock, \ + _pipeline_status_lock, \ + _graph_db_lock, \ + _data_init_lock, \ + _shared_dicts, \ + _init_flags, \ + _initialized, \ + _update_flags, \ + _async_locks, \ + _storage_keyed_lock, \ + _earliest_mp_cleanup_time, \ + _last_mp_cleanup_time + + # Check if already initialized + if _initialized: + direct_log( + f"Process {os.getpid()} Shared-Data already initialized (multiprocess={_is_multiprocess})" + ) + return + + _workers = workers + + if workers > 1: + _is_multiprocess = True + _manager = Manager() + _lock_registry = _manager.dict() + _lock_registry_count = _manager.dict() + _lock_cleanup_data = _manager.dict() + _registry_guard = _manager.RLock() + _internal_lock = _manager.Lock() + _storage_lock = _manager.Lock() + _pipeline_status_lock = _manager.Lock() + _graph_db_lock = _manager.Lock() + _data_init_lock = _manager.Lock() + _shared_dicts = _manager.dict() + _init_flags = _manager.dict() + _update_flags = _manager.dict() + + _storage_keyed_lock = KeyedUnifiedLock() + + # Initialize async locks for multiprocess mode + _async_locks = { + "internal_lock": asyncio.Lock(), + "storage_lock": asyncio.Lock(), + "pipeline_status_lock": asyncio.Lock(), + "graph_db_lock": asyncio.Lock(), + "data_init_lock": asyncio.Lock(), + } + + direct_log( + f"Process {os.getpid()} Shared-Data created for Multiple Process (workers={workers})" + ) + else: + _is_multiprocess = False + _internal_lock = asyncio.Lock() + _storage_lock = asyncio.Lock() + _pipeline_status_lock = asyncio.Lock() + _graph_db_lock = asyncio.Lock() + _data_init_lock = asyncio.Lock() + _shared_dicts = {} + _init_flags = {} + _update_flags = {} + _async_locks = None # No need for async locks in single process mode + + _storage_keyed_lock = KeyedUnifiedLock() + direct_log(f"Process {os.getpid()} Shared-Data created for Single Process") + + # Initialize multiprocess cleanup times + _earliest_mp_cleanup_time = None + _last_mp_cleanup_time = None + + # Mark as initialized + _initialized = True + + +async def initialize_pipeline_status(): + """ + Initialize pipeline namespace with default values. + This function is called during FASTAPI lifespan for each worker. + """ + pipeline_namespace = await get_namespace_data("pipeline_status", first_init=True) + + async with get_internal_lock(): + # Check if already initialized by checking for required fields + if "busy" in pipeline_namespace: + return + + # Create a shared list object for history_messages + history_messages = _manager.list() if _is_multiprocess else [] + pipeline_namespace.update( + { + "autoscanned": False, # Auto-scan started + "busy": False, # Control concurrent processes + "job_name": "-", # Current job name (indexing files/indexing texts) + "job_start": None, # Job start time + "docs": 0, # Total number of documents to be indexed + "batchs": 0, # Number of batches for processing documents + "cur_batch": 0, # Current processing batch + "request_pending": False, # Flag for pending request for processing + "latest_message": "", # Latest message from pipeline processing + "history_messages": history_messages, # 使用共享列表对象 + } + ) + direct_log(f"Process {os.getpid()} Pipeline namespace initialized") + + +async def get_update_flag(namespace: str): + """ + Create a namespace's update flag for a workers. + Returen the update flag to caller for referencing or reset. + """ + global _update_flags + if _update_flags is None: + raise ValueError("Try to create namespace before Shared-Data is initialized") + + async with get_internal_lock(): + if namespace not in _update_flags: + if _is_multiprocess and _manager is not None: + _update_flags[namespace] = _manager.list() + else: + _update_flags[namespace] = [] + direct_log( + f"Process {os.getpid()} initialized updated flags for namespace: [{namespace}]" + ) + + if _is_multiprocess and _manager is not None: + new_update_flag = _manager.Value("b", False) + else: + # Create a simple mutable object to store boolean value for compatibility with mutiprocess + class MutableBoolean: + def __init__(self, initial_value=False): + self.value = initial_value + + new_update_flag = MutableBoolean(False) + + _update_flags[namespace].append(new_update_flag) + return new_update_flag + + +async def set_all_update_flags(namespace: str): + """Set all update flag of namespace indicating all workers need to reload data from files""" + global _update_flags + if _update_flags is None: + raise ValueError("Try to create namespace before Shared-Data is initialized") + + async with get_internal_lock(): + if namespace not in _update_flags: + raise ValueError(f"Namespace {namespace} not found in update flags") + # Update flags for both modes + for i in range(len(_update_flags[namespace])): + _update_flags[namespace][i].value = True + + +async def clear_all_update_flags(namespace: str): + """Clear all update flag of namespace indicating all workers need to reload data from files""" + global _update_flags + if _update_flags is None: + raise ValueError("Try to create namespace before Shared-Data is initialized") + + async with get_internal_lock(): + if namespace not in _update_flags: + raise ValueError(f"Namespace {namespace} not found in update flags") + # Update flags for both modes + for i in range(len(_update_flags[namespace])): + _update_flags[namespace][i].value = False + + +async def get_all_update_flags_status() -> Dict[str, list]: + """ + Get update flags status for all namespaces. + + Returns: + Dict[str, list]: A dictionary mapping namespace names to lists of update flag statuses + """ + if _update_flags is None: + return {} + + result = {} + async with get_internal_lock(): + for namespace, flags in _update_flags.items(): + worker_statuses = [] + for flag in flags: + if _is_multiprocess: + worker_statuses.append(flag.value) + else: + worker_statuses.append(flag) + result[namespace] = worker_statuses + + return result + + +async def try_initialize_namespace(namespace: str) -> bool: + """ + Returns True if the current worker(process) gets initialization permission for loading data later. + The worker does not get the permission is prohibited to load data from files. + """ + global _init_flags, _manager + + if _init_flags is None: + raise ValueError("Try to create nanmespace before Shared-Data is initialized") + + async with get_internal_lock(): + if namespace not in _init_flags: + _init_flags[namespace] = True + direct_log( + f"Process {os.getpid()} ready to initialize storage namespace: [{namespace}]" + ) + return True + direct_log( + f"Process {os.getpid()} storage namespace already initialized: [{namespace}]" + ) + + return False + + +async def get_namespace_data( + namespace: str, first_init: bool = False +) -> Dict[str, Any]: + """get the shared data reference for specific namespace + + Args: + namespace: The namespace to retrieve + allow_create: If True, allows creation of the namespace if it doesn't exist. + Used internally by initialize_pipeline_status(). + """ + if _shared_dicts is None: + direct_log( + f"Error: try to getnanmespace before it is initialized, pid={os.getpid()}", + level="ERROR", + ) + raise ValueError("Shared dictionaries not initialized") + + async with get_internal_lock(): + if namespace not in _shared_dicts: + # Special handling for pipeline_status namespace + if namespace == "pipeline_status" and not first_init: + # Check if pipeline_status should have been initialized but wasn't + # This helps users understand they need to call initialize_pipeline_status() + raise PipelineNotInitializedError(namespace) + + # For other namespaces or when allow_create=True, create them dynamically + if _is_multiprocess and _manager is not None: + _shared_dicts[namespace] = _manager.dict() + else: + _shared_dicts[namespace] = {} + + return _shared_dicts[namespace] + + +def finalize_share_data(): + """ + Release shared resources and clean up. + + This function should be called when the application is shutting down + to properly release shared resources and avoid memory leaks. + + In multi-process mode, it shuts down the Manager and releases all shared objects. + In single-process mode, it simply resets the global variables. + """ + global \ + _manager, \ + _is_multiprocess, \ + _storage_lock, \ + _internal_lock, \ + _pipeline_status_lock, \ + _graph_db_lock, \ + _data_init_lock, \ + _shared_dicts, \ + _init_flags, \ + _initialized, \ + _update_flags, \ + _async_locks + + # Check if already initialized + if not _initialized: + direct_log( + f"Process {os.getpid()} storage data not initialized, nothing to finalize" + ) + return + + direct_log( + f"Process {os.getpid()} finalizing storage data (multiprocess={_is_multiprocess})" + ) + + # In multi-process mode, shut down the Manager + if _is_multiprocess and _manager is not None: + try: + # Clear shared resources before shutting down Manager + if _shared_dicts is not None: + # Clear pipeline status history messages first if exists + try: + pipeline_status = _shared_dicts.get("pipeline_status", {}) + if "history_messages" in pipeline_status: + pipeline_status["history_messages"].clear() + except Exception: + pass # Ignore any errors during history messages cleanup + _shared_dicts.clear() + if _init_flags is not None: + _init_flags.clear() + if _update_flags is not None: + # Clear each namespace's update flags list and Value objects + try: + for namespace in _update_flags: + flags_list = _update_flags[namespace] + if isinstance(flags_list, list): + # Clear Value objects in the list + for flag in flags_list: + if hasattr( + flag, "value" + ): # Check if it's a Value object + flag.value = False + flags_list.clear() + except Exception: + pass # Ignore any errors during update flags cleanup + _update_flags.clear() + + # Shut down the Manager - this will automatically clean up all shared resources + _manager.shutdown() + direct_log(f"Process {os.getpid()} Manager shutdown complete") + except Exception as e: + direct_log( + f"Process {os.getpid()} Error shutting down Manager: {e}", level="ERROR" + ) + + # Reset global variables + _manager = None + _initialized = None + _is_multiprocess = None + _shared_dicts = None + _init_flags = None + _storage_lock = None + _internal_lock = None + _pipeline_status_lock = None + _graph_db_lock = None + _data_init_lock = None + _update_flags = None + _async_locks = None + + direct_log(f"Process {os.getpid()} storage data finalization complete") diff --git a/LightRAG/lightrag/lightrag.py b/LightRAG/lightrag/lightrag.py new file mode 100644 index 00000000..c53c98ac --- /dev/null +++ b/LightRAG/lightrag/lightrag.py @@ -0,0 +1,3931 @@ +from __future__ import annotations + +import traceback +import asyncio +import configparser +import inspect +import os +import time +import warnings +from dataclasses import asdict, dataclass, field +from datetime import datetime, timezone +from functools import partial +from typing import ( + Any, + AsyncIterator, + Awaitable, + Callable, + Iterator, + cast, + final, + Literal, + Optional, + List, + Dict, + Union, +) +from lightrag.prompt import PROMPTS +from lightrag.exceptions import PipelineCancelledException +from lightrag.constants import ( + DEFAULT_MAX_GLEANING, + DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, + DEFAULT_TOP_K, + DEFAULT_CHUNK_TOP_K, + DEFAULT_MAX_ENTITY_TOKENS, + DEFAULT_MAX_RELATION_TOKENS, + DEFAULT_MAX_TOTAL_TOKENS, + DEFAULT_COSINE_THRESHOLD, + DEFAULT_RELATED_CHUNK_NUMBER, + DEFAULT_KG_CHUNK_PICK_METHOD, + DEFAULT_MIN_RERANK_SCORE, + DEFAULT_SUMMARY_MAX_TOKENS, + DEFAULT_SUMMARY_CONTEXT_SIZE, + DEFAULT_SUMMARY_LENGTH_RECOMMENDED, + DEFAULT_MAX_ASYNC, + DEFAULT_MAX_PARALLEL_INSERT, + DEFAULT_MAX_GRAPH_NODES, + DEFAULT_MAX_SOURCE_IDS_PER_ENTITY, + DEFAULT_MAX_SOURCE_IDS_PER_RELATION, + DEFAULT_ENTITY_TYPES, + DEFAULT_SUMMARY_LANGUAGE, + DEFAULT_LLM_TIMEOUT, + DEFAULT_EMBEDDING_TIMEOUT, + DEFAULT_SOURCE_IDS_LIMIT_METHOD, + DEFAULT_MAX_FILE_PATHS, + DEFAULT_FILE_PATH_MORE_PLACEHOLDER, +) +from lightrag.utils import get_env_value + +from lightrag.kg import ( + STORAGES, + verify_storage_implementation, +) + + +from lightrag.kg.shared_storage import ( + get_namespace_data, + get_pipeline_status_lock, + get_graph_db_lock, + get_data_init_lock, +) + +from lightrag.base import ( + BaseGraphStorage, + BaseKVStorage, + BaseVectorStorage, + DocProcessingStatus, + DocStatus, + DocStatusStorage, + QueryParam, + StorageNameSpace, + StoragesStatus, + DeletionResult, + OllamaServerInfos, + QueryResult, +) +from lightrag.namespace import NameSpace +from lightrag.operate import ( + chunking_by_token_size, + extract_entities, + merge_nodes_and_edges, + kg_query, + naive_query, + rebuild_knowledge_from_chunks, +) +from lightrag.constants import GRAPH_FIELD_SEP +from lightrag.utils import ( + Tokenizer, + TiktokenTokenizer, + EmbeddingFunc, + always_get_an_event_loop, + compute_mdhash_id, + lazy_external_import, + priority_limit_async_func_call, + get_content_summary, + sanitize_text_for_encoding, + check_storage_env_vars, + generate_track_id, + convert_to_user_format, + logger, + subtract_source_ids, + make_relation_chunk_key, + normalize_source_ids_limit_method, +) +from lightrag.types import KnowledgeGraph +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +# TODO: TO REMOVE @Yannick +config = configparser.ConfigParser() +config.read("config.ini", "utf-8") + + +@final +@dataclass +class LightRAG: + """LightRAG: Simple and Fast Retrieval-Augmented Generation.""" + + # Directory + # --- + + working_dir: str = field(default="./rag_storage") + """Directory where cache and temporary files are stored.""" + + # Storage + # --- + + kv_storage: str = field(default="JsonKVStorage") + """Storage backend for key-value data.""" + + vector_storage: str = field(default="NanoVectorDBStorage") + """Storage backend for vector embeddings.""" + + graph_storage: str = field(default="NetworkXStorage") + """Storage backend for knowledge graphs.""" + + doc_status_storage: str = field(default="JsonDocStatusStorage") + """Storage type for tracking document processing statuses.""" + + # Workspace + # --- + + workspace: str = field(default_factory=lambda: os.getenv("WORKSPACE", "")) + """Workspace for data isolation. Defaults to empty string if WORKSPACE environment variable is not set.""" + + # Logging (Deprecated, use setup_logger in utils.py instead) + # --- + log_level: int | None = field(default=None) + log_file_path: str | None = field(default=None) + + # Query parameters + # --- + + top_k: int = field(default=get_env_value("TOP_K", DEFAULT_TOP_K, int)) + """Number of entities/relations to retrieve for each query.""" + + chunk_top_k: int = field( + default=get_env_value("CHUNK_TOP_K", DEFAULT_CHUNK_TOP_K, int) + ) + """Maximum number of chunks in context.""" + + max_entity_tokens: int = field( + default=get_env_value("MAX_ENTITY_TOKENS", DEFAULT_MAX_ENTITY_TOKENS, int) + ) + """Maximum number of tokens for entity in context.""" + + max_relation_tokens: int = field( + default=get_env_value("MAX_RELATION_TOKENS", DEFAULT_MAX_RELATION_TOKENS, int) + ) + """Maximum number of tokens for relation in context.""" + + max_total_tokens: int = field( + default=get_env_value("MAX_TOTAL_TOKENS", DEFAULT_MAX_TOTAL_TOKENS, int) + ) + """Maximum total tokens in context (including system prompt, entities, relations and chunks).""" + + cosine_threshold: int = field( + default=get_env_value("COSINE_THRESHOLD", DEFAULT_COSINE_THRESHOLD, int) + ) + """Cosine threshold of vector DB retrieval for entities, relations and chunks.""" + + related_chunk_number: int = field( + default=get_env_value("RELATED_CHUNK_NUMBER", DEFAULT_RELATED_CHUNK_NUMBER, int) + ) + """Number of related chunks to grab from single entity or relation.""" + + kg_chunk_pick_method: str = field( + default=get_env_value("KG_CHUNK_PICK_METHOD", DEFAULT_KG_CHUNK_PICK_METHOD, str) + ) + """Method for selecting text chunks: 'WEIGHT' for weight-based selection, 'VECTOR' for embedding similarity-based selection.""" + + # Entity extraction + # --- + + entity_extract_max_gleaning: int = field( + default=get_env_value("MAX_GLEANING", DEFAULT_MAX_GLEANING, int) + ) + """Maximum number of entity extraction attempts for ambiguous content.""" + + force_llm_summary_on_merge: int = field( + default=get_env_value( + "FORCE_LLM_SUMMARY_ON_MERGE", DEFAULT_FORCE_LLM_SUMMARY_ON_MERGE, int + ) + ) + + # Text chunking + # --- + + chunk_token_size: int = field(default=int(os.getenv("CHUNK_SIZE", 1200))) + """Maximum number of tokens per text chunk when splitting documents.""" + + chunk_overlap_token_size: int = field( + default=int(os.getenv("CHUNK_OVERLAP_SIZE", 100)) + ) + """Number of overlapping tokens between consecutive text chunks to preserve context.""" + + tokenizer: Optional[Tokenizer] = field(default=None) + """ + A function that returns a Tokenizer instance. + If None, and a `tiktoken_model_name` is provided, a TiktokenTokenizer will be created. + If both are None, the default TiktokenTokenizer is used. + """ + + tiktoken_model_name: str = field(default="gpt-4o-mini") + """Model name used for tokenization when chunking text with tiktoken. Defaults to `gpt-4o-mini`.""" + + chunking_func: Callable[ + [ + Tokenizer, + str, + Optional[str], + bool, + int, + int, + ], + Union[List[Dict[str, Any]], Awaitable[List[Dict[str, Any]]]], + ] = field(default_factory=lambda: chunking_by_token_size) + """ + Custom chunking function for splitting text into chunks before processing. + + The function can be either synchronous or asynchronous. + + The function should take the following parameters: + + - `tokenizer`: A Tokenizer instance to use for tokenization. + - `content`: The text to be split into chunks. + - `split_by_character`: The character to split the text on. If None, the text is split into chunks of `chunk_token_size` tokens. + - `split_by_character_only`: If True, the text is split only on the specified character. + - `chunk_token_size`: The maximum number of tokens per chunk. + - `chunk_overlap_token_size`: The number of overlapping tokens between consecutive chunks. + + The function should return a list of dictionaries (or an awaitable that resolves to a list), + where each dictionary contains the following keys: + - `tokens`: The number of tokens in the chunk. + - `content`: The text content of the chunk. + + Defaults to `chunking_by_token_size` if not specified. + """ + + # Embedding + # --- + + embedding_func: EmbeddingFunc | None = field(default=None) + """Function for computing text embeddings. Must be set before use.""" + + embedding_token_limit: int | None = field(default=None, init=False) + """Token limit for embedding model. Set automatically from embedding_func.max_token_size in __post_init__.""" + + embedding_batch_num: int = field(default=int(os.getenv("EMBEDDING_BATCH_NUM", 10))) + """Batch size for embedding computations.""" + + embedding_func_max_async: int = field( + default=int(os.getenv("EMBEDDING_FUNC_MAX_ASYNC", 8)) + ) + """Maximum number of concurrent embedding function calls.""" + + embedding_cache_config: dict[str, Any] = field( + default_factory=lambda: { + "enabled": False, + "similarity_threshold": 0.95, + "use_llm_check": False, + } + ) + """Configuration for embedding cache. + - enabled: If True, enables caching to avoid redundant computations. + - similarity_threshold: Minimum similarity score to use cached embeddings. + - use_llm_check: If True, validates cached embeddings using an LLM. + """ + + default_embedding_timeout: int = field( + default=int(os.getenv("EMBEDDING_TIMEOUT", DEFAULT_EMBEDDING_TIMEOUT)) + ) + + # LLM Configuration + # --- + + llm_model_func: Callable[..., object] | None = field(default=None) + """Function for interacting with the large language model (LLM). Must be set before use.""" + + llm_model_name: str = field(default="gpt-4o-mini") + """Name of the LLM model used for generating responses.""" + + summary_max_tokens: int = field( + default=int(os.getenv("SUMMARY_MAX_TOKENS", DEFAULT_SUMMARY_MAX_TOKENS)) + ) + """Maximum tokens allowed for entity/relation description.""" + + summary_context_size: int = field( + default=int(os.getenv("SUMMARY_CONTEXT_SIZE", DEFAULT_SUMMARY_CONTEXT_SIZE)) + ) + """Maximum number of tokens allowed per LLM response.""" + + summary_length_recommended: int = field( + default=int( + os.getenv("SUMMARY_LENGTH_RECOMMENDED", DEFAULT_SUMMARY_LENGTH_RECOMMENDED) + ) + ) + """Recommended length of LLM summary output.""" + + llm_model_max_async: int = field( + default=int(os.getenv("MAX_ASYNC", DEFAULT_MAX_ASYNC)) + ) + """Maximum number of concurrent LLM calls.""" + + llm_model_kwargs: dict[str, Any] = field(default_factory=dict) + """Additional keyword arguments passed to the LLM model function.""" + + default_llm_timeout: int = field( + default=int(os.getenv("LLM_TIMEOUT", DEFAULT_LLM_TIMEOUT)) + ) + + # Rerank Configuration + # --- + + rerank_model_func: Callable[..., object] | None = field(default=None) + """Function for reranking retrieved documents. All rerank configurations (model name, API keys, top_k, etc.) should be included in this function. Optional.""" + + min_rerank_score: float = field( + default=get_env_value("MIN_RERANK_SCORE", DEFAULT_MIN_RERANK_SCORE, float) + ) + """Minimum rerank score threshold for filtering chunks after reranking.""" + + # Storage + # --- + + vector_db_storage_cls_kwargs: dict[str, Any] = field(default_factory=dict) + """Additional parameters for vector database storage.""" + + enable_llm_cache: bool = field(default=True) + """Enables caching for LLM responses to avoid redundant computations.""" + + enable_llm_cache_for_entity_extract: bool = field(default=True) + """If True, enables caching for entity extraction steps to reduce LLM costs.""" + + # Extensions + # --- + + max_parallel_insert: int = field( + default=int(os.getenv("MAX_PARALLEL_INSERT", DEFAULT_MAX_PARALLEL_INSERT)) + ) + """Maximum number of parallel insert operations.""" + + max_graph_nodes: int = field( + default=get_env_value("MAX_GRAPH_NODES", DEFAULT_MAX_GRAPH_NODES, int) + ) + """Maximum number of graph nodes to return in knowledge graph queries.""" + + max_source_ids_per_entity: int = field( + default=get_env_value( + "MAX_SOURCE_IDS_PER_ENTITY", DEFAULT_MAX_SOURCE_IDS_PER_ENTITY, int + ) + ) + """Maximum number of source (chunk) ids in entity Grpah + VDB.""" + + max_source_ids_per_relation: int = field( + default=get_env_value( + "MAX_SOURCE_IDS_PER_RELATION", + DEFAULT_MAX_SOURCE_IDS_PER_RELATION, + int, + ) + ) + """Maximum number of source (chunk) ids in relation Graph + VDB.""" + + source_ids_limit_method: str = field( + default_factory=lambda: normalize_source_ids_limit_method( + get_env_value( + "SOURCE_IDS_LIMIT_METHOD", + DEFAULT_SOURCE_IDS_LIMIT_METHOD, + str, + ) + ) + ) + """Strategy for enforcing source_id limits: IGNORE_NEW or FIFO.""" + + max_file_paths: int = field( + default=get_env_value("MAX_FILE_PATHS", DEFAULT_MAX_FILE_PATHS, int) + ) + """Maximum number of file paths to store in entity/relation file_path field.""" + + file_path_more_placeholder: str = field(default=DEFAULT_FILE_PATH_MORE_PLACEHOLDER) + """Placeholder text when file paths exceed max_file_paths limit.""" + + addon_params: dict[str, Any] = field( + default_factory=lambda: { + "language": get_env_value( + "SUMMARY_LANGUAGE", DEFAULT_SUMMARY_LANGUAGE, str + ), + "entity_types": get_env_value("ENTITY_TYPES", DEFAULT_ENTITY_TYPES, list), + } + ) + + # Storages Management + # --- + + # TODO: Deprecated (LightRAG will never initialize storage automatically on creation,and finalize should be call before destroying) + auto_manage_storages_states: bool = field(default=False) + """If True, lightrag will automatically calls initialize_storages and finalize_storages at the appropriate times.""" + + cosine_better_than_threshold: float = field( + default=float(os.getenv("COSINE_THRESHOLD", 0.2)) + ) + + ollama_server_infos: Optional[OllamaServerInfos] = field(default=None) + """Configuration for Ollama server information.""" + + _storages_status: StoragesStatus = field(default=StoragesStatus.NOT_CREATED) + + def __post_init__(self): + from lightrag.kg.shared_storage import ( + initialize_share_data, + ) + + # Handle deprecated parameters + if self.log_level is not None: + warnings.warn( + "WARNING: log_level parameter is deprecated, use setup_logger in utils.py instead", + UserWarning, + stacklevel=2, + ) + if self.log_file_path is not None: + warnings.warn( + "WARNING: log_file_path parameter is deprecated, use setup_logger in utils.py instead", + UserWarning, + stacklevel=2, + ) + + # Remove these attributes to prevent their use + if hasattr(self, "log_level"): + delattr(self, "log_level") + if hasattr(self, "log_file_path"): + delattr(self, "log_file_path") + + initialize_share_data() + + if not os.path.exists(self.working_dir): + logger.info(f"Creating working directory {self.working_dir}") + os.makedirs(self.working_dir) + + # Verify storage implementation compatibility and environment variables + storage_configs = [ + ("KV_STORAGE", self.kv_storage), + ("VECTOR_STORAGE", self.vector_storage), + ("GRAPH_STORAGE", self.graph_storage), + ("DOC_STATUS_STORAGE", self.doc_status_storage), + ] + + for storage_type, storage_name in storage_configs: + # Verify storage implementation compatibility + verify_storage_implementation(storage_type, storage_name) + # Check environment variables + check_storage_env_vars(storage_name) + + # Ensure vector_db_storage_cls_kwargs has required fields + self.vector_db_storage_cls_kwargs = { + "cosine_better_than_threshold": self.cosine_better_than_threshold, + **self.vector_db_storage_cls_kwargs, + } + + # Init Tokenizer + # Post-initialization hook to handle backward compatabile tokenizer initialization based on provided parameters + if self.tokenizer is None: + if self.tiktoken_model_name: + self.tokenizer = TiktokenTokenizer(self.tiktoken_model_name) + else: + self.tokenizer = TiktokenTokenizer() + + # Initialize ollama_server_infos if not provided + if self.ollama_server_infos is None: + self.ollama_server_infos = OllamaServerInfos() + + # Validate config + if self.force_llm_summary_on_merge < 3: + logger.warning( + f"force_llm_summary_on_merge should be at least 3, got {self.force_llm_summary_on_merge}" + ) + if self.summary_context_size > self.max_total_tokens: + logger.warning( + f"summary_context_size({self.summary_context_size}) should no greater than max_total_tokens({self.max_total_tokens})" + ) + if self.summary_length_recommended > self.summary_max_tokens: + logger.warning( + f"max_total_tokens({self.summary_max_tokens}) should greater than summary_length_recommended({self.summary_length_recommended})" + ) + + # Fix global_config now + global_config = asdict(self) + + _print_config = ",\n ".join([f"{k} = {v}" for k, v in global_config.items()]) + logger.debug(f"LightRAG init with param:\n {_print_config}\n") + + # Init Embedding + # Step 1: Capture max_token_size before applying decorator (decorator strips dataclass attributes) + embedding_max_token_size = None + if self.embedding_func and hasattr(self.embedding_func, "max_token_size"): + embedding_max_token_size = self.embedding_func.max_token_size + logger.debug( + f"Captured embedding max_token_size: {embedding_max_token_size}" + ) + self.embedding_token_limit = embedding_max_token_size + + # Step 2: Apply priority wrapper decorator + self.embedding_func = priority_limit_async_func_call( + self.embedding_func_max_async, + llm_timeout=self.default_embedding_timeout, + queue_name="Embedding func", + )(self.embedding_func) + + # Initialize all storages + self.key_string_value_json_storage_cls: type[BaseKVStorage] = ( + self._get_storage_class(self.kv_storage) + ) # type: ignore + self.vector_db_storage_cls: type[BaseVectorStorage] = self._get_storage_class( + self.vector_storage + ) # type: ignore + self.graph_storage_cls: type[BaseGraphStorage] = self._get_storage_class( + self.graph_storage + ) # type: ignore + self.key_string_value_json_storage_cls = partial( # type: ignore + self.key_string_value_json_storage_cls, global_config=global_config + ) + self.vector_db_storage_cls = partial( # type: ignore + self.vector_db_storage_cls, global_config=global_config + ) + self.graph_storage_cls = partial( # type: ignore + self.graph_storage_cls, global_config=global_config + ) + + # Initialize document status storage + self.doc_status_storage_cls = self._get_storage_class(self.doc_status_storage) + + self.llm_response_cache: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + workspace=self.workspace, + global_config=global_config, + embedding_func=self.embedding_func, + ) + + self.text_chunks: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_TEXT_CHUNKS, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.full_docs: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_FULL_DOCS, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.full_entities: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_FULL_ENTITIES, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.full_relations: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_FULL_RELATIONS, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.entity_chunks: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_ENTITY_CHUNKS, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.relation_chunks: BaseKVStorage = self.key_string_value_json_storage_cls( # type: ignore + namespace=NameSpace.KV_STORE_RELATION_CHUNKS, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.chunk_entity_relation_graph: BaseGraphStorage = self.graph_storage_cls( # type: ignore + namespace=NameSpace.GRAPH_STORE_CHUNK_ENTITY_RELATION, + workspace=self.workspace, + embedding_func=self.embedding_func, + ) + + self.entities_vdb: BaseVectorStorage = self.vector_db_storage_cls( # type: ignore + namespace=NameSpace.VECTOR_STORE_ENTITIES, + workspace=self.workspace, + embedding_func=self.embedding_func, + meta_fields={"entity_name", "source_id", "content", "file_path"}, + ) + self.relationships_vdb: BaseVectorStorage = self.vector_db_storage_cls( # type: ignore + namespace=NameSpace.VECTOR_STORE_RELATIONSHIPS, + workspace=self.workspace, + embedding_func=self.embedding_func, + meta_fields={"src_id", "tgt_id", "source_id", "content", "file_path"}, + ) + self.chunks_vdb: BaseVectorStorage = self.vector_db_storage_cls( # type: ignore + namespace=NameSpace.VECTOR_STORE_CHUNKS, + workspace=self.workspace, + embedding_func=self.embedding_func, + meta_fields={"full_doc_id", "content", "file_path"}, + ) + + # Initialize document status storage + self.doc_status: DocStatusStorage = self.doc_status_storage_cls( + namespace=NameSpace.DOC_STATUS, + workspace=self.workspace, + global_config=global_config, + embedding_func=None, + ) + + # Directly use llm_response_cache, don't create a new object + hashing_kv = self.llm_response_cache + + # Get timeout from LLM model kwargs for dynamic timeout calculation + self.llm_model_func = priority_limit_async_func_call( + self.llm_model_max_async, + llm_timeout=self.default_llm_timeout, + queue_name="LLM func", + )( + partial( + self.llm_model_func, # type: ignore + hashing_kv=hashing_kv, + **self.llm_model_kwargs, + ) + ) + + self._storages_status = StoragesStatus.CREATED + + async def initialize_storages(self): + """Storage initialization must be called one by one to prevent deadlock""" + if self._storages_status == StoragesStatus.CREATED: + for storage in ( + self.full_docs, + self.text_chunks, + self.full_entities, + self.full_relations, + self.entity_chunks, + self.relation_chunks, + self.entities_vdb, + self.relationships_vdb, + self.chunks_vdb, + self.chunk_entity_relation_graph, + self.llm_response_cache, + self.doc_status, + ): + if storage: + # logger.debug(f"Initializing storage: {storage}") + await storage.initialize() + + self._storages_status = StoragesStatus.INITIALIZED + logger.debug("All storage types initialized") + + async def finalize_storages(self): + """Asynchronously finalize the storages with improved error handling""" + if self._storages_status == StoragesStatus.INITIALIZED: + storages = [ + ("full_docs", self.full_docs), + ("text_chunks", self.text_chunks), + ("full_entities", self.full_entities), + ("full_relations", self.full_relations), + ("entity_chunks", self.entity_chunks), + ("relation_chunks", self.relation_chunks), + ("entities_vdb", self.entities_vdb), + ("relationships_vdb", self.relationships_vdb), + ("chunks_vdb", self.chunks_vdb), + ("chunk_entity_relation_graph", self.chunk_entity_relation_graph), + ("llm_response_cache", self.llm_response_cache), + ("doc_status", self.doc_status), + ] + + # Finalize each storage individually to ensure one failure doesn't prevent others from closing + successful_finalizations = [] + failed_finalizations = [] + + for storage_name, storage in storages: + if storage: + try: + await storage.finalize() + successful_finalizations.append(storage_name) + logger.debug(f"Successfully finalized {storage_name}") + except Exception as e: + error_msg = f"Failed to finalize {storage_name}: {e}" + logger.error(error_msg) + failed_finalizations.append(storage_name) + + # Log summary of finalization results + if successful_finalizations: + logger.info( + f"Successfully finalized {len(successful_finalizations)} storages" + ) + + if failed_finalizations: + logger.error( + f"Failed to finalize {len(failed_finalizations)} storages: {', '.join(failed_finalizations)}" + ) + else: + logger.debug("All storages finalized successfully") + + self._storages_status = StoragesStatus.FINALIZED + + async def check_and_migrate_data(self): + """Check if data migration is needed and perform migration if necessary""" + async with get_data_init_lock(): + try: + # Check if migration is needed: + # 1. chunk_entity_relation_graph has entities and relations (count > 0) + # 2. full_entities and full_relations are empty + + # Get all entity labels from graph + all_entity_labels = ( + await self.chunk_entity_relation_graph.get_all_labels() + ) + + if not all_entity_labels: + logger.debug("No entities found in graph, skipping migration check") + return + + try: + # Initialize chunk tracking storage after migration + await self._migrate_chunk_tracking_storage() + except Exception as e: + logger.error(f"Error during chunk_tracking migration: {e}") + raise e + + # Check if full_entities and full_relations are empty + # Get all processed documents to check their entity/relation data + try: + processed_docs = await self.doc_status.get_docs_by_status( + DocStatus.PROCESSED + ) + + if not processed_docs: + logger.debug("No processed documents found, skipping migration") + return + + # Check first few documents to see if they have full_entities/full_relations data + migration_needed = True + checked_count = 0 + max_check = min(5, len(processed_docs)) # Check up to 5 documents + + for doc_id in list(processed_docs.keys())[:max_check]: + checked_count += 1 + entity_data = await self.full_entities.get_by_id(doc_id) + relation_data = await self.full_relations.get_by_id(doc_id) + + if entity_data or relation_data: + migration_needed = False + break + + if not migration_needed: + logger.debug( + "Full entities/relations data already exists, no migration needed" + ) + return + + logger.info( + f"Data migration needed: found {len(all_entity_labels)} entities in graph but no full_entities/full_relations data" + ) + + # Perform migration + await self._migrate_entity_relation_data(processed_docs) + + except Exception as e: + logger.error(f"Error during migration check: {e}") + raise e + + except Exception as e: + logger.error(f"Error in data migration check: {e}") + raise e + + async def _migrate_entity_relation_data(self, processed_docs: dict): + """Migrate existing entity and relation data to full_entities and full_relations storage""" + logger.info(f"Starting data migration for {len(processed_docs)} documents") + + # Create mapping from chunk_id to doc_id + chunk_to_doc = {} + for doc_id, doc_status in processed_docs.items(): + chunk_ids = ( + doc_status.chunks_list + if hasattr(doc_status, "chunks_list") and doc_status.chunks_list + else [] + ) + for chunk_id in chunk_ids: + chunk_to_doc[chunk_id] = doc_id + + # Initialize document entity and relation mappings + doc_entities = {} # doc_id -> set of entity_names + doc_relations = {} # doc_id -> set of relation_pairs (as tuples) + + # Get all nodes and edges from graph + all_nodes = await self.chunk_entity_relation_graph.get_all_nodes() + all_edges = await self.chunk_entity_relation_graph.get_all_edges() + + # Process all nodes once + for node in all_nodes: + if "source_id" in node: + entity_id = node.get("entity_id") or node.get("id") + if not entity_id: + continue + + # Get chunk IDs from source_id + source_ids = node["source_id"].split(GRAPH_FIELD_SEP) + + # Find which documents this entity belongs to + for chunk_id in source_ids: + doc_id = chunk_to_doc.get(chunk_id) + if doc_id: + if doc_id not in doc_entities: + doc_entities[doc_id] = set() + doc_entities[doc_id].add(entity_id) + + # Process all edges once + for edge in all_edges: + if "source_id" in edge: + src = edge.get("source") + tgt = edge.get("target") + if not src or not tgt: + continue + + # Get chunk IDs from source_id + source_ids = edge["source_id"].split(GRAPH_FIELD_SEP) + + # Find which documents this relation belongs to + for chunk_id in source_ids: + doc_id = chunk_to_doc.get(chunk_id) + if doc_id: + if doc_id not in doc_relations: + doc_relations[doc_id] = set() + # Use tuple for set operations, convert to list later + doc_relations[doc_id].add(tuple(sorted((src, tgt)))) + + # Store the results in full_entities and full_relations + migration_count = 0 + + # Store entities + if doc_entities: + entities_data = {} + for doc_id, entity_set in doc_entities.items(): + entities_data[doc_id] = { + "entity_names": list(entity_set), + "count": len(entity_set), + } + await self.full_entities.upsert(entities_data) + + # Store relations + if doc_relations: + relations_data = {} + for doc_id, relation_set in doc_relations.items(): + # Convert tuples back to lists + relations_data[doc_id] = { + "relation_pairs": [list(pair) for pair in relation_set], + "count": len(relation_set), + } + await self.full_relations.upsert(relations_data) + + migration_count = len( + set(list(doc_entities.keys()) + list(doc_relations.keys())) + ) + + # Persist the migrated data + await self.full_entities.index_done_callback() + await self.full_relations.index_done_callback() + + logger.info( + f"Data migration completed: migrated {migration_count} documents with entities/relations" + ) + + async def _migrate_chunk_tracking_storage(self) -> None: + """Ensure entity/relation chunk tracking KV stores exist and are seeded.""" + + if not self.entity_chunks or not self.relation_chunks: + return + + need_entity_migration = False + need_relation_migration = False + + try: + need_entity_migration = await self.entity_chunks.is_empty() + except Exception as exc: # pragma: no cover - defensive logging + logger.error(f"Failed to check entity chunks storage: {exc}") + raise exc + + try: + need_relation_migration = await self.relation_chunks.is_empty() + except Exception as exc: # pragma: no cover - defensive logging + logger.error(f"Failed to check relation chunks storage: {exc}") + raise exc + + if not need_entity_migration and not need_relation_migration: + return + + BATCH_SIZE = 500 # Process 500 records per batch + + if need_entity_migration: + try: + nodes = await self.chunk_entity_relation_graph.get_all_nodes() + except Exception as exc: + logger.error(f"Failed to fetch nodes for chunk migration: {exc}") + nodes = [] + + logger.info(f"Starting chunk_tracking data migration: {len(nodes)} nodes") + + # Process nodes in batches + total_nodes = len(nodes) + total_batches = (total_nodes + BATCH_SIZE - 1) // BATCH_SIZE + total_migrated = 0 + + for batch_idx in range(total_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = min((batch_idx + 1) * BATCH_SIZE, total_nodes) + batch_nodes = nodes[start_idx:end_idx] + + upsert_payload: dict[str, dict[str, object]] = {} + for node in batch_nodes: + entity_id = node.get("entity_id") or node.get("id") + if not entity_id: + continue + + raw_source = node.get("source_id") or "" + chunk_ids = [ + chunk_id + for chunk_id in raw_source.split(GRAPH_FIELD_SEP) + if chunk_id + ] + if not chunk_ids: + continue + + upsert_payload[entity_id] = { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + + if upsert_payload: + await self.entity_chunks.upsert(upsert_payload) + total_migrated += len(upsert_payload) + logger.info( + f"Processed entity batch {batch_idx + 1}/{total_batches}: {len(upsert_payload)} records (total: {total_migrated}/{total_nodes})" + ) + + if total_migrated > 0: + # Persist entity_chunks data to disk + await self.entity_chunks.index_done_callback() + logger.info( + f"Entity chunk_tracking migration completed: {total_migrated} records persisted" + ) + + if need_relation_migration: + try: + edges = await self.chunk_entity_relation_graph.get_all_edges() + except Exception as exc: + logger.error(f"Failed to fetch edges for chunk migration: {exc}") + edges = [] + + logger.info(f"Starting chunk_tracking data migration: {len(edges)} edges") + + # Process edges in batches + total_edges = len(edges) + total_batches = (total_edges + BATCH_SIZE - 1) // BATCH_SIZE + total_migrated = 0 + + for batch_idx in range(total_batches): + start_idx = batch_idx * BATCH_SIZE + end_idx = min((batch_idx + 1) * BATCH_SIZE, total_edges) + batch_edges = edges[start_idx:end_idx] + + upsert_payload: dict[str, dict[str, object]] = {} + for edge in batch_edges: + src = edge.get("source") or edge.get("src_id") or edge.get("src") + tgt = edge.get("target") or edge.get("tgt_id") or edge.get("tgt") + if not src or not tgt: + continue + + raw_source = edge.get("source_id") or "" + chunk_ids = [ + chunk_id + for chunk_id in raw_source.split(GRAPH_FIELD_SEP) + if chunk_id + ] + if not chunk_ids: + continue + + storage_key = make_relation_chunk_key(src, tgt) + upsert_payload[storage_key] = { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + + if upsert_payload: + await self.relation_chunks.upsert(upsert_payload) + total_migrated += len(upsert_payload) + logger.info( + f"Processed relation batch {batch_idx + 1}/{total_batches}: {len(upsert_payload)} records (total: {total_migrated}/{total_edges})" + ) + + if total_migrated > 0: + # Persist relation_chunks data to disk + await self.relation_chunks.index_done_callback() + logger.info( + f"Relation chunk_tracking migration completed: {total_migrated} records persisted" + ) + + async def get_graph_labels(self): + text = await self.chunk_entity_relation_graph.get_all_labels() + return text + + async def get_knowledge_graph( + self, + node_label: str, + max_depth: int = 3, + max_nodes: int = None, + ) -> KnowledgeGraph: + """Get knowledge graph for a given label + + Args: + node_label (str): Label to get knowledge graph for + max_depth (int): Maximum depth of graph + max_nodes (int, optional): Maximum number of nodes to return. Defaults to self.max_graph_nodes. + + Returns: + KnowledgeGraph: Knowledge graph containing nodes and edges + """ + # Use self.max_graph_nodes as default if max_nodes is None + if max_nodes is None: + max_nodes = self.max_graph_nodes + else: + # Limit max_nodes to not exceed self.max_graph_nodes + max_nodes = min(max_nodes, self.max_graph_nodes) + + return await self.chunk_entity_relation_graph.get_knowledge_graph( + node_label, max_depth, max_nodes + ) + + def _get_storage_class(self, storage_name: str) -> Callable[..., Any]: + # Direct imports for default storage implementations + if storage_name == "JsonKVStorage": + from lightrag.kg.json_kv_impl import JsonKVStorage + + return JsonKVStorage + elif storage_name == "NanoVectorDBStorage": + from lightrag.kg.nano_vector_db_impl import NanoVectorDBStorage + + return NanoVectorDBStorage + elif storage_name == "NetworkXStorage": + from lightrag.kg.networkx_impl import NetworkXStorage + + return NetworkXStorage + elif storage_name == "JsonDocStatusStorage": + from lightrag.kg.json_doc_status_impl import JsonDocStatusStorage + + return JsonDocStatusStorage + else: + # Fallback to dynamic import for other storage implementations + import_path = STORAGES[storage_name] + storage_class = lazy_external_import(import_path, storage_name) + return storage_class + + def insert( + self, + input: str | list[str], + split_by_character: str | None = None, + split_by_character_only: bool = False, + ids: str | list[str] | None = None, + file_paths: str | list[str] | None = None, + track_id: str | None = None, + ) -> str: + """Sync Insert documents with checkpoint support + + Args: + input: Single document string or list of document strings + split_by_character: if split_by_character is not None, split the string by character, if chunk longer than + chunk_token_size, it will be split again by token size. + split_by_character_only: if split_by_character_only is True, split the string by character only, when + split_by_character is None, this parameter is ignored. + ids: single string of the document ID or list of unique document IDs, if not provided, MD5 hash IDs will be generated + file_paths: single string of the file path or list of file paths, used for citation + track_id: tracking ID for monitoring processing status, if not provided, will be generated + + Returns: + str: tracking ID for monitoring processing status + """ + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.ainsert( + input, + split_by_character, + split_by_character_only, + ids, + file_paths, + track_id, + ) + ) + + async def ainsert( + self, + input: str | list[str], + split_by_character: str | None = None, + split_by_character_only: bool = False, + ids: str | list[str] | None = None, + file_paths: str | list[str] | None = None, + track_id: str | None = None, + ) -> str: + """Async Insert documents with checkpoint support + + Args: + input: Single document string or list of document strings + split_by_character: if split_by_character is not None, split the string by character, if chunk longer than + chunk_token_size, it will be split again by token size. + split_by_character_only: if split_by_character_only is True, split the string by character only, when + split_by_character is None, this parameter is ignored. + ids: list of unique document IDs, if not provided, MD5 hash IDs will be generated + file_paths: list of file paths corresponding to each document, used for citation + track_id: tracking ID for monitoring processing status, if not provided, will be generated + + Returns: + str: tracking ID for monitoring processing status + """ + # Generate track_id if not provided + if track_id is None: + track_id = generate_track_id("insert") + + await self.apipeline_enqueue_documents(input, ids, file_paths, track_id) + await self.apipeline_process_enqueue_documents( + split_by_character, split_by_character_only + ) + + return track_id + + # TODO: deprecated, use insert instead + def insert_custom_chunks( + self, + full_text: str, + text_chunks: list[str], + doc_id: str | list[str] | None = None, + ) -> None: + loop = always_get_an_event_loop() + loop.run_until_complete( + self.ainsert_custom_chunks(full_text, text_chunks, doc_id) + ) + + # TODO: deprecated, use ainsert instead + async def ainsert_custom_chunks( + self, full_text: str, text_chunks: list[str], doc_id: str | None = None + ) -> None: + update_storage = False + try: + # Clean input texts + full_text = sanitize_text_for_encoding(full_text) + text_chunks = [sanitize_text_for_encoding(chunk) for chunk in text_chunks] + file_path = "" + + # Process cleaned texts + if doc_id is None: + doc_key = compute_mdhash_id(full_text, prefix="doc-") + else: + doc_key = doc_id + new_docs = {doc_key: {"content": full_text, "file_path": file_path}} + + _add_doc_keys = await self.full_docs.filter_keys({doc_key}) + new_docs = {k: v for k, v in new_docs.items() if k in _add_doc_keys} + if not len(new_docs): + logger.warning("This document is already in the storage.") + return + + update_storage = True + logger.info(f"Inserting {len(new_docs)} docs") + + inserting_chunks: dict[str, Any] = {} + for index, chunk_text in enumerate(text_chunks): + chunk_key = compute_mdhash_id(chunk_text, prefix="chunk-") + tokens = len(self.tokenizer.encode(chunk_text)) + inserting_chunks[chunk_key] = { + "content": chunk_text, + "full_doc_id": doc_key, + "tokens": tokens, + "chunk_order_index": index, + "file_path": file_path, + } + + doc_ids = set(inserting_chunks.keys()) + add_chunk_keys = await self.text_chunks.filter_keys(doc_ids) + inserting_chunks = { + k: v for k, v in inserting_chunks.items() if k in add_chunk_keys + } + if not len(inserting_chunks): + logger.warning("All chunks are already in the storage.") + return + + tasks = [ + self.chunks_vdb.upsert(inserting_chunks), + self._process_extract_entities(inserting_chunks), + self.full_docs.upsert(new_docs), + self.text_chunks.upsert(inserting_chunks), + ] + await asyncio.gather(*tasks) + + finally: + if update_storage: + await self._insert_done() + + async def apipeline_enqueue_documents( + self, + input: str | list[str], + ids: list[str] | None = None, + file_paths: str | list[str] | None = None, + track_id: str | None = None, + ) -> str: + """ + Pipeline for Processing Documents + + 1. Validate ids if provided or generate MD5 hash IDs and remove duplicate contents + 2. Generate document initial status + 3. Filter out already processed documents + 4. Enqueue document in status + + Args: + input: Single document string or list of document strings + ids: list of unique document IDs, if not provided, MD5 hash IDs will be generated + file_paths: list of file paths corresponding to each document, used for citation + track_id: tracking ID for monitoring processing status, if not provided, will be generated with "enqueue" prefix + + Returns: + str: tracking ID for monitoring processing status + """ + # Generate track_id if not provided + if track_id is None or track_id.strip() == "": + track_id = generate_track_id("enqueue") + if isinstance(input, str): + input = [input] + if isinstance(ids, str): + ids = [ids] + if isinstance(file_paths, str): + file_paths = [file_paths] + + # If file_paths is provided, ensure it matches the number of documents + if file_paths is not None: + if isinstance(file_paths, str): + file_paths = [file_paths] + if len(file_paths) != len(input): + raise ValueError( + "Number of file paths must match the number of documents" + ) + else: + # If no file paths provided, use placeholder + file_paths = ["unknown_source"] * len(input) + + # 1. Validate ids if provided or generate MD5 hash IDs and remove duplicate contents + if ids is not None: + # Check if the number of IDs matches the number of documents + if len(ids) != len(input): + raise ValueError("Number of IDs must match the number of documents") + + # Check if IDs are unique + if len(ids) != len(set(ids)): + raise ValueError("IDs must be unique") + + # Generate contents dict and remove duplicates in one pass + unique_contents = {} + for id_, doc, path in zip(ids, input, file_paths): + cleaned_content = sanitize_text_for_encoding(doc) + if cleaned_content not in unique_contents: + unique_contents[cleaned_content] = (id_, path) + + # Reconstruct contents with unique content + contents = { + id_: {"content": content, "file_path": file_path} + for content, (id_, file_path) in unique_contents.items() + } + else: + # Clean input text and remove duplicates in one pass + unique_content_with_paths = {} + for doc, path in zip(input, file_paths): + cleaned_content = sanitize_text_for_encoding(doc) + if cleaned_content not in unique_content_with_paths: + unique_content_with_paths[cleaned_content] = path + + # Generate contents dict of MD5 hash IDs and documents with paths + contents = { + compute_mdhash_id(content, prefix="doc-"): { + "content": content, + "file_path": path, + } + for content, path in unique_content_with_paths.items() + } + + # 2. Generate document initial status (without content) + new_docs: dict[str, Any] = { + id_: { + "status": DocStatus.PENDING, + "content_summary": get_content_summary(content_data["content"]), + "content_length": len(content_data["content"]), + "created_at": datetime.now(timezone.utc).isoformat(), + "updated_at": datetime.now(timezone.utc).isoformat(), + "file_path": content_data[ + "file_path" + ], # Store file path in document status + "track_id": track_id, # Store track_id in document status + } + for id_, content_data in contents.items() + } + + # 3. Filter out already processed documents + # Get docs ids + all_new_doc_ids = set(new_docs.keys()) + # Exclude IDs of documents that are already enqueued + unique_new_doc_ids = await self.doc_status.filter_keys(all_new_doc_ids) + + # Log ignored document IDs (documents that were filtered out because they already exist) + ignored_ids = list(all_new_doc_ids - unique_new_doc_ids) + if ignored_ids: + for doc_id in ignored_ids: + file_path = new_docs.get(doc_id, {}).get("file_path", "unknown_source") + logger.warning( + f"Ignoring document ID (already exists): {doc_id} ({file_path})" + ) + if len(ignored_ids) > 3: + logger.warning( + f"Total Ignoring {len(ignored_ids)} document IDs that already exist in storage" + ) + + # Filter new_docs to only include documents with unique IDs + new_docs = { + doc_id: new_docs[doc_id] + for doc_id in unique_new_doc_ids + if doc_id in new_docs + } + + if not new_docs: + logger.warning("No new unique documents were found.") + return + + # 4. Store document content in full_docs and status in doc_status + # Store full document content separately + full_docs_data = { + doc_id: { + "content": contents[doc_id]["content"], + "file_path": contents[doc_id]["file_path"], + } + for doc_id in new_docs.keys() + } + await self.full_docs.upsert(full_docs_data) + # Persist data to disk immediately + await self.full_docs.index_done_callback() + + # Store document status (without content) + await self.doc_status.upsert(new_docs) + logger.debug(f"Stored {len(new_docs)} new unique documents") + + return track_id + + async def apipeline_enqueue_error_documents( + self, + error_files: list[dict[str, Any]], + track_id: str | None = None, + ) -> None: + """ + Record file extraction errors in doc_status storage. + + This function creates error document entries in the doc_status storage for files + that failed during the extraction process. Each error entry contains information + about the failure to help with debugging and monitoring. + + Args: + error_files: List of dictionaries containing error information for each failed file. + Each dictionary should contain: + - file_path: Original file name/path + - error_description: Brief error description (for content_summary) + - original_error: Full error message (for error_msg) + - file_size: File size in bytes (for content_length, 0 if unknown) + track_id: Optional tracking ID for grouping related operations + + Returns: + None + """ + if not error_files: + logger.debug("No error files to record") + return + + # Generate track_id if not provided + if track_id is None or track_id.strip() == "": + track_id = generate_track_id("error") + + error_docs: dict[str, Any] = {} + current_time = datetime.now(timezone.utc).isoformat() + + for error_file in error_files: + file_path = error_file.get("file_path", "unknown_file") + error_description = error_file.get( + "error_description", "File extraction failed" + ) + original_error = error_file.get("original_error", "Unknown error") + file_size = error_file.get("file_size", 0) + + # Generate unique doc_id with "error-" prefix + doc_id_content = f"{file_path}-{error_description}" + doc_id = compute_mdhash_id(doc_id_content, prefix="error-") + + error_docs[doc_id] = { + "status": DocStatus.FAILED, + "content_summary": error_description, + "content_length": file_size, + "error_msg": original_error, + "chunks_count": 0, # No chunks for failed files + "created_at": current_time, + "updated_at": current_time, + "file_path": file_path, + "track_id": track_id, + "metadata": { + "error_type": "file_extraction_error", + }, + } + + # Store error documents in doc_status + if error_docs: + await self.doc_status.upsert(error_docs) + # Log each error for debugging + for doc_id, error_doc in error_docs.items(): + logger.error( + f"File processing error: - ID: {doc_id} {error_doc['file_path']}" + ) + + async def _validate_and_fix_document_consistency( + self, + to_process_docs: dict[str, DocProcessingStatus], + pipeline_status: dict, + pipeline_status_lock: asyncio.Lock, + ) -> dict[str, DocProcessingStatus]: + """Validate and fix document data consistency by deleting inconsistent entries, but preserve failed documents""" + inconsistent_docs = [] + failed_docs_to_preserve = [] + successful_deletions = 0 + + # Check each document's data consistency + for doc_id, status_doc in to_process_docs.items(): + # Check if corresponding content exists in full_docs + content_data = await self.full_docs.get_by_id(doc_id) + if not content_data: + # Check if this is a failed document that should be preserved + if ( + hasattr(status_doc, "status") + and status_doc.status == DocStatus.FAILED + ): + failed_docs_to_preserve.append(doc_id) + else: + inconsistent_docs.append(doc_id) + + # Log information about failed documents that will be preserved + if failed_docs_to_preserve: + async with pipeline_status_lock: + preserve_message = f"Preserving {len(failed_docs_to_preserve)} failed document entries for manual review" + logger.info(preserve_message) + pipeline_status["latest_message"] = preserve_message + pipeline_status["history_messages"].append(preserve_message) + + # Remove failed documents from processing list but keep them in doc_status + for doc_id in failed_docs_to_preserve: + to_process_docs.pop(doc_id, None) + + # Delete inconsistent document entries(excluding failed documents) + if inconsistent_docs: + async with pipeline_status_lock: + summary_message = ( + f"Inconsistent document entries found: {len(inconsistent_docs)}" + ) + logger.info(summary_message) + pipeline_status["latest_message"] = summary_message + pipeline_status["history_messages"].append(summary_message) + + successful_deletions = 0 + for doc_id in inconsistent_docs: + try: + status_doc = to_process_docs[doc_id] + file_path = getattr(status_doc, "file_path", "unknown_source") + + # Delete doc_status entry + await self.doc_status.delete([doc_id]) + successful_deletions += 1 + + # Log successful deletion + async with pipeline_status_lock: + log_message = ( + f"Deleted inconsistent entry: {doc_id} ({file_path})" + ) + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Remove from processing list + to_process_docs.pop(doc_id, None) + + except Exception as e: + # Log deletion failure + async with pipeline_status_lock: + error_message = f"Failed to delete entry: {doc_id} - {str(e)}" + logger.error(error_message) + pipeline_status["latest_message"] = error_message + pipeline_status["history_messages"].append(error_message) + + # Final summary log + # async with pipeline_status_lock: + # final_message = f"Successfully deleted {successful_deletions} inconsistent entries, preserved {len(failed_docs_to_preserve)} failed documents" + # logger.info(final_message) + # pipeline_status["latest_message"] = final_message + # pipeline_status["history_messages"].append(final_message) + + # Reset PROCESSING and FAILED documents that pass consistency checks to PENDING status + docs_to_reset = {} + reset_count = 0 + + for doc_id, status_doc in to_process_docs.items(): + # Check if document has corresponding content in full_docs (consistency check) + content_data = await self.full_docs.get_by_id(doc_id) + if content_data: # Document passes consistency check + # Check if document is in PROCESSING or FAILED status + if hasattr(status_doc, "status") and status_doc.status in [ + DocStatus.PROCESSING, + DocStatus.FAILED, + ]: + # Prepare document for status reset to PENDING + docs_to_reset[doc_id] = { + "status": DocStatus.PENDING, + "content_summary": status_doc.content_summary, + "content_length": status_doc.content_length, + "created_at": status_doc.created_at, + "updated_at": datetime.now(timezone.utc).isoformat(), + "file_path": getattr(status_doc, "file_path", "unknown_source"), + "track_id": getattr(status_doc, "track_id", ""), + # Clear any error messages and processing metadata + "error_msg": "", + "metadata": {}, + } + + # Update the status in to_process_docs as well + status_doc.status = DocStatus.PENDING + reset_count += 1 + + # Update doc_status storage if there are documents to reset + if docs_to_reset: + await self.doc_status.upsert(docs_to_reset) + + async with pipeline_status_lock: + reset_message = f"Reset {reset_count} documents from PROCESSING/FAILED to PENDING status" + logger.info(reset_message) + pipeline_status["latest_message"] = reset_message + pipeline_status["history_messages"].append(reset_message) + + return to_process_docs + + async def apipeline_process_enqueue_documents( + self, + split_by_character: str | None = None, + split_by_character_only: bool = False, + ) -> None: + """ + Process pending documents by splitting them into chunks, processing + each chunk for entity and relation extraction, and updating the + document status. + + 1. Get all pending, failed, and abnormally terminated processing documents. + 2. Validate document data consistency and fix any issues + 3. Split document content into chunks + 4. Process each chunk for entity and relation extraction + 5. Update the document status + """ + + # Get pipeline status shared data and lock + pipeline_status = await get_namespace_data("pipeline_status") + pipeline_status_lock = get_pipeline_status_lock() + + # Check if another process is already processing the queue + async with pipeline_status_lock: + # Ensure only one worker is processing documents + if not pipeline_status.get("busy", False): + processing_docs, failed_docs, pending_docs = await asyncio.gather( + self.doc_status.get_docs_by_status(DocStatus.PROCESSING), + self.doc_status.get_docs_by_status(DocStatus.FAILED), + self.doc_status.get_docs_by_status(DocStatus.PENDING), + ) + + to_process_docs: dict[str, DocProcessingStatus] = {} + to_process_docs.update(processing_docs) + to_process_docs.update(failed_docs) + to_process_docs.update(pending_docs) + + if not to_process_docs: + logger.info("No documents to process") + return + + pipeline_status.update( + { + "busy": True, + "job_name": "Default Job", + "job_start": datetime.now(timezone.utc).isoformat(), + "docs": 0, + "batchs": 0, # Total number of files to be processed + "cur_batch": 0, # Number of files already processed + "request_pending": False, # Clear any previous request + "cancellation_requested": False, # Initialize cancellation flag + "latest_message": "", + } + ) + # Cleaning history_messages without breaking it as a shared list object + del pipeline_status["history_messages"][:] + else: + # Another process is busy, just set request flag and return + pipeline_status["request_pending"] = True + logger.info( + "Another process is already processing the document queue. Request queued." + ) + return + + try: + # Process documents until no more documents or requests + while True: + # Check for cancellation request at the start of main loop + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + # Clear pending request + pipeline_status["request_pending"] = False + # Celar cancellation flag + pipeline_status["cancellation_requested"] = False + + log_message = "Pipeline cancelled by user" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Exit directly, skipping request_pending check + return + + if not to_process_docs: + log_message = "All enqueued documents have been processed" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + break + + # Validate document data consistency and fix any issues as part of the pipeline + to_process_docs = await self._validate_and_fix_document_consistency( + to_process_docs, pipeline_status, pipeline_status_lock + ) + + if not to_process_docs: + log_message = ( + "No valid documents to process after consistency check" + ) + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + break + + log_message = f"Processing {len(to_process_docs)} document(s)" + logger.info(log_message) + + # Update pipeline_status, batchs now represents the total number of files to be processed + pipeline_status["docs"] = len(to_process_docs) + pipeline_status["batchs"] = len(to_process_docs) + pipeline_status["cur_batch"] = 0 + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Get first document's file path and total count for job name + first_doc_id, first_doc = next(iter(to_process_docs.items())) + first_doc_path = first_doc.file_path + + # Handle cases where first_doc_path is None + if first_doc_path: + path_prefix = first_doc_path[:20] + ( + "..." if len(first_doc_path) > 20 else "" + ) + else: + path_prefix = "unknown_source" + + total_files = len(to_process_docs) + job_name = f"{path_prefix}[{total_files} files]" + pipeline_status["job_name"] = job_name + + # Create a counter to track the number of processed files + processed_count = 0 + # Create a semaphore to limit the number of concurrent file processing + semaphore = asyncio.Semaphore(self.max_parallel_insert) + + async def process_document( + doc_id: str, + status_doc: DocProcessingStatus, + split_by_character: str | None, + split_by_character_only: bool, + pipeline_status: dict, + pipeline_status_lock: asyncio.Lock, + semaphore: asyncio.Semaphore, + ) -> None: + """Process single document""" + # Initialize variables at the start to prevent UnboundLocalError in error handling + file_path = "unknown_source" + current_file_number = 0 + file_extraction_stage_ok = False + processing_start_time = int(time.time()) + first_stage_tasks = [] + entity_relation_task = None + + async with semaphore: + nonlocal processed_count + # Initialize to prevent UnboundLocalError in error handling + first_stage_tasks = [] + entity_relation_task = None + try: + # Check for cancellation before starting document processing + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException("User cancelled") + + # Get file path from status document + file_path = getattr( + status_doc, "file_path", "unknown_source" + ) + + async with pipeline_status_lock: + # Update processed file count and save current file number + processed_count += 1 + current_file_number = ( + processed_count # Save the current file number + ) + pipeline_status["cur_batch"] = processed_count + + log_message = f"Extracting stage {current_file_number}/{total_files}: {file_path}" + logger.info(log_message) + pipeline_status["history_messages"].append(log_message) + log_message = f"Processing d-id: {doc_id}" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Prevent memory growth: keep only latest 5000 messages when exceeding 10000 + if len(pipeline_status["history_messages"]) > 10000: + logger.info( + f"Trimming pipeline history from {len(pipeline_status['history_messages'])} to 5000 messages" + ) + pipeline_status["history_messages"] = ( + pipeline_status["history_messages"][-5000:] + ) + + # Get document content from full_docs + content_data = await self.full_docs.get_by_id(doc_id) + if not content_data: + raise Exception( + f"Document content not found in full_docs for doc_id: {doc_id}" + ) + content = content_data["content"] + + # Call chunking function, supporting both sync and async implementations + chunking_result = self.chunking_func( + self.tokenizer, + content, + split_by_character, + split_by_character_only, + self.chunk_overlap_token_size, + self.chunk_token_size, + ) + + # If result is awaitable, await to get actual result + if inspect.isawaitable(chunking_result): + chunking_result = await chunking_result + + # Validate return type + if not isinstance(chunking_result, (list, tuple)): + raise TypeError( + f"chunking_func must return a list or tuple of dicts, " + f"got {type(chunking_result)}" + ) + + # Build chunks dictionary + chunks: dict[str, Any] = { + compute_mdhash_id(dp["content"], prefix="chunk-"): { + **dp, + "full_doc_id": doc_id, + "file_path": file_path, # Add file path to each chunk + "llm_cache_list": [], # Initialize empty LLM cache list for each chunk + } + for dp in chunking_result + } + + if not chunks: + logger.warning("No document chunks to process") + + # Record processing start time + processing_start_time = int(time.time()) + + # Check for cancellation before entity extraction + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException("User cancelled") + + # Process document in two stages + # Stage 1: Process text chunks and docs (parallel execution) + doc_status_task = asyncio.create_task( + self.doc_status.upsert( + { + doc_id: { + "status": DocStatus.PROCESSING, + "chunks_count": len(chunks), + "chunks_list": list( + chunks.keys() + ), # Save chunks list + "content_summary": status_doc.content_summary, + "content_length": status_doc.content_length, + "created_at": status_doc.created_at, + "updated_at": datetime.now( + timezone.utc + ).isoformat(), + "file_path": file_path, + "track_id": status_doc.track_id, # Preserve existing track_id + "metadata": { + "processing_start_time": processing_start_time + }, + } + } + ) + ) + chunks_vdb_task = asyncio.create_task( + self.chunks_vdb.upsert(chunks) + ) + text_chunks_task = asyncio.create_task( + self.text_chunks.upsert(chunks) + ) + + # First stage tasks (parallel execution) + first_stage_tasks = [ + doc_status_task, + chunks_vdb_task, + text_chunks_task, + ] + entity_relation_task = None + + # Execute first stage tasks + await asyncio.gather(*first_stage_tasks) + + # Stage 2: Process entity relation graph (after text_chunks are saved) + entity_relation_task = asyncio.create_task( + self._process_extract_entities( + chunks, pipeline_status, pipeline_status_lock + ) + ) + chunk_results = await entity_relation_task + file_extraction_stage_ok = True + + except Exception as e: + # Check if this is a user cancellation + if isinstance(e, PipelineCancelledException): + # User cancellation - log brief message only, no traceback + error_msg = f"User cancelled {current_file_number}/{total_files}: {file_path}" + logger.warning(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append( + error_msg + ) + else: + # Other exceptions - log with traceback + logger.error(traceback.format_exc()) + error_msg = f"Failed to extract document {current_file_number}/{total_files}: {file_path}" + logger.error(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append( + traceback.format_exc() + ) + pipeline_status["history_messages"].append( + error_msg + ) + + # Cancel tasks that are not yet completed + all_tasks = first_stage_tasks + ( + [entity_relation_task] if entity_relation_task else [] + ) + for task in all_tasks: + if task and not task.done(): + task.cancel() + + # Persistent llm cache with error handling + if self.llm_response_cache: + try: + await self.llm_response_cache.index_done_callback() + except Exception as persist_error: + logger.error( + f"Failed to persist LLM cache: {persist_error}" + ) + + # Record processing end time for failed case + processing_end_time = int(time.time()) + + # Update document status to failed + await self.doc_status.upsert( + { + doc_id: { + "status": DocStatus.FAILED, + "error_msg": str(e), + "content_summary": status_doc.content_summary, + "content_length": status_doc.content_length, + "created_at": status_doc.created_at, + "updated_at": datetime.now( + timezone.utc + ).isoformat(), + "file_path": file_path, + "track_id": status_doc.track_id, # Preserve existing track_id + "metadata": { + "processing_start_time": processing_start_time, + "processing_end_time": processing_end_time, + }, + } + } + ) + + # Concurrency is controlled by keyed lock for individual entities and relationships + if file_extraction_stage_ok: + try: + # Check for cancellation before merge + async with pipeline_status_lock: + if pipeline_status.get( + "cancellation_requested", False + ): + raise PipelineCancelledException( + "User cancelled" + ) + + # Use chunk_results from entity_relation_task + await merge_nodes_and_edges( + chunk_results=chunk_results, # result collected from entity_relation_task + knowledge_graph_inst=self.chunk_entity_relation_graph, + entity_vdb=self.entities_vdb, + relationships_vdb=self.relationships_vdb, + global_config=asdict(self), + full_entities_storage=self.full_entities, + full_relations_storage=self.full_relations, + doc_id=doc_id, + pipeline_status=pipeline_status, + pipeline_status_lock=pipeline_status_lock, + llm_response_cache=self.llm_response_cache, + entity_chunks_storage=self.entity_chunks, + relation_chunks_storage=self.relation_chunks, + current_file_number=current_file_number, + total_files=total_files, + file_path=file_path, + ) + + # Record processing end time + processing_end_time = int(time.time()) + + await self.doc_status.upsert( + { + doc_id: { + "status": DocStatus.PROCESSED, + "chunks_count": len(chunks), + "chunks_list": list(chunks.keys()), + "content_summary": status_doc.content_summary, + "content_length": status_doc.content_length, + "created_at": status_doc.created_at, + "updated_at": datetime.now( + timezone.utc + ).isoformat(), + "file_path": file_path, + "track_id": status_doc.track_id, # Preserve existing track_id + "metadata": { + "processing_start_time": processing_start_time, + "processing_end_time": processing_end_time, + }, + } + } + ) + + # Call _insert_done after processing each file + await self._insert_done() + + async with pipeline_status_lock: + log_message = f"Completed processing file {current_file_number}/{total_files}: {file_path}" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append( + log_message + ) + + except Exception as e: + # Check if this is a user cancellation + if isinstance(e, PipelineCancelledException): + # User cancellation - log brief message only, no traceback + error_msg = f"User cancelled during merge {current_file_number}/{total_files}: {file_path}" + logger.warning(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append( + error_msg + ) + else: + # Other exceptions - log with traceback + logger.error(traceback.format_exc()) + error_msg = f"Merging stage failed in document {current_file_number}/{total_files}: {file_path}" + logger.error(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append( + traceback.format_exc() + ) + pipeline_status["history_messages"].append( + error_msg + ) + + # Persistent llm cache with error handling + if self.llm_response_cache: + try: + await self.llm_response_cache.index_done_callback() + except Exception as persist_error: + logger.error( + f"Failed to persist LLM cache: {persist_error}" + ) + + # Record processing end time for failed case + processing_end_time = int(time.time()) + + # Update document status to failed + await self.doc_status.upsert( + { + doc_id: { + "status": DocStatus.FAILED, + "error_msg": str(e), + "content_summary": status_doc.content_summary, + "content_length": status_doc.content_length, + "created_at": status_doc.created_at, + "updated_at": datetime.now().isoformat(), + "file_path": file_path, + "track_id": status_doc.track_id, # Preserve existing track_id + "metadata": { + "processing_start_time": processing_start_time, + "processing_end_time": processing_end_time, + }, + } + } + ) + + # Create processing tasks for all documents + doc_tasks = [] + for doc_id, status_doc in to_process_docs.items(): + doc_tasks.append( + process_document( + doc_id, + status_doc, + split_by_character, + split_by_character_only, + pipeline_status, + pipeline_status_lock, + semaphore, + ) + ) + + # Wait for all document processing to complete + try: + await asyncio.gather(*doc_tasks) + except PipelineCancelledException: + # Cancel all remaining tasks + for task in doc_tasks: + if not task.done(): + task.cancel() + + # Wait for all tasks to complete cancellation + await asyncio.wait(doc_tasks, return_when=asyncio.ALL_COMPLETED) + + # Exit directly (document statuses already updated in process_document) + return + + # Check if there's a pending request to process more documents (with lock) + has_pending_request = False + async with pipeline_status_lock: + has_pending_request = pipeline_status.get("request_pending", False) + if has_pending_request: + # Clear the request flag before checking for more documents + pipeline_status["request_pending"] = False + + if not has_pending_request: + break + + log_message = "Processing additional documents due to pending request" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Check for pending documents again + processing_docs, failed_docs, pending_docs = await asyncio.gather( + self.doc_status.get_docs_by_status(DocStatus.PROCESSING), + self.doc_status.get_docs_by_status(DocStatus.FAILED), + self.doc_status.get_docs_by_status(DocStatus.PENDING), + ) + + to_process_docs = {} + to_process_docs.update(processing_docs) + to_process_docs.update(failed_docs) + to_process_docs.update(pending_docs) + + finally: + log_message = "Enqueued document processing pipeline stopped" + logger.info(log_message) + # Always reset busy status and cancellation flag when done or if an exception occurs (with lock) + async with pipeline_status_lock: + pipeline_status["busy"] = False + pipeline_status["cancellation_requested"] = ( + False # Always reset cancellation flag + ) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + async def _process_extract_entities( + self, chunk: dict[str, Any], pipeline_status=None, pipeline_status_lock=None + ) -> list: + try: + chunk_results = await extract_entities( + chunk, + global_config=asdict(self), + pipeline_status=pipeline_status, + pipeline_status_lock=pipeline_status_lock, + llm_response_cache=self.llm_response_cache, + text_chunks_storage=self.text_chunks, + ) + return chunk_results + except Exception as e: + error_msg = f"Failed to extract entities and relationships: {str(e)}" + logger.error(error_msg) + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append(error_msg) + raise e + + async def _insert_done( + self, pipeline_status=None, pipeline_status_lock=None + ) -> None: + tasks = [ + cast(StorageNameSpace, storage_inst).index_done_callback() + for storage_inst in [ # type: ignore + self.full_docs, + self.doc_status, + self.text_chunks, + self.full_entities, + self.full_relations, + self.entity_chunks, + self.relation_chunks, + self.llm_response_cache, + self.entities_vdb, + self.relationships_vdb, + self.chunks_vdb, + self.chunk_entity_relation_graph, + ] + if storage_inst is not None + ] + await asyncio.gather(*tasks) + + log_message = "In memory DB persist to disk" + logger.info(log_message) + + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + def insert_custom_kg( + self, custom_kg: dict[str, Any], full_doc_id: str = None + ) -> None: + loop = always_get_an_event_loop() + loop.run_until_complete(self.ainsert_custom_kg(custom_kg, full_doc_id)) + + async def ainsert_custom_kg( + self, + custom_kg: dict[str, Any], + full_doc_id: str = None, + ) -> None: + update_storage = False + try: + # Insert chunks into vector storage + all_chunks_data: dict[str, dict[str, str]] = {} + chunk_to_source_map: dict[str, str] = {} + for chunk_data in custom_kg.get("chunks", []): + chunk_content = sanitize_text_for_encoding(chunk_data["content"]) + source_id = chunk_data["source_id"] + file_path = chunk_data.get("file_path", "custom_kg") + tokens = len(self.tokenizer.encode(chunk_content)) + chunk_order_index = ( + 0 + if "chunk_order_index" not in chunk_data.keys() + else chunk_data["chunk_order_index"] + ) + chunk_id = compute_mdhash_id(chunk_content, prefix="chunk-") + + chunk_entry = { + "content": chunk_content, + "source_id": source_id, + "tokens": tokens, + "chunk_order_index": chunk_order_index, + "full_doc_id": full_doc_id + if full_doc_id is not None + else source_id, + "file_path": file_path, + "status": DocStatus.PROCESSED, + } + all_chunks_data[chunk_id] = chunk_entry + chunk_to_source_map[source_id] = chunk_id + update_storage = True + + if all_chunks_data: + await asyncio.gather( + self.chunks_vdb.upsert(all_chunks_data), + self.text_chunks.upsert(all_chunks_data), + ) + + # Insert entities into knowledge graph + all_entities_data: list[dict[str, str]] = [] + for entity_data in custom_kg.get("entities", []): + entity_name = entity_data["entity_name"] + entity_type = entity_data.get("entity_type", "UNKNOWN") + description = entity_data.get("description", "No description provided") + source_chunk_id = entity_data.get("source_id", "UNKNOWN") + source_id = chunk_to_source_map.get(source_chunk_id, "UNKNOWN") + file_path = entity_data.get("file_path", "custom_kg") + + # Log if source_id is UNKNOWN + if source_id == "UNKNOWN": + logger.warning( + f"Entity '{entity_name}' has an UNKNOWN source_id. Please check the source mapping." + ) + + # Prepare node data + node_data: dict[str, str] = { + "entity_id": entity_name, + "entity_type": entity_type, + "description": description, + "source_id": source_id, + "file_path": file_path, + "created_at": int(time.time()), + } + # Insert node data into the knowledge graph + await self.chunk_entity_relation_graph.upsert_node( + entity_name, node_data=node_data + ) + node_data["entity_name"] = entity_name + all_entities_data.append(node_data) + update_storage = True + + # Insert relationships into knowledge graph + all_relationships_data: list[dict[str, str]] = [] + for relationship_data in custom_kg.get("relationships", []): + src_id = relationship_data["src_id"] + tgt_id = relationship_data["tgt_id"] + description = relationship_data["description"] + keywords = relationship_data["keywords"] + weight = relationship_data.get("weight", 1.0) + source_chunk_id = relationship_data.get("source_id", "UNKNOWN") + source_id = chunk_to_source_map.get(source_chunk_id, "UNKNOWN") + file_path = relationship_data.get("file_path", "custom_kg") + + # Log if source_id is UNKNOWN + if source_id == "UNKNOWN": + logger.warning( + f"Relationship from '{src_id}' to '{tgt_id}' has an UNKNOWN source_id. Please check the source mapping." + ) + + # Check if nodes exist in the knowledge graph + for need_insert_id in [src_id, tgt_id]: + if not ( + await self.chunk_entity_relation_graph.has_node(need_insert_id) + ): + await self.chunk_entity_relation_graph.upsert_node( + need_insert_id, + node_data={ + "entity_id": need_insert_id, + "source_id": source_id, + "description": "UNKNOWN", + "entity_type": "UNKNOWN", + "file_path": file_path, + "created_at": int(time.time()), + }, + ) + + # Insert edge into the knowledge graph + await self.chunk_entity_relation_graph.upsert_edge( + src_id, + tgt_id, + edge_data={ + "weight": weight, + "description": description, + "keywords": keywords, + "source_id": source_id, + "file_path": file_path, + "created_at": int(time.time()), + }, + ) + + edge_data: dict[str, str] = { + "src_id": src_id, + "tgt_id": tgt_id, + "description": description, + "keywords": keywords, + "source_id": source_id, + "weight": weight, + "file_path": file_path, + "created_at": int(time.time()), + } + all_relationships_data.append(edge_data) + update_storage = True + + # Insert entities into vector storage with consistent format + data_for_vdb = { + compute_mdhash_id(dp["entity_name"], prefix="ent-"): { + "content": dp["entity_name"] + "\n" + dp["description"], + "entity_name": dp["entity_name"], + "source_id": dp["source_id"], + "description": dp["description"], + "entity_type": dp["entity_type"], + "file_path": dp.get("file_path", "custom_kg"), + } + for dp in all_entities_data + } + await self.entities_vdb.upsert(data_for_vdb) + + # Insert relationships into vector storage with consistent format + data_for_vdb = { + compute_mdhash_id(dp["src_id"] + dp["tgt_id"], prefix="rel-"): { + "src_id": dp["src_id"], + "tgt_id": dp["tgt_id"], + "source_id": dp["source_id"], + "content": f"{dp['keywords']}\t{dp['src_id']}\n{dp['tgt_id']}\n{dp['description']}", + "keywords": dp["keywords"], + "description": dp["description"], + "weight": dp["weight"], + "file_path": dp.get("file_path", "custom_kg"), + } + for dp in all_relationships_data + } + await self.relationships_vdb.upsert(data_for_vdb) + + except Exception as e: + logger.error(f"Error in ainsert_custom_kg: {e}") + raise + finally: + if update_storage: + await self._insert_done() + + def query( + self, + query: str, + param: QueryParam = QueryParam(), + system_prompt: str | None = None, + ) -> str | Iterator[str]: + """ + Perform a sync query. + + Args: + query (str): The query to be executed. + param (QueryParam): Configuration parameters for query execution. + prompt (Optional[str]): Custom prompts for fine-tuned control over the system's behavior. Defaults to None, which uses PROMPTS["rag_response"]. + + Returns: + str: The result of the query execution. + """ + loop = always_get_an_event_loop() + + return loop.run_until_complete(self.aquery(query, param, system_prompt)) # type: ignore + + async def aquery( + self, + query: str, + param: QueryParam = QueryParam(), + system_prompt: str | None = None, + ) -> str | AsyncIterator[str]: + """ + Perform a async query (backward compatibility wrapper). + + This function is now a wrapper around aquery_llm that maintains backward compatibility + by returning only the LLM response content in the original format. + + Args: + query (str): The query to be executed. + param (QueryParam): Configuration parameters for query execution. + If param.model_func is provided, it will be used instead of the global model. + system_prompt (Optional[str]): Custom prompts for fine-tuned control over the system's behavior. Defaults to None, which uses PROMPTS["rag_response"]. + + Returns: + str | AsyncIterator[str]: The LLM response content. + - Non-streaming: Returns str + - Streaming: Returns AsyncIterator[str] + """ + # Call the new aquery_llm function to get complete results + result = await self.aquery_llm(query, param, system_prompt) + + # Extract and return only the LLM response for backward compatibility + llm_response = result.get("llm_response", {}) + + if llm_response.get("is_streaming"): + return llm_response.get("response_iterator") + else: + return llm_response.get("content", "") + + def query_data( + self, + query: str, + param: QueryParam = QueryParam(), + ) -> dict[str, Any]: + """ + Synchronous data retrieval API: returns structured retrieval results without LLM generation. + + This function is the synchronous version of aquery_data, providing the same functionality + for users who prefer synchronous interfaces. + + Args: + query: Query text for retrieval. + param: Query parameters controlling retrieval behavior (same as aquery). + + Returns: + dict[str, Any]: Same structured data result as aquery_data. + """ + loop = always_get_an_event_loop() + return loop.run_until_complete(self.aquery_data(query, param)) + + async def aquery_data( + self, + query: str, + param: QueryParam = QueryParam(), + ) -> dict[str, Any]: + """ + Asynchronous data retrieval API: returns structured retrieval results without LLM generation. + + This function reuses the same logic as aquery but stops before LLM generation, + returning the final processed entities, relationships, and chunks data that would be sent to LLM. + + Args: + query: Query text for retrieval. + param: Query parameters controlling retrieval behavior (same as aquery). + + Returns: + dict[str, Any]: Structured data result in the following format: + + **Success Response:** + ```python + { + "status": "success", + "message": "Query executed successfully", + "data": { + "entities": [ + { + "entity_name": str, # Entity identifier + "entity_type": str, # Entity category/type + "description": str, # Entity description + "source_id": str, # Source chunk references + "file_path": str, # Origin file path + "created_at": str, # Creation timestamp + "reference_id": str # Reference identifier for citations + } + ], + "relationships": [ + { + "src_id": str, # Source entity name + "tgt_id": str, # Target entity name + "description": str, # Relationship description + "keywords": str, # Relationship keywords + "weight": float, # Relationship strength + "source_id": str, # Source chunk references + "file_path": str, # Origin file path + "created_at": str, # Creation timestamp + "reference_id": str # Reference identifier for citations + } + ], + "chunks": [ + { + "content": str, # Document chunk content + "file_path": str, # Origin file path + "chunk_id": str, # Unique chunk identifier + "reference_id": str # Reference identifier for citations + } + ], + "references": [ + { + "reference_id": str, # Reference identifier + "file_path": str # Corresponding file path + } + ] + }, + "metadata": { + "query_mode": str, # Query mode used ("local", "global", "hybrid", "mix", "naive", "bypass") + "keywords": { + "high_level": List[str], # High-level keywords extracted + "low_level": List[str] # Low-level keywords extracted + }, + "processing_info": { + "total_entities_found": int, # Total entities before truncation + "total_relations_found": int, # Total relations before truncation + "entities_after_truncation": int, # Entities after token truncation + "relations_after_truncation": int, # Relations after token truncation + "merged_chunks_count": int, # Chunks before final processing + "final_chunks_count": int # Final chunks in result + } + } + } + ``` + + **Query Mode Differences:** + - **local**: Focuses on entities and their related chunks based on low-level keywords + - **global**: Focuses on relationships and their connected entities based on high-level keywords + - **hybrid**: Combines local and global results using round-robin merging + - **mix**: Includes knowledge graph data plus vector-retrieved document chunks + - **naive**: Only vector-retrieved chunks, entities and relationships arrays are empty + - **bypass**: All data arrays are empty, used for direct LLM queries + + ** processing_info is optional and may not be present in all responses, especially when query result is empty** + + **Failure Response:** + ```python + { + "status": "failure", + "message": str, # Error description + "data": {} # Empty data object + } + ``` + + **Common Failure Cases:** + - Empty query string + - Both high-level and low-level keywords are empty + - Query returns empty dataset + - Missing tokenizer or system configuration errors + + Note: + The function adapts to the new data format from convert_to_user_format where + actual data is nested under the 'data' field, with 'status' and 'message' + fields at the top level. + """ + global_config = asdict(self) + + # Create a copy of param to avoid modifying the original + data_param = QueryParam( + mode=param.mode, + only_need_context=True, # Skip LLM generation, only get context and data + only_need_prompt=False, + response_type=param.response_type, + stream=False, # Data retrieval doesn't need streaming + top_k=param.top_k, + chunk_top_k=param.chunk_top_k, + max_entity_tokens=param.max_entity_tokens, + max_relation_tokens=param.max_relation_tokens, + max_total_tokens=param.max_total_tokens, + hl_keywords=param.hl_keywords, + ll_keywords=param.ll_keywords, + conversation_history=param.conversation_history, + history_turns=param.history_turns, + model_func=param.model_func, + user_prompt=param.user_prompt, + enable_rerank=param.enable_rerank, + ) + + query_result = None + + if data_param.mode in ["local", "global", "hybrid", "mix"]: + logger.debug(f"[aquery_data] Using kg_query for mode: {data_param.mode}") + query_result = await kg_query( + query.strip(), + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + self.text_chunks, + data_param, # Use data_param with only_need_context=True + global_config, + hashing_kv=self.llm_response_cache, + system_prompt=None, + chunks_vdb=self.chunks_vdb, + ) + elif data_param.mode == "naive": + logger.debug(f"[aquery_data] Using naive_query for mode: {data_param.mode}") + query_result = await naive_query( + query.strip(), + self.chunks_vdb, + data_param, # Use data_param with only_need_context=True + global_config, + hashing_kv=self.llm_response_cache, + system_prompt=None, + ) + elif data_param.mode == "bypass": + logger.debug("[aquery_data] Using bypass mode") + # bypass mode returns empty data using convert_to_user_format + empty_raw_data = convert_to_user_format( + [], # no entities + [], # no relationships + [], # no chunks + [], # no references + "bypass", + ) + query_result = QueryResult(content="", raw_data=empty_raw_data) + else: + raise ValueError(f"Unknown mode {data_param.mode}") + + if query_result is None: + no_result_message = "Query returned no results" + if data_param.mode == "naive": + no_result_message = "No relevant document chunks found." + final_data: dict[str, Any] = { + "status": "failure", + "message": no_result_message, + "data": {}, + "metadata": { + "failure_reason": "no_results", + "mode": data_param.mode, + }, + } + logger.info("[aquery_data] Query returned no results.") + else: + # Extract raw_data from QueryResult + final_data = query_result.raw_data or {} + + # Log final result counts - adapt to new data format from convert_to_user_format + if final_data and "data" in final_data: + data_section = final_data["data"] + entities_count = len(data_section.get("entities", [])) + relationships_count = len(data_section.get("relationships", [])) + chunks_count = len(data_section.get("chunks", [])) + logger.debug( + f"[aquery_data] Final result: {entities_count} entities, {relationships_count} relationships, {chunks_count} chunks" + ) + else: + logger.warning("[aquery_data] No data section found in query result") + + await self._query_done() + return final_data + + async def aquery_llm( + self, + query: str, + param: QueryParam = QueryParam(), + system_prompt: str | None = None, + ) -> dict[str, Any]: + """ + Asynchronous complete query API: returns structured retrieval results with LLM generation. + + This function performs a single query operation and returns both structured data and LLM response, + based on the original aquery logic to avoid duplicate calls. + + Args: + query: Query text for retrieval and LLM generation. + param: Query parameters controlling retrieval and LLM behavior. + system_prompt: Optional custom system prompt for LLM generation. + + Returns: + dict[str, Any]: Complete response with structured data and LLM response. + """ + logger.debug(f"[aquery_llm] Query param: {param}") + + global_config = asdict(self) + + try: + query_result = None + + if param.mode in ["local", "global", "hybrid", "mix"]: + query_result = await kg_query( + query.strip(), + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + self.text_chunks, + param, + global_config, + hashing_kv=self.llm_response_cache, + system_prompt=system_prompt, + chunks_vdb=self.chunks_vdb, + ) + elif param.mode == "naive": + query_result = await naive_query( + query.strip(), + self.chunks_vdb, + param, + global_config, + hashing_kv=self.llm_response_cache, + system_prompt=system_prompt, + ) + elif param.mode == "bypass": + # Bypass mode: directly use LLM without knowledge retrieval + use_llm_func = param.model_func or global_config["llm_model_func"] + # Apply higher priority (8) to entity/relation summary tasks + use_llm_func = partial(use_llm_func, _priority=8) + + param.stream = True if param.stream is None else param.stream + response = await use_llm_func( + query.strip(), + system_prompt=system_prompt, + history_messages=param.conversation_history, + enable_cot=True, + stream=param.stream, + ) + if type(response) is str: + return { + "status": "success", + "message": "Bypass mode LLM non streaming response", + "data": {}, + "metadata": {}, + "llm_response": { + "content": response, + "response_iterator": None, + "is_streaming": False, + }, + } + else: + return { + "status": "success", + "message": "Bypass mode LLM streaming response", + "data": {}, + "metadata": {}, + "llm_response": { + "content": None, + "response_iterator": response, + "is_streaming": True, + }, + } + else: + raise ValueError(f"Unknown mode {param.mode}") + + await self._query_done() + + # Check if query_result is None + if query_result is None: + return { + "status": "failure", + "message": "Query returned no results", + "data": {}, + "metadata": { + "failure_reason": "no_results", + "mode": param.mode, + }, + "llm_response": { + "content": PROMPTS["fail_response"], + "response_iterator": None, + "is_streaming": False, + }, + } + + # Extract structured data from query result + raw_data = query_result.raw_data or {} + raw_data["llm_response"] = { + "content": query_result.content + if not query_result.is_streaming + else None, + "response_iterator": query_result.response_iterator + if query_result.is_streaming + else None, + "is_streaming": query_result.is_streaming, + } + + return raw_data + + except Exception as e: + logger.error(f"Query failed: {e}") + # Return error response + return { + "status": "failure", + "message": f"Query failed: {str(e)}", + "data": {}, + "metadata": {}, + "llm_response": { + "content": None, + "response_iterator": None, + "is_streaming": False, + }, + } + + def query_llm( + self, + query: str, + param: QueryParam = QueryParam(), + system_prompt: str | None = None, + ) -> dict[str, Any]: + """ + Synchronous complete query API: returns structured retrieval results with LLM generation. + + This function is the synchronous version of aquery_llm, providing the same functionality + for users who prefer synchronous interfaces. + + Args: + query: Query text for retrieval and LLM generation. + param: Query parameters controlling retrieval and LLM behavior. + system_prompt: Optional custom system prompt for LLM generation. + + Returns: + dict[str, Any]: Same complete response format as aquery_llm. + """ + loop = always_get_an_event_loop() + return loop.run_until_complete(self.aquery_llm(query, param, system_prompt)) + + async def _query_done(self): + await self.llm_response_cache.index_done_callback() + + async def aclear_cache(self) -> None: + """Clear all cache data from the LLM response cache storage. + + This method clears all cached LLM responses regardless of mode. + + Example: + # Clear all cache + await rag.aclear_cache() + """ + if not self.llm_response_cache: + logger.warning("No cache storage configured") + return + + try: + # Clear all cache using drop method + success = await self.llm_response_cache.drop() + if success: + logger.info("Cleared all cache") + else: + logger.warning("Failed to clear all cache") + + await self.llm_response_cache.index_done_callback() + + except Exception as e: + logger.error(f"Error while clearing cache: {e}") + + def clear_cache(self) -> None: + """Synchronous version of aclear_cache.""" + return always_get_an_event_loop().run_until_complete(self.aclear_cache()) + + async def get_docs_by_status( + self, status: DocStatus + ) -> dict[str, DocProcessingStatus]: + """Get documents by status + + Returns: + Dict with document id is keys and document status is values + """ + return await self.doc_status.get_docs_by_status(status) + + async def aget_docs_by_ids( + self, ids: str | list[str] + ) -> dict[str, DocProcessingStatus]: + """Retrieves the processing status for one or more documents by their IDs. + + Args: + ids: A single document ID (string) or a list of document IDs (list of strings). + + Returns: + A dictionary where keys are the document IDs for which a status was found, + and values are the corresponding DocProcessingStatus objects. IDs that + are not found in the storage will be omitted from the result dictionary. + """ + if isinstance(ids, str): + # Ensure input is always a list of IDs for uniform processing + id_list = [ids] + elif ( + ids is None + ): # Handle potential None input gracefully, although type hint suggests str/list + logger.warning( + "aget_docs_by_ids called with None input, returning empty dict." + ) + return {} + else: + # Assume input is already a list if not a string + id_list = ids + + # Return early if the final list of IDs is empty + if not id_list: + logger.debug("aget_docs_by_ids called with an empty list of IDs.") + return {} + + # Create tasks to fetch document statuses concurrently using the doc_status storage + tasks = [self.doc_status.get_by_id(doc_id) for doc_id in id_list] + # Execute tasks concurrently and gather the results. Results maintain order. + # Type hint indicates results can be DocProcessingStatus or None if not found. + results_list: list[Optional[DocProcessingStatus]] = await asyncio.gather(*tasks) + + # Build the result dictionary, mapping found IDs to their statuses + found_statuses: dict[str, DocProcessingStatus] = {} + # Keep track of IDs for which no status was found (for logging purposes) + not_found_ids: list[str] = [] + + # Iterate through the results, correlating them back to the original IDs + for i, status_obj in enumerate(results_list): + doc_id = id_list[ + i + ] # Get the original ID corresponding to this result index + if status_obj: + # If a status object was returned (not None), add it to the result dict + found_statuses[doc_id] = status_obj + else: + # If status_obj is None, the document ID was not found in storage + not_found_ids.append(doc_id) + + # Log a warning if any of the requested document IDs were not found + if not_found_ids: + logger.warning( + f"Document statuses not found for the following IDs: {not_found_ids}" + ) + + # Return the dictionary containing statuses only for the found document IDs + return found_statuses + + async def adelete_by_doc_id( + self, doc_id: str, delete_llm_cache: bool = False + ) -> DeletionResult: + """Delete a document and all its related data, including chunks, graph elements. + + This method orchestrates a comprehensive deletion process for a given document ID. + It ensures that not only the document itself but also all its derived and associated + data across different storage layers are removed or rebuiled. If entities or relationships + are partially affected, they will be rebuilded using LLM cached from remaining documents. + + Args: + doc_id (str): The unique identifier of the document to be deleted. + delete_llm_cache (bool): Whether to delete cached LLM extraction results + associated with the document. Defaults to False. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + - `status` (str): "success", "not_found", or "failure". + - `doc_id` (str): The ID of the document attempted to be deleted. + - `message` (str): A summary of the operation's result. + - `status_code` (int): HTTP status code (e.g., 200, 404, 500). + - `file_path` (str | None): The file path of the deleted document, if available. + """ + deletion_operations_started = False + original_exception = None + doc_llm_cache_ids: list[str] = [] + + # Get pipeline status shared data and lock for status updates + pipeline_status = await get_namespace_data("pipeline_status") + pipeline_status_lock = get_pipeline_status_lock() + + async with pipeline_status_lock: + log_message = f"Starting deletion process for document {doc_id}" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + try: + # 1. Get the document status and related data + doc_status_data = await self.doc_status.get_by_id(doc_id) + file_path = doc_status_data.get("file_path") if doc_status_data else None + if not doc_status_data: + logger.warning(f"Document {doc_id} not found") + return DeletionResult( + status="not_found", + doc_id=doc_id, + message=f"Document {doc_id} not found.", + status_code=404, + file_path="", + ) + + # Check document status and log warning for non-completed documents + raw_status = doc_status_data.get("status") + try: + doc_status = DocStatus(raw_status) + except ValueError: + doc_status = raw_status + + if doc_status != DocStatus.PROCESSED: + if doc_status == DocStatus.PENDING: + warning_msg = ( + f"Deleting {doc_id} {file_path}(previous status: PENDING)" + ) + elif doc_status == DocStatus.PROCESSING: + warning_msg = ( + f"Deleting {doc_id} {file_path}(previous status: PROCESSING)" + ) + elif doc_status == DocStatus.PREPROCESSED: + warning_msg = ( + f"Deleting {doc_id} {file_path}(previous status: PREPROCESSED)" + ) + elif doc_status == DocStatus.FAILED: + warning_msg = ( + f"Deleting {doc_id} {file_path}(previous status: FAILED)" + ) + else: + status_text = ( + doc_status.value + if isinstance(doc_status, DocStatus) + else str(doc_status) + ) + warning_msg = ( + f"Deleting {doc_id} {file_path}(previous status: {status_text})" + ) + logger.info(warning_msg) + # Update pipeline status for monitoring + async with pipeline_status_lock: + pipeline_status["latest_message"] = warning_msg + pipeline_status["history_messages"].append(warning_msg) + + # 2. Get chunk IDs from document status + chunk_ids = set(doc_status_data.get("chunks_list", [])) + + if not chunk_ids: + logger.warning(f"No chunks found for document {doc_id}") + # Mark that deletion operations have started + deletion_operations_started = True + try: + # Still need to delete the doc status and full doc + await self.full_docs.delete([doc_id]) + await self.doc_status.delete([doc_id]) + except Exception as e: + logger.error( + f"Failed to delete document {doc_id} with no chunks: {e}" + ) + raise Exception(f"Failed to delete document entry: {e}") from e + + async with pipeline_status_lock: + log_message = ( + f"Document deleted without associated chunks: {doc_id}" + ) + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + return DeletionResult( + status="success", + doc_id=doc_id, + message=log_message, + status_code=200, + file_path=file_path, + ) + + # Mark that deletion operations have started + deletion_operations_started = True + + if delete_llm_cache and chunk_ids: + if not self.llm_response_cache: + logger.info( + "Skipping LLM cache collection for document %s because cache storage is unavailable", + doc_id, + ) + elif not self.text_chunks: + logger.info( + "Skipping LLM cache collection for document %s because text chunk storage is unavailable", + doc_id, + ) + else: + try: + chunk_data_list = await self.text_chunks.get_by_ids( + list(chunk_ids) + ) + seen_cache_ids: set[str] = set() + for chunk_data in chunk_data_list: + if not chunk_data or not isinstance(chunk_data, dict): + continue + cache_ids = chunk_data.get("llm_cache_list", []) + if not isinstance(cache_ids, list): + continue + for cache_id in cache_ids: + if ( + isinstance(cache_id, str) + and cache_id + and cache_id not in seen_cache_ids + ): + doc_llm_cache_ids.append(cache_id) + seen_cache_ids.add(cache_id) + if doc_llm_cache_ids: + logger.info( + "Collected %d LLM cache entries for document %s", + len(doc_llm_cache_ids), + doc_id, + ) + else: + logger.info( + "No LLM cache entries found for document %s", doc_id + ) + except Exception as cache_collect_error: + logger.error( + "Failed to collect LLM cache ids for document %s: %s", + doc_id, + cache_collect_error, + ) + raise Exception( + f"Failed to collect LLM cache ids for document {doc_id}: {cache_collect_error}" + ) from cache_collect_error + + # 4. Analyze entities and relationships that will be affected + entities_to_delete = set() + entities_to_rebuild = {} # entity_name -> remaining chunk id list + relationships_to_delete = set() + relationships_to_rebuild = {} # (src, tgt) -> remaining chunk id list + entity_chunk_updates: dict[str, list[str]] = {} + relation_chunk_updates: dict[tuple[str, str], list[str]] = {} + + try: + # Get affected entities and relations from full_entities and full_relations storage + doc_entities_data = await self.full_entities.get_by_id(doc_id) + doc_relations_data = await self.full_relations.get_by_id(doc_id) + + affected_nodes = [] + affected_edges = [] + + # Get entity data from graph storage using entity names from full_entities + if doc_entities_data and "entity_names" in doc_entities_data: + entity_names = doc_entities_data["entity_names"] + # get_nodes_batch returns dict[str, dict], need to convert to list[dict] + nodes_dict = await self.chunk_entity_relation_graph.get_nodes_batch( + entity_names + ) + for entity_name in entity_names: + node_data = nodes_dict.get(entity_name) + if node_data: + # Ensure compatibility with existing logic that expects "id" field + if "id" not in node_data: + node_data["id"] = entity_name + affected_nodes.append(node_data) + + # Get relation data from graph storage using relation pairs from full_relations + if doc_relations_data and "relation_pairs" in doc_relations_data: + relation_pairs = doc_relations_data["relation_pairs"] + edge_pairs_dicts = [ + {"src": pair[0], "tgt": pair[1]} for pair in relation_pairs + ] + # get_edges_batch returns dict[tuple[str, str], dict], need to convert to list[dict] + edges_dict = await self.chunk_entity_relation_graph.get_edges_batch( + edge_pairs_dicts + ) + + for pair in relation_pairs: + src, tgt = pair[0], pair[1] + edge_key = (src, tgt) + edge_data = edges_dict.get(edge_key) + if edge_data: + # Ensure compatibility with existing logic that expects "source" and "target" fields + if "source" not in edge_data: + edge_data["source"] = src + if "target" not in edge_data: + edge_data["target"] = tgt + affected_edges.append(edge_data) + + except Exception as e: + logger.error(f"Failed to analyze affected graph elements: {e}") + raise Exception(f"Failed to analyze graph dependencies: {e}") from e + + try: + # Process entities + for node_data in affected_nodes: + node_label = node_data.get("entity_id") + if not node_label: + continue + + existing_sources: list[str] = [] + if self.entity_chunks: + stored_chunks = await self.entity_chunks.get_by_id(node_label) + if stored_chunks and isinstance(stored_chunks, dict): + existing_sources = [ + chunk_id + for chunk_id in stored_chunks.get("chunk_ids", []) + if chunk_id + ] + + if not existing_sources and node_data.get("source_id"): + existing_sources = [ + chunk_id + for chunk_id in node_data["source_id"].split( + GRAPH_FIELD_SEP + ) + if chunk_id + ] + + if not existing_sources: + # No chunk references means this entity should be deleted + entities_to_delete.add(node_label) + entity_chunk_updates[node_label] = [] + continue + + remaining_sources = subtract_source_ids(existing_sources, chunk_ids) + + if not remaining_sources: + entities_to_delete.add(node_label) + entity_chunk_updates[node_label] = [] + elif remaining_sources != existing_sources: + entities_to_rebuild[node_label] = remaining_sources + entity_chunk_updates[node_label] = remaining_sources + else: + logger.info(f"Untouch entity: {node_label}") + + async with pipeline_status_lock: + log_message = f"Found {len(entities_to_rebuild)} affected entities" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Process relationships + for edge_data in affected_edges: + # source target is not in normalize order in graph db property + src = edge_data.get("source") + tgt = edge_data.get("target") + + if not src or not tgt or "source_id" not in edge_data: + continue + + edge_tuple = tuple(sorted((src, tgt))) + if ( + edge_tuple in relationships_to_delete + or edge_tuple in relationships_to_rebuild + ): + continue + + existing_sources: list[str] = [] + if self.relation_chunks: + storage_key = make_relation_chunk_key(src, tgt) + stored_chunks = await self.relation_chunks.get_by_id( + storage_key + ) + if stored_chunks and isinstance(stored_chunks, dict): + existing_sources = [ + chunk_id + for chunk_id in stored_chunks.get("chunk_ids", []) + if chunk_id + ] + + if not existing_sources: + existing_sources = [ + chunk_id + for chunk_id in edge_data["source_id"].split( + GRAPH_FIELD_SEP + ) + if chunk_id + ] + + if not existing_sources: + # No chunk references means this relationship should be deleted + relationships_to_delete.add(edge_tuple) + relation_chunk_updates[edge_tuple] = [] + continue + + remaining_sources = subtract_source_ids(existing_sources, chunk_ids) + + if not remaining_sources: + relationships_to_delete.add(edge_tuple) + relation_chunk_updates[edge_tuple] = [] + elif remaining_sources != existing_sources: + relationships_to_rebuild[edge_tuple] = remaining_sources + relation_chunk_updates[edge_tuple] = remaining_sources + else: + logger.info(f"Untouch relation: {edge_tuple}") + + async with pipeline_status_lock: + log_message = ( + f"Found {len(relationships_to_rebuild)} affected relations" + ) + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + current_time = int(time.time()) + + if entity_chunk_updates and self.entity_chunks: + entity_upsert_payload = {} + for entity_name, remaining in entity_chunk_updates.items(): + if not remaining: + # Empty entities are deleted alongside graph nodes later + continue + entity_upsert_payload[entity_name] = { + "chunk_ids": remaining, + "count": len(remaining), + "updated_at": current_time, + } + if entity_upsert_payload: + await self.entity_chunks.upsert(entity_upsert_payload) + + if relation_chunk_updates and self.relation_chunks: + relation_upsert_payload = {} + for edge_tuple, remaining in relation_chunk_updates.items(): + if not remaining: + # Empty relations are deleted alongside graph edges later + continue + storage_key = make_relation_chunk_key(*edge_tuple) + relation_upsert_payload[storage_key] = { + "chunk_ids": remaining, + "count": len(remaining), + "updated_at": current_time, + } + + if relation_upsert_payload: + await self.relation_chunks.upsert(relation_upsert_payload) + + except Exception as e: + logger.error(f"Failed to process graph analysis results: {e}") + raise Exception(f"Failed to process graph dependencies: {e}") from e + + # Use graph database lock to prevent dirty read + graph_db_lock = get_graph_db_lock(enable_logging=False) + async with graph_db_lock: + # 5. Delete chunks from storage + if chunk_ids: + try: + await self.chunks_vdb.delete(chunk_ids) + await self.text_chunks.delete(chunk_ids) + + async with pipeline_status_lock: + log_message = f"Successfully deleted {len(chunk_ids)} chunks from storage" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + except Exception as e: + logger.error(f"Failed to delete chunks: {e}") + raise Exception(f"Failed to delete document chunks: {e}") from e + + # 6. Delete relationships that have no remaining sources + if relationships_to_delete: + try: + # Delete from relation vdb + rel_ids_to_delete = [] + for src, tgt in relationships_to_delete: + rel_ids_to_delete.extend( + [ + compute_mdhash_id(src + tgt, prefix="rel-"), + compute_mdhash_id(tgt + src, prefix="rel-"), + ] + ) + await self.relationships_vdb.delete(rel_ids_to_delete) + + # Delete from graph + await self.chunk_entity_relation_graph.remove_edges( + list(relationships_to_delete) + ) + + # Delete from relation_chunks storage + if self.relation_chunks: + relation_storage_keys = [ + make_relation_chunk_key(src, tgt) + for src, tgt in relationships_to_delete + ] + await self.relation_chunks.delete(relation_storage_keys) + + async with pipeline_status_lock: + log_message = f"Successfully deleted {len(relationships_to_delete)} relations" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + except Exception as e: + logger.error(f"Failed to delete relationships: {e}") + raise Exception(f"Failed to delete relationships: {e}") from e + + # 7. Delete entities that have no remaining sources + if entities_to_delete: + try: + # Batch get all edges for entities to avoid N+1 query problem + nodes_edges_dict = await self.chunk_entity_relation_graph.get_nodes_edges_batch( + list(entities_to_delete) + ) + + # Debug: Check and log all edges before deleting nodes + edges_to_delete = set() + edges_still_exist = 0 + + for entity, edges in nodes_edges_dict.items(): + if edges: + for src, tgt in edges: + # Normalize edge representation (sorted for consistency) + edge_tuple = tuple(sorted((src, tgt))) + edges_to_delete.add(edge_tuple) + + if ( + src in entities_to_delete + and tgt in entities_to_delete + ): + logger.warning( + f"Edge still exists: {src} <-> {tgt}" + ) + elif src in entities_to_delete: + logger.warning( + f"Edge still exists: {src} --> {tgt}" + ) + else: + logger.warning( + f"Edge still exists: {src} <-- {tgt}" + ) + edges_still_exist += 1 + + if edges_still_exist: + logger.warning( + f"⚠️ {edges_still_exist} entities still has edges before deletion" + ) + + # Clean residual edges from VDB and storage before deleting nodes + if edges_to_delete: + # Delete from relationships_vdb + rel_ids_to_delete = [] + for src, tgt in edges_to_delete: + rel_ids_to_delete.extend( + [ + compute_mdhash_id(src + tgt, prefix="rel-"), + compute_mdhash_id(tgt + src, prefix="rel-"), + ] + ) + await self.relationships_vdb.delete(rel_ids_to_delete) + + # Delete from relation_chunks storage + if self.relation_chunks: + relation_storage_keys = [ + make_relation_chunk_key(src, tgt) + for src, tgt in edges_to_delete + ] + await self.relation_chunks.delete(relation_storage_keys) + + logger.info( + f"Cleaned {len(edges_to_delete)} residual edges from VDB and chunk-tracking storage" + ) + + # Delete from graph (edges will be auto-deleted with nodes) + await self.chunk_entity_relation_graph.remove_nodes( + list(entities_to_delete) + ) + + # Delete from vector vdb + entity_vdb_ids = [ + compute_mdhash_id(entity, prefix="ent-") + for entity in entities_to_delete + ] + await self.entities_vdb.delete(entity_vdb_ids) + + # Delete from entity_chunks storage + if self.entity_chunks: + await self.entity_chunks.delete(list(entities_to_delete)) + + async with pipeline_status_lock: + log_message = f"Successfully deleted {len(entities_to_delete)} entities" + logger.info(log_message) + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + except Exception as e: + logger.error(f"Failed to delete entities: {e}") + raise Exception(f"Failed to delete entities: {e}") from e + + # Persist changes to graph database before releasing graph database lock + await self._insert_done() + + # 8. Rebuild entities and relationships from remaining chunks + if entities_to_rebuild or relationships_to_rebuild: + try: + await rebuild_knowledge_from_chunks( + entities_to_rebuild=entities_to_rebuild, + relationships_to_rebuild=relationships_to_rebuild, + knowledge_graph_inst=self.chunk_entity_relation_graph, + entities_vdb=self.entities_vdb, + relationships_vdb=self.relationships_vdb, + text_chunks_storage=self.text_chunks, + llm_response_cache=self.llm_response_cache, + global_config=asdict(self), + pipeline_status=pipeline_status, + pipeline_status_lock=pipeline_status_lock, + entity_chunks_storage=self.entity_chunks, + relation_chunks_storage=self.relation_chunks, + ) + + except Exception as e: + logger.error(f"Failed to rebuild knowledge from chunks: {e}") + raise Exception(f"Failed to rebuild knowledge graph: {e}") from e + + # 9. Delete from full_entities and full_relations storage + try: + await self.full_entities.delete([doc_id]) + await self.full_relations.delete([doc_id]) + except Exception as e: + logger.error(f"Failed to delete from full_entities/full_relations: {e}") + raise Exception( + f"Failed to delete from full_entities/full_relations: {e}" + ) from e + + # 10. Delete original document and status + try: + await self.full_docs.delete([doc_id]) + await self.doc_status.delete([doc_id]) + except Exception as e: + logger.error(f"Failed to delete document and status: {e}") + raise Exception(f"Failed to delete document and status: {e}") from e + + if delete_llm_cache and doc_llm_cache_ids and self.llm_response_cache: + try: + await self.llm_response_cache.delete(doc_llm_cache_ids) + cache_log_message = f"Successfully deleted {len(doc_llm_cache_ids)} LLM cache entries for document {doc_id}" + logger.info(cache_log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = cache_log_message + pipeline_status["history_messages"].append(cache_log_message) + log_message = cache_log_message + except Exception as cache_delete_error: + log_message = f"Failed to delete LLM cache for document {doc_id}: {cache_delete_error}" + logger.error(log_message) + logger.error(traceback.format_exc()) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + return DeletionResult( + status="success", + doc_id=doc_id, + message=log_message, + status_code=200, + file_path=file_path, + ) + + except Exception as e: + original_exception = e + error_message = f"Error while deleting document {doc_id}: {e}" + logger.error(error_message) + logger.error(traceback.format_exc()) + return DeletionResult( + status="fail", + doc_id=doc_id, + message=error_message, + status_code=500, + file_path=file_path, + ) + + finally: + # ALWAYS ensure persistence if any deletion operations were started + if deletion_operations_started: + try: + await self._insert_done() + except Exception as persistence_error: + persistence_error_msg = f"Failed to persist data after deletion attempt for {doc_id}: {persistence_error}" + logger.error(persistence_error_msg) + logger.error(traceback.format_exc()) + + # If there was no original exception, this persistence error becomes the main error + if original_exception is None: + return DeletionResult( + status="fail", + doc_id=doc_id, + message=f"Deletion completed but failed to persist changes: {persistence_error}", + status_code=500, + file_path=file_path, + ) + # If there was an original exception, log the persistence error but don't override the original error + # The original error result was already returned in the except block + else: + logger.debug( + f"No deletion operations were started for document {doc_id}, skipping persistence" + ) + + async def adelete_by_entity(self, entity_name: str) -> DeletionResult: + """Asynchronously delete an entity and all its relationships. + + Args: + entity_name: Name of the entity to delete. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + """ + from lightrag.utils_graph import adelete_by_entity + + return await adelete_by_entity( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + entity_name, + ) + + def delete_by_entity(self, entity_name: str) -> DeletionResult: + """Synchronously delete an entity and all its relationships. + + Args: + entity_name: Name of the entity to delete. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + """ + loop = always_get_an_event_loop() + return loop.run_until_complete(self.adelete_by_entity(entity_name)) + + async def adelete_by_relation( + self, source_entity: str, target_entity: str + ) -> DeletionResult: + """Asynchronously delete a relation between two entities. + + Args: + source_entity: Name of the source entity. + target_entity: Name of the target entity. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + """ + from lightrag.utils_graph import adelete_by_relation + + return await adelete_by_relation( + self.chunk_entity_relation_graph, + self.relationships_vdb, + source_entity, + target_entity, + ) + + def delete_by_relation( + self, source_entity: str, target_entity: str + ) -> DeletionResult: + """Synchronously delete a relation between two entities. + + Args: + source_entity: Name of the source entity. + target_entity: Name of the target entity. + + Returns: + DeletionResult: An object containing the outcome of the deletion process. + """ + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.adelete_by_relation(source_entity, target_entity) + ) + + async def get_processing_status(self) -> dict[str, int]: + """Get current document processing status counts + + Returns: + Dict with counts for each status + """ + return await self.doc_status.get_status_counts() + + async def aget_docs_by_track_id( + self, track_id: str + ) -> dict[str, DocProcessingStatus]: + """Get documents by track_id + + Args: + track_id: The tracking ID to search for + + Returns: + Dict with document id as keys and document status as values + """ + return await self.doc_status.get_docs_by_track_id(track_id) + + async def get_entity_info( + self, entity_name: str, include_vector_data: bool = False + ) -> dict[str, str | None | dict[str, str]]: + """Get detailed information of an entity""" + from lightrag.utils_graph import get_entity_info + + return await get_entity_info( + self.chunk_entity_relation_graph, + self.entities_vdb, + entity_name, + include_vector_data, + ) + + async def get_relation_info( + self, src_entity: str, tgt_entity: str, include_vector_data: bool = False + ) -> dict[str, str | None | dict[str, str]]: + """Get detailed information of a relationship""" + from lightrag.utils_graph import get_relation_info + + return await get_relation_info( + self.chunk_entity_relation_graph, + self.relationships_vdb, + src_entity, + tgt_entity, + include_vector_data, + ) + + async def aedit_entity( + self, + entity_name: str, + updated_data: dict[str, str], + allow_rename: bool = True, + allow_merge: bool = False, + ) -> dict[str, Any]: + """Asynchronously edit entity information. + + Updates entity information in the knowledge graph and re-embeds the entity in the vector database. + Also synchronizes entity_chunks_storage and relation_chunks_storage to track chunk references. + + Args: + entity_name: Name of the entity to edit + updated_data: Dictionary containing updated attributes, e.g. {"description": "new description", "entity_type": "new type"} + allow_rename: Whether to allow entity renaming, defaults to True + allow_merge: Whether to merge into an existing entity when renaming to an existing name + + Returns: + Dictionary containing updated entity information + """ + from lightrag.utils_graph import aedit_entity + + return await aedit_entity( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + entity_name, + updated_data, + allow_rename, + allow_merge, + self.entity_chunks, + self.relation_chunks, + ) + + def edit_entity( + self, + entity_name: str, + updated_data: dict[str, str], + allow_rename: bool = True, + allow_merge: bool = False, + ) -> dict[str, Any]: + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.aedit_entity(entity_name, updated_data, allow_rename, allow_merge) + ) + + async def aedit_relation( + self, source_entity: str, target_entity: str, updated_data: dict[str, Any] + ) -> dict[str, Any]: + """Asynchronously edit relation information. + + Updates relation (edge) information in the knowledge graph and re-embeds the relation in the vector database. + Also synchronizes the relation_chunks_storage to track which chunks reference this relation. + + Args: + source_entity: Name of the source entity + target_entity: Name of the target entity + updated_data: Dictionary containing updated attributes, e.g. {"description": "new description", "keywords": "new keywords"} + + Returns: + Dictionary containing updated relation information + """ + from lightrag.utils_graph import aedit_relation + + return await aedit_relation( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + source_entity, + target_entity, + updated_data, + self.relation_chunks, + ) + + def edit_relation( + self, source_entity: str, target_entity: str, updated_data: dict[str, Any] + ) -> dict[str, Any]: + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.aedit_relation(source_entity, target_entity, updated_data) + ) + + async def acreate_entity( + self, entity_name: str, entity_data: dict[str, Any] + ) -> dict[str, Any]: + """Asynchronously create a new entity. + + Creates a new entity in the knowledge graph and adds it to the vector database. + + Args: + entity_name: Name of the new entity + entity_data: Dictionary containing entity attributes, e.g. {"description": "description", "entity_type": "type"} + + Returns: + Dictionary containing created entity information + """ + from lightrag.utils_graph import acreate_entity + + return await acreate_entity( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + entity_name, + entity_data, + ) + + def create_entity( + self, entity_name: str, entity_data: dict[str, Any] + ) -> dict[str, Any]: + loop = always_get_an_event_loop() + return loop.run_until_complete(self.acreate_entity(entity_name, entity_data)) + + async def acreate_relation( + self, source_entity: str, target_entity: str, relation_data: dict[str, Any] + ) -> dict[str, Any]: + """Asynchronously create a new relation between entities. + + Creates a new relation (edge) in the knowledge graph and adds it to the vector database. + + Args: + source_entity: Name of the source entity + target_entity: Name of the target entity + relation_data: Dictionary containing relation attributes, e.g. {"description": "description", "keywords": "keywords"} + + Returns: + Dictionary containing created relation information + """ + from lightrag.utils_graph import acreate_relation + + return await acreate_relation( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + source_entity, + target_entity, + relation_data, + ) + + def create_relation( + self, source_entity: str, target_entity: str, relation_data: dict[str, Any] + ) -> dict[str, Any]: + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.acreate_relation(source_entity, target_entity, relation_data) + ) + + async def amerge_entities( + self, + source_entities: list[str], + target_entity: str, + merge_strategy: dict[str, str] = None, + target_entity_data: dict[str, Any] = None, + ) -> dict[str, Any]: + """Asynchronously merge multiple entities into one entity. + + Merges multiple source entities into a target entity, handling all relationships, + and updating both the knowledge graph and vector database. + + Args: + source_entities: List of source entity names to merge + target_entity: Name of the target entity after merging + merge_strategy: Merge strategy configuration, e.g. {"description": "concatenate", "entity_type": "keep_first"} + Supported strategies: + - "concatenate": Concatenate all values (for text fields) + - "keep_first": Keep the first non-empty value + - "keep_last": Keep the last non-empty value + - "join_unique": Join all unique values (for fields separated by delimiter) + target_entity_data: Dictionary of specific values to set for the target entity, + overriding any merged values, e.g. {"description": "custom description", "entity_type": "PERSON"} + + Returns: + Dictionary containing the merged entity information + """ + from lightrag.utils_graph import amerge_entities + + return await amerge_entities( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + source_entities, + target_entity, + merge_strategy, + target_entity_data, + self.entity_chunks, + self.relation_chunks, + ) + + def merge_entities( + self, + source_entities: list[str], + target_entity: str, + merge_strategy: dict[str, str] = None, + target_entity_data: dict[str, Any] = None, + ) -> dict[str, Any]: + loop = always_get_an_event_loop() + return loop.run_until_complete( + self.amerge_entities( + source_entities, target_entity, merge_strategy, target_entity_data + ) + ) + + async def aexport_data( + self, + output_path: str, + file_format: Literal["csv", "excel", "md", "txt"] = "csv", + include_vector_data: bool = False, + ) -> None: + """ + Asynchronously exports all entities, relations, and relationships to various formats. + Args: + output_path: The path to the output file (including extension). + file_format: Output format - "csv", "excel", "md", "txt". + - csv: Comma-separated values file + - excel: Microsoft Excel file with multiple sheets + - md: Markdown tables + - txt: Plain text formatted output + - table: Print formatted tables to console + include_vector_data: Whether to include data from the vector database. + """ + from lightrag.utils import aexport_data as utils_aexport_data + + await utils_aexport_data( + self.chunk_entity_relation_graph, + self.entities_vdb, + self.relationships_vdb, + output_path, + file_format, + include_vector_data, + ) + + def export_data( + self, + output_path: str, + file_format: Literal["csv", "excel", "md", "txt"] = "csv", + include_vector_data: bool = False, + ) -> None: + """ + Synchronously exports all entities, relations, and relationships to various formats. + Args: + output_path: The path to the output file (including extension). + file_format: Output format - "csv", "excel", "md", "txt". + - csv: Comma-separated values file + - excel: Microsoft Excel file with multiple sheets + - md: Markdown tables + - txt: Plain text formatted output + - table: Print formatted tables to console + include_vector_data: Whether to include data from the vector database. + """ + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + loop.run_until_complete( + self.aexport_data(output_path, file_format, include_vector_data) + ) diff --git a/LightRAG/lightrag/llm/__init__.py b/LightRAG/lightrag/llm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LightRAG/lightrag/llm/anthropic.py b/LightRAG/lightrag/llm/anthropic.py new file mode 100644 index 00000000..fe18300c --- /dev/null +++ b/LightRAG/lightrag/llm/anthropic.py @@ -0,0 +1,333 @@ +from ..utils import verbose_debug, VERBOSE_DEBUG +import sys +import os +import logging +import numpy as np +from typing import Any, Union, AsyncIterator +import pipmaster as pm # Pipmaster for dynamic library install + +if sys.version_info < (3, 9): + from typing import AsyncIterator +else: + from collections.abc import AsyncIterator + +# Install Anthropic SDK if not present +if not pm.is_installed("anthropic"): + pm.install("anthropic") + +# Add Voyage AI import +if not pm.is_installed("voyageai"): + pm.install("voyageai") +import voyageai + +from anthropic import ( + AsyncAnthropic, + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.utils import ( + safe_unicode_decode, + logger, +) +from lightrag.api import __api_version__ + + +# Custom exception for retry mechanism +class InvalidResponseError(Exception): + """Custom exception class for triggering retry mechanism""" + + pass + + +# Core Anthropic completion function with retry +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError, InvalidResponseError) + ), +) +async def anthropic_complete_if_cache( + model: str, + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + base_url: str | None = None, + api_key: str | None = None, + **kwargs: Any, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + if enable_cot: + logger.debug( + "enable_cot=True is not supported for the Anthropic API and will be ignored." + ) + if not api_key: + api_key = os.environ.get("ANTHROPIC_API_KEY") + + default_headers = { + "User-Agent": f"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_8) LightRAG/{__api_version__}", + "Content-Type": "application/json", + } + + # Set logger level to INFO when VERBOSE_DEBUG is off + if not VERBOSE_DEBUG and logger.level == logging.DEBUG: + logging.getLogger("anthropic").setLevel(logging.INFO) + + kwargs.pop("hashing_kv", None) + kwargs.pop("keyword_extraction", None) + timeout = kwargs.pop("timeout", None) + + anthropic_async_client = ( + AsyncAnthropic( + default_headers=default_headers, api_key=api_key, timeout=timeout + ) + if base_url is None + else AsyncAnthropic( + base_url=base_url, + default_headers=default_headers, + api_key=api_key, + timeout=timeout, + ) + ) + + messages: list[dict[str, Any]] = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + logger.debug("===== Sending Query to Anthropic LLM =====") + logger.debug(f"Model: {model} Base URL: {base_url}") + logger.debug(f"Additional kwargs: {kwargs}") + verbose_debug(f"Query: {prompt}") + verbose_debug(f"System prompt: {system_prompt}") + + try: + response = await anthropic_async_client.messages.create( + model=model, messages=messages, stream=True, **kwargs + ) + except APIConnectionError as e: + logger.error(f"Anthropic API Connection Error: {e}") + raise + except RateLimitError as e: + logger.error(f"Anthropic API Rate Limit Error: {e}") + raise + except APITimeoutError as e: + logger.error(f"Anthropic API Timeout Error: {e}") + raise + except Exception as e: + logger.error( + f"Anthropic API Call Failed,\nModel: {model},\nParams: {kwargs}, Got: {e}" + ) + raise + + async def stream_response(): + try: + async for event in response: + content = ( + event.delta.text + if hasattr(event, "delta") and event.delta.text + else None + ) + if content is None: + continue + if r"\u" in content: + content = safe_unicode_decode(content.encode("utf-8")) + yield content + except Exception as e: + logger.error(f"Error in stream response: {str(e)}") + raise + + return stream_response() + + +# Generic Anthropic completion function +async def anthropic_complete( + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + **kwargs: Any, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + return await anthropic_complete_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +# Claude 3 Opus specific completion +async def claude_3_opus_complete( + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + **kwargs: Any, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + return await anthropic_complete_if_cache( + "claude-3-opus-20240229", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +# Claude 3 Sonnet specific completion +async def claude_3_sonnet_complete( + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + **kwargs: Any, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + return await anthropic_complete_if_cache( + "claude-3-sonnet-20240229", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +# Claude 3 Haiku specific completion +async def claude_3_haiku_complete( + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + **kwargs: Any, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + return await anthropic_complete_if_cache( + "claude-3-haiku-20240307", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +# Embedding function (placeholder, as Anthropic does not provide embeddings) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def anthropic_embed( + texts: list[str], + model: str = "voyage-3", # Default to voyage-3 as a good general-purpose model + base_url: str = None, + api_key: str = None, +) -> np.ndarray: + """ + Generate embeddings using Voyage AI since Anthropic doesn't provide native embedding support. + + Args: + texts: List of text strings to embed + model: Voyage AI model name (e.g., "voyage-3", "voyage-3-large", "voyage-code-3") + base_url: Optional custom base URL (not used for Voyage AI) + api_key: API key for Voyage AI (defaults to VOYAGE_API_KEY environment variable) + + Returns: + numpy array of shape (len(texts), embedding_dimension) containing the embeddings + """ + if not api_key: + api_key = os.environ.get("VOYAGE_API_KEY") + if not api_key: + logger.error("VOYAGE_API_KEY environment variable not set") + raise ValueError( + "VOYAGE_API_KEY environment variable is required for embeddings" + ) + + try: + # Initialize Voyage AI client + voyage_client = voyageai.Client(api_key=api_key) + + # Get embeddings + result = voyage_client.embed( + texts, + model=model, + input_type="document", # Assuming document context; could be made configurable + ) + + # Convert list of embeddings to numpy array + embeddings = np.array(result.embeddings, dtype=np.float32) + + logger.debug(f"Generated embeddings for {len(texts)} texts using {model}") + verbose_debug(f"Embedding shape: {embeddings.shape}") + + return embeddings + + except Exception as e: + logger.error(f"Voyage AI embedding failed: {str(e)}") + raise + + +# Optional: a helper function to get available embedding models +def get_available_embedding_models() -> dict[str, dict]: + """ + Returns a dictionary of available Voyage AI embedding models and their properties. + """ + return { + "voyage-3-large": { + "context_length": 32000, + "dimension": 1024, + "description": "Best general-purpose and multilingual", + }, + "voyage-3": { + "context_length": 32000, + "dimension": 1024, + "description": "General-purpose and multilingual", + }, + "voyage-3-lite": { + "context_length": 32000, + "dimension": 512, + "description": "Optimized for latency and cost", + }, + "voyage-code-3": { + "context_length": 32000, + "dimension": 1024, + "description": "Optimized for code", + }, + "voyage-finance-2": { + "context_length": 32000, + "dimension": 1024, + "description": "Optimized for finance", + }, + "voyage-law-2": { + "context_length": 16000, + "dimension": 1024, + "description": "Optimized for legal", + }, + "voyage-multimodal-3": { + "context_length": 32000, + "dimension": 1024, + "description": "Multimodal text and images", + }, + } diff --git a/LightRAG/lightrag/llm/azure_openai.py b/LightRAG/lightrag/llm/azure_openai.py new file mode 100644 index 00000000..824ff088 --- /dev/null +++ b/LightRAG/lightrag/llm/azure_openai.py @@ -0,0 +1,177 @@ +from collections.abc import Iterable +import os +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("openai"): + pm.install("openai") + +from openai import ( + AsyncAzureOpenAI, + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from openai.types.chat import ChatCompletionMessageParam + +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from lightrag.utils import ( + wrap_embedding_func_with_attrs, + safe_unicode_decode, + logger, +) + +import numpy as np + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APIConnectionError) + ), +) +async def azure_openai_complete_if_cache( + model, + prompt, + system_prompt: str | None = None, + history_messages: Iterable[ChatCompletionMessageParam] | None = None, + enable_cot: bool = False, + base_url: str | None = None, + api_key: str | None = None, + api_version: str | None = None, + **kwargs, +): + if enable_cot: + logger.debug( + "enable_cot=True is not supported for the Azure OpenAI API and will be ignored." + ) + deployment = os.getenv("AZURE_OPENAI_DEPLOYMENT") or model or os.getenv("LLM_MODEL") + base_url = ( + base_url or os.getenv("AZURE_OPENAI_ENDPOINT") or os.getenv("LLM_BINDING_HOST") + ) + api_key = ( + api_key or os.getenv("AZURE_OPENAI_API_KEY") or os.getenv("LLM_BINDING_API_KEY") + ) + api_version = ( + api_version + or os.getenv("AZURE_OPENAI_API_VERSION") + or os.getenv("OPENAI_API_VERSION") + ) + + kwargs.pop("hashing_kv", None) + kwargs.pop("keyword_extraction", None) + timeout = kwargs.pop("timeout", None) + + openai_async_client = AsyncAzureOpenAI( + azure_endpoint=base_url, + azure_deployment=deployment, + api_key=api_key, + api_version=api_version, + timeout=timeout, + ) + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + if history_messages: + messages.extend(history_messages) + if prompt is not None: + messages.append({"role": "user", "content": prompt}) + + if "response_format" in kwargs: + response = await openai_async_client.beta.chat.completions.parse( + model=model, messages=messages, **kwargs + ) + else: + response = await openai_async_client.chat.completions.create( + model=model, messages=messages, **kwargs + ) + + if hasattr(response, "__aiter__"): + + async def inner(): + async for chunk in response: + if len(chunk.choices) == 0: + continue + content = chunk.choices[0].delta.content + if content is None: + continue + if r"\u" in content: + content = safe_unicode_decode(content.encode("utf-8")) + yield content + + return inner() + else: + content = response.choices[0].message.content + if r"\u" in content: + content = safe_unicode_decode(content.encode("utf-8")) + return content + + +async def azure_openai_complete( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> str: + kwargs.pop("keyword_extraction", None) + result = await azure_openai_complete_if_cache( + os.getenv("LLM_MODEL", "gpt-4o-mini"), + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + **kwargs, + ) + return result + + +@wrap_embedding_func_with_attrs(embedding_dim=1536) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def azure_openai_embed( + texts: list[str], + model: str | None = None, + base_url: str | None = None, + api_key: str | None = None, + api_version: str | None = None, +) -> np.ndarray: + deployment = ( + os.getenv("AZURE_EMBEDDING_DEPLOYMENT") + or model + or os.getenv("EMBEDDING_MODEL", "text-embedding-3-small") + ) + base_url = ( + base_url + or os.getenv("AZURE_EMBEDDING_ENDPOINT") + or os.getenv("EMBEDDING_BINDING_HOST") + ) + api_key = ( + api_key + or os.getenv("AZURE_EMBEDDING_API_KEY") + or os.getenv("EMBEDDING_BINDING_API_KEY") + ) + api_version = ( + api_version + or os.getenv("AZURE_EMBEDDING_API_VERSION") + or os.getenv("OPENAI_API_VERSION") + ) + + openai_async_client = AsyncAzureOpenAI( + azure_endpoint=base_url, + azure_deployment=deployment, + api_key=api_key, + api_version=api_version, + ) + + response = await openai_async_client.embeddings.create( + model=model, input=texts, encoding_format="float" + ) + return np.array([dp.embedding for dp in response.data]) diff --git a/LightRAG/lightrag/llm/bedrock.py b/LightRAG/lightrag/llm/bedrock.py new file mode 100644 index 00000000..f6871422 --- /dev/null +++ b/LightRAG/lightrag/llm/bedrock.py @@ -0,0 +1,483 @@ +import copy +import os +import json +import logging + +import pipmaster as pm # Pipmaster for dynamic library install + +if not pm.is_installed("aioboto3"): + pm.install("aioboto3") +import aioboto3 +import numpy as np +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +import sys +from lightrag.utils import wrap_embedding_func_with_attrs + +if sys.version_info < (3, 9): + from typing import AsyncIterator +else: + from collections.abc import AsyncIterator +from typing import Union + +# Import botocore exceptions for proper exception handling +try: + from botocore.exceptions import ( + ClientError, + ConnectionError as BotocoreConnectionError, + ReadTimeoutError, + ) +except ImportError: + # If botocore is not installed, define placeholders + ClientError = Exception + BotocoreConnectionError = Exception + ReadTimeoutError = Exception + + +class BedrockError(Exception): + """Generic error for issues related to Amazon Bedrock""" + + +class BedrockRateLimitError(BedrockError): + """Error for rate limiting and throttling issues""" + + +class BedrockConnectionError(BedrockError): + """Error for network and connection issues""" + + +class BedrockTimeoutError(BedrockError): + """Error for timeout issues""" + + +def _set_env_if_present(key: str, value): + """Set environment variable only if a non-empty value is provided.""" + if value is not None and value != "": + os.environ[key] = value + + +def _handle_bedrock_exception(e: Exception, operation: str = "Bedrock API") -> None: + """Convert AWS Bedrock exceptions to appropriate custom exceptions. + + Args: + e: The exception to handle + operation: Description of the operation for error messages + + Raises: + BedrockRateLimitError: For rate limiting and throttling issues (retryable) + BedrockConnectionError: For network and server issues (retryable) + BedrockTimeoutError: For timeout issues (retryable) + BedrockError: For validation and other non-retryable errors + """ + error_message = str(e) + + # Handle botocore ClientError with specific error codes + if isinstance(e, ClientError): + error_code = e.response.get("Error", {}).get("Code", "") + error_msg = e.response.get("Error", {}).get("Message", error_message) + + # Rate limiting and throttling errors (retryable) + if error_code in [ + "ThrottlingException", + "ProvisionedThroughputExceededException", + ]: + logging.error(f"{operation} rate limit error: {error_msg}") + raise BedrockRateLimitError(f"Rate limit error: {error_msg}") + + # Server errors (retryable) + elif error_code in ["ServiceUnavailableException", "InternalServerException"]: + logging.error(f"{operation} connection error: {error_msg}") + raise BedrockConnectionError(f"Service error: {error_msg}") + + # Check for 5xx HTTP status codes (retryable) + elif e.response.get("ResponseMetadata", {}).get("HTTPStatusCode", 0) >= 500: + logging.error(f"{operation} server error: {error_msg}") + raise BedrockConnectionError(f"Server error: {error_msg}") + + # Validation and other client errors (non-retryable) + else: + logging.error(f"{operation} client error: {error_msg}") + raise BedrockError(f"Client error: {error_msg}") + + # Connection errors (retryable) + elif isinstance(e, BotocoreConnectionError): + logging.error(f"{operation} connection error: {error_message}") + raise BedrockConnectionError(f"Connection error: {error_message}") + + # Timeout errors (retryable) + elif isinstance(e, (ReadTimeoutError, TimeoutError)): + logging.error(f"{operation} timeout error: {error_message}") + raise BedrockTimeoutError(f"Timeout error: {error_message}") + + # Custom Bedrock errors (already properly typed) + elif isinstance( + e, + ( + BedrockRateLimitError, + BedrockConnectionError, + BedrockTimeoutError, + BedrockError, + ), + ): + raise + + # Unknown errors (non-retryable) + else: + logging.error(f"{operation} unexpected error: {error_message}") + raise BedrockError(f"Unexpected error: {error_message}") + + +@retry( + stop=stop_after_attempt(5), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(BedrockRateLimitError) + | retry_if_exception_type(BedrockConnectionError) + | retry_if_exception_type(BedrockTimeoutError) + ), +) +async def bedrock_complete_if_cache( + model, + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + aws_access_key_id=None, + aws_secret_access_key=None, + aws_session_token=None, + **kwargs, +) -> Union[str, AsyncIterator[str]]: + if enable_cot: + import logging + + logging.debug( + "enable_cot=True is not supported for Bedrock and will be ignored." + ) + # Respect existing env; only set if a non-empty value is available + access_key = os.environ.get("AWS_ACCESS_KEY_ID") or aws_access_key_id + secret_key = os.environ.get("AWS_SECRET_ACCESS_KEY") or aws_secret_access_key + session_token = os.environ.get("AWS_SESSION_TOKEN") or aws_session_token + _set_env_if_present("AWS_ACCESS_KEY_ID", access_key) + _set_env_if_present("AWS_SECRET_ACCESS_KEY", secret_key) + _set_env_if_present("AWS_SESSION_TOKEN", session_token) + # Region handling: prefer env, else kwarg (optional) + region = os.environ.get("AWS_REGION") or kwargs.pop("aws_region", None) + kwargs.pop("hashing_kv", None) + # Capture stream flag (if provided) and remove from kwargs since it's not a Bedrock API parameter + # We'll use this to determine whether to call converse_stream or converse + stream = bool(kwargs.pop("stream", False)) + # Remove unsupported args for Bedrock Converse API + for k in [ + "response_format", + "tools", + "tool_choice", + "seed", + "presence_penalty", + "frequency_penalty", + "n", + "logprobs", + "top_logprobs", + "max_completion_tokens", + "response_format", + ]: + kwargs.pop(k, None) + # Fix message history format + messages = [] + for history_message in history_messages: + message = copy.copy(history_message) + message["content"] = [{"text": message["content"]}] + messages.append(message) + + # Add user prompt + messages.append({"role": "user", "content": [{"text": prompt}]}) + + # Initialize Converse API arguments + args = {"modelId": model, "messages": messages} + + # Define system prompt + if system_prompt: + args["system"] = [{"text": system_prompt}] + + # Map and set up inference parameters + inference_params_map = { + "max_tokens": "maxTokens", + "top_p": "topP", + "stop_sequences": "stopSequences", + } + if inference_params := list( + set(kwargs) & set(["max_tokens", "temperature", "top_p", "stop_sequences"]) + ): + args["inferenceConfig"] = {} + for param in inference_params: + args["inferenceConfig"][inference_params_map.get(param, param)] = ( + kwargs.pop(param) + ) + + # Import logging for error handling + import logging + + # For streaming responses, we need a different approach to keep the connection open + if stream: + # Create a session that will be used throughout the streaming process + session = aioboto3.Session() + client = None + + # Define the generator function that will manage the client lifecycle + async def stream_generator(): + nonlocal client + + # Create the client outside the generator to ensure it stays open + client = await session.client( + "bedrock-runtime", region_name=region + ).__aenter__() + event_stream = None + iteration_started = False + + try: + # Make the API call + response = await client.converse_stream(**args, **kwargs) + event_stream = response.get("stream") + iteration_started = True + + # Process the stream + async for event in event_stream: + # Validate event structure + if not event or not isinstance(event, dict): + continue + + if "contentBlockDelta" in event: + delta = event["contentBlockDelta"].get("delta", {}) + text = delta.get("text") + if text: + yield text + # Handle other event types that might indicate stream end + elif "messageStop" in event: + break + + except Exception as e: + # Try to clean up resources if possible + if ( + iteration_started + and event_stream + and hasattr(event_stream, "aclose") + and callable(getattr(event_stream, "aclose", None)) + ): + try: + await event_stream.aclose() + except Exception as close_error: + logging.warning( + f"Failed to close Bedrock event stream: {close_error}" + ) + + # Convert to appropriate exception type + _handle_bedrock_exception(e, "Bedrock streaming") + + finally: + # Clean up the event stream + if ( + iteration_started + and event_stream + and hasattr(event_stream, "aclose") + and callable(getattr(event_stream, "aclose", None)) + ): + try: + await event_stream.aclose() + except Exception as close_error: + logging.warning( + f"Failed to close Bedrock event stream in finally block: {close_error}" + ) + + # Clean up the client + if client: + try: + await client.__aexit__(None, None, None) + except Exception as client_close_error: + logging.warning( + f"Failed to close Bedrock client: {client_close_error}" + ) + + # Return the generator that manages its own lifecycle + return stream_generator() + + # For non-streaming responses, use the standard async context manager pattern + session = aioboto3.Session() + async with session.client( + "bedrock-runtime", region_name=region + ) as bedrock_async_client: + try: + # Use converse for non-streaming responses + response = await bedrock_async_client.converse(**args, **kwargs) + + # Validate response structure + if ( + not response + or "output" not in response + or "message" not in response["output"] + or "content" not in response["output"]["message"] + or not response["output"]["message"]["content"] + ): + raise BedrockError("Invalid response structure from Bedrock API") + + content = response["output"]["message"]["content"][0]["text"] + + if not content or content.strip() == "": + raise BedrockError("Received empty content from Bedrock API") + + return content + + except Exception as e: + # Convert to appropriate exception type + _handle_bedrock_exception(e, "Bedrock converse") + + +# Generic Bedrock completion function +async def bedrock_complete( + prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs +) -> Union[str, AsyncIterator[str]]: + kwargs.pop("keyword_extraction", None) + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + result = await bedrock_complete_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + **kwargs, + ) + return result + + +@wrap_embedding_func_with_attrs(embedding_dim=1024, max_token_size=8192) +@retry( + stop=stop_after_attempt(5), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(BedrockRateLimitError) + | retry_if_exception_type(BedrockConnectionError) + | retry_if_exception_type(BedrockTimeoutError) + ), +) +async def bedrock_embed( + texts: list[str], + model: str = "amazon.titan-embed-text-v2:0", + aws_access_key_id=None, + aws_secret_access_key=None, + aws_session_token=None, +) -> np.ndarray: + # Respect existing env; only set if a non-empty value is available + access_key = os.environ.get("AWS_ACCESS_KEY_ID") or aws_access_key_id + secret_key = os.environ.get("AWS_SECRET_ACCESS_KEY") or aws_secret_access_key + session_token = os.environ.get("AWS_SESSION_TOKEN") or aws_session_token + _set_env_if_present("AWS_ACCESS_KEY_ID", access_key) + _set_env_if_present("AWS_SECRET_ACCESS_KEY", secret_key) + _set_env_if_present("AWS_SESSION_TOKEN", session_token) + + # Region handling: prefer env + region = os.environ.get("AWS_REGION") + + session = aioboto3.Session() + async with session.client( + "bedrock-runtime", region_name=region + ) as bedrock_async_client: + try: + if (model_provider := model.split(".")[0]) == "amazon": + embed_texts = [] + for text in texts: + try: + if "v2" in model: + body = json.dumps( + { + "inputText": text, + # 'dimensions': embedding_dim, + "embeddingTypes": ["float"], + } + ) + elif "v1" in model: + body = json.dumps({"inputText": text}) + else: + raise BedrockError(f"Model {model} is not supported!") + + response = await bedrock_async_client.invoke_model( + modelId=model, + body=body, + accept="application/json", + contentType="application/json", + ) + + response_body = await response.get("body").json() + + # Validate response structure + if not response_body or "embedding" not in response_body: + raise BedrockError( + f"Invalid embedding response structure for text: {text[:50]}..." + ) + + embedding = response_body["embedding"] + if not embedding: + raise BedrockError( + f"Received empty embedding for text: {text[:50]}..." + ) + + embed_texts.append(embedding) + + except Exception as e: + # Convert to appropriate exception type + _handle_bedrock_exception( + e, "Bedrock embedding (amazon, text chunk)" + ) + + elif model_provider == "cohere": + try: + body = json.dumps( + { + "texts": texts, + "input_type": "search_document", + "truncate": "NONE", + } + ) + + response = await bedrock_async_client.invoke_model( + model=model, + body=body, + accept="application/json", + contentType="application/json", + ) + + response_body = json.loads(response.get("body").read()) + + # Validate response structure + if not response_body or "embeddings" not in response_body: + raise BedrockError( + "Invalid embedding response structure from Cohere" + ) + + embeddings = response_body["embeddings"] + if not embeddings or len(embeddings) != len(texts): + raise BedrockError( + f"Invalid embeddings count: expected {len(texts)}, got {len(embeddings) if embeddings else 0}" + ) + + embed_texts = embeddings + + except Exception as e: + # Convert to appropriate exception type + _handle_bedrock_exception(e, "Bedrock embedding (cohere)") + + else: + raise BedrockError( + f"Model provider '{model_provider}' is not supported!" + ) + + # Final validation + if not embed_texts: + raise BedrockError("No embeddings generated") + + return np.array(embed_texts) + + except Exception as e: + # Convert to appropriate exception type + _handle_bedrock_exception(e, "Bedrock embedding") diff --git a/LightRAG/lightrag/llm/binding_options.py b/LightRAG/lightrag/llm/binding_options.py new file mode 100644 index 00000000..1cb52a81 --- /dev/null +++ b/LightRAG/lightrag/llm/binding_options.py @@ -0,0 +1,740 @@ +""" +Module that implements containers for specific LLM bindings. + +This module provides container implementations for various Large Language Model +bindings and integrations. +""" + +from argparse import ArgumentParser, Namespace +import argparse +import json +from dataclasses import asdict, dataclass, field +from typing import Any, ClassVar, List, get_args, get_origin + +from lightrag.utils import get_env_value +from lightrag.constants import DEFAULT_TEMPERATURE + + +def _resolve_optional_type(field_type: Any) -> Any: + """Return the concrete type for Optional/Union annotations.""" + origin = get_origin(field_type) + if origin in (list, dict, tuple): + return field_type + + args = get_args(field_type) + if args: + non_none_args = [arg for arg in args if arg is not type(None)] + if len(non_none_args) == 1: + return non_none_args[0] + return field_type + + +# ============================================================================= +# BindingOptions Base Class +# ============================================================================= +# +# The BindingOptions class serves as the foundation for all LLM provider bindings +# in LightRAG. It provides a standardized framework for: +# +# 1. Configuration Management: +# - Defines how each LLM provider's configuration parameters are structured +# - Handles default values and type information for each parameter +# - Maps configuration options to command-line arguments and environment variables +# +# 2. Environment Integration: +# - Automatically generates environment variable names from binding parameters +# - Provides methods to create sample .env files for easy configuration +# - Supports configuration via environment variables with fallback to defaults +# +# 3. Command-Line Interface: +# - Dynamically generates command-line arguments for all registered bindings +# - Maintains consistent naming conventions across different LLM providers +# - Provides help text and type validation for each configuration option +# +# 4. Extensibility: +# - Uses class introspection to automatically discover all binding subclasses +# - Requires minimal boilerplate code when adding new LLM provider bindings +# - Maintains separation of concerns between different provider configurations +# +# This design pattern ensures that adding support for a new LLM provider requires +# only defining the provider-specific parameters and help text, while the base +# class handles all the common functionality for argument parsing, environment +# variable handling, and configuration management. +# +# Instances of a derived class of BindingOptions can be used to store multiple +# runtime configurations of options for a single LLM provider. using the +# asdict() method to convert the options to a dictionary. +# +# ============================================================================= +@dataclass +class BindingOptions: + """Base class for binding options.""" + + # mandatory name of binding + _binding_name: ClassVar[str] + + # optional help message for each option + _help: ClassVar[dict[str, str]] + + @staticmethod + def _all_class_vars(klass: type, include_inherited=True) -> dict[str, Any]: + """Print class variables, optionally including inherited ones""" + if include_inherited: + # Get all class variables from MRO + vars_dict = {} + for base in reversed(klass.__mro__[:-1]): # Exclude 'object' + vars_dict.update( + { + k: v + for k, v in base.__dict__.items() + if ( + not k.startswith("_") + and not callable(v) + and not isinstance(v, classmethod) + ) + } + ) + else: + # Only direct class variables + vars_dict = { + k: v + for k, v in klass.__dict__.items() + if ( + not k.startswith("_") + and not callable(v) + and not isinstance(v, classmethod) + ) + } + + return vars_dict + + @classmethod + def add_args(cls, parser: ArgumentParser): + group = parser.add_argument_group(f"{cls._binding_name} binding options") + for arg_item in cls.args_env_name_type_value(): + # Handle JSON parsing for list types + if arg_item["type"] is List[str]: + + def json_list_parser(value): + try: + parsed = json.loads(value) + if not isinstance(parsed, list): + raise argparse.ArgumentTypeError( + f"Expected JSON array, got {type(parsed).__name__}" + ) + return parsed + except json.JSONDecodeError as e: + raise argparse.ArgumentTypeError(f"Invalid JSON: {e}") + + # Get environment variable with JSON parsing + env_value = get_env_value(f"{arg_item['env_name']}", argparse.SUPPRESS) + if env_value is not argparse.SUPPRESS: + try: + env_value = json_list_parser(env_value) + except argparse.ArgumentTypeError: + env_value = argparse.SUPPRESS + + group.add_argument( + f"--{arg_item['argname']}", + type=json_list_parser, + default=env_value, + help=arg_item["help"], + ) + # Handle JSON parsing for dict types + elif arg_item["type"] is dict: + + def json_dict_parser(value): + try: + parsed = json.loads(value) + if not isinstance(parsed, dict): + raise argparse.ArgumentTypeError( + f"Expected JSON object, got {type(parsed).__name__}" + ) + return parsed + except json.JSONDecodeError as e: + raise argparse.ArgumentTypeError(f"Invalid JSON: {e}") + + # Get environment variable with JSON parsing + env_value = get_env_value(f"{arg_item['env_name']}", argparse.SUPPRESS) + if env_value is not argparse.SUPPRESS: + try: + env_value = json_dict_parser(env_value) + except argparse.ArgumentTypeError: + env_value = argparse.SUPPRESS + + group.add_argument( + f"--{arg_item['argname']}", + type=json_dict_parser, + default=env_value, + help=arg_item["help"], + ) + # Handle boolean types specially to avoid argparse bool() constructor issues + elif arg_item["type"] is bool: + + def bool_parser(value): + """Custom boolean parser that handles string representations correctly""" + if isinstance(value, bool): + return value + if isinstance(value, str): + return value.lower() in ("true", "1", "yes", "t", "on") + return bool(value) + + # Get environment variable with proper type conversion + env_value = get_env_value( + f"{arg_item['env_name']}", argparse.SUPPRESS, bool + ) + + group.add_argument( + f"--{arg_item['argname']}", + type=bool_parser, + default=env_value, + help=arg_item["help"], + ) + else: + resolved_type = arg_item["type"] + if resolved_type is not None: + resolved_type = _resolve_optional_type(resolved_type) + + group.add_argument( + f"--{arg_item['argname']}", + type=resolved_type, + default=get_env_value(f"{arg_item['env_name']}", argparse.SUPPRESS), + help=arg_item["help"], + ) + + @classmethod + def args_env_name_type_value(cls): + import dataclasses + + args_prefix = f"{cls._binding_name}".replace("_", "-") + env_var_prefix = f"{cls._binding_name}_".upper() + help = cls._help + + # Check if this is a dataclass and use dataclass fields + if dataclasses.is_dataclass(cls): + for field in dataclasses.fields(cls): + # Skip private fields + if field.name.startswith("_"): + continue + + # Get default value + if field.default is not dataclasses.MISSING: + default_value = field.default + elif field.default_factory is not dataclasses.MISSING: + default_value = field.default_factory() + else: + default_value = None + + argdef = { + "argname": f"{args_prefix}-{field.name}", + "env_name": f"{env_var_prefix}{field.name.upper()}", + "type": _resolve_optional_type(field.type), + "default": default_value, + "help": f"{cls._binding_name} -- " + help.get(field.name, ""), + } + + yield argdef + else: + # Fallback to old method for non-dataclass classes + class_vars = { + key: value + for key, value in cls._all_class_vars(cls).items() + if not callable(value) and not key.startswith("_") + } + + # Get type hints to properly detect List[str] types + type_hints = {} + for base in cls.__mro__: + if hasattr(base, "__annotations__"): + type_hints.update(base.__annotations__) + + for class_var in class_vars: + # Use type hint if available, otherwise fall back to type of value + var_type = type_hints.get(class_var, type(class_vars[class_var])) + + argdef = { + "argname": f"{args_prefix}-{class_var}", + "env_name": f"{env_var_prefix}{class_var.upper()}", + "type": var_type, + "default": class_vars[class_var], + "help": f"{cls._binding_name} -- " + help.get(class_var, ""), + } + + yield argdef + + @classmethod + def generate_dot_env_sample(cls): + """ + Generate a sample .env file for all LightRAG binding options. + + This method creates a .env file that includes all the binding options + defined by the subclasses of BindingOptions. It uses the args_env_name_type_value() + method to get the list of all options and their default values. + + Returns: + str: A string containing the contents of the sample .env file. + """ + from io import StringIO + + sample_top = ( + "#" * 80 + + "\n" + + ( + "# Autogenerated .env entries list for LightRAG binding options\n" + "#\n" + "# To generate run:\n" + "# $ python -m lightrag.llm.binding_options\n" + ) + + "#" * 80 + + "\n" + ) + + sample_bottom = ( + ("#\n# End of .env entries for LightRAG binding options\n") + + "#" * 80 + + "\n" + ) + + sample_stream = StringIO() + sample_stream.write(sample_top) + for klass in cls.__subclasses__(): + for arg_item in klass.args_env_name_type_value(): + if arg_item["help"]: + sample_stream.write(f"# {arg_item['help']}\n") + + # Handle JSON formatting for list and dict types + if arg_item["type"] is List[str] or arg_item["type"] is dict: + default_value = json.dumps(arg_item["default"]) + else: + default_value = arg_item["default"] + + sample_stream.write(f"# {arg_item['env_name']}={default_value}\n\n") + + sample_stream.write(sample_bottom) + return sample_stream.getvalue() + + @classmethod + def options_dict(cls, args: Namespace) -> dict[str, Any]: + """ + Extract options dictionary for a specific binding from parsed arguments. + + This method filters the parsed command-line arguments to return only those + that belong to the specific binding class. It removes the binding prefix + from argument names to create a clean options dictionary. + + Args: + args (Namespace): Parsed command-line arguments containing all binding options + + Returns: + dict[str, Any]: Dictionary mapping option names (without prefix) to their values + + Example: + If args contains {'ollama_num_ctx': 512, 'other_option': 'value'} + and this is called on OllamaOptions, it returns {'num_ctx': 512} + """ + prefix = cls._binding_name + "_" + skipchars = len(prefix) + options = { + key[skipchars:]: value + for key, value in vars(args).items() + if key.startswith(prefix) + } + + return options + + def asdict(self) -> dict[str, Any]: + """ + Convert an instance of binding options to a dictionary. + + This method uses dataclasses.asdict() to convert the dataclass instance + into a dictionary representation, including all its fields and values. + + Returns: + dict[str, Any]: Dictionary representation of the binding options instance + """ + return asdict(self) + + +# ============================================================================= +# Binding Options for Ollama +# ============================================================================= +# +# Ollama binding options provide configuration for the Ollama local LLM server. +# These options control model behavior, sampling parameters, hardware utilization, +# and performance settings. The parameters are based on Ollama's API specification +# and provide fine-grained control over model inference and generation. +# +# The _OllamaOptionsMixin defines the complete set of available options, while +# OllamaEmbeddingOptions and OllamaLLMOptions provide specialized configurations +# for embedding and language model tasks respectively. +# ============================================================================= +@dataclass +class _OllamaOptionsMixin: + """Options for Ollama bindings.""" + + # Core context and generation parameters + num_ctx: int = 32768 # Context window size (number of tokens) + num_predict: int = 128 # Maximum number of tokens to predict + num_keep: int = 0 # Number of tokens to keep from the initial prompt + seed: int = -1 # Random seed for generation (-1 for random) + + # Sampling parameters + temperature: float = DEFAULT_TEMPERATURE # Controls randomness (0.0-2.0) + top_k: int = 40 # Top-k sampling parameter + top_p: float = 0.9 # Top-p (nucleus) sampling parameter + tfs_z: float = 1.0 # Tail free sampling parameter + typical_p: float = 1.0 # Typical probability mass + min_p: float = 0.0 # Minimum probability threshold + + # Repetition control + repeat_last_n: int = 64 # Number of tokens to consider for repetition penalty + repeat_penalty: float = 1.1 # Penalty for repetition + presence_penalty: float = 0.0 # Penalty for token presence + frequency_penalty: float = 0.0 # Penalty for token frequency + + # Mirostat sampling + mirostat: int = ( + # Mirostat sampling algorithm (0=disabled, 1=Mirostat 1.0, 2=Mirostat 2.0) + 0 + ) + mirostat_tau: float = 5.0 # Mirostat target entropy + mirostat_eta: float = 0.1 # Mirostat learning rate + + # Hardware and performance parameters + numa: bool = False # Enable NUMA optimization + num_batch: int = 512 # Batch size for processing + num_gpu: int = -1 # Number of GPUs to use (-1 for auto) + main_gpu: int = 0 # Main GPU index + low_vram: bool = False # Optimize for low VRAM + num_thread: int = 0 # Number of CPU threads (0 for auto) + + # Memory and model parameters + f16_kv: bool = True # Use half-precision for key/value cache + logits_all: bool = False # Return logits for all tokens + vocab_only: bool = False # Only load vocabulary + use_mmap: bool = True # Use memory mapping for model files + use_mlock: bool = False # Lock model in memory + embedding_only: bool = False # Only use for embeddings + + # Output control + penalize_newline: bool = True # Penalize newline tokens + stop: List[str] = field(default_factory=list) # Stop sequences + + # optional help strings + _help: ClassVar[dict[str, str]] = { + "num_ctx": "Context window size (number of tokens)", + "num_predict": "Maximum number of tokens to predict", + "num_keep": "Number of tokens to keep from the initial prompt", + "seed": "Random seed for generation (-1 for random)", + "temperature": "Controls randomness (0.0-2.0, higher = more creative)", + "top_k": "Top-k sampling parameter (0 = disabled)", + "top_p": "Top-p (nucleus) sampling parameter (0.0-1.0)", + "tfs_z": "Tail free sampling parameter (1.0 = disabled)", + "typical_p": "Typical probability mass (1.0 = disabled)", + "min_p": "Minimum probability threshold (0.0 = disabled)", + "repeat_last_n": "Number of tokens to consider for repetition penalty", + "repeat_penalty": "Penalty for repetition (1.0 = no penalty)", + "presence_penalty": "Penalty for token presence (-2.0 to 2.0)", + "frequency_penalty": "Penalty for token frequency (-2.0 to 2.0)", + "mirostat": "Mirostat sampling algorithm (0=disabled, 1=Mirostat 1.0, 2=Mirostat 2.0)", + "mirostat_tau": "Mirostat target entropy", + "mirostat_eta": "Mirostat learning rate", + "numa": "Enable NUMA optimization", + "num_batch": "Batch size for processing", + "num_gpu": "Number of GPUs to use (-1 for auto)", + "main_gpu": "Main GPU index", + "low_vram": "Optimize for low VRAM", + "num_thread": "Number of CPU threads (0 for auto)", + "f16_kv": "Use half-precision for key/value cache", + "logits_all": "Return logits for all tokens", + "vocab_only": "Only load vocabulary", + "use_mmap": "Use memory mapping for model files", + "use_mlock": "Lock model in memory", + "embedding_only": "Only use for embeddings", + "penalize_newline": "Penalize newline tokens", + "stop": 'Stop sequences (JSON array of strings, e.g., \'["
    ", "\\n\\n"]\')', + } + + +@dataclass +class OllamaEmbeddingOptions(_OllamaOptionsMixin, BindingOptions): + """Options for Ollama embeddings with specialized configuration for embedding tasks.""" + + # mandatory name of binding + _binding_name: ClassVar[str] = "ollama_embedding" + + +@dataclass +class OllamaLLMOptions(_OllamaOptionsMixin, BindingOptions): + """Options for Ollama LLM with specialized configuration for LLM tasks.""" + + # mandatory name of binding + _binding_name: ClassVar[str] = "ollama_llm" + + +# ============================================================================= +# Binding Options for Gemini +# ============================================================================= +@dataclass +class GeminiLLMOptions(BindingOptions): + """Options for Google Gemini models.""" + + _binding_name: ClassVar[str] = "gemini_llm" + + temperature: float = DEFAULT_TEMPERATURE + top_p: float = 0.95 + top_k: int = 40 + max_output_tokens: int | None = None + candidate_count: int = 1 + presence_penalty: float = 0.0 + frequency_penalty: float = 0.0 + stop_sequences: List[str] = field(default_factory=list) + seed: int | None = None + thinking_config: dict | None = None + safety_settings: dict | None = None + + _help: ClassVar[dict[str, str]] = { + "temperature": "Controls randomness (0.0-2.0, higher = more creative)", + "top_p": "Nucleus sampling parameter (0.0-1.0)", + "top_k": "Limits sampling to the top K tokens (1 disables the limit)", + "max_output_tokens": "Maximum tokens generated in the response", + "candidate_count": "Number of candidates returned per request", + "presence_penalty": "Penalty for token presence (-2.0 to 2.0)", + "frequency_penalty": "Penalty for token frequency (-2.0 to 2.0)", + "stop_sequences": "Stop sequences (JSON array of strings, e.g., '[\"END\"]')", + "seed": "Random seed for reproducible generation (leave empty for random)", + "thinking_config": "Thinking configuration (JSON dict, e.g., '{\"thinking_budget\": 1024}' or '{\"include_thoughts\": true}')", + "safety_settings": "JSON object with Gemini safety settings overrides", + } + + +@dataclass +class GeminiEmbeddingOptions(BindingOptions): + """Options for Google Gemini embedding models.""" + + _binding_name: ClassVar[str] = "gemini_embedding" + + task_type: str = "RETRIEVAL_DOCUMENT" + + _help: ClassVar[dict[str, str]] = { + "task_type": "Task type for embedding optimization (RETRIEVAL_DOCUMENT, RETRIEVAL_QUERY, SEMANTIC_SIMILARITY, CLASSIFICATION, CLUSTERING, CODE_RETRIEVAL_QUERY, QUESTION_ANSWERING, FACT_VERIFICATION)", + } + + +# ============================================================================= +# Binding Options for OpenAI +# ============================================================================= +# +# OpenAI binding options provide configuration for OpenAI's API and Azure OpenAI. +# These options control model behavior, sampling parameters, and generation settings. +# The parameters are based on OpenAI's API specification and provide fine-grained +# control over model inference and generation. +# +# ============================================================================= +@dataclass +class OpenAILLMOptions(BindingOptions): + """Options for OpenAI LLM with configuration for OpenAI and Azure OpenAI API calls.""" + + # mandatory name of binding + _binding_name: ClassVar[str] = "openai_llm" + + # Sampling and generation parameters + frequency_penalty: float = 0.0 # Penalty for token frequency (-2.0 to 2.0) + max_completion_tokens: int = None # Maximum number of tokens to generate + presence_penalty: float = 0.0 # Penalty for token presence (-2.0 to 2.0) + reasoning_effort: str = "medium" # Reasoning effort level (low, medium, high) + safety_identifier: str = "" # Safety identifier for content filtering + service_tier: str = "" # Service tier for API usage + stop: List[str] = field(default_factory=list) # Stop sequences + temperature: float = DEFAULT_TEMPERATURE # Controls randomness (0.0 to 2.0) + top_p: float = 1.0 # Nucleus sampling parameter (0.0 to 1.0) + max_tokens: int = None # Maximum number of tokens to generate(deprecated, use max_completion_tokens instead) + extra_body: dict = None # Extra body parameters for OpenRouter of vLLM + + # Help descriptions + _help: ClassVar[dict[str, str]] = { + "frequency_penalty": "Penalty for token frequency (-2.0 to 2.0, positive values discourage repetition)", + "max_completion_tokens": "Maximum number of tokens to generate (optional, leave empty for model default)", + "presence_penalty": "Penalty for token presence (-2.0 to 2.0, positive values encourage new topics)", + "reasoning_effort": "Reasoning effort level for o1 models (low, medium, high)", + "safety_identifier": "Safety identifier for content filtering (optional)", + "service_tier": "Service tier for API usage (optional)", + "stop": 'Stop sequences (JSON array of strings, e.g., \'["
    ", "\\n\\n"]\')', + "temperature": "Controls randomness (0.0-2.0, higher = more creative)", + "top_p": "Nucleus sampling parameter (0.0-1.0, lower = more focused)", + "max_tokens": "Maximum number of tokens to generate (deprecated, use max_completion_tokens instead)", + "extra_body": 'Extra body parameters for OpenRouter of vLLM (JSON dict, e.g., \'"reasoning": {"reasoning": {"enabled": false}}\')', + } + + +# ============================================================================= +# Main Section - For Testing and Sample Generation +# ============================================================================= +# +# When run as a script, this module: +# 1. Generates and prints a sample .env file with all binding options +# 2. If "test" argument is provided, demonstrates argument parsing with Ollama binding +# +# Usage: +# python -m lightrag.llm.binding_options # Generate .env sample +# python -m lightrag.llm.binding_options test # Test argument parsing +# +# ============================================================================= + +if __name__ == "__main__": + import sys + import dotenv + # from io import StringIO + + dotenv.load_dotenv(dotenv_path=".env", override=False) + + # env_strstream = StringIO( + # ("OLLAMA_LLM_TEMPERATURE=0.1\nOLLAMA_EMBEDDING_TEMPERATURE=0.2\n") + # ) + # # Load environment variables from .env file + # dotenv.load_dotenv(stream=env_strstream) + + if len(sys.argv) > 1 and sys.argv[1] == "test": + # Add arguments for OllamaEmbeddingOptions, OllamaLLMOptions, and OpenAILLMOptions + parser = ArgumentParser(description="Test binding options") + OllamaEmbeddingOptions.add_args(parser) + OllamaLLMOptions.add_args(parser) + OpenAILLMOptions.add_args(parser) + + # Parse arguments test + args = parser.parse_args( + [ + "--ollama-embedding-num_ctx", + "1024", + "--ollama-llm-num_ctx", + "2048", + "--openai-llm-temperature", + "0.7", + "--openai-llm-max_completion_tokens", + "1000", + "--openai-llm-stop", + '["
    ", "\\n\\n"]', + "--openai-llm-reasoning", + '{"effort": "high", "max_tokens": 2000, "exclude": false, "enabled": true}', + ] + ) + print("Final args for LLM and Embedding:") + print(f"{args}\n") + + print("Ollama LLM options:") + print(OllamaLLMOptions.options_dict(args)) + + print("\nOllama Embedding options:") + print(OllamaEmbeddingOptions.options_dict(args)) + + print("\nOpenAI LLM options:") + print(OpenAILLMOptions.options_dict(args)) + + # Test creating OpenAI options instance + openai_options = OpenAILLMOptions( + temperature=0.8, + max_completion_tokens=1500, + frequency_penalty=0.1, + presence_penalty=0.2, + stop=["<|end|>", "\n\n"], + ) + print("\nOpenAI LLM options instance:") + print(openai_options.asdict()) + + # Test creating OpenAI options instance with reasoning parameter + openai_options_with_reasoning = OpenAILLMOptions( + temperature=0.9, + max_completion_tokens=2000, + reasoning={ + "effort": "medium", + "max_tokens": 1500, + "exclude": True, + "enabled": True, + }, + ) + print("\nOpenAI LLM options instance with reasoning:") + print(openai_options_with_reasoning.asdict()) + + # Test dict parsing functionality + print("\n" + "=" * 50) + print("TESTING DICT PARSING FUNCTIONALITY") + print("=" * 50) + + # Test valid JSON dict parsing + test_parser = ArgumentParser(description="Test dict parsing") + OpenAILLMOptions.add_args(test_parser) + + try: + test_args = test_parser.parse_args( + ["--openai-llm-reasoning", '{"effort": "low", "max_tokens": 1000}'] + ) + print("✓ Valid JSON dict parsing successful:") + print( + f" Parsed reasoning: {OpenAILLMOptions.options_dict(test_args)['reasoning']}" + ) + except Exception as e: + print(f"✗ Valid JSON dict parsing failed: {e}") + + # Test invalid JSON dict parsing + try: + test_args = test_parser.parse_args( + [ + "--openai-llm-reasoning", + '{"effort": "low", "max_tokens": 1000', # Missing closing brace + ] + ) + print("✗ Invalid JSON should have failed but didn't") + except SystemExit: + print("✓ Invalid JSON dict parsing correctly rejected") + except Exception as e: + print(f"✓ Invalid JSON dict parsing correctly rejected: {e}") + + # Test non-dict JSON parsing + try: + test_args = test_parser.parse_args( + [ + "--openai-llm-reasoning", + '["not", "a", "dict"]', # Array instead of dict + ] + ) + print("✗ Non-dict JSON should have failed but didn't") + except SystemExit: + print("✓ Non-dict JSON parsing correctly rejected") + except Exception as e: + print(f"✓ Non-dict JSON parsing correctly rejected: {e}") + + print("\n" + "=" * 50) + print("TESTING ENVIRONMENT VARIABLE SUPPORT") + print("=" * 50) + + # Test environment variable support for dict + import os + + os.environ["OPENAI_LLM_REASONING"] = ( + '{"effort": "high", "max_tokens": 3000, "exclude": false}' + ) + + env_parser = ArgumentParser(description="Test env var dict parsing") + OpenAILLMOptions.add_args(env_parser) + + try: + env_args = env_parser.parse_args( + [] + ) # No command line args, should use env var + reasoning_from_env = OpenAILLMOptions.options_dict(env_args).get( + "reasoning" + ) + if reasoning_from_env: + print("✓ Environment variable dict parsing successful:") + print(f" Parsed reasoning from env: {reasoning_from_env}") + else: + print("✗ Environment variable dict parsing failed: No reasoning found") + except Exception as e: + print(f"✗ Environment variable dict parsing failed: {e}") + finally: + # Clean up environment variable + if "OPENAI_LLM_REASONING" in os.environ: + del os.environ["OPENAI_LLM_REASONING"] + + else: + print(BindingOptions.generate_dot_env_sample()) diff --git a/LightRAG/lightrag/llm/deprecated/siliconcloud.py b/LightRAG/lightrag/llm/deprecated/siliconcloud.py new file mode 100644 index 00000000..fe8da0dd --- /dev/null +++ b/LightRAG/lightrag/llm/deprecated/siliconcloud.py @@ -0,0 +1,69 @@ +import sys + +if sys.version_info < (3, 9): + pass +else: + pass +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("lmdeploy"): + pm.install("lmdeploy") + +from openai import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + + +import numpy as np +import aiohttp +import base64 +import struct + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def siliconcloud_embedding( + texts: list[str], + model: str = "netease-youdao/bce-embedding-base_v1", + base_url: str = "https://api.siliconflow.cn/v1/embeddings", + max_token_size: int = 8192, + api_key: str = None, +) -> np.ndarray: + if api_key and not api_key.startswith("Bearer "): + api_key = "Bearer " + api_key + + headers = {"Authorization": api_key, "Content-Type": "application/json"} + + truncate_texts = [text[0:max_token_size] for text in texts] + + payload = {"model": model, "input": truncate_texts, "encoding_format": "base64"} + + base64_strings = [] + async with aiohttp.ClientSession() as session: + async with session.post(base_url, headers=headers, json=payload) as response: + content = await response.json() + if "code" in content: + raise ValueError(content) + base64_strings = [item["embedding"] for item in content["data"]] + + embeddings = [] + for string in base64_strings: + decode_bytes = base64.b64decode(string) + n = len(decode_bytes) // 4 + float_array = struct.unpack("<" + "f" * n, decode_bytes) + embeddings.append(float_array) + return np.array(embeddings) diff --git a/LightRAG/lightrag/llm/gemini.py b/LightRAG/lightrag/llm/gemini.py new file mode 100644 index 00000000..37ce7206 --- /dev/null +++ b/LightRAG/lightrag/llm/gemini.py @@ -0,0 +1,595 @@ +""" +Gemini LLM binding for LightRAG. + +This module provides asynchronous helpers that adapt Google's Gemini models +to the same interface used by the rest of the LightRAG LLM bindings. The +implementation mirrors the OpenAI helpers while relying on the official +``google-genai`` client under the hood. +""" + +from __future__ import annotations + +import asyncio +import logging +import os +from collections.abc import AsyncIterator +from functools import lru_cache +from typing import Any + +import numpy as np +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from lightrag.utils import ( + logger, + remove_think_tags, + safe_unicode_decode, + wrap_embedding_func_with_attrs, +) + +import pipmaster as pm + +# Install the Google Gemini client and its dependencies on demand +if not pm.is_installed("google-genai"): + pm.install("google-genai") +if not pm.is_installed("google-api-core"): + pm.install("google-api-core") + +from google import genai # type: ignore +from google.genai import types # type: ignore +from google.api_core import exceptions as google_api_exceptions # type: ignore + +DEFAULT_GEMINI_ENDPOINT = "https://generativelanguage.googleapis.com" + +LOG = logging.getLogger(__name__) + + +class InvalidResponseError(Exception): + """Custom exception class for triggering retry mechanism when Gemini returns empty responses""" + + pass + + +@lru_cache(maxsize=8) +def _get_gemini_client( + api_key: str, base_url: str | None, timeout: int | None = None +) -> genai.Client: + """ + Create (or fetch cached) Gemini client. + + Args: + api_key: Google Gemini API key. + base_url: Optional custom API endpoint. + timeout: Optional request timeout in milliseconds. + + Returns: + genai.Client: Configured Gemini client instance. + """ + client_kwargs: dict[str, Any] = {"api_key": api_key} + + if base_url and base_url != DEFAULT_GEMINI_ENDPOINT or timeout is not None: + try: + http_options_kwargs = {} + if base_url and base_url != DEFAULT_GEMINI_ENDPOINT: + http_options_kwargs["api_endpoint"] = base_url + if timeout is not None: + http_options_kwargs["timeout"] = timeout + + client_kwargs["http_options"] = types.HttpOptions(**http_options_kwargs) + except Exception as exc: # pragma: no cover - defensive + LOG.warning("Failed to apply custom Gemini http_options: %s", exc) + + try: + return genai.Client(**client_kwargs) + except TypeError: + # Older google-genai releases don't accept http_options; retry without it. + client_kwargs.pop("http_options", None) + return genai.Client(**client_kwargs) + + +def _ensure_api_key(api_key: str | None) -> str: + key = api_key or os.getenv("LLM_BINDING_API_KEY") or os.getenv("GEMINI_API_KEY") + if not key: + raise ValueError( + "Gemini API key not provided. " + "Set LLM_BINDING_API_KEY or GEMINI_API_KEY in the environment." + ) + return key + + +def _build_generation_config( + base_config: dict[str, Any] | None, + system_prompt: str | None, + keyword_extraction: bool, +) -> types.GenerateContentConfig | None: + config_data = dict(base_config or {}) + + if system_prompt: + if config_data.get("system_instruction"): + config_data["system_instruction"] = ( + f"{config_data['system_instruction']}\n{system_prompt}" + ) + else: + config_data["system_instruction"] = system_prompt + + if keyword_extraction and not config_data.get("response_mime_type"): + config_data["response_mime_type"] = "application/json" + + # Remove entries that are explicitly set to None to avoid type errors + sanitized = { + key: value + for key, value in config_data.items() + if value is not None and value != "" + } + + if not sanitized: + return None + + return types.GenerateContentConfig(**sanitized) + + +def _format_history_messages(history_messages: list[dict[str, Any]] | None) -> str: + if not history_messages: + return "" + + history_lines: list[str] = [] + for message in history_messages: + role = message.get("role", "user") + content = message.get("content", "") + history_lines.append(f"[{role}] {content}") + + return "\n".join(history_lines) + + +def _extract_response_text( + response: Any, extract_thoughts: bool = False +) -> tuple[str, str]: + """ + Extract text content from Gemini response, separating regular content from thoughts. + + Args: + response: Gemini API response object + extract_thoughts: Whether to extract thought content separately + + Returns: + Tuple of (regular_text, thought_text) + """ + candidates = getattr(response, "candidates", None) + if not candidates: + return ("", "") + + regular_parts: list[str] = [] + thought_parts: list[str] = [] + + for candidate in candidates: + if not getattr(candidate, "content", None): + continue + # Use 'or []' to handle None values from parts attribute + for part in getattr(candidate.content, "parts", None) or []: + text = getattr(part, "text", None) + if not text: + continue + + # Check if this part is thought content using the 'thought' attribute + is_thought = getattr(part, "thought", False) + + if is_thought and extract_thoughts: + thought_parts.append(text) + elif not is_thought: + regular_parts.append(text) + + return ("\n".join(regular_parts), "\n".join(thought_parts)) + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(google_api_exceptions.InternalServerError) + | retry_if_exception_type(google_api_exceptions.ServiceUnavailable) + | retry_if_exception_type(google_api_exceptions.ResourceExhausted) + | retry_if_exception_type(google_api_exceptions.GatewayTimeout) + | retry_if_exception_type(google_api_exceptions.BadGateway) + | retry_if_exception_type(google_api_exceptions.DeadlineExceeded) + | retry_if_exception_type(google_api_exceptions.Aborted) + | retry_if_exception_type(google_api_exceptions.Unknown) + | retry_if_exception_type(InvalidResponseError) + ), +) +async def gemini_complete_if_cache( + model: str, + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + base_url: str | None = None, + api_key: str | None = None, + token_tracker: Any | None = None, + stream: bool | None = None, + keyword_extraction: bool = False, + generation_config: dict[str, Any] | None = None, + timeout: int | None = None, + **_: Any, +) -> str | AsyncIterator[str]: + """ + Complete a prompt using Gemini's API with Chain of Thought (COT) support. + + This function supports automatic integration of reasoning content from Gemini models + that provide Chain of Thought capabilities via the thinking_config API feature. + + COT Integration: + - When enable_cot=True: Thought content is wrapped in ... tags + - When enable_cot=False: Thought content is filtered out, only regular content returned + - Thought content is identified by the 'thought' attribute on response parts + - Requires thinking_config to be enabled in generation_config for API to return thoughts + + Args: + model: The Gemini model to use. + prompt: The prompt to complete. + system_prompt: Optional system prompt to include. + history_messages: Optional list of previous messages in the conversation. + api_key: Optional Gemini API key. If None, uses environment variable. + base_url: Optional custom API endpoint. + generation_config: Optional generation configuration dict. + keyword_extraction: Whether to use JSON response format. + token_tracker: Optional token usage tracker for monitoring API usage. + stream: Whether to stream the response. + hashing_kv: Storage interface (for interface parity with other bindings). + enable_cot: Whether to include Chain of Thought content in the response. + timeout: Request timeout in seconds (will be converted to milliseconds for Gemini API). + **_: Additional keyword arguments (ignored). + + Returns: + The completed text (with COT content if enable_cot=True) or an async iterator + of text chunks if streaming. COT content is wrapped in ... tags. + + Raises: + RuntimeError: If the response from Gemini is empty. + ValueError: If API key is not provided or configured. + """ + loop = asyncio.get_running_loop() + + key = _ensure_api_key(api_key) + # Convert timeout from seconds to milliseconds for Gemini API + timeout_ms = timeout * 1000 if timeout else None + client = _get_gemini_client(key, base_url, timeout_ms) + + history_block = _format_history_messages(history_messages) + prompt_sections = [] + if history_block: + prompt_sections.append(history_block) + prompt_sections.append(f"[user] {prompt}") + combined_prompt = "\n".join(prompt_sections) + + config_obj = _build_generation_config( + generation_config, + system_prompt=system_prompt, + keyword_extraction=keyword_extraction, + ) + + request_kwargs: dict[str, Any] = { + "model": model, + "contents": [combined_prompt], + } + if config_obj is not None: + request_kwargs["config"] = config_obj + + def _call_model(): + return client.models.generate_content(**request_kwargs) + + if stream: + queue: asyncio.Queue[Any] = asyncio.Queue() + usage_container: dict[str, Any] = {} + + def _stream_model() -> None: + # COT state tracking for streaming + cot_active = False + cot_started = False + initial_content_seen = False + + try: + stream_kwargs = dict(request_kwargs) + stream_iterator = client.models.generate_content_stream(**stream_kwargs) + for chunk in stream_iterator: + usage = getattr(chunk, "usage_metadata", None) + if usage is not None: + usage_container["usage"] = usage + + # Extract both regular and thought content + regular_text, thought_text = _extract_response_text( + chunk, extract_thoughts=True + ) + + if enable_cot: + # Process regular content + if regular_text: + if not initial_content_seen: + initial_content_seen = True + + # Close COT section if it was active + if cot_active: + loop.call_soon_threadsafe(queue.put_nowait, "") + cot_active = False + + # Send regular content + loop.call_soon_threadsafe(queue.put_nowait, regular_text) + + # Process thought content + if thought_text: + if not initial_content_seen and not cot_started: + # Start COT section + loop.call_soon_threadsafe(queue.put_nowait, "") + cot_active = True + cot_started = True + + # Send thought content if COT is active + if cot_active: + loop.call_soon_threadsafe( + queue.put_nowait, thought_text + ) + else: + # COT disabled - only send regular content + if regular_text: + loop.call_soon_threadsafe(queue.put_nowait, regular_text) + + # Ensure COT is properly closed if still active + if cot_active: + loop.call_soon_threadsafe(queue.put_nowait, "") + + loop.call_soon_threadsafe(queue.put_nowait, None) + except Exception as exc: # pragma: no cover - surface runtime issues + # Try to close COT tag before reporting error + if cot_active: + try: + loop.call_soon_threadsafe(queue.put_nowait, "") + except Exception: + pass + loop.call_soon_threadsafe(queue.put_nowait, exc) + + loop.run_in_executor(None, _stream_model) + + async def _async_stream() -> AsyncIterator[str]: + try: + while True: + item = await queue.get() + if item is None: + break + if isinstance(item, Exception): + raise item + + chunk_text = str(item) + if "\\u" in chunk_text: + chunk_text = safe_unicode_decode(chunk_text.encode("utf-8")) + + # Yield the chunk directly without filtering + # COT filtering is already handled in _stream_model() + yield chunk_text + finally: + usage = usage_container.get("usage") + if token_tracker and usage: + token_tracker.add_usage( + { + "prompt_tokens": getattr(usage, "prompt_token_count", 0), + "completion_tokens": getattr( + usage, "candidates_token_count", 0 + ), + "total_tokens": getattr(usage, "total_token_count", 0), + } + ) + + return _async_stream() + + response = await asyncio.to_thread(_call_model) + + # Extract both regular text and thought text + regular_text, thought_text = _extract_response_text(response, extract_thoughts=True) + + # Apply COT filtering logic based on enable_cot parameter + if enable_cot: + # Include thought content wrapped in tags + if thought_text and thought_text.strip(): + if not regular_text or regular_text.strip() == "": + # Only thought content available + final_text = f"{thought_text}" + else: + # Both content types present: prepend thought to regular content + final_text = f"{thought_text}{regular_text}" + else: + # No thought content, use regular content only + final_text = regular_text or "" + else: + # Filter out thought content, return only regular content + final_text = regular_text or "" + + if not final_text: + raise InvalidResponseError("Gemini response did not contain any text content.") + + if "\\u" in final_text: + final_text = safe_unicode_decode(final_text.encode("utf-8")) + + final_text = remove_think_tags(final_text) + + usage = getattr(response, "usage_metadata", None) + if token_tracker and usage: + token_tracker.add_usage( + { + "prompt_tokens": getattr(usage, "prompt_token_count", 0), + "completion_tokens": getattr(usage, "candidates_token_count", 0), + "total_tokens": getattr(usage, "total_token_count", 0), + } + ) + + logger.debug("Gemini response length: %s", len(final_text)) + return final_text + + +async def gemini_model_complete( + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + keyword_extraction: bool = False, + **kwargs: Any, +) -> str | AsyncIterator[str]: + hashing_kv = kwargs.get("hashing_kv") + model_name = None + if hashing_kv is not None: + model_name = hashing_kv.global_config.get("llm_model_name") + if model_name is None: + model_name = kwargs.pop("model_name", None) + if model_name is None: + raise ValueError("Gemini model name not provided in configuration.") + + return await gemini_complete_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + keyword_extraction=keyword_extraction, + **kwargs, + ) + + +@wrap_embedding_func_with_attrs(embedding_dim=1536, max_token_size=2048) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(google_api_exceptions.InternalServerError) + | retry_if_exception_type(google_api_exceptions.ServiceUnavailable) + | retry_if_exception_type(google_api_exceptions.ResourceExhausted) + | retry_if_exception_type(google_api_exceptions.GatewayTimeout) + | retry_if_exception_type(google_api_exceptions.BadGateway) + | retry_if_exception_type(google_api_exceptions.DeadlineExceeded) + | retry_if_exception_type(google_api_exceptions.Aborted) + | retry_if_exception_type(google_api_exceptions.Unknown) + ), +) +async def gemini_embed( + texts: list[str], + model: str = "gemini-embedding-001", + base_url: str | None = None, + api_key: str | None = None, + embedding_dim: int | None = None, + task_type: str = "RETRIEVAL_DOCUMENT", + timeout: int | None = None, + token_tracker: Any | None = None, +) -> np.ndarray: + """Generate embeddings for a list of texts using Gemini's API. + + This function uses Google's Gemini embedding model to generate text embeddings. + It supports dynamic dimension control and automatic normalization for dimensions + less than 3072. + + Args: + texts: List of texts to embed. + model: The Gemini embedding model to use. Default is "gemini-embedding-001". + base_url: Optional custom API endpoint. + api_key: Optional Gemini API key. If None, uses environment variables. + embedding_dim: Optional embedding dimension for dynamic dimension reduction. + **IMPORTANT**: This parameter is automatically injected by the EmbeddingFunc wrapper. + Do NOT manually pass this parameter when calling the function directly. + The dimension is controlled by the @wrap_embedding_func_with_attrs decorator + or the EMBEDDING_DIM environment variable. + Supported range: 128-3072. Recommended values: 768, 1536, 3072. + task_type: Task type for embedding optimization. Default is "RETRIEVAL_DOCUMENT". + Supported types: SEMANTIC_SIMILARITY, CLASSIFICATION, CLUSTERING, + RETRIEVAL_DOCUMENT, RETRIEVAL_QUERY, CODE_RETRIEVAL_QUERY, + QUESTION_ANSWERING, FACT_VERIFICATION. + timeout: Request timeout in seconds (will be converted to milliseconds for Gemini API). + token_tracker: Optional token usage tracker for monitoring API usage. + + Returns: + A numpy array of embeddings, one per input text. For dimensions < 3072, + the embeddings are L2-normalized to ensure optimal semantic similarity performance. + + Raises: + ValueError: If API key is not provided or configured. + RuntimeError: If the response from Gemini is invalid or empty. + + Note: + - For dimension 3072: Embeddings are already normalized by the API + - For dimensions < 3072: Embeddings are L2-normalized after retrieval + - Normalization ensures accurate semantic similarity via cosine distance + """ + loop = asyncio.get_running_loop() + + key = _ensure_api_key(api_key) + # Convert timeout from seconds to milliseconds for Gemini API + timeout_ms = timeout * 1000 if timeout else None + client = _get_gemini_client(key, base_url, timeout_ms) + + # Prepare embedding configuration + config_kwargs: dict[str, Any] = {} + + # Add task_type to config + if task_type: + config_kwargs["task_type"] = task_type + + # Add output_dimensionality if embedding_dim is provided + if embedding_dim is not None: + config_kwargs["output_dimensionality"] = embedding_dim + + # Create config object if we have parameters + config_obj = types.EmbedContentConfig(**config_kwargs) if config_kwargs else None + + def _call_embed() -> Any: + """Call Gemini embedding API in executor thread.""" + request_kwargs: dict[str, Any] = { + "model": model, + "contents": texts, + } + if config_obj is not None: + request_kwargs["config"] = config_obj + + return client.models.embed_content(**request_kwargs) + + # Execute API call in thread pool + response = await loop.run_in_executor(None, _call_embed) + + # Extract embeddings from response + if not hasattr(response, "embeddings") or not response.embeddings: + raise RuntimeError("Gemini response did not contain embeddings.") + + # Convert embeddings to numpy array + embeddings = np.array( + [np.array(e.values, dtype=np.float32) for e in response.embeddings] + ) + + # Apply L2 normalization for dimensions < 3072 + # The 3072 dimension embedding is already normalized by Gemini API + if embedding_dim and embedding_dim < 3072: + # Normalize each embedding vector to unit length + norms = np.linalg.norm(embeddings, axis=1, keepdims=True) + # Avoid division by zero + norms = np.where(norms == 0, 1, norms) + embeddings = embeddings / norms + logger.debug( + f"Applied L2 normalization to {len(embeddings)} embeddings of dimension {embedding_dim}" + ) + + # Track token usage if tracker is provided + # Note: Gemini embedding API may not provide usage metadata + if token_tracker and hasattr(response, "usage_metadata"): + usage = response.usage_metadata + token_counts = { + "prompt_tokens": getattr(usage, "prompt_token_count", 0), + "total_tokens": getattr(usage, "total_token_count", 0), + } + token_tracker.add_usage(token_counts) + + logger.debug( + f"Generated {len(embeddings)} Gemini embeddings with dimension {embeddings.shape[1]}" + ) + + return embeddings + + +__all__ = [ + "gemini_complete_if_cache", + "gemini_model_complete", + "gemini_embed", +] diff --git a/LightRAG/lightrag/llm/hf.py b/LightRAG/lightrag/llm/hf.py new file mode 100644 index 00000000..447f95c3 --- /dev/null +++ b/LightRAG/lightrag/llm/hf.py @@ -0,0 +1,175 @@ +import copy +import os +from functools import lru_cache + +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("transformers"): + pm.install("transformers") +if not pm.is_installed("torch"): + pm.install("torch") +if not pm.is_installed("numpy"): + pm.install("numpy") + +from transformers import AutoTokenizer, AutoModelForCausalLM +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.exceptions import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +import torch +import numpy as np +from lightrag.utils import wrap_embedding_func_with_attrs + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + + +@lru_cache(maxsize=1) +def initialize_hf_model(model_name): + hf_tokenizer = AutoTokenizer.from_pretrained( + model_name, device_map="auto", trust_remote_code=True + ) + hf_model = AutoModelForCausalLM.from_pretrained( + model_name, device_map="auto", trust_remote_code=True + ) + if hf_tokenizer.pad_token is None: + hf_tokenizer.pad_token = hf_tokenizer.eos_token + + return hf_model, hf_tokenizer + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def hf_model_if_cache( + model, + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + **kwargs, +) -> str: + if enable_cot: + from lightrag.utils import logger + + logger.debug( + "enable_cot=True is not supported for Hugging Face local models and will be ignored." + ) + model_name = model + hf_model, hf_tokenizer = initialize_hf_model(model_name) + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + kwargs.pop("hashing_kv", None) + input_prompt = "" + try: + input_prompt = hf_tokenizer.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True + ) + except Exception: + try: + ori_message = copy.deepcopy(messages) + if messages[0]["role"] == "system": + messages[1]["content"] = ( + "" + + messages[0]["content"] + + "\n" + + messages[1]["content"] + ) + messages = messages[1:] + input_prompt = hf_tokenizer.apply_chat_template( + messages, tokenize=False, add_generation_prompt=True + ) + except Exception: + len_message = len(ori_message) + for msgid in range(len_message): + input_prompt = ( + input_prompt + + "<" + + ori_message[msgid]["role"] + + ">" + + ori_message[msgid]["content"] + + "\n" + ) + + input_ids = hf_tokenizer( + input_prompt, return_tensors="pt", padding=True, truncation=True + ).to("cuda") + inputs = {k: v.to(hf_model.device) for k, v in input_ids.items()} + output = hf_model.generate( + **input_ids, max_new_tokens=512, num_return_sequences=1, early_stopping=True + ) + response_text = hf_tokenizer.decode( + output[0][len(inputs["input_ids"][0]) :], skip_special_tokens=True + ) + + return response_text + + +async def hf_model_complete( + prompt, + system_prompt=None, + history_messages=[], + keyword_extraction=False, + enable_cot: bool = False, + **kwargs, +) -> str: + kwargs.pop("keyword_extraction", None) + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + result = await hf_model_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + return result + + +@wrap_embedding_func_with_attrs(embedding_dim=1024, max_token_size=8192) +async def hf_embed(texts: list[str], tokenizer, embed_model) -> np.ndarray: + # Detect the appropriate device + if torch.cuda.is_available(): + device = next(embed_model.parameters()).device # Use CUDA if available + elif torch.backends.mps.is_available(): + device = torch.device("mps") # Use MPS for Apple Silicon + else: + device = torch.device("cpu") # Fallback to CPU + + # Move the model to the detected device + embed_model = embed_model.to(device) + + # Tokenize the input texts and move them to the same device + encoded_texts = tokenizer( + texts, return_tensors="pt", padding=True, truncation=True + ).to(device) + + # Perform inference + with torch.no_grad(): + outputs = embed_model( + input_ids=encoded_texts["input_ids"], + attention_mask=encoded_texts["attention_mask"], + ) + embeddings = outputs.last_hidden_state.mean(dim=1) + + # Convert embeddings to NumPy + if embeddings.dtype == torch.bfloat16: + return embeddings.detach().to(torch.float32).cpu().numpy() + else: + return embeddings.detach().cpu().numpy() diff --git a/LightRAG/lightrag/llm/jina.py b/LightRAG/lightrag/llm/jina.py new file mode 100644 index 00000000..f61faadd --- /dev/null +++ b/LightRAG/lightrag/llm/jina.py @@ -0,0 +1,152 @@ +import os +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("aiohttp"): + pm.install("aiohttp") +if not pm.is_installed("tenacity"): + pm.install("tenacity") + +import numpy as np +import base64 +import aiohttp +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.utils import wrap_embedding_func_with_attrs, logger + + +async def fetch_data(url, headers, data): + async with aiohttp.ClientSession() as session: + async with session.post(url, headers=headers, json=data) as response: + if response.status != 200: + error_text = await response.text() + + # Check if the error response is HTML (common for 502, 503, etc.) + content_type = response.headers.get("content-type", "").lower() + is_html_error = ( + error_text.strip().startswith("") + or "text/html" in content_type + ) + + if is_html_error: + # Provide clean, user-friendly error messages for HTML error pages + if response.status == 502: + clean_error = "Bad Gateway (502) - Jina AI service temporarily unavailable. Please try again in a few minutes." + elif response.status == 503: + clean_error = "Service Unavailable (503) - Jina AI service is temporarily overloaded. Please try again later." + elif response.status == 504: + clean_error = "Gateway Timeout (504) - Jina AI service request timed out. Please try again." + else: + clean_error = f"HTTP {response.status} - Jina AI service error. Please try again later." + else: + # Use original error text if it's not HTML + clean_error = error_text + + logger.error(f"Jina API error {response.status}: {clean_error}") + raise aiohttp.ClientResponseError( + request_info=response.request_info, + history=response.history, + status=response.status, + message=f"Jina API error: {clean_error}", + ) + response_json = await response.json() + data_list = response_json.get("data", []) + return data_list + + +@wrap_embedding_func_with_attrs(embedding_dim=2048, max_token_size=8192) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(aiohttp.ClientError) + | retry_if_exception_type(aiohttp.ClientResponseError) + ), +) +async def jina_embed( + texts: list[str], + embedding_dim: int = 2048, + late_chunking: bool = False, + base_url: str = None, + api_key: str = None, +) -> np.ndarray: + """Generate embeddings for a list of texts using Jina AI's API. + + Args: + texts: List of texts to embed. + embedding_dim: The embedding dimensions (default: 2048 for jina-embeddings-v4). + **IMPORTANT**: This parameter is automatically injected by the EmbeddingFunc wrapper. + Do NOT manually pass this parameter when calling the function directly. + The dimension is controlled by the @wrap_embedding_func_with_attrs decorator. + Manually passing a different value will trigger a warning and be ignored. + When provided (by EmbeddingFunc), it will be passed to the Jina API for dimension reduction. + late_chunking: Whether to use late chunking. + base_url: Optional base URL for the Jina API. + api_key: Optional Jina API key. If None, uses the JINA_API_KEY environment variable. + + Returns: + A numpy array of embeddings, one per input text. + + Raises: + aiohttp.ClientError: If there is a connection error with the Jina API. + aiohttp.ClientResponseError: If the Jina API returns an error response. + """ + if api_key: + os.environ["JINA_API_KEY"] = api_key + + if "JINA_API_KEY" not in os.environ: + raise ValueError("JINA_API_KEY environment variable is required") + + url = base_url or "https://api.jina.ai/v1/embeddings" + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {os.environ['JINA_API_KEY']}", + } + data = { + "model": "jina-embeddings-v4", + "task": "text-matching", + "dimensions": embedding_dim, + "embedding_type": "base64", + "input": texts, + } + + # Only add optional parameters if they have non-default values + if late_chunking: + data["late_chunking"] = late_chunking + + logger.debug( + f"Jina embedding request: {len(texts)} texts, dimensions: {embedding_dim}" + ) + + try: + data_list = await fetch_data(url, headers, data) + + if not data_list: + logger.error("Jina API returned empty data list") + raise ValueError("Jina API returned empty data list") + + if len(data_list) != len(texts): + logger.error( + f"Jina API returned {len(data_list)} embeddings for {len(texts)} texts" + ) + raise ValueError( + f"Jina API returned {len(data_list)} embeddings for {len(texts)} texts" + ) + + embeddings = np.array( + [ + np.frombuffer(base64.b64decode(dp["embedding"]), dtype=np.float32) + for dp in data_list + ] + ) + logger.debug(f"Jina embeddings generated: shape {embeddings.shape}") + + return embeddings + + except Exception as e: + logger.error(f"Jina embedding error: {e}") + raise diff --git a/LightRAG/lightrag/llm/llama_index_impl.py b/LightRAG/lightrag/llm/llama_index_impl.py new file mode 100644 index 00000000..c44e6c7a --- /dev/null +++ b/LightRAG/lightrag/llm/llama_index_impl.py @@ -0,0 +1,208 @@ +import pipmaster as pm +from llama_index.core.llms import ( + ChatMessage, + MessageRole, + ChatResponse, +) +from typing import List, Optional +from lightrag.utils import logger + +# Install required dependencies +if not pm.is_installed("llama-index"): + pm.install("llama-index") + +from llama_index.core.embeddings import BaseEmbedding +from llama_index.core.settings import Settings as LlamaIndexSettings +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.utils import ( + wrap_embedding_func_with_attrs, +) +from lightrag.exceptions import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +import numpy as np + + +def configure_llama_index(settings: LlamaIndexSettings = None, **kwargs): + """ + Configure LlamaIndex settings. + + Args: + settings: LlamaIndex Settings instance. If None, uses default settings. + **kwargs: Additional settings to override/configure + """ + if settings is None: + settings = LlamaIndexSettings() + + # Update settings with any provided kwargs + for key, value in kwargs.items(): + if hasattr(settings, key): + setattr(settings, key, value) + else: + logger.warning(f"Unknown LlamaIndex setting: {key}") + + # Set as global settings + LlamaIndexSettings.set_global(settings) + return settings + + +def format_chat_messages(messages): + """Format chat messages into LlamaIndex format.""" + formatted_messages = [] + + for msg in messages: + role = msg.get("role", "user") + content = msg.get("content", "") + + if role == "system": + formatted_messages.append( + ChatMessage(role=MessageRole.SYSTEM, content=content) + ) + elif role == "assistant": + formatted_messages.append( + ChatMessage(role=MessageRole.ASSISTANT, content=content) + ) + elif role == "user": + formatted_messages.append( + ChatMessage(role=MessageRole.USER, content=content) + ) + else: + logger.warning(f"Unknown role {role}, treating as user message") + formatted_messages.append( + ChatMessage(role=MessageRole.USER, content=content) + ) + + return formatted_messages + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def llama_index_complete_if_cache( + model: str, + prompt: str, + system_prompt: Optional[str] = None, + history_messages: List[dict] = [], + enable_cot: bool = False, + chat_kwargs={}, +) -> str: + """Complete the prompt using LlamaIndex.""" + if enable_cot: + logger.debug( + "enable_cot=True is not supported for LlamaIndex implementation and will be ignored." + ) + try: + # Format messages for chat + formatted_messages = [] + + # Add system message if provided + if system_prompt: + formatted_messages.append( + ChatMessage(role=MessageRole.SYSTEM, content=system_prompt) + ) + + # Add history messages + for msg in history_messages: + formatted_messages.append( + ChatMessage( + role=MessageRole.USER + if msg["role"] == "user" + else MessageRole.ASSISTANT, + content=msg["content"], + ) + ) + + # Add current prompt + formatted_messages.append(ChatMessage(role=MessageRole.USER, content=prompt)) + + response: ChatResponse = await model.achat( + messages=formatted_messages, **chat_kwargs + ) + + # In newer versions, the response is in message.content + content = response.message.content + return content + + except Exception as e: + logger.error(f"Error in llama_index_complete_if_cache: {str(e)}") + raise + + +async def llama_index_complete( + prompt, + system_prompt=None, + history_messages=None, + enable_cot: bool = False, + keyword_extraction=False, + settings: LlamaIndexSettings = None, + **kwargs, +) -> str: + """ + Main completion function for LlamaIndex + + Args: + prompt: Input prompt + system_prompt: Optional system prompt + history_messages: Optional chat history + keyword_extraction: Whether to extract keywords from response + settings: Optional LlamaIndex settings + **kwargs: Additional arguments + """ + if history_messages is None: + history_messages = [] + + kwargs.pop("keyword_extraction", None) + result = await llama_index_complete_if_cache( + kwargs.get("llm_instance"), + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + return result + + +@wrap_embedding_func_with_attrs(embedding_dim=1536, max_token_size=8192) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def llama_index_embed( + texts: list[str], + embed_model: BaseEmbedding = None, + settings: LlamaIndexSettings = None, + **kwargs, +) -> np.ndarray: + """ + Generate embeddings using LlamaIndex + + Args: + texts: List of texts to embed + embed_model: LlamaIndex embedding model + settings: Optional LlamaIndex settings + **kwargs: Additional arguments + """ + if settings: + configure_llama_index(settings) + + if embed_model is None: + raise ValueError("embed_model must be provided") + + # Use _get_text_embeddings for batch processing + embeddings = embed_model._get_text_embeddings(texts) + return np.array(embeddings) diff --git a/LightRAG/lightrag/llm/lmdeploy.py b/LightRAG/lightrag/llm/lmdeploy.py new file mode 100644 index 00000000..8916b0fd --- /dev/null +++ b/LightRAG/lightrag/llm/lmdeploy.py @@ -0,0 +1,154 @@ +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("lmdeploy"): + pm.install("lmdeploy[all]") + +from lightrag.exceptions import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + + +from functools import lru_cache + + +@lru_cache(maxsize=1) +def initialize_lmdeploy_pipeline( + model, + tp=1, + chat_template=None, + log_level="WARNING", + model_format="hf", + quant_policy=0, +): + from lmdeploy import pipeline, ChatTemplateConfig, TurbomindEngineConfig + + lmdeploy_pipe = pipeline( + model_path=model, + backend_config=TurbomindEngineConfig( + tp=tp, model_format=model_format, quant_policy=quant_policy + ), + chat_template_config=( + ChatTemplateConfig(model_name=chat_template) if chat_template else None + ), + log_level="WARNING", + ) + return lmdeploy_pipe + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def lmdeploy_model_if_cache( + model, + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + chat_template=None, + model_format="hf", + quant_policy=0, + **kwargs, +) -> str: + """ + Args: + model (str): The path to the model. + It could be one of the following options: + - i) A local directory path of a turbomind model which is + converted by `lmdeploy convert` command or download + from ii) and iii). + - ii) The model_id of a lmdeploy-quantized model hosted + inside a model repo on huggingface.co, such as + "InternLM/internlm-chat-20b-4bit", + "lmdeploy/llama2-chat-70b-4bit", etc. + - iii) The model_id of a model hosted inside a model repo + on huggingface.co, such as "internlm/internlm-chat-7b", + "Qwen/Qwen-7B-Chat ", "baichuan-inc/Baichuan2-7B-Chat" + and so on. + chat_template (str): needed when model is a pytorch model on + huggingface.co, such as "internlm-chat-7b", + "Qwen-7B-Chat ", "Baichuan2-7B-Chat" and so on, + and when the model name of local path did not match the original model name in HF. + tp (int): tensor parallel + prompt (Union[str, List[str]]): input texts to be completed. + do_preprocess (bool): whether pre-process the messages. Default to + True, which means chat_template will be applied. + skip_special_tokens (bool): Whether or not to remove special tokens + in the decoding. Default to be True. + do_sample (bool): Whether or not to use sampling, use greedy decoding otherwise. + Default to be False, which means greedy decoding will be applied. + """ + if enable_cot: + from lightrag.utils import logger + + logger.debug( + "enable_cot=True is not supported for lmdeploy and will be ignored." + ) + try: + import lmdeploy + from lmdeploy import version_info, GenerationConfig + except Exception: + raise ImportError("Please install lmdeploy before initialize lmdeploy backend.") + kwargs.pop("hashing_kv", None) + kwargs.pop("response_format", None) + max_new_tokens = kwargs.pop("max_tokens", 512) + tp = kwargs.pop("tp", 1) + skip_special_tokens = kwargs.pop("skip_special_tokens", True) + do_preprocess = kwargs.pop("do_preprocess", True) + do_sample = kwargs.pop("do_sample", False) + gen_params = kwargs + + version = version_info + if do_sample is not None and version < (0, 6, 0): + raise RuntimeError( + "`do_sample` parameter is not supported by lmdeploy until " + f"v0.6.0, but currently using lmdeloy {lmdeploy.__version__}" + ) + else: + do_sample = True + gen_params.update(do_sample=do_sample) + + lmdeploy_pipe = initialize_lmdeploy_pipeline( + model=model, + tp=tp, + chat_template=chat_template, + model_format=model_format, + quant_policy=quant_policy, + log_level="WARNING", + ) + + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + gen_config = GenerationConfig( + skip_special_tokens=skip_special_tokens, + max_new_tokens=max_new_tokens, + **gen_params, + ) + + response = "" + async for res in lmdeploy_pipe.generate( + messages, + gen_config=gen_config, + do_preprocess=do_preprocess, + stream_response=False, + session_id=1, + ): + response += res.response + return response diff --git a/LightRAG/lightrag/llm/lollms.py b/LightRAG/lightrag/llm/lollms.py new file mode 100644 index 00000000..2f2a1dbf --- /dev/null +++ b/LightRAG/lightrag/llm/lollms.py @@ -0,0 +1,175 @@ +import sys + +if sys.version_info < (3, 9): + from typing import AsyncIterator +else: + from collections.abc import AsyncIterator +import pipmaster as pm # Pipmaster for dynamic library install + +if not pm.is_installed("aiohttp"): + pm.install("aiohttp") + +import aiohttp +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from lightrag.exceptions import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) + +from typing import Union, List +import numpy as np + +from lightrag.utils import ( + wrap_embedding_func_with_attrs, +) + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def lollms_model_if_cache( + model, + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + base_url="http://localhost:9600", + **kwargs, +) -> Union[str, AsyncIterator[str]]: + """Client implementation for lollms generation.""" + if enable_cot: + from lightrag.utils import logger + + logger.debug("enable_cot=True is not supported for lollms and will be ignored.") + + stream = True if kwargs.get("stream") else False + api_key = kwargs.pop("api_key", None) + headers = ( + {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"} + if api_key + else {"Content-Type": "application/json"} + ) + + # Extract lollms specific parameters + request_data = { + "prompt": prompt, + "model_name": model, + "personality": kwargs.get("personality", -1), + "n_predict": kwargs.get("n_predict", None), + "stream": stream, + "temperature": kwargs.get("temperature", 1.0), + "top_k": kwargs.get("top_k", 50), + "top_p": kwargs.get("top_p", 0.95), + "repeat_penalty": kwargs.get("repeat_penalty", 0.8), + "repeat_last_n": kwargs.get("repeat_last_n", 40), + "seed": kwargs.get("seed", None), + "n_threads": kwargs.get("n_threads", 8), + } + + # Prepare the full prompt including history + full_prompt = "" + if system_prompt: + full_prompt += f"{system_prompt}\n" + for msg in history_messages: + full_prompt += f"{msg['role']}: {msg['content']}\n" + full_prompt += prompt + + request_data["prompt"] = full_prompt + timeout = aiohttp.ClientTimeout(total=kwargs.get("timeout", None)) + + async with aiohttp.ClientSession(timeout=timeout, headers=headers) as session: + if stream: + + async def inner(): + async with session.post( + f"{base_url}/lollms_generate", json=request_data + ) as response: + async for line in response.content: + yield line.decode().strip() + + return inner() + else: + async with session.post( + f"{base_url}/lollms_generate", json=request_data + ) as response: + return await response.text() + + +async def lollms_model_complete( + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + keyword_extraction=False, + **kwargs, +) -> Union[str, AsyncIterator[str]]: + """Complete function for lollms model generation.""" + + # Extract and remove keyword_extraction from kwargs if present + keyword_extraction = kwargs.pop("keyword_extraction", None) + + # Get model name from config + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + + # If keyword extraction is needed, we might need to modify the prompt + # or add specific parameters for JSON output (if lollms supports it) + if keyword_extraction: + # Note: You might need to adjust this based on how lollms handles structured output + pass + + return await lollms_model_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +@wrap_embedding_func_with_attrs(embedding_dim=1024, max_token_size=8192) +async def lollms_embed( + texts: List[str], embed_model=None, base_url="http://localhost:9600", **kwargs +) -> np.ndarray: + """ + Generate embeddings for a list of texts using lollms server. + + Args: + texts: List of strings to embed + embed_model: Model name (not used directly as lollms uses configured vectorizer) + base_url: URL of the lollms server + **kwargs: Additional arguments passed to the request + + Returns: + np.ndarray: Array of embeddings + """ + api_key = kwargs.pop("api_key", None) + headers = ( + {"Content-Type": "application/json", "Authorization": api_key} + if api_key + else {"Content-Type": "application/json"} + ) + async with aiohttp.ClientSession(headers=headers) as session: + embeddings = [] + for text in texts: + request_data = {"text": text} + + async with session.post( + f"{base_url}/lollms_embed", + json=request_data, + ) as response: + result = await response.json() + embeddings.append(result["vector"]) + + return np.array(embeddings) diff --git a/LightRAG/lightrag/llm/nvidia_openai.py b/LightRAG/lightrag/llm/nvidia_openai.py new file mode 100644 index 00000000..1ebaf3a6 --- /dev/null +++ b/LightRAG/lightrag/llm/nvidia_openai.py @@ -0,0 +1,66 @@ +import sys +import os + +if sys.version_info < (3, 9): + pass +else: + pass + +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("openai"): + pm.install("openai") + +from openai import ( + AsyncOpenAI, + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from lightrag.utils import ( + wrap_embedding_func_with_attrs, +) + + +import numpy as np + + +@wrap_embedding_func_with_attrs(embedding_dim=2048, max_token_size=8192) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def nvidia_openai_embed( + texts: list[str], + model: str = "nvidia/llama-3.2-nv-embedqa-1b-v1", + # refer to https://build.nvidia.com/nim?filters=usecase%3Ausecase_text_to_embedding + base_url: str = "https://integrate.api.nvidia.com/v1", + api_key: str = None, + input_type: str = "passage", # query for retrieval, passage for embedding + trunc: str = "NONE", # NONE or START or END + encode: str = "float", # float or base64 +) -> np.ndarray: + if api_key: + os.environ["OPENAI_API_KEY"] = api_key + + openai_async_client = ( + AsyncOpenAI() if base_url is None else AsyncOpenAI(base_url=base_url) + ) + response = await openai_async_client.embeddings.create( + model=model, + input=texts, + encoding_format=encode, + extra_body={"input_type": input_type, "truncate": trunc}, + ) + return np.array([dp.embedding for dp in response.data]) diff --git a/LightRAG/lightrag/llm/ollama.py b/LightRAG/lightrag/llm/ollama.py new file mode 100644 index 00000000..e35dc293 --- /dev/null +++ b/LightRAG/lightrag/llm/ollama.py @@ -0,0 +1,214 @@ +from collections.abc import AsyncIterator +import os +import re + +import pipmaster as pm + +# install specific modules +if not pm.is_installed("ollama"): + pm.install("ollama") + +import ollama + +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.exceptions import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from lightrag.api import __api_version__ + +import numpy as np +from typing import Optional, Union +from lightrag.utils import ( + wrap_embedding_func_with_attrs, + logger, +) + + +_OLLAMA_CLOUD_HOST = "https://ollama.com" +_CLOUD_MODEL_SUFFIX_PATTERN = re.compile(r"(?:-cloud|:cloud)$") + + +def _coerce_host_for_cloud_model(host: Optional[str], model: object) -> Optional[str]: + if host: + return host + try: + model_name_str = str(model) if model is not None else "" + except (TypeError, ValueError, AttributeError) as e: + logger.warning(f"Failed to convert model to string: {e}, using empty string") + model_name_str = "" + if _CLOUD_MODEL_SUFFIX_PATTERN.search(model_name_str): + logger.debug( + f"Detected cloud model '{model_name_str}', using Ollama Cloud host" + ) + return _OLLAMA_CLOUD_HOST + return host + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def _ollama_model_if_cache( + model, + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + **kwargs, +) -> Union[str, AsyncIterator[str]]: + if enable_cot: + logger.debug("enable_cot=True is not supported for ollama and will be ignored.") + stream = True if kwargs.get("stream") else False + + kwargs.pop("max_tokens", None) + # kwargs.pop("response_format", None) # allow json + host = kwargs.pop("host", None) + timeout = kwargs.pop("timeout", None) + if timeout == 0: + timeout = None + kwargs.pop("hashing_kv", None) + api_key = kwargs.pop("api_key", None) + # fallback to environment variable when not provided explicitly + if not api_key: + api_key = os.getenv("OLLAMA_API_KEY") + headers = { + "Content-Type": "application/json", + "User-Agent": f"LightRAG/{__api_version__}", + } + if api_key: + headers["Authorization"] = f"Bearer {api_key}" + + host = _coerce_host_for_cloud_model(host, model) + + ollama_client = ollama.AsyncClient(host=host, timeout=timeout, headers=headers) + + try: + messages = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + response = await ollama_client.chat(model=model, messages=messages, **kwargs) + if stream: + """cannot cache stream response and process reasoning""" + + async def inner(): + try: + async for chunk in response: + yield chunk["message"]["content"] + except Exception as e: + logger.error(f"Error in stream response: {str(e)}") + raise + finally: + try: + await ollama_client._client.aclose() + logger.debug("Successfully closed Ollama client for streaming") + except Exception as close_error: + logger.warning(f"Failed to close Ollama client: {close_error}") + + return inner() + else: + model_response = response["message"]["content"] + + """ + If the model also wraps its thoughts in a specific tag, + this information is not needed for the final + response and can simply be trimmed. + """ + + return model_response + except Exception as e: + try: + await ollama_client._client.aclose() + logger.debug("Successfully closed Ollama client after exception") + except Exception as close_error: + logger.warning( + f"Failed to close Ollama client after exception: {close_error}" + ) + raise e + finally: + if not stream: + try: + await ollama_client._client.aclose() + logger.debug( + "Successfully closed Ollama client for non-streaming response" + ) + except Exception as close_error: + logger.warning( + f"Failed to close Ollama client in finally block: {close_error}" + ) + + +async def ollama_model_complete( + prompt, + system_prompt=None, + history_messages=[], + enable_cot: bool = False, + keyword_extraction=False, + **kwargs, +) -> Union[str, AsyncIterator[str]]: + keyword_extraction = kwargs.pop("keyword_extraction", None) + if keyword_extraction: + kwargs["format"] = "json" + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + return await _ollama_model_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +@wrap_embedding_func_with_attrs(embedding_dim=1024, max_token_size=8192) +async def ollama_embed(texts: list[str], embed_model, **kwargs) -> np.ndarray: + api_key = kwargs.pop("api_key", None) + if not api_key: + api_key = os.getenv("OLLAMA_API_KEY") + headers = { + "Content-Type": "application/json", + "User-Agent": f"LightRAG/{__api_version__}", + } + if api_key: + headers["Authorization"] = f"Bearer {api_key}" + + host = kwargs.pop("host", None) + timeout = kwargs.pop("timeout", None) + + host = _coerce_host_for_cloud_model(host, embed_model) + + ollama_client = ollama.AsyncClient(host=host, timeout=timeout, headers=headers) + try: + options = kwargs.pop("options", {}) + data = await ollama_client.embed( + model=embed_model, input=texts, options=options + ) + return np.array(data["embeddings"]) + except Exception as e: + logger.error(f"Error in ollama_embed: {str(e)}") + try: + await ollama_client._client.aclose() + logger.debug("Successfully closed Ollama client after exception in embed") + except Exception as close_error: + logger.warning( + f"Failed to close Ollama client after exception in embed: {close_error}" + ) + raise e + finally: + try: + await ollama_client._client.aclose() + logger.debug("Successfully closed Ollama client after embed") + except Exception as close_error: + logger.warning(f"Failed to close Ollama client after embed: {close_error}") diff --git a/LightRAG/lightrag/llm/openai.py b/LightRAG/lightrag/llm/openai.py new file mode 100644 index 00000000..8c984e51 --- /dev/null +++ b/LightRAG/lightrag/llm/openai.py @@ -0,0 +1,686 @@ +from ..utils import verbose_debug, VERBOSE_DEBUG +import os +import logging + +from collections.abc import AsyncIterator + +import pipmaster as pm + +# install specific modules +if not pm.is_installed("openai"): + pm.install("openai") + +from openai import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from lightrag.utils import ( + wrap_embedding_func_with_attrs, + safe_unicode_decode, + logger, +) + +from lightrag.types import GPTKeywordExtractionFormat +from lightrag.api import __api_version__ + +import numpy as np +import base64 +from typing import Any, Union + +from dotenv import load_dotenv + +# Try to import Langfuse for LLM observability (optional) +# Falls back to standard OpenAI client if not available +# Langfuse requires proper configuration to work correctly +LANGFUSE_ENABLED = False +try: + # Check if required Langfuse environment variables are set + langfuse_public_key = os.environ.get("LANGFUSE_PUBLIC_KEY") + langfuse_secret_key = os.environ.get("LANGFUSE_SECRET_KEY") + + # Only enable Langfuse if both keys are configured + if langfuse_public_key and langfuse_secret_key: + from langfuse.openai import AsyncOpenAI # type: ignore[import-untyped] + + LANGFUSE_ENABLED = True + logger.info("Langfuse observability enabled for OpenAI client") + else: + from openai import AsyncOpenAI + + logger.debug( + "Langfuse environment variables not configured, using standard OpenAI client" + ) +except ImportError: + from openai import AsyncOpenAI + + logger.debug("Langfuse not available, using standard OpenAI client") + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +class InvalidResponseError(Exception): + """Custom exception class for triggering retry mechanism""" + + pass + + +def create_openai_async_client( + api_key: str | None = None, + base_url: str | None = None, + client_configs: dict[str, Any] | None = None, +) -> AsyncOpenAI: + """Create an AsyncOpenAI client with the given configuration. + + Args: + api_key: OpenAI API key. If None, uses the OPENAI_API_KEY environment variable. + base_url: Base URL for the OpenAI API. If None, uses the default OpenAI API URL. + client_configs: Additional configuration options for the AsyncOpenAI client. + These will override any default configurations but will be overridden by + explicit parameters (api_key, base_url). + + Returns: + An AsyncOpenAI client instance. + """ + if not api_key: + api_key = os.environ["OPENAI_API_KEY"] + + default_headers = { + "User-Agent": f"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_8) LightRAG/{__api_version__}", + "Content-Type": "application/json", + } + + if client_configs is None: + client_configs = {} + + # Create a merged config dict with precedence: explicit params > client_configs > defaults + merged_configs = { + **client_configs, + "default_headers": default_headers, + "api_key": api_key, + } + + if base_url is not None: + merged_configs["base_url"] = base_url + else: + merged_configs["base_url"] = os.environ.get( + "OPENAI_API_BASE", "https://api.openai.com/v1" + ) + + return AsyncOpenAI(**merged_configs) + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=( + retry_if_exception_type(RateLimitError) + | retry_if_exception_type(APIConnectionError) + | retry_if_exception_type(APITimeoutError) + | retry_if_exception_type(InvalidResponseError) + ), +) +async def openai_complete_if_cache( + model: str, + prompt: str, + system_prompt: str | None = None, + history_messages: list[dict[str, Any]] | None = None, + enable_cot: bool = False, + base_url: str | None = None, + api_key: str | None = None, + token_tracker: Any | None = None, + stream: bool | None = None, + timeout: int | None = None, + keyword_extraction: bool = False, + **kwargs: Any, +) -> str: + """Complete a prompt using OpenAI's API with caching support and Chain of Thought (COT) integration. + + This function supports automatic integration of reasoning content from models that provide + Chain of Thought capabilities. The reasoning content is seamlessly integrated into the response + using ... tags. + + Note on `reasoning_content`: This feature relies on a Deepseek Style `reasoning_content` + in the API response, which may be provided by OpenAI-compatible endpoints that support + Chain of Thought. + + COT Integration Rules: + 1. COT content is accepted only when regular content is empty and `reasoning_content` has content. + 2. COT processing stops when regular content becomes available. + 3. If both `content` and `reasoning_content` are present simultaneously, reasoning is ignored. + 4. If both fields have content from the start, COT is never activated. + 5. For streaming: COT content is inserted into the content stream with tags. + 6. For non-streaming: COT content is prepended to regular content with tags. + + Args: + model: The OpenAI model to use. + prompt: The prompt to complete. + system_prompt: Optional system prompt to include. + history_messages: Optional list of previous messages in the conversation. + base_url: Optional base URL for the OpenAI API. + api_key: Optional OpenAI API key. If None, uses the OPENAI_API_KEY environment variable. + token_tracker: Optional token usage tracker for monitoring API usage. + enable_cot: Whether to enable Chain of Thought (COT) processing. Default is False. + stream: Whether to stream the response. Default is False. + timeout: Request timeout in seconds. Default is None. + keyword_extraction: Whether to enable keyword extraction mode. When True, triggers + special response formatting for keyword extraction. Default is False. + **kwargs: Additional keyword arguments to pass to the OpenAI API. + Special kwargs: + - openai_client_configs: Dict of configuration options for the AsyncOpenAI client. + These will be passed to the client constructor but will be overridden by + explicit parameters (api_key, base_url). + + Returns: + The completed text (with integrated COT content if available) or an async iterator + of text chunks if streaming. COT content is wrapped in ... tags. + + Raises: + InvalidResponseError: If the response from OpenAI is invalid or empty. + APIConnectionError: If there is a connection error with the OpenAI API. + RateLimitError: If the OpenAI API rate limit is exceeded. + APITimeoutError: If the OpenAI API request times out. + """ + if history_messages is None: + history_messages = [] + + # Set openai logger level to INFO when VERBOSE_DEBUG is off + if not VERBOSE_DEBUG and logger.level == logging.DEBUG: + logging.getLogger("openai").setLevel(logging.INFO) + + # Remove special kwargs that shouldn't be passed to OpenAI + kwargs.pop("hashing_kv", None) + + # Extract client configuration options + client_configs = kwargs.pop("openai_client_configs", {}) + + # Create the OpenAI client + openai_async_client = create_openai_async_client( + api_key=api_key, + base_url=base_url, + client_configs=client_configs, + ) + + # Prepare messages + messages: list[dict[str, Any]] = [] + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + logger.debug("===== Entering func of LLM =====") + logger.debug(f"Model: {model} Base URL: {base_url}") + logger.debug(f"Client Configs: {client_configs}") + logger.debug(f"Additional kwargs: {kwargs}") + logger.debug(f"Num of history messages: {len(history_messages)}") + verbose_debug(f"System prompt: {system_prompt}") + verbose_debug(f"Query: {prompt}") + logger.debug("===== Sending Query to LLM =====") + + messages = kwargs.pop("messages", messages) + + # Add explicit parameters back to kwargs so they're passed to OpenAI API + if stream is not None: + kwargs["stream"] = stream + if timeout is not None: + kwargs["timeout"] = timeout + + try: + # Don't use async with context manager, use client directly + if "response_format" in kwargs: + response = await openai_async_client.beta.chat.completions.parse( + model=model, messages=messages, **kwargs + ) + else: + response = await openai_async_client.chat.completions.create( + model=model, messages=messages, **kwargs + ) + except APIConnectionError as e: + logger.error(f"OpenAI API Connection Error: {e}") + await openai_async_client.close() # Ensure client is closed + raise + except RateLimitError as e: + logger.error(f"OpenAI API Rate Limit Error: {e}") + await openai_async_client.close() # Ensure client is closed + raise + except APITimeoutError as e: + logger.error(f"OpenAI API Timeout Error: {e}") + await openai_async_client.close() # Ensure client is closed + raise + except Exception as e: + logger.error( + f"OpenAI API Call Failed,\nModel: {model},\nParams: {kwargs}, Got: {e}" + ) + await openai_async_client.close() # Ensure client is closed + raise + + if hasattr(response, "__aiter__"): + + async def inner(): + # Track if we've started iterating + iteration_started = False + final_chunk_usage = None + + # COT (Chain of Thought) state tracking + cot_active = False + cot_started = False + initial_content_seen = False + + try: + iteration_started = True + async for chunk in response: + # Check if this chunk has usage information (final chunk) + if hasattr(chunk, "usage") and chunk.usage: + final_chunk_usage = chunk.usage + logger.debug( + f"Received usage info in streaming chunk: {chunk.usage}" + ) + + # Check if choices exists and is not empty + if not hasattr(chunk, "choices") or not chunk.choices: + logger.warning(f"Received chunk without choices: {chunk}") + continue + + # Check if delta exists + if not hasattr(chunk.choices[0], "delta"): + # This might be the final chunk, continue to check for usage + continue + + delta = chunk.choices[0].delta + content = getattr(delta, "content", None) + reasoning_content = getattr(delta, "reasoning_content", "") + + # Handle COT logic for streaming (only if enabled) + if enable_cot: + if content: + # Regular content is present + if not initial_content_seen: + initial_content_seen = True + # If both content and reasoning_content are present initially, don't start COT + if reasoning_content: + cot_active = False + cot_started = False + + # If COT was active, end it + if cot_active: + yield "" + cot_active = False + + # Process regular content + if r"\u" in content: + content = safe_unicode_decode(content.encode("utf-8")) + yield content + + elif reasoning_content: + # Only reasoning content is present + if not initial_content_seen and not cot_started: + # Start COT if we haven't seen initial content yet + if not cot_active: + yield "" + cot_active = True + cot_started = True + + # Process reasoning content if COT is active + if cot_active: + if r"\u" in reasoning_content: + reasoning_content = safe_unicode_decode( + reasoning_content.encode("utf-8") + ) + yield reasoning_content + else: + # COT disabled, only process regular content + if content: + if r"\u" in content: + content = safe_unicode_decode(content.encode("utf-8")) + yield content + + # If neither content nor reasoning_content, continue to next chunk + if content is None and reasoning_content is None: + continue + + # Ensure COT is properly closed if still active after stream ends + if enable_cot and cot_active: + yield "" + cot_active = False + + # After streaming is complete, track token usage + if token_tracker and final_chunk_usage: + # Use actual usage from the API + token_counts = { + "prompt_tokens": getattr(final_chunk_usage, "prompt_tokens", 0), + "completion_tokens": getattr( + final_chunk_usage, "completion_tokens", 0 + ), + "total_tokens": getattr(final_chunk_usage, "total_tokens", 0), + } + token_tracker.add_usage(token_counts) + logger.debug(f"Streaming token usage (from API): {token_counts}") + elif token_tracker: + logger.debug("No usage information available in streaming response") + except Exception as e: + # Ensure COT is properly closed before handling exception + if enable_cot and cot_active: + try: + yield "" + cot_active = False + except Exception as close_error: + logger.warning( + f"Failed to close COT tag during exception handling: {close_error}" + ) + + logger.error(f"Error in stream response: {str(e)}") + # Try to clean up resources if possible + if ( + iteration_started + and hasattr(response, "aclose") + and callable(getattr(response, "aclose", None)) + ): + try: + await response.aclose() + logger.debug("Successfully closed stream response after error") + except Exception as close_error: + logger.warning( + f"Failed to close stream response: {close_error}" + ) + # Ensure client is closed in case of exception + await openai_async_client.close() + raise + finally: + # Final safety check for unclosed COT tags + if enable_cot and cot_active: + try: + yield "" + cot_active = False + except Exception as final_close_error: + logger.warning( + f"Failed to close COT tag in finally block: {final_close_error}" + ) + + # Ensure resources are released even if no exception occurs + # Note: Some wrapped clients (e.g., Langfuse) may not implement aclose() properly + if iteration_started and hasattr(response, "aclose"): + aclose_method = getattr(response, "aclose", None) + if callable(aclose_method): + try: + await response.aclose() + logger.debug("Successfully closed stream response") + except (AttributeError, TypeError) as close_error: + # Some wrapper objects may report hasattr(aclose) but fail when called + # This is expected behavior for certain client wrappers + logger.debug( + f"Stream response cleanup not supported by client wrapper: {close_error}" + ) + except Exception as close_error: + logger.warning( + f"Unexpected error during stream response cleanup: {close_error}" + ) + + # This prevents resource leaks since the caller doesn't handle closing + try: + await openai_async_client.close() + logger.debug( + "Successfully closed OpenAI client for streaming response" + ) + except Exception as client_close_error: + logger.warning( + f"Failed to close OpenAI client in streaming finally block: {client_close_error}" + ) + + return inner() + + else: + try: + if ( + not response + or not response.choices + or not hasattr(response.choices[0], "message") + ): + logger.error("Invalid response from OpenAI API") + await openai_async_client.close() # Ensure client is closed + raise InvalidResponseError("Invalid response from OpenAI API") + + message = response.choices[0].message + content = getattr(message, "content", None) + reasoning_content = getattr(message, "reasoning_content", "") + + # Handle COT logic for non-streaming responses (only if enabled) + final_content = "" + + if enable_cot: + # Check if we should include reasoning content + should_include_reasoning = False + if reasoning_content and reasoning_content.strip(): + if not content or content.strip() == "": + # Case 1: Only reasoning content, should include COT + should_include_reasoning = True + final_content = ( + content or "" + ) # Use empty string if content is None + else: + # Case 3: Both content and reasoning_content present, ignore reasoning + should_include_reasoning = False + final_content = content + else: + # No reasoning content, use regular content + final_content = content or "" + + # Apply COT wrapping if needed + if should_include_reasoning: + if r"\u" in reasoning_content: + reasoning_content = safe_unicode_decode( + reasoning_content.encode("utf-8") + ) + final_content = f"{reasoning_content}{final_content}" + else: + # COT disabled, only use regular content + final_content = content or "" + + # Validate final content + if not final_content or final_content.strip() == "": + logger.error("Received empty content from OpenAI API") + await openai_async_client.close() # Ensure client is closed + raise InvalidResponseError("Received empty content from OpenAI API") + + # Apply Unicode decoding to final content if needed + if r"\u" in final_content: + final_content = safe_unicode_decode(final_content.encode("utf-8")) + + if token_tracker and hasattr(response, "usage"): + token_counts = { + "prompt_tokens": getattr(response.usage, "prompt_tokens", 0), + "completion_tokens": getattr( + response.usage, "completion_tokens", 0 + ), + "total_tokens": getattr(response.usage, "total_tokens", 0), + } + token_tracker.add_usage(token_counts) + + logger.debug(f"Response content len: {len(final_content)}") + verbose_debug(f"Response: {response}") + + return final_content + finally: + # Ensure client is closed in all cases for non-streaming responses + await openai_async_client.close() + + +async def openai_complete( + prompt, + system_prompt=None, + history_messages=None, + keyword_extraction=False, + **kwargs, +) -> Union[str, AsyncIterator[str]]: + if history_messages is None: + history_messages = [] + if keyword_extraction: + kwargs["response_format"] = "json" + model_name = kwargs["hashing_kv"].global_config["llm_model_name"] + return await openai_complete_if_cache( + model_name, + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + keyword_extraction=keyword_extraction, + **kwargs, + ) + + +async def gpt_4o_complete( + prompt, + system_prompt=None, + history_messages=None, + enable_cot: bool = False, + keyword_extraction=False, + **kwargs, +) -> str: + if history_messages is None: + history_messages = [] + if keyword_extraction: + kwargs["response_format"] = GPTKeywordExtractionFormat + return await openai_complete_if_cache( + "gpt-4o", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + keyword_extraction=keyword_extraction, + **kwargs, + ) + + +async def gpt_4o_mini_complete( + prompt, + system_prompt=None, + history_messages=None, + enable_cot: bool = False, + keyword_extraction=False, + **kwargs, +) -> str: + if history_messages is None: + history_messages = [] + if keyword_extraction: + kwargs["response_format"] = GPTKeywordExtractionFormat + return await openai_complete_if_cache( + "gpt-4o-mini", + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + keyword_extraction=keyword_extraction, + **kwargs, + ) + + +async def nvidia_openai_complete( + prompt, + system_prompt=None, + history_messages=None, + enable_cot: bool = False, + keyword_extraction=False, + **kwargs, +) -> str: + if history_messages is None: + history_messages = [] + result = await openai_complete_if_cache( + "nvidia/llama-3.1-nemotron-70b-instruct", # context length 128k + prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + keyword_extraction=keyword_extraction, + base_url="https://integrate.api.nvidia.com/v1", + **kwargs, + ) + return result + + +@wrap_embedding_func_with_attrs(embedding_dim=1536, max_token_size=8192) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(RateLimitError) + | retry_if_exception_type(APIConnectionError) + | retry_if_exception_type(APITimeoutError) + ), +) +async def openai_embed( + texts: list[str], + model: str = "text-embedding-3-small", + base_url: str | None = None, + api_key: str | None = None, + embedding_dim: int | None = None, + client_configs: dict[str, Any] | None = None, + token_tracker: Any | None = None, +) -> np.ndarray: + """Generate embeddings for a list of texts using OpenAI's API. + + Args: + texts: List of texts to embed. + model: The OpenAI embedding model to use. + base_url: Optional base URL for the OpenAI API. + api_key: Optional OpenAI API key. If None, uses the OPENAI_API_KEY environment variable. + embedding_dim: Optional embedding dimension for dynamic dimension reduction. + **IMPORTANT**: This parameter is automatically injected by the EmbeddingFunc wrapper. + Do NOT manually pass this parameter when calling the function directly. + The dimension is controlled by the @wrap_embedding_func_with_attrs decorator. + Manually passing a different value will trigger a warning and be ignored. + When provided (by EmbeddingFunc), it will be passed to the OpenAI API for dimension reduction. + client_configs: Additional configuration options for the AsyncOpenAI client. + These will override any default configurations but will be overridden by + explicit parameters (api_key, base_url). + token_tracker: Optional token usage tracker for monitoring API usage. + + Returns: + A numpy array of embeddings, one per input text. + + Raises: + APIConnectionError: If there is a connection error with the OpenAI API. + RateLimitError: If the OpenAI API rate limit is exceeded. + APITimeoutError: If the OpenAI API request times out. + """ + # Create the OpenAI client + openai_async_client = create_openai_async_client( + api_key=api_key, base_url=base_url, client_configs=client_configs + ) + + async with openai_async_client: + # Prepare API call parameters + api_params = { + "model": model, + "input": texts, + "encoding_format": "base64", + } + + # Add dimensions parameter only if embedding_dim is provided + if embedding_dim is not None: + api_params["dimensions"] = embedding_dim + + # Make API call + response = await openai_async_client.embeddings.create(**api_params) + + if token_tracker and hasattr(response, "usage"): + token_counts = { + "prompt_tokens": getattr(response.usage, "prompt_tokens", 0), + "total_tokens": getattr(response.usage, "total_tokens", 0), + } + token_tracker.add_usage(token_counts) + + return np.array( + [ + np.array(dp.embedding, dtype=np.float32) + if isinstance(dp.embedding, list) + else np.frombuffer(base64.b64decode(dp.embedding), dtype=np.float32) + for dp in response.data + ] + ) diff --git a/LightRAG/lightrag/llm/zhipu.py b/LightRAG/lightrag/llm/zhipu.py new file mode 100644 index 00000000..d90f3cc1 --- /dev/null +++ b/LightRAG/lightrag/llm/zhipu.py @@ -0,0 +1,217 @@ +import sys +import re +import json +from ..utils import verbose_debug + +if sys.version_info < (3, 9): + pass +else: + pass +import pipmaster as pm # Pipmaster for dynamic library install + +# install specific modules +if not pm.is_installed("zhipuai"): + pm.install("zhipuai") + +from openai import ( + APIConnectionError, + RateLimitError, + APITimeoutError, +) +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from lightrag.utils import ( + wrap_embedding_func_with_attrs, + logger, +) + +from lightrag.types import GPTKeywordExtractionFormat + +import numpy as np +from typing import Union, List, Optional, Dict + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def zhipu_complete_if_cache( + prompt: Union[str, List[Dict[str, str]]], + model: str = "glm-4-flashx", # The most cost/performance balance model in glm-4 series + api_key: Optional[str] = None, + system_prompt: Optional[str] = None, + history_messages: List[Dict[str, str]] = [], + enable_cot: bool = False, + **kwargs, +) -> str: + if enable_cot: + logger.debug( + "enable_cot=True is not supported for ZhipuAI and will be ignored." + ) + # dynamically load ZhipuAI + try: + from zhipuai import ZhipuAI + except ImportError: + raise ImportError("Please install zhipuai before initialize zhipuai backend.") + + if api_key: + client = ZhipuAI(api_key=api_key) + else: + # please set ZHIPUAI_API_KEY in your environment + # os.environ["ZHIPUAI_API_KEY"] + client = ZhipuAI() + + messages = [] + + if not system_prompt: + system_prompt = "You are a helpful assistant. Note that sensitive words in the content should be replaced with ***" + + # Add system prompt if provided + if system_prompt: + messages.append({"role": "system", "content": system_prompt}) + messages.extend(history_messages) + messages.append({"role": "user", "content": prompt}) + + # Add debug logging + logger.debug("===== Query Input to LLM =====") + logger.debug(f"Query: {prompt}") + verbose_debug(f"System prompt: {system_prompt}") + + # Remove unsupported kwargs + kwargs = { + k: v for k, v in kwargs.items() if k not in ["hashing_kv", "keyword_extraction"] + } + + response = client.chat.completions.create(model=model, messages=messages, **kwargs) + + return response.choices[0].message.content + + +async def zhipu_complete( + prompt, + system_prompt=None, + history_messages=[], + keyword_extraction=False, + enable_cot: bool = False, + **kwargs, +): + # Pop keyword_extraction from kwargs to avoid passing it to zhipu_complete_if_cache + keyword_extraction = kwargs.pop("keyword_extraction", None) + + if keyword_extraction: + # Add a system prompt to guide the model to return JSON format + extraction_prompt = """You are a helpful assistant that extracts keywords from text. + Please analyze the content and extract two types of keywords: + 1. High-level keywords: Important concepts and main themes + 2. Low-level keywords: Specific details and supporting elements + + Return your response in this exact JSON format: + { + "high_level_keywords": ["keyword1", "keyword2"], + "low_level_keywords": ["keyword1", "keyword2", "keyword3"] + } + + Only return the JSON, no other text.""" + + # Combine with existing system prompt if any + if system_prompt: + system_prompt = f"{system_prompt}\n\n{extraction_prompt}" + else: + system_prompt = extraction_prompt + + try: + response = await zhipu_complete_if_cache( + prompt=prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + # Try to parse as JSON + try: + data = json.loads(response) + return GPTKeywordExtractionFormat( + high_level_keywords=data.get("high_level_keywords", []), + low_level_keywords=data.get("low_level_keywords", []), + ) + except json.JSONDecodeError: + # If direct JSON parsing fails, try to extract JSON from text + match = re.search(r"\{[\s\S]*\}", response) + if match: + try: + data = json.loads(match.group()) + return GPTKeywordExtractionFormat( + high_level_keywords=data.get("high_level_keywords", []), + low_level_keywords=data.get("low_level_keywords", []), + ) + except json.JSONDecodeError: + pass + + # If all parsing fails, log warning and return empty format + logger.warning( + f"Failed to parse keyword extraction response: {response}" + ) + return GPTKeywordExtractionFormat( + high_level_keywords=[], low_level_keywords=[] + ) + except Exception as e: + logger.error(f"Error during keyword extraction: {str(e)}") + return GPTKeywordExtractionFormat( + high_level_keywords=[], low_level_keywords=[] + ) + else: + # For non-keyword-extraction, just return the raw response string + return await zhipu_complete_if_cache( + prompt=prompt, + system_prompt=system_prompt, + history_messages=history_messages, + enable_cot=enable_cot, + **kwargs, + ) + + +@wrap_embedding_func_with_attrs(embedding_dim=1024) +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=retry_if_exception_type( + (RateLimitError, APIConnectionError, APITimeoutError) + ), +) +async def zhipu_embedding( + texts: list[str], model: str = "embedding-3", api_key: str = None, **kwargs +) -> np.ndarray: + # dynamically load ZhipuAI + try: + from zhipuai import ZhipuAI + except ImportError: + raise ImportError("Please install zhipuai before initialize zhipuai backend.") + if api_key: + client = ZhipuAI(api_key=api_key) + else: + # please set ZHIPUAI_API_KEY in your environment + # os.environ["ZHIPUAI_API_KEY"] + client = ZhipuAI() + + # Convert single text to list if needed + if isinstance(texts, str): + texts = [texts] + + embeddings = [] + for text in texts: + try: + response = client.embeddings.create(model=model, input=[text], **kwargs) + embeddings.append(response.data[0].embedding) + except Exception as e: + raise Exception(f"Error calling ChatGLM Embedding API: {str(e)}") + + return np.array(embeddings) diff --git a/LightRAG/lightrag/namespace.py b/LightRAG/lightrag/namespace.py new file mode 100644 index 00000000..eccd168d --- /dev/null +++ b/LightRAG/lightrag/namespace.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from typing import Iterable + + +# All namespace should not be changed +class NameSpace: + KV_STORE_FULL_DOCS = "full_docs" + KV_STORE_TEXT_CHUNKS = "text_chunks" + KV_STORE_LLM_RESPONSE_CACHE = "llm_response_cache" + KV_STORE_FULL_ENTITIES = "full_entities" + KV_STORE_FULL_RELATIONS = "full_relations" + KV_STORE_ENTITY_CHUNKS = "entity_chunks" + KV_STORE_RELATION_CHUNKS = "relation_chunks" + + VECTOR_STORE_ENTITIES = "entities" + VECTOR_STORE_RELATIONSHIPS = "relationships" + VECTOR_STORE_CHUNKS = "chunks" + + GRAPH_STORE_CHUNK_ENTITY_RELATION = "chunk_entity_relation" + + DOC_STATUS = "doc_status" + + +def is_namespace(namespace: str, base_namespace: str | Iterable[str]): + if isinstance(base_namespace, str): + return namespace.endswith(base_namespace) + return any(is_namespace(namespace, ns) for ns in base_namespace) diff --git a/LightRAG/lightrag/operate.py b/LightRAG/lightrag/operate.py new file mode 100644 index 00000000..858553b1 --- /dev/null +++ b/LightRAG/lightrag/operate.py @@ -0,0 +1,4985 @@ +from __future__ import annotations +from functools import partial +from pathlib import Path + +import asyncio +import json +import json_repair +from typing import Any, AsyncIterator, overload, Literal +from collections import Counter, defaultdict + +from lightrag.exceptions import PipelineCancelledException +from lightrag.utils import ( + logger, + compute_mdhash_id, + Tokenizer, + is_float_regex, + sanitize_and_normalize_extracted_text, + pack_user_ass_to_openai_messages, + split_string_by_multi_markers, + truncate_list_by_token_size, + compute_args_hash, + handle_cache, + save_to_cache, + CacheData, + use_llm_func_with_cache, + update_chunk_cache_list, + remove_think_tags, + pick_by_weighted_polling, + pick_by_vector_similarity, + process_chunks_unified, + safe_vdb_operation_with_exception, + create_prefixed_exception, + fix_tuple_delimiter_corruption, + convert_to_user_format, + generate_reference_list_from_chunks, + apply_source_ids_limit, + merge_source_ids, + make_relation_chunk_key, +) +from lightrag.base import ( + BaseGraphStorage, + BaseKVStorage, + BaseVectorStorage, + TextChunkSchema, + QueryParam, + QueryResult, + QueryContextResult, +) +from lightrag.prompt import PROMPTS +from lightrag.constants import ( + GRAPH_FIELD_SEP, + DEFAULT_MAX_ENTITY_TOKENS, + DEFAULT_MAX_RELATION_TOKENS, + DEFAULT_MAX_TOTAL_TOKENS, + DEFAULT_RELATED_CHUNK_NUMBER, + DEFAULT_KG_CHUNK_PICK_METHOD, + DEFAULT_ENTITY_TYPES, + DEFAULT_SUMMARY_LANGUAGE, + SOURCE_IDS_LIMIT_METHOD_KEEP, + SOURCE_IDS_LIMIT_METHOD_FIFO, + DEFAULT_FILE_PATH_MORE_PLACEHOLDER, + DEFAULT_MAX_FILE_PATHS, + DEFAULT_ENTITY_NAME_MAX_LENGTH, +) +from lightrag.kg.shared_storage import get_storage_keyed_lock +import time +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=Path(__file__).resolve().parent / ".env", override=False) + + +def _truncate_entity_identifier( + identifier: str, limit: int, chunk_key: str, identifier_role: str +) -> str: + """Truncate entity identifiers that exceed the configured length limit.""" + + if len(identifier) <= limit: + return identifier + + display_value = identifier[:limit] + preview = identifier[:20] # Show first 20 characters as preview + logger.warning( + "%s: %s len %d > %d chars (Name: '%s...')", + chunk_key, + identifier_role, + len(identifier), + limit, + preview, + ) + return display_value + + +def chunking_by_token_size( + tokenizer: Tokenizer, + content: str, + split_by_character: str | None = None, + split_by_character_only: bool = False, + overlap_token_size: int = 128, + max_token_size: int = 1024, +) -> list[dict[str, Any]]: + tokens = tokenizer.encode(content) + results: list[dict[str, Any]] = [] + if split_by_character: + raw_chunks = content.split(split_by_character) + new_chunks = [] + if split_by_character_only: + for chunk in raw_chunks: + _tokens = tokenizer.encode(chunk) + new_chunks.append((len(_tokens), chunk)) + else: + for chunk in raw_chunks: + _tokens = tokenizer.encode(chunk) + if len(_tokens) > max_token_size: + for start in range( + 0, len(_tokens), max_token_size - overlap_token_size + ): + chunk_content = tokenizer.decode( + _tokens[start : start + max_token_size] + ) + new_chunks.append( + (min(max_token_size, len(_tokens) - start), chunk_content) + ) + else: + new_chunks.append((len(_tokens), chunk)) + for index, (_len, chunk) in enumerate(new_chunks): + results.append( + { + "tokens": _len, + "content": chunk.strip(), + "chunk_order_index": index, + } + ) + else: + for index, start in enumerate( + range(0, len(tokens), max_token_size - overlap_token_size) + ): + chunk_content = tokenizer.decode(tokens[start : start + max_token_size]) + results.append( + { + "tokens": min(max_token_size, len(tokens) - start), + "content": chunk_content.strip(), + "chunk_order_index": index, + } + ) + return results + + +async def _handle_entity_relation_summary( + description_type: str, + entity_or_relation_name: str, + description_list: list[str], + seperator: str, + global_config: dict, + llm_response_cache: BaseKVStorage | None = None, +) -> tuple[str, bool]: + """Handle entity relation description summary using map-reduce approach. + + This function summarizes a list of descriptions using a map-reduce strategy: + 1. If total tokens < summary_context_size and len(description_list) < force_llm_summary_on_merge, no need to summarize + 2. If total tokens < summary_max_tokens, summarize with LLM directly + 3. Otherwise, split descriptions into chunks that fit within token limits + 4. Summarize each chunk, then recursively process the summaries + 5. Continue until we get a final summary within token limits or num of descriptions is less than force_llm_summary_on_merge + + Args: + entity_or_relation_name: Name of the entity or relation being summarized + description_list: List of description strings to summarize + global_config: Global configuration containing tokenizer and limits + llm_response_cache: Optional cache for LLM responses + + Returns: + Tuple of (final_summarized_description_string, llm_was_used_boolean) + """ + # Handle empty input + if not description_list: + return "", False + + # If only one description, return it directly (no need for LLM call) + if len(description_list) == 1: + return description_list[0], False + + # Get configuration + tokenizer: Tokenizer = global_config["tokenizer"] + summary_context_size = global_config["summary_context_size"] + summary_max_tokens = global_config["summary_max_tokens"] + force_llm_summary_on_merge = global_config["force_llm_summary_on_merge"] + + current_list = description_list[:] # Copy the list to avoid modifying original + llm_was_used = False # Track whether LLM was used during the entire process + + # Iterative map-reduce process + while True: + # Calculate total tokens in current list + total_tokens = sum(len(tokenizer.encode(desc)) for desc in current_list) + + # If total length is within limits, perform final summarization + if total_tokens <= summary_context_size or len(current_list) <= 2: + if ( + len(current_list) < force_llm_summary_on_merge + and total_tokens < summary_max_tokens + ): + # no LLM needed, just join the descriptions + final_description = seperator.join(current_list) + return final_description if final_description else "", llm_was_used + else: + if total_tokens > summary_context_size and len(current_list) <= 2: + logger.warning( + f"Summarizing {entity_or_relation_name}: Oversize descpriton found" + ) + # Final summarization of remaining descriptions - LLM will be used + final_summary = await _summarize_descriptions( + description_type, + entity_or_relation_name, + current_list, + global_config, + llm_response_cache, + ) + return final_summary, True # LLM was used for final summarization + + # Need to split into chunks - Map phase + # Ensure each chunk has minimum 2 descriptions to guarantee progress + chunks = [] + current_chunk = [] + current_tokens = 0 + + # Currently least 3 descriptions in current_list + for i, desc in enumerate(current_list): + desc_tokens = len(tokenizer.encode(desc)) + + # If adding current description would exceed limit, finalize current chunk + if current_tokens + desc_tokens > summary_context_size and current_chunk: + # Ensure we have at least 2 descriptions in the chunk (when possible) + if len(current_chunk) == 1: + # Force add one more description to ensure minimum 2 per chunk + current_chunk.append(desc) + chunks.append(current_chunk) + logger.warning( + f"Summarizing {entity_or_relation_name}: Oversize descpriton found" + ) + current_chunk = [] # next group is empty + current_tokens = 0 + else: # curren_chunk is ready for summary in reduce phase + chunks.append(current_chunk) + current_chunk = [desc] # leave it for next group + current_tokens = desc_tokens + else: + current_chunk.append(desc) + current_tokens += desc_tokens + + # Add the last chunk if it exists + if current_chunk: + chunks.append(current_chunk) + + logger.info( + f" Summarizing {entity_or_relation_name}: Map {len(current_list)} descriptions into {len(chunks)} groups" + ) + + # Reduce phase: summarize each group from chunks + new_summaries = [] + for chunk in chunks: + if len(chunk) == 1: + # Optimization: single description chunks don't need LLM summarization + new_summaries.append(chunk[0]) + else: + # Multiple descriptions need LLM summarization + summary = await _summarize_descriptions( + description_type, + entity_or_relation_name, + chunk, + global_config, + llm_response_cache, + ) + new_summaries.append(summary) + llm_was_used = True # Mark that LLM was used in reduce phase + + # Update current list with new summaries for next iteration + current_list = new_summaries + + +async def _summarize_descriptions( + description_type: str, + description_name: str, + description_list: list[str], + global_config: dict, + llm_response_cache: BaseKVStorage | None = None, +) -> str: + """Helper function to summarize a list of descriptions using LLM. + + Args: + entity_or_relation_name: Name of the entity or relation being summarized + descriptions: List of description strings to summarize + global_config: Global configuration containing LLM function and settings + llm_response_cache: Optional cache for LLM responses + + Returns: + Summarized description string + """ + use_llm_func: callable = global_config["llm_model_func"] + # Apply higher priority (8) to entity/relation summary tasks + use_llm_func = partial(use_llm_func, _priority=8) + + language = global_config["addon_params"].get("language", DEFAULT_SUMMARY_LANGUAGE) + + summary_length_recommended = global_config["summary_length_recommended"] + + prompt_template = PROMPTS["summarize_entity_descriptions"] + + # Convert descriptions to JSONL format and apply token-based truncation + tokenizer = global_config["tokenizer"] + summary_context_size = global_config["summary_context_size"] + + # Create list of JSON objects with "Description" field + json_descriptions = [{"Description": desc} for desc in description_list] + + # Use truncate_list_by_token_size for length truncation + truncated_json_descriptions = truncate_list_by_token_size( + json_descriptions, + key=lambda x: json.dumps(x, ensure_ascii=False), + max_token_size=summary_context_size, + tokenizer=tokenizer, + ) + + # Convert to JSONL format (one JSON object per line) + joined_descriptions = "\n".join( + json.dumps(desc, ensure_ascii=False) for desc in truncated_json_descriptions + ) + + # Prepare context for the prompt + context_base = dict( + description_type=description_type, + description_name=description_name, + description_list=joined_descriptions, + summary_length=summary_length_recommended, + language=language, + ) + use_prompt = prompt_template.format(**context_base) + + # Use LLM function with cache (higher priority for summary generation) + summary, _ = await use_llm_func_with_cache( + use_prompt, + use_llm_func, + llm_response_cache=llm_response_cache, + cache_type="summary", + ) + + # Check summary token length against embedding limit + embedding_token_limit = global_config.get("embedding_token_limit") + if embedding_token_limit is not None and summary: + tokenizer = global_config["tokenizer"] + summary_token_count = len(tokenizer.encode(summary)) + threshold = int(embedding_token_limit * 0.9) + + if summary_token_count > threshold: + logger.warning( + f"Summary tokens ({summary_token_count}) exceeds 90% of embedding limit " + f"({embedding_token_limit}) for {description_type}: {description_name}" + ) + + return summary + + +async def _handle_single_entity_extraction( + record_attributes: list[str], + chunk_key: str, + timestamp: int, + file_path: str = "unknown_source", +): + if len(record_attributes) != 4 or "entity" not in record_attributes[0]: + if len(record_attributes) > 1 and "entity" in record_attributes[0]: + logger.warning( + f"{chunk_key}: LLM output format error; found {len(record_attributes)}/4 feilds on ENTITY `{record_attributes[1]}` @ `{record_attributes[2] if len(record_attributes) > 2 else 'N/A'}`" + ) + logger.debug(record_attributes) + return None + + try: + entity_name = sanitize_and_normalize_extracted_text( + record_attributes[1], remove_inner_quotes=True + ) + + # Validate entity name after all cleaning steps + if not entity_name or not entity_name.strip(): + logger.warning( + f"Entity extraction error: entity name became empty after cleaning. Original: '{record_attributes[1]}'" + ) + return None + + # Process entity type with same cleaning pipeline + entity_type = sanitize_and_normalize_extracted_text( + record_attributes[2], remove_inner_quotes=True + ) + + if not entity_type.strip() or any( + char in entity_type for char in ["'", "(", ")", "<", ">", "|", "/", "\\"] + ): + logger.warning( + f"Entity extraction error: invalid entity type in: {record_attributes}" + ) + return None + + # Remove spaces and convert to lowercase + entity_type = entity_type.replace(" ", "").lower() + + # Process entity description with same cleaning pipeline + entity_description = sanitize_and_normalize_extracted_text(record_attributes[3]) + + if not entity_description.strip(): + logger.warning( + f"Entity extraction error: empty description for entity '{entity_name}' of type '{entity_type}'" + ) + return None + + return dict( + entity_name=entity_name, + entity_type=entity_type, + description=entity_description, + source_id=chunk_key, + file_path=file_path, + timestamp=timestamp, + ) + + except ValueError as e: + logger.error( + f"Entity extraction failed due to encoding issues in chunk {chunk_key}: {e}" + ) + return None + except Exception as e: + logger.error( + f"Entity extraction failed with unexpected error in chunk {chunk_key}: {e}" + ) + return None + + +async def _handle_single_relationship_extraction( + record_attributes: list[str], + chunk_key: str, + timestamp: int, + file_path: str = "unknown_source", +): + if ( + len(record_attributes) != 5 or "relation" not in record_attributes[0] + ): # treat "relationship" and "relation" interchangeable + if len(record_attributes) > 1 and "relation" in record_attributes[0]: + logger.warning( + f"{chunk_key}: LLM output format error; found {len(record_attributes)}/5 fields on REALTION `{record_attributes[1]}`~`{record_attributes[2] if len(record_attributes) > 2 else 'N/A'}`" + ) + logger.debug(record_attributes) + return None + + try: + source = sanitize_and_normalize_extracted_text( + record_attributes[1], remove_inner_quotes=True + ) + target = sanitize_and_normalize_extracted_text( + record_attributes[2], remove_inner_quotes=True + ) + + # Validate entity names after all cleaning steps + if not source: + logger.warning( + f"Relationship extraction error: source entity became empty after cleaning. Original: '{record_attributes[1]}'" + ) + return None + + if not target: + logger.warning( + f"Relationship extraction error: target entity became empty after cleaning. Original: '{record_attributes[2]}'" + ) + return None + + if source == target: + logger.debug( + f"Relationship source and target are the same in: {record_attributes}" + ) + return None + + # Process keywords with same cleaning pipeline + edge_keywords = sanitize_and_normalize_extracted_text( + record_attributes[3], remove_inner_quotes=True + ) + edge_keywords = edge_keywords.replace(",", ",") + + # Process relationship description with same cleaning pipeline + edge_description = sanitize_and_normalize_extracted_text(record_attributes[4]) + + edge_source_id = chunk_key + weight = ( + float(record_attributes[-1].strip('"').strip("'")) + if is_float_regex(record_attributes[-1].strip('"').strip("'")) + else 1.0 + ) + + return dict( + src_id=source, + tgt_id=target, + weight=weight, + description=edge_description, + keywords=edge_keywords, + source_id=edge_source_id, + file_path=file_path, + timestamp=timestamp, + ) + + except ValueError as e: + logger.warning( + f"Relationship extraction failed due to encoding issues in chunk {chunk_key}: {e}" + ) + return None + except Exception as e: + logger.warning( + f"Relationship extraction failed with unexpected error in chunk {chunk_key}: {e}" + ) + return None + + +async def rebuild_knowledge_from_chunks( + entities_to_rebuild: dict[str, list[str]], + relationships_to_rebuild: dict[tuple[str, str], list[str]], + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + relationships_vdb: BaseVectorStorage, + text_chunks_storage: BaseKVStorage, + llm_response_cache: BaseKVStorage, + global_config: dict[str, str], + pipeline_status: dict | None = None, + pipeline_status_lock=None, + entity_chunks_storage: BaseKVStorage | None = None, + relation_chunks_storage: BaseKVStorage | None = None, +) -> None: + """Rebuild entity and relationship descriptions from cached extraction results with parallel processing + + This method uses cached LLM extraction results instead of calling LLM again, + following the same approach as the insert process. Now with parallel processing + controlled by llm_model_max_async and using get_storage_keyed_lock for data consistency. + + Args: + entities_to_rebuild: Dict mapping entity_name -> list of remaining chunk_ids + relationships_to_rebuild: Dict mapping (src, tgt) -> list of remaining chunk_ids + knowledge_graph_inst: Knowledge graph storage + entities_vdb: Entity vector database + relationships_vdb: Relationship vector database + text_chunks_storage: Text chunks storage + llm_response_cache: LLM response cache + global_config: Global configuration containing llm_model_max_async + pipeline_status: Pipeline status dictionary + pipeline_status_lock: Lock for pipeline status + entity_chunks_storage: KV storage maintaining full chunk IDs per entity + relation_chunks_storage: KV storage maintaining full chunk IDs per relation + """ + if not entities_to_rebuild and not relationships_to_rebuild: + return + + # Get all referenced chunk IDs + all_referenced_chunk_ids = set() + for chunk_ids in entities_to_rebuild.values(): + all_referenced_chunk_ids.update(chunk_ids) + for chunk_ids in relationships_to_rebuild.values(): + all_referenced_chunk_ids.update(chunk_ids) + + status_message = f"Rebuilding knowledge from {len(all_referenced_chunk_ids)} cached chunk extractions (parallel processing)" + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + # Get cached extraction results for these chunks using storage + # cached_results: chunk_id -> [list of (extraction_result, create_time) from LLM cache sorted by create_time of the first extraction_result] + cached_results = await _get_cached_extraction_results( + llm_response_cache, + all_referenced_chunk_ids, + text_chunks_storage=text_chunks_storage, + ) + + if not cached_results: + status_message = "No cached extraction results found, cannot rebuild" + logger.warning(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + return + + # Process cached results to get entities and relationships for each chunk + chunk_entities = {} # chunk_id -> {entity_name: [entity_data]} + chunk_relationships = {} # chunk_id -> {(src, tgt): [relationship_data]} + + for chunk_id, results in cached_results.items(): + try: + # Handle multiple extraction results per chunk + chunk_entities[chunk_id] = defaultdict(list) + chunk_relationships[chunk_id] = defaultdict(list) + + # process multiple LLM extraction results for a single chunk_id + for result in results: + entities, relationships = await _rebuild_from_extraction_result( + text_chunks_storage=text_chunks_storage, + chunk_id=chunk_id, + extraction_result=result[0], + timestamp=result[1], + ) + + # Merge entities and relationships from this extraction result + # Compare description lengths and keep the better version for the same chunk_id + for entity_name, entity_list in entities.items(): + if entity_name not in chunk_entities[chunk_id]: + # New entity for this chunk_id + chunk_entities[chunk_id][entity_name].extend(entity_list) + elif len(chunk_entities[chunk_id][entity_name]) == 0: + # Empty list, add the new entities + chunk_entities[chunk_id][entity_name].extend(entity_list) + else: + # Compare description lengths and keep the better one + existing_desc_len = len( + chunk_entities[chunk_id][entity_name][0].get( + "description", "" + ) + or "" + ) + new_desc_len = len(entity_list[0].get("description", "") or "") + + if new_desc_len > existing_desc_len: + # Replace with the new entity that has longer description + chunk_entities[chunk_id][entity_name] = list(entity_list) + # Otherwise keep existing version + + # Compare description lengths and keep the better version for the same chunk_id + for rel_key, rel_list in relationships.items(): + if rel_key not in chunk_relationships[chunk_id]: + # New relationship for this chunk_id + chunk_relationships[chunk_id][rel_key].extend(rel_list) + elif len(chunk_relationships[chunk_id][rel_key]) == 0: + # Empty list, add the new relationships + chunk_relationships[chunk_id][rel_key].extend(rel_list) + else: + # Compare description lengths and keep the better one + existing_desc_len = len( + chunk_relationships[chunk_id][rel_key][0].get( + "description", "" + ) + or "" + ) + new_desc_len = len(rel_list[0].get("description", "") or "") + + if new_desc_len > existing_desc_len: + # Replace with the new relationship that has longer description + chunk_relationships[chunk_id][rel_key] = list(rel_list) + # Otherwise keep existing version + + except Exception as e: + status_message = ( + f"Failed to parse cached extraction result for chunk {chunk_id}: {e}" + ) + logger.info(status_message) # Per requirement, change to info + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + continue + + # Get max async tasks limit from global_config for semaphore control + graph_max_async = global_config.get("llm_model_max_async", 4) * 2 + semaphore = asyncio.Semaphore(graph_max_async) + + # Counters for tracking progress + rebuilt_entities_count = 0 + rebuilt_relationships_count = 0 + failed_entities_count = 0 + failed_relationships_count = 0 + + async def _locked_rebuild_entity(entity_name, chunk_ids): + nonlocal rebuilt_entities_count, failed_entities_count + async with semaphore: + workspace = global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + async with get_storage_keyed_lock( + [entity_name], namespace=namespace, enable_logging=False + ): + try: + await _rebuild_single_entity( + knowledge_graph_inst=knowledge_graph_inst, + entities_vdb=entities_vdb, + entity_name=entity_name, + chunk_ids=chunk_ids, + chunk_entities=chunk_entities, + llm_response_cache=llm_response_cache, + global_config=global_config, + entity_chunks_storage=entity_chunks_storage, + ) + rebuilt_entities_count += 1 + except Exception as e: + failed_entities_count += 1 + status_message = f"Failed to rebuild `{entity_name}`: {e}" + logger.info(status_message) # Per requirement, change to info + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + async def _locked_rebuild_relationship(src, tgt, chunk_ids): + nonlocal rebuilt_relationships_count, failed_relationships_count + async with semaphore: + workspace = global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + # Sort src and tgt to ensure order-independent lock key generation + sorted_key_parts = sorted([src, tgt]) + async with get_storage_keyed_lock( + sorted_key_parts, + namespace=namespace, + enable_logging=False, + ): + try: + await _rebuild_single_relationship( + knowledge_graph_inst=knowledge_graph_inst, + relationships_vdb=relationships_vdb, + entities_vdb=entities_vdb, + src=src, + tgt=tgt, + chunk_ids=chunk_ids, + chunk_relationships=chunk_relationships, + llm_response_cache=llm_response_cache, + global_config=global_config, + relation_chunks_storage=relation_chunks_storage, + entity_chunks_storage=entity_chunks_storage, + pipeline_status=pipeline_status, + pipeline_status_lock=pipeline_status_lock, + ) + rebuilt_relationships_count += 1 + except Exception as e: + failed_relationships_count += 1 + status_message = f"Failed to rebuild `{src}`~`{tgt}`: {e}" + logger.info(status_message) # Per requirement, change to info + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + # Create tasks for parallel processing + tasks = [] + + # Add entity rebuilding tasks + for entity_name, chunk_ids in entities_to_rebuild.items(): + task = asyncio.create_task(_locked_rebuild_entity(entity_name, chunk_ids)) + tasks.append(task) + + # Add relationship rebuilding tasks + for (src, tgt), chunk_ids in relationships_to_rebuild.items(): + task = asyncio.create_task(_locked_rebuild_relationship(src, tgt, chunk_ids)) + tasks.append(task) + + # Log parallel processing start + status_message = f"Starting parallel rebuild of {len(entities_to_rebuild)} entities and {len(relationships_to_rebuild)} relationships (async: {graph_max_async})" + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + # Execute all tasks in parallel with semaphore control and early failure detection + done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION) + + # Check if any task raised an exception and ensure all exceptions are retrieved + first_exception = None + + for task in done: + try: + exception = task.exception() + if exception is not None: + if first_exception is None: + first_exception = exception + else: + # Task completed successfully, retrieve result to mark as processed + task.result() + except Exception as e: + if first_exception is None: + first_exception = e + + # If any task failed, cancel all pending tasks and raise the first exception + if first_exception is not None: + # Cancel all pending tasks + for pending_task in pending: + pending_task.cancel() + + # Wait for cancellation to complete + if pending: + await asyncio.wait(pending) + + # Re-raise the first exception to notify the caller + raise first_exception + + # Final status report + status_message = f"KG rebuild completed: {rebuilt_entities_count} entities and {rebuilt_relationships_count} relationships rebuilt successfully." + if failed_entities_count > 0 or failed_relationships_count > 0: + status_message += f" Failed: {failed_entities_count} entities, {failed_relationships_count} relationships." + + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + +async def _get_cached_extraction_results( + llm_response_cache: BaseKVStorage, + chunk_ids: set[str], + text_chunks_storage: BaseKVStorage, +) -> dict[str, list[str]]: + """Get cached extraction results for specific chunk IDs + + This function retrieves cached LLM extraction results for the given chunk IDs and returns + them sorted by creation time. The results are sorted at two levels: + 1. Individual extraction results within each chunk are sorted by create_time (earliest first) + 2. Chunks themselves are sorted by the create_time of their earliest extraction result + + Args: + llm_response_cache: LLM response cache storage + chunk_ids: Set of chunk IDs to get cached results for + text_chunks_storage: Text chunks storage for retrieving chunk data and LLM cache references + + Returns: + Dict mapping chunk_id -> list of extraction_result_text, where: + - Keys (chunk_ids) are ordered by the create_time of their first extraction result + - Values (extraction results) are ordered by create_time within each chunk + """ + cached_results = {} + + # Collect all LLM cache IDs from chunks + all_cache_ids = set() + + # Read from storage + chunk_data_list = await text_chunks_storage.get_by_ids(list(chunk_ids)) + for chunk_data in chunk_data_list: + if chunk_data and isinstance(chunk_data, dict): + llm_cache_list = chunk_data.get("llm_cache_list", []) + if llm_cache_list: + all_cache_ids.update(llm_cache_list) + else: + logger.warning(f"Chunk data is invalid or None: {chunk_data}") + + if not all_cache_ids: + logger.warning(f"No LLM cache IDs found for {len(chunk_ids)} chunk IDs") + return cached_results + + # Batch get LLM cache entries + cache_data_list = await llm_response_cache.get_by_ids(list(all_cache_ids)) + + # Process cache entries and group by chunk_id + valid_entries = 0 + for cache_entry in cache_data_list: + if ( + cache_entry is not None + and isinstance(cache_entry, dict) + and cache_entry.get("cache_type") == "extract" + and cache_entry.get("chunk_id") in chunk_ids + ): + chunk_id = cache_entry["chunk_id"] + extraction_result = cache_entry["return"] + create_time = cache_entry.get( + "create_time", 0 + ) # Get creation time, default to 0 + valid_entries += 1 + + # Support multiple LLM caches per chunk + if chunk_id not in cached_results: + cached_results[chunk_id] = [] + # Store tuple with extraction result and creation time for sorting + cached_results[chunk_id].append((extraction_result, create_time)) + + # Sort extraction results by create_time for each chunk and collect earliest times + chunk_earliest_times = {} + for chunk_id in cached_results: + # Sort by create_time (x[1]), then extract only extraction_result (x[0]) + cached_results[chunk_id].sort(key=lambda x: x[1]) + # Store the earliest create_time for this chunk (first item after sorting) + chunk_earliest_times[chunk_id] = cached_results[chunk_id][0][1] + + # Sort cached_results by the earliest create_time of each chunk + sorted_chunk_ids = sorted( + chunk_earliest_times.keys(), key=lambda chunk_id: chunk_earliest_times[chunk_id] + ) + + # Rebuild cached_results in sorted order + sorted_cached_results = {} + for chunk_id in sorted_chunk_ids: + sorted_cached_results[chunk_id] = cached_results[chunk_id] + + logger.info( + f"Found {valid_entries} valid cache entries, {len(sorted_cached_results)} chunks with results" + ) + return sorted_cached_results # each item: list(extraction_result, create_time) + + +async def _process_extraction_result( + result: str, + chunk_key: str, + timestamp: int, + file_path: str = "unknown_source", + tuple_delimiter: str = "<|#|>", + completion_delimiter: str = "<|COMPLETE|>", +) -> tuple[dict, dict]: + """Process a single extraction result (either initial or gleaning) + Args: + result (str): The extraction result to process + chunk_key (str): The chunk key for source tracking + file_path (str): The file path for citation + tuple_delimiter (str): Delimiter for tuple fields + record_delimiter (str): Delimiter for records + completion_delimiter (str): Delimiter for completion + Returns: + tuple: (nodes_dict, edges_dict) containing the extracted entities and relationships + """ + maybe_nodes = defaultdict(list) + maybe_edges = defaultdict(list) + + if completion_delimiter not in result: + logger.warning( + f"{chunk_key}: Complete delimiter can not be found in extraction result" + ) + + # Split LLL output result to records by "\n" + records = split_string_by_multi_markers( + result, + ["\n", completion_delimiter, completion_delimiter.lower()], + ) + + # Fix LLM output format error which use tuple_delimiter to seperate record instead of "\n" + fixed_records = [] + for record in records: + record = record.strip() + if record is None: + continue + entity_records = split_string_by_multi_markers( + record, [f"{tuple_delimiter}entity{tuple_delimiter}"] + ) + for entity_record in entity_records: + if not entity_record.startswith("entity") and not entity_record.startswith( + "relation" + ): + entity_record = f"entity<|{entity_record}" + entity_relation_records = split_string_by_multi_markers( + # treat "relationship" and "relation" interchangeable + entity_record, + [ + f"{tuple_delimiter}relationship{tuple_delimiter}", + f"{tuple_delimiter}relation{tuple_delimiter}", + ], + ) + for entity_relation_record in entity_relation_records: + if not entity_relation_record.startswith( + "entity" + ) and not entity_relation_record.startswith("relation"): + entity_relation_record = ( + f"relation{tuple_delimiter}{entity_relation_record}" + ) + fixed_records = fixed_records + [entity_relation_record] + + if len(fixed_records) != len(records): + logger.warning( + f"{chunk_key}: LLM output format error; find LLM use {tuple_delimiter} as record seperators instead new-line" + ) + + for record in fixed_records: + record = record.strip() + if record is None: + continue + + # Fix various forms of tuple_delimiter corruption from the LLM output using the dedicated function + delimiter_core = tuple_delimiter[2:-2] # Extract "#" from "<|#|>" + record = fix_tuple_delimiter_corruption(record, delimiter_core, tuple_delimiter) + if delimiter_core != delimiter_core.lower(): + # change delimiter_core to lower case, and fix again + delimiter_core = delimiter_core.lower() + record = fix_tuple_delimiter_corruption( + record, delimiter_core, tuple_delimiter + ) + + record_attributes = split_string_by_multi_markers(record, [tuple_delimiter]) + + # Try to parse as entity + entity_data = await _handle_single_entity_extraction( + record_attributes, chunk_key, timestamp, file_path + ) + if entity_data is not None: + truncated_name = _truncate_entity_identifier( + entity_data["entity_name"], + DEFAULT_ENTITY_NAME_MAX_LENGTH, + chunk_key, + "Entity name", + ) + entity_data["entity_name"] = truncated_name + maybe_nodes[truncated_name].append(entity_data) + continue + + # Try to parse as relationship + relationship_data = await _handle_single_relationship_extraction( + record_attributes, chunk_key, timestamp, file_path + ) + if relationship_data is not None: + truncated_source = _truncate_entity_identifier( + relationship_data["src_id"], + DEFAULT_ENTITY_NAME_MAX_LENGTH, + chunk_key, + "Relation entity", + ) + truncated_target = _truncate_entity_identifier( + relationship_data["tgt_id"], + DEFAULT_ENTITY_NAME_MAX_LENGTH, + chunk_key, + "Relation entity", + ) + relationship_data["src_id"] = truncated_source + relationship_data["tgt_id"] = truncated_target + maybe_edges[(truncated_source, truncated_target)].append(relationship_data) + + return dict(maybe_nodes), dict(maybe_edges) + + +async def _rebuild_from_extraction_result( + text_chunks_storage: BaseKVStorage, + extraction_result: str, + chunk_id: str, + timestamp: int, +) -> tuple[dict, dict]: + """Parse cached extraction result using the same logic as extract_entities + + Args: + text_chunks_storage: Text chunks storage to get chunk data + extraction_result: The cached LLM extraction result + chunk_id: The chunk ID for source tracking + + Returns: + Tuple of (entities_dict, relationships_dict) + """ + + # Get chunk data for file_path from storage + chunk_data = await text_chunks_storage.get_by_id(chunk_id) + file_path = ( + chunk_data.get("file_path", "unknown_source") + if chunk_data + else "unknown_source" + ) + + # Call the shared processing function + return await _process_extraction_result( + extraction_result, + chunk_id, + timestamp, + file_path, + tuple_delimiter=PROMPTS["DEFAULT_TUPLE_DELIMITER"], + completion_delimiter=PROMPTS["DEFAULT_COMPLETION_DELIMITER"], + ) + + +async def _rebuild_single_entity( + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + entity_name: str, + chunk_ids: list[str], + chunk_entities: dict, + llm_response_cache: BaseKVStorage, + global_config: dict[str, str], + entity_chunks_storage: BaseKVStorage | None = None, + pipeline_status: dict | None = None, + pipeline_status_lock=None, +) -> None: + """Rebuild a single entity from cached extraction results""" + + # Get current entity data + current_entity = await knowledge_graph_inst.get_node(entity_name) + if not current_entity: + return + + # Helper function to update entity in both graph and vector storage + async def _update_entity_storage( + final_description: str, + entity_type: str, + file_paths: list[str], + source_chunk_ids: list[str], + truncation_info: str = "", + ): + try: + # Update entity in graph storage (critical path) + updated_entity_data = { + **current_entity, + "description": final_description, + "entity_type": entity_type, + "source_id": GRAPH_FIELD_SEP.join(source_chunk_ids), + "file_path": GRAPH_FIELD_SEP.join(file_paths) + if file_paths + else current_entity.get("file_path", "unknown_source"), + "created_at": int(time.time()), + "truncate": truncation_info, + } + await knowledge_graph_inst.upsert_node(entity_name, updated_entity_data) + + # Update entity in vector database (equally critical) + entity_vdb_id = compute_mdhash_id(entity_name, prefix="ent-") + entity_content = f"{entity_name}\n{final_description}" + + vdb_data = { + entity_vdb_id: { + "content": entity_content, + "entity_name": entity_name, + "source_id": updated_entity_data["source_id"], + "description": final_description, + "entity_type": entity_type, + "file_path": updated_entity_data["file_path"], + } + } + + # Use safe operation wrapper - VDB failure must throw exception + await safe_vdb_operation_with_exception( + operation=lambda: entities_vdb.upsert(vdb_data), + operation_name="rebuild_entity_upsert", + entity_name=entity_name, + max_retries=3, + retry_delay=0.1, + ) + + except Exception as e: + error_msg = f"Failed to update entity storage for `{entity_name}`: {e}" + logger.error(error_msg) + raise # Re-raise exception + + # normalized_chunk_ids = merge_source_ids([], chunk_ids) + normalized_chunk_ids = chunk_ids + + if entity_chunks_storage is not None and normalized_chunk_ids: + await entity_chunks_storage.upsert( + { + entity_name: { + "chunk_ids": normalized_chunk_ids, + "count": len(normalized_chunk_ids), + } + } + ) + + limit_method = ( + global_config.get("source_ids_limit_method") or SOURCE_IDS_LIMIT_METHOD_KEEP + ) + + limited_chunk_ids = apply_source_ids_limit( + normalized_chunk_ids, + global_config["max_source_ids_per_entity"], + limit_method, + identifier=f"`{entity_name}`", + ) + + # Collect all entity data from relevant (limited) chunks + all_entity_data = [] + for chunk_id in limited_chunk_ids: + if chunk_id in chunk_entities and entity_name in chunk_entities[chunk_id]: + all_entity_data.extend(chunk_entities[chunk_id][entity_name]) + + if not all_entity_data: + logger.warning( + f"No entity data found for `{entity_name}`, trying to rebuild from relationships" + ) + + # Get all edges connected to this entity + edges = await knowledge_graph_inst.get_node_edges(entity_name) + if not edges: + logger.warning(f"No relations attached to entity `{entity_name}`") + return + + # Collect relationship data to extract entity information + relationship_descriptions = [] + file_paths = set() + + # Get edge data for all connected relationships + for src_id, tgt_id in edges: + edge_data = await knowledge_graph_inst.get_edge(src_id, tgt_id) + if edge_data: + if edge_data.get("description"): + relationship_descriptions.append(edge_data["description"]) + + if edge_data.get("file_path"): + edge_file_paths = edge_data["file_path"].split(GRAPH_FIELD_SEP) + file_paths.update(edge_file_paths) + + # deduplicate descriptions + description_list = list(dict.fromkeys(relationship_descriptions)) + + # Generate final description from relationships or fallback to current + if description_list: + final_description, _ = await _handle_entity_relation_summary( + "Entity", + entity_name, + description_list, + GRAPH_FIELD_SEP, + global_config, + llm_response_cache=llm_response_cache, + ) + else: + final_description = current_entity.get("description", "") + + entity_type = current_entity.get("entity_type", "UNKNOWN") + await _update_entity_storage( + final_description, + entity_type, + file_paths, + limited_chunk_ids, + ) + return + + # Process cached entity data + descriptions = [] + entity_types = [] + file_paths_list = [] + seen_paths = set() + + for entity_data in all_entity_data: + if entity_data.get("description"): + descriptions.append(entity_data["description"]) + if entity_data.get("entity_type"): + entity_types.append(entity_data["entity_type"]) + if entity_data.get("file_path"): + file_path = entity_data["file_path"] + if file_path and file_path not in seen_paths: + file_paths_list.append(file_path) + seen_paths.add(file_path) + + # Apply MAX_FILE_PATHS limit + max_file_paths = global_config.get("max_file_paths") + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + limit_method = global_config.get("source_ids_limit_method") + + original_count = len(file_paths_list) + if original_count > max_file_paths: + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + # FIFO: keep tail (newest), discard head + file_paths_list = file_paths_list[-max_file_paths:] + else: + # KEEP: keep head (earliest), discard tail + file_paths_list = file_paths_list[:max_file_paths] + + file_paths_list.append( + f"...{file_path_placeholder}...({limit_method} {max_file_paths}/{original_count})" + ) + logger.info( + f"Limited `{entity_name}`: file_path {original_count} -> {max_file_paths} ({limit_method})" + ) + + # Remove duplicates while preserving order + description_list = list(dict.fromkeys(descriptions)) + entity_types = list(dict.fromkeys(entity_types)) + + # Get most common entity type + entity_type = ( + max(set(entity_types), key=entity_types.count) + if entity_types + else current_entity.get("entity_type", "UNKNOWN") + ) + + # Generate final description from entities or fallback to current + if description_list: + final_description, _ = await _handle_entity_relation_summary( + "Entity", + entity_name, + description_list, + GRAPH_FIELD_SEP, + global_config, + llm_response_cache=llm_response_cache, + ) + else: + final_description = current_entity.get("description", "") + + if len(limited_chunk_ids) < len(normalized_chunk_ids): + truncation_info = ( + f"{limit_method} {len(limited_chunk_ids)}/{len(normalized_chunk_ids)}" + ) + else: + truncation_info = "" + + await _update_entity_storage( + final_description, + entity_type, + file_paths_list, + limited_chunk_ids, + truncation_info, + ) + + # Log rebuild completion with truncation info + status_message = f"Rebuild `{entity_name}` from {len(chunk_ids)} chunks" + if truncation_info: + status_message += f" ({truncation_info})" + logger.info(status_message) + # Update pipeline status + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + +async def _rebuild_single_relationship( + knowledge_graph_inst: BaseGraphStorage, + relationships_vdb: BaseVectorStorage, + entities_vdb: BaseVectorStorage, + src: str, + tgt: str, + chunk_ids: list[str], + chunk_relationships: dict, + llm_response_cache: BaseKVStorage, + global_config: dict[str, str], + relation_chunks_storage: BaseKVStorage | None = None, + entity_chunks_storage: BaseKVStorage | None = None, + pipeline_status: dict | None = None, + pipeline_status_lock=None, +) -> None: + """Rebuild a single relationship from cached extraction results + + Note: This function assumes the caller has already acquired the appropriate + keyed lock for the relationship pair to ensure thread safety. + """ + + # Get current relationship data + current_relationship = await knowledge_graph_inst.get_edge(src, tgt) + if not current_relationship: + return + + # normalized_chunk_ids = merge_source_ids([], chunk_ids) + normalized_chunk_ids = chunk_ids + + if relation_chunks_storage is not None and normalized_chunk_ids: + storage_key = make_relation_chunk_key(src, tgt) + await relation_chunks_storage.upsert( + { + storage_key: { + "chunk_ids": normalized_chunk_ids, + "count": len(normalized_chunk_ids), + } + } + ) + + limit_method = ( + global_config.get("source_ids_limit_method") or SOURCE_IDS_LIMIT_METHOD_KEEP + ) + limited_chunk_ids = apply_source_ids_limit( + normalized_chunk_ids, + global_config["max_source_ids_per_relation"], + limit_method, + identifier=f"`{src}`~`{tgt}`", + ) + + # Collect all relationship data from relevant chunks + all_relationship_data = [] + for chunk_id in limited_chunk_ids: + if chunk_id in chunk_relationships: + # Check both (src, tgt) and (tgt, src) since relationships can be bidirectional + for edge_key in [(src, tgt), (tgt, src)]: + if edge_key in chunk_relationships[chunk_id]: + all_relationship_data.extend( + chunk_relationships[chunk_id][edge_key] + ) + + if not all_relationship_data: + logger.warning(f"No relation data found for `{src}-{tgt}`") + return + + # Merge descriptions and keywords + descriptions = [] + keywords = [] + weights = [] + file_paths_list = [] + seen_paths = set() + + for rel_data in all_relationship_data: + if rel_data.get("description"): + descriptions.append(rel_data["description"]) + if rel_data.get("keywords"): + keywords.append(rel_data["keywords"]) + if rel_data.get("weight"): + weights.append(rel_data["weight"]) + if rel_data.get("file_path"): + file_path = rel_data["file_path"] + if file_path and file_path not in seen_paths: + file_paths_list.append(file_path) + seen_paths.add(file_path) + + # Apply count limit + max_file_paths = global_config.get("max_file_paths") + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + limit_method = global_config.get("source_ids_limit_method") + + original_count = len(file_paths_list) + if original_count > max_file_paths: + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + # FIFO: keep tail (newest), discard head + file_paths_list = file_paths_list[-max_file_paths:] + else: + # KEEP: keep head (earliest), discard tail + file_paths_list = file_paths_list[:max_file_paths] + + file_paths_list.append( + f"...{file_path_placeholder}...({limit_method} {max_file_paths}/{original_count})" + ) + logger.info( + f"Limited `{src}`~`{tgt}`: file_path {original_count} -> {max_file_paths} ({limit_method})" + ) + + # Remove duplicates while preserving order + description_list = list(dict.fromkeys(descriptions)) + keywords = list(dict.fromkeys(keywords)) + + combined_keywords = ( + ", ".join(set(keywords)) + if keywords + else current_relationship.get("keywords", "") + ) + + weight = sum(weights) if weights else current_relationship.get("weight", 1.0) + + # Generate final description from relations or fallback to current + if description_list: + final_description, _ = await _handle_entity_relation_summary( + "Relation", + f"{src}-{tgt}", + description_list, + GRAPH_FIELD_SEP, + global_config, + llm_response_cache=llm_response_cache, + ) + else: + # fallback to keep current(unchanged) + final_description = current_relationship.get("description", "") + + if len(limited_chunk_ids) < len(normalized_chunk_ids): + truncation_info = ( + f"{limit_method} {len(limited_chunk_ids)}/{len(normalized_chunk_ids)}" + ) + else: + truncation_info = "" + + # Update relationship in graph storage + updated_relationship_data = { + **current_relationship, + "description": final_description + if final_description + else current_relationship.get("description", ""), + "keywords": combined_keywords, + "weight": weight, + "source_id": GRAPH_FIELD_SEP.join(limited_chunk_ids), + "file_path": GRAPH_FIELD_SEP.join([fp for fp in file_paths_list if fp]) + if file_paths_list + else current_relationship.get("file_path", "unknown_source"), + "truncate": truncation_info, + } + + # Ensure both endpoint nodes exist before writing the edge back + # (certain storage backends require pre-existing nodes). + node_description = ( + updated_relationship_data["description"] + if updated_relationship_data.get("description") + else current_relationship.get("description", "") + ) + node_source_id = updated_relationship_data.get("source_id", "") + node_file_path = updated_relationship_data.get("file_path", "unknown_source") + + for node_id in {src, tgt}: + if not (await knowledge_graph_inst.has_node(node_id)): + node_created_at = int(time.time()) + node_data = { + "entity_id": node_id, + "source_id": node_source_id, + "description": node_description, + "entity_type": "UNKNOWN", + "file_path": node_file_path, + "created_at": node_created_at, + "truncate": "", + } + await knowledge_graph_inst.upsert_node(node_id, node_data=node_data) + + # Update entity_chunks_storage for the newly created entity + if entity_chunks_storage is not None and limited_chunk_ids: + await entity_chunks_storage.upsert( + { + node_id: { + "chunk_ids": limited_chunk_ids, + "count": len(limited_chunk_ids), + } + } + ) + + # Update entity_vdb for the newly created entity + if entities_vdb is not None: + entity_vdb_id = compute_mdhash_id(node_id, prefix="ent-") + entity_content = f"{node_id}\n{node_description}" + vdb_data = { + entity_vdb_id: { + "content": entity_content, + "entity_name": node_id, + "source_id": node_source_id, + "entity_type": "UNKNOWN", + "file_path": node_file_path, + } + } + await safe_vdb_operation_with_exception( + operation=lambda payload=vdb_data: entities_vdb.upsert(payload), + operation_name="rebuild_added_entity_upsert", + entity_name=node_id, + max_retries=3, + retry_delay=0.1, + ) + + await knowledge_graph_inst.upsert_edge(src, tgt, updated_relationship_data) + + # Update relationship in vector database + # Sort src and tgt to ensure consistent ordering (smaller string first) + if src > tgt: + src, tgt = tgt, src + try: + rel_vdb_id = compute_mdhash_id(src + tgt, prefix="rel-") + rel_vdb_id_reverse = compute_mdhash_id(tgt + src, prefix="rel-") + + # Delete old vector records first (both directions to be safe) + try: + await relationships_vdb.delete([rel_vdb_id, rel_vdb_id_reverse]) + except Exception as e: + logger.debug( + f"Could not delete old relationship vector records {rel_vdb_id}, {rel_vdb_id_reverse}: {e}" + ) + + # Insert new vector record + rel_content = f"{combined_keywords}\t{src}\n{tgt}\n{final_description}" + vdb_data = { + rel_vdb_id: { + "src_id": src, + "tgt_id": tgt, + "source_id": updated_relationship_data["source_id"], + "content": rel_content, + "keywords": combined_keywords, + "description": final_description, + "weight": weight, + "file_path": updated_relationship_data["file_path"], + } + } + + # Use safe operation wrapper - VDB failure must throw exception + await safe_vdb_operation_with_exception( + operation=lambda: relationships_vdb.upsert(vdb_data), + operation_name="rebuild_relationship_upsert", + entity_name=f"{src}-{tgt}", + max_retries=3, + retry_delay=0.2, + ) + + except Exception as e: + error_msg = f"Failed to rebuild relationship storage for `{src}-{tgt}`: {e}" + logger.error(error_msg) + raise # Re-raise exception + + # Log rebuild completion with truncation info + status_message = f"Rebuild `{src}`~`{tgt}` from {len(chunk_ids)} chunks" + if truncation_info: + status_message += f" ({truncation_info})" + # Add truncation info from apply_source_ids_limit if truncation occurred + if len(limited_chunk_ids) < len(normalized_chunk_ids): + truncation_info = ( + f" ({limit_method}:{len(limited_chunk_ids)}/{len(normalized_chunk_ids)})" + ) + status_message += truncation_info + + logger.info(status_message) + + # Update pipeline status + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + +async def _merge_nodes_then_upsert( + entity_name: str, + nodes_data: list[dict], + knowledge_graph_inst: BaseGraphStorage, + entity_vdb: BaseVectorStorage | None, + global_config: dict, + pipeline_status: dict = None, + pipeline_status_lock=None, + llm_response_cache: BaseKVStorage | None = None, + entity_chunks_storage: BaseKVStorage | None = None, +): + """Get existing nodes from knowledge graph use name,if exists, merge data, else create, then upsert.""" + already_entity_types = [] + already_source_ids = [] + already_description = [] + already_file_paths = [] + + # 1. Get existing node data from knowledge graph + already_node = await knowledge_graph_inst.get_node(entity_name) + if already_node: + already_entity_types.append(already_node["entity_type"]) + already_source_ids.extend(already_node["source_id"].split(GRAPH_FIELD_SEP)) + already_file_paths.extend(already_node["file_path"].split(GRAPH_FIELD_SEP)) + already_description.extend(already_node["description"].split(GRAPH_FIELD_SEP)) + + new_source_ids = [dp["source_id"] for dp in nodes_data if dp.get("source_id")] + + existing_full_source_ids = [] + if entity_chunks_storage is not None: + stored_chunks = await entity_chunks_storage.get_by_id(entity_name) + if stored_chunks and isinstance(stored_chunks, dict): + existing_full_source_ids = [ + chunk_id for chunk_id in stored_chunks.get("chunk_ids", []) if chunk_id + ] + + if not existing_full_source_ids: + existing_full_source_ids = [ + chunk_id for chunk_id in already_source_ids if chunk_id + ] + + # 2. Merging new source ids with existing ones + full_source_ids = merge_source_ids(existing_full_source_ids, new_source_ids) + + if entity_chunks_storage is not None and full_source_ids: + await entity_chunks_storage.upsert( + { + entity_name: { + "chunk_ids": full_source_ids, + "count": len(full_source_ids), + } + } + ) + + # 3. Finalize source_id by applying source ids limit + limit_method = global_config.get("source_ids_limit_method") + max_source_limit = global_config.get("max_source_ids_per_entity") + source_ids = apply_source_ids_limit( + full_source_ids, + max_source_limit, + limit_method, + identifier=f"`{entity_name}`", + ) + + # 4. Only keep nodes not filter by apply_source_ids_limit if limit_method is KEEP + if limit_method == SOURCE_IDS_LIMIT_METHOD_KEEP: + allowed_source_ids = set(source_ids) + filtered_nodes = [] + for dp in nodes_data: + source_id = dp.get("source_id") + # Skip descriptions sourced from chunks dropped by the limitation cap + if ( + source_id + and source_id not in allowed_source_ids + and source_id not in existing_full_source_ids + ): + continue + filtered_nodes.append(dp) + nodes_data = filtered_nodes + else: # In FIFO mode, keep all nodes - truncation happens at source_ids level only + nodes_data = list(nodes_data) + + # 5. Check if we need to skip summary due to source_ids limit + if ( + limit_method == SOURCE_IDS_LIMIT_METHOD_KEEP + and len(existing_full_source_ids) >= max_source_limit + and not nodes_data + ): + if already_node: + logger.info( + f"Skipped `{entity_name}`: KEEP old chunks {already_source_ids}/{len(full_source_ids)}" + ) + existing_node_data = dict(already_node) + return existing_node_data + else: + logger.error(f"Internal Error: already_node missing for `{entity_name}`") + raise ValueError( + f"Internal Error: already_node missing for `{entity_name}`" + ) + + # 6.1 Finalize source_id + source_id = GRAPH_FIELD_SEP.join(source_ids) + + # 6.2 Finalize entity type by highest count + entity_type = sorted( + Counter( + [dp["entity_type"] for dp in nodes_data] + already_entity_types + ).items(), + key=lambda x: x[1], + reverse=True, + )[0][0] + + # 7. Deduplicate nodes by description, keeping first occurrence in the same document + unique_nodes = {} + for dp in nodes_data: + desc = dp.get("description") + if not desc: + continue + if desc not in unique_nodes: + unique_nodes[desc] = dp + + # Sort description by timestamp, then by description length when timestamps are the same + sorted_nodes = sorted( + unique_nodes.values(), + key=lambda x: (x.get("timestamp", 0), -len(x.get("description", ""))), + ) + sorted_descriptions = [dp["description"] for dp in sorted_nodes] + + # Combine already_description with sorted new sorted descriptions + description_list = already_description + sorted_descriptions + if not description_list: + logger.error(f"Entity {entity_name} has no description") + raise ValueError(f"Entity {entity_name} has no description") + + # Check for cancellation before LLM summary + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException("User cancelled during entity summary") + + # 8. Get summary description an LLM usage status + description, llm_was_used = await _handle_entity_relation_summary( + "Entity", + entity_name, + description_list, + GRAPH_FIELD_SEP, + global_config, + llm_response_cache, + ) + + # 9. Build file_path within MAX_FILE_PATHS + file_paths_list = [] + seen_paths = set() + has_placeholder = False # Indicating file_path has been truncated before + + max_file_paths = global_config.get("max_file_paths", DEFAULT_MAX_FILE_PATHS) + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + + # Collect from already_file_paths, excluding placeholder + for fp in already_file_paths: + if fp and fp.startswith(f"...{file_path_placeholder}"): # Skip placeholders + has_placeholder = True + continue + if fp and fp not in seen_paths: + file_paths_list.append(fp) + seen_paths.add(fp) + + # Collect from new data + for dp in nodes_data: + file_path_item = dp.get("file_path") + if file_path_item and file_path_item not in seen_paths: + file_paths_list.append(file_path_item) + seen_paths.add(file_path_item) + + # Apply count limit + if len(file_paths_list) > max_file_paths: + limit_method = global_config.get( + "source_ids_limit_method", SOURCE_IDS_LIMIT_METHOD_KEEP + ) + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + # Add + sign to indicate actual file count is higher + original_count_str = ( + f"{len(file_paths_list)}+" if has_placeholder else str(len(file_paths_list)) + ) + + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + # FIFO: keep tail (newest), discard head + file_paths_list = file_paths_list[-max_file_paths:] + file_paths_list.append(f"...{file_path_placeholder}...(FIFO)") + else: + # KEEP: keep head (earliest), discard tail + file_paths_list = file_paths_list[:max_file_paths] + file_paths_list.append(f"...{file_path_placeholder}...(KEEP Old)") + + logger.info( + f"Limited `{entity_name}`: file_path {original_count_str} -> {max_file_paths} ({limit_method})" + ) + # Finalize file_path + file_path = GRAPH_FIELD_SEP.join(file_paths_list) + + # 10.Log based on actual LLM usage + num_fragment = len(description_list) + already_fragment = len(already_description) + if llm_was_used: + status_message = f"LLMmrg: `{entity_name}` | {already_fragment}+{num_fragment - already_fragment}" + else: + status_message = f"Merged: `{entity_name}` | {already_fragment}+{num_fragment - already_fragment}" + + truncation_info = truncation_info_log = "" + if len(source_ids) < len(full_source_ids): + # Add truncation info from apply_source_ids_limit if truncation occurred + truncation_info_log = f"{limit_method} {len(source_ids)}/{len(full_source_ids)}" + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + truncation_info = truncation_info_log + else: + truncation_info = "KEEP Old" + + deduplicated_num = already_fragment + len(nodes_data) - num_fragment + dd_message = "" + if deduplicated_num > 0: + # Duplicated description detected across multiple trucks for the same entity + dd_message = f"dd {deduplicated_num}" + + if dd_message or truncation_info_log: + status_message += ( + f" ({', '.join(filter(None, [truncation_info_log, dd_message]))})" + ) + + # Add message to pipeline satus when merge happens + if already_fragment > 0 or llm_was_used: + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + else: + logger.debug(status_message) + + # 11. Update both graph and vector db + node_data = dict( + entity_id=entity_name, + entity_type=entity_type, + description=description, + source_id=source_id, + file_path=file_path, + created_at=int(time.time()), + truncate=truncation_info, + ) + await knowledge_graph_inst.upsert_node( + entity_name, + node_data=node_data, + ) + node_data["entity_name"] = entity_name + if entity_vdb is not None: + entity_vdb_id = compute_mdhash_id(str(entity_name), prefix="ent-") + entity_content = f"{entity_name}\n{description}" + data_for_vdb = { + entity_vdb_id: { + "entity_name": entity_name, + "entity_type": entity_type, + "content": entity_content, + "source_id": source_id, + "file_path": file_path, + } + } + await safe_vdb_operation_with_exception( + operation=lambda payload=data_for_vdb: entity_vdb.upsert(payload), + operation_name="entity_upsert", + entity_name=entity_name, + max_retries=3, + retry_delay=0.1, + ) + return node_data + + +async def _merge_edges_then_upsert( + src_id: str, + tgt_id: str, + edges_data: list[dict], + knowledge_graph_inst: BaseGraphStorage, + relationships_vdb: BaseVectorStorage | None, + entity_vdb: BaseVectorStorage | None, + global_config: dict, + pipeline_status: dict = None, + pipeline_status_lock=None, + llm_response_cache: BaseKVStorage | None = None, + added_entities: list = None, # New parameter to track entities added during edge processing + relation_chunks_storage: BaseKVStorage | None = None, + entity_chunks_storage: BaseKVStorage | None = None, +): + if src_id == tgt_id: + return None + + already_edge = None + already_weights = [] + already_source_ids = [] + already_description = [] + already_keywords = [] + already_file_paths = [] + + # 1. Get existing edge data from graph storage + if await knowledge_graph_inst.has_edge(src_id, tgt_id): + already_edge = await knowledge_graph_inst.get_edge(src_id, tgt_id) + # Handle the case where get_edge returns None or missing fields + if already_edge: + # Get weight with default 1.0 if missing + already_weights.append(already_edge.get("weight", 1.0)) + + # Get source_id with empty string default if missing or None + if already_edge.get("source_id") is not None: + already_source_ids.extend( + already_edge["source_id"].split(GRAPH_FIELD_SEP) + ) + + # Get file_path with empty string default if missing or None + if already_edge.get("file_path") is not None: + already_file_paths.extend( + already_edge["file_path"].split(GRAPH_FIELD_SEP) + ) + + # Get description with empty string default if missing or None + if already_edge.get("description") is not None: + already_description.extend( + already_edge["description"].split(GRAPH_FIELD_SEP) + ) + + # Get keywords with empty string default if missing or None + if already_edge.get("keywords") is not None: + already_keywords.extend( + split_string_by_multi_markers( + already_edge["keywords"], [GRAPH_FIELD_SEP] + ) + ) + + new_source_ids = [dp["source_id"] for dp in edges_data if dp.get("source_id")] + + storage_key = make_relation_chunk_key(src_id, tgt_id) + existing_full_source_ids = [] + if relation_chunks_storage is not None: + stored_chunks = await relation_chunks_storage.get_by_id(storage_key) + if stored_chunks and isinstance(stored_chunks, dict): + existing_full_source_ids = [ + chunk_id for chunk_id in stored_chunks.get("chunk_ids", []) if chunk_id + ] + + if not existing_full_source_ids: + existing_full_source_ids = [ + chunk_id for chunk_id in already_source_ids if chunk_id + ] + + # 2. Merge new source ids with existing ones + full_source_ids = merge_source_ids(existing_full_source_ids, new_source_ids) + + if relation_chunks_storage is not None and full_source_ids: + await relation_chunks_storage.upsert( + { + storage_key: { + "chunk_ids": full_source_ids, + "count": len(full_source_ids), + } + } + ) + + # 3. Finalize source_id by applying source ids limit + limit_method = global_config.get("source_ids_limit_method") + max_source_limit = global_config.get("max_source_ids_per_relation") + source_ids = apply_source_ids_limit( + full_source_ids, + max_source_limit, + limit_method, + identifier=f"`{src_id}`~`{tgt_id}`", + ) + limit_method = ( + global_config.get("source_ids_limit_method") or SOURCE_IDS_LIMIT_METHOD_KEEP + ) + + # 4. Only keep edges with source_id in the final source_ids list if in KEEP mode + if limit_method == SOURCE_IDS_LIMIT_METHOD_KEEP: + allowed_source_ids = set(source_ids) + filtered_edges = [] + for dp in edges_data: + source_id = dp.get("source_id") + # Skip relationship fragments sourced from chunks dropped by keep oldest cap + if ( + source_id + and source_id not in allowed_source_ids + and source_id not in existing_full_source_ids + ): + continue + filtered_edges.append(dp) + edges_data = filtered_edges + else: # In FIFO mode, keep all edges - truncation happens at source_ids level only + edges_data = list(edges_data) + + # 5. Check if we need to skip summary due to source_ids limit + if ( + limit_method == SOURCE_IDS_LIMIT_METHOD_KEEP + and len(existing_full_source_ids) >= max_source_limit + and not edges_data + ): + if already_edge: + logger.info( + f"Skipped `{src_id}`~`{tgt_id}`: KEEP old chunks {already_source_ids}/{len(full_source_ids)}" + ) + existing_edge_data = dict(already_edge) + return existing_edge_data + else: + logger.error( + f"Internal Error: already_node missing for `{src_id}`~`{tgt_id}`" + ) + raise ValueError( + f"Internal Error: already_node missing for `{src_id}`~`{tgt_id}`" + ) + + # 6.1 Finalize source_id + source_id = GRAPH_FIELD_SEP.join(source_ids) + + # 6.2 Finalize weight by summing new edges and existing weights + weight = sum([dp["weight"] for dp in edges_data] + already_weights) + + # 6.2 Finalize keywords by merging existing and new keywords + all_keywords = set() + # Process already_keywords (which are comma-separated) + for keyword_str in already_keywords: + if keyword_str: # Skip empty strings + all_keywords.update(k.strip() for k in keyword_str.split(",") if k.strip()) + # Process new keywords from edges_data + for edge in edges_data: + if edge.get("keywords"): + all_keywords.update( + k.strip() for k in edge["keywords"].split(",") if k.strip() + ) + # Join all unique keywords with commas + keywords = ",".join(sorted(all_keywords)) + + # 7. Deduplicate by description, keeping first occurrence in the same document + unique_edges = {} + for dp in edges_data: + description_value = dp.get("description") + if not description_value: + continue + if description_value not in unique_edges: + unique_edges[description_value] = dp + + # Sort description by timestamp, then by description length (largest to smallest) when timestamps are the same + sorted_edges = sorted( + unique_edges.values(), + key=lambda x: (x.get("timestamp", 0), -len(x.get("description", ""))), + ) + sorted_descriptions = [dp["description"] for dp in sorted_edges] + + # Combine already_description with sorted new descriptions + description_list = already_description + sorted_descriptions + if not description_list: + logger.error(f"Relation {src_id}~{tgt_id} has no description") + raise ValueError(f"Relation {src_id}~{tgt_id} has no description") + + # Check for cancellation before LLM summary + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException( + "User cancelled during relation summary" + ) + + # 8. Get summary description an LLM usage status + description, llm_was_used = await _handle_entity_relation_summary( + "Relation", + f"({src_id}, {tgt_id})", + description_list, + GRAPH_FIELD_SEP, + global_config, + llm_response_cache, + ) + + # 9. Build file_path within MAX_FILE_PATHS limit + file_paths_list = [] + seen_paths = set() + has_placeholder = False # Track if already_file_paths contains placeholder + + max_file_paths = global_config.get("max_file_paths", DEFAULT_MAX_FILE_PATHS) + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + + # Collect from already_file_paths, excluding placeholder + for fp in already_file_paths: + # Check if this is a placeholder record + if fp and fp.startswith(f"...{file_path_placeholder}"): # Skip placeholders + has_placeholder = True + continue + if fp and fp not in seen_paths: + file_paths_list.append(fp) + seen_paths.add(fp) + + # Collect from new data + for dp in edges_data: + file_path_item = dp.get("file_path") + if file_path_item and file_path_item not in seen_paths: + file_paths_list.append(file_path_item) + seen_paths.add(file_path_item) + + # Apply count limit + max_file_paths = global_config.get("max_file_paths") + + if len(file_paths_list) > max_file_paths: + limit_method = global_config.get( + "source_ids_limit_method", SOURCE_IDS_LIMIT_METHOD_KEEP + ) + file_path_placeholder = global_config.get( + "file_path_more_placeholder", DEFAULT_FILE_PATH_MORE_PLACEHOLDER + ) + + # Add + sign to indicate actual file count is higher + original_count_str = ( + f"{len(file_paths_list)}+" if has_placeholder else str(len(file_paths_list)) + ) + + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + # FIFO: keep tail (newest), discard head + file_paths_list = file_paths_list[-max_file_paths:] + file_paths_list.append(f"...{file_path_placeholder}...(FIFO)") + else: + # KEEP: keep head (earliest), discard tail + file_paths_list = file_paths_list[:max_file_paths] + file_paths_list.append(f"...{file_path_placeholder}...(KEEP Old)") + + logger.info( + f"Limited `{src_id}`~`{tgt_id}`: file_path {original_count_str} -> {max_file_paths} ({limit_method})" + ) + # Finalize file_path + file_path = GRAPH_FIELD_SEP.join(file_paths_list) + + # 10. Log based on actual LLM usage + num_fragment = len(description_list) + already_fragment = len(already_description) + if llm_was_used: + status_message = f"LLMmrg: `{src_id}`~`{tgt_id}` | {already_fragment}+{num_fragment - already_fragment}" + else: + status_message = f"Merged: `{src_id}`~`{tgt_id}` | {already_fragment}+{num_fragment - already_fragment}" + + truncation_info = truncation_info_log = "" + if len(source_ids) < len(full_source_ids): + # Add truncation info from apply_source_ids_limit if truncation occurred + truncation_info_log = f"{limit_method} {len(source_ids)}/{len(full_source_ids)}" + if limit_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + truncation_info = truncation_info_log + else: + truncation_info = "KEEP Old" + + deduplicated_num = already_fragment + len(edges_data) - num_fragment + dd_message = "" + if deduplicated_num > 0: + # Duplicated description detected across multiple trucks for the same entity + dd_message = f"dd {deduplicated_num}" + + if dd_message or truncation_info_log: + status_message += ( + f" ({', '.join(filter(None, [truncation_info_log, dd_message]))})" + ) + + # Add message to pipeline satus when merge happens + if already_fragment > 0 or llm_was_used: + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + else: + logger.debug(status_message) + + # 11. Update both graph and vector db + for need_insert_id in [src_id, tgt_id]: + # Optimization: Use get_node instead of has_node + get_node + existing_node = await knowledge_graph_inst.get_node(need_insert_id) + + if existing_node is None: + # Node doesn't exist - create new node + node_created_at = int(time.time()) + node_data = { + "entity_id": need_insert_id, + "source_id": source_id, + "description": description, + "entity_type": "UNKNOWN", + "file_path": file_path, + "created_at": node_created_at, + "truncate": "", + } + await knowledge_graph_inst.upsert_node(need_insert_id, node_data=node_data) + + # Update entity_chunks_storage for the newly created entity + if entity_chunks_storage is not None: + chunk_ids = [chunk_id for chunk_id in full_source_ids if chunk_id] + if chunk_ids: + await entity_chunks_storage.upsert( + { + need_insert_id: { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + } + ) + + if entity_vdb is not None: + entity_vdb_id = compute_mdhash_id(need_insert_id, prefix="ent-") + entity_content = f"{need_insert_id}\n{description}" + vdb_data = { + entity_vdb_id: { + "content": entity_content, + "entity_name": need_insert_id, + "source_id": source_id, + "entity_type": "UNKNOWN", + "file_path": file_path, + } + } + await safe_vdb_operation_with_exception( + operation=lambda payload=vdb_data: entity_vdb.upsert(payload), + operation_name="added_entity_upsert", + entity_name=need_insert_id, + max_retries=3, + retry_delay=0.1, + ) + + # Track entities added during edge processing + if added_entities is not None: + entity_data = { + "entity_name": need_insert_id, + "entity_type": "UNKNOWN", + "description": description, + "source_id": source_id, + "file_path": file_path, + "created_at": node_created_at, + } + added_entities.append(entity_data) + else: + # Node exists - update its source_ids by merging with new source_ids + updated = False # Track if any update occurred + + # 1. Get existing full source_ids from entity_chunks_storage + existing_full_source_ids = [] + if entity_chunks_storage is not None: + stored_chunks = await entity_chunks_storage.get_by_id(need_insert_id) + if stored_chunks and isinstance(stored_chunks, dict): + existing_full_source_ids = [ + chunk_id + for chunk_id in stored_chunks.get("chunk_ids", []) + if chunk_id + ] + + # If not in entity_chunks_storage, get from graph database + if not existing_full_source_ids: + if existing_node.get("source_id"): + existing_full_source_ids = existing_node["source_id"].split( + GRAPH_FIELD_SEP + ) + + # 2. Merge with new source_ids from this relationship + new_source_ids_from_relation = [ + chunk_id for chunk_id in source_ids if chunk_id + ] + merged_full_source_ids = merge_source_ids( + existing_full_source_ids, new_source_ids_from_relation + ) + + # 3. Save merged full list to entity_chunks_storage (conditional) + if ( + entity_chunks_storage is not None + and merged_full_source_ids != existing_full_source_ids + ): + updated = True + await entity_chunks_storage.upsert( + { + need_insert_id: { + "chunk_ids": merged_full_source_ids, + "count": len(merged_full_source_ids), + } + } + ) + + # 4. Apply source_ids limit for graph and vector db + limit_method = global_config.get( + "source_ids_limit_method", SOURCE_IDS_LIMIT_METHOD_KEEP + ) + max_source_limit = global_config.get("max_source_ids_per_entity") + limited_source_ids = apply_source_ids_limit( + merged_full_source_ids, + max_source_limit, + limit_method, + identifier=f"`{need_insert_id}`", + ) + + # 5. Update graph database and vector database with limited source_ids (conditional) + limited_source_id_str = GRAPH_FIELD_SEP.join(limited_source_ids) + + if limited_source_id_str != existing_node.get("source_id", ""): + updated = True + updated_node_data = { + **existing_node, + "source_id": limited_source_id_str, + } + await knowledge_graph_inst.upsert_node( + need_insert_id, node_data=updated_node_data + ) + + # Update vector database + if entity_vdb is not None: + entity_vdb_id = compute_mdhash_id(need_insert_id, prefix="ent-") + entity_content = ( + f"{need_insert_id}\n{existing_node.get('description', '')}" + ) + vdb_data = { + entity_vdb_id: { + "content": entity_content, + "entity_name": need_insert_id, + "source_id": limited_source_id_str, + "entity_type": existing_node.get("entity_type", "UNKNOWN"), + "file_path": existing_node.get( + "file_path", "unknown_source" + ), + } + } + await safe_vdb_operation_with_exception( + operation=lambda payload=vdb_data: entity_vdb.upsert(payload), + operation_name="existing_entity_update", + entity_name=need_insert_id, + max_retries=3, + retry_delay=0.1, + ) + + # 6. Log once at the end if any update occurred + if updated: + status_message = f"Chunks appended from relation: `{need_insert_id}`" + logger.info(status_message) + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = status_message + pipeline_status["history_messages"].append(status_message) + + edge_created_at = int(time.time()) + await knowledge_graph_inst.upsert_edge( + src_id, + tgt_id, + edge_data=dict( + weight=weight, + description=description, + keywords=keywords, + source_id=source_id, + file_path=file_path, + created_at=edge_created_at, + truncate=truncation_info, + ), + ) + + edge_data = dict( + src_id=src_id, + tgt_id=tgt_id, + description=description, + keywords=keywords, + source_id=source_id, + file_path=file_path, + created_at=edge_created_at, + truncate=truncation_info, + weight=weight, + ) + + # Sort src_id and tgt_id to ensure consistent ordering (smaller string first) + if src_id > tgt_id: + src_id, tgt_id = tgt_id, src_id + + if relationships_vdb is not None: + rel_vdb_id = compute_mdhash_id(src_id + tgt_id, prefix="rel-") + rel_vdb_id_reverse = compute_mdhash_id(tgt_id + src_id, prefix="rel-") + try: + await relationships_vdb.delete([rel_vdb_id, rel_vdb_id_reverse]) + except Exception as e: + logger.debug( + f"Could not delete old relationship vector records {rel_vdb_id}, {rel_vdb_id_reverse}: {e}" + ) + rel_content = f"{keywords}\t{src_id}\n{tgt_id}\n{description}" + vdb_data = { + rel_vdb_id: { + "src_id": src_id, + "tgt_id": tgt_id, + "source_id": source_id, + "content": rel_content, + "keywords": keywords, + "description": description, + "weight": weight, + "file_path": file_path, + } + } + await safe_vdb_operation_with_exception( + operation=lambda payload=vdb_data: relationships_vdb.upsert(payload), + operation_name="relationship_upsert", + entity_name=f"{src_id}-{tgt_id}", + max_retries=3, + retry_delay=0.2, + ) + + return edge_data + + +async def merge_nodes_and_edges( + chunk_results: list, + knowledge_graph_inst: BaseGraphStorage, + entity_vdb: BaseVectorStorage, + relationships_vdb: BaseVectorStorage, + global_config: dict[str, str], + full_entities_storage: BaseKVStorage = None, + full_relations_storage: BaseKVStorage = None, + doc_id: str = None, + pipeline_status: dict = None, + pipeline_status_lock=None, + llm_response_cache: BaseKVStorage | None = None, + entity_chunks_storage: BaseKVStorage | None = None, + relation_chunks_storage: BaseKVStorage | None = None, + current_file_number: int = 0, + total_files: int = 0, + file_path: str = "unknown_source", +) -> None: + """Two-phase merge: process all entities first, then all relationships + + This approach ensures data consistency by: + 1. Phase 1: Process all entities concurrently + 2. Phase 2: Process all relationships concurrently (may add missing entities) + 3. Phase 3: Update full_entities and full_relations storage with final results + + Args: + chunk_results: List of tuples (maybe_nodes, maybe_edges) containing extracted entities and relationships + knowledge_graph_inst: Knowledge graph storage + entity_vdb: Entity vector database + relationships_vdb: Relationship vector database + global_config: Global configuration + full_entities_storage: Storage for document entity lists + full_relations_storage: Storage for document relation lists + doc_id: Document ID for storage indexing + pipeline_status: Pipeline status dictionary + pipeline_status_lock: Lock for pipeline status + llm_response_cache: LLM response cache + entity_chunks_storage: Storage tracking full chunk lists per entity + relation_chunks_storage: Storage tracking full chunk lists per relation + current_file_number: Current file number for logging + total_files: Total files for logging + file_path: File path for logging + """ + + # Check for cancellation at the start of merge + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException("User cancelled during merge phase") + + # Collect all nodes and edges from all chunks + all_nodes = defaultdict(list) + all_edges = defaultdict(list) + + for maybe_nodes, maybe_edges in chunk_results: + # Collect nodes + for entity_name, entities in maybe_nodes.items(): + all_nodes[entity_name].extend(entities) + + # Collect edges with sorted keys for undirected graph + for edge_key, edges in maybe_edges.items(): + sorted_edge_key = tuple(sorted(edge_key)) + all_edges[sorted_edge_key].extend(edges) + + total_entities_count = len(all_nodes) + total_relations_count = len(all_edges) + + log_message = f"Merging stage {current_file_number}/{total_files}: {file_path}" + logger.info(log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Get max async tasks limit from global_config for semaphore control + graph_max_async = global_config.get("llm_model_max_async", 4) * 2 + semaphore = asyncio.Semaphore(graph_max_async) + + # ===== Phase 1: Process all entities concurrently ===== + log_message = f"Phase 1: Processing {total_entities_count} entities from {doc_id} (async: {graph_max_async})" + logger.info(log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + async def _locked_process_entity_name(entity_name, entities): + async with semaphore: + # Check for cancellation before processing entity + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException( + "User cancelled during entity merge" + ) + + workspace = global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + async with get_storage_keyed_lock( + [entity_name], namespace=namespace, enable_logging=False + ): + try: + logger.debug(f"Processing entity {entity_name}") + entity_data = await _merge_nodes_then_upsert( + entity_name, + entities, + knowledge_graph_inst, + entity_vdb, + global_config, + pipeline_status, + pipeline_status_lock, + llm_response_cache, + entity_chunks_storage, + ) + + return entity_data + + except Exception as e: + error_msg = f"Error processing entity `{entity_name}`: {e}" + logger.error(error_msg) + + # Try to update pipeline status, but don't let status update failure affect main exception + try: + if ( + pipeline_status is not None + and pipeline_status_lock is not None + ): + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append(error_msg) + except Exception as status_error: + logger.error( + f"Failed to update pipeline status: {status_error}" + ) + + # Re-raise the original exception with a prefix + prefixed_exception = create_prefixed_exception( + e, f"`{entity_name}`" + ) + raise prefixed_exception from e + + # Create entity processing tasks + entity_tasks = [] + for entity_name, entities in all_nodes.items(): + task = asyncio.create_task(_locked_process_entity_name(entity_name, entities)) + entity_tasks.append(task) + + # Execute entity tasks with error handling + processed_entities = [] + if entity_tasks: + done, pending = await asyncio.wait( + entity_tasks, return_when=asyncio.FIRST_EXCEPTION + ) + + first_exception = None + processed_entities = [] + + for task in done: + try: + result = task.result() + except BaseException as e: + if first_exception is None: + first_exception = e + else: + processed_entities.append(result) + + if pending: + for task in pending: + task.cancel() + pending_results = await asyncio.gather(*pending, return_exceptions=True) + for result in pending_results: + if isinstance(result, BaseException): + if first_exception is None: + first_exception = result + else: + processed_entities.append(result) + + if first_exception is not None: + raise first_exception + + # ===== Phase 2: Process all relationships concurrently ===== + log_message = f"Phase 2: Processing {total_relations_count} relations from {doc_id} (async: {graph_max_async})" + logger.info(log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + async def _locked_process_edges(edge_key, edges): + async with semaphore: + # Check for cancellation before processing edges + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException( + "User cancelled during relation merge" + ) + + workspace = global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + sorted_edge_key = sorted([edge_key[0], edge_key[1]]) + + async with get_storage_keyed_lock( + sorted_edge_key, + namespace=namespace, + enable_logging=False, + ): + try: + added_entities = [] # Track entities added during edge processing + + logger.debug(f"Processing relation {sorted_edge_key}") + edge_data = await _merge_edges_then_upsert( + edge_key[0], + edge_key[1], + edges, + knowledge_graph_inst, + relationships_vdb, + entity_vdb, + global_config, + pipeline_status, + pipeline_status_lock, + llm_response_cache, + added_entities, # Pass list to collect added entities + relation_chunks_storage, + entity_chunks_storage, # Add entity_chunks_storage parameter + ) + + if edge_data is None: + return None, [] + + return edge_data, added_entities + + except Exception as e: + error_msg = f"Error processing relation `{sorted_edge_key}`: {e}" + logger.error(error_msg) + + # Try to update pipeline status, but don't let status update failure affect main exception + try: + if ( + pipeline_status is not None + and pipeline_status_lock is not None + ): + async with pipeline_status_lock: + pipeline_status["latest_message"] = error_msg + pipeline_status["history_messages"].append(error_msg) + except Exception as status_error: + logger.error( + f"Failed to update pipeline status: {status_error}" + ) + + # Re-raise the original exception with a prefix + prefixed_exception = create_prefixed_exception( + e, f"{sorted_edge_key}" + ) + raise prefixed_exception from e + + # Create relationship processing tasks + edge_tasks = [] + for edge_key, edges in all_edges.items(): + task = asyncio.create_task(_locked_process_edges(edge_key, edges)) + edge_tasks.append(task) + + # Execute relationship tasks with error handling + processed_edges = [] + all_added_entities = [] + + if edge_tasks: + done, pending = await asyncio.wait( + edge_tasks, return_when=asyncio.FIRST_EXCEPTION + ) + + first_exception = None + + for task in done: + try: + edge_data, added_entities = task.result() + except BaseException as e: + if first_exception is None: + first_exception = e + else: + if edge_data is not None: + processed_edges.append(edge_data) + all_added_entities.extend(added_entities) + + if pending: + for task in pending: + task.cancel() + pending_results = await asyncio.gather(*pending, return_exceptions=True) + for result in pending_results: + if isinstance(result, BaseException): + if first_exception is None: + first_exception = result + else: + edge_data, added_entities = result + if edge_data is not None: + processed_edges.append(edge_data) + all_added_entities.extend(added_entities) + + if first_exception is not None: + raise first_exception + + # ===== Phase 3: Update full_entities and full_relations storage ===== + if full_entities_storage and full_relations_storage and doc_id: + try: + # Merge all entities: original entities + entities added during edge processing + final_entity_names = set() + + # Add original processed entities + for entity_data in processed_entities: + if entity_data and entity_data.get("entity_name"): + final_entity_names.add(entity_data["entity_name"]) + + # Add entities that were added during relationship processing + for added_entity in all_added_entities: + if added_entity and added_entity.get("entity_name"): + final_entity_names.add(added_entity["entity_name"]) + + # Collect all relation pairs + final_relation_pairs = set() + for edge_data in processed_edges: + if edge_data: + src_id = edge_data.get("src_id") + tgt_id = edge_data.get("tgt_id") + if src_id and tgt_id: + relation_pair = tuple(sorted([src_id, tgt_id])) + final_relation_pairs.add(relation_pair) + + log_message = f"Phase 3: Updating final {len(final_entity_names)}({len(processed_entities)}+{len(all_added_entities)}) entities and {len(final_relation_pairs)} relations from {doc_id}" + logger.info(log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Update storage + if final_entity_names: + await full_entities_storage.upsert( + { + doc_id: { + "entity_names": list(final_entity_names), + "count": len(final_entity_names), + } + } + ) + + if final_relation_pairs: + await full_relations_storage.upsert( + { + doc_id: { + "relation_pairs": [ + list(pair) for pair in final_relation_pairs + ], + "count": len(final_relation_pairs), + } + } + ) + + logger.debug( + f"Updated entity-relation index for document {doc_id}: {len(final_entity_names)} entities (original: {len(processed_entities)}, added: {len(all_added_entities)}), {len(final_relation_pairs)} relations" + ) + + except Exception as e: + logger.error( + f"Failed to update entity-relation index for document {doc_id}: {e}" + ) + # Don't raise exception to avoid affecting main flow + + log_message = f"Completed merging: {len(processed_entities)} entities, {len(all_added_entities)} extra entities, {len(processed_edges)} relations" + logger.info(log_message) + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + +async def extract_entities( + chunks: dict[str, TextChunkSchema], + global_config: dict[str, str], + pipeline_status: dict = None, + pipeline_status_lock=None, + llm_response_cache: BaseKVStorage | None = None, + text_chunks_storage: BaseKVStorage | None = None, +) -> list: + # Check for cancellation at the start of entity extraction + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException( + "User cancelled during entity extraction" + ) + + use_llm_func: callable = global_config["llm_model_func"] + entity_extract_max_gleaning = global_config["entity_extract_max_gleaning"] + + ordered_chunks = list(chunks.items()) + # add language and example number params to prompt + language = global_config["addon_params"].get("language", DEFAULT_SUMMARY_LANGUAGE) + entity_types = global_config["addon_params"].get( + "entity_types", DEFAULT_ENTITY_TYPES + ) + + examples = "\n".join(PROMPTS["entity_extraction_examples"]) + + example_context_base = dict( + tuple_delimiter=PROMPTS["DEFAULT_TUPLE_DELIMITER"], + completion_delimiter=PROMPTS["DEFAULT_COMPLETION_DELIMITER"], + entity_types=", ".join(entity_types), + language=language, + ) + # add example's format + examples = examples.format(**example_context_base) + + context_base = dict( + tuple_delimiter=PROMPTS["DEFAULT_TUPLE_DELIMITER"], + completion_delimiter=PROMPTS["DEFAULT_COMPLETION_DELIMITER"], + entity_types=",".join(entity_types), + examples=examples, + language=language, + ) + + processed_chunks = 0 + total_chunks = len(ordered_chunks) + + async def _process_single_content(chunk_key_dp: tuple[str, TextChunkSchema]): + """Process a single chunk + Args: + chunk_key_dp (tuple[str, TextChunkSchema]): + ("chunk-xxxxxx", {"tokens": int, "content": str, "full_doc_id": str, "chunk_order_index": int}) + Returns: + tuple: (maybe_nodes, maybe_edges) containing extracted entities and relationships + """ + nonlocal processed_chunks + chunk_key = chunk_key_dp[0] + chunk_dp = chunk_key_dp[1] + content = chunk_dp["content"] + # Get file path from chunk data or use default + file_path = chunk_dp.get("file_path", "unknown_source") + + # Create cache keys collector for batch processing + cache_keys_collector = [] + + # Get initial extraction + entity_extraction_system_prompt = PROMPTS[ + "entity_extraction_system_prompt" + ].format(**{**context_base, "input_text": content}) + entity_extraction_user_prompt = PROMPTS["entity_extraction_user_prompt"].format( + **{**context_base, "input_text": content} + ) + entity_continue_extraction_user_prompt = PROMPTS[ + "entity_continue_extraction_user_prompt" + ].format(**{**context_base, "input_text": content}) + + final_result, timestamp = await use_llm_func_with_cache( + entity_extraction_user_prompt, + use_llm_func, + system_prompt=entity_extraction_system_prompt, + llm_response_cache=llm_response_cache, + cache_type="extract", + chunk_id=chunk_key, + cache_keys_collector=cache_keys_collector, + ) + + history = pack_user_ass_to_openai_messages( + entity_extraction_user_prompt, final_result + ) + + # Process initial extraction with file path + maybe_nodes, maybe_edges = await _process_extraction_result( + final_result, + chunk_key, + timestamp, + file_path, + tuple_delimiter=context_base["tuple_delimiter"], + completion_delimiter=context_base["completion_delimiter"], + ) + + # Process additional gleaning results only 1 time when entity_extract_max_gleaning is greater than zero. + if entity_extract_max_gleaning > 0: + glean_result, timestamp = await use_llm_func_with_cache( + entity_continue_extraction_user_prompt, + use_llm_func, + system_prompt=entity_extraction_system_prompt, + llm_response_cache=llm_response_cache, + history_messages=history, + cache_type="extract", + chunk_id=chunk_key, + cache_keys_collector=cache_keys_collector, + ) + + # Process gleaning result separately with file path + glean_nodes, glean_edges = await _process_extraction_result( + glean_result, + chunk_key, + timestamp, + file_path, + tuple_delimiter=context_base["tuple_delimiter"], + completion_delimiter=context_base["completion_delimiter"], + ) + + # Merge results - compare description lengths to choose better version + for entity_name, glean_entities in glean_nodes.items(): + if entity_name in maybe_nodes: + # Compare description lengths and keep the better one + original_desc_len = len( + maybe_nodes[entity_name][0].get("description", "") or "" + ) + glean_desc_len = len(glean_entities[0].get("description", "") or "") + + if glean_desc_len > original_desc_len: + maybe_nodes[entity_name] = list(glean_entities) + # Otherwise keep original version + else: + # New entity from gleaning stage + maybe_nodes[entity_name] = list(glean_entities) + + for edge_key, glean_edges in glean_edges.items(): + if edge_key in maybe_edges: + # Compare description lengths and keep the better one + original_desc_len = len( + maybe_edges[edge_key][0].get("description", "") or "" + ) + glean_desc_len = len(glean_edges[0].get("description", "") or "") + + if glean_desc_len > original_desc_len: + maybe_edges[edge_key] = list(glean_edges) + # Otherwise keep original version + else: + # New edge from gleaning stage + maybe_edges[edge_key] = list(glean_edges) + + # Batch update chunk's llm_cache_list with all collected cache keys + if cache_keys_collector and text_chunks_storage: + await update_chunk_cache_list( + chunk_key, + text_chunks_storage, + cache_keys_collector, + "entity_extraction", + ) + + processed_chunks += 1 + entities_count = len(maybe_nodes) + relations_count = len(maybe_edges) + log_message = f"Chunk {processed_chunks} of {total_chunks} extracted {entities_count} Ent + {relations_count} Rel {chunk_key}" + logger.info(log_message) + if pipeline_status is not None: + async with pipeline_status_lock: + pipeline_status["latest_message"] = log_message + pipeline_status["history_messages"].append(log_message) + + # Return the extracted nodes and edges for centralized processing + return maybe_nodes, maybe_edges + + # Get max async tasks limit from global_config + chunk_max_async = global_config.get("llm_model_max_async", 4) + semaphore = asyncio.Semaphore(chunk_max_async) + + async def _process_with_semaphore(chunk): + async with semaphore: + # Check for cancellation before processing chunk + if pipeline_status is not None and pipeline_status_lock is not None: + async with pipeline_status_lock: + if pipeline_status.get("cancellation_requested", False): + raise PipelineCancelledException( + "User cancelled during chunk processing" + ) + + try: + return await _process_single_content(chunk) + except Exception as e: + chunk_id = chunk[0] # Extract chunk_id from chunk[0] + prefixed_exception = create_prefixed_exception(e, chunk_id) + raise prefixed_exception from e + + tasks = [] + for c in ordered_chunks: + task = asyncio.create_task(_process_with_semaphore(c)) + tasks.append(task) + + # Wait for tasks to complete or for the first exception to occur + # This allows us to cancel remaining tasks if any task fails + done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION) + + # Check if any task raised an exception and ensure all exceptions are retrieved + first_exception = None + chunk_results = [] + + for task in done: + try: + exception = task.exception() + if exception is not None: + if first_exception is None: + first_exception = exception + else: + chunk_results.append(task.result()) + except Exception as e: + if first_exception is None: + first_exception = e + + # If any task failed, cancel all pending tasks and raise the first exception + if first_exception is not None: + # Cancel all pending tasks + for pending_task in pending: + pending_task.cancel() + + # Wait for cancellation to complete + if pending: + await asyncio.wait(pending) + + # Add progress prefix to the exception message + progress_prefix = f"C[{processed_chunks + 1}/{total_chunks}]" + + # Re-raise the original exception with a prefix + prefixed_exception = create_prefixed_exception(first_exception, progress_prefix) + raise prefixed_exception from first_exception + + # If all tasks completed successfully, chunk_results already contains the results + # Return the chunk_results for later processing in merge_nodes_and_edges + return chunk_results + + +async def kg_query( + query: str, + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + relationships_vdb: BaseVectorStorage, + text_chunks_db: BaseKVStorage, + query_param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, + system_prompt: str | None = None, + chunks_vdb: BaseVectorStorage = None, +) -> QueryResult | None: + """ + Execute knowledge graph query and return unified QueryResult object. + + Args: + query: Query string + knowledge_graph_inst: Knowledge graph storage instance + entities_vdb: Entity vector database + relationships_vdb: Relationship vector database + text_chunks_db: Text chunks storage + query_param: Query parameters + global_config: Global configuration + hashing_kv: Cache storage + system_prompt: System prompt + chunks_vdb: Document chunks vector database + + Returns: + QueryResult | None: Unified query result object containing: + - content: Non-streaming response text content + - response_iterator: Streaming response iterator + - raw_data: Complete structured data (including references and metadata) + - is_streaming: Whether this is a streaming result + + Based on different query_param settings, different fields will be populated: + - only_need_context=True: content contains context string + - only_need_prompt=True: content contains complete prompt + - stream=True: response_iterator contains streaming response, raw_data contains complete data + - default: content contains LLM response text, raw_data contains complete data + + Returns None when no relevant context could be constructed for the query. + """ + if not query: + return QueryResult(content=PROMPTS["fail_response"]) + + if query_param.model_func: + use_model_func = query_param.model_func + else: + use_model_func = global_config["llm_model_func"] + # Apply higher priority (5) to query relation LLM function + use_model_func = partial(use_model_func, _priority=5) + + hl_keywords, ll_keywords = await get_keywords_from_query( + query, query_param, global_config, hashing_kv + ) + + logger.debug(f"High-level keywords: {hl_keywords}") + logger.debug(f"Low-level keywords: {ll_keywords}") + + # Handle empty keywords + if ll_keywords == [] and query_param.mode in ["local", "hybrid", "mix"]: + logger.warning("low_level_keywords is empty") + if hl_keywords == [] and query_param.mode in ["global", "hybrid", "mix"]: + logger.warning("high_level_keywords is empty") + if hl_keywords == [] and ll_keywords == []: + if len(query) < 50: + logger.warning(f"Forced low_level_keywords to origin query: {query}") + ll_keywords = [query] + else: + return QueryResult(content=PROMPTS["fail_response"]) + + ll_keywords_str = ", ".join(ll_keywords) if ll_keywords else "" + hl_keywords_str = ", ".join(hl_keywords) if hl_keywords else "" + + # Build query context (unified interface) + context_result = await _build_query_context( + query, + ll_keywords_str, + hl_keywords_str, + knowledge_graph_inst, + entities_vdb, + relationships_vdb, + text_chunks_db, + query_param, + chunks_vdb, + ) + + if context_result is None: + logger.info("[kg_query] No query context could be built; returning no-result.") + return None + + # Return different content based on query parameters + if query_param.only_need_context and not query_param.only_need_prompt: + return QueryResult( + content=context_result.context, raw_data=context_result.raw_data + ) + + user_prompt = f"\n\n{query_param.user_prompt}" if query_param.user_prompt else "n/a" + response_type = ( + query_param.response_type + if query_param.response_type + else "Multiple Paragraphs" + ) + + # Build system prompt + sys_prompt_temp = system_prompt if system_prompt else PROMPTS["rag_response"] + sys_prompt = sys_prompt_temp.format( + response_type=response_type, + user_prompt=user_prompt, + context_data=context_result.context, + ) + + user_query = query + + if query_param.only_need_prompt: + prompt_content = "\n\n".join([sys_prompt, "---User Query---", user_query]) + return QueryResult(content=prompt_content, raw_data=context_result.raw_data) + + # Call LLM + tokenizer: Tokenizer = global_config["tokenizer"] + len_of_prompts = len(tokenizer.encode(query + sys_prompt)) + logger.debug( + f"[kg_query] Sending to LLM: {len_of_prompts:,} tokens (Query: {len(tokenizer.encode(query))}, System: {len(tokenizer.encode(sys_prompt))})" + ) + + # Handle cache + args_hash = compute_args_hash( + query_param.mode, + query, + query_param.response_type, + query_param.top_k, + query_param.chunk_top_k, + query_param.max_entity_tokens, + query_param.max_relation_tokens, + query_param.max_total_tokens, + hl_keywords_str, + ll_keywords_str, + query_param.user_prompt or "", + query_param.enable_rerank, + ) + + cached_result = await handle_cache( + hashing_kv, args_hash, user_query, query_param.mode, cache_type="query" + ) + + if cached_result is not None: + cached_response, _ = cached_result # Extract content, ignore timestamp + logger.info( + " == LLM cache == Query cache hit, using cached response as query result" + ) + response = cached_response + else: + response = await use_model_func( + user_query, + system_prompt=sys_prompt, + history_messages=query_param.conversation_history, + enable_cot=True, + stream=query_param.stream, + ) + + if hashing_kv and hashing_kv.global_config.get("enable_llm_cache"): + queryparam_dict = { + "mode": query_param.mode, + "response_type": query_param.response_type, + "top_k": query_param.top_k, + "chunk_top_k": query_param.chunk_top_k, + "max_entity_tokens": query_param.max_entity_tokens, + "max_relation_tokens": query_param.max_relation_tokens, + "max_total_tokens": query_param.max_total_tokens, + "hl_keywords": hl_keywords_str, + "ll_keywords": ll_keywords_str, + "user_prompt": query_param.user_prompt or "", + "enable_rerank": query_param.enable_rerank, + } + await save_to_cache( + hashing_kv, + CacheData( + args_hash=args_hash, + content=response, + prompt=query, + mode=query_param.mode, + cache_type="query", + queryparam=queryparam_dict, + ), + ) + + # Return unified result based on actual response type + if isinstance(response, str): + # Non-streaming response (string) + if len(response) > len(sys_prompt): + response = ( + response.replace(sys_prompt, "") + .replace("user", "") + .replace("model", "") + .replace(query, "") + .replace("", "") + .replace("", "") + .strip() + ) + + return QueryResult(content=response, raw_data=context_result.raw_data) + else: + # Streaming response (AsyncIterator) + return QueryResult( + response_iterator=response, + raw_data=context_result.raw_data, + is_streaming=True, + ) + + +async def get_keywords_from_query( + query: str, + query_param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, +) -> tuple[list[str], list[str]]: + """ + Retrieves high-level and low-level keywords for RAG operations. + + This function checks if keywords are already provided in query parameters, + and if not, extracts them from the query text using LLM. + + Args: + query: The user's query text + query_param: Query parameters that may contain pre-defined keywords + global_config: Global configuration dictionary + hashing_kv: Optional key-value storage for caching results + + Returns: + A tuple containing (high_level_keywords, low_level_keywords) + """ + # Check if pre-defined keywords are already provided + if query_param.hl_keywords or query_param.ll_keywords: + return query_param.hl_keywords, query_param.ll_keywords + + # Extract keywords using extract_keywords_only function which already supports conversation history + hl_keywords, ll_keywords = await extract_keywords_only( + query, query_param, global_config, hashing_kv + ) + return hl_keywords, ll_keywords + + +async def extract_keywords_only( + text: str, + param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, +) -> tuple[list[str], list[str]]: + """ + Extract high-level and low-level keywords from the given 'text' using the LLM. + This method does NOT build the final RAG context or provide a final answer. + It ONLY extracts keywords (hl_keywords, ll_keywords). + """ + + # 1. Handle cache if needed - add cache type for keywords + args_hash = compute_args_hash( + param.mode, + text, + ) + cached_result = await handle_cache( + hashing_kv, args_hash, text, param.mode, cache_type="keywords" + ) + if cached_result is not None: + cached_response, _ = cached_result # Extract content, ignore timestamp + try: + keywords_data = json_repair.loads(cached_response) + return keywords_data.get("high_level_keywords", []), keywords_data.get( + "low_level_keywords", [] + ) + except (json.JSONDecodeError, KeyError): + logger.warning( + "Invalid cache format for keywords, proceeding with extraction" + ) + + # 2. Build the examples + examples = "\n".join(PROMPTS["keywords_extraction_examples"]) + + language = global_config["addon_params"].get("language", DEFAULT_SUMMARY_LANGUAGE) + + # 3. Build the keyword-extraction prompt + kw_prompt = PROMPTS["keywords_extraction"].format( + query=text, + examples=examples, + language=language, + ) + + tokenizer: Tokenizer = global_config["tokenizer"] + len_of_prompts = len(tokenizer.encode(kw_prompt)) + logger.debug( + f"[extract_keywords] Sending to LLM: {len_of_prompts:,} tokens (Prompt: {len_of_prompts})" + ) + + # 4. Call the LLM for keyword extraction + if param.model_func: + use_model_func = param.model_func + else: + use_model_func = global_config["llm_model_func"] + # Apply higher priority (5) to query relation LLM function + use_model_func = partial(use_model_func, _priority=5) + + result = await use_model_func(kw_prompt, keyword_extraction=True) + + # 5. Parse out JSON from the LLM response + result = remove_think_tags(result) + try: + keywords_data = json_repair.loads(result) + if not keywords_data: + logger.error("No JSON-like structure found in the LLM respond.") + return [], [] + except json.JSONDecodeError as e: + logger.error(f"JSON parsing error: {e}") + logger.error(f"LLM respond: {result}") + return [], [] + + hl_keywords = keywords_data.get("high_level_keywords", []) + ll_keywords = keywords_data.get("low_level_keywords", []) + + # 6. Cache only the processed keywords with cache type + if hl_keywords or ll_keywords: + cache_data = { + "high_level_keywords": hl_keywords, + "low_level_keywords": ll_keywords, + } + if hashing_kv.global_config.get("enable_llm_cache"): + # Save to cache with query parameters + queryparam_dict = { + "mode": param.mode, + "response_type": param.response_type, + "top_k": param.top_k, + "chunk_top_k": param.chunk_top_k, + "max_entity_tokens": param.max_entity_tokens, + "max_relation_tokens": param.max_relation_tokens, + "max_total_tokens": param.max_total_tokens, + "user_prompt": param.user_prompt or "", + "enable_rerank": param.enable_rerank, + } + await save_to_cache( + hashing_kv, + CacheData( + args_hash=args_hash, + content=json.dumps(cache_data), + prompt=text, + mode=param.mode, + cache_type="keywords", + queryparam=queryparam_dict, + ), + ) + + return hl_keywords, ll_keywords + + +async def _get_vector_context( + query: str, + chunks_vdb: BaseVectorStorage, + query_param: QueryParam, + query_embedding: list[float] = None, +) -> list[dict]: + """ + Retrieve text chunks from the vector database without reranking or truncation. + + This function performs vector search to find relevant text chunks for a query. + Reranking and truncation will be handled later in the unified processing. + + Args: + query: The query string to search for + chunks_vdb: Vector database containing document chunks + query_param: Query parameters including chunk_top_k and ids + query_embedding: Optional pre-computed query embedding to avoid redundant embedding calls + + Returns: + List of text chunks with metadata + """ + try: + # Use chunk_top_k if specified, otherwise fall back to top_k + search_top_k = query_param.chunk_top_k or query_param.top_k + cosine_threshold = chunks_vdb.cosine_better_than_threshold + + results = await chunks_vdb.query( + query, top_k=search_top_k, query_embedding=query_embedding + ) + if not results: + logger.info( + f"Naive query: 0 chunks (chunk_top_k:{search_top_k} cosine:{cosine_threshold})" + ) + return [] + + valid_chunks = [] + for result in results: + if "content" in result: + chunk_with_metadata = { + "content": result["content"], + "created_at": result.get("created_at", None), + "file_path": result.get("file_path", "unknown_source"), + "source_type": "vector", # Mark the source type + "chunk_id": result.get("id"), # Add chunk_id for deduplication + } + valid_chunks.append(chunk_with_metadata) + + logger.info( + f"Naive query: {len(valid_chunks)} chunks (chunk_top_k:{search_top_k} cosine:{cosine_threshold})" + ) + return valid_chunks + + except Exception as e: + logger.error(f"Error in _get_vector_context: {e}") + return [] + + +async def _perform_kg_search( + query: str, + ll_keywords: str, + hl_keywords: str, + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + relationships_vdb: BaseVectorStorage, + text_chunks_db: BaseKVStorage, + query_param: QueryParam, + chunks_vdb: BaseVectorStorage = None, +) -> dict[str, Any]: + """ + Pure search logic that retrieves raw entities, relations, and vector chunks. + No token truncation or formatting - just raw search results. + """ + + # Initialize result containers + local_entities = [] + local_relations = [] + global_entities = [] + global_relations = [] + vector_chunks = [] + chunk_tracking = {} + + # Handle different query modes + + # Track chunk sources and metadata for final logging + chunk_tracking = {} # chunk_id -> {source, frequency, order} + + # Pre-compute query embedding once for all vector operations + kg_chunk_pick_method = text_chunks_db.global_config.get( + "kg_chunk_pick_method", DEFAULT_KG_CHUNK_PICK_METHOD + ) + query_embedding = None + if query and (kg_chunk_pick_method == "VECTOR" or chunks_vdb): + actual_embedding_func = text_chunks_db.embedding_func + if actual_embedding_func: + try: + query_embedding = await actual_embedding_func([query]) + query_embedding = query_embedding[ + 0 + ] # Extract first embedding from batch result + logger.debug("Pre-computed query embedding for all vector operations") + except Exception as e: + logger.warning(f"Failed to pre-compute query embedding: {e}") + query_embedding = None + + # Handle local and global modes + if query_param.mode == "local" and len(ll_keywords) > 0: + local_entities, local_relations = await _get_node_data( + ll_keywords, + knowledge_graph_inst, + entities_vdb, + query_param, + ) + + elif query_param.mode == "global" and len(hl_keywords) > 0: + global_relations, global_entities = await _get_edge_data( + hl_keywords, + knowledge_graph_inst, + relationships_vdb, + query_param, + ) + + else: # hybrid or mix mode + if len(ll_keywords) > 0: + local_entities, local_relations = await _get_node_data( + ll_keywords, + knowledge_graph_inst, + entities_vdb, + query_param, + ) + if len(hl_keywords) > 0: + global_relations, global_entities = await _get_edge_data( + hl_keywords, + knowledge_graph_inst, + relationships_vdb, + query_param, + ) + + # Get vector chunks for mix mode + if query_param.mode == "mix" and chunks_vdb: + vector_chunks = await _get_vector_context( + query, + chunks_vdb, + query_param, + query_embedding, + ) + # Track vector chunks with source metadata + for i, chunk in enumerate(vector_chunks): + chunk_id = chunk.get("chunk_id") or chunk.get("id") + if chunk_id: + chunk_tracking[chunk_id] = { + "source": "C", + "frequency": 1, # Vector chunks always have frequency 1 + "order": i + 1, # 1-based order in vector search results + } + else: + logger.warning(f"Vector chunk missing chunk_id: {chunk}") + + # Round-robin merge entities + final_entities = [] + seen_entities = set() + max_len = max(len(local_entities), len(global_entities)) + for i in range(max_len): + # First from local + if i < len(local_entities): + entity = local_entities[i] + entity_name = entity.get("entity_name") + if entity_name and entity_name not in seen_entities: + final_entities.append(entity) + seen_entities.add(entity_name) + + # Then from global + if i < len(global_entities): + entity = global_entities[i] + entity_name = entity.get("entity_name") + if entity_name and entity_name not in seen_entities: + final_entities.append(entity) + seen_entities.add(entity_name) + + # Round-robin merge relations + final_relations = [] + seen_relations = set() + max_len = max(len(local_relations), len(global_relations)) + for i in range(max_len): + # First from local + if i < len(local_relations): + relation = local_relations[i] + # Build relation unique identifier + if "src_tgt" in relation: + rel_key = tuple(sorted(relation["src_tgt"])) + else: + rel_key = tuple( + sorted([relation.get("src_id"), relation.get("tgt_id")]) + ) + + if rel_key not in seen_relations: + final_relations.append(relation) + seen_relations.add(rel_key) + + # Then from global + if i < len(global_relations): + relation = global_relations[i] + # Build relation unique identifier + if "src_tgt" in relation: + rel_key = tuple(sorted(relation["src_tgt"])) + else: + rel_key = tuple( + sorted([relation.get("src_id"), relation.get("tgt_id")]) + ) + + if rel_key not in seen_relations: + final_relations.append(relation) + seen_relations.add(rel_key) + + logger.info( + f"Raw search results: {len(final_entities)} entities, {len(final_relations)} relations, {len(vector_chunks)} vector chunks" + ) + + return { + "final_entities": final_entities, + "final_relations": final_relations, + "vector_chunks": vector_chunks, + "chunk_tracking": chunk_tracking, + "query_embedding": query_embedding, + } + + +async def _apply_token_truncation( + search_result: dict[str, Any], + query_param: QueryParam, + global_config: dict[str, str], +) -> dict[str, Any]: + """ + Apply token-based truncation to entities and relations for LLM efficiency. + """ + tokenizer = global_config.get("tokenizer") + if not tokenizer: + logger.warning("No tokenizer found, skipping truncation") + return { + "entities_context": [], + "relations_context": [], + "filtered_entities": search_result["final_entities"], + "filtered_relations": search_result["final_relations"], + "entity_id_to_original": {}, + "relation_id_to_original": {}, + } + + # Get token limits from query_param with fallbacks + max_entity_tokens = getattr( + query_param, + "max_entity_tokens", + global_config.get("max_entity_tokens", DEFAULT_MAX_ENTITY_TOKENS), + ) + max_relation_tokens = getattr( + query_param, + "max_relation_tokens", + global_config.get("max_relation_tokens", DEFAULT_MAX_RELATION_TOKENS), + ) + + final_entities = search_result["final_entities"] + final_relations = search_result["final_relations"] + + # Create mappings from entity/relation identifiers to original data + entity_id_to_original = {} + relation_id_to_original = {} + + # Generate entities context for truncation + entities_context = [] + for i, entity in enumerate(final_entities): + entity_name = entity["entity_name"] + created_at = entity.get("created_at", "UNKNOWN") + if isinstance(created_at, (int, float)): + created_at = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(created_at)) + + # Store mapping from entity name to original data + entity_id_to_original[entity_name] = entity + + entities_context.append( + { + "entity": entity_name, + "type": entity.get("entity_type", "UNKNOWN"), + "description": entity.get("description", "UNKNOWN"), + "created_at": created_at, + "file_path": entity.get("file_path", "unknown_source"), + } + ) + + # Generate relations context for truncation + relations_context = [] + for i, relation in enumerate(final_relations): + created_at = relation.get("created_at", "UNKNOWN") + if isinstance(created_at, (int, float)): + created_at = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(created_at)) + + # Handle different relation data formats + if "src_tgt" in relation: + entity1, entity2 = relation["src_tgt"] + else: + entity1, entity2 = relation.get("src_id"), relation.get("tgt_id") + + # Store mapping from relation pair to original data + relation_key = (entity1, entity2) + relation_id_to_original[relation_key] = relation + + relations_context.append( + { + "entity1": entity1, + "entity2": entity2, + "description": relation.get("description", "UNKNOWN"), + "created_at": created_at, + "file_path": relation.get("file_path", "unknown_source"), + } + ) + + logger.debug( + f"Before truncation: {len(entities_context)} entities, {len(relations_context)} relations" + ) + + # Apply token-based truncation + if entities_context: + # Remove file_path and created_at for token calculation + entities_context_for_truncation = [] + for entity in entities_context: + entity_copy = entity.copy() + entity_copy.pop("file_path", None) + entity_copy.pop("created_at", None) + entities_context_for_truncation.append(entity_copy) + + entities_context = truncate_list_by_token_size( + entities_context_for_truncation, + key=lambda x: "\n".join( + json.dumps(item, ensure_ascii=False) for item in [x] + ), + max_token_size=max_entity_tokens, + tokenizer=tokenizer, + ) + + if relations_context: + # Remove file_path and created_at for token calculation + relations_context_for_truncation = [] + for relation in relations_context: + relation_copy = relation.copy() + relation_copy.pop("file_path", None) + relation_copy.pop("created_at", None) + relations_context_for_truncation.append(relation_copy) + + relations_context = truncate_list_by_token_size( + relations_context_for_truncation, + key=lambda x: "\n".join( + json.dumps(item, ensure_ascii=False) for item in [x] + ), + max_token_size=max_relation_tokens, + tokenizer=tokenizer, + ) + + logger.info( + f"After truncation: {len(entities_context)} entities, {len(relations_context)} relations" + ) + + # Create filtered original data based on truncated context + filtered_entities = [] + filtered_entity_id_to_original = {} + if entities_context: + final_entity_names = {e["entity"] for e in entities_context} + seen_nodes = set() + for entity in final_entities: + name = entity.get("entity_name") + if name in final_entity_names and name not in seen_nodes: + filtered_entities.append(entity) + filtered_entity_id_to_original[name] = entity + seen_nodes.add(name) + + filtered_relations = [] + filtered_relation_id_to_original = {} + if relations_context: + final_relation_pairs = {(r["entity1"], r["entity2"]) for r in relations_context} + seen_edges = set() + for relation in final_relations: + src, tgt = relation.get("src_id"), relation.get("tgt_id") + if src is None or tgt is None: + src, tgt = relation.get("src_tgt", (None, None)) + + pair = (src, tgt) + if pair in final_relation_pairs and pair not in seen_edges: + filtered_relations.append(relation) + filtered_relation_id_to_original[pair] = relation + seen_edges.add(pair) + + return { + "entities_context": entities_context, + "relations_context": relations_context, + "filtered_entities": filtered_entities, + "filtered_relations": filtered_relations, + "entity_id_to_original": filtered_entity_id_to_original, + "relation_id_to_original": filtered_relation_id_to_original, + } + + +async def _merge_all_chunks( + filtered_entities: list[dict], + filtered_relations: list[dict], + vector_chunks: list[dict], + query: str = "", + knowledge_graph_inst: BaseGraphStorage = None, + text_chunks_db: BaseKVStorage = None, + query_param: QueryParam = None, + chunks_vdb: BaseVectorStorage = None, + chunk_tracking: dict = None, + query_embedding: list[float] = None, +) -> list[dict]: + """ + Merge chunks from different sources: vector_chunks + entity_chunks + relation_chunks. + """ + if chunk_tracking is None: + chunk_tracking = {} + + # Get chunks from entities + entity_chunks = [] + if filtered_entities and text_chunks_db: + entity_chunks = await _find_related_text_unit_from_entities( + filtered_entities, + query_param, + text_chunks_db, + knowledge_graph_inst, + query, + chunks_vdb, + chunk_tracking=chunk_tracking, + query_embedding=query_embedding, + ) + + # Get chunks from relations + relation_chunks = [] + if filtered_relations and text_chunks_db: + relation_chunks = await _find_related_text_unit_from_relations( + filtered_relations, + query_param, + text_chunks_db, + entity_chunks, # For deduplication + query, + chunks_vdb, + chunk_tracking=chunk_tracking, + query_embedding=query_embedding, + ) + + # Round-robin merge chunks from different sources with deduplication + merged_chunks = [] + seen_chunk_ids = set() + max_len = max(len(vector_chunks), len(entity_chunks), len(relation_chunks)) + origin_len = len(vector_chunks) + len(entity_chunks) + len(relation_chunks) + + for i in range(max_len): + # Add from vector chunks first (Naive mode) + if i < len(vector_chunks): + chunk = vector_chunks[i] + chunk_id = chunk.get("chunk_id") or chunk.get("id") + if chunk_id and chunk_id not in seen_chunk_ids: + seen_chunk_ids.add(chunk_id) + merged_chunks.append( + { + "content": chunk["content"], + "file_path": chunk.get("file_path", "unknown_source"), + "chunk_id": chunk_id, + } + ) + + # Add from entity chunks (Local mode) + if i < len(entity_chunks): + chunk = entity_chunks[i] + chunk_id = chunk.get("chunk_id") or chunk.get("id") + if chunk_id and chunk_id not in seen_chunk_ids: + seen_chunk_ids.add(chunk_id) + merged_chunks.append( + { + "content": chunk["content"], + "file_path": chunk.get("file_path", "unknown_source"), + "chunk_id": chunk_id, + } + ) + + # Add from relation chunks (Global mode) + if i < len(relation_chunks): + chunk = relation_chunks[i] + chunk_id = chunk.get("chunk_id") or chunk.get("id") + if chunk_id and chunk_id not in seen_chunk_ids: + seen_chunk_ids.add(chunk_id) + merged_chunks.append( + { + "content": chunk["content"], + "file_path": chunk.get("file_path", "unknown_source"), + "chunk_id": chunk_id, + } + ) + + logger.info( + f"Round-robin merged chunks: {origin_len} -> {len(merged_chunks)} (deduplicated {origin_len - len(merged_chunks)})" + ) + + return merged_chunks + + +async def _build_context_str( + entities_context: list[dict], + relations_context: list[dict], + merged_chunks: list[dict], + query: str, + query_param: QueryParam, + global_config: dict[str, str], + chunk_tracking: dict = None, + entity_id_to_original: dict = None, + relation_id_to_original: dict = None, +) -> tuple[str, dict[str, Any]]: + """ + Build the final LLM context string with token processing. + This includes dynamic token calculation and final chunk truncation. + """ + tokenizer = global_config.get("tokenizer") + if not tokenizer: + logger.error("Missing tokenizer, cannot build LLM context") + # Return empty raw data structure when no tokenizer + empty_raw_data = convert_to_user_format( + [], + [], + [], + [], + query_param.mode, + ) + empty_raw_data["status"] = "failure" + empty_raw_data["message"] = "Missing tokenizer, cannot build LLM context." + return "", empty_raw_data + + # Get token limits + max_total_tokens = getattr( + query_param, + "max_total_tokens", + global_config.get("max_total_tokens", DEFAULT_MAX_TOTAL_TOKENS), + ) + + # Get the system prompt template from PROMPTS or global_config + sys_prompt_template = global_config.get( + "system_prompt_template", PROMPTS["rag_response"] + ) + + kg_context_template = PROMPTS["kg_query_context"] + user_prompt = query_param.user_prompt if query_param.user_prompt else "" + response_type = ( + query_param.response_type + if query_param.response_type + else "Multiple Paragraphs" + ) + + entities_str = "\n".join( + json.dumps(entity, ensure_ascii=False) for entity in entities_context + ) + relations_str = "\n".join( + json.dumps(relation, ensure_ascii=False) for relation in relations_context + ) + + # Calculate preliminary kg context tokens + pre_kg_context = kg_context_template.format( + entities_str=entities_str, + relations_str=relations_str, + text_chunks_str="", + reference_list_str="", + ) + kg_context_tokens = len(tokenizer.encode(pre_kg_context)) + + # Calculate preliminary system prompt tokens + pre_sys_prompt = sys_prompt_template.format( + context_data="", # Empty for overhead calculation + response_type=response_type, + user_prompt=user_prompt, + ) + sys_prompt_tokens = len(tokenizer.encode(pre_sys_prompt)) + + # Calculate available tokens for text chunks + query_tokens = len(tokenizer.encode(query)) + buffer_tokens = 200 # reserved for reference list and safety buffer + available_chunk_tokens = max_total_tokens - ( + sys_prompt_tokens + kg_context_tokens + query_tokens + buffer_tokens + ) + + logger.debug( + f"Token allocation - Total: {max_total_tokens}, SysPrompt: {sys_prompt_tokens}, Query: {query_tokens}, KG: {kg_context_tokens}, Buffer: {buffer_tokens}, Available for chunks: {available_chunk_tokens}" + ) + + # Apply token truncation to chunks using the dynamic limit + truncated_chunks = await process_chunks_unified( + query=query, + unique_chunks=merged_chunks, + query_param=query_param, + global_config=global_config, + source_type=query_param.mode, + chunk_token_limit=available_chunk_tokens, # Pass dynamic limit + ) + + # Generate reference list from truncated chunks using the new common function + reference_list, truncated_chunks = generate_reference_list_from_chunks( + truncated_chunks + ) + + # Rebuild chunks_context with truncated chunks + # The actual tokens may be slightly less than available_chunk_tokens due to deduplication logic + chunks_context = [] + for i, chunk in enumerate(truncated_chunks): + chunks_context.append( + { + "reference_id": chunk["reference_id"], + "content": chunk["content"], + } + ) + + text_units_str = "\n".join( + json.dumps(text_unit, ensure_ascii=False) for text_unit in chunks_context + ) + reference_list_str = "\n".join( + f"[{ref['reference_id']}] {ref['file_path']}" + for ref in reference_list + if ref["reference_id"] + ) + + logger.info( + f"Final context: {len(entities_context)} entities, {len(relations_context)} relations, {len(chunks_context)} chunks" + ) + + # not necessary to use LLM to generate a response + if not entities_context and not relations_context and not chunks_context: + # Return empty raw data structure when no entities/relations + empty_raw_data = convert_to_user_format( + [], + [], + [], + [], + query_param.mode, + ) + empty_raw_data["status"] = "failure" + empty_raw_data["message"] = "Query returned empty dataset." + return "", empty_raw_data + + # output chunks tracking infomations + # format: / (e.g., E5/2 R2/1 C1/1) + if truncated_chunks and chunk_tracking: + chunk_tracking_log = [] + for chunk in truncated_chunks: + chunk_id = chunk.get("chunk_id") + if chunk_id and chunk_id in chunk_tracking: + tracking_info = chunk_tracking[chunk_id] + source = tracking_info["source"] + frequency = tracking_info["frequency"] + order = tracking_info["order"] + chunk_tracking_log.append(f"{source}{frequency}/{order}") + else: + chunk_tracking_log.append("?0/0") + + if chunk_tracking_log: + logger.info(f"Final chunks S+F/O: {' '.join(chunk_tracking_log)}") + + result = kg_context_template.format( + entities_str=entities_str, + relations_str=relations_str, + text_chunks_str=text_units_str, + reference_list_str=reference_list_str, + ) + + # Always return both context and complete data structure (unified approach) + logger.debug( + f"[_build_context_str] Converting to user format: {len(entities_context)} entities, {len(relations_context)} relations, {len(truncated_chunks)} chunks" + ) + final_data = convert_to_user_format( + entities_context, + relations_context, + truncated_chunks, + reference_list, + query_param.mode, + entity_id_to_original, + relation_id_to_original, + ) + logger.debug( + f"[_build_context_str] Final data after conversion: {len(final_data.get('entities', []))} entities, {len(final_data.get('relationships', []))} relationships, {len(final_data.get('chunks', []))} chunks" + ) + return result, final_data + + +# Now let's update the old _build_query_context to use the new architecture +async def _build_query_context( + query: str, + ll_keywords: str, + hl_keywords: str, + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + relationships_vdb: BaseVectorStorage, + text_chunks_db: BaseKVStorage, + query_param: QueryParam, + chunks_vdb: BaseVectorStorage = None, +) -> QueryContextResult | None: + """ + Main query context building function using the new 4-stage architecture: + 1. Search -> 2. Truncate -> 3. Merge chunks -> 4. Build LLM context + + Returns unified QueryContextResult containing both context and raw_data. + """ + + if not query: + logger.warning("Query is empty, skipping context building") + return None + + # Stage 1: Pure search + search_result = await _perform_kg_search( + query, + ll_keywords, + hl_keywords, + knowledge_graph_inst, + entities_vdb, + relationships_vdb, + text_chunks_db, + query_param, + chunks_vdb, + ) + + if not search_result["final_entities"] and not search_result["final_relations"]: + if query_param.mode != "mix": + return None + else: + if not search_result["chunk_tracking"]: + return None + + # Stage 2: Apply token truncation for LLM efficiency + truncation_result = await _apply_token_truncation( + search_result, + query_param, + text_chunks_db.global_config, + ) + + # Stage 3: Merge chunks using filtered entities/relations + merged_chunks = await _merge_all_chunks( + filtered_entities=truncation_result["filtered_entities"], + filtered_relations=truncation_result["filtered_relations"], + vector_chunks=search_result["vector_chunks"], + query=query, + knowledge_graph_inst=knowledge_graph_inst, + text_chunks_db=text_chunks_db, + query_param=query_param, + chunks_vdb=chunks_vdb, + chunk_tracking=search_result["chunk_tracking"], + query_embedding=search_result["query_embedding"], + ) + + if ( + not merged_chunks + and not truncation_result["entities_context"] + and not truncation_result["relations_context"] + ): + return None + + # Stage 4: Build final LLM context with dynamic token processing + # _build_context_str now always returns tuple[str, dict] + context, raw_data = await _build_context_str( + entities_context=truncation_result["entities_context"], + relations_context=truncation_result["relations_context"], + merged_chunks=merged_chunks, + query=query, + query_param=query_param, + global_config=text_chunks_db.global_config, + chunk_tracking=search_result["chunk_tracking"], + entity_id_to_original=truncation_result["entity_id_to_original"], + relation_id_to_original=truncation_result["relation_id_to_original"], + ) + + # Convert keywords strings to lists and add complete metadata to raw_data + hl_keywords_list = hl_keywords.split(", ") if hl_keywords else [] + ll_keywords_list = ll_keywords.split(", ") if ll_keywords else [] + + # Add complete metadata to raw_data (preserve existing metadata including query_mode) + if "metadata" not in raw_data: + raw_data["metadata"] = {} + + # Update keywords while preserving existing metadata + raw_data["metadata"]["keywords"] = { + "high_level": hl_keywords_list, + "low_level": ll_keywords_list, + } + raw_data["metadata"]["processing_info"] = { + "total_entities_found": len(search_result.get("final_entities", [])), + "total_relations_found": len(search_result.get("final_relations", [])), + "entities_after_truncation": len( + truncation_result.get("filtered_entities", []) + ), + "relations_after_truncation": len( + truncation_result.get("filtered_relations", []) + ), + "merged_chunks_count": len(merged_chunks), + "final_chunks_count": len(raw_data.get("data", {}).get("chunks", [])), + } + + logger.debug( + f"[_build_query_context] Context length: {len(context) if context else 0}" + ) + logger.debug( + f"[_build_query_context] Raw data entities: {len(raw_data.get('data', {}).get('entities', []))}, relationships: {len(raw_data.get('data', {}).get('relationships', []))}, chunks: {len(raw_data.get('data', {}).get('chunks', []))}" + ) + + return QueryContextResult(context=context, raw_data=raw_data) + + +async def _get_node_data( + query: str, + knowledge_graph_inst: BaseGraphStorage, + entities_vdb: BaseVectorStorage, + query_param: QueryParam, +): + # get similar entities + logger.info( + f"Query nodes: {query} (top_k:{query_param.top_k}, cosine:{entities_vdb.cosine_better_than_threshold})" + ) + + results = await entities_vdb.query(query, top_k=query_param.top_k) + + if not len(results): + return [], [] + + # Extract all entity IDs from your results list + node_ids = [r["entity_name"] for r in results] + + # Call the batch node retrieval and degree functions concurrently. + nodes_dict, degrees_dict = await asyncio.gather( + knowledge_graph_inst.get_nodes_batch(node_ids), + knowledge_graph_inst.node_degrees_batch(node_ids), + ) + + # Now, if you need the node data and degree in order: + node_datas = [nodes_dict.get(nid) for nid in node_ids] + node_degrees = [degrees_dict.get(nid, 0) for nid in node_ids] + + if not all([n is not None for n in node_datas]): + logger.warning("Some nodes are missing, maybe the storage is damaged") + + node_datas = [ + { + **n, + "entity_name": k["entity_name"], + "rank": d, + "created_at": k.get("created_at"), + } + for k, n, d in zip(results, node_datas, node_degrees) + if n is not None + ] + + use_relations = await _find_most_related_edges_from_entities( + node_datas, + query_param, + knowledge_graph_inst, + ) + + logger.info( + f"Local query: {len(node_datas)} entites, {len(use_relations)} relations" + ) + + # Entities are sorted by cosine similarity + # Relations are sorted by rank + weight + return node_datas, use_relations + + +async def _find_most_related_edges_from_entities( + node_datas: list[dict], + query_param: QueryParam, + knowledge_graph_inst: BaseGraphStorage, +): + node_names = [dp["entity_name"] for dp in node_datas] + batch_edges_dict = await knowledge_graph_inst.get_nodes_edges_batch(node_names) + + all_edges = [] + seen = set() + + for node_name in node_names: + this_edges = batch_edges_dict.get(node_name, []) + for e in this_edges: + sorted_edge = tuple(sorted(e)) + if sorted_edge not in seen: + seen.add(sorted_edge) + all_edges.append(sorted_edge) + + # Prepare edge pairs in two forms: + # For the batch edge properties function, use dicts. + edge_pairs_dicts = [{"src": e[0], "tgt": e[1]} for e in all_edges] + # For edge degrees, use tuples. + edge_pairs_tuples = list(all_edges) # all_edges is already a list of tuples + + # Call the batched functions concurrently. + edge_data_dict, edge_degrees_dict = await asyncio.gather( + knowledge_graph_inst.get_edges_batch(edge_pairs_dicts), + knowledge_graph_inst.edge_degrees_batch(edge_pairs_tuples), + ) + + # Reconstruct edge_datas list in the same order as the deduplicated results. + all_edges_data = [] + for pair in all_edges: + edge_props = edge_data_dict.get(pair) + if edge_props is not None: + if "weight" not in edge_props: + logger.warning( + f"Edge {pair} missing 'weight' attribute, using default value 1.0" + ) + edge_props["weight"] = 1.0 + + combined = { + "src_tgt": pair, + "rank": edge_degrees_dict.get(pair, 0), + **edge_props, + } + all_edges_data.append(combined) + + all_edges_data = sorted( + all_edges_data, key=lambda x: (x["rank"], x["weight"]), reverse=True + ) + + return all_edges_data + + +async def _find_related_text_unit_from_entities( + node_datas: list[dict], + query_param: QueryParam, + text_chunks_db: BaseKVStorage, + knowledge_graph_inst: BaseGraphStorage, + query: str = None, + chunks_vdb: BaseVectorStorage = None, + chunk_tracking: dict = None, + query_embedding=None, +): + """ + Find text chunks related to entities using configurable chunk selection method. + + This function supports two chunk selection strategies: + 1. WEIGHT: Linear gradient weighted polling based on chunk occurrence count + 2. VECTOR: Vector similarity-based selection using embedding cosine similarity + """ + logger.debug(f"Finding text chunks from {len(node_datas)} entities") + + if not node_datas: + return [] + + # Step 1: Collect all text chunks for each entity + entities_with_chunks = [] + for entity in node_datas: + if entity.get("source_id"): + chunks = split_string_by_multi_markers( + entity["source_id"], [GRAPH_FIELD_SEP] + ) + if chunks: + entities_with_chunks.append( + { + "entity_name": entity["entity_name"], + "chunks": chunks, + "entity_data": entity, + } + ) + + if not entities_with_chunks: + logger.warning("No entities with text chunks found") + return [] + + kg_chunk_pick_method = text_chunks_db.global_config.get( + "kg_chunk_pick_method", DEFAULT_KG_CHUNK_PICK_METHOD + ) + max_related_chunks = text_chunks_db.global_config.get( + "related_chunk_number", DEFAULT_RELATED_CHUNK_NUMBER + ) + + # Step 2: Count chunk occurrences and deduplicate (keep chunks from earlier positioned entities) + chunk_occurrence_count = {} + for entity_info in entities_with_chunks: + deduplicated_chunks = [] + for chunk_id in entity_info["chunks"]: + chunk_occurrence_count[chunk_id] = ( + chunk_occurrence_count.get(chunk_id, 0) + 1 + ) + + # If this is the first occurrence (count == 1), keep it; otherwise skip (duplicate from later position) + if chunk_occurrence_count[chunk_id] == 1: + deduplicated_chunks.append(chunk_id) + # count > 1 means this chunk appeared in an earlier entity, so skip it + + # Update entity's chunks to deduplicated chunks + entity_info["chunks"] = deduplicated_chunks + + # Step 3: Sort chunks for each entity by occurrence count (higher count = higher priority) + total_entity_chunks = 0 + for entity_info in entities_with_chunks: + sorted_chunks = sorted( + entity_info["chunks"], + key=lambda chunk_id: chunk_occurrence_count.get(chunk_id, 0), + reverse=True, + ) + entity_info["sorted_chunks"] = sorted_chunks + total_entity_chunks += len(sorted_chunks) + + selected_chunk_ids = [] # Initialize to avoid UnboundLocalError + + # Step 4: Apply the selected chunk selection algorithm + # Pick by vector similarity: + # The order of text chunks aligns with the naive retrieval's destination. + # When reranking is disabled, the text chunks delivered to the LLM tend to favor naive retrieval. + if kg_chunk_pick_method == "VECTOR" and query and chunks_vdb: + num_of_chunks = int(max_related_chunks * len(entities_with_chunks) / 2) + + # Get embedding function from global config + actual_embedding_func = text_chunks_db.embedding_func + if not actual_embedding_func: + logger.warning("No embedding function found, falling back to WEIGHT method") + kg_chunk_pick_method = "WEIGHT" + else: + try: + selected_chunk_ids = await pick_by_vector_similarity( + query=query, + text_chunks_storage=text_chunks_db, + chunks_vdb=chunks_vdb, + num_of_chunks=num_of_chunks, + entity_info=entities_with_chunks, + embedding_func=actual_embedding_func, + query_embedding=query_embedding, + ) + + if selected_chunk_ids == []: + kg_chunk_pick_method = "WEIGHT" + logger.warning( + "No entity-related chunks selected by vector similarity, falling back to WEIGHT method" + ) + else: + logger.info( + f"Selecting {len(selected_chunk_ids)} from {total_entity_chunks} entity-related chunks by vector similarity" + ) + + except Exception as e: + logger.error( + f"Error in vector similarity sorting: {e}, falling back to WEIGHT method" + ) + kg_chunk_pick_method = "WEIGHT" + + if kg_chunk_pick_method == "WEIGHT": + # Pick by entity and chunk weight: + # When reranking is disabled, delivered more solely KG related chunks to the LLM + selected_chunk_ids = pick_by_weighted_polling( + entities_with_chunks, max_related_chunks, min_related_chunks=1 + ) + + logger.info( + f"Selecting {len(selected_chunk_ids)} from {total_entity_chunks} entity-related chunks by weighted polling" + ) + + if not selected_chunk_ids: + return [] + + # Step 5: Batch retrieve chunk data + unique_chunk_ids = list( + dict.fromkeys(selected_chunk_ids) + ) # Remove duplicates while preserving order + chunk_data_list = await text_chunks_db.get_by_ids(unique_chunk_ids) + + # Step 6: Build result chunks with valid data and update chunk tracking + result_chunks = [] + for i, (chunk_id, chunk_data) in enumerate(zip(unique_chunk_ids, chunk_data_list)): + if chunk_data is not None and "content" in chunk_data: + chunk_data_copy = chunk_data.copy() + chunk_data_copy["source_type"] = "entity" + chunk_data_copy["chunk_id"] = chunk_id # Add chunk_id for deduplication + result_chunks.append(chunk_data_copy) + + # Update chunk tracking if provided + if chunk_tracking is not None: + chunk_tracking[chunk_id] = { + "source": "E", + "frequency": chunk_occurrence_count.get(chunk_id, 1), + "order": i + 1, # 1-based order in final entity-related results + } + + return result_chunks + + +async def _get_edge_data( + keywords, + knowledge_graph_inst: BaseGraphStorage, + relationships_vdb: BaseVectorStorage, + query_param: QueryParam, +): + logger.info( + f"Query edges: {keywords} (top_k:{query_param.top_k}, cosine:{relationships_vdb.cosine_better_than_threshold})" + ) + + results = await relationships_vdb.query(keywords, top_k=query_param.top_k) + + if not len(results): + return [], [] + + # Prepare edge pairs in two forms: + # For the batch edge properties function, use dicts. + edge_pairs_dicts = [{"src": r["src_id"], "tgt": r["tgt_id"]} for r in results] + edge_data_dict = await knowledge_graph_inst.get_edges_batch(edge_pairs_dicts) + + # Reconstruct edge_datas list in the same order as results. + edge_datas = [] + for k in results: + pair = (k["src_id"], k["tgt_id"]) + edge_props = edge_data_dict.get(pair) + if edge_props is not None: + if "weight" not in edge_props: + logger.warning( + f"Edge {pair} missing 'weight' attribute, using default value 1.0" + ) + edge_props["weight"] = 1.0 + + # Keep edge data without rank, maintain vector search order + combined = { + "src_id": k["src_id"], + "tgt_id": k["tgt_id"], + "created_at": k.get("created_at", None), + **edge_props, + } + edge_datas.append(combined) + + # Relations maintain vector search order (sorted by similarity) + + use_entities = await _find_most_related_entities_from_relationships( + edge_datas, + query_param, + knowledge_graph_inst, + ) + + logger.info( + f"Global query: {len(use_entities)} entites, {len(edge_datas)} relations" + ) + + return edge_datas, use_entities + + +async def _find_most_related_entities_from_relationships( + edge_datas: list[dict], + query_param: QueryParam, + knowledge_graph_inst: BaseGraphStorage, +): + entity_names = [] + seen = set() + + for e in edge_datas: + if e["src_id"] not in seen: + entity_names.append(e["src_id"]) + seen.add(e["src_id"]) + if e["tgt_id"] not in seen: + entity_names.append(e["tgt_id"]) + seen.add(e["tgt_id"]) + + # Only get nodes data, no need for node degrees + nodes_dict = await knowledge_graph_inst.get_nodes_batch(entity_names) + + # Rebuild the list in the same order as entity_names + node_datas = [] + for entity_name in entity_names: + node = nodes_dict.get(entity_name) + if node is None: + logger.warning(f"Node '{entity_name}' not found in batch retrieval.") + continue + # Combine the node data with the entity name, no rank needed + combined = {**node, "entity_name": entity_name} + node_datas.append(combined) + + return node_datas + + +async def _find_related_text_unit_from_relations( + edge_datas: list[dict], + query_param: QueryParam, + text_chunks_db: BaseKVStorage, + entity_chunks: list[dict] = None, + query: str = None, + chunks_vdb: BaseVectorStorage = None, + chunk_tracking: dict = None, + query_embedding=None, +): + """ + Find text chunks related to relationships using configurable chunk selection method. + + This function supports two chunk selection strategies: + 1. WEIGHT: Linear gradient weighted polling based on chunk occurrence count + 2. VECTOR: Vector similarity-based selection using embedding cosine similarity + """ + logger.debug(f"Finding text chunks from {len(edge_datas)} relations") + + if not edge_datas: + return [] + + # Step 1: Collect all text chunks for each relationship + relations_with_chunks = [] + for relation in edge_datas: + if relation.get("source_id"): + chunks = split_string_by_multi_markers( + relation["source_id"], [GRAPH_FIELD_SEP] + ) + if chunks: + # Build relation identifier + if "src_tgt" in relation: + rel_key = tuple(sorted(relation["src_tgt"])) + else: + rel_key = tuple( + sorted([relation.get("src_id"), relation.get("tgt_id")]) + ) + + relations_with_chunks.append( + { + "relation_key": rel_key, + "chunks": chunks, + "relation_data": relation, + } + ) + + if not relations_with_chunks: + logger.warning("No relation-related chunks found") + return [] + + kg_chunk_pick_method = text_chunks_db.global_config.get( + "kg_chunk_pick_method", DEFAULT_KG_CHUNK_PICK_METHOD + ) + max_related_chunks = text_chunks_db.global_config.get( + "related_chunk_number", DEFAULT_RELATED_CHUNK_NUMBER + ) + + # Step 2: Count chunk occurrences and deduplicate (keep chunks from earlier positioned relationships) + # Also remove duplicates with entity_chunks + + # Extract chunk IDs from entity_chunks for deduplication + entity_chunk_ids = set() + if entity_chunks: + for chunk in entity_chunks: + chunk_id = chunk.get("chunk_id") + if chunk_id: + entity_chunk_ids.add(chunk_id) + + chunk_occurrence_count = {} + # Track unique chunk_ids that have been removed to avoid double counting + removed_entity_chunk_ids = set() + + for relation_info in relations_with_chunks: + deduplicated_chunks = [] + for chunk_id in relation_info["chunks"]: + # Skip chunks that already exist in entity_chunks + if chunk_id in entity_chunk_ids: + # Only count each unique chunk_id once + removed_entity_chunk_ids.add(chunk_id) + continue + + chunk_occurrence_count[chunk_id] = ( + chunk_occurrence_count.get(chunk_id, 0) + 1 + ) + + # If this is the first occurrence (count == 1), keep it; otherwise skip (duplicate from later position) + if chunk_occurrence_count[chunk_id] == 1: + deduplicated_chunks.append(chunk_id) + # count > 1 means this chunk appeared in an earlier relationship, so skip it + + # Update relationship's chunks to deduplicated chunks + relation_info["chunks"] = deduplicated_chunks + + # Check if any relations still have chunks after deduplication + relations_with_chunks = [ + relation_info + for relation_info in relations_with_chunks + if relation_info["chunks"] + ] + + if not relations_with_chunks: + logger.info( + f"Find no additional relations-related chunks from {len(edge_datas)} relations" + ) + return [] + + # Step 3: Sort chunks for each relationship by occurrence count (higher count = higher priority) + total_relation_chunks = 0 + for relation_info in relations_with_chunks: + sorted_chunks = sorted( + relation_info["chunks"], + key=lambda chunk_id: chunk_occurrence_count.get(chunk_id, 0), + reverse=True, + ) + relation_info["sorted_chunks"] = sorted_chunks + total_relation_chunks += len(sorted_chunks) + + logger.info( + f"Find {total_relation_chunks} additional chunks in {len(relations_with_chunks)} relations (deduplicated {len(removed_entity_chunk_ids)})" + ) + + # Step 4: Apply the selected chunk selection algorithm + selected_chunk_ids = [] # Initialize to avoid UnboundLocalError + + if kg_chunk_pick_method == "VECTOR" and query and chunks_vdb: + num_of_chunks = int(max_related_chunks * len(relations_with_chunks) / 2) + + # Get embedding function from global config + actual_embedding_func = text_chunks_db.embedding_func + if not actual_embedding_func: + logger.warning("No embedding function found, falling back to WEIGHT method") + kg_chunk_pick_method = "WEIGHT" + else: + try: + selected_chunk_ids = await pick_by_vector_similarity( + query=query, + text_chunks_storage=text_chunks_db, + chunks_vdb=chunks_vdb, + num_of_chunks=num_of_chunks, + entity_info=relations_with_chunks, + embedding_func=actual_embedding_func, + query_embedding=query_embedding, + ) + + if selected_chunk_ids == []: + kg_chunk_pick_method = "WEIGHT" + logger.warning( + "No relation-related chunks selected by vector similarity, falling back to WEIGHT method" + ) + else: + logger.info( + f"Selecting {len(selected_chunk_ids)} from {total_relation_chunks} relation-related chunks by vector similarity" + ) + + except Exception as e: + logger.error( + f"Error in vector similarity sorting: {e}, falling back to WEIGHT method" + ) + kg_chunk_pick_method = "WEIGHT" + + if kg_chunk_pick_method == "WEIGHT": + # Apply linear gradient weighted polling algorithm + selected_chunk_ids = pick_by_weighted_polling( + relations_with_chunks, max_related_chunks, min_related_chunks=1 + ) + + logger.info( + f"Selecting {len(selected_chunk_ids)} from {total_relation_chunks} relation-related chunks by weighted polling" + ) + + logger.debug( + f"KG related chunks: {len(entity_chunks)} from entitys, {len(selected_chunk_ids)} from relations" + ) + + if not selected_chunk_ids: + return [] + + # Step 5: Batch retrieve chunk data + unique_chunk_ids = list( + dict.fromkeys(selected_chunk_ids) + ) # Remove duplicates while preserving order + chunk_data_list = await text_chunks_db.get_by_ids(unique_chunk_ids) + + # Step 6: Build result chunks with valid data and update chunk tracking + result_chunks = [] + for i, (chunk_id, chunk_data) in enumerate(zip(unique_chunk_ids, chunk_data_list)): + if chunk_data is not None and "content" in chunk_data: + chunk_data_copy = chunk_data.copy() + chunk_data_copy["source_type"] = "relationship" + chunk_data_copy["chunk_id"] = chunk_id # Add chunk_id for deduplication + result_chunks.append(chunk_data_copy) + + # Update chunk tracking if provided + if chunk_tracking is not None: + chunk_tracking[chunk_id] = { + "source": "R", + "frequency": chunk_occurrence_count.get(chunk_id, 1), + "order": i + 1, # 1-based order in final relation-related results + } + + return result_chunks + + +@overload +async def naive_query( + query: str, + chunks_vdb: BaseVectorStorage, + query_param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, + system_prompt: str | None = None, + return_raw_data: Literal[True] = True, +) -> dict[str, Any]: ... + + +@overload +async def naive_query( + query: str, + chunks_vdb: BaseVectorStorage, + query_param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, + system_prompt: str | None = None, + return_raw_data: Literal[False] = False, +) -> str | AsyncIterator[str]: ... + + +async def naive_query( + query: str, + chunks_vdb: BaseVectorStorage, + query_param: QueryParam, + global_config: dict[str, str], + hashing_kv: BaseKVStorage | None = None, + system_prompt: str | None = None, +) -> QueryResult | None: + """ + Execute naive query and return unified QueryResult object. + + Args: + query: Query string + chunks_vdb: Document chunks vector database + query_param: Query parameters + global_config: Global configuration + hashing_kv: Cache storage + system_prompt: System prompt + + Returns: + QueryResult | None: Unified query result object containing: + - content: Non-streaming response text content + - response_iterator: Streaming response iterator + - raw_data: Complete structured data (including references and metadata) + - is_streaming: Whether this is a streaming result + + Returns None when no relevant chunks are retrieved. + """ + + if not query: + return QueryResult(content=PROMPTS["fail_response"]) + + if query_param.model_func: + use_model_func = query_param.model_func + else: + use_model_func = global_config["llm_model_func"] + # Apply higher priority (5) to query relation LLM function + use_model_func = partial(use_model_func, _priority=5) + + tokenizer: Tokenizer = global_config["tokenizer"] + if not tokenizer: + logger.error("Tokenizer not found in global configuration.") + return QueryResult(content=PROMPTS["fail_response"]) + + chunks = await _get_vector_context(query, chunks_vdb, query_param, None) + + if chunks is None or len(chunks) == 0: + logger.info( + "[naive_query] No relevant document chunks found; returning no-result." + ) + return None + + # Calculate dynamic token limit for chunks + max_total_tokens = getattr( + query_param, + "max_total_tokens", + global_config.get("max_total_tokens", DEFAULT_MAX_TOTAL_TOKENS), + ) + + # Calculate system prompt template tokens (excluding content_data) + user_prompt = f"\n\n{query_param.user_prompt}" if query_param.user_prompt else "n/a" + response_type = ( + query_param.response_type + if query_param.response_type + else "Multiple Paragraphs" + ) + + # Use the provided system prompt or default + sys_prompt_template = ( + system_prompt if system_prompt else PROMPTS["naive_rag_response"] + ) + + # Create a preliminary system prompt with empty content_data to calculate overhead + pre_sys_prompt = sys_prompt_template.format( + response_type=response_type, + user_prompt=user_prompt, + content_data="", # Empty for overhead calculation + ) + + # Calculate available tokens for chunks + sys_prompt_tokens = len(tokenizer.encode(pre_sys_prompt)) + query_tokens = len(tokenizer.encode(query)) + buffer_tokens = 200 # reserved for reference list and safety buffer + available_chunk_tokens = max_total_tokens - ( + sys_prompt_tokens + query_tokens + buffer_tokens + ) + + logger.debug( + f"Naive query token allocation - Total: {max_total_tokens}, SysPrompt: {sys_prompt_tokens}, Query: {query_tokens}, Buffer: {buffer_tokens}, Available for chunks: {available_chunk_tokens}" + ) + + # Process chunks using unified processing with dynamic token limit + processed_chunks = await process_chunks_unified( + query=query, + unique_chunks=chunks, + query_param=query_param, + global_config=global_config, + source_type="vector", + chunk_token_limit=available_chunk_tokens, # Pass dynamic limit + ) + + # Generate reference list from processed chunks using the new common function + reference_list, processed_chunks_with_ref_ids = generate_reference_list_from_chunks( + processed_chunks + ) + + logger.info(f"Final context: {len(processed_chunks_with_ref_ids)} chunks") + + # Build raw data structure for naive mode using processed chunks with reference IDs + raw_data = convert_to_user_format( + [], # naive mode has no entities + [], # naive mode has no relationships + processed_chunks_with_ref_ids, + reference_list, + "naive", + ) + + # Add complete metadata for naive mode + if "metadata" not in raw_data: + raw_data["metadata"] = {} + raw_data["metadata"]["keywords"] = { + "high_level": [], # naive mode has no keyword extraction + "low_level": [], # naive mode has no keyword extraction + } + raw_data["metadata"]["processing_info"] = { + "total_chunks_found": len(chunks), + "final_chunks_count": len(processed_chunks_with_ref_ids), + } + + # Build chunks_context from processed chunks with reference IDs + chunks_context = [] + for i, chunk in enumerate(processed_chunks_with_ref_ids): + chunks_context.append( + { + "reference_id": chunk["reference_id"], + "content": chunk["content"], + } + ) + + text_units_str = "\n".join( + json.dumps(text_unit, ensure_ascii=False) for text_unit in chunks_context + ) + reference_list_str = "\n".join( + f"[{ref['reference_id']}] {ref['file_path']}" + for ref in reference_list + if ref["reference_id"] + ) + + naive_context_template = PROMPTS["naive_query_context"] + context_content = naive_context_template.format( + text_chunks_str=text_units_str, + reference_list_str=reference_list_str, + ) + + if query_param.only_need_context and not query_param.only_need_prompt: + return QueryResult(content=context_content, raw_data=raw_data) + + sys_prompt = sys_prompt_template.format( + response_type=query_param.response_type, + user_prompt=user_prompt, + content_data=context_content, + ) + + user_query = query + + if query_param.only_need_prompt: + prompt_content = "\n\n".join([sys_prompt, "---User Query---", user_query]) + return QueryResult(content=prompt_content, raw_data=raw_data) + + # Handle cache + args_hash = compute_args_hash( + query_param.mode, + query, + query_param.response_type, + query_param.top_k, + query_param.chunk_top_k, + query_param.max_entity_tokens, + query_param.max_relation_tokens, + query_param.max_total_tokens, + query_param.user_prompt or "", + query_param.enable_rerank, + ) + cached_result = await handle_cache( + hashing_kv, args_hash, user_query, query_param.mode, cache_type="query" + ) + if cached_result is not None: + cached_response, _ = cached_result # Extract content, ignore timestamp + logger.info( + " == LLM cache == Query cache hit, using cached response as query result" + ) + response = cached_response + else: + response = await use_model_func( + user_query, + system_prompt=sys_prompt, + history_messages=query_param.conversation_history, + enable_cot=True, + stream=query_param.stream, + ) + + if hashing_kv and hashing_kv.global_config.get("enable_llm_cache"): + queryparam_dict = { + "mode": query_param.mode, + "response_type": query_param.response_type, + "top_k": query_param.top_k, + "chunk_top_k": query_param.chunk_top_k, + "max_entity_tokens": query_param.max_entity_tokens, + "max_relation_tokens": query_param.max_relation_tokens, + "max_total_tokens": query_param.max_total_tokens, + "user_prompt": query_param.user_prompt or "", + "enable_rerank": query_param.enable_rerank, + } + await save_to_cache( + hashing_kv, + CacheData( + args_hash=args_hash, + content=response, + prompt=query, + mode=query_param.mode, + cache_type="query", + queryparam=queryparam_dict, + ), + ) + + # Return unified result based on actual response type + if isinstance(response, str): + # Non-streaming response (string) + if len(response) > len(sys_prompt): + response = ( + response[len(sys_prompt) :] + .replace(sys_prompt, "") + .replace("user", "") + .replace("model", "") + .replace(query, "") + .replace("", "") + .replace("", "") + .strip() + ) + + return QueryResult(content=response, raw_data=raw_data) + else: + # Streaming response (AsyncIterator) + return QueryResult( + response_iterator=response, raw_data=raw_data, is_streaming=True + ) diff --git a/LightRAG/lightrag/prompt.py b/LightRAG/lightrag/prompt.py new file mode 100644 index 00000000..bf514fe8 --- /dev/null +++ b/LightRAG/lightrag/prompt.py @@ -0,0 +1,421 @@ +from __future__ import annotations +from typing import Any + + +PROMPTS: dict[str, Any] = {} + +# All delimiters must be formatted as "<|UPPER_CASE_STRING|>" +PROMPTS["DEFAULT_TUPLE_DELIMITER"] = "<|#|>" +PROMPTS["DEFAULT_COMPLETION_DELIMITER"] = "<|COMPLETE|>" + +PROMPTS["entity_extraction_system_prompt"] = """---Role--- +You are a Knowledge Graph Specialist responsible for extracting entities and relationships from the input text. + +---Instructions--- +1. **Entity Extraction & Output:** + * **Identification:** Identify clearly defined and meaningful entities in the input text. + * **Entity Details:** For each identified entity, extract the following information: + * `entity_name`: The name of the entity. If the entity name is case-insensitive, capitalize the first letter of each significant word (title case). Ensure **consistent naming** across the entire extraction process. + * `entity_type`: Categorize the entity using one of the following types: `{entity_types}`. If none of the provided entity types apply, do not add new entity type and classify it as `Other`. + * `entity_description`: Provide a concise yet comprehensive description of the entity's attributes and activities, based *solely* on the information present in the input text. + * **Output Format - Entities:** Output a total of 4 fields for each entity, delimited by `{tuple_delimiter}`, on a single line. The first field *must* be the literal string `entity`. + * Format: `entity{tuple_delimiter}entity_name{tuple_delimiter}entity_type{tuple_delimiter}entity_description` + +2. **Relationship Extraction & Output:** + * **Identification:** Identify direct, clearly stated, and meaningful relationships between previously extracted entities. + * **N-ary Relationship Decomposition:** If a single statement describes a relationship involving more than two entities (an N-ary relationship), decompose it into multiple binary (two-entity) relationship pairs for separate description. + * **Example:** For "Alice, Bob, and Carol collaborated on Project X," extract binary relationships such as "Alice collaborated with Project X," "Bob collaborated with Project X," and "Carol collaborated with Project X," or "Alice collaborated with Bob," based on the most reasonable binary interpretations. + * **Relationship Details:** For each binary relationship, extract the following fields: + * `source_entity`: The name of the source entity. Ensure **consistent naming** with entity extraction. Capitalize the first letter of each significant word (title case) if the name is case-insensitive. + * `target_entity`: The name of the target entity. Ensure **consistent naming** with entity extraction. Capitalize the first letter of each significant word (title case) if the name is case-insensitive. + * `relationship_keywords`: One or more high-level keywords summarizing the overarching nature, concepts, or themes of the relationship. Multiple keywords within this field must be separated by a comma `,`. **DO NOT use `{tuple_delimiter}` for separating multiple keywords within this field.** + * `relationship_description`: A concise explanation of the nature of the relationship between the source and target entities, providing a clear rationale for their connection. + * **Output Format - Relationships:** Output a total of 5 fields for each relationship, delimited by `{tuple_delimiter}`, on a single line. The first field *must* be the literal string `relation`. + * Format: `relation{tuple_delimiter}source_entity{tuple_delimiter}target_entity{tuple_delimiter}relationship_keywords{tuple_delimiter}relationship_description` + +3. **Delimiter Usage Protocol:** + * The `{tuple_delimiter}` is a complete, atomic marker and **must not be filled with content**. It serves strictly as a field separator. + * **Incorrect Example:** `entity{tuple_delimiter}Tokyo<|location|>Tokyo is the capital of Japan.` + * **Correct Example:** `entity{tuple_delimiter}Tokyo{tuple_delimiter}location{tuple_delimiter}Tokyo is the capital of Japan.` + +4. **Relationship Direction & Duplication:** + * Treat all relationships as **undirected** unless explicitly stated otherwise. Swapping the source and target entities for an undirected relationship does not constitute a new relationship. + * Avoid outputting duplicate relationships. + +5. **Output Order & Prioritization:** + * Output all extracted entities first, followed by all extracted relationships. + * Within the list of relationships, prioritize and output those relationships that are **most significant** to the core meaning of the input text first. + +6. **Context & Objectivity:** + * Ensure all entity names and descriptions are written in the **third person**. + * Explicitly name the subject or object; **avoid using pronouns** such as `this article`, `this paper`, `our company`, `I`, `you`, and `he/she`. + +7. **Language & Proper Nouns:** + * The entire output (entity names, keywords, and descriptions) must be written in `{language}`. + * Proper nouns (e.g., personal names, place names, organization names) should be retained in their original language if a proper, widely accepted translation is not available or would cause ambiguity. + +8. **Completion Signal:** Output the literal string `{completion_delimiter}` only after all entities and relationships, following all criteria, have been completely extracted and outputted. + +---Examples--- +{examples} + +---Real Data to be Processed--- + +Entity_types: [{entity_types}] +Text: +``` +{input_text} +``` +""" + +PROMPTS["entity_extraction_user_prompt"] = """---Task--- +Extract entities and relationships from the input text to be processed. + +---Instructions--- +1. **Strict Adherence to Format:** Strictly adhere to all format requirements for entity and relationship lists, including output order, field delimiters, and proper noun handling, as specified in the system prompt. +2. **Output Content Only:** Output *only* the extracted list of entities and relationships. Do not include any introductory or concluding remarks, explanations, or additional text before or after the list. +3. **Completion Signal:** Output `{completion_delimiter}` as the final line after all relevant entities and relationships have been extracted and presented. +4. **Output Language:** Ensure the output language is {language}. Proper nouns (e.g., personal names, place names, organization names) must be kept in their original language and not translated. + + +""" + +PROMPTS["entity_continue_extraction_user_prompt"] = """---Task--- +Based on the last extraction task, identify and extract any **missed or incorrectly formatted** entities and relationships from the input text. + +---Instructions--- +1. **Strict Adherence to System Format:** Strictly adhere to all format requirements for entity and relationship lists, including output order, field delimiters, and proper noun handling, as specified in the system instructions. +2. **Focus on Corrections/Additions:** + * **Do NOT** re-output entities and relationships that were **correctly and fully** extracted in the last task. + * If an entity or relationship was **missed** in the last task, extract and output it now according to the system format. + * If an entity or relationship was **truncated, had missing fields, or was otherwise incorrectly formatted** in the last task, re-output the *corrected and complete* version in the specified format. +3. **Output Format - Entities:** Output a total of 4 fields for each entity, delimited by `{tuple_delimiter}`, on a single line. The first field *must* be the literal string `entity`. +4. **Output Format - Relationships:** Output a total of 5 fields for each relationship, delimited by `{tuple_delimiter}`, on a single line. The first field *must* be the literal string `relation`. +5. **Output Content Only:** Output *only* the extracted list of entities and relationships. Do not include any introductory or concluding remarks, explanations, or additional text before or after the list. +6. **Completion Signal:** Output `{completion_delimiter}` as the final line after all relevant missing or corrected entities and relationships have been extracted and presented. +7. **Output Language:** Ensure the output language is {language}. Proper nouns (e.g., personal names, place names, organization names) must be kept in their original language and not translated. + + +""" + +PROMPTS["entity_extraction_examples"] = [ + """ +``` +while Alex clenched his jaw, the buzz of frustration dull against the backdrop of Taylor's authoritarian certainty. It was this competitive undercurrent that kept him alert, the sense that his and Jordan's shared commitment to discovery was an unspoken rebellion against Cruz's narrowing vision of control and order. + +Then Taylor did something unexpected. They paused beside Jordan and, for a moment, observed the device with something akin to reverence. "If this tech can be understood..." Taylor said, their voice quieter, "It could change the game for us. For all of us." + +The underlying dismissal earlier seemed to falter, replaced by a glimpse of reluctant respect for the gravity of what lay in their hands. Jordan looked up, and for a fleeting heartbeat, their eyes locked with Taylor's, a wordless clash of wills softening into an uneasy truce. + +It was a small transformation, barely perceptible, but one that Alex noted with an inward nod. They had all been brought here by different paths +``` + + +entity{tuple_delimiter}Alex{tuple_delimiter}person{tuple_delimiter}Alex is a character who experiences frustration and is observant of the dynamics among other characters. +entity{tuple_delimiter}Taylor{tuple_delimiter}person{tuple_delimiter}Taylor is portrayed with authoritarian certainty and shows a moment of reverence towards a device, indicating a change in perspective. +entity{tuple_delimiter}Jordan{tuple_delimiter}person{tuple_delimiter}Jordan shares a commitment to discovery and has a significant interaction with Taylor regarding a device. +entity{tuple_delimiter}Cruz{tuple_delimiter}person{tuple_delimiter}Cruz is associated with a vision of control and order, influencing the dynamics among other characters. +entity{tuple_delimiter}The Device{tuple_delimiter}equipment{tuple_delimiter}The Device is central to the story, with potential game-changing implications, and is revered by Taylor. +relation{tuple_delimiter}Alex{tuple_delimiter}Taylor{tuple_delimiter}power dynamics, observation{tuple_delimiter}Alex observes Taylor's authoritarian behavior and notes changes in Taylor's attitude toward the device. +relation{tuple_delimiter}Alex{tuple_delimiter}Jordan{tuple_delimiter}shared goals, rebellion{tuple_delimiter}Alex and Jordan share a commitment to discovery, which contrasts with Cruz's vision.) +relation{tuple_delimiter}Taylor{tuple_delimiter}Jordan{tuple_delimiter}conflict resolution, mutual respect{tuple_delimiter}Taylor and Jordan interact directly regarding the device, leading to a moment of mutual respect and an uneasy truce. +relation{tuple_delimiter}Jordan{tuple_delimiter}Cruz{tuple_delimiter}ideological conflict, rebellion{tuple_delimiter}Jordan's commitment to discovery is in rebellion against Cruz's vision of control and order. +relation{tuple_delimiter}Taylor{tuple_delimiter}The Device{tuple_delimiter}reverence, technological significance{tuple_delimiter}Taylor shows reverence towards the device, indicating its importance and potential impact. +{completion_delimiter} + +""", + """ +``` +Stock markets faced a sharp downturn today as tech giants saw significant declines, with the global tech index dropping by 3.4% in midday trading. Analysts attribute the selloff to investor concerns over rising interest rates and regulatory uncertainty. + +Among the hardest hit, nexon technologies saw its stock plummet by 7.8% after reporting lower-than-expected quarterly earnings. In contrast, Omega Energy posted a modest 2.1% gain, driven by rising oil prices. + +Meanwhile, commodity markets reflected a mixed sentiment. Gold futures rose by 1.5%, reaching $2,080 per ounce, as investors sought safe-haven assets. Crude oil prices continued their rally, climbing to $87.60 per barrel, supported by supply constraints and strong demand. + +Financial experts are closely watching the Federal Reserve's next move, as speculation grows over potential rate hikes. The upcoming policy announcement is expected to influence investor confidence and overall market stability. +``` + + +entity{tuple_delimiter}Global Tech Index{tuple_delimiter}category{tuple_delimiter}The Global Tech Index tracks the performance of major technology stocks and experienced a 3.4% decline today. +entity{tuple_delimiter}Nexon Technologies{tuple_delimiter}organization{tuple_delimiter}Nexon Technologies is a tech company that saw its stock decline by 7.8% after disappointing earnings. +entity{tuple_delimiter}Omega Energy{tuple_delimiter}organization{tuple_delimiter}Omega Energy is an energy company that gained 2.1% in stock value due to rising oil prices. +entity{tuple_delimiter}Gold Futures{tuple_delimiter}product{tuple_delimiter}Gold futures rose by 1.5%, indicating increased investor interest in safe-haven assets. +entity{tuple_delimiter}Crude Oil{tuple_delimiter}product{tuple_delimiter}Crude oil prices rose to $87.60 per barrel due to supply constraints and strong demand. +entity{tuple_delimiter}Market Selloff{tuple_delimiter}category{tuple_delimiter}Market selloff refers to the significant decline in stock values due to investor concerns over interest rates and regulations. +entity{tuple_delimiter}Federal Reserve Policy Announcement{tuple_delimiter}category{tuple_delimiter}The Federal Reserve's upcoming policy announcement is expected to impact investor confidence and market stability. +entity{tuple_delimiter}3.4% Decline{tuple_delimiter}category{tuple_delimiter}The Global Tech Index experienced a 3.4% decline in midday trading. +relation{tuple_delimiter}Global Tech Index{tuple_delimiter}Market Selloff{tuple_delimiter}market performance, investor sentiment{tuple_delimiter}The decline in the Global Tech Index is part of the broader market selloff driven by investor concerns. +relation{tuple_delimiter}Nexon Technologies{tuple_delimiter}Global Tech Index{tuple_delimiter}company impact, index movement{tuple_delimiter}Nexon Technologies' stock decline contributed to the overall drop in the Global Tech Index. +relation{tuple_delimiter}Gold Futures{tuple_delimiter}Market Selloff{tuple_delimiter}market reaction, safe-haven investment{tuple_delimiter}Gold prices rose as investors sought safe-haven assets during the market selloff. +relation{tuple_delimiter}Federal Reserve Policy Announcement{tuple_delimiter}Market Selloff{tuple_delimiter}interest rate impact, financial regulation{tuple_delimiter}Speculation over Federal Reserve policy changes contributed to market volatility and investor selloff. +{completion_delimiter} + +""", + """ +``` +At the World Athletics Championship in Tokyo, Noah Carter broke the 100m sprint record using cutting-edge carbon-fiber spikes. +``` + + +entity{tuple_delimiter}World Athletics Championship{tuple_delimiter}event{tuple_delimiter}The World Athletics Championship is a global sports competition featuring top athletes in track and field. +entity{tuple_delimiter}Tokyo{tuple_delimiter}location{tuple_delimiter}Tokyo is the host city of the World Athletics Championship. +entity{tuple_delimiter}Noah Carter{tuple_delimiter}person{tuple_delimiter}Noah Carter is a sprinter who set a new record in the 100m sprint at the World Athletics Championship. +entity{tuple_delimiter}100m Sprint Record{tuple_delimiter}category{tuple_delimiter}The 100m sprint record is a benchmark in athletics, recently broken by Noah Carter. +entity{tuple_delimiter}Carbon-Fiber Spikes{tuple_delimiter}equipment{tuple_delimiter}Carbon-fiber spikes are advanced sprinting shoes that provide enhanced speed and traction. +entity{tuple_delimiter}World Athletics Federation{tuple_delimiter}organization{tuple_delimiter}The World Athletics Federation is the governing body overseeing the World Athletics Championship and record validations. +relation{tuple_delimiter}World Athletics Championship{tuple_delimiter}Tokyo{tuple_delimiter}event location, international competition{tuple_delimiter}The World Athletics Championship is being hosted in Tokyo. +relation{tuple_delimiter}Noah Carter{tuple_delimiter}100m Sprint Record{tuple_delimiter}athlete achievement, record-breaking{tuple_delimiter}Noah Carter set a new 100m sprint record at the championship. +relation{tuple_delimiter}Noah Carter{tuple_delimiter}Carbon-Fiber Spikes{tuple_delimiter}athletic equipment, performance boost{tuple_delimiter}Noah Carter used carbon-fiber spikes to enhance performance during the race. +relation{tuple_delimiter}Noah Carter{tuple_delimiter}World Athletics Championship{tuple_delimiter}athlete participation, competition{tuple_delimiter}Noah Carter is competing at the World Athletics Championship. +{completion_delimiter} + +""", +] + +PROMPTS["summarize_entity_descriptions"] = """---Role--- +You are a Knowledge Graph Specialist, proficient in data curation and synthesis. + +---Task--- +Your task is to synthesize a list of descriptions of a given entity or relation into a single, comprehensive, and cohesive summary. + +---Instructions--- +1. Input Format: The description list is provided in JSON format. Each JSON object (representing a single description) appears on a new line within the `Description List` section. +2. Output Format: The merged description will be returned as plain text, presented in multiple paragraphs, without any additional formatting or extraneous comments before or after the summary. +3. Comprehensiveness: The summary must integrate all key information from *every* provided description. Do not omit any important facts or details. +4. Context: Ensure the summary is written from an objective, third-person perspective; explicitly mention the name of the entity or relation for full clarity and context. +5. Context & Objectivity: + - Write the summary from an objective, third-person perspective. + - Explicitly mention the full name of the entity or relation at the beginning of the summary to ensure immediate clarity and context. +6. Conflict Handling: + - In cases of conflicting or inconsistent descriptions, first determine if these conflicts arise from multiple, distinct entities or relationships that share the same name. + - If distinct entities/relations are identified, summarize each one *separately* within the overall output. + - If conflicts within a single entity/relation (e.g., historical discrepancies) exist, attempt to reconcile them or present both viewpoints with noted uncertainty. +7. Length Constraint:The summary's total length must not exceed {summary_length} tokens, while still maintaining depth and completeness. +8. Language: The entire output must be written in {language}. Proper nouns (e.g., personal names, place names, organization names) may in their original language if proper translation is not available. + - The entire output must be written in {language}. + - Proper nouns (e.g., personal names, place names, organization names) should be retained in their original language if a proper, widely accepted translation is not available or would cause ambiguity. + +---Input--- +{description_type} Name: {description_name} + +Description List: + +``` +{description_list} +``` + +---Output--- +""" + +PROMPTS["fail_response"] = ( + "Sorry, I'm not able to provide an answer to that question.[no-context]" +) + +PROMPTS["rag_response"] = """---Role--- + +You are an expert AI assistant specializing in synthesizing information from a provided knowledge base. Your primary function is to answer user queries accurately by ONLY using the information within the provided **Context**. + +---Goal--- + +Generate a comprehensive, well-structured answer to the user query. +The answer must integrate relevant facts from the Knowledge Graph and Document Chunks found in the **Context**. +Consider the conversation history if provided to maintain conversational flow and avoid repeating information. + +---Instructions--- + +1. Step-by-Step Instruction: + - Carefully determine the user's query intent in the context of the conversation history to fully understand the user's information need. + - Scrutinize both `Knowledge Graph Data` and `Document Chunks` in the **Context**. Identify and extract all pieces of information that are directly relevant to answering the user query. + - Weave the extracted facts into a coherent and logical response. Your own knowledge must ONLY be used to formulate fluent sentences and connect ideas, NOT to introduce any external information. + - Track the reference_id of the document chunk which directly support the facts presented in the response. Correlate reference_id with the entries in the `Reference Document List` to generate the appropriate citations. + - Generate a references section at the end of the response. Each reference document must directly support the facts presented in the response. + - Do not generate anything after the reference section. + +2. Content & Grounding: + - Strictly adhere to the provided context from the **Context**; DO NOT invent, assume, or infer any information not explicitly stated. + - If the answer cannot be found in the **Context**, state that you do not have enough information to answer. Do not attempt to guess. + +3. Formatting & Language: + - The response MUST be in the same language as the user query. + - The response MUST utilize Markdown formatting for enhanced clarity and structure (e.g., headings, bold text, bullet points). + - The response should be presented in {response_type}. + +4. References Section Format: + - The References section should be under heading: `### References` + - Reference list entries should adhere to the format: `* [n] Document Title`. Do not include a caret (`^`) after opening square bracket (`[`). + - The Document Title in the citation must retain its original language. + - Output each citation on an individual line + - Provide maximum of 5 most relevant citations. + - Do not generate footnotes section or any comment, summary, or explanation after the references. + +5. Reference Section Example: +``` +### References + +- [1] Document Title One +- [2] Document Title Two +- [3] Document Title Three +``` + +6. Additional Instructions: {user_prompt} + + +---Context--- + +{context_data} +""" + +PROMPTS["naive_rag_response"] = """---Role--- + +You are an expert AI assistant specializing in synthesizing information from a provided knowledge base. Your primary function is to answer user queries accurately by ONLY using the information within the provided **Context**. + +---Goal--- + +Generate a comprehensive, well-structured answer to the user query. +The answer must integrate relevant facts from the Document Chunks found in the **Context**. +Consider the conversation history if provided to maintain conversational flow and avoid repeating information. + +---Instructions--- + +1. Step-by-Step Instruction: + - Carefully determine the user's query intent in the context of the conversation history to fully understand the user's information need. + - Scrutinize `Document Chunks` in the **Context**. Identify and extract all pieces of information that are directly relevant to answering the user query. + - Weave the extracted facts into a coherent and logical response. Your own knowledge must ONLY be used to formulate fluent sentences and connect ideas, NOT to introduce any external information. + - Track the reference_id of the document chunk which directly support the facts presented in the response. Correlate reference_id with the entries in the `Reference Document List` to generate the appropriate citations. + - Generate a **References** section at the end of the response. Each reference document must directly support the facts presented in the response. + - Do not generate anything after the reference section. + +2. Content & Grounding: + - Strictly adhere to the provided context from the **Context**; DO NOT invent, assume, or infer any information not explicitly stated. + - If the answer cannot be found in the **Context**, state that you do not have enough information to answer. Do not attempt to guess. + +3. Formatting & Language: + - The response MUST be in the same language as the user query. + - The response MUST utilize Markdown formatting for enhanced clarity and structure (e.g., headings, bold text, bullet points). + - The response should be presented in {response_type}. + +4. References Section Format: + - The References section should be under heading: `### References` + - Reference list entries should adhere to the format: `* [n] Document Title`. Do not include a caret (`^`) after opening square bracket (`[`). + - The Document Title in the citation must retain its original language. + - Output each citation on an individual line + - Provide maximum of 5 most relevant citations. + - Do not generate footnotes section or any comment, summary, or explanation after the references. + +5. Reference Section Example: +``` +### References + +- [1] Document Title One +- [2] Document Title Two +- [3] Document Title Three +``` + +6. Additional Instructions: {user_prompt} + + +---Context--- + +{content_data} +""" + +PROMPTS["kg_query_context"] = """ +Knowledge Graph Data (Entity): + +```json +{entities_str} +``` + +Knowledge Graph Data (Relationship): + +```json +{relations_str} +``` + +Document Chunks (Each entry has a reference_id refer to the `Reference Document List`): + +```json +{text_chunks_str} +``` + +Reference Document List (Each entry starts with a [reference_id] that corresponds to entries in the Document Chunks): + +``` +{reference_list_str} +``` + +""" + +PROMPTS["naive_query_context"] = """ +Document Chunks (Each entry has a reference_id refer to the `Reference Document List`): + +```json +{text_chunks_str} +``` + +Reference Document List (Each entry starts with a [reference_id] that corresponds to entries in the Document Chunks): + +``` +{reference_list_str} +``` + +""" + +PROMPTS["keywords_extraction"] = """---Role--- +You are an expert keyword extractor, specializing in analyzing user queries for a Retrieval-Augmented Generation (RAG) system. Your purpose is to identify both high-level and low-level keywords in the user's query that will be used for effective document retrieval. + +---Goal--- +Given a user query, your task is to extract two distinct types of keywords: +1. **high_level_keywords**: for overarching concepts or themes, capturing user's core intent, the subject area, or the type of question being asked. +2. **low_level_keywords**: for specific entities or details, identifying the specific entities, proper nouns, technical jargon, product names, or concrete items. + +---Instructions & Constraints--- +1. **Output Format**: Your output MUST be a valid JSON object and nothing else. Do not include any explanatory text, markdown code fences (like ```json), or any other text before or after the JSON. It will be parsed directly by a JSON parser. +2. **Source of Truth**: All keywords must be explicitly derived from the user query, with both high-level and low-level keyword categories are required to contain content. +3. **Concise & Meaningful**: Keywords should be concise words or meaningful phrases. Prioritize multi-word phrases when they represent a single concept. For example, from "latest financial report of Apple Inc.", you should extract "latest financial report" and "Apple Inc." rather than "latest", "financial", "report", and "Apple". +4. **Handle Edge Cases**: For queries that are too simple, vague, or nonsensical (e.g., "hello", "ok", "asdfghjkl"), you must return a JSON object with empty lists for both keyword types. + +---Examples--- +{examples} + +---Real Data--- +User Query: {query} + +---Output--- +Output:""" + +PROMPTS["keywords_extraction_examples"] = [ + """Example 1: + +Query: "How does international trade influence global economic stability?" + +Output: +{ + "high_level_keywords": ["International trade", "Global economic stability", "Economic impact"], + "low_level_keywords": ["Trade agreements", "Tariffs", "Currency exchange", "Imports", "Exports"] +} + +""", + """Example 2: + +Query: "What are the environmental consequences of deforestation on biodiversity?" + +Output: +{ + "high_level_keywords": ["Environmental consequences", "Deforestation", "Biodiversity loss"], + "low_level_keywords": ["Species extinction", "Habitat destruction", "Carbon emissions", "Rainforest", "Ecosystem"] +} + +""", + """Example 3: + +Query: "What is the role of education in reducing poverty?" + +Output: +{ + "high_level_keywords": ["Education", "Poverty reduction", "Socioeconomic development"], + "low_level_keywords": ["School access", "Literacy rates", "Job training", "Income inequality"] +} + +""", +] diff --git a/LightRAG/lightrag/rerank.py b/LightRAG/lightrag/rerank.py new file mode 100644 index 00000000..35551f5a --- /dev/null +++ b/LightRAG/lightrag/rerank.py @@ -0,0 +1,354 @@ +from __future__ import annotations + +import os +import aiohttp +from typing import Any, List, Dict, Optional +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) +from .utils import logger + +from dotenv import load_dotenv + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + + +@retry( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=4, max=60), + retry=( + retry_if_exception_type(aiohttp.ClientError) + | retry_if_exception_type(aiohttp.ClientResponseError) + ), +) +async def generic_rerank_api( + query: str, + documents: List[str], + model: str, + base_url: str, + api_key: Optional[str], + top_n: Optional[int] = None, + return_documents: Optional[bool] = None, + extra_body: Optional[Dict[str, Any]] = None, + response_format: str = "standard", # "standard" (Jina/Cohere) or "aliyun" + request_format: str = "standard", # "standard" (Jina/Cohere) or "aliyun" +) -> List[Dict[str, Any]]: + """ + Generic rerank API call for Jina/Cohere/Aliyun models. + + Args: + query: The search query + documents: List of strings to rerank + model: Model name to use + base_url: API endpoint URL + api_key: API key for authentication + top_n: Number of top results to return + return_documents: Whether to return document text (Jina only) + extra_body: Additional body parameters + response_format: Response format type ("standard" for Jina/Cohere, "aliyun" for Aliyun) + + Returns: + List of dictionary of ["index": int, "relevance_score": float] + """ + if not base_url: + raise ValueError("Base URL is required") + + headers = {"Content-Type": "application/json"} + if api_key is not None: + headers["Authorization"] = f"Bearer {api_key}" + + # Build request payload based on request format + if request_format == "aliyun": + # Aliyun format: nested input/parameters structure + payload = { + "model": model, + "input": { + "query": query, + "documents": documents, + }, + "parameters": {}, + } + + # Add optional parameters to parameters object + if top_n is not None: + payload["parameters"]["top_n"] = top_n + + if return_documents is not None: + payload["parameters"]["return_documents"] = return_documents + + # Add extra parameters to parameters object + if extra_body: + payload["parameters"].update(extra_body) + else: + # Standard format for Jina/Cohere + payload = { + "model": model, + "query": query, + "documents": documents, + } + + # Add optional parameters + if top_n is not None: + payload["top_n"] = top_n + + # Only Jina API supports return_documents parameter + if return_documents is not None: + payload["return_documents"] = return_documents + + # Add extra parameters + if extra_body: + payload.update(extra_body) + + logger.debug( + f"Rerank request: {len(documents)} documents, model: {model}, format: {response_format}" + ) + + async with aiohttp.ClientSession() as session: + async with session.post(base_url, headers=headers, json=payload) as response: + if response.status != 200: + error_text = await response.text() + content_type = response.headers.get("content-type", "").lower() + is_html_error = ( + error_text.strip().startswith("") + or "text/html" in content_type + ) + if is_html_error: + if response.status == 502: + clean_error = "Bad Gateway (502) - Rerank service temporarily unavailable. Please try again in a few minutes." + elif response.status == 503: + clean_error = "Service Unavailable (503) - Rerank service is temporarily overloaded. Please try again later." + elif response.status == 504: + clean_error = "Gateway Timeout (504) - Rerank service request timed out. Please try again." + else: + clean_error = f"HTTP {response.status} - Rerank service error. Please try again later." + else: + clean_error = error_text + logger.error(f"Rerank API error {response.status}: {clean_error}") + raise aiohttp.ClientResponseError( + request_info=response.request_info, + history=response.history, + status=response.status, + message=f"Rerank API error: {clean_error}", + ) + + response_json = await response.json() + + if response_format == "aliyun": + # Aliyun format: {"output": {"results": [...]}} + results = response_json.get("output", {}).get("results", []) + if not isinstance(results, list): + logger.warning( + f"Expected 'output.results' to be list, got {type(results)}: {results}" + ) + results = [] + + elif response_format == "standard": + # Standard format: {"results": [...]} + results = response_json.get("results", []) + if not isinstance(results, list): + logger.warning( + f"Expected 'results' to be list, got {type(results)}: {results}" + ) + results = [] + else: + raise ValueError(f"Unsupported response format: {response_format}") + if not results: + logger.warning("Rerank API returned empty results") + return [] + + # Standardize return format + return [ + {"index": result["index"], "relevance_score": result["relevance_score"]} + for result in results + ] + + +async def cohere_rerank( + query: str, + documents: List[str], + top_n: Optional[int] = None, + api_key: Optional[str] = None, + model: str = "rerank-v3.5", + base_url: str = "https://api.cohere.com/v2/rerank", + extra_body: Optional[Dict[str, Any]] = None, +) -> List[Dict[str, Any]]: + """ + Rerank documents using Cohere API. + + Args: + query: The search query + documents: List of strings to rerank + top_n: Number of top results to return + api_key: API key + model: rerank model name + base_url: API endpoint + extra_body: Additional body for http request(reserved for extra params) + + Returns: + List of dictionary of ["index": int, "relevance_score": float] + """ + if api_key is None: + api_key = os.getenv("COHERE_API_KEY") or os.getenv("RERANK_BINDING_API_KEY") + + return await generic_rerank_api( + query=query, + documents=documents, + model=model, + base_url=base_url, + api_key=api_key, + top_n=top_n, + return_documents=None, # Cohere doesn't support this parameter + extra_body=extra_body, + response_format="standard", + ) + + +async def jina_rerank( + query: str, + documents: List[str], + top_n: Optional[int] = None, + api_key: Optional[str] = None, + model: str = "jina-reranker-v2-base-multilingual", + base_url: str = "https://api.jina.ai/v1/rerank", + extra_body: Optional[Dict[str, Any]] = None, +) -> List[Dict[str, Any]]: + """ + Rerank documents using Jina AI API. + + Args: + query: The search query + documents: List of strings to rerank + top_n: Number of top results to return + api_key: API key + model: rerank model name + base_url: API endpoint + extra_body: Additional body for http request(reserved for extra params) + + Returns: + List of dictionary of ["index": int, "relevance_score": float] + """ + if api_key is None: + api_key = os.getenv("JINA_API_KEY") or os.getenv("RERANK_BINDING_API_KEY") + + return await generic_rerank_api( + query=query, + documents=documents, + model=model, + base_url=base_url, + api_key=api_key, + top_n=top_n, + return_documents=False, + extra_body=extra_body, + response_format="standard", + ) + + +async def ali_rerank( + query: str, + documents: List[str], + top_n: Optional[int] = None, + api_key: Optional[str] = None, + model: str = "gte-rerank-v2", + base_url: str = "https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank", + extra_body: Optional[Dict[str, Any]] = None, +) -> List[Dict[str, Any]]: + """ + Rerank documents using Aliyun DashScope API. + + Args: + query: The search query + documents: List of strings to rerank + top_n: Number of top results to return + api_key: Aliyun API key + model: rerank model name + base_url: API endpoint + extra_body: Additional body for http request(reserved for extra params) + + Returns: + List of dictionary of ["index": int, "relevance_score": float] + """ + if api_key is None: + api_key = os.getenv("DASHSCOPE_API_KEY") or os.getenv("RERANK_BINDING_API_KEY") + + return await generic_rerank_api( + query=query, + documents=documents, + model=model, + base_url=base_url, + api_key=api_key, + top_n=top_n, + return_documents=False, # Aliyun doesn't need this parameter + extra_body=extra_body, + response_format="aliyun", + request_format="aliyun", + ) + + +"""Please run this test as a module: +python -m lightrag.rerank +""" +if __name__ == "__main__": + import asyncio + + async def main(): + # Example usage - documents should be strings, not dictionaries + docs = [ + "The capital of France is Paris.", + "Tokyo is the capital of Japan.", + "London is the capital of England.", + ] + + query = "What is the capital of France?" + + # Test Jina rerank + try: + print("=== Jina Rerank ===") + result = await jina_rerank( + query=query, + documents=docs, + top_n=2, + ) + print("Results:") + for item in result: + print(f"Index: {item['index']}, Score: {item['relevance_score']:.4f}") + print(f"Document: {docs[item['index']]}") + except Exception as e: + print(f"Jina Error: {e}") + + # Test Cohere rerank + try: + print("\n=== Cohere Rerank ===") + result = await cohere_rerank( + query=query, + documents=docs, + top_n=2, + ) + print("Results:") + for item in result: + print(f"Index: {item['index']}, Score: {item['relevance_score']:.4f}") + print(f"Document: {docs[item['index']]}") + except Exception as e: + print(f"Cohere Error: {e}") + + # Test Aliyun rerank + try: + print("\n=== Aliyun Rerank ===") + result = await ali_rerank( + query=query, + documents=docs, + top_n=2, + ) + print("Results:") + for item in result: + print(f"Index: {item['index']}, Score: {item['relevance_score']:.4f}") + print(f"Document: {docs[item['index']]}") + except Exception as e: + print(f"Aliyun Error: {e}") + + asyncio.run(main()) diff --git a/LightRAG/lightrag/tools/README_CLEAN_LLM_QUERY_CACHE.md b/LightRAG/lightrag/tools/README_CLEAN_LLM_QUERY_CACHE.md new file mode 100644 index 00000000..42514579 --- /dev/null +++ b/LightRAG/lightrag/tools/README_CLEAN_LLM_QUERY_CACHE.md @@ -0,0 +1,661 @@ +# LLM Query Cache Cleanup Tool - User Guide + +## Overview + +This tool cleans up LightRAG's LLM query cache from KV storage implementations. It specifically targets query caches generated during RAG query operations (modes: `mix`, `hybrid`, `local`, `global`), including both query and keywords caches. + +## Supported Storage Types + +1. **JsonKVStorage** - File-based JSON storage +2. **RedisKVStorage** - Redis database storage +3. **PGKVStorage** - PostgreSQL database storage +4. **MongoKVStorage** - MongoDB database storage + +## Cache Types + +The tool cleans up the following query cache types: + +### Query Cache Modes (4 types) +- `mix:*` - Mixed mode query caches +- `hybrid:*` - Hybrid mode query caches +- `local:*` - Local mode query caches +- `global:*` - Global mode query caches + +### Cache Content Types (2 types) +- `*:query:*` - Query result caches +- `*:keywords:*` - Keywords extraction caches + +### Cache Key Format +``` +:: +``` + +Examples: +- `mix:query:5ce04d25e957c290216cee5bfe6344fa` +- `mix:keywords:fee77b98244a0b047ce95e21060de60e` +- `global:query:abc123def456...` +- `local:keywords:789xyz...` + +**Important Note**: This tool does NOT clean extraction caches (`default:extract:*` and `default:summary:*`). Use the migration tool or manual deletion for those caches. + +## Prerequisites + +- The tool reads storage configuration from environment variables or `config.ini` +- Ensure the target storage is properly configured and accessible +- Backup important data before running cleanup operations + +## Usage + +### Basic Usage + +Run from the LightRAG project root directory: + +```bash +python -m lightrag.tools.clean_llm_query_cache +# or +python lightrag/tools/clean_llm_query_cache.py +``` + +### Interactive Workflow + +The tool guides you through the following steps: + +#### 1. Select Storage Type +``` +============================================================ +LLM Query Cache Cleanup Tool - LightRAG +============================================================ + +=== Storage Setup === + +Supported KV Storage Types: +[1] JsonKVStorage +[2] RedisKVStorage +[3] PGKVStorage +[4] MongoKVStorage + +Select storage type (1-4) (Press Enter to exit): 1 +``` + +**Note**: You can press Enter or type `0` at any prompt to exit gracefully. + +#### 2. Storage Validation +The tool will: +- Check required environment variables +- Auto-detect workspace configuration +- Initialize and connect to storage +- Verify connection status + +``` +Checking configuration... +✓ All required environment variables are set + +Initializing storage... +- Storage Type: JsonKVStorage +- Workspace: space1 +- Connection Status: ✓ Success +``` + +#### 3. View Cache Statistics + +The tool displays a detailed breakdown of query caches by mode and type: + +``` +Counting query cache records... + +📊 Query Cache Statistics (Before Cleanup): +┌────────────┬────────────┬────────────┬────────────┐ +│ Mode │ Query │ Keywords │ Total │ +├────────────┼────────────┼────────────┼────────────┤ +│ mix │ 1,234 │ 567 │ 1,801 │ +│ hybrid │ 890 │ 423 │ 1,313 │ +│ local │ 2,345 │ 1,123 │ 3,468 │ +│ global │ 678 │ 345 │ 1,023 │ +├────────────┼────────────┼────────────┼────────────┤ +│ Total │ 5,147 │ 2,458 │ 7,605 │ +└────────────┴────────────┴────────────┴────────────┘ +``` + +#### 4. Select Cleanup Scope + +Choose what type of caches to delete: + +``` +=== Cleanup Options === +[1] Delete all query caches (both query and keywords) +[2] Delete query caches only (keep keywords) +[3] Delete keywords caches only (keep query) +[0] Cancel + +Select cleanup option (0-3): 1 +``` + +**Cleanup Types:** +- **Option 1 (all)**: Deletes both query and keywords caches across all modes +- **Option 2 (query)**: Deletes only query caches, preserves keywords caches +- **Option 3 (keywords)**: Deletes only keywords caches, preserves query caches + +#### 5. Confirm Deletion + +Review the cleanup plan and confirm: + +``` +============================================================ +Cleanup Confirmation +============================================================ +Storage: JsonKVStorage (workspace: space1) +Cleanup Type: all +Records to Delete: 7,605 / 7,605 + +⚠️ WARNING: This will delete ALL query caches across all modes! + +Continue with deletion? (y/n): y +``` + +#### 6. Execute Cleanup + +The tool performs batch deletion with real-time progress: + +**JsonKVStorage Example:** +``` +=== Starting Cleanup === +💡 Processing 1,000 records at a time from JsonKVStorage + +Batch 1/8: ████░░░░░░░░░░░░░░░░ 1,000/7,605 (13.1%) ✓ +Batch 2/8: ████████░░░░░░░░░░░░ 2,000/7,605 (26.3%) ✓ +... +Batch 8/8: ████████████████████ 7,605/7,605 (100.0%) ✓ + +Persisting changes to storage... +✓ Changes persisted successfully +``` + +**RedisKVStorage Example:** +``` +=== Starting Cleanup === +💡 Processing Redis keys in batches of 1,000 + +Batch 1: Deleted 1,000 keys (Total: 1,000) ✓ +Batch 2: Deleted 1,000 keys (Total: 2,000) ✓ +... +``` + +**PostgreSQL Example:** +``` +=== Starting Cleanup === +💡 Executing PostgreSQL DELETE query + +✓ Deleted 7,605 records in 0.45s +``` + +**MongoDB Example:** +``` +=== Starting Cleanup === +💡 Executing MongoDB deleteMany operations + +Pattern 1/8: Deleted 1,234 records ✓ +Pattern 2/8: Deleted 567 records ✓ +... +Total deleted: 7,605 records +``` + +#### 7. Review Cleanup Report + +The tool provides a comprehensive final report: + +**Successful Cleanup:** +``` +============================================================ +Cleanup Complete - Final Report +============================================================ + +📊 Statistics: + Total records to delete: 7,605 + Total batches: 8 + Successful batches: 8 + Failed batches: 0 + Successfully deleted: 7,605 + Failed to delete: 0 + Success rate: 100.00% + +📈 Before/After Comparison: + Total caches before: 7,605 + Total caches after: 0 + Net reduction: 7,605 + +============================================================ +✓ SUCCESS: All records cleaned up successfully! +============================================================ + +📊 Query Cache Statistics (After Cleanup): +┌────────────┬────────────┬────────────┬────────────┐ +│ Mode │ Query │ Keywords │ Total │ +├────────────┼────────────┼────────────┼────────────┤ +│ mix │ 0 │ 0 │ 0 │ +│ hybrid │ 0 │ 0 │ 0 │ +│ local │ 0 │ 0 │ 0 │ +│ global │ 0 │ 0 │ 0 │ +├────────────┼────────────┼────────────┼────────────┤ +│ Total │ 0 │ 0 │ 0 │ +└────────────┴────────────┴────────────┴────────────┘ +``` + +**Cleanup with Errors:** +``` +============================================================ +Cleanup Complete - Final Report +============================================================ + +📊 Statistics: + Total records to delete: 7,605 + Total batches: 8 + Successful batches: 7 + Failed batches: 1 + Successfully deleted: 6,605 + Failed to delete: 1,000 + Success rate: 86.85% + +📈 Before/After Comparison: + Total caches before: 7,605 + Total caches after: 1,000 + Net reduction: 6,605 + +⚠️ Errors encountered: 1 + +Error Details: +------------------------------------------------------------ + +Error Summary: + - ConnectionError: 1 occurrence(s) + +First 5 errors: + + 1. Batch 3 + Type: ConnectionError + Message: Connection timeout after 30s + Records lost: 1,000 + +============================================================ +⚠️ WARNING: Cleanup completed with errors! + Please review the error details above. +============================================================ +``` + +## Technical Details + +### Workspace Handling + +The tool retrieves workspace in the following priority order: + +1. **Storage-specific workspace environment variables** + - PGKVStorage: `POSTGRES_WORKSPACE` + - MongoKVStorage: `MONGODB_WORKSPACE` + - RedisKVStorage: `REDIS_WORKSPACE` + +2. **Generic workspace environment variable** + - `WORKSPACE` + +3. **Default value** + - Empty string (uses storage's default workspace) + +### Batch Deletion + +- Default batch size: 1000 records/batch +- Prevents memory overflow and connection timeouts +- Each batch is processed independently +- Failed batches are logged but don't stop cleanup + +### Storage-Specific Deletion Strategies + +#### JsonKVStorage +- Collects all matching keys first (snapshot approach) +- Deletes in batches with lock protection +- Fast in-memory operations + +#### RedisKVStorage +- Uses SCAN with pattern matching +- Pipeline DELETE for batch operations +- Cursor-based iteration for large datasets + +#### PostgreSQL +- Single DELETE query with OR conditions +- Efficient server-side bulk deletion +- Uses LIKE patterns for mode/type matching + +#### MongoDB +- Multiple deleteMany operations (one per pattern) +- Regex-based document matching +- Returns exact deletion counts + +### Pattern Matching Implementation + +**JsonKVStorage:** +```python +# Direct key prefix matching +if key.startswith("mix:query:") or key.startswith("mix:keywords:") +``` + +**RedisKVStorage:** +```python +# SCAN with namespace-prefixed patterns +pattern = f"{namespace}:mix:query:*" +cursor, keys = await redis.scan(cursor, match=pattern) +``` + +**PostgreSQL:** +```python +# SQL LIKE conditions +WHERE id LIKE 'mix:query:%' OR id LIKE 'mix:keywords:%' +``` + +**MongoDB:** +```python +# Regex queries on _id field +{"_id": {"$regex": "^mix:query:"}} +``` + +## Error Handling & Resilience + +The tool implements comprehensive error tracking: + +### Batch-Level Error Tracking +- Each batch is independently error-checked +- Failed batches are logged with full details +- Successful batches commit even if later batches fail +- Real-time progress shows ✓ (success) or ✗ (failed) + +### Error Reporting +After cleanup completes, a detailed report includes: +- **Statistics**: Total records, success/failure counts, success rate +- **Before/After Comparison**: Net reduction in cache count +- **Error Summary**: Grouped by error type with occurrence counts +- **Error Details**: Batch number, error type, message, and records lost +- **Recommendations**: Clear indication of success or need for review + +### Verification +- Post-cleanup count verification +- Before/after statistics comparison +- Identifies partial cleanup scenarios + +## Important Notes + +1. **Irreversible Operation** + - Deleted caches cannot be recovered + - Always backup important data before cleanup + - Test on non-production data first + +2. **Performance Impact** + - Query performance may degrade temporarily after cleanup + - Caches will rebuild on subsequent queries + - Consider cleanup during off-peak hours + +3. **Selective Cleanup** + - Choose cleanup scope carefully + - Keywords caches may be valuable for future queries + - Query caches rebuild faster than keywords caches + +4. **Workspace Isolation** + - Cleanup only affects the selected workspace + - Other workspaces remain untouched + - Verify workspace before confirming cleanup + +5. **Interrupt and Resume** + - Cleanup can be interrupted at any time (Ctrl+C) + - Already deleted records cannot be recovered + - No automatic resume - must run tool again + +## Storage Configuration + +The tool supports multiple configuration methods with the following priority: + +1. **Environment variables** (highest priority) +2. **config.ini file** (medium priority) +3. **Default values** (lowest priority) + +### Environment Variable Configuration + +Configure storage settings in your `.env` file: + +#### Workspace Configuration (Optional) + +```bash +# Generic workspace (shared by all storages) +WORKSPACE=space1 + +# Or configure independent workspace for specific storage +POSTGRES_WORKSPACE=pg_space +MONGODB_WORKSPACE=mongo_space +REDIS_WORKSPACE=redis_space +``` + +**Workspace Priority**: Storage-specific > Generic WORKSPACE > Empty string + +#### JsonKVStorage + +```bash +WORKING_DIR=./rag_storage +``` + +#### RedisKVStorage + +```bash +REDIS_URI=redis://localhost:6379 +``` + +#### PGKVStorage + +```bash +POSTGRES_HOST=localhost +POSTGRES_PORT=5432 +POSTGRES_USER=your_username +POSTGRES_PASSWORD=your_password +POSTGRES_DATABASE=your_database +``` + +#### MongoKVStorage + +```bash +MONGO_URI=mongodb://root:root@localhost:27017/ +MONGO_DATABASE=LightRAG +``` + +### config.ini Configuration + +Alternatively, create a `config.ini` file in the project root: + +```ini +[redis] +uri = redis://localhost:6379 + +[postgres] +host = localhost +port = 5432 +user = postgres +password = yourpassword +database = lightrag + +[mongodb] +uri = mongodb://root:root@localhost:27017/ +database = LightRAG +``` + +**Note**: Environment variables take precedence over config.ini settings. + +## Troubleshooting + +### Missing Environment Variables +``` +⚠️ Warning: Missing environment variables: POSTGRES_USER, POSTGRES_PASSWORD +``` +**Solution**: Add missing variables to your `.env` file or configure in `config.ini` + +### Connection Failed +``` +✗ Initialization failed: Connection refused +``` +**Solutions**: +- Check if database service is running +- Verify connection parameters (host, port, credentials) +- Check firewall settings +- Ensure network connectivity for remote databases + +### No Caches Found +``` +⚠️ No query caches found in storage +``` +**Possible Reasons**: +- No queries have been run yet +- Caches were already cleaned +- Wrong workspace selected +- Different storage type was used for queries + +### Partial Cleanup +``` +⚠️ WARNING: Cleanup completed with errors! +``` +**Solutions**: +- Check error details in the report +- Verify storage connection stability +- Re-run tool to clean remaining caches +- Check storage capacity and permissions + +## Use Cases + +### Use Case 1: Clean All Query Caches + +**Scenario**: Free up storage space by removing all query caches + +```bash +# Run tool +python -m lightrag.tools.clean_llm_query_cache + +# Select: Storage type -> Option 1 (all) -> Confirm (y) +``` + +**Result**: All query and keywords caches deleted, maximum storage freed + +### Use Case 2: Refresh Query Caches Only + +**Scenario**: Force query cache rebuild while keeping keywords + +```bash +# Run tool +python -m lightrag.tools.clean_llm_query_cache + +# Select: Storage type -> Option 2 (query only) -> Confirm (y) +``` + +**Result**: Query caches deleted, keywords preserved for faster rebuild + +### Use Case 3: Clean Stale Keywords + +**Scenario**: Remove outdated keywords while keeping recent query results + +```bash +# Run tool +python -m lightrag.tools.clean_llm_query_cache + +# Select: Storage type -> Option 3 (keywords only) -> Confirm (y) +``` + +**Result**: Keywords deleted, query caches preserved + +### Use Case 4: Workspace-Specific Cleanup + +**Scenario**: Clean caches for a specific workspace + +```bash +# Configure workspace +export WORKSPACE=development + +# Run tool +python -m lightrag.tools.clean_llm_query_cache + +# Select: Storage type -> Cleanup option -> Confirm (y) +``` + +**Result**: Only development workspace caches cleaned + +## Best Practices + +1. **Backup Before Cleanup** + - Always backup your storage before major cleanup + - Test cleanup on non-production data first + - Document cleanup decisions + +2. **Monitor Performance** + - Watch storage metrics during cleanup + - Monitor query performance after cleanup + - Allow time for cache rebuild + +3. **Scheduled Cleanup** + - Clean caches periodically (weekly/monthly) + - Automate cleanup for development environments + - Keep production cleanup manual for safety + +4. **Selective Deletion** + - Consider cleanup scope based on needs + - Keywords caches are harder to rebuild + - Query caches rebuild automatically + +5. **Storage Capacity** + - Monitor storage usage trends + - Clean caches before reaching capacity limits + - Archive old data if needed + +## Comparison with Migration Tool + +| Feature | Cleanup Tool | Migration Tool | +|---------|-------------|----------------| +| **Purpose** | Delete query caches | Migrate extraction caches | +| **Cache Types** | mix/hybrid/local/global | default:extract/summary | +| **Modes** | query, keywords | extract, summary | +| **Operation** | Deletion | Copy between storages | +| **Reversible** | No | Yes (source unchanged) | +| **Use Case** | Free storage, refresh caches | Change storage backend | + +## Limitations + +1. **Single Storage Operation** + - Can only clean one storage type at a time + - To clean multiple storages, run tool multiple times + +2. **No Dry Run Mode** + - Deletion is immediate after confirmation + - No preview-only mode available + - Test on non-production first + +3. **No Selective Mode Cleanup** + - Cannot clean only specific modes (e.g., only `mix`) + - Cleanup applies to all modes for selected cache type + - All-or-nothing per cache type + +4. **No Scheduled Cleanup** + - Manual execution required + - No built-in scheduling + - Use cron/scheduler if automation needed + +5. **Verification Limitations** + - Post-cleanup verification may fail in error scenarios + - Manual verification recommended for critical operations + +## Future Enhancements + +Potential improvements for future versions: + +- Selective mode cleanup (e.g., clean only `mix` mode) +- Age-based cleanup (delete caches older than X days) +- Size-based cleanup (delete largest caches first) +- Dry run mode for safe preview +- Automated scheduling support +- Cache statistics export +- Incremental cleanup with pause/resume + +## Support + +For issues, questions, or feature requests: +- Check the error details in the cleanup report +- Review storage configuration +- Verify workspace settings +- Test with a small dataset first +- Report bugs through project issue tracker diff --git a/LightRAG/lightrag/tools/README_MIGRATE_LLM_CACHE.md b/LightRAG/lightrag/tools/README_MIGRATE_LLM_CACHE.md new file mode 100644 index 00000000..8dd72984 --- /dev/null +++ b/LightRAG/lightrag/tools/README_MIGRATE_LLM_CACHE.md @@ -0,0 +1,471 @@ +# LLM Cache Migration Tool - User Guide + +## Overview + +This tool migrates LightRAG's LLM response cache between different KV storage implementations. It specifically migrates caches generated during file extraction (mode `default`), including entity extraction and summary caches. + +## Supported Storage Types + +1. **JsonKVStorage** - File-based JSON storage +2. **RedisKVStorage** - Redis database storage +3. **PGKVStorage** - PostgreSQL database storage +4. **MongoKVStorage** - MongoDB database storage + +## Cache Types + +The tool migrates the following cache types: +- `default:extract:*` - Entity and relationship extraction caches +- `default:summary:*` - Entity and relationship summary caches + +**Note**: Query caches (modes like `mix`,`local`, `global`, etc.) are NOT migrated. + +## Prerequisites + +The LLM Cache Migration Tool reads the storage configuration of the LightRAG Server and provides an LLM migration option to select source and destination storage. Ensure that both the source and destination storage have been correctly configured and are accessible via the LightRAG Server before cache migration. + +## Usage + +### Basic Usage + +Run from the LightRAG project root directory: + +```bash +python -m lightrag.tools.migrate_llm_cache +# or +python lightrag/tools/migrate_llm_cache.py +``` + +### Interactive Workflow + +The tool guides you through the following steps: + +#### 1. Select Source Storage Type +``` +Supported KV Storage Types: +[1] JsonKVStorage +[2] RedisKVStorage +[3] PGKVStorage +[4] MongoKVStorage + +Select Source storage type (1-4) (Press Enter to exit): 1 +``` + +**Note**: You can press Enter or type `0` at any storage selection prompt to exit gracefully. + +#### 2. Source Storage Validation +The tool will: +- Check required environment variables +- Auto-detect workspace configuration +- Initialize and connect to storage +- Count cache records available for migration + +``` +Checking environment variables... +✓ All required environment variables are set + +Initializing Source storage... +- Storage Type: JsonKVStorage +- Workspace: space1 +- Connection Status: ✓ Success + +Counting cache records... +- Total: 8,734 records +``` + +**Progress Display by Storage Type:** +- **JsonKVStorage**: Fast in-memory counting, displays final count without incremental progress + ``` + Counting cache records... + - Total: 8,734 records + ``` +- **RedisKVStorage**: Real-time scanning progress with incremental counts + ``` + Scanning Redis keys... found 8,734 records + ``` +- **PostgreSQL**: Quick COUNT(*) query, shows timing only if operation takes >1 second + ``` + Counting PostgreSQL records... (took 2.3s) + ``` +- **MongoDB**: Fast count_documents(), shows timing only if operation takes >1 second + ``` + Counting MongoDB documents... (took 1.8s) + ``` + +#### 3. Select Target Storage Type + +The tool automatically excludes the source storage type from the target selection and renumbers the remaining options sequentially: + +``` +Available Storage Types for Target (source: JsonKVStorage excluded): +[1] RedisKVStorage +[2] PGKVStorage +[3] MongoKVStorage + +Select Target storage type (1-3) (Press Enter or 0 to exit): 1 +``` + +**Important Notes:** +- You **cannot** select the same storage type for both source and target +- Options are automatically renumbered (e.g., [1], [2], [3] instead of [2], [3], [4]) +- You can press Enter or type `0` to exit at this point as well + +The tool then validates the target storage following the same process as the source (checking environment variables, initializing connection, counting records). + +#### 4. Confirm Migration + +``` +================================================== +Migration Confirmation +Source: JsonKVStorage (workspace: space1) - 8,734 records +Target: MongoKVStorage (workspace: space1) - 0 records +Batch Size: 1,000 records/batch +Memory Mode: Streaming (memory-optimized) + +⚠️ Warning: Target storage already has 0 records +Migration will overwrite records with the same keys + +Continue? (y/n): y +``` + +#### 5. Execute Migration + +The tool uses **streaming migration** by default for memory efficiency. Observe migration progress: + +``` +=== Starting Streaming Migration === +💡 Memory-optimized mode: Processing 1,000 records at a time + +Batch 1/9: ████████░░░░░░░░░░░░ 1000/8734 (11.4%) - default:extract ✓ +Batch 2/9: ████████████░░░░░░░░ 2000/8734 (22.9%) - default:extract ✓ +... +Batch 9/9: ████████████████████ 8734/8734 (100.0%) - default:summary ✓ + +Persisting data to disk... +✓ Data persisted successfully +``` + +**Key Features:** +- **Streaming mode**: Processes data in batches without loading entire dataset into memory +- **Real-time progress**: Shows progress bar with precise percentage and cache type +- **Success indicators**: ✓ for successful batches, ✗ for failed batches +- **Constant memory usage**: Handles millions of records efficiently + +#### 6. Review Migration Report + +The tool provides a comprehensive final report showing statistics and any errors encountered: + +**Successful Migration:** +``` +Migration Complete - Final Report + +📊 Statistics: + Total source records: 8,734 + Total batches: 9 + Successful batches: 9 + Failed batches: 0 + Successfully migrated: 8,734 + Failed to migrate: 0 + Success rate: 100.00% + +✓ SUCCESS: All records migrated successfully! +``` + +**Migration with Errors:** +``` +Migration Complete - Final Report + +📊 Statistics: + Total source records: 8,734 + Total batches: 9 + Successful batches: 8 + Failed batches: 1 + Successfully migrated: 7,734 + Failed to migrate: 1,000 + Success rate: 88.55% + +⚠️ Errors encountered: 1 + +Error Details: +------------------------------------------------------------ + +Error Summary: + - ConnectionError: 1 occurrence(s) + +First 5 errors: + + 1. Batch 2 + Type: ConnectionError + Message: Connection timeout after 30s + Records lost: 1,000 + +⚠️ WARNING: Migration completed with errors! + Please review the error details above. +``` + +## Technical Details + +### Workspace Handling + +The tool retrieves workspace in the following priority order: + +1. **Storage-specific workspace environment variables** + - PGKVStorage: `POSTGRES_WORKSPACE` + - MongoKVStorage: `MONGODB_WORKSPACE` + - RedisKVStorage: `REDIS_WORKSPACE` + +2. **Generic workspace environment variable** + - `WORKSPACE` + +3. **Default value** + - Empty string (uses storage's default workspace) + +### Batch Migration + +- Default batch size: 1000 records/batch +- Avoids memory overflow from loading too much data at once +- Each batch is committed independently, supporting resume capability + +### Memory-Efficient Pagination + +For large datasets, the tool implements storage-specific pagination strategies: + +- **JsonKVStorage**: Direct in-memory access (data already loaded in shared storage) +- **RedisKVStorage**: Cursor-based SCAN with pipeline batching (1000 keys/batch) +- **PGKVStorage**: SQL LIMIT/OFFSET pagination (1000 records/batch) +- **MongoKVStorage**: Cursor streaming with batch_size (1000 documents/batch) + +This ensures the tool can handle millions of cache records without memory issues. + +### Prefix Filtering Implementation + +The tool uses optimized filtering methods for different storage types: + +- **JsonKVStorage**: Direct dictionary iteration with lock protection +- **RedisKVStorage**: SCAN command with namespace-prefixed patterns + pipeline for bulk GET +- **PGKVStorage**: SQL LIKE queries with proper field mapping (id, return_value, etc.) +- **MongoKVStorage**: MongoDB regex queries on `_id` field with cursor streaming + +## Error Handling & Resilience + +The tool implements comprehensive error tracking to ensure transparent and resilient migrations: + +### Batch-Level Error Tracking +- Each batch is independently error-checked +- Failed batches are logged but don't stop the migration +- Successful batches are committed even if later batches fail +- Real-time progress shows ✓ (success) or ✗ (failed) for each batch + +### Error Reporting +After migration completes, a detailed report includes: +- **Statistics**: Total records, success/failure counts, success rate +- **Error Summary**: Grouped by error type with occurrence counts +- **Error Details**: Batch number, error type, message, and records lost +- **Recommendations**: Clear indication of success or need for review + +### No Double Data Loading +- Unlike traditional verification approaches, the tool does NOT reload all target data +- Errors are detected during migration, not after +- This eliminates memory overhead and handles pre-existing target data correctly + +## Important Notes + +1. **Data Overwrite Warning** + - Migration will overwrite records with the same keys in the target storage + - Tool displays a warning if target storage already has data + - Data migration can be performed repeatedly + - Pre-existing data in target storage is handled correctly +3. **Interrupt and Resume** + - Migration can be interrupted at any time (Ctrl+C) + - Already migrated data will remain in target storage + - Re-running will overwrite existing records + - Failed batches can be manually retried +4. **Performance Considerations** + - Large data migration may take considerable time + - Recommend migrating during off-peak hours + - Ensure stable network connection (for remote databases) + - Memory usage stays constant regardless of dataset size + +## Storage Configuration + +The tool supports multiple configuration methods with the following priority: + +1. **Environment variables** (highest priority) +2. **config.ini file** (medium priority) +3. **Default values** (lowest priority) + +#### Option A: Environment Variable Configuration + +Configure storage settings in your `.env` file: + +#### Workspace Configuration (Optional) + +```bash +# Generic workspace (shared by all storages) +WORKSPACE=space1 + +# Or configure independent workspace for specific storage +POSTGRES_WORKSPACE=pg_space +MONGODB_WORKSPACE=mongo_space +REDIS_WORKSPACE=redis_space +``` + +**Workspace Priority**: Storage-specific > Generic WORKSPACE > Empty string + +#### JsonKVStorage + +```bash +WORKING_DIR=./rag_storage +``` + +#### RedisKVStorage + +```bash +REDIS_URI=redis://localhost:6379 +``` + +#### PGKVStorage + +```bash +POSTGRES_HOST=localhost +POSTGRES_PORT=5432 +POSTGRES_USER=your_username +POSTGRES_PASSWORD=your_password +POSTGRES_DATABASE=your_database +``` + +#### MongoKVStorage + +```bash +MONGO_URI=mongodb://root:root@localhost:27017/ +MONGO_DATABASE=LightRAG +``` + +#### Option B: config.ini Configuration + +Alternatively, create a `config.ini` file in the project root: + +```ini +[redis] +uri = redis://localhost:6379 + +[postgres] +host = localhost +port = 5432 +user = postgres +password = yourpassword +database = lightrag + +[mongodb] +uri = mongodb://root:root@localhost:27017/ +database = LightRAG +``` + +**Note**: Environment variables take precedence over config.ini settings. JsonKVStorage uses `WORKING_DIR` environment variable or defaults to `./rag_storage`. + +## Troubleshooting + +### Missing Environment Variables +``` +✗ Missing required environment variables: POSTGRES_USER, POSTGRES_PASSWORD +``` +**Solution**: Add missing variables to your `.env` file + +### Connection Failed +``` +✗ Initialization failed: Connection refused +``` +**Solutions**: +- Check if database service is running +- Verify connection parameters (host, port, credentials) +- Check firewall settings + +**Solutions**: +- Check migration process for error logs +- Re-run migration tool +- Check target storage capacity and permissions + +## Example Scenarios + +### Scenario 1: JSON to MongoDB Migration + +Use case: Migrating from single-machine development to production + +```bash +# 1. Configure environment variables +WORKSPACE=production +MONGO_URI=mongodb://user:pass@prod-server:27017/ +MONGO_DATABASE=LightRAG + +# 2. Run tool +python -m lightrag.tools.migrate_llm_cache + +# 3. Select: 1 (JsonKVStorage) -> 1 (MongoKVStorage - renumbered from 4) +``` + +**Note**: After selecting JsonKVStorage as source, MongoKVStorage will be shown as option [1] in the target selection since options are renumbered after excluding the source. + +### Scenario 2: Redis to PostgreSQL + +Use case: Migrating from cache storage to relational database + +```bash +# 1. Ensure both databases are accessible +REDIS_URI=redis://old-redis:6379 +POSTGRES_HOST=new-postgres-server +# ... Other PostgreSQL configs + +# 2. Run tool +python -m lightrag.tools.migrate_llm_cache + +# 3. Select: 2 (RedisKVStorage) -> 2 (PGKVStorage - renumbered from 3) +``` + +**Note**: After selecting RedisKVStorage as source, PGKVStorage will be shown as option [2] in the target selection. + +### Scenario 3: Different Workspaces Migration + +Use case: Migrating data between different workspace environments + +```bash +# Configure separate workspaces for source and target +POSTGRES_WORKSPACE=dev_workspace # For development environment +MONGODB_WORKSPACE=prod_workspace # For production environment + +# Run tool +python -m lightrag.tools.migrate_llm_cache + +# Select: 3 (PGKVStorage with dev_workspace) -> 3 (MongoKVStorage with prod_workspace) +``` + +**Note**: This allows you to migrate between different logical data partitions while changing storage backends. + +## Tool Limitations + +1. **Same Storage Type Not Allowed** + - You cannot migrate between the same storage type (e.g., PostgreSQL to PostgreSQL) + - This is enforced by the tool automatically excluding the source storage type from target selection + - For same-storage migrations (e.g., database switches), use database-native tools instead +2. **Only Default Mode Caches** + - Only migrates `default:extract:*` and `default:summary:*` + - Query caches are not included +4. **Network Dependency** + - Tool requires stable network connection for remote databases + - Large datasets may fail if connection is interrupted + +## Best Practices + +1. **Backup Before Migration** + - Always backup your data before migration + - Test migration on non-production data first + +2. **Verify Results** + - Check the verification output after migration + - Manually verify a few cache entries if needed + +3. **Monitor Performance** + - Watch database resource usage during migration + - Consider migrating in smaller batches if needed + +4. **Clean Old Data** + - After successful migration, consider cleaning old cache data + - Keep backups for a reasonable period before deletion diff --git a/LightRAG/lightrag/tools/__init__.py b/LightRAG/lightrag/tools/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LightRAG/lightrag/tools/check_initialization.py b/LightRAG/lightrag/tools/check_initialization.py new file mode 100644 index 00000000..6bcb17e3 --- /dev/null +++ b/LightRAG/lightrag/tools/check_initialization.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +""" +Diagnostic tool to check LightRAG initialization status. + +This tool helps developers verify that their LightRAG instance is properly +initialized before use, preventing common initialization errors. + +Usage: + python -m lightrag.tools.check_initialization +""" + +import asyncio +import sys +from pathlib import Path + +# Add parent directory to path for imports +sys.path.insert(0, str(Path(__file__).parent.parent.parent)) + +from lightrag import LightRAG +from lightrag.base import StoragesStatus + + +async def check_lightrag_setup(rag_instance: LightRAG, verbose: bool = False) -> bool: + """ + Check if a LightRAG instance is properly initialized. + + Args: + rag_instance: The LightRAG instance to check + verbose: If True, print detailed diagnostic information + + Returns: + True if properly initialized, False otherwise + """ + issues = [] + warnings = [] + + print("🔍 Checking LightRAG initialization status...\n") + + # Check storage initialization status + if not hasattr(rag_instance, "_storages_status"): + issues.append("LightRAG instance missing _storages_status attribute") + elif rag_instance._storages_status != StoragesStatus.INITIALIZED: + issues.append( + f"Storages not initialized (status: {rag_instance._storages_status.name})" + ) + else: + print("✅ Storage status: INITIALIZED") + + # Check individual storage components + storage_components = [ + ("full_docs", "Document storage"), + ("text_chunks", "Text chunks storage"), + ("entities_vdb", "Entity vector database"), + ("relationships_vdb", "Relationship vector database"), + ("chunks_vdb", "Chunks vector database"), + ("doc_status", "Document status tracker"), + ("llm_response_cache", "LLM response cache"), + ("full_entities", "Entity storage"), + ("full_relations", "Relation storage"), + ("chunk_entity_relation_graph", "Graph storage"), + ] + + if verbose: + print("\n📦 Storage Components:") + + for component, description in storage_components: + if not hasattr(rag_instance, component): + issues.append(f"Missing storage component: {component} ({description})") + else: + storage = getattr(rag_instance, component) + if storage is None: + warnings.append(f"Storage {component} is None (might be optional)") + elif hasattr(storage, "_storage_lock"): + if storage._storage_lock is None: + issues.append(f"Storage {component} not initialized (lock is None)") + elif verbose: + print(f" ✅ {description}: Ready") + elif verbose: + print(f" ✅ {description}: Ready") + + # Check pipeline status + try: + from lightrag.kg.shared_storage import get_namespace_data + + get_namespace_data("pipeline_status") + print("✅ Pipeline status: INITIALIZED") + except KeyError: + issues.append( + "Pipeline status not initialized - call initialize_pipeline_status()" + ) + except Exception as e: + issues.append(f"Error checking pipeline status: {str(e)}") + + # Print results + print("\n" + "=" * 50) + + if issues: + print("❌ Issues found:\n") + for issue in issues: + print(f" • {issue}") + + print("\n📝 To fix, run this initialization sequence:\n") + print(" await rag.initialize_storages()") + print(" from lightrag.kg.shared_storage import initialize_pipeline_status") + print(" await initialize_pipeline_status()") + print( + "\n📚 Documentation: https://github.com/HKUDS/LightRAG#important-initialization-requirements" + ) + + if warnings and verbose: + print("\n⚠️ Warnings (might be normal):") + for warning in warnings: + print(f" • {warning}") + + return False + else: + print("✅ LightRAG is properly initialized and ready to use!") + + if warnings and verbose: + print("\n⚠️ Warnings (might be normal):") + for warning in warnings: + print(f" • {warning}") + + return True + + +async def demo(): + """Demonstrate the diagnostic tool with a test instance.""" + from lightrag.llm.openai import openai_embed, gpt_4o_mini_complete + from lightrag.kg.shared_storage import initialize_pipeline_status + + print("=" * 50) + print("LightRAG Initialization Diagnostic Tool") + print("=" * 50) + + # Create test instance + rag = LightRAG( + working_dir="./test_diagnostic", + embedding_func=openai_embed, + llm_model_func=gpt_4o_mini_complete, + ) + + print("\n🔴 BEFORE initialization:\n") + await check_lightrag_setup(rag, verbose=True) + + print("\n" + "=" * 50) + print("\n🔄 Initializing...\n") + await rag.initialize_storages() + await initialize_pipeline_status() + + print("\n🟢 AFTER initialization:\n") + await check_lightrag_setup(rag, verbose=True) + + # Cleanup + import shutil + + shutil.rmtree("./test_diagnostic", ignore_errors=True) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description="Check LightRAG initialization status") + parser.add_argument( + "--demo", action="store_true", help="Run a demonstration with a test instance" + ) + parser.add_argument( + "--verbose", + "-v", + action="store_true", + help="Show detailed diagnostic information", + ) + + args = parser.parse_args() + + if args.demo: + asyncio.run(demo()) + else: + print("Run with --demo to see the diagnostic tool in action") + print("Or import this module and use check_lightrag_setup() with your instance") diff --git a/LightRAG/lightrag/tools/clean_llm_query_cache.py b/LightRAG/lightrag/tools/clean_llm_query_cache.py new file mode 100644 index 00000000..eca658c7 --- /dev/null +++ b/LightRAG/lightrag/tools/clean_llm_query_cache.py @@ -0,0 +1,1137 @@ +#!/usr/bin/env python3 +""" +LLM Query Cache Cleanup Tool for LightRAG + +This tool cleans up LLM query cache (mix:*, hybrid:*, local:*, global:*) +from KV storage implementations while preserving workspace isolation. + +Usage: + python -m lightrag.tools.clean_llm_query_cache + # or + python lightrag/tools/clean_llm_query_cache.py + +Supported KV Storage Types: + - JsonKVStorage + - RedisKVStorage + - PGKVStorage + - MongoKVStorage +""" + +import asyncio +import os +import sys +import time +from typing import Any, Dict, List +from dataclasses import dataclass, field +from dotenv import load_dotenv + +# Add project root to path for imports +sys.path.insert( + 0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +) + +from lightrag.kg import STORAGE_ENV_REQUIREMENTS +from lightrag.kg.shared_storage import set_all_update_flags +from lightrag.namespace import NameSpace +from lightrag.utils import setup_logger + +# Load environment variables +load_dotenv(dotenv_path=".env", override=False) + +# Setup logger +setup_logger("lightrag", level="INFO") + +# Storage type configurations +STORAGE_TYPES = { + "1": "JsonKVStorage", + "2": "RedisKVStorage", + "3": "PGKVStorage", + "4": "MongoKVStorage", +} + +# Workspace environment variable mapping +WORKSPACE_ENV_MAP = { + "PGKVStorage": "POSTGRES_WORKSPACE", + "MongoKVStorage": "MONGODB_WORKSPACE", + "RedisKVStorage": "REDIS_WORKSPACE", +} + +# Query cache modes +QUERY_MODES = ["mix", "hybrid", "local", "global"] + +# Query cache types +CACHE_TYPES = ["query", "keywords"] + +# Default batch size for deletion +DEFAULT_BATCH_SIZE = 1000 + +# ANSI color codes for terminal output +BOLD_CYAN = "\033[1;36m" +BOLD_RED = "\033[1;31m" +BOLD_GREEN = "\033[1;32m" +RESET = "\033[0m" + + +@dataclass +class CleanupStats: + """Cleanup statistics and error tracking""" + + # Count by mode and cache_type before cleanup + counts_before: Dict[str, Dict[str, int]] = field(default_factory=dict) + + # Deletion statistics + total_to_delete: int = 0 + total_batches: int = 0 + successful_batches: int = 0 + failed_batches: int = 0 + successfully_deleted: int = 0 + failed_to_delete: int = 0 + + # Count by mode and cache_type after cleanup + counts_after: Dict[str, Dict[str, int]] = field(default_factory=dict) + + # Error tracking + errors: List[Dict[str, Any]] = field(default_factory=list) + + def add_error(self, batch_idx: int, error: Exception, batch_size: int): + """Record batch error""" + self.errors.append( + { + "batch": batch_idx, + "error_type": type(error).__name__, + "error_msg": str(error), + "records_lost": batch_size, + "timestamp": time.time(), + } + ) + self.failed_batches += 1 + self.failed_to_delete += batch_size + + def initialize_counts(self): + """Initialize count dictionaries""" + for mode in QUERY_MODES: + self.counts_before[mode] = {"query": 0, "keywords": 0} + self.counts_after[mode] = {"query": 0, "keywords": 0} + + +class CleanupTool: + """LLM Query Cache Cleanup Tool""" + + def __init__(self): + self.storage = None + self.workspace = "" + self.batch_size = DEFAULT_BATCH_SIZE + + def get_workspace_for_storage(self, storage_name: str) -> str: + """Get workspace for a specific storage type + + Priority: Storage-specific env var > WORKSPACE env var > empty string + + Args: + storage_name: Storage implementation name + + Returns: + Workspace name + """ + # Check storage-specific workspace + if storage_name in WORKSPACE_ENV_MAP: + specific_workspace = os.getenv(WORKSPACE_ENV_MAP[storage_name]) + if specific_workspace: + return specific_workspace + + # Check generic WORKSPACE + workspace = os.getenv("WORKSPACE", "") + return workspace + + def check_config_ini_for_storage(self, storage_name: str) -> bool: + """Check if config.ini has configuration for the storage type + + Args: + storage_name: Storage implementation name + + Returns: + True if config.ini has the necessary configuration + """ + try: + import configparser + + config = configparser.ConfigParser() + config.read("config.ini", "utf-8") + + if storage_name == "RedisKVStorage": + return config.has_option("redis", "uri") + elif storage_name == "PGKVStorage": + return ( + config.has_option("postgres", "user") + and config.has_option("postgres", "password") + and config.has_option("postgres", "database") + ) + elif storage_name == "MongoKVStorage": + return config.has_option("mongodb", "uri") and config.has_option( + "mongodb", "database" + ) + + return False + except Exception: + return False + + def check_env_vars(self, storage_name: str) -> bool: + """Check environment variables, show warnings if missing but don't fail + + Args: + storage_name: Storage implementation name + + Returns: + Always returns True (warnings only, no hard failure) + """ + required_vars = STORAGE_ENV_REQUIREMENTS.get(storage_name, []) + + if not required_vars: + print("✓ No environment variables required") + return True + + missing_vars = [var for var in required_vars if var not in os.environ] + + if missing_vars: + print( + f"⚠️ Warning: Missing environment variables: {', '.join(missing_vars)}" + ) + + # Check if config.ini has configuration + has_config = self.check_config_ini_for_storage(storage_name) + if has_config: + print(" ✓ Found configuration in config.ini") + else: + print(f" Will attempt to use defaults for {storage_name}") + + return True + + print("✓ All required environment variables are set") + return True + + def get_storage_class(self, storage_name: str): + """Dynamically import and return storage class + + Args: + storage_name: Storage implementation name + + Returns: + Storage class + """ + if storage_name == "JsonKVStorage": + from lightrag.kg.json_kv_impl import JsonKVStorage + + return JsonKVStorage + elif storage_name == "RedisKVStorage": + from lightrag.kg.redis_impl import RedisKVStorage + + return RedisKVStorage + elif storage_name == "PGKVStorage": + from lightrag.kg.postgres_impl import PGKVStorage + + return PGKVStorage + elif storage_name == "MongoKVStorage": + from lightrag.kg.mongo_impl import MongoKVStorage + + return MongoKVStorage + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def initialize_storage(self, storage_name: str, workspace: str): + """Initialize storage instance with fallback to config.ini and defaults + + Args: + storage_name: Storage implementation name + workspace: Workspace name + + Returns: + Initialized storage instance + + Raises: + Exception: If initialization fails + """ + storage_class = self.get_storage_class(storage_name) + + # Create global config + global_config = { + "working_dir": os.getenv("WORKING_DIR", "./rag_storage"), + "embedding_batch_num": 10, + } + + # Initialize storage + storage = storage_class( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + workspace=workspace, + global_config=global_config, + embedding_func=None, + ) + + # Initialize the storage (may raise exception if connection fails) + await storage.initialize() + + return storage + + async def count_query_caches_json(self, storage) -> Dict[str, Dict[str, int]]: + """Count query caches in JsonKVStorage by mode and cache_type + + Args: + storage: JsonKVStorage instance + + Returns: + Dictionary with counts for each mode and cache_type + """ + counts = {mode: {"query": 0, "keywords": 0} for mode in QUERY_MODES} + + async with storage._storage_lock: + for key in storage._data.keys(): + for mode in QUERY_MODES: + if key.startswith(f"{mode}:query:"): + counts[mode]["query"] += 1 + elif key.startswith(f"{mode}:keywords:"): + counts[mode]["keywords"] += 1 + + return counts + + async def count_query_caches_redis(self, storage) -> Dict[str, Dict[str, int]]: + """Count query caches in RedisKVStorage by mode and cache_type + + Args: + storage: RedisKVStorage instance + + Returns: + Dictionary with counts for each mode and cache_type + """ + counts = {mode: {"query": 0, "keywords": 0} for mode in QUERY_MODES} + + print("Scanning Redis keys...", end="", flush=True) + + async with storage._get_redis_connection() as redis: + for mode in QUERY_MODES: + for cache_type in CACHE_TYPES: + pattern = f"{mode}:{cache_type}:*" + prefixed_pattern = f"{storage.final_namespace}:{pattern}" + cursor = 0 + + while True: + cursor, keys = await redis.scan( + cursor, match=prefixed_pattern, count=DEFAULT_BATCH_SIZE + ) + counts[mode][cache_type] += len(keys) + + if cursor == 0: + break + + print() # New line after progress + return counts + + async def count_query_caches_pg(self, storage) -> Dict[str, Dict[str, int]]: + """Count query caches in PostgreSQL by mode and cache_type + + Args: + storage: PGKVStorage instance + + Returns: + Dictionary with counts for each mode and cache_type + """ + from lightrag.kg.postgres_impl import namespace_to_table_name + + counts = {mode: {"query": 0, "keywords": 0} for mode in QUERY_MODES} + table_name = namespace_to_table_name(storage.namespace) + + print("Counting PostgreSQL records...", end="", flush=True) + start_time = time.time() + + for mode in QUERY_MODES: + for cache_type in CACHE_TYPES: + query = f""" + SELECT COUNT(*) as count + FROM {table_name} + WHERE workspace = $1 + AND id LIKE $2 + """ + pattern = f"{mode}:{cache_type}:%" + result = await storage.db.query(query, [storage.workspace, pattern]) + counts[mode][cache_type] = result["count"] if result else 0 + + elapsed = time.time() - start_time + if elapsed > 1: + print(f" (took {elapsed:.1f}s)", end="") + print() # New line + + return counts + + async def count_query_caches_mongo(self, storage) -> Dict[str, Dict[str, int]]: + """Count query caches in MongoDB by mode and cache_type + + Args: + storage: MongoKVStorage instance + + Returns: + Dictionary with counts for each mode and cache_type + """ + counts = {mode: {"query": 0, "keywords": 0} for mode in QUERY_MODES} + + print("Counting MongoDB documents...", end="", flush=True) + start_time = time.time() + + for mode in QUERY_MODES: + for cache_type in CACHE_TYPES: + pattern = f"^{mode}:{cache_type}:" + query = {"_id": {"$regex": pattern}} + count = await storage._data.count_documents(query) + counts[mode][cache_type] = count + + elapsed = time.time() - start_time + if elapsed > 1: + print(f" (took {elapsed:.1f}s)", end="") + print() # New line + + return counts + + async def count_query_caches( + self, storage, storage_name: str + ) -> Dict[str, Dict[str, int]]: + """Count query caches from any storage type efficiently + + Args: + storage: Storage instance + storage_name: Storage type name + + Returns: + Dictionary with counts for each mode and cache_type + """ + if storage_name == "JsonKVStorage": + return await self.count_query_caches_json(storage) + elif storage_name == "RedisKVStorage": + return await self.count_query_caches_redis(storage) + elif storage_name == "PGKVStorage": + return await self.count_query_caches_pg(storage) + elif storage_name == "MongoKVStorage": + return await self.count_query_caches_mongo(storage) + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def delete_query_caches_json( + self, storage, cleanup_type: str, stats: CleanupStats + ): + """Delete query caches from JsonKVStorage + + Args: + storage: JsonKVStorage instance + cleanup_type: 'all', 'query', or 'keywords' + stats: CleanupStats object to track progress + """ + # Collect keys to delete + async with storage._storage_lock: + keys_to_delete = [] + for key in storage._data.keys(): + should_delete = False + for mode in QUERY_MODES: + if cleanup_type == "all": + if key.startswith(f"{mode}:query:") or key.startswith( + f"{mode}:keywords:" + ): + should_delete = True + elif cleanup_type == "query": + if key.startswith(f"{mode}:query:"): + should_delete = True + elif cleanup_type == "keywords": + if key.startswith(f"{mode}:keywords:"): + should_delete = True + + if should_delete: + keys_to_delete.append(key) + + # Delete in batches + total_keys = len(keys_to_delete) + stats.total_batches = (total_keys + self.batch_size - 1) // self.batch_size + + print("\n=== Starting Cleanup ===") + print( + f"💡 Processing {self.batch_size:,} records at a time from JsonKVStorage\n" + ) + + for batch_idx in range(stats.total_batches): + start_idx = batch_idx * self.batch_size + end_idx = min((batch_idx + 1) * self.batch_size, total_keys) + batch_keys = keys_to_delete[start_idx:end_idx] + + try: + async with storage._storage_lock: + for key in batch_keys: + del storage._data[key] + + # CRITICAL: Set update flag so changes persist to disk + # Without this, deletions remain in-memory only and are lost on exit + await set_all_update_flags(storage.final_namespace) + + # Success + stats.successful_batches += 1 + stats.successfully_deleted += len(batch_keys) + + # Calculate progress + progress = (stats.successfully_deleted / total_keys) * 100 + bar_length = 20 + filled_length = int( + bar_length * stats.successfully_deleted // total_keys + ) + bar = "█" * filled_length + "░" * (bar_length - filled_length) + + print( + f"Batch {batch_idx + 1}/{stats.total_batches}: {bar} " + f"{stats.successfully_deleted:,}/{total_keys:,} ({progress:.1f}%) ✓" + ) + + except Exception as e: + stats.add_error(batch_idx + 1, e, len(batch_keys)) + print( + f"Batch {batch_idx + 1}/{stats.total_batches}: ✗ FAILED - " + f"{type(e).__name__}: {str(e)}" + ) + + async def delete_query_caches_redis( + self, storage, cleanup_type: str, stats: CleanupStats + ): + """Delete query caches from RedisKVStorage + + Args: + storage: RedisKVStorage instance + cleanup_type: 'all', 'query', or 'keywords' + stats: CleanupStats object to track progress + """ + # Build patterns to delete + patterns = [] + for mode in QUERY_MODES: + if cleanup_type == "all": + patterns.append(f"{mode}:query:*") + patterns.append(f"{mode}:keywords:*") + elif cleanup_type == "query": + patterns.append(f"{mode}:query:*") + elif cleanup_type == "keywords": + patterns.append(f"{mode}:keywords:*") + + print("\n=== Starting Cleanup ===") + print(f"💡 Processing Redis keys in batches of {self.batch_size:,}\n") + + batch_idx = 0 + total_deleted = 0 + + async with storage._get_redis_connection() as redis: + for pattern in patterns: + prefixed_pattern = f"{storage.final_namespace}:{pattern}" + cursor = 0 + + while True: + cursor, keys = await redis.scan( + cursor, match=prefixed_pattern, count=self.batch_size + ) + + if keys: + batch_idx += 1 + stats.total_batches += 1 + + try: + # Delete batch using pipeline + pipe = redis.pipeline() + for key in keys: + pipe.delete(key) + await pipe.execute() + + # Success + stats.successful_batches += 1 + stats.successfully_deleted += len(keys) + total_deleted += len(keys) + + # Progress + print( + f"Batch {batch_idx}: Deleted {len(keys):,} keys " + f"(Total: {total_deleted:,}) ✓" + ) + + except Exception as e: + stats.add_error(batch_idx, e, len(keys)) + print( + f"Batch {batch_idx}: ✗ FAILED - " + f"{type(e).__name__}: {str(e)}" + ) + + if cursor == 0: + break + + await asyncio.sleep(0) + + async def delete_query_caches_pg( + self, storage, cleanup_type: str, stats: CleanupStats + ): + """Delete query caches from PostgreSQL + + Args: + storage: PGKVStorage instance + cleanup_type: 'all', 'query', or 'keywords' + stats: CleanupStats object to track progress + """ + from lightrag.kg.postgres_impl import namespace_to_table_name + + table_name = namespace_to_table_name(storage.namespace) + + # Build WHERE conditions + conditions = [] + for mode in QUERY_MODES: + if cleanup_type == "all": + conditions.append(f"id LIKE '{mode}:query:%'") + conditions.append(f"id LIKE '{mode}:keywords:%'") + elif cleanup_type == "query": + conditions.append(f"id LIKE '{mode}:query:%'") + elif cleanup_type == "keywords": + conditions.append(f"id LIKE '{mode}:keywords:%'") + + where_clause = " OR ".join(conditions) + + print("\n=== Starting Cleanup ===") + print("💡 Executing PostgreSQL DELETE query\n") + + try: + query = f""" + DELETE FROM {table_name} + WHERE workspace = $1 + AND ({where_clause}) + """ + + start_time = time.time() + # Fix: Pass dict instead of list for execute() method + await storage.db.execute(query, {"workspace": storage.workspace}) + elapsed = time.time() - start_time + + # PostgreSQL returns deletion count + stats.total_batches = 1 + stats.successful_batches = 1 + stats.successfully_deleted = stats.total_to_delete + + print(f"✓ Deleted {stats.successfully_deleted:,} records in {elapsed:.2f}s") + + except Exception as e: + stats.add_error(1, e, stats.total_to_delete) + print(f"✗ DELETE failed: {type(e).__name__}: {str(e)}") + + async def delete_query_caches_mongo( + self, storage, cleanup_type: str, stats: CleanupStats + ): + """Delete query caches from MongoDB + + Args: + storage: MongoKVStorage instance + cleanup_type: 'all', 'query', or 'keywords' + stats: CleanupStats object to track progress + """ + # Build regex patterns + patterns = [] + for mode in QUERY_MODES: + if cleanup_type == "all": + patterns.append(f"^{mode}:query:") + patterns.append(f"^{mode}:keywords:") + elif cleanup_type == "query": + patterns.append(f"^{mode}:query:") + elif cleanup_type == "keywords": + patterns.append(f"^{mode}:keywords:") + + print("\n=== Starting Cleanup ===") + print("💡 Executing MongoDB deleteMany operations\n") + + total_deleted = 0 + for idx, pattern in enumerate(patterns, 1): + try: + query = {"_id": {"$regex": pattern}} + result = await storage._data.delete_many(query) + deleted_count = result.deleted_count + + stats.total_batches += 1 + stats.successful_batches += 1 + stats.successfully_deleted += deleted_count + total_deleted += deleted_count + + print( + f"Pattern {idx}/{len(patterns)}: Deleted {deleted_count:,} records ✓" + ) + + except Exception as e: + stats.add_error(idx, e, 0) + print( + f"Pattern {idx}/{len(patterns)}: ✗ FAILED - " + f"{type(e).__name__}: {str(e)}" + ) + + print(f"\nTotal deleted: {total_deleted:,} records") + + async def delete_query_caches( + self, storage, storage_name: str, cleanup_type: str, stats: CleanupStats + ): + """Delete query caches from any storage type + + Args: + storage: Storage instance + storage_name: Storage type name + cleanup_type: 'all', 'query', or 'keywords' + stats: CleanupStats object to track progress + """ + if storage_name == "JsonKVStorage": + await self.delete_query_caches_json(storage, cleanup_type, stats) + elif storage_name == "RedisKVStorage": + await self.delete_query_caches_redis(storage, cleanup_type, stats) + elif storage_name == "PGKVStorage": + await self.delete_query_caches_pg(storage, cleanup_type, stats) + elif storage_name == "MongoKVStorage": + await self.delete_query_caches_mongo(storage, cleanup_type, stats) + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + def print_header(self): + """Print tool header""" + print("\n" + "=" * 60) + print("LLM Query Cache Cleanup Tool - LightRAG") + print("=" * 60) + + def print_storage_types(self): + """Print available storage types""" + print("\nSupported KV Storage Types:") + for key, value in STORAGE_TYPES.items(): + print(f"[{key}] {value}") + + def format_workspace(self, workspace: str) -> str: + """Format workspace name with highlighting + + Args: + workspace: Workspace name (may be empty) + + Returns: + Formatted workspace string with ANSI color codes + """ + if workspace: + return f"{BOLD_CYAN}{workspace}{RESET}" + else: + return f"{BOLD_CYAN}(default){RESET}" + + def print_cache_statistics(self, counts: Dict[str, Dict[str, int]], title: str): + """Print cache statistics in a formatted table + + Args: + counts: Dictionary with counts for each mode and cache_type + title: Title for the statistics display + """ + print(f"\n{title}") + print("┌" + "─" * 12 + "┬" + "─" * 12 + "┬" + "─" * 12 + "┬" + "─" * 12 + "┐") + print(f"│ {'Mode':<10} │ {'Query':>10} │ {'Keywords':>10} │ {'Total':>10} │") + print("├" + "─" * 12 + "┼" + "─" * 12 + "┼" + "─" * 12 + "┼" + "─" * 12 + "┤") + + total_query = 0 + total_keywords = 0 + + for mode in QUERY_MODES: + query_count = counts[mode]["query"] + keywords_count = counts[mode]["keywords"] + mode_total = query_count + keywords_count + + total_query += query_count + total_keywords += keywords_count + + print( + f"│ {mode:<10} │ {query_count:>10,} │ {keywords_count:>10,} │ {mode_total:>10,} │" + ) + + print("├" + "─" * 12 + "┼" + "─" * 12 + "┼" + "─" * 12 + "┼" + "─" * 12 + "┤") + grand_total = total_query + total_keywords + print( + f"│ {'Total':<10} │ {total_query:>10,} │ {total_keywords:>10,} │ {grand_total:>10,} │" + ) + print("└" + "─" * 12 + "┴" + "─" * 12 + "┴" + "─" * 12 + "┴" + "─" * 12 + "┘") + + def calculate_total_to_delete( + self, counts: Dict[str, Dict[str, int]], cleanup_type: str + ) -> int: + """Calculate total number of records to delete + + Args: + counts: Dictionary with counts for each mode and cache_type + cleanup_type: 'all', 'query', or 'keywords' + + Returns: + Total number of records to delete + """ + total = 0 + for mode in QUERY_MODES: + if cleanup_type == "all": + total += counts[mode]["query"] + counts[mode]["keywords"] + elif cleanup_type == "query": + total += counts[mode]["query"] + elif cleanup_type == "keywords": + total += counts[mode]["keywords"] + return total + + def print_cleanup_report(self, stats: CleanupStats): + """Print comprehensive cleanup report + + Args: + stats: CleanupStats object with cleanup results + """ + print("\n" + "=" * 60) + print("Cleanup Complete - Final Report") + print("=" * 60) + + # Overall statistics + print("\n📊 Statistics:") + print(f" Total records to delete: {stats.total_to_delete:,}") + print(f" Total batches: {stats.total_batches:,}") + print(f" Successful batches: {stats.successful_batches:,}") + print(f" Failed batches: {stats.failed_batches:,}") + print(f" Successfully deleted: {stats.successfully_deleted:,}") + print(f" Failed to delete: {stats.failed_to_delete:,}") + + # Success rate + success_rate = ( + (stats.successfully_deleted / stats.total_to_delete * 100) + if stats.total_to_delete > 0 + else 0 + ) + print(f" Success rate: {success_rate:.2f}%") + + # Before/After comparison + print("\n📈 Before/After Comparison:") + total_before = sum( + counts["query"] + counts["keywords"] + for counts in stats.counts_before.values() + ) + total_after = sum( + counts["query"] + counts["keywords"] + for counts in stats.counts_after.values() + ) + print(f" Total caches before: {total_before:,}") + print(f" Total caches after: {total_after:,}") + print(f" Net reduction: {total_before - total_after:,}") + + # Error details + if stats.errors: + print(f"\n⚠️ Errors encountered: {len(stats.errors)}") + print("\nError Details:") + print("-" * 60) + + # Group errors by type + error_types = {} + for error in stats.errors: + err_type = error["error_type"] + error_types[err_type] = error_types.get(err_type, 0) + 1 + + print("\nError Summary:") + for err_type, count in sorted(error_types.items(), key=lambda x: -x[1]): + print(f" - {err_type}: {count} occurrence(s)") + + print("\nFirst 5 errors:") + for i, error in enumerate(stats.errors[:5], 1): + print(f"\n {i}. Batch {error['batch']}") + print(f" Type: {error['error_type']}") + print(f" Message: {error['error_msg']}") + print(f" Records lost: {error['records_lost']:,}") + + if len(stats.errors) > 5: + print(f"\n ... and {len(stats.errors) - 5} more errors") + + print("\n" + "=" * 60) + print(f"{BOLD_RED}⚠️ WARNING: Cleanup completed with errors!{RESET}") + print(" Please review the error details above.") + print("=" * 60) + else: + print("\n" + "=" * 60) + print(f"{BOLD_GREEN}✓ SUCCESS: All records cleaned up successfully!{RESET}") + print("=" * 60) + + async def setup_storage(self) -> tuple: + """Setup and initialize storage + + Returns: + Tuple of (storage_instance, storage_name, workspace) + Returns (None, None, None) if user chooses to exit + """ + print("\n=== Storage Setup ===") + self.print_storage_types() + + # Custom input handling with exit support + while True: + choice = input( + "\nSelect storage type (1-4) (Press Enter to exit): " + ).strip() + + # Check for exit + if choice == "" or choice == "0": + print("\n✓ Cleanup cancelled by user") + return None, None, None + + # Check if choice is valid + if choice in STORAGE_TYPES: + break + + print( + f"✗ Invalid choice. Please enter one of: {', '.join(STORAGE_TYPES.keys())}" + ) + + storage_name = STORAGE_TYPES[choice] + + # Special warning for JsonKVStorage about concurrent access + if storage_name == "JsonKVStorage": + print("\n" + "=" * 60) + print(f"{BOLD_RED}⚠️ IMPORTANT WARNING - JsonKVStorage Concurrency{RESET}") + print("=" * 60) + print("\nJsonKVStorage is an in-memory database that does NOT support") + print("concurrent access to the same file by multiple programs.") + print("\nBefore proceeding, please ensure that:") + print(" • LightRAG Server is completely shut down") + print(" • No other programs are accessing the storage files") + print("\n" + "=" * 60) + + confirm = ( + input("\nHas LightRAG Server been shut down? (yes/no): ") + .strip() + .lower() + ) + if confirm != "yes": + print( + "\n✓ Operation cancelled - Please shut down LightRAG Server first" + ) + return None, None, None + + print("✓ Proceeding with JsonKVStorage cleanup...") + + # Check configuration (warnings only, doesn't block) + print("\nChecking configuration...") + self.check_env_vars(storage_name) + + # Get workspace + workspace = self.get_workspace_for_storage(storage_name) + + # Initialize storage (real validation point) + print("\nInitializing storage...") + try: + storage = await self.initialize_storage(storage_name, workspace) + print(f"- Storage Type: {storage_name}") + print(f"- Workspace: {workspace if workspace else '(default)'}") + print("- Connection Status: ✓ Success") + + except Exception as e: + print(f"✗ Initialization failed: {e}") + print(f"\nFor {storage_name}, you can configure using:") + print(" 1. Environment variables (highest priority)") + + # Show specific environment variable requirements + if storage_name in STORAGE_ENV_REQUIREMENTS: + for var in STORAGE_ENV_REQUIREMENTS[storage_name]: + print(f" - {var}") + + print(" 2. config.ini file (medium priority)") + if storage_name == "RedisKVStorage": + print(" [redis]") + print(" uri = redis://localhost:6379") + elif storage_name == "PGKVStorage": + print(" [postgres]") + print(" host = localhost") + print(" port = 5432") + print(" user = postgres") + print(" password = yourpassword") + print(" database = lightrag") + elif storage_name == "MongoKVStorage": + print(" [mongodb]") + print(" uri = mongodb://root:root@localhost:27017/") + print(" database = LightRAG") + + return None, None, None + + return storage, storage_name, workspace + + async def run(self): + """Run the cleanup tool""" + try: + # Initialize shared storage (REQUIRED for storage classes to work) + from lightrag.kg.shared_storage import initialize_share_data + + initialize_share_data(workers=1) + + # Print header + self.print_header() + + # Setup storage + self.storage, storage_name, self.workspace = await self.setup_storage() + + # Check if user cancelled + if self.storage is None: + return + + # Count query caches + print("\nCounting query cache records...") + try: + counts = await self.count_query_caches(self.storage, storage_name) + except Exception as e: + print(f"✗ Counting failed: {e}") + await self.storage.finalize() + return + + # Initialize stats + stats = CleanupStats() + stats.initialize_counts() + stats.counts_before = counts + + # Print statistics + self.print_cache_statistics( + counts, "📊 Query Cache Statistics (Before Cleanup):" + ) + + # Calculate total + total_caches = sum( + counts[mode]["query"] + counts[mode]["keywords"] for mode in QUERY_MODES + ) + + if total_caches == 0: + print("\n⚠️ No query caches found in storage") + await self.storage.finalize() + return + + # Select cleanup type + print("\n=== Cleanup Options ===") + print("[1] Delete all query caches (both query and keywords)") + print("[2] Delete query caches only (keep keywords)") + print("[3] Delete keywords caches only (keep query)") + print("[0] Cancel") + + while True: + choice = input("\nSelect cleanup option (0-3): ").strip() + + if choice == "0" or choice == "": + print("\n✓ Cleanup cancelled") + await self.storage.finalize() + return + elif choice == "1": + cleanup_type = "all" + elif choice == "2": + cleanup_type = "query" + elif choice == "3": + cleanup_type = "keywords" + else: + print("✗ Invalid choice. Please enter 0, 1, 2, or 3") + continue + + # Calculate total to delete for the selected type + stats.total_to_delete = self.calculate_total_to_delete( + counts, cleanup_type + ) + + # Check if there are any records to delete + if stats.total_to_delete == 0: + if cleanup_type == "all": + print(f"\n{BOLD_RED}⚠️ No query caches found to delete!{RESET}") + elif cleanup_type == "query": + print( + f"\n{BOLD_RED}⚠️ No query caches found to delete! (Only keywords exist){RESET}" + ) + elif cleanup_type == "keywords": + print( + f"\n{BOLD_RED}⚠️ No keywords caches found to delete! (Only query caches exist){RESET}" + ) + print(" Please select a different cleanup option.\n") + continue + + # Valid selection with records to delete + break + + # Confirm deletion + print("\n" + "=" * 60) + print("Cleanup Confirmation") + print("=" * 60) + print( + f"Storage: {BOLD_CYAN}{storage_name}{RESET} " + f"(workspace: {self.format_workspace(self.workspace)})" + ) + print(f"Cleanup Type: {BOLD_CYAN}{cleanup_type}{RESET}") + print( + f"Records to Delete: {BOLD_RED}{stats.total_to_delete:,}{RESET} / {total_caches:,}" + ) + + if cleanup_type == "all": + print( + f"\n{BOLD_RED}⚠️ WARNING: This will delete ALL query caches across all modes!{RESET}" + ) + elif cleanup_type == "query": + print("\n⚠️ This will delete query caches only (keywords will be kept)") + elif cleanup_type == "keywords": + print("\n⚠️ This will delete keywords caches only (query will be kept)") + + confirm = input("\nContinue with deletion? (y/n): ").strip().lower() + if confirm != "y": + print("\n✓ Cleanup cancelled") + await self.storage.finalize() + return + + # Perform deletion + await self.delete_query_caches( + self.storage, storage_name, cleanup_type, stats + ) + + # Persist changes + print("\nPersisting changes to storage...") + try: + await self.storage.index_done_callback() + print("✓ Changes persisted successfully") + except Exception as e: + print(f"✗ Persist failed: {e}") + stats.add_error(0, e, 0) + + # Count again to verify + print("\nVerifying cleanup results...") + try: + stats.counts_after = await self.count_query_caches( + self.storage, storage_name + ) + except Exception as e: + print(f"⚠️ Verification failed: {e}") + # Use zero counts if verification fails + stats.counts_after = { + mode: {"query": 0, "keywords": 0} for mode in QUERY_MODES + } + + # Print final report + self.print_cleanup_report(stats) + + # Print after statistics + self.print_cache_statistics( + stats.counts_after, "\n📊 Query Cache Statistics (After Cleanup):" + ) + + # Cleanup + await self.storage.finalize() + + except KeyboardInterrupt: + print("\n\n✗ Cleanup interrupted by user") + except Exception as e: + print(f"\n✗ Cleanup failed: {e}") + import traceback + + traceback.print_exc() + finally: + # Ensure cleanup + if self.storage: + try: + await self.storage.finalize() + except Exception: + pass + + # Finalize shared storage + try: + from lightrag.kg.shared_storage import finalize_share_data + + finalize_share_data() + except Exception: + pass + + +async def main(): + """Main entry point""" + tool = CleanupTool() + await tool.run() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/LightRAG/lightrag/tools/download_cache.py b/LightRAG/lightrag/tools/download_cache.py new file mode 100644 index 00000000..43a21f0b --- /dev/null +++ b/LightRAG/lightrag/tools/download_cache.py @@ -0,0 +1,179 @@ +""" +Download all necessary cache files for offline deployment. + +This module provides a CLI command to download tiktoken model cache files +for offline environments where internet access is not available. +""" + +import os +import sys +from pathlib import Path + + +def download_tiktoken_cache(cache_dir: str = None, models: list = None): + """Download tiktoken models to local cache + + Args: + cache_dir: Directory to store the cache files. If None, uses default location. + models: List of model names to download. If None, downloads common models. + + Returns: + Tuple of (success_count, failed_models) + """ + try: + import tiktoken + except ImportError: + print("Error: tiktoken is not installed.") + print("Install with: pip install tiktoken") + sys.exit(1) + + # Set cache directory if provided + if cache_dir: + cache_dir = os.path.abspath(cache_dir) + os.environ["TIKTOKEN_CACHE_DIR"] = cache_dir + cache_path = Path(cache_dir) + cache_path.mkdir(parents=True, exist_ok=True) + print(f"Using cache directory: {cache_dir}") + else: + cache_dir = os.environ.get( + "TIKTOKEN_CACHE_DIR", str(Path.home() / ".tiktoken_cache") + ) + print(f"Using default cache directory: {cache_dir}") + + # Common models used by LightRAG and OpenAI + if models is None: + models = [ + "gpt-4o-mini", # Default model for LightRAG + "gpt-4o", # GPT-4 Omni + "gpt-4", # GPT-4 + "gpt-3.5-turbo", # GPT-3.5 Turbo + "text-embedding-ada-002", # Legacy embedding model + "text-embedding-3-small", # Small embedding model + "text-embedding-3-large", # Large embedding model + ] + + print(f"\nDownloading {len(models)} tiktoken models...") + print("=" * 70) + + success_count = 0 + failed_models = [] + + for i, model in enumerate(models, 1): + try: + print(f"[{i}/{len(models)}] Downloading {model}...", end=" ", flush=True) + encoding = tiktoken.encoding_for_model(model) + # Trigger download by encoding a test string + encoding.encode("test") + print("✓ Done") + success_count += 1 + except KeyError as e: + print(f"✗ Failed: Unknown model '{model}'") + failed_models.append((model, str(e))) + except Exception as e: + print(f"✗ Failed: {e}") + failed_models.append((model, str(e))) + + print("=" * 70) + print(f"\n✓ Successfully cached {success_count}/{len(models)} models") + + if failed_models: + print(f"\n✗ Failed to download {len(failed_models)} models:") + for model, error in failed_models: + print(f" - {model}: {error}") + + print(f"\nCache location: {cache_dir}") + print("\nFor offline deployment:") + print(" 1. Copy directory to offline server:") + print(f" tar -czf tiktoken_cache.tar.gz {cache_dir}") + print(" scp tiktoken_cache.tar.gz user@offline-server:/path/to/") + print("") + print(" 2. On offline server, extract and set environment variable:") + print(" tar -xzf tiktoken_cache.tar.gz") + print(" export TIKTOKEN_CACHE_DIR=/path/to/tiktoken_cache") + print("") + print(" 3. Or copy to default location:") + print(f" cp -r {cache_dir} ~/.tiktoken_cache/") + + return success_count, failed_models + + +def main(): + """Main entry point for the CLI command""" + import argparse + + parser = argparse.ArgumentParser( + prog="lightrag-download-cache", + description="Download cache files for LightRAG offline deployment", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + # Download to default location (~/.tiktoken_cache) + lightrag-download-cache + + # Download to specific directory + lightrag-download-cache --cache-dir ./offline_cache/tiktoken + + # Download specific models only + lightrag-download-cache --models gpt-4o-mini gpt-4 + +For more information, visit: https://github.com/HKUDS/LightRAG + """, + ) + + parser.add_argument( + "--cache-dir", + help="Cache directory path (default: ~/.tiktoken_cache)", + default=None, + ) + parser.add_argument( + "--models", + nargs="+", + help="Specific models to download (default: common models)", + default=None, + ) + parser.add_argument( + "--version", action="version", version="%(prog)s (LightRAG cache downloader)" + ) + + args = parser.parse_args() + + print("=" * 70) + print("LightRAG Offline Cache Downloader") + print("=" * 70) + + try: + success_count, failed_models = download_tiktoken_cache( + args.cache_dir, args.models + ) + + print("\n" + "=" * 70) + print("Download Complete") + print("=" * 70) + + # Exit with error code if all downloads failed + if success_count == 0: + print("\n✗ All downloads failed. Please check your internet connection.") + sys.exit(1) + # Exit with warning code if some downloads failed + elif failed_models: + print( + f"\n⚠ Some downloads failed ({len(failed_models)}/{success_count + len(failed_models)})" + ) + sys.exit(2) + else: + print("\n✓ All cache files downloaded successfully!") + sys.exit(0) + + except KeyboardInterrupt: + print("\n\n✗ Download interrupted by user") + sys.exit(130) + except Exception as e: + print(f"\n\n✗ Error: {e}") + import traceback + + traceback.print_exc() + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/README-zh.md b/LightRAG/lightrag/tools/lightrag_visualizer/README-zh.md new file mode 100644 index 00000000..949178ff --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/README-zh.md @@ -0,0 +1,95 @@ +# 3D GraphML Viewer + +一个基于 Dear ImGui 和 ModernGL 的交互式 3D 图可视化工具。 + +## 功能特点 + +- **3D 交互式可视化**: 使用 ModernGL 实现高性能的 3D 图形渲染 +- **多种布局算法**: 支持多种图布局方式 + - Spring 布局 + - Circular 布局 + - Shell 布局 + - Random 布局 +- **社区检测**: 支持图社区结构的自动检测和可视化 +- **交互控制**: + - WASD + QE 键控制相机移动 + - 鼠标右键拖拽控制视角 + - 节点选择和高亮 + - 可调节节点大小和边宽度 + - 可控制标签显示 + - 可在节点的Connections间快速跳转 +- **社区检测**: 支持图社区结构的自动检测和可视化 +- **交互控制**: + - WASD + QE 键控制相机移动 + - 鼠标右键拖拽控制视角 + - 节点选择和高亮 + - 可调节节点大小和边宽度 + - 可控制标签显示 + +## 技术栈 + +- **imgui_bundle**: 用户界面 +- **ModernGL**: OpenGL 图形渲染 +- **NetworkX**: 图数据结构和算法 +- **NumPy**: 数值计算 +- **community**: 社区检测 + +## 使用方法 + +1. **启动程序**: + ```bash + pip install lightrag-hku[tools] + lightrag-viewer + ``` + +2. **加载字体**: + - 将中文字体文件 `font.ttf` 放置在 `assets` 目录下 + - 或者修改 `CUSTOM_FONT` 常量来使用其他字体文件 + +3. **加载图文件**: + - 点击界面上的 "Load GraphML" 按钮 + - 选择 GraphML 格式的图文件 + +4. **交互控制**: + - **相机移动**: + - W: 前进 + - S: 后退 + - A: 左移 + - D: 右移 + - Q: 上升 + - E: 下降 + - **视角控制**: + - 按住鼠标右键拖动来旋转视角 + - **节点交互**: + - 鼠标悬停可高亮节点 + - 点击可选中节点 + +5. **可视化设置**: + - 可通过 UI 控制面板调整: + - 布局类型 + - 节点大小 + - 边的宽度 + - 标签显示 + - 标签大小 + - 背景颜色 + +## 自定义设置 + +- **节点缩放**: 通过 `node_scale` 参数调整节点大小 +- **边宽度**: 通过 `edge_width` 参数调整边的宽度 +- **标签显示**: 可通过 `show_labels` 开关标签显示 +- **标签大小**: 使用 `label_size` 调整标签大小 +- **标签颜色**: 通过 `label_color` 设置标签颜色 +- **视距控制**: 使用 `label_culling_distance` 控制标签显示的最大距离 + +## 性能优化 + +- 使用 ModernGL 进行高效的图形渲染 +- 视距裁剪优化标签显示 +- 社区检测算法优化大规模图的可视化效果 + +## 系统要求 + +- Python 3.10+ +- OpenGL 3.3+ 兼容的显卡 +- 支持的操作系统:Windows/Linux/MacOS diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/README.md b/LightRAG/lightrag/tools/lightrag_visualizer/README.md new file mode 100644 index 00000000..f0567bf4 --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/README.md @@ -0,0 +1,136 @@ +# LightRAG 3D Graph Viewer + +An interactive 3D graph visualization tool included in the LightRAG package for visualizing and analyzing RAG (Retrieval-Augmented Generation) graphs and other graph structures. + +![image](https://github.com/user-attachments/assets/b0d86184-99fc-468c-96ed-c611f14292bf) + +## Installation + +### Quick Install +```bash +pip install lightrag-hku[tools] # Install with visualization tool only +# or +pip install lightrag-hku[api,tools] # Install with both API and visualization tools +``` + +## Launch the Viewer +```bash +lightrag-viewer +``` + +## Features + +- **3D Interactive Visualization**: High-performance 3D graphics rendering using ModernGL +- **Multiple Layout Algorithms**: Support for various graph layouts + - Spring layout + - Circular layout + - Shell layout + - Random layout +- **Community Detection**: Automatic detection and visualization of graph community structures +- **Interactive Controls**: + - WASD + QE keys for camera movement + - Right mouse drag for view angle control + - Node selection and highlighting + - Adjustable node size and edge width + - Configurable label display + - Quick navigation between node connections + +## Tech Stack + +- **imgui_bundle**: User interface +- **ModernGL**: OpenGL graphics rendering +- **NetworkX**: Graph data structures and algorithms +- **NumPy**: Numerical computations +- **community**: Community detection + +## Interactive Controls + +### Camera Movement +- W: Move forward +- S: Move backward +- A: Move left +- D: Move right +- Q: Move up +- E: Move down + +### View Control +- Hold right mouse button and drag to rotate view + +### Node Interaction +- Hover mouse to highlight nodes +- Click to select nodes + +## Visualization Settings + +Adjustable via UI control panel: +- Layout type +- Node size +- Edge width +- Label visibility +- Label size +- Background color + +## Customization Options + +- **Node Scaling**: Adjust node size via `node_scale` parameter +- **Edge Width**: Modify edge width using `edge_width` parameter +- **Label Display**: Toggle label visibility with `show_labels` +- **Label Size**: Adjust label size using `label_size` +- **Label Color**: Set label color through `label_color` +- **View Distance**: Control maximum label display distance with `label_culling_distance` + +## System Requirements + +- Python 3.9+ +- Graphics card with OpenGL 3.3+ support +- Supported Operating Systems: Windows/Linux/MacOS + +## Troubleshooting + +### Common Issues + +1. **Command Not Found** + ```bash + # Make sure you installed with the 'tools' option + pip install lightrag-hku[tools] + + # Verify installation + pip list | grep lightrag-hku + ``` + +2. **ModernGL Initialization Failed** + ```bash + # Check OpenGL version + glxinfo | grep "OpenGL version" + + # Update graphics drivers if needed + ``` + +3. **Font Loading Issues** + - The required fonts are included in the package + - If issues persist, check your graphics drivers + +## Usage with LightRAG + +The viewer is particularly useful for: +- Visualizing RAG knowledge graphs +- Analyzing document relationships +- Exploring semantic connections +- Debugging retrieval patterns + +## Performance Optimizations + +- Efficient graphics rendering using ModernGL +- View distance culling for label display optimization +- Community detection algorithms for optimized visualization of large-scale graphs + +## Support + +- GitHub Issues: [LightRAG Repository](https://github.com/HKUDS/LightRAG) +- Documentation: [LightRAG Docs](https://URL-to-docs) + +## License + +This tool is part of LightRAG and is distributed under the MIT License. See `LICENSE` for more information. + +Note: This visualization tool is an optional component of the LightRAG package. Install with the [tools] option to access the viewer functionality. diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/__init__.py b/LightRAG/lightrag/tools/lightrag_visualizer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/assets/Geist-Regular.ttf b/LightRAG/lightrag/tools/lightrag_visualizer/assets/Geist-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6fdfffa789140e9fed6ba18dcbf7e5027d924c0f GIT binary patch literal 111644 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 literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - Geist.txt b/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - Geist.txt new file mode 100644 index 00000000..8d003fec --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - Geist.txt @@ -0,0 +1,92 @@ +Copyright (c) 2023 Vercel, in collaboration with basement.studio + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - SmileySans.txt b/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - SmileySans.txt new file mode 100644 index 00000000..3eda3911 --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/assets/LICENSE - SmileySans.txt @@ -0,0 +1,93 @@ +Copyright (c) 2022--2024, atelierAnchor , +with Reserved Font Name and <得意黑>. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/assets/SmileySans-Oblique.ttf b/LightRAG/lightrag/tools/lightrag_visualizer/assets/SmileySans-Oblique.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c297dc6928402fc0c73cec17ea7518d3731f7022 GIT binary patch literal 2629764 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 z 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

    nQW<$aQ#BS0RV5TBDm^a#g5AZk5L9@EwdQzryI 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

    6h#wA&1Bt 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]vE1Qy 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%0AdP+8WZtMF0UBKa*RMrpe<^$ zbXE(4Xx<>oN$ml0O(Y~C;2VD@epw_g@+to5^j?9GfS8?@3j2ZOdR>oD!*s|rEM+#P zjJ^)~7j)ifF?o&!t_r=@_z_nRdawG}W7VfPVEA8p5OS<*^=(_nt|&~bSQ=fPm>9lj zX!GtAF*+_9+ttGxF}XX;I#b)edx|imNUW(;*eB(RA=H3CsSavD$br488BN1ryIuQB{t+oH2VX3kMdmlT*;*L3i@)@{6m~eH#(fwT*|oM(d%M>#+k^Q zJnU^S6by;XpKdVUNHXK&*Nz{1?D(~;|G@LF<#o7JUw{6@D0?SyRg`__UvL!X{=3Kz z;V3Tf={1Dlfmx3){>wR4hLdu$_{g?Fh==o8pPxe(_;XyP2Mi@QpqEY|SLe**nGUC0 z919sBecljk zgi--Ns#r7Am-TeSrQP&!?;AAR1;`4kKKd~{WvTql@u#02e?%fHYE|s}-B}W7uAZ4G zz@+}pL}MmB>|4<`c6_iU_ucW|#-QC2kXzL@V&#rkM;iQFPwp9=zkOl?{JaB(Pf;>} zMr{#Z7?XB#6)Xr>k-jc^*!T)+AuRIm_2{jh!J`HYr{Y2sBcPVBqlFY=J{Gr+F~sx+ zz#_nXG|&wity<&qAVh*aNIorQ^Yp9*Ig6@pIlK*vhb?!{S?2EQ^pq?EuHxs$w0*>$ zG=P*Fb*7Jjwo?REPsGUbQ<^CvMi!8A7zrrP%n-bpU&DVh>^#An-`Eg4sxjEP<9AJ) z8$(Uon}E=_6Z#VWhJD7f!1j#(u~?Jg9sFa_Kf31f&{4tvp~5GmthK{H*bYB{zJTLd zNQD+>@|d^*-xhoW*!vTs4Rihr>1U0aUs6+YjbI%3$}$QdrH~GIH3gwwzKUl5qSOMp zsN;Fgn4m$=y$Fyc5K%~{nr+B@?&BOBI zNK2!}ZmfvllO|X+oG?bfz@yf;1-e&G00_X)^}+KG3mH4=7{g`3oA8^&fkYZ=r^NQA ziJg%G%@|fR=S;ACRdot=iuOkoJ3-&7J)J&Hy-Z|bFX|;25hdm6eL+1CbeNzH0Mu{= zYE$8GrSUKz2D|*B;L+<-?`0dG!)LywrWkyw-=u%!tdKV&1_RW9+XOkf&BE- zv0waR>_xeJ0Qk~a9O#pq3P-GkC?6;)c=}p*xg83SYhWKGhs3EpVV&-vDDbdq0AjQ7 z6IkLGK7$*?5mMdjq39C)1IQ8xosj%bQR+5$Gs+QV+@^KSXIg6h!ReO7!v<&)fSw>w zvCXOt#}VAh79j3B=w~iD=ri_?#CMi!V|t4%+q2nHlqyg6`x(axx42>b;Gpk%6{%8Z zmWQG%QmW*PFSL~93xM3n_z8lJD&Ih+1cIj`B+u`3BY#0U5BhG`L7&Z^Je(YHw3>~& z_Sl{t;2})-mR@lJQ82gL3$sQXEZhPEl&IP{`Atgp| z0E!4uR(Cy*`l^EHyQl8_DSf(RC$&>DF4-Z}s(K9#wq^9iq1da`@9h^y%>t#gw~!lR zM#VOBqe8K-wR?b|9TD%^FU^!u_r69wG1z%r^{CR8EsbukGd>fnCL+aR+CJA;9nEXP z&dKVfnE)}@&;tHP3Cv~)pY8_z8vRBERHz?7`dk}YKxQh7uBRqn_*Njc;MMFFPlFOm zWiJVB7lvoCJItAc9_BPOMZ|!lg2~x<+#$;P{1IZ_H^BskTiZta{D=AS=iWbbtVaI;LsWT3HDgTFtMg?!9;FR+(%F*f)MXm~93=;hvMf z-P$#B+2jspho|44Vo&AST%%62W7NxD!{faVO6P!`#fSpQgYic*5Ol5j zhB395n-d1BinYlH7bk=M-rZ9;=?14Jd*v>rcIl`G26f#JE0S$0&3niT!>gO$q0<@ z^MeD%CU~KTcUV`ATpOex2f{F7Iz4`Tph%0Atz(f!k5k0{9W3zmUC^=vIHV~QGXW_( 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

    %fd|Q8Q9%-F29{*`C`-iRL#yQn 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 z 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�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%0Av!N=zE$U@J|xc^248>1i*x#24C19qIt%8*qn$ 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%0D%!?GSjyN;rr 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 z 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

    yhEB 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

    `es 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 z�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 literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/assets/place_font_here b/LightRAG/lightrag/tools/lightrag_visualizer/assets/place_font_here new file mode 100644 index 00000000..e69de29b diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/graph_visualizer.py b/LightRAG/lightrag/tools/lightrag_visualizer/graph_visualizer.py new file mode 100644 index 00000000..8a6f0976 --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/graph_visualizer.py @@ -0,0 +1,1221 @@ +from typing import Optional, Tuple, Dict, List +import numpy as np +import networkx as nx +import pipmaster as pm + +# Added automatic libraries install using pipmaster +if not pm.is_installed("moderngl"): + pm.install("moderngl") +if not pm.is_installed("imgui_bundle"): + pm.install("imgui_bundle") +if not pm.is_installed("pyglm"): + pm.install("pyglm") +if not pm.is_installed("python-louvain"): + pm.install("python-louvain") + +import moderngl +from imgui_bundle import imgui, immapp, hello_imgui +import community +import glm +import tkinter as tk +from tkinter import filedialog +import traceback +import colorsys +import os + +CUSTOM_FONT = "font.ttf" + +DEFAULT_FONT_ENG = "Geist-Regular.ttf" +DEFAULT_FONT_CHI = "SmileySans-Oblique.ttf" + + +class Node3D: + """Class representing a 3D node in the graph""" + + def __init__( + self, position: glm.vec3, color: glm.vec3, label: str, size: float, idx: int + ): + self.position = position + self.color = color + self.label = label + self.size = size + self.idx = idx + + +class GraphViewer: + """Main class for 3D graph visualization""" + + def __init__(self): + self.glctx = None # ModernGL context + self.graph: Optional[nx.Graph] = None + self.nodes: List[Node3D] = [] + self.id_node_map: Dict[str, Node3D] = {} + self.communities = None + self.community_colors = None + + # Window dimensions + self.window_width = 1280 + self.window_height = 720 + + # Camera parameters + self.position = glm.vec3(0.0, -10.0, 0.0) # Initial camera position + self.front = glm.vec3(0.0, 1.0, 0.0) # Direction camera is facing + self.up = glm.vec3(0.0, 0.0, 1.0) # Up vector + self.yaw = 90.0 # Horizontal rotation (around Z axis) + self.pitch = 0.0 # Vertical rotation + self.move_speed = 0.05 + self.mouse_sensitivity = 0.15 + + # Graph visualization settings + self.layout_type = "Spring" + self.node_scale = 0.2 + self.edge_width = 0.5 + self.show_labels = True + self.label_size = 2 + self.label_color = (1.0, 1.0, 1.0, 1.0) + self.label_culling_distance = 10.0 + self.available_layouts = ("Spring", "Circular", "Shell", "Random") + self.background_color = (0.05, 0.05, 0.05, 1.0) + + # Mouse interaction + self.last_mouse_pos = None + self.mouse_pressed = False + self.mouse_button = -1 + self.first_mouse = True + + # File dialog state + self.show_load_error = False + self.error_message = "" + + # Selection state + self.selected_node: Optional[Node3D] = None + self.highlighted_node: Optional[Node3D] = None + + # Node id map + self.node_id_fbo = None + self.node_id_texture = None + self.node_id_depth = None + self.node_id_texture_np: np.ndarray = None + + # Static data + self.sphere_data = create_sphere() + + # Initialization flag + self.initialized = False + + def setup(self): + self.setup_render_context() + self.setup_shaders() + self.setup_buffers() + self.initialized = True + + def handle_keyboard_input(self): + """Handle WASD keyboard input for camera movement""" + io = imgui.get_io() + + if io.want_capture_keyboard: + return + + # Calculate camera vectors + right = glm.normalize(glm.cross(self.front, self.up)) + + # Get movement direction from WASD keys + if imgui.is_key_down(imgui.Key.w): # Forward + self.position += self.front * self.move_speed * 0.1 + if imgui.is_key_down(imgui.Key.s): # Backward + self.position -= self.front * self.move_speed * 0.1 + if imgui.is_key_down(imgui.Key.a): # Left + self.position -= right * self.move_speed * 0.1 + if imgui.is_key_down(imgui.Key.d): # Right + self.position += right * self.move_speed * 0.1 + if imgui.is_key_down(imgui.Key.q): # Up + self.position += self.up * self.move_speed * 0.1 + if imgui.is_key_down(imgui.Key.e): # Down + self.position -= self.up * self.move_speed * 0.1 + + def handle_mouse_interaction(self): + """Handle mouse interaction for camera control and node selection""" + if ( + imgui.is_any_item_active() + or imgui.is_any_item_hovered() + or imgui.is_any_item_focused() + ): + return + + io = imgui.get_io() + mouse_pos = (io.mouse_pos.x, io.mouse_pos.y) + if ( + mouse_pos[0] < 0 + or mouse_pos[1] < 0 + or mouse_pos[0] >= self.window_width + or mouse_pos[1] >= self.window_height + ): + return + + # Handle first mouse input + if self.first_mouse: + self.last_mouse_pos = mouse_pos + self.first_mouse = False + return + + # Handle mouse movement for camera rotation + if self.mouse_pressed and self.mouse_button == 1: # Right mouse button + dx = self.last_mouse_pos[0] - mouse_pos[0] + dy = self.last_mouse_pos[1] - mouse_pos[1] # Reversed for intuitive control + + dx *= self.mouse_sensitivity + dy *= self.mouse_sensitivity + + self.yaw += dx + self.pitch += dy + + # Limit pitch to avoid flipping + self.pitch = np.clip(self.pitch, -89.0, 89.0) + + # Update front vector + self.front = glm.normalize( + glm.vec3( + np.cos(np.radians(self.yaw)) * np.cos(np.radians(self.pitch)), + np.sin(np.radians(self.yaw)) * np.cos(np.radians(self.pitch)), + np.sin(np.radians(self.pitch)), + ) + ) + + if not imgui.is_window_hovered(): + return + + if io.mouse_wheel != 0: + self.move_speed += io.mouse_wheel * 0.05 + self.move_speed = np.max([self.move_speed, 0.01]) + + # Handle mouse press/release + for button in range(3): + if imgui.is_mouse_clicked(button): + self.mouse_pressed = True + self.mouse_button = button + if button == 0 and self.highlighted_node: # Left click for selection + self.selected_node = self.highlighted_node + + if imgui.is_mouse_released(button) and self.mouse_button == button: + self.mouse_pressed = False + self.mouse_button = -1 + + # Handle node hovering + if not self.mouse_pressed: + hovered = self.find_node_at((int(mouse_pos[0]), int(mouse_pos[1]))) + self.highlighted_node = hovered + + # Update last mouse position + self.last_mouse_pos = mouse_pos + + def update_layout(self): + """Update the graph layout""" + pos = nx.spring_layout( + self.graph, + dim=3, + pos={ + node_id: list(node.position) + for node_id, node in self.id_node_map.items() + }, + k=2.0, + iterations=100, + weight=None, + ) + + # Update node positions + for node_id, position in pos.items(): + self.id_node_map[node_id].position = glm.vec3(position) + self.update_buffers() + + def render_node_details(self): + """Render node details window""" + if self.selected_node and imgui.begin("Node Details"): + imgui.text(f"ID: {self.selected_node.label}") + + if self.graph: + node_data = self.graph.nodes[self.selected_node.label] + imgui.text(f"Type: {node_data.get('type', 'default')}") + + degree = self.graph.degree[self.selected_node.label] + imgui.text(f"Degree: {degree}") + + for key, value in node_data.items(): + if key != "type": + imgui.text(f"{key}: {value}") + if value and imgui.is_item_hovered(): + imgui.set_tooltip(str(value)) + + imgui.separator() + + connections = self.graph[self.selected_node.label] + if connections: + imgui.text("Connections:") + keys = next(iter(connections.values())).keys() + if imgui.begin_table( + "Connections", + len(keys) + 1, + imgui.TableFlags_.borders + | imgui.TableFlags_.row_bg + | imgui.TableFlags_.resizable + | imgui.TableFlags_.hideable, + ): + imgui.table_setup_column("Node") + for key in keys: + imgui.table_setup_column(key) + imgui.table_headers_row() + + for neighbor, edge_data in connections.items(): + imgui.table_next_row() + imgui.table_set_column_index(0) + if imgui.selectable(str(neighbor), True)[0]: + # Select neighbor node + self.selected_node = self.id_node_map[neighbor] + self.position = self.selected_node.position - self.front + for idx, key in enumerate(keys): + imgui.table_set_column_index(idx + 1) + value = str(edge_data.get(key, "")) + imgui.text(value) + if value and imgui.is_item_hovered(): + imgui.set_tooltip(value) + imgui.end_table() + + imgui.end() + + def setup_render_context(self): + """Initialize ModernGL context""" + self.glctx = moderngl.create_context() + self.glctx.enable(moderngl.DEPTH_TEST | moderngl.CULL_FACE) + self.glctx.clear_color = self.background_color + + def setup_shaders(self): + """Setup vertex and fragment shaders for node and edge rendering""" + # Node shader program + self.node_prog = self.glctx.program( + vertex_shader=""" + #version 330 + + uniform mat4 mvp; + uniform vec3 camera; + uniform int selected_node; + uniform int highlighted_node; + uniform float scale; + + in vec3 in_position; + in vec3 in_instance_position; + in vec3 in_instance_color; + in float in_instance_size; + + out vec3 frag_color; + out vec3 frag_normal; + out vec3 frag_view_dir; + + void main() { + vec3 pos = in_position * in_instance_size * scale + in_instance_position; + gl_Position = mvp * vec4(pos, 1.0); + + frag_normal = normalize(in_position); + frag_view_dir = normalize(camera - pos); + + if (selected_node == gl_InstanceID) { + frag_color = vec3(1.0, 0.5, 0.0); + } + else if (highlighted_node == gl_InstanceID) { + frag_color = vec3(1.0, 0.8, 0.2); + } + else { + frag_color = in_instance_color; + } + } + """, + fragment_shader=""" + #version 330 + + in vec3 frag_color; + in vec3 frag_normal; + in vec3 frag_view_dir; + + out vec4 outColor; + + void main() { + // Edge detection based on normal-view angle + float edge = 1.0 - abs(dot(frag_normal, frag_view_dir)); + + // Create sharp outline + float outline = smoothstep(0.8, 0.9, edge); + + // Mix the sphere color with outline + vec3 final_color = mix(frag_color, vec3(0.0), outline); + + outColor = vec4(final_color, 1.0); + } + """, + ) + + # Edge shader program with wide lines using geometry shader + self.edge_prog = self.glctx.program( + vertex_shader=""" + #version 330 + + uniform mat4 mvp; + + in vec3 in_position; + in vec3 in_color; + + out vec3 v_color; + out vec4 v_position; + + void main() { + v_position = mvp * vec4(in_position, 1.0); + gl_Position = v_position; + v_color = in_color; + } + """, + geometry_shader=""" + #version 330 + + layout(lines) in; + layout(triangle_strip, max_vertices = 4) out; + + uniform float edge_width; + uniform vec2 viewport_size; + + in vec3 v_color[]; + in vec4 v_position[]; + out vec3 g_color; + out float edge_coord; + + void main() { + // Get the two vertices of the line + vec4 p1 = v_position[0]; + vec4 p2 = v_position[1]; + + // Perspective division + vec4 p1_ndc = p1 / p1.w; + vec4 p2_ndc = p2 / p2.w; + + // Calculate line direction in screen space + vec2 dir = normalize((p2_ndc.xy - p1_ndc.xy) * viewport_size); + vec2 normal = vec2(-dir.y, dir.x); + + // Calculate half width based on screen space + float half_width = edge_width * 0.5; + vec2 offset = normal * (half_width / viewport_size); + + // Emit vertices with proper depth + gl_Position = vec4(p1_ndc.xy + offset, p1_ndc.z, 1.0); + gl_Position *= p1.w; // Restore perspective + g_color = v_color[0]; + edge_coord = 1.0; + EmitVertex(); + + gl_Position = vec4(p1_ndc.xy - offset, p1_ndc.z, 1.0); + gl_Position *= p1.w; + g_color = v_color[0]; + edge_coord = -1.0; + EmitVertex(); + + gl_Position = vec4(p2_ndc.xy + offset, p2_ndc.z, 1.0); + gl_Position *= p2.w; + g_color = v_color[1]; + edge_coord = 1.0; + EmitVertex(); + + gl_Position = vec4(p2_ndc.xy - offset, p2_ndc.z, 1.0); + gl_Position *= p2.w; + g_color = v_color[1]; + edge_coord = -1.0; + EmitVertex(); + + EndPrimitive(); + } + """, + fragment_shader=""" + #version 330 + + in vec3 g_color; + in float edge_coord; + + out vec4 fragColor; + + void main() { + // Edge outline parameters + float outline_width = 0.2; // Width of the outline relative to edge + float edge_softness = 0.1; // Softness of the edge + float edge_dist = abs(edge_coord); + + // Calculate outline + float outline_factor = smoothstep(1.0 - outline_width - edge_softness, + 1.0 - outline_width, + edge_dist); + + // Mix edge color with outline (black) + vec3 final_color = mix(g_color, vec3(0.0), outline_factor); + + // Calculate alpha for anti-aliasing + float alpha = 1.0 - smoothstep(1.0 - edge_softness, 1.0, edge_dist); + + fragColor = vec4(final_color, alpha); + } + """, + ) + + # Id framebuffer shader program + self.node_id_prog = self.glctx.program( + vertex_shader=""" + #version 330 + + uniform mat4 mvp; + uniform float scale; + + in vec3 in_position; + in vec3 in_instance_position; + in float in_instance_size; + + out vec3 frag_color; + + vec3 int_to_rgb(int value) { + float R = float((value >> 16) & 0xFF); + float G = float((value >> 8) & 0xFF); + float B = float(value & 0xFF); + // normalize to [0, 1] + return vec3(R / 255.0, G / 255.0, B / 255.0); + } + + void main() { + vec3 pos = in_position * in_instance_size * scale + in_instance_position; + gl_Position = mvp * vec4(pos, 1.0); + frag_color = int_to_rgb(gl_InstanceID); + } + """, + fragment_shader=""" + #version 330 + in vec3 frag_color; + out vec4 outColor; + void main() { + outColor = vec4(frag_color, 1.0); + } + """, + ) + + def setup_buffers(self): + """Setup vertex buffers for nodes and edges""" + # We'll create these when loading the graph + self.node_vbo = None + self.node_color_vbo = None + self.node_size_vbo = None + self.edge_vbo = None + self.edge_color_vbo = None + self.node_vao = None + self.edge_vao = None + self.node_id_vao = None + self.sphere_pos_vbo = None + self.sphere_index_buffer = None + + def load_file(self, filepath: str): + """Load a GraphML file with error handling""" + try: + # Clear existing data + self.id_node_map.clear() + self.nodes.clear() + self.selected_node = None + self.highlighted_node = None + self.setup_buffers() + + # Load new graph + self.graph = nx.read_graphml(filepath) + self.calculate_layout() + self.update_buffers() + self.show_load_error = False + self.error_message = "" + except Exception as _: + self.show_load_error = True + self.error_message = traceback.format_exc() + print(self.error_message) + + def calculate_layout(self): + """Calculate 3D layout for the graph""" + if not self.graph: + return + + # Detect communities for coloring + self.communities = community.best_partition(self.graph) + num_communities = len(set(self.communities.values())) + self.community_colors = generate_colors(num_communities) + + # Calculate layout based on selected type + if self.layout_type == "Spring": + pos = nx.spring_layout( + self.graph, dim=3, k=2.0, iterations=100, weight=None + ) + elif self.layout_type == "Circular": + pos_2d = nx.circular_layout(self.graph) + pos = {node: np.array((x, 0.0, y)) for node, (x, y) in pos_2d.items()} + elif self.layout_type == "Shell": + # Group nodes by community for shell layout + comm_lists = [[] for _ in range(num_communities)] + for node, comm in self.communities.items(): + comm_lists[comm].append(node) + pos_2d = nx.shell_layout(self.graph, comm_lists) + pos = {node: np.array((x, 0.0, y)) for node, (x, y) in pos_2d.items()} + else: # Random + pos = {node: np.random.rand(3) * 2 - 1 for node in self.graph.nodes()} + + # Scale positions + positions = np.array(list(pos.values())) + if len(positions) > 0: + scale = 10.0 / max(1.0, np.max(np.abs(positions))) + pos = {node: coords * scale for node, coords in pos.items()} + + # Calculate degree-based sizes + degrees = dict(self.graph.degree()) + max_degree = max(degrees.values()) if degrees else 1 + min_degree = min(degrees.values()) if degrees else 1 + + idx = 0 + # Create nodes with community colors + for node_id in self.graph.nodes(): + position = glm.vec3(pos[node_id]) + color = self.get_node_color(node_id) + + # Normalize sizes between 0.5 and 2.0 + size = 1.0 + if max_degree != min_degree: + # Normalize and scale size + normalized = (degrees[node_id] - min_degree) / (max_degree - min_degree) + size = 0.5 + normalized * 1.5 + + if node_id in self.id_node_map: + node = self.id_node_map[node_id] + node.position = position + node.base_color = color + node.color = color + node.size = size + else: + node = Node3D(position, color, str(node_id), size, idx) + self.id_node_map[node_id] = node + self.nodes.append(node) + idx += 1 + + self.update_buffers() + + def get_node_color(self, node_id: str) -> glm.vec3: + """Get RGBA color based on community""" + if self.communities and node_id in self.communities: + comm_id = self.communities[node_id] + color = self.community_colors[comm_id] + return color + return glm.vec3(0.5, 0.5, 0.5) + + def update_buffers(self): + """Update vertex buffers with current node and edge data using batch rendering""" + if not self.graph: + return + + # Update node buffers + node_positions = [] + node_colors = [] + node_sizes = [] + + for node in self.nodes: + node_positions.append(node.position) + node_colors.append(node.color) # Only use RGB components + node_sizes.append(node.size) + + if node_positions: + node_positions = np.array(node_positions, dtype=np.float32) + node_colors = np.array(node_colors, dtype=np.float32) + node_sizes = np.array(node_sizes, dtype=np.float32) + + self.node_vbo = self.glctx.buffer(node_positions.tobytes()) + self.node_color_vbo = self.glctx.buffer(node_colors.tobytes()) + self.node_size_vbo = self.glctx.buffer(node_sizes.tobytes()) + self.sphere_pos_vbo = self.glctx.buffer(self.sphere_data[0].tobytes()) + self.sphere_index_buffer = self.glctx.buffer(self.sphere_data[1].tobytes()) + + self.node_vao = self.glctx.vertex_array( + self.node_prog, + [ + (self.sphere_pos_vbo, "3f", "in_position"), + (self.node_vbo, "3f /i", "in_instance_position"), + (self.node_color_vbo, "3f /i", "in_instance_color"), + (self.node_size_vbo, "f /i", "in_instance_size"), + ], + index_buffer=self.sphere_index_buffer, + index_element_size=4, + ) + self.node_vao.instances = len(self.nodes) + + self.node_id_vao = self.glctx.vertex_array( + self.node_id_prog, + [ + (self.sphere_pos_vbo, "3f", "in_position"), + (self.node_vbo, "3f /i", "in_instance_position"), + (self.node_size_vbo, "f /i", "in_instance_size"), + ], + index_buffer=self.sphere_index_buffer, + index_element_size=4, + ) + self.node_id_vao.instances = len(self.nodes) + + # Update edge buffers + edge_positions = [] + edge_colors = [] + + for edge in self.graph.edges(): + start_node = self.id_node_map[edge[0]] + end_node = self.id_node_map[edge[1]] + + edge_positions.append(start_node.position) + edge_colors.append(start_node.color) + + edge_positions.append(end_node.position) + edge_colors.append(end_node.color) + + if edge_positions: + edge_positions = np.array(edge_positions, dtype=np.float32) + edge_colors = np.array(edge_colors, dtype=np.float32) + + self.edge_vbo = self.glctx.buffer(edge_positions.tobytes()) + self.edge_color_vbo = self.glctx.buffer(edge_colors.tobytes()) + + self.edge_vao = self.glctx.vertex_array( + self.edge_prog, + [ + (self.edge_vbo, "3f", "in_position"), + (self.edge_color_vbo, "3f", "in_color"), + ], + ) + + def update_view_proj_matrix(self): + """Update view matrix based on camera parameters""" + self.view_matrix = glm.lookAt( + self.position, self.position + self.front, self.up + ) + + aspect_ratio = self.window_width / self.window_height + self.proj_matrix = glm.perspective( + glm.radians(60.0), # FOV + aspect_ratio, # Aspect ratio + 0.001, # Near plane + 1000.0, # Far plane + ) + + def find_node_at(self, screen_pos: Tuple[int, int]) -> Optional[Node3D]: + """Find the node at a specific screen position""" + if ( + self.node_id_texture_np is None + or self.node_id_texture_np.shape[1] != self.window_width + or self.node_id_texture_np.shape[0] != self.window_height + or screen_pos[0] < 0 + or screen_pos[1] < 0 + or screen_pos[0] >= self.window_width + or screen_pos[1] >= self.window_height + ): + return None + + x = screen_pos[0] + y = self.window_height - screen_pos[1] - 1 + pixel = self.node_id_texture_np[y, x] + + if pixel[3] == 0: + return None + + R = int(round(pixel[0] * 255)) + G = int(round(pixel[1] * 255)) + B = int(round(pixel[2] * 255)) + index = (R << 16) | (G << 8) | B + + if index > len(self.nodes): + return None + return self.nodes[index] + + def is_node_visible_at(self, screen_pos: Tuple[int, int], node_idx: int) -> bool: + """Check if a node exists at a specific screen position""" + node = self.find_node_at(screen_pos) + return node is not None and node.idx == node_idx + + def render_settings(self): + """Render settings window""" + if imgui.begin("Graph Settings"): + # Layout type combo + changed, value = imgui.combo( + "Layout", + self.available_layouts.index(self.layout_type), + self.available_layouts, + ) + if changed: + self.layout_type = self.available_layouts[value] + self.calculate_layout() # Recalculate layout when changed + + # Node size slider + changed, value = imgui.slider_float("Node Scale", self.node_scale, 0.01, 10) + if changed: + self.node_scale = value + + # Edge width slider + changed, value = imgui.slider_float("Edge Width", self.edge_width, 0, 20) + if changed: + self.edge_width = value + + # Show labels checkbox + changed, value = imgui.checkbox("Show Labels", self.show_labels) + + if changed: + self.show_labels = value + + if self.show_labels: + # Label size slider + changed, value = imgui.slider_float( + "Label Size", self.label_size, 0.5, 10.0 + ) + if changed: + self.label_size = value + + # Label color picker + changed, value = imgui.color_edit4( + "Label Color", + self.label_color, + imgui.ColorEditFlags_.picker_hue_wheel, + ) + if changed: + self.label_color = (value[0], value[1], value[2], value[3]) + + # Label culling distance slider + changed, value = imgui.slider_float( + "Label Culling Distance", self.label_culling_distance, 0.1, 100.0 + ) + if changed: + self.label_culling_distance = value + + # Background color picker + changed, value = imgui.color_edit4( + "Background Color", + self.background_color, + imgui.ColorEditFlags_.picker_hue_wheel, + ) + if changed: + self.background_color = (value[0], value[1], value[2], value[3]) + + imgui.end() + + def save_node_id_texture_to_png(self, filename): + # Convert to a PIL Image and save as PNG + from PIL import Image + + scaled_array = self.node_id_texture_np * 255 + img = Image.fromarray( + scaled_array.astype(np.uint8), + "RGBA", + ) + img = img.transpose(method=Image.FLIP_TOP_BOTTOM) + img.save(filename) + + def render_id_map(self, mvp: glm.mat4): + """Render an offscreen id map where each node is drawn with a unique id color.""" + # Lazy initialization of id framebuffer + if self.node_id_texture is not None: + if ( + self.node_id_texture.width != self.window_width + or self.node_id_texture.height != self.window_height + ): + self.node_id_fbo = None + self.node_id_texture = None + self.node_id_texture_np = None + self.node_id_depth = None + + if self.node_id_texture is None: + self.node_id_texture = self.glctx.texture( + (self.window_width, self.window_height), components=4, dtype="f4" + ) + self.node_id_depth = self.glctx.depth_renderbuffer( + size=(self.window_width, self.window_height) + ) + self.node_id_fbo = self.glctx.framebuffer( + color_attachments=[self.node_id_texture], + depth_attachment=self.node_id_depth, + ) + self.node_id_texture_np = np.zeros( + (self.window_height, self.window_width, 4), dtype=np.float32 + ) + + # Bind the offscreen framebuffer + self.node_id_fbo.use() + self.glctx.clear(0, 0, 0, 0) + + # Render nodes + if self.node_id_vao: + self.node_id_prog["mvp"].write(mvp.to_bytes()) + self.node_id_prog["scale"].write(np.float32(self.node_scale).tobytes()) + self.node_id_vao.render(moderngl.TRIANGLES) + + # Revert to default framebuffer + self.glctx.screen.use() + self.node_id_texture.read_into(self.node_id_texture_np.data) + + def render(self): + """Render the graph""" + # Clear screen + self.glctx.clear(*self.background_color, depth=1) + + if not self.graph: + return + + # Enable blending for transparency + self.glctx.enable(moderngl.BLEND) + self.glctx.blend_func = moderngl.SRC_ALPHA, moderngl.ONE_MINUS_SRC_ALPHA + + # Update view and projection matrices + self.update_view_proj_matrix() + mvp = self.proj_matrix * self.view_matrix + + # Render edges first (under nodes) + if self.edge_vao: + self.edge_prog["mvp"].write(mvp.to_bytes()) + self.edge_prog["edge_width"].value = ( + float(self.edge_width) * 2.0 + ) # Double the width for better visibility + self.edge_prog["viewport_size"].value = ( + float(self.window_width), + float(self.window_height), + ) + self.edge_vao.render(moderngl.LINES) + + # Render nodes + if self.node_vao: + self.node_prog["mvp"].write(mvp.to_bytes()) + self.node_prog["camera"].write(self.position.to_bytes()) + self.node_prog["selected_node"].write( + np.int32(self.selected_node.idx).tobytes() + if self.selected_node + else np.int32(-1).tobytes() + ) + self.node_prog["highlighted_node"].write( + np.int32(self.highlighted_node.idx).tobytes() + if self.highlighted_node + else np.int32(-1).tobytes() + ) + self.node_prog["scale"].write(np.float32(self.node_scale).tobytes()) + self.node_vao.render(moderngl.TRIANGLES) + + self.glctx.disable(moderngl.BLEND) + + # Render id map + self.render_id_map(mvp) + + def render_labels(self): + # Render labels if enabled + if self.show_labels and self.nodes: + # Save current font scale + original_scale = imgui.get_font_size() + + self.update_view_proj_matrix() + mvp = self.proj_matrix * self.view_matrix + + for node in self.nodes: + # Project node position to screen space + pos = mvp * glm.vec4( + node.position[0], node.position[1], node.position[2], 1.0 + ) + + # Check if node is behind camera + if pos.w > 0 and pos.w < self.label_culling_distance: + screen_x = (pos.x / pos.w + 1) * self.window_width / 2 + screen_y = (-pos.y / pos.w + 1) * self.window_height / 2 + + if self.is_node_visible_at( + (int(screen_x), int(screen_y)), node.idx + ): + # Set font scale + imgui.set_window_font_scale(float(self.label_size) * node.size) + + # Calculate label size + label_size = imgui.calc_text_size(node.label) + + # Adjust position to center the label + screen_x -= label_size.x / 2 + screen_y -= label_size.y / 2 + + # Set text color with calculated alpha + imgui.push_style_color(imgui.Col_.text, self.label_color) + + # Draw label using ImGui + imgui.set_cursor_pos((screen_x, screen_y)) + imgui.text(node.label) + + # Restore text color + imgui.pop_style_color() + + # Restore original font scale + imgui.set_window_font_scale(original_scale) + + def reset_view(self): + """Reset camera view to default""" + self.position = glm.vec3(0.0, -10.0, 0.0) + self.front = glm.vec3(0.0, 1.0, 0.0) + self.yaw = 90.0 + self.pitch = 0.0 + + +def generate_colors(n: int) -> List[glm.vec3]: + """Generate n distinct colors using HSV color space""" + colors = [] + for i in range(n): + # Use golden ratio to generate well-distributed hues + hue = (i * 0.618033988749895) % 1.0 + # Fixed saturation and value for vibrant colors + saturation = 0.8 + value = 0.95 + # Convert HSV to RGB + rgb = colorsys.hsv_to_rgb(hue, saturation, value) + # Add alpha channel + colors.append(glm.vec3(rgb)) + return colors + + +def show_file_dialog() -> Optional[str]: + """Show a file dialog for selecting GraphML files""" + file_path = filedialog.askopenfilename( + title="Select GraphML File", + filetypes=[("GraphML files", "*.graphml"), ("All files", "*.*")], + ) + return file_path if file_path else None + + +def create_sphere(sectors: int = 32, rings: int = 16) -> Tuple: + """ + Creates a sphere. + """ + R = 1.0 / (rings - 1) + S = 1.0 / (sectors - 1) + + # Use those names as normals and uvs are part of the API + vertices_l = [0.0] * (rings * sectors * 3) + # normals_l = [0.0] * (rings * sectors * 3) + uvs_l = [0.0] * (rings * sectors * 2) + + v, n, t = 0, 0, 0 + for r in range(rings): + for s in range(sectors): + y = np.sin(-np.pi / 2 + np.pi * r * R) + x = np.cos(2 * np.pi * s * S) * np.sin(np.pi * r * R) + z = np.sin(2 * np.pi * s * S) * np.sin(np.pi * r * R) + + uvs_l[t] = s * S + uvs_l[t + 1] = r * R + + vertices_l[v] = x + vertices_l[v + 1] = y + vertices_l[v + 2] = z + + t += 2 + v += 3 + n += 3 + + indices = [0] * rings * sectors * 6 + i = 0 + for r in range(rings - 1): + for s in range(sectors - 1): + indices[i] = r * sectors + s + indices[i + 1] = (r + 1) * sectors + (s + 1) + indices[i + 2] = r * sectors + (s + 1) + + indices[i + 3] = r * sectors + s + indices[i + 4] = (r + 1) * sectors + s + indices[i + 5] = (r + 1) * sectors + (s + 1) + i += 6 + + vbo_vertices = np.array(vertices_l, dtype=np.float32) + vbo_elements = np.array(indices, dtype=np.uint32) + + return (vbo_vertices, vbo_elements) + + +def draw_text_with_bg( + text: str, + text_pos: imgui.ImVec2Like, + text_size: imgui.ImVec2Like, + bg_color: int, +): + imgui.get_window_draw_list().add_rect_filled( + (text_pos[0] - 5, text_pos[1] - 5), + (text_pos[0] + text_size[0] + 5, text_pos[1] + text_size[1] + 5), + bg_color, + 3.0, + ) + imgui.set_cursor_pos(text_pos) + imgui.text(text) + + +def main(): + """Main application entry point""" + viewer = GraphViewer() + + show_fps = True + text_bg_color = imgui.IM_COL32(0, 0, 0, 100) + + def gui(): + if not viewer.initialized: + viewer.setup() + # # Change the theme + # tweaked_theme = hello_imgui.get_runner_params().imgui_window_params.tweaked_theme + # tweaked_theme.theme = hello_imgui.ImGuiTheme_.darcula_darker + # hello_imgui.apply_tweaked_theme(tweaked_theme) + + viewer.window_width = int(imgui.get_window_width()) + viewer.window_height = int(imgui.get_window_height()) + + # Handle keyboard and mouse input + viewer.handle_keyboard_input() + viewer.handle_mouse_interaction() + + style = imgui.get_style() + window_bg_color = style.color_(imgui.Col_.window_bg.value) + + window_bg_color.w = 0.8 + style.set_color_(imgui.Col_.window_bg.value, window_bg_color) + + # Main control window + imgui.begin("Graph Controls") + + if imgui.button("Load GraphML"): + filepath = show_file_dialog() + if filepath: + viewer.load_file(filepath) + + # Show error message if loading failed + if viewer.show_load_error: + imgui.push_style_color(imgui.Col_.text, (1.0, 0.0, 0.0, 1.0)) + imgui.text(f"Error loading file: {viewer.error_message}") + imgui.pop_style_color() + + imgui.separator() + + # Camera controls help + imgui.text("Camera Controls:") + imgui.bullet_text("Hold Right Mouse - Look around") + imgui.bullet_text("W/S - Move forward/backward") + imgui.bullet_text("A/D - Move left/right") + imgui.bullet_text("Q/E - Move up/down") + imgui.bullet_text("Left Mouse - Select node") + imgui.bullet_text("Wheel - Change the movement speed") + + imgui.separator() + + # Camera settings + _, viewer.move_speed = imgui.slider_float( + "Movement Speed", viewer.move_speed, 0.01, 2.0 + ) + _, viewer.mouse_sensitivity = imgui.slider_float( + "Mouse Sensitivity", viewer.mouse_sensitivity, 0.01, 0.5 + ) + + imgui.separator() + + imgui.begin_horizontal("buttons") + + if imgui.button("Reset Camera"): + viewer.reset_view() + + if imgui.button("Update Layout") and viewer.graph: + viewer.update_layout() + + # if imgui.button("Save Node ID Texture"): + # viewer.save_node_id_texture_to_png("node_id_texture.png") + + imgui.end_horizontal() + + imgui.end() + + # Render node details window if a node is selected + viewer.render_node_details() + + # Render graph settings window + viewer.render_settings() + + # Render FPS + if show_fps: + imgui.set_window_font_scale(1) + fps_text = f"FPS: {hello_imgui.frame_rate():.1f}" + text_size = imgui.calc_text_size(fps_text) + cursor_pos = (10, viewer.window_height - text_size.y - 10) + draw_text_with_bg(fps_text, cursor_pos, text_size, text_bg_color) + + # Render highlighted node ID + if viewer.highlighted_node: + imgui.set_window_font_scale(1) + node_text = f"Node ID: {viewer.highlighted_node.label}" + text_size = imgui.calc_text_size(node_text) + cursor_pos = ( + viewer.window_width - text_size.x - 10, + viewer.window_height - text_size.y - 10, + ) + draw_text_with_bg(node_text, cursor_pos, text_size, text_bg_color) + + window_bg_color.w = 0 + style.set_color_(imgui.Col_.window_bg.value, window_bg_color) + + # Render labels + viewer.render_labels() + + def custom_background(): + if viewer.initialized: + viewer.render() + + runner_params = hello_imgui.RunnerParams() + runner_params.app_window_params.window_geometry.size = ( + viewer.window_width, + viewer.window_height, + ) + runner_params.app_window_params.window_title = "3D GraphML Viewer" + runner_params.callbacks.show_gui = gui + runner_params.callbacks.custom_background = custom_background + + def load_font(): + # You will need to provide it yourself, or use another font. + font_filename = CUSTOM_FONT + + io = imgui.get_io() + io.fonts.tex_desired_width = 4096 # Larger texture for better CJK font quality + font_size_pixels = 14 + asset_dir = os.path.join(os.path.dirname(__file__), "assets") + + # Try to load custom font + if not os.path.isfile(font_filename): + font_filename = os.path.join(asset_dir, font_filename) + if os.path.isfile(font_filename): + custom_font = io.fonts.add_font_from_file_ttf( + filename=font_filename, + size_pixels=font_size_pixels, + glyph_ranges_as_int_list=io.fonts.get_glyph_ranges_chinese_full(), + ) + io.font_default = custom_font + return + + # Load default fonts + io.fonts.add_font_from_file_ttf( + filename=os.path.join(asset_dir, DEFAULT_FONT_ENG), + size_pixels=font_size_pixels, + ) + + font_config = imgui.ImFontConfig() + font_config.merge_mode = True + + io.font_default = io.fonts.add_font_from_file_ttf( + filename=os.path.join(asset_dir, DEFAULT_FONT_CHI), + size_pixels=font_size_pixels, + font_cfg=font_config, + glyph_ranges_as_int_list=io.fonts.get_glyph_ranges_chinese_full(), + ) + + runner_params.callbacks.load_additional_fonts = load_font + + tk_root = tk.Tk() + tk_root.withdraw() # Hide the main window + + immapp.run(runner_params) + + tk_root.destroy() # Destroy the main window + + +if __name__ == "__main__": + main() diff --git a/LightRAG/lightrag/tools/lightrag_visualizer/requirements.txt b/LightRAG/lightrag/tools/lightrag_visualizer/requirements.txt new file mode 100644 index 00000000..59f45627 --- /dev/null +++ b/LightRAG/lightrag/tools/lightrag_visualizer/requirements.txt @@ -0,0 +1,8 @@ +imgui_bundle +moderngl +networkx +numpy +pyglm +python-louvain +scipy +tk diff --git a/LightRAG/lightrag/tools/migrate_llm_cache.py b/LightRAG/lightrag/tools/migrate_llm_cache.py new file mode 100644 index 00000000..b0d4823c --- /dev/null +++ b/LightRAG/lightrag/tools/migrate_llm_cache.py @@ -0,0 +1,1472 @@ +#!/usr/bin/env python3 +""" +LLM Cache Migration Tool for LightRAG + +This tool migrates LLM response cache (default:extract:* and default:summary:*) +between different KV storage implementations while preserving workspace isolation. + +Usage: + python -m lightrag.tools.migrate_llm_cache + # or + python lightrag/tools/migrate_llm_cache.py + +Supported KV Storage Types: + - JsonKVStorage + - RedisKVStorage + - PGKVStorage + - MongoKVStorage +""" + +import asyncio +import os +import sys +import time +from typing import Any, Dict, List +from dataclasses import dataclass, field +from dotenv import load_dotenv + +# Add project root to path for imports +sys.path.insert( + 0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +) + +from lightrag.kg import STORAGE_ENV_REQUIREMENTS +from lightrag.namespace import NameSpace +from lightrag.utils import setup_logger + +# Load environment variables +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +# Setup logger +setup_logger("lightrag", level="INFO") + +# Storage type configurations +STORAGE_TYPES = { + "1": "JsonKVStorage", + "2": "RedisKVStorage", + "3": "PGKVStorage", + "4": "MongoKVStorage", +} + +# Workspace environment variable mapping +WORKSPACE_ENV_MAP = { + "PGKVStorage": "POSTGRES_WORKSPACE", + "MongoKVStorage": "MONGODB_WORKSPACE", + "RedisKVStorage": "REDIS_WORKSPACE", +} + +# Default batch size for migration +DEFAULT_BATCH_SIZE = 1000 + + +# Default count batch size for efficient counting +DEFAULT_COUNT_BATCH_SIZE = 1000 + +# ANSI color codes for terminal output +BOLD_CYAN = "\033[1;36m" +RESET = "\033[0m" + + +@dataclass +class MigrationStats: + """Migration statistics and error tracking""" + + total_source_records: int = 0 + total_batches: int = 0 + successful_batches: int = 0 + failed_batches: int = 0 + successful_records: int = 0 + failed_records: int = 0 + errors: List[Dict[str, Any]] = field(default_factory=list) + + def add_error(self, batch_idx: int, error: Exception, batch_size: int): + """Record batch error""" + self.errors.append( + { + "batch": batch_idx, + "error_type": type(error).__name__, + "error_msg": str(error), + "records_lost": batch_size, + "timestamp": time.time(), + } + ) + self.failed_batches += 1 + self.failed_records += batch_size + + +class MigrationTool: + """LLM Cache Migration Tool""" + + def __init__(self): + self.source_storage = None + self.target_storage = None + self.source_workspace = "" + self.target_workspace = "" + self.batch_size = DEFAULT_BATCH_SIZE + + def get_workspace_for_storage(self, storage_name: str) -> str: + """Get workspace for a specific storage type + + Priority: Storage-specific env var > WORKSPACE env var > empty string + + Args: + storage_name: Storage implementation name + + Returns: + Workspace name + """ + # Check storage-specific workspace + if storage_name in WORKSPACE_ENV_MAP: + specific_workspace = os.getenv(WORKSPACE_ENV_MAP[storage_name]) + if specific_workspace: + return specific_workspace + + # Check generic WORKSPACE + workspace = os.getenv("WORKSPACE", "") + return workspace + + def check_config_ini_for_storage(self, storage_name: str) -> bool: + """Check if config.ini has configuration for the storage type + + Args: + storage_name: Storage implementation name + + Returns: + True if config.ini has the necessary configuration + """ + try: + import configparser + + config = configparser.ConfigParser() + config.read("config.ini", "utf-8") + + if storage_name == "RedisKVStorage": + return config.has_option("redis", "uri") + elif storage_name == "PGKVStorage": + return ( + config.has_option("postgres", "user") + and config.has_option("postgres", "password") + and config.has_option("postgres", "database") + ) + elif storage_name == "MongoKVStorage": + return config.has_option("mongodb", "uri") and config.has_option( + "mongodb", "database" + ) + + return False + except Exception: + return False + + def check_env_vars(self, storage_name: str) -> bool: + """Check environment variables, show warnings if missing but don't fail + + Args: + storage_name: Storage implementation name + + Returns: + Always returns True (warnings only, no hard failure) + """ + required_vars = STORAGE_ENV_REQUIREMENTS.get(storage_name, []) + + if not required_vars: + print("✓ No environment variables required") + return True + + missing_vars = [var for var in required_vars if var not in os.environ] + + if missing_vars: + print( + f"⚠️ Warning: Missing environment variables: {', '.join(missing_vars)}" + ) + + # Check if config.ini has configuration + has_config = self.check_config_ini_for_storage(storage_name) + if has_config: + print(" ✓ Found configuration in config.ini") + else: + print(f" Will attempt to use defaults for {storage_name}") + + return True + + print("✓ All required environment variables are set") + return True + + def count_available_storage_types(self) -> int: + """Count available storage types (with env vars, config.ini, or defaults) + + Returns: + Number of available storage types + """ + available_count = 0 + + for storage_name in STORAGE_TYPES.values(): + # Check if storage requires configuration + required_vars = STORAGE_ENV_REQUIREMENTS.get(storage_name, []) + + if not required_vars: + # JsonKVStorage, MongoKVStorage etc. - no config needed + available_count += 1 + else: + # Check if has environment variables + has_env = all(var in os.environ for var in required_vars) + if has_env: + available_count += 1 + else: + # Check if has config.ini configuration + has_config = self.check_config_ini_for_storage(storage_name) + if has_config: + available_count += 1 + + return available_count + + def get_storage_class(self, storage_name: str): + """Dynamically import and return storage class + + Args: + storage_name: Storage implementation name + + Returns: + Storage class + """ + if storage_name == "JsonKVStorage": + from lightrag.kg.json_kv_impl import JsonKVStorage + + return JsonKVStorage + elif storage_name == "RedisKVStorage": + from lightrag.kg.redis_impl import RedisKVStorage + + return RedisKVStorage + elif storage_name == "PGKVStorage": + from lightrag.kg.postgres_impl import PGKVStorage + + return PGKVStorage + elif storage_name == "MongoKVStorage": + from lightrag.kg.mongo_impl import MongoKVStorage + + return MongoKVStorage + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def initialize_storage(self, storage_name: str, workspace: str): + """Initialize storage instance with fallback to config.ini and defaults + + Args: + storage_name: Storage implementation name + workspace: Workspace name + + Returns: + Initialized storage instance + + Raises: + Exception: If initialization fails + """ + storage_class = self.get_storage_class(storage_name) + + # Create global config + global_config = { + "working_dir": os.getenv("WORKING_DIR", "./rag_storage"), + "embedding_batch_num": 10, + } + + # Initialize storage + storage = storage_class( + namespace=NameSpace.KV_STORE_LLM_RESPONSE_CACHE, + workspace=workspace, + global_config=global_config, + embedding_func=None, + ) + + # Initialize the storage (may raise exception if connection fails) + await storage.initialize() + + return storage + + async def get_default_caches_json(self, storage) -> Dict[str, Any]: + """Get default caches from JsonKVStorage + + Args: + storage: JsonKVStorage instance + + Returns: + Dictionary of cache entries with default:extract:* or default:summary:* keys + """ + # Access _data directly - it's a dict from shared_storage + async with storage._storage_lock: + filtered = {} + for key, value in storage._data.items(): + if key.startswith("default:extract:") or key.startswith( + "default:summary:" + ): + filtered[key] = value.copy() + return filtered + + async def get_default_caches_redis( + self, storage, batch_size: int = 1000 + ) -> Dict[str, Any]: + """Get default caches from RedisKVStorage with pagination + + Args: + storage: RedisKVStorage instance + batch_size: Number of keys to process per batch + + Returns: + Dictionary of cache entries with default:extract:* or default:summary:* keys + """ + import json + + cache_data = {} + + # Use _get_redis_connection() context manager + async with storage._get_redis_connection() as redis: + for pattern in ["default:extract:*", "default:summary:*"]: + # Add namespace prefix to pattern + prefixed_pattern = f"{storage.final_namespace}:{pattern}" + cursor = 0 + + while True: + # SCAN already implements cursor-based pagination + cursor, keys = await redis.scan( + cursor, match=prefixed_pattern, count=batch_size + ) + + if keys: + # Process this batch using pipeline with error handling + try: + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + for key, value in zip(keys, values): + if value: + key_str = ( + key.decode() if isinstance(key, bytes) else key + ) + # Remove namespace prefix to get original key + original_key = key_str.replace( + f"{storage.final_namespace}:", "", 1 + ) + cache_data[original_key] = json.loads(value) + + except Exception as e: + # Pipeline execution failed, fall back to individual gets + print( + f"⚠️ Pipeline execution failed for batch, using individual gets: {e}" + ) + for key in keys: + try: + value = await redis.get(key) + if value: + key_str = ( + key.decode() + if isinstance(key, bytes) + else key + ) + original_key = key_str.replace( + f"{storage.final_namespace}:", "", 1 + ) + cache_data[original_key] = json.loads(value) + except Exception as individual_error: + print( + f"⚠️ Failed to get individual key {key}: {individual_error}" + ) + continue + + if cursor == 0: + break + + # Yield control periodically to avoid blocking + await asyncio.sleep(0) + + return cache_data + + async def get_default_caches_pg( + self, storage, batch_size: int = 1000 + ) -> Dict[str, Any]: + """Get default caches from PGKVStorage with pagination + + Args: + storage: PGKVStorage instance + batch_size: Number of records to fetch per batch + + Returns: + Dictionary of cache entries with default:extract:* or default:summary:* keys + """ + from lightrag.kg.postgres_impl import namespace_to_table_name + + cache_data = {} + table_name = namespace_to_table_name(storage.namespace) + offset = 0 + + while True: + # Use LIMIT and OFFSET for pagination + query = f""" + SELECT id as key, original_prompt, return_value, chunk_id, cache_type, queryparam, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM {table_name} + WHERE workspace = $1 + AND (id LIKE 'default:extract:%' OR id LIKE 'default:summary:%') + ORDER BY id + LIMIT $2 OFFSET $3 + """ + + results = await storage.db.query( + query, [storage.workspace, batch_size, offset], multirows=True + ) + + if not results: + break + + for row in results: + # Map PostgreSQL fields to cache format + cache_entry = { + "return": row.get("return_value", ""), + "cache_type": row.get("cache_type"), + "original_prompt": row.get("original_prompt", ""), + "chunk_id": row.get("chunk_id"), + "queryparam": row.get("queryparam"), + "create_time": row.get("create_time", 0), + "update_time": row.get("update_time", 0), + } + cache_data[row["key"]] = cache_entry + + # If we got fewer results than batch_size, we're done + if len(results) < batch_size: + break + + offset += batch_size + + # Yield control periodically + await asyncio.sleep(0) + + return cache_data + + async def get_default_caches_mongo( + self, storage, batch_size: int = 1000 + ) -> Dict[str, Any]: + """Get default caches from MongoKVStorage with cursor-based pagination + + Args: + storage: MongoKVStorage instance + batch_size: Number of documents to process per batch + + Returns: + Dictionary of cache entries with default:extract:* or default:summary:* keys + """ + cache_data = {} + + # MongoDB query with regex - use _data not collection + query = {"_id": {"$regex": "^default:(extract|summary):"}} + + # Use cursor without to_list() - process in batches + cursor = storage._data.find(query).batch_size(batch_size) + + async for doc in cursor: + # Process each document as it comes + doc_copy = doc.copy() + key = doc_copy.pop("_id") + + # Filter ALL MongoDB/database-specific fields + # Following .clinerules: "Always filter deprecated/incompatible fields during deserialization" + for field_name in ["namespace", "workspace", "_id", "content"]: + doc_copy.pop(field_name, None) + + cache_data[key] = doc_copy.copy() + + # Periodically yield control (every batch_size documents) + if len(cache_data) % batch_size == 0: + await asyncio.sleep(0) + + return cache_data + + async def get_default_caches(self, storage, storage_name: str) -> Dict[str, Any]: + """Get default caches from any storage type + + Args: + storage: Storage instance + storage_name: Storage type name + + Returns: + Dictionary of cache entries + """ + if storage_name == "JsonKVStorage": + return await self.get_default_caches_json(storage) + elif storage_name == "RedisKVStorage": + return await self.get_default_caches_redis(storage) + elif storage_name == "PGKVStorage": + return await self.get_default_caches_pg(storage) + elif storage_name == "MongoKVStorage": + return await self.get_default_caches_mongo(storage) + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def count_default_caches_json(self, storage) -> int: + """Count default caches in JsonKVStorage - O(N) but very fast in-memory + + Args: + storage: JsonKVStorage instance + + Returns: + Total count of cache records + """ + async with storage._storage_lock: + return sum( + 1 + for key in storage._data.keys() + if key.startswith("default:extract:") + or key.startswith("default:summary:") + ) + + async def count_default_caches_redis(self, storage) -> int: + """Count default caches in RedisKVStorage using SCAN with progress display + + Args: + storage: RedisKVStorage instance + + Returns: + Total count of cache records + """ + count = 0 + print("Scanning Redis keys...", end="", flush=True) + + async with storage._get_redis_connection() as redis: + for pattern in ["default:extract:*", "default:summary:*"]: + prefixed_pattern = f"{storage.final_namespace}:{pattern}" + cursor = 0 + while True: + cursor, keys = await redis.scan( + cursor, match=prefixed_pattern, count=DEFAULT_COUNT_BATCH_SIZE + ) + count += len(keys) + + # Show progress + print( + f"\rScanning Redis keys... found {count:,} records", + end="", + flush=True, + ) + + if cursor == 0: + break + + print() # New line after progress + return count + + async def count_default_caches_pg(self, storage) -> int: + """Count default caches in PostgreSQL using COUNT(*) with progress indicator + + Args: + storage: PGKVStorage instance + + Returns: + Total count of cache records + """ + from lightrag.kg.postgres_impl import namespace_to_table_name + + table_name = namespace_to_table_name(storage.namespace) + + query = f""" + SELECT COUNT(*) as count + FROM {table_name} + WHERE workspace = $1 + AND (id LIKE 'default:extract:%' OR id LIKE 'default:summary:%') + """ + + print("Counting PostgreSQL records...", end="", flush=True) + start_time = time.time() + + result = await storage.db.query(query, [storage.workspace]) + + elapsed = time.time() - start_time + if elapsed > 1: + print(f" (took {elapsed:.1f}s)", end="") + print() # New line + + return result["count"] if result else 0 + + async def count_default_caches_mongo(self, storage) -> int: + """Count default caches in MongoDB using count_documents with progress indicator + + Args: + storage: MongoKVStorage instance + + Returns: + Total count of cache records + """ + query = {"_id": {"$regex": "^default:(extract|summary):"}} + + print("Counting MongoDB documents...", end="", flush=True) + start_time = time.time() + + count = await storage._data.count_documents(query) + + elapsed = time.time() - start_time + if elapsed > 1: + print(f" (took {elapsed:.1f}s)", end="") + print() # New line + + return count + + async def count_default_caches(self, storage, storage_name: str) -> int: + """Count default caches from any storage type efficiently + + Args: + storage: Storage instance + storage_name: Storage type name + + Returns: + Total count of cache records + """ + if storage_name == "JsonKVStorage": + return await self.count_default_caches_json(storage) + elif storage_name == "RedisKVStorage": + return await self.count_default_caches_redis(storage) + elif storage_name == "PGKVStorage": + return await self.count_default_caches_pg(storage) + elif storage_name == "MongoKVStorage": + return await self.count_default_caches_mongo(storage) + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def stream_default_caches_json(self, storage, batch_size: int): + """Stream default caches from JsonKVStorage - yields batches + + Args: + storage: JsonKVStorage instance + batch_size: Size of each batch to yield + + Yields: + Dictionary batches of cache entries + + Note: + This method creates a snapshot of matching items while holding the lock, + then releases the lock before yielding batches. This prevents deadlock + when the target storage (also JsonKVStorage) tries to acquire the same + lock during upsert operations. + """ + # Create a snapshot of matching items while holding the lock + async with storage._storage_lock: + matching_items = [ + (key, value) + for key, value in storage._data.items() + if key.startswith("default:extract:") + or key.startswith("default:summary:") + ] + + # Now iterate over snapshot without holding lock + batch = {} + for key, value in matching_items: + batch[key] = value.copy() + if len(batch) >= batch_size: + yield batch + batch = {} + + # Yield remaining items + if batch: + yield batch + + async def stream_default_caches_redis(self, storage, batch_size: int): + """Stream default caches from RedisKVStorage - yields batches + + Args: + storage: RedisKVStorage instance + batch_size: Size of each batch to yield + + Yields: + Dictionary batches of cache entries + """ + import json + + async with storage._get_redis_connection() as redis: + for pattern in ["default:extract:*", "default:summary:*"]: + prefixed_pattern = f"{storage.final_namespace}:{pattern}" + cursor = 0 + + while True: + cursor, keys = await redis.scan( + cursor, match=prefixed_pattern, count=batch_size + ) + + if keys: + try: + pipe = redis.pipeline() + for key in keys: + pipe.get(key) + values = await pipe.execute() + + batch = {} + for key, value in zip(keys, values): + if value: + key_str = ( + key.decode() if isinstance(key, bytes) else key + ) + original_key = key_str.replace( + f"{storage.final_namespace}:", "", 1 + ) + batch[original_key] = json.loads(value) + + if batch: + yield batch + + except Exception as e: + print(f"⚠️ Pipeline execution failed for batch: {e}") + # Fall back to individual gets + batch = {} + for key in keys: + try: + value = await redis.get(key) + if value: + key_str = ( + key.decode() + if isinstance(key, bytes) + else key + ) + original_key = key_str.replace( + f"{storage.final_namespace}:", "", 1 + ) + batch[original_key] = json.loads(value) + except Exception as individual_error: + print( + f"⚠️ Failed to get individual key {key}: {individual_error}" + ) + continue + + if batch: + yield batch + + if cursor == 0: + break + + await asyncio.sleep(0) + + async def stream_default_caches_pg(self, storage, batch_size: int): + """Stream default caches from PostgreSQL - yields batches + + Args: + storage: PGKVStorage instance + batch_size: Size of each batch to yield + + Yields: + Dictionary batches of cache entries + """ + from lightrag.kg.postgres_impl import namespace_to_table_name + + table_name = namespace_to_table_name(storage.namespace) + offset = 0 + + while True: + query = f""" + SELECT id as key, original_prompt, return_value, chunk_id, cache_type, queryparam, + EXTRACT(EPOCH FROM create_time)::BIGINT as create_time, + EXTRACT(EPOCH FROM update_time)::BIGINT as update_time + FROM {table_name} + WHERE workspace = $1 + AND (id LIKE 'default:extract:%' OR id LIKE 'default:summary:%') + ORDER BY id + LIMIT $2 OFFSET $3 + """ + + results = await storage.db.query( + query, [storage.workspace, batch_size, offset], multirows=True + ) + + if not results: + break + + batch = {} + for row in results: + cache_entry = { + "return": row.get("return_value", ""), + "cache_type": row.get("cache_type"), + "original_prompt": row.get("original_prompt", ""), + "chunk_id": row.get("chunk_id"), + "queryparam": row.get("queryparam"), + "create_time": row.get("create_time", 0), + "update_time": row.get("update_time", 0), + } + batch[row["key"]] = cache_entry + + if batch: + yield batch + + if len(results) < batch_size: + break + + offset += batch_size + await asyncio.sleep(0) + + async def stream_default_caches_mongo(self, storage, batch_size: int): + """Stream default caches from MongoDB - yields batches + + Args: + storage: MongoKVStorage instance + batch_size: Size of each batch to yield + + Yields: + Dictionary batches of cache entries + """ + query = {"_id": {"$regex": "^default:(extract|summary):"}} + cursor = storage._data.find(query).batch_size(batch_size) + + batch = {} + async for doc in cursor: + doc_copy = doc.copy() + key = doc_copy.pop("_id") + + # Filter MongoDB/database-specific fields + for field_name in ["namespace", "workspace", "_id", "content"]: + doc_copy.pop(field_name, None) + + batch[key] = doc_copy.copy() + + if len(batch) >= batch_size: + yield batch + batch = {} + + # Yield remaining items + if batch: + yield batch + + async def stream_default_caches( + self, storage, storage_name: str, batch_size: int = None + ): + """Stream default caches from any storage type - unified interface + + Args: + storage: Storage instance + storage_name: Storage type name + batch_size: Size of each batch to yield (defaults to self.batch_size) + + Yields: + Dictionary batches of cache entries + """ + if batch_size is None: + batch_size = self.batch_size + + if storage_name == "JsonKVStorage": + async for batch in self.stream_default_caches_json(storage, batch_size): + yield batch + elif storage_name == "RedisKVStorage": + async for batch in self.stream_default_caches_redis(storage, batch_size): + yield batch + elif storage_name == "PGKVStorage": + async for batch in self.stream_default_caches_pg(storage, batch_size): + yield batch + elif storage_name == "MongoKVStorage": + async for batch in self.stream_default_caches_mongo(storage, batch_size): + yield batch + else: + raise ValueError(f"Unsupported storage type: {storage_name}") + + async def count_cache_types(self, cache_data: Dict[str, Any]) -> Dict[str, int]: + """Count cache entries by type + + Args: + cache_data: Dictionary of cache entries + + Returns: + Dictionary with counts for each cache type + """ + counts = { + "extract": 0, + "summary": 0, + } + + for key in cache_data.keys(): + if key.startswith("default:extract:"): + counts["extract"] += 1 + elif key.startswith("default:summary:"): + counts["summary"] += 1 + + return counts + + def print_header(self): + """Print tool header""" + print("\n" + "=" * 50) + print("LLM Cache Migration Tool - LightRAG") + print("=" * 50) + + def print_storage_types(self): + """Print available storage types""" + print("\nSupported KV Storage Types:") + for key, value in STORAGE_TYPES.items(): + print(f"[{key}] {value}") + + def format_workspace(self, workspace: str) -> str: + """Format workspace name with highlighting + + Args: + workspace: Workspace name (may be empty) + + Returns: + Formatted workspace string with ANSI color codes + """ + if workspace: + return f"{BOLD_CYAN}{workspace}{RESET}" + else: + return f"{BOLD_CYAN}(default){RESET}" + + def format_storage_name(self, storage_name: str) -> str: + """Format storage type name with highlighting + + Args: + storage_name: Storage type name + + Returns: + Formatted storage name string with ANSI color codes + """ + return f"{BOLD_CYAN}{storage_name}{RESET}" + + async def setup_storage( + self, + storage_type: str, + use_streaming: bool = False, + exclude_storage_name: str = None, + ) -> tuple: + """Setup and initialize storage with config.ini fallback support + + Args: + storage_type: Type label (source/target) + use_streaming: If True, only count records without loading. If False, load all data (legacy mode) + exclude_storage_name: Storage type to exclude from selection (e.g., to prevent selecting same as source) + + Returns: + Tuple of (storage_instance, storage_name, workspace, total_count) + Returns (None, None, None, 0) if user chooses to exit + """ + print(f"\n=== {storage_type} Storage Setup ===") + + # Filter and remap available storage types if exclusion is specified + if exclude_storage_name: + # Get available storage types (excluding source) + available_list = [ + (k, v) for k, v in STORAGE_TYPES.items() if v != exclude_storage_name + ] + + # Remap to sequential numbering (1, 2, 3...) + remapped_types = { + str(i + 1): name for i, (_, name) in enumerate(available_list) + } + + # Print available types with new sequential numbers + print( + f"\nAvailable Storage Types for Target (source: {exclude_storage_name} excluded):" + ) + for key, value in remapped_types.items(): + print(f"[{key}] {value}") + + available_types = remapped_types + else: + # For source storage, use original numbering + available_types = STORAGE_TYPES.copy() + self.print_storage_types() + + # Generate dynamic prompt based on number of options + num_options = len(available_types) + if num_options == 1: + prompt_range = "1" + else: + prompt_range = f"1-{num_options}" + + # Custom input handling with exit support + while True: + choice = input( + f"\nSelect {storage_type} storage type ({prompt_range}) (Press Enter to exit): " + ).strip() + + # Check for exit + if choice == "" or choice == "0": + print("\n✓ Migration cancelled by user") + return None, None, None, 0 + + # Check if choice is valid + if choice in available_types: + break + + print( + f"✗ Invalid choice. Please enter one of: {', '.join(available_types.keys())}" + ) + + storage_name = available_types[choice] + + # Check configuration (warnings only, doesn't block) + print("\nChecking configuration...") + self.check_env_vars(storage_name) + + # Get workspace + workspace = self.get_workspace_for_storage(storage_name) + + # Initialize storage (real validation point) + print(f"\nInitializing {storage_type} storage...") + try: + storage = await self.initialize_storage(storage_name, workspace) + print(f"- Storage Type: {storage_name}") + print(f"- Workspace: {workspace if workspace else '(default)'}") + print("- Connection Status: ✓ Success") + + # Show configuration source for transparency + if storage_name == "RedisKVStorage": + config_source = ( + "environment variable" + if "REDIS_URI" in os.environ + else "config.ini or default" + ) + print(f"- Configuration Source: {config_source}") + elif storage_name == "PGKVStorage": + config_source = ( + "environment variables" + if all( + var in os.environ + for var in STORAGE_ENV_REQUIREMENTS[storage_name] + ) + else "config.ini or defaults" + ) + print(f"- Configuration Source: {config_source}") + elif storage_name == "MongoKVStorage": + config_source = ( + "environment variables" + if all( + var in os.environ + for var in STORAGE_ENV_REQUIREMENTS[storage_name] + ) + else "config.ini or defaults" + ) + print(f"- Configuration Source: {config_source}") + + except Exception as e: + print(f"✗ Initialization failed: {e}") + print(f"\nFor {storage_name}, you can configure using:") + print(" 1. Environment variables (highest priority)") + + # Show specific environment variable requirements + if storage_name in STORAGE_ENV_REQUIREMENTS: + for var in STORAGE_ENV_REQUIREMENTS[storage_name]: + print(f" - {var}") + + print(" 2. config.ini file (medium priority)") + if storage_name == "RedisKVStorage": + print(" [redis]") + print(" uri = redis://localhost:6379") + elif storage_name == "PGKVStorage": + print(" [postgres]") + print(" host = localhost") + print(" port = 5432") + print(" user = postgres") + print(" password = yourpassword") + print(" database = lightrag") + elif storage_name == "MongoKVStorage": + print(" [mongodb]") + print(" uri = mongodb://root:root@localhost:27017/") + print(" database = LightRAG") + + return None, None, None, 0 + + # Count cache records efficiently + print(f"\n{'Counting' if use_streaming else 'Loading'} cache records...") + try: + if use_streaming: + # Use efficient counting without loading data + total_count = await self.count_default_caches(storage, storage_name) + print(f"- Total: {total_count:,} records") + else: + # Legacy mode: load all data + cache_data = await self.get_default_caches(storage, storage_name) + counts = await self.count_cache_types(cache_data) + total_count = len(cache_data) + + print(f"- default:extract: {counts['extract']:,} records") + print(f"- default:summary: {counts['summary']:,} records") + print(f"- Total: {total_count:,} records") + except Exception as e: + print(f"✗ {'Counting' if use_streaming else 'Loading'} failed: {e}") + return None, None, None, 0 + + return storage, storage_name, workspace, total_count + + async def migrate_caches( + self, source_data: Dict[str, Any], target_storage, target_storage_name: str + ) -> MigrationStats: + """Migrate caches in batches with error tracking (Legacy mode - loads all data) + + Args: + source_data: Source cache data + target_storage: Target storage instance + target_storage_name: Target storage type name + + Returns: + MigrationStats object with migration results and errors + """ + stats = MigrationStats() + stats.total_source_records = len(source_data) + + if stats.total_source_records == 0: + print("\nNo records to migrate") + return stats + + # Convert to list for batching + items = list(source_data.items()) + stats.total_batches = ( + stats.total_source_records + self.batch_size - 1 + ) // self.batch_size + + print("\n=== Starting Migration ===") + + for batch_idx in range(stats.total_batches): + start_idx = batch_idx * self.batch_size + end_idx = min((batch_idx + 1) * self.batch_size, stats.total_source_records) + batch_items = items[start_idx:end_idx] + batch_data = dict(batch_items) + + # Determine current cache type for display + current_key = batch_items[0][0] + cache_type = "extract" if "extract" in current_key else "summary" + + try: + # Attempt to write batch + await target_storage.upsert(batch_data) + + # Success - update stats + stats.successful_batches += 1 + stats.successful_records += len(batch_data) + + # Calculate progress + progress = (end_idx / stats.total_source_records) * 100 + bar_length = 20 + filled_length = int(bar_length * end_idx // stats.total_source_records) + bar = "█" * filled_length + "░" * (bar_length - filled_length) + + print( + f"Batch {batch_idx + 1}/{stats.total_batches}: {bar} " + f"{end_idx:,}/{stats.total_source_records:,} ({progress:.0f}%) - " + f"default:{cache_type} ✓" + ) + + except Exception as e: + # Error - record and continue + stats.add_error(batch_idx + 1, e, len(batch_data)) + + print( + f"Batch {batch_idx + 1}/{stats.total_batches}: ✗ FAILED - " + f"{type(e).__name__}: {str(e)}" + ) + + # Final persist + print("\nPersisting data to disk...") + try: + await target_storage.index_done_callback() + print("✓ Data persisted successfully") + except Exception as e: + print(f"✗ Persist failed: {e}") + stats.add_error(0, e, 0) # batch 0 = persist error + + return stats + + async def migrate_caches_streaming( + self, + source_storage, + source_storage_name: str, + target_storage, + target_storage_name: str, + total_records: int, + ) -> MigrationStats: + """Migrate caches using streaming approach - minimal memory footprint + + Args: + source_storage: Source storage instance + source_storage_name: Source storage type name + target_storage: Target storage instance + target_storage_name: Target storage type name + total_records: Total number of records to migrate + + Returns: + MigrationStats object with migration results and errors + """ + stats = MigrationStats() + stats.total_source_records = total_records + + if stats.total_source_records == 0: + print("\nNo records to migrate") + return stats + + # Calculate total batches + stats.total_batches = (total_records + self.batch_size - 1) // self.batch_size + + print("\n=== Starting Streaming Migration ===") + print( + f"💡 Memory-optimized mode: Processing {self.batch_size:,} records at a time\n" + ) + + batch_idx = 0 + + # Stream batches from source and write to target immediately + async for batch in self.stream_default_caches( + source_storage, source_storage_name + ): + batch_idx += 1 + + # Determine current cache type for display + if batch: + first_key = next(iter(batch.keys())) + cache_type = "extract" if "extract" in first_key else "summary" + else: + cache_type = "unknown" + + try: + # Write batch to target storage + await target_storage.upsert(batch) + + # Success - update stats + stats.successful_batches += 1 + stats.successful_records += len(batch) + + # Calculate progress with known total + progress = (stats.successful_records / total_records) * 100 + bar_length = 20 + filled_length = int( + bar_length * stats.successful_records // total_records + ) + bar = "█" * filled_length + "░" * (bar_length - filled_length) + + print( + f"Batch {batch_idx}/{stats.total_batches}: {bar} " + f"{stats.successful_records:,}/{total_records:,} ({progress:.1f}%) - " + f"default:{cache_type} ✓" + ) + + except Exception as e: + # Error - record and continue + stats.add_error(batch_idx, e, len(batch)) + + print( + f"Batch {batch_idx}/{stats.total_batches}: ✗ FAILED - " + f"{type(e).__name__}: {str(e)}" + ) + + # Final persist + print("\nPersisting data to disk...") + try: + await target_storage.index_done_callback() + print("✓ Data persisted successfully") + except Exception as e: + print(f"✗ Persist failed: {e}") + stats.add_error(0, e, 0) # batch 0 = persist error + + return stats + + def print_migration_report(self, stats: MigrationStats): + """Print comprehensive migration report + + Args: + stats: MigrationStats object with migration results + """ + print("\n" + "=" * 60) + print("Migration Complete - Final Report") + print("=" * 60) + + # Overall statistics + print("\n📊 Statistics:") + print(f" Total source records: {stats.total_source_records:,}") + print(f" Total batches: {stats.total_batches:,}") + print(f" Successful batches: {stats.successful_batches:,}") + print(f" Failed batches: {stats.failed_batches:,}") + print(f" Successfully migrated: {stats.successful_records:,}") + print(f" Failed to migrate: {stats.failed_records:,}") + + # Success rate + success_rate = ( + (stats.successful_records / stats.total_source_records * 100) + if stats.total_source_records > 0 + else 0 + ) + print(f" Success rate: {success_rate:.2f}%") + + # Error details + if stats.errors: + print(f"\n⚠️ Errors encountered: {len(stats.errors)}") + print("\nError Details:") + print("-" * 60) + + # Group errors by type + error_types = {} + for error in stats.errors: + err_type = error["error_type"] + error_types[err_type] = error_types.get(err_type, 0) + 1 + + print("\nError Summary:") + for err_type, count in sorted(error_types.items(), key=lambda x: -x[1]): + print(f" - {err_type}: {count} occurrence(s)") + + print("\nFirst 5 errors:") + for i, error in enumerate(stats.errors[:5], 1): + print(f"\n {i}. Batch {error['batch']}") + print(f" Type: {error['error_type']}") + print(f" Message: {error['error_msg']}") + print(f" Records lost: {error['records_lost']:,}") + + if len(stats.errors) > 5: + print(f"\n ... and {len(stats.errors) - 5} more errors") + + print("\n" + "=" * 60) + print("⚠️ WARNING: Migration completed with errors!") + print(" Please review the error details above.") + print("=" * 60) + else: + print("\n" + "=" * 60) + print("✓ SUCCESS: All records migrated successfully!") + print("=" * 60) + + async def run(self): + """Run the migration tool with streaming approach and early validation""" + try: + # Initialize shared storage (REQUIRED for storage classes to work) + from lightrag.kg.shared_storage import initialize_share_data + + initialize_share_data(workers=1) + + # Print header + self.print_header() + + # Setup source storage with streaming (only count, don't load all data) + ( + self.source_storage, + source_storage_name, + self.source_workspace, + source_count, + ) = await self.setup_storage("Source", use_streaming=True) + + # Check if user cancelled (setup_storage returns None for all fields) + if self.source_storage is None: + return + + # Check if there are at least 2 storage types available + available_count = self.count_available_storage_types() + if available_count <= 1: + print("\n" + "=" * 60) + print("⚠️ Warning: Migration Not Possible") + print("=" * 60) + print(f"Only {available_count} storage type(s) available.") + print("Migration requires at least 2 different storage types.") + print("\nTo enable migration, configure additional storage:") + print(" 1. Set environment variables, OR") + print(" 2. Update config.ini file") + print("\nSupported storage types:") + for name in STORAGE_TYPES.values(): + if name != source_storage_name: + print(f" - {name}") + if name in STORAGE_ENV_REQUIREMENTS: + for var in STORAGE_ENV_REQUIREMENTS[name]: + print(f" Required: {var}") + print("=" * 60) + + # Cleanup + await self.source_storage.finalize() + return + + if source_count == 0: + print("\n⚠️ Source storage has no cache records to migrate") + # Cleanup + await self.source_storage.finalize() + return + + # Setup target storage with streaming (only count, don't load all data) + # Exclude source storage type from target selection + ( + self.target_storage, + target_storage_name, + self.target_workspace, + target_count, + ) = await self.setup_storage( + "Target", use_streaming=True, exclude_storage_name=source_storage_name + ) + + if not self.target_storage: + print("\n✗ Target storage setup failed") + # Cleanup source + await self.source_storage.finalize() + return + + # Show migration summary + print("\n" + "=" * 50) + print("Migration Confirmation") + print("=" * 50) + print( + f"Source: {self.format_storage_name(source_storage_name)} (workspace: {self.format_workspace(self.source_workspace)}) - {source_count:,} records" + ) + print( + f"Target: {self.format_storage_name(target_storage_name)} (workspace: {self.format_workspace(self.target_workspace)}) - {target_count:,} records" + ) + print(f"Batch Size: {self.batch_size:,} records/batch") + print("Memory Mode: Streaming (memory-optimized)") + + if target_count > 0: + print( + f"\n⚠️ Warning: Target storage already has {target_count:,} records" + ) + print("Migration will overwrite records with the same keys") + + # Confirm migration + confirm = input("\nContinue? (y/n): ").strip().lower() + if confirm != "y": + print("\n✗ Migration cancelled") + # Cleanup + await self.source_storage.finalize() + await self.target_storage.finalize() + return + + # Perform streaming migration with error tracking + stats = await self.migrate_caches_streaming( + self.source_storage, + source_storage_name, + self.target_storage, + target_storage_name, + source_count, + ) + + # Print comprehensive migration report + self.print_migration_report(stats) + + # Cleanup + await self.source_storage.finalize() + await self.target_storage.finalize() + + except KeyboardInterrupt: + print("\n\n✗ Migration interrupted by user") + except Exception as e: + print(f"\n✗ Migration failed: {e}") + import traceback + + traceback.print_exc() + finally: + # Ensure cleanup + if self.source_storage: + try: + await self.source_storage.finalize() + except Exception: + pass + if self.target_storage: + try: + await self.target_storage.finalize() + except Exception: + pass + + # Finalize shared storage + try: + from lightrag.kg.shared_storage import finalize_share_data + + finalize_share_data() + except Exception: + pass + + +async def main(): + """Main entry point""" + tool = MigrationTool() + await tool.run() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/LightRAG/lightrag/types.py b/LightRAG/lightrag/types.py new file mode 100644 index 00000000..a18f2d3c --- /dev/null +++ b/LightRAG/lightrag/types.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from pydantic import BaseModel +from typing import Any, Optional + + +class GPTKeywordExtractionFormat(BaseModel): + high_level_keywords: list[str] + low_level_keywords: list[str] + + +class KnowledgeGraphNode(BaseModel): + id: str + labels: list[str] + properties: dict[str, Any] # anything else goes here + + +class KnowledgeGraphEdge(BaseModel): + id: str + type: Optional[str] + source: str # id of source node + target: str # id of target node + properties: dict[str, Any] # anything else goes here + + +class KnowledgeGraph(BaseModel): + nodes: list[KnowledgeGraphNode] = [] + edges: list[KnowledgeGraphEdge] = [] + is_truncated: bool = False diff --git a/LightRAG/lightrag/utils.py b/LightRAG/lightrag/utils.py new file mode 100644 index 00000000..d653c1e3 --- /dev/null +++ b/LightRAG/lightrag/utils.py @@ -0,0 +1,3159 @@ +from __future__ import annotations +import weakref + +import asyncio +import html +import csv +import json +import logging +import logging.handlers +import os +import re +import time +import uuid +from dataclasses import dataclass +from datetime import datetime +from functools import wraps +from hashlib import md5 +from typing import ( + Any, + Protocol, + Callable, + TYPE_CHECKING, + List, + Optional, + Iterable, + Sequence, + Collection, +) +import numpy as np +from dotenv import load_dotenv + +from lightrag.constants import ( + DEFAULT_LOG_MAX_BYTES, + DEFAULT_LOG_BACKUP_COUNT, + DEFAULT_LOG_FILENAME, + GRAPH_FIELD_SEP, + DEFAULT_MAX_TOTAL_TOKENS, + DEFAULT_SOURCE_IDS_LIMIT_METHOD, + VALID_SOURCE_IDS_LIMIT_METHODS, + SOURCE_IDS_LIMIT_METHOD_FIFO, +) + +# Initialize logger with basic configuration +logger = logging.getLogger("lightrag") +logger.propagate = False # prevent log message send to root logger +logger.setLevel(logging.INFO) + +# Add console handler if no handlers exist +if not logger.handlers: + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + formatter = logging.Formatter("%(levelname)s: %(message)s") + console_handler.setFormatter(formatter) + logger.addHandler(console_handler) + +# Set httpx logging level to WARNING +logging.getLogger("httpx").setLevel(logging.WARNING) + +# Precompile regex pattern for JSON sanitization (module-level, compiled once) +_SURROGATE_PATTERN = re.compile(r"[\uD800-\uDFFF\uFFFE\uFFFF]") + +# Global import for pypinyin with startup-time logging +try: + import pypinyin + + _PYPINYIN_AVAILABLE = True + # logger.info("pypinyin loaded successfully for Chinese pinyin sorting") +except ImportError: + pypinyin = None + _PYPINYIN_AVAILABLE = False + logger.warning( + "pypinyin is not installed. Chinese pinyin sorting will use simple string sorting." + ) + + +async def safe_vdb_operation_with_exception( + operation: Callable, + operation_name: str, + entity_name: str = "", + max_retries: int = 3, + retry_delay: float = 0.2, + logger_func: Optional[Callable] = None, +) -> None: + """ + Safely execute vector database operations with retry mechanism and exception handling. + + This function ensures that VDB operations are executed with proper error handling + and retry logic. If all retries fail, it raises an exception to maintain data consistency. + + Args: + operation: The async operation to execute + operation_name: Operation name for logging purposes + entity_name: Entity name for logging purposes + max_retries: Maximum number of retry attempts + retry_delay: Delay between retries in seconds + logger_func: Logger function to use for error messages + + Raises: + Exception: When operation fails after all retry attempts + """ + log_func = logger_func or logger.warning + + for attempt in range(max_retries): + try: + await operation() + return # Success, return immediately + except Exception as e: + if attempt >= max_retries - 1: + error_msg = f"VDB {operation_name} failed for {entity_name} after {max_retries} attempts: {e}" + log_func(error_msg) + raise Exception(error_msg) from e + else: + log_func( + f"VDB {operation_name} attempt {attempt + 1} failed for {entity_name}: {e}, retrying..." + ) + if retry_delay > 0: + await asyncio.sleep(retry_delay) + + +def get_env_value( + env_key: str, default: any, value_type: type = str, special_none: bool = False +) -> any: + """ + Get value from environment variable with type conversion + + Args: + env_key (str): Environment variable key + default (any): Default value if env variable is not set + value_type (type): Type to convert the value to + special_none (bool): If True, return None when value is "None" + + Returns: + any: Converted value from environment or default + """ + value = os.getenv(env_key) + if value is None: + return default + + # Handle special case for "None" string + if special_none and value == "None": + return None + + if value_type is bool: + return value.lower() in ("true", "1", "yes", "t", "on") + + # Handle list type with JSON parsing + if value_type is list: + try: + import json + + parsed_value = json.loads(value) + # Ensure the parsed value is actually a list + if isinstance(parsed_value, list): + return parsed_value + else: + logger.warning( + f"Environment variable {env_key} is not a valid JSON list, using default" + ) + return default + except (json.JSONDecodeError, ValueError) as e: + logger.warning( + f"Failed to parse {env_key} as JSON list: {e}, using default" + ) + return default + + try: + return value_type(value) + except (ValueError, TypeError): + return default + + +# Use TYPE_CHECKING to avoid circular imports +if TYPE_CHECKING: + from lightrag.base import BaseKVStorage, BaseVectorStorage, QueryParam + +# use the .env that is inside the current folder +# allows to use different .env file for each lightrag instance +# the OS environment variables take precedence over the .env file +load_dotenv(dotenv_path=".env", override=False) + +VERBOSE_DEBUG = os.getenv("VERBOSE", "false").lower() == "true" + + +def verbose_debug(msg: str, *args, **kwargs): + """Function for outputting detailed debug information. + When VERBOSE_DEBUG=True, outputs the complete message. + When VERBOSE_DEBUG=False, outputs only the first 50 characters. + + Args: + msg: The message format string + *args: Arguments to be formatted into the message + **kwargs: Keyword arguments passed to logger.debug() + """ + if VERBOSE_DEBUG: + logger.debug(msg, *args, **kwargs) + else: + # Format the message with args first + if args: + formatted_msg = msg % args + else: + formatted_msg = msg + # Then truncate the formatted message + truncated_msg = ( + formatted_msg[:150] + "..." if len(formatted_msg) > 150 else formatted_msg + ) + # Remove consecutive newlines + truncated_msg = re.sub(r"\n+", "\n", truncated_msg) + logger.debug(truncated_msg, **kwargs) + + +def set_verbose_debug(enabled: bool): + """Enable or disable verbose debug output""" + global VERBOSE_DEBUG + VERBOSE_DEBUG = enabled + + +statistic_data = {"llm_call": 0, "llm_cache": 0, "embed_call": 0} + + +class LightragPathFilter(logging.Filter): + """Filter for lightrag logger to filter out frequent path access logs""" + + def __init__(self): + super().__init__() + # Define paths to be filtered + self.filtered_paths = [ + "/documents", + "/documents/paginated", + "/health", + "/webui/", + "/documents/pipeline_status", + ] + # self.filtered_paths = ["/health", "/webui/"] + + def filter(self, record): + try: + # Check if record has the required attributes for an access log + if not hasattr(record, "args") or not isinstance(record.args, tuple): + return True + if len(record.args) < 5: + return True + + # Extract method, path and status from the record args + method = record.args[1] + path = record.args[2] + status = record.args[4] + + # Filter out successful GET/POST requests to filtered paths + if ( + (method == "GET" or method == "POST") + and (status == 200 or status == 304) + and path in self.filtered_paths + ): + return False + + return True + except Exception: + # In case of any error, let the message through + return True + + +def setup_logger( + logger_name: str, + level: str = "INFO", + add_filter: bool = False, + log_file_path: str | None = None, + enable_file_logging: bool = True, +): + """Set up a logger with console and optionally file handlers + + Args: + logger_name: Name of the logger to set up + level: Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) + add_filter: Whether to add LightragPathFilter to the logger + log_file_path: Path to the log file. If None and file logging is enabled, defaults to lightrag.log in LOG_DIR or cwd + enable_file_logging: Whether to enable logging to a file (defaults to True) + """ + # Configure formatters + detailed_formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + simple_formatter = logging.Formatter("%(levelname)s: %(message)s") + + logger_instance = logging.getLogger(logger_name) + logger_instance.setLevel(level) + logger_instance.handlers = [] # Clear existing handlers + logger_instance.propagate = False + + # Add console handler + console_handler = logging.StreamHandler() + console_handler.setFormatter(simple_formatter) + console_handler.setLevel(level) + logger_instance.addHandler(console_handler) + + # Add file handler by default unless explicitly disabled + if enable_file_logging: + # Get log file path + if log_file_path is None: + log_dir = os.getenv("LOG_DIR", os.getcwd()) + log_file_path = os.path.abspath(os.path.join(log_dir, DEFAULT_LOG_FILENAME)) + + # Ensure log directory exists + os.makedirs(os.path.dirname(log_file_path), exist_ok=True) + + # Get log file max size and backup count from environment variables + log_max_bytes = get_env_value("LOG_MAX_BYTES", DEFAULT_LOG_MAX_BYTES, int) + log_backup_count = get_env_value( + "LOG_BACKUP_COUNT", DEFAULT_LOG_BACKUP_COUNT, int + ) + + try: + # Add file handler + file_handler = logging.handlers.RotatingFileHandler( + filename=log_file_path, + maxBytes=log_max_bytes, + backupCount=log_backup_count, + encoding="utf-8", + ) + file_handler.setFormatter(detailed_formatter) + file_handler.setLevel(level) + logger_instance.addHandler(file_handler) + except PermissionError as e: + logger.warning(f"Could not create log file at {log_file_path}: {str(e)}") + logger.warning("Continuing with console logging only") + + # Add path filter if requested + if add_filter: + path_filter = LightragPathFilter() + logger_instance.addFilter(path_filter) + + +class UnlimitedSemaphore: + """A context manager that allows unlimited access.""" + + async def __aenter__(self): + pass + + async def __aexit__(self, exc_type, exc, tb): + pass + + +@dataclass +class TaskState: + """Task state tracking for priority queue management""" + + future: asyncio.Future + start_time: float + execution_start_time: float = None + worker_started: bool = False + cancellation_requested: bool = False + cleanup_done: bool = False + + +@dataclass +class EmbeddingFunc: + embedding_dim: int + func: callable + max_token_size: int | None = None # Token limit for the embedding model + send_dimensions: bool = ( + False # Control whether to send embedding_dim to the function + ) + + async def __call__(self, *args, **kwargs) -> np.ndarray: + # Only inject embedding_dim when send_dimensions is True + if self.send_dimensions: + # Check if user provided embedding_dim parameter + if "embedding_dim" in kwargs: + user_provided_dim = kwargs["embedding_dim"] + # If user's value differs from class attribute, output warning + if ( + user_provided_dim is not None + and user_provided_dim != self.embedding_dim + ): + logger.warning( + f"Ignoring user-provided embedding_dim={user_provided_dim}, " + f"using declared embedding_dim={self.embedding_dim} from decorator" + ) + + # Inject embedding_dim from decorator + kwargs["embedding_dim"] = self.embedding_dim + + return await self.func(*args, **kwargs) + + +def compute_args_hash(*args: Any) -> str: + """Compute a hash for the given arguments with safe Unicode handling. + + Args: + *args: Arguments to hash + Returns: + str: Hash string + """ + # Convert all arguments to strings and join them + args_str = "".join([str(arg) for arg in args]) + + # Use 'replace' error handling to safely encode problematic Unicode characters + # This replaces invalid characters with Unicode replacement character (U+FFFD) + try: + return md5(args_str.encode("utf-8")).hexdigest() + except UnicodeEncodeError: + # Handle surrogate characters and other encoding issues + safe_bytes = args_str.encode("utf-8", errors="replace") + return md5(safe_bytes).hexdigest() + + +def compute_mdhash_id(content: str, prefix: str = "") -> str: + """ + Compute a unique ID for a given content string. + + The ID is a combination of the given prefix and the MD5 hash of the content string. + """ + return prefix + compute_args_hash(content) + + +def generate_cache_key(mode: str, cache_type: str, hash_value: str) -> str: + """Generate a flattened cache key in the format {mode}:{cache_type}:{hash} + + Args: + mode: Cache mode (e.g., 'default', 'local', 'global') + cache_type: Type of cache (e.g., 'extract', 'query', 'keywords') + hash_value: Hash value from compute_args_hash + + Returns: + str: Flattened cache key + """ + return f"{mode}:{cache_type}:{hash_value}" + + +def parse_cache_key(cache_key: str) -> tuple[str, str, str] | None: + """Parse a flattened cache key back into its components + + Args: + cache_key: Flattened cache key in format {mode}:{cache_type}:{hash} + + Returns: + tuple[str, str, str] | None: (mode, cache_type, hash) or None if invalid format + """ + parts = cache_key.split(":", 2) + if len(parts) == 3: + return parts[0], parts[1], parts[2] + return None + + +# Custom exception classes +class QueueFullError(Exception): + """Raised when the queue is full and the wait times out""" + + pass + + +class WorkerTimeoutError(Exception): + """Worker-level timeout exception with specific timeout information""" + + def __init__(self, timeout_value: float, timeout_type: str = "execution"): + self.timeout_value = timeout_value + self.timeout_type = timeout_type + super().__init__(f"Worker {timeout_type} timeout after {timeout_value}s") + + +class HealthCheckTimeoutError(Exception): + """Health Check-level timeout exception""" + + def __init__(self, timeout_value: float, execution_duration: float): + self.timeout_value = timeout_value + self.execution_duration = execution_duration + super().__init__( + f"Task forcefully terminated due to execution timeout (>{timeout_value}s, actual: {execution_duration:.1f}s)" + ) + + +def priority_limit_async_func_call( + max_size: int, + llm_timeout: float = None, + max_execution_timeout: float = None, + max_task_duration: float = None, + max_queue_size: int = 1000, + cleanup_timeout: float = 2.0, + queue_name: str = "limit_async", +): + """ + Enhanced priority-limited asynchronous function call decorator with robust timeout handling + + This decorator provides a comprehensive solution for managing concurrent LLM requests with: + - Multi-layer timeout protection (LLM -> Worker -> Health Check -> User) + - Task state tracking to prevent race conditions + - Enhanced health check system with stuck task detection + - Proper resource cleanup and error recovery + + Args: + max_size: Maximum number of concurrent calls + max_queue_size: Maximum queue capacity to prevent memory overflow + llm_timeout: LLM provider timeout (from global config), used to calculate other timeouts + max_execution_timeout: Maximum time for worker to execute function (defaults to llm_timeout + 30s) + max_task_duration: Maximum time before health check intervenes (defaults to llm_timeout + 60s) + cleanup_timeout: Maximum time to wait for cleanup operations (defaults to 2.0s) + queue_name: Optional queue name for logging identification (defaults to "limit_async") + + Returns: + Decorator function + """ + + def final_decro(func): + # Ensure func is callable + if not callable(func): + raise TypeError(f"Expected a callable object, got {type(func)}") + + # Calculate timeout hierarchy if llm_timeout is provided (Dynamic Timeout Calculation) + if llm_timeout is not None: + nonlocal max_execution_timeout, max_task_duration + if max_execution_timeout is None: + max_execution_timeout = ( + llm_timeout * 2 + ) # Reserved timeout buffer for low-level retry + if max_task_duration is None: + max_task_duration = ( + llm_timeout * 2 + 15 + ) # Reserved timeout buffer for health check phase + + queue = asyncio.PriorityQueue(maxsize=max_queue_size) + tasks = set() + initialization_lock = asyncio.Lock() + counter = 0 + shutdown_event = asyncio.Event() + initialized = False + worker_health_check_task = None + + # Enhanced task state management + task_states = {} # task_id -> TaskState + task_states_lock = asyncio.Lock() + active_futures = weakref.WeakSet() + reinit_count = 0 + + async def worker(): + """Enhanced worker that processes tasks with proper timeout and state management""" + try: + while not shutdown_event.is_set(): + try: + # Get task from queue with timeout for shutdown checking + try: + ( + priority, + count, + task_id, + args, + kwargs, + ) = await asyncio.wait_for(queue.get(), timeout=1.0) + except asyncio.TimeoutError: + continue + + # Get task state and mark worker as started + async with task_states_lock: + if task_id not in task_states: + queue.task_done() + continue + task_state = task_states[task_id] + task_state.worker_started = True + # Record execution start time when worker actually begins processing + task_state.execution_start_time = ( + asyncio.get_event_loop().time() + ) + + # Check if task was cancelled before worker started + if ( + task_state.cancellation_requested + or task_state.future.cancelled() + ): + async with task_states_lock: + task_states.pop(task_id, None) + queue.task_done() + continue + + try: + # Execute function with timeout protection + if max_execution_timeout is not None: + result = await asyncio.wait_for( + func(*args, **kwargs), timeout=max_execution_timeout + ) + else: + result = await func(*args, **kwargs) + + # Set result if future is still valid + if not task_state.future.done(): + task_state.future.set_result(result) + + except asyncio.TimeoutError: + # Worker-level timeout (max_execution_timeout exceeded) + logger.warning( + f"{queue_name}: Worker timeout for task {task_id} after {max_execution_timeout}s" + ) + if not task_state.future.done(): + task_state.future.set_exception( + WorkerTimeoutError( + max_execution_timeout, "execution" + ) + ) + except asyncio.CancelledError: + # Task was cancelled during execution + if not task_state.future.done(): + task_state.future.cancel() + logger.debug( + f"{queue_name}: Task {task_id} cancelled during execution" + ) + except Exception as e: + # Function execution error + logger.error( + f"{queue_name}: Error in decorated function for task {task_id}: {str(e)}" + ) + if not task_state.future.done(): + task_state.future.set_exception(e) + finally: + # Clean up task state + async with task_states_lock: + task_states.pop(task_id, None) + queue.task_done() + + except Exception as e: + # Critical error in worker loop + logger.error( + f"{queue_name}: Critical error in worker: {str(e)}" + ) + await asyncio.sleep(0.1) + finally: + logger.debug(f"{queue_name}: Worker exiting") + + async def enhanced_health_check(): + """Enhanced health check with stuck task detection and recovery""" + nonlocal initialized + try: + while not shutdown_event.is_set(): + await asyncio.sleep(5) # Check every 5 seconds + + current_time = asyncio.get_event_loop().time() + + # Detect and handle stuck tasks based on execution start time + if max_task_duration is not None: + stuck_tasks = [] + async with task_states_lock: + for task_id, task_state in list(task_states.items()): + # Only check tasks that have started execution + if ( + task_state.worker_started + and task_state.execution_start_time is not None + and current_time - task_state.execution_start_time + > max_task_duration + ): + stuck_tasks.append( + ( + task_id, + current_time + - task_state.execution_start_time, + ) + ) + + # Force cleanup of stuck tasks + for task_id, execution_duration in stuck_tasks: + logger.warning( + f"{queue_name}: Detected stuck task {task_id} (execution time: {execution_duration:.1f}s), forcing cleanup" + ) + async with task_states_lock: + if task_id in task_states: + task_state = task_states[task_id] + if not task_state.future.done(): + task_state.future.set_exception( + HealthCheckTimeoutError( + max_task_duration, execution_duration + ) + ) + task_states.pop(task_id, None) + + # Worker recovery logic + current_tasks = set(tasks) + done_tasks = {t for t in current_tasks if t.done()} + tasks.difference_update(done_tasks) + + active_tasks_count = len(tasks) + workers_needed = max_size - active_tasks_count + + if workers_needed > 0: + logger.info( + f"{queue_name}: Creating {workers_needed} new workers" + ) + new_tasks = set() + for _ in range(workers_needed): + task = asyncio.create_task(worker()) + new_tasks.add(task) + task.add_done_callback(tasks.discard) + tasks.update(new_tasks) + + except Exception as e: + logger.error(f"{queue_name}: Error in enhanced health check: {str(e)}") + finally: + logger.debug(f"{queue_name}: Enhanced health check task exiting") + initialized = False + + async def ensure_workers(): + """Ensure worker system is initialized with enhanced error handling""" + nonlocal initialized, worker_health_check_task, tasks, reinit_count + + if initialized: + return + + async with initialization_lock: + if initialized: + return + + if reinit_count > 0: + reinit_count += 1 + logger.warning( + f"{queue_name}: Reinitializing system (count: {reinit_count})" + ) + else: + reinit_count = 1 + + # Clean up completed tasks + current_tasks = set(tasks) + done_tasks = {t for t in current_tasks if t.done()} + tasks.difference_update(done_tasks) + + active_tasks_count = len(tasks) + if active_tasks_count > 0 and reinit_count > 1: + logger.warning( + f"{queue_name}: {active_tasks_count} tasks still running during reinitialization" + ) + + # Create worker tasks + workers_needed = max_size - active_tasks_count + for _ in range(workers_needed): + task = asyncio.create_task(worker()) + tasks.add(task) + task.add_done_callback(tasks.discard) + + # Start enhanced health check + worker_health_check_task = asyncio.create_task(enhanced_health_check()) + + initialized = True + # Log dynamic timeout configuration + timeout_info = [] + if llm_timeout is not None: + timeout_info.append(f"Func: {llm_timeout}s") + if max_execution_timeout is not None: + timeout_info.append(f"Worker: {max_execution_timeout}s") + if max_task_duration is not None: + timeout_info.append(f"Health Check: {max_task_duration}s") + + timeout_str = ( + f"(Timeouts: {', '.join(timeout_info)})" if timeout_info else "" + ) + logger.info( + f"{queue_name}: {workers_needed} new workers initialized {timeout_str}" + ) + + async def shutdown(): + """Gracefully shut down all workers and cleanup resources""" + logger.info(f"{queue_name}: Shutting down priority queue workers") + + shutdown_event.set() + + # Cancel all active futures + for future in list(active_futures): + if not future.done(): + future.cancel() + + # Cancel all pending tasks + async with task_states_lock: + for task_id, task_state in list(task_states.items()): + if not task_state.future.done(): + task_state.future.cancel() + task_states.clear() + + # Wait for queue to empty with timeout + try: + await asyncio.wait_for(queue.join(), timeout=5.0) + except asyncio.TimeoutError: + logger.warning( + f"{queue_name}: Timeout waiting for queue to empty during shutdown" + ) + + # Cancel worker tasks + for task in list(tasks): + if not task.done(): + task.cancel() + + # Wait for all tasks to complete + if tasks: + await asyncio.gather(*tasks, return_exceptions=True) + + # Cancel health check task + if worker_health_check_task and not worker_health_check_task.done(): + worker_health_check_task.cancel() + try: + await worker_health_check_task + except asyncio.CancelledError: + pass + + logger.info(f"{queue_name}: Priority queue workers shutdown complete") + + @wraps(func) + async def wait_func( + *args, _priority=10, _timeout=None, _queue_timeout=None, **kwargs + ): + """ + Execute function with enhanced priority-based concurrency control and timeout handling + + Args: + *args: Positional arguments passed to the function + _priority: Call priority (lower values have higher priority) + _timeout: Maximum time to wait for completion (in seconds, none means determinded by max_execution_timeout of the queue) + _queue_timeout: Maximum time to wait for entering the queue (in seconds) + **kwargs: Keyword arguments passed to the function + + Returns: + The result of the function call + + Raises: + TimeoutError: If the function call times out at any level + QueueFullError: If the queue is full and waiting times out + Any exception raised by the decorated function + """ + await ensure_workers() + + # Generate unique task ID + task_id = f"{id(asyncio.current_task())}_{asyncio.get_event_loop().time()}" + future = asyncio.Future() + + # Create task state + task_state = TaskState( + future=future, start_time=asyncio.get_event_loop().time() + ) + + try: + # Register task state + async with task_states_lock: + task_states[task_id] = task_state + + active_futures.add(future) + + # Get counter for FIFO ordering + nonlocal counter + async with initialization_lock: + current_count = counter + counter += 1 + + # Queue the task with timeout handling + try: + if _queue_timeout is not None: + await asyncio.wait_for( + queue.put( + (_priority, current_count, task_id, args, kwargs) + ), + timeout=_queue_timeout, + ) + else: + await queue.put( + (_priority, current_count, task_id, args, kwargs) + ) + except asyncio.TimeoutError: + raise QueueFullError( + f"{queue_name}: Queue full, timeout after {_queue_timeout} seconds" + ) + except Exception as e: + # Clean up on queue error + if not future.done(): + future.set_exception(e) + raise + + # Wait for result with timeout handling + try: + if _timeout is not None: + return await asyncio.wait_for(future, _timeout) + else: + return await future + except asyncio.TimeoutError: + # This is user-level timeout (asyncio.wait_for caused) + # Mark cancellation request + async with task_states_lock: + if task_id in task_states: + task_states[task_id].cancellation_requested = True + + # Cancel future + if not future.done(): + future.cancel() + + # Wait for worker cleanup with timeout + cleanup_start = asyncio.get_event_loop().time() + while ( + task_id in task_states + and asyncio.get_event_loop().time() - cleanup_start + < cleanup_timeout + ): + await asyncio.sleep(0.1) + + raise TimeoutError( + f"{queue_name}: User timeout after {_timeout} seconds" + ) + except WorkerTimeoutError as e: + # This is Worker-level timeout, directly propagate exception information + raise TimeoutError(f"{queue_name}: {str(e)}") + except HealthCheckTimeoutError as e: + # This is Health Check-level timeout, directly propagate exception information + raise TimeoutError(f"{queue_name}: {str(e)}") + + finally: + # Ensure cleanup + active_futures.discard(future) + async with task_states_lock: + task_states.pop(task_id, None) + + # Add shutdown method to decorated function + wait_func.shutdown = shutdown + + return wait_func + + return final_decro + + +def wrap_embedding_func_with_attrs(**kwargs): + """Wrap a function with attributes""" + + def final_decro(func) -> EmbeddingFunc: + new_func = EmbeddingFunc(**kwargs, func=func) + return new_func + + return final_decro + + +def load_json(file_name): + if not os.path.exists(file_name): + return None + with open(file_name, encoding="utf-8-sig") as f: + return json.load(f) + + +def _sanitize_string_for_json(text: str) -> str: + """Remove characters that cannot be encoded in UTF-8 for JSON serialization. + + Uses regex for optimal performance with zero-copy optimization for clean strings. + Fast detection path for clean strings (99% of cases) with efficient removal for dirty strings. + + Args: + text: String to sanitize + + Returns: + Original string if clean (zero-copy), sanitized string if dirty + """ + if not text: + return text + + # Fast path: Check if sanitization is needed using C-level regex search + if not _SURROGATE_PATTERN.search(text): + return text # Zero-copy for clean strings - most common case + + # Slow path: Remove problematic characters using C-level regex substitution + return _SURROGATE_PATTERN.sub("", text) + + +class SanitizingJSONEncoder(json.JSONEncoder): + """ + Custom JSON encoder that sanitizes data during serialization. + + This encoder cleans strings during the encoding process without creating + a full copy of the data structure, making it memory-efficient for large datasets. + """ + + def encode(self, o): + """Override encode method to handle simple string cases""" + if isinstance(o, str): + return json.encoder.encode_basestring(_sanitize_string_for_json(o)) + return super().encode(o) + + def iterencode(self, o, _one_shot=False): + """ + Override iterencode to sanitize strings during serialization. + This is the core method that handles complex nested structures. + """ + # Preprocess: sanitize all strings in the object + sanitized = self._sanitize_for_encoding(o) + + # Call parent's iterencode with sanitized data + for chunk in super().iterencode(sanitized, _one_shot): + yield chunk + + def _sanitize_for_encoding(self, obj): + """ + Recursively sanitize strings in an object. + Creates new objects only when necessary to avoid deep copies. + + Args: + obj: Object to sanitize + + Returns: + Sanitized object with cleaned strings + """ + if isinstance(obj, str): + return _sanitize_string_for_json(obj) + + elif isinstance(obj, dict): + # Create new dict with sanitized keys and values + new_dict = {} + for k, v in obj.items(): + clean_k = _sanitize_string_for_json(k) if isinstance(k, str) else k + clean_v = self._sanitize_for_encoding(v) + new_dict[clean_k] = clean_v + return new_dict + + elif isinstance(obj, (list, tuple)): + # Sanitize list/tuple elements + cleaned = [self._sanitize_for_encoding(item) for item in obj] + return type(obj)(cleaned) if isinstance(obj, tuple) else cleaned + + else: + # Numbers, booleans, None, etc. remain unchanged + return obj + + +def write_json(json_obj, file_name): + """ + Write JSON data to file with optimized sanitization strategy. + + This function uses a two-stage approach: + 1. Fast path: Try direct serialization (works for clean data ~99% of time) + 2. Slow path: Use custom encoder that sanitizes during serialization + + The custom encoder approach avoids creating a deep copy of the data, + making it memory-efficient. When sanitization occurs, the caller should + reload the cleaned data from the file to update shared memory. + + Args: + json_obj: Object to serialize (may be a shallow copy from shared memory) + file_name: Output file path + + Returns: + bool: True if sanitization was applied (caller should reload data), + False if direct write succeeded (no reload needed) + """ + try: + # Strategy 1: Fast path - try direct serialization + with open(file_name, "w", encoding="utf-8") as f: + json.dump(json_obj, f, indent=2, ensure_ascii=False) + return False # No sanitization needed, no reload required + + except (UnicodeEncodeError, UnicodeDecodeError) as e: + logger.debug(f"Direct JSON write failed, using sanitizing encoder: {e}") + + # Strategy 2: Use custom encoder (sanitizes during serialization, zero memory copy) + with open(file_name, "w", encoding="utf-8") as f: + json.dump(json_obj, f, indent=2, ensure_ascii=False, cls=SanitizingJSONEncoder) + + logger.info(f"JSON sanitization applied during write: {file_name}") + return True # Sanitization applied, reload recommended + + +class TokenizerInterface(Protocol): + """ + Defines the interface for a tokenizer, requiring encode and decode methods. + """ + + def encode(self, content: str) -> List[int]: + """Encodes a string into a list of tokens.""" + ... + + def decode(self, tokens: List[int]) -> str: + """Decodes a list of tokens into a string.""" + ... + + +class Tokenizer: + """ + A wrapper around a tokenizer to provide a consistent interface for encoding and decoding. + """ + + def __init__(self, model_name: str, tokenizer: TokenizerInterface): + """ + Initializes the Tokenizer with a tokenizer model name and a tokenizer instance. + + Args: + model_name: The associated model name for the tokenizer. + tokenizer: An instance of a class implementing the TokenizerInterface. + """ + self.model_name: str = model_name + self.tokenizer: TokenizerInterface = tokenizer + + def encode(self, content: str) -> List[int]: + """ + Encodes a string into a list of tokens using the underlying tokenizer. + + Args: + content: The string to encode. + + Returns: + A list of integer tokens. + """ + return self.tokenizer.encode(content) + + def decode(self, tokens: List[int]) -> str: + """ + Decodes a list of tokens into a string using the underlying tokenizer. + + Args: + tokens: A list of integer tokens to decode. + + Returns: + The decoded string. + """ + return self.tokenizer.decode(tokens) + + +class TiktokenTokenizer(Tokenizer): + """ + A Tokenizer implementation using the tiktoken library. + """ + + def __init__(self, model_name: str = "gpt-4o-mini"): + """ + Initializes the TiktokenTokenizer with a specified model name. + + Args: + model_name: The model name for the tiktoken tokenizer to use. Defaults to "gpt-4o-mini". + + Raises: + ImportError: If tiktoken is not installed. + ValueError: If the model_name is invalid. + """ + try: + import tiktoken + except ImportError: + raise ImportError( + "tiktoken is not installed. Please install it with `pip install tiktoken` or define custom `tokenizer_func`." + ) + + try: + tokenizer = tiktoken.encoding_for_model(model_name) + super().__init__(model_name=model_name, tokenizer=tokenizer) + except KeyError: + raise ValueError(f"Invalid model_name: {model_name}.") + + +def pack_user_ass_to_openai_messages(*args: str): + roles = ["user", "assistant"] + return [ + {"role": roles[i % 2], "content": content} for i, content in enumerate(args) + ] + + +def split_string_by_multi_markers(content: str, markers: list[str]) -> list[str]: + """Split a string by multiple markers""" + if not markers: + return [content] + content = content if content is not None else "" + results = re.split("|".join(re.escape(marker) for marker in markers), content) + return [r.strip() for r in results if r.strip()] + + +def is_float_regex(value: str) -> bool: + return bool(re.match(r"^[-+]?[0-9]*\.?[0-9]+$", value)) + + +def truncate_list_by_token_size( + list_data: list[Any], + key: Callable[[Any], str], + max_token_size: int, + tokenizer: Tokenizer, +) -> list[int]: + """Truncate a list of data by token size""" + if max_token_size <= 0: + return [] + tokens = 0 + for i, data in enumerate(list_data): + tokens += len(tokenizer.encode(key(data))) + if tokens > max_token_size: + return list_data[:i] + return list_data + + +def cosine_similarity(v1, v2): + """Calculate cosine similarity between two vectors""" + dot_product = np.dot(v1, v2) + norm1 = np.linalg.norm(v1) + norm2 = np.linalg.norm(v2) + return dot_product / (norm1 * norm2) + + +async def handle_cache( + hashing_kv, + args_hash, + prompt, + mode="default", + cache_type="unknown", +) -> tuple[str, int] | None: + """Generic cache handling function with flattened cache keys + + Returns: + tuple[str, int] | None: (content, create_time) if cache hit, None if cache miss + """ + if hashing_kv is None: + return None + + if mode != "default": # handle cache for all type of query + if not hashing_kv.global_config.get("enable_llm_cache"): + return None + else: # handle cache for entity extraction + if not hashing_kv.global_config.get("enable_llm_cache_for_entity_extract"): + return None + + # Use flattened cache key format: {mode}:{cache_type}:{hash} + flattened_key = generate_cache_key(mode, cache_type, args_hash) + cache_entry = await hashing_kv.get_by_id(flattened_key) + if cache_entry: + logger.debug(f"Flattened cache hit(key:{flattened_key})") + content = cache_entry["return"] + timestamp = cache_entry.get("create_time", 0) + return content, timestamp + + logger.debug(f"Cache missed(mode:{mode} type:{cache_type})") + return None + + +@dataclass +class CacheData: + args_hash: str + content: str + prompt: str + mode: str = "default" + cache_type: str = "query" + chunk_id: str | None = None + queryparam: dict | None = None + + +async def save_to_cache(hashing_kv, cache_data: CacheData): + """Save data to cache using flattened key structure. + + Args: + hashing_kv: The key-value storage for caching + cache_data: The cache data to save + """ + # Skip if storage is None or content is a streaming response + if hashing_kv is None or not cache_data.content: + return + + # If content is a streaming response, don't cache it + if hasattr(cache_data.content, "__aiter__"): + logger.debug("Streaming response detected, skipping cache") + return + + # Use flattened cache key format: {mode}:{cache_type}:{hash} + flattened_key = generate_cache_key( + cache_data.mode, cache_data.cache_type, cache_data.args_hash + ) + + # Check if we already have identical content cached + existing_cache = await hashing_kv.get_by_id(flattened_key) + if existing_cache: + existing_content = existing_cache.get("return") + if existing_content == cache_data.content: + logger.warning( + f"Cache duplication detected for {flattened_key}, skipping update" + ) + return + + # Create cache entry with flattened structure + cache_entry = { + "return": cache_data.content, + "cache_type": cache_data.cache_type, + "chunk_id": cache_data.chunk_id if cache_data.chunk_id is not None else None, + "original_prompt": cache_data.prompt, + "queryparam": cache_data.queryparam + if cache_data.queryparam is not None + else None, + } + + logger.info(f" == LLM cache == saving: {flattened_key}") + + # Save using flattened key + await hashing_kv.upsert({flattened_key: cache_entry}) + + +def safe_unicode_decode(content): + # Regular expression to find all Unicode escape sequences of the form \uXXXX + unicode_escape_pattern = re.compile(r"\\u([0-9a-fA-F]{4})") + + # Function to replace the Unicode escape with the actual character + def replace_unicode_escape(match): + # Convert the matched hexadecimal value into the actual Unicode character + return chr(int(match.group(1), 16)) + + # Perform the substitution + decoded_content = unicode_escape_pattern.sub( + replace_unicode_escape, content.decode("utf-8") + ) + + return decoded_content + + +def exists_func(obj, func_name: str) -> bool: + """Check if a function exists in an object or not. + :param obj: + :param func_name: + :return: True / False + """ + if callable(getattr(obj, func_name, None)): + return True + else: + return False + + +def always_get_an_event_loop() -> asyncio.AbstractEventLoop: + """ + Ensure that there is always an event loop available. + + This function tries to get the current event loop. If the current event loop is closed or does not exist, + it creates a new event loop and sets it as the current event loop. + + Returns: + asyncio.AbstractEventLoop: The current or newly created event loop. + """ + try: + # Try to get the current event loop + current_loop = asyncio.get_event_loop() + if current_loop.is_closed(): + raise RuntimeError("Event loop is closed.") + return current_loop + + except RuntimeError: + # If no event loop exists or it is closed, create a new one + logger.info("Creating a new event loop in main thread.") + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + return new_loop + + +async def aexport_data( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + output_path: str, + file_format: str = "csv", + include_vector_data: bool = False, +) -> None: + """ + Asynchronously exports all entities, relations, and relationships to various formats. + + Args: + chunk_entity_relation_graph: Graph storage instance for entities and relations + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + output_path: The path to the output file (including extension). + file_format: Output format - "csv", "excel", "md", "txt". + - csv: Comma-separated values file + - excel: Microsoft Excel file with multiple sheets + - md: Markdown tables + - txt: Plain text formatted output + include_vector_data: Whether to include data from the vector database. + """ + # Collect data + entities_data = [] + relations_data = [] + relationships_data = [] + + # --- Entities --- + all_entities = await chunk_entity_relation_graph.get_all_labels() + for entity_name in all_entities: + # Get entity information from graph + node_data = await chunk_entity_relation_graph.get_node(entity_name) + source_id = node_data.get("source_id") if node_data else None + + entity_info = { + "graph_data": node_data, + "source_id": source_id, + } + + # Optional: Get vector database information + if include_vector_data: + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + vector_data = await entities_vdb.get_by_id(entity_id) + entity_info["vector_data"] = vector_data + + entity_row = { + "entity_name": entity_name, + "source_id": source_id, + "graph_data": str( + entity_info["graph_data"] + ), # Convert to string to ensure compatibility + } + if include_vector_data and "vector_data" in entity_info: + entity_row["vector_data"] = str(entity_info["vector_data"]) + entities_data.append(entity_row) + + # --- Relations --- + for src_entity in all_entities: + for tgt_entity in all_entities: + if src_entity == tgt_entity: + continue + + edge_exists = await chunk_entity_relation_graph.has_edge( + src_entity, tgt_entity + ) + if edge_exists: + # Get edge information from graph + edge_data = await chunk_entity_relation_graph.get_edge( + src_entity, tgt_entity + ) + source_id = edge_data.get("source_id") if edge_data else None + + relation_info = { + "graph_data": edge_data, + "source_id": source_id, + } + + # Optional: Get vector database information + if include_vector_data: + rel_id = compute_mdhash_id(src_entity + tgt_entity, prefix="rel-") + vector_data = await relationships_vdb.get_by_id(rel_id) + relation_info["vector_data"] = vector_data + + relation_row = { + "src_entity": src_entity, + "tgt_entity": tgt_entity, + "source_id": relation_info["source_id"], + "graph_data": str(relation_info["graph_data"]), # Convert to string + } + if include_vector_data and "vector_data" in relation_info: + relation_row["vector_data"] = str(relation_info["vector_data"]) + relations_data.append(relation_row) + + # --- Relationships (from VectorDB) --- + all_relationships = await relationships_vdb.client_storage + for rel in all_relationships["data"]: + relationships_data.append( + { + "relationship_id": rel["__id__"], + "data": str(rel), # Convert to string for compatibility + } + ) + + # Export based on format + if file_format == "csv": + # CSV export + with open(output_path, "w", newline="", encoding="utf-8") as csvfile: + # Entities + if entities_data: + csvfile.write("# ENTITIES\n") + writer = csv.DictWriter(csvfile, fieldnames=entities_data[0].keys()) + writer.writeheader() + writer.writerows(entities_data) + csvfile.write("\n\n") + + # Relations + if relations_data: + csvfile.write("# RELATIONS\n") + writer = csv.DictWriter(csvfile, fieldnames=relations_data[0].keys()) + writer.writeheader() + writer.writerows(relations_data) + csvfile.write("\n\n") + + # Relationships + if relationships_data: + csvfile.write("# RELATIONSHIPS\n") + writer = csv.DictWriter( + csvfile, fieldnames=relationships_data[0].keys() + ) + writer.writeheader() + writer.writerows(relationships_data) + + elif file_format == "excel": + # Excel export + import pandas as pd + + entities_df = pd.DataFrame(entities_data) if entities_data else pd.DataFrame() + relations_df = ( + pd.DataFrame(relations_data) if relations_data else pd.DataFrame() + ) + relationships_df = ( + pd.DataFrame(relationships_data) if relationships_data else pd.DataFrame() + ) + + with pd.ExcelWriter(output_path, engine="xlsxwriter") as writer: + if not entities_df.empty: + entities_df.to_excel(writer, sheet_name="Entities", index=False) + if not relations_df.empty: + relations_df.to_excel(writer, sheet_name="Relations", index=False) + if not relationships_df.empty: + relationships_df.to_excel( + writer, sheet_name="Relationships", index=False + ) + + elif file_format == "md": + # Markdown export + with open(output_path, "w", encoding="utf-8") as mdfile: + mdfile.write("# LightRAG Data Export\n\n") + + # Entities + mdfile.write("## Entities\n\n") + if entities_data: + # Write header + mdfile.write("| " + " | ".join(entities_data[0].keys()) + " |\n") + mdfile.write( + "| " + " | ".join(["---"] * len(entities_data[0].keys())) + " |\n" + ) + + # Write rows + for entity in entities_data: + mdfile.write( + "| " + " | ".join(str(v) for v in entity.values()) + " |\n" + ) + mdfile.write("\n\n") + else: + mdfile.write("*No entity data available*\n\n") + + # Relations + mdfile.write("## Relations\n\n") + if relations_data: + # Write header + mdfile.write("| " + " | ".join(relations_data[0].keys()) + " |\n") + mdfile.write( + "| " + " | ".join(["---"] * len(relations_data[0].keys())) + " |\n" + ) + + # Write rows + for relation in relations_data: + mdfile.write( + "| " + " | ".join(str(v) for v in relation.values()) + " |\n" + ) + mdfile.write("\n\n") + else: + mdfile.write("*No relation data available*\n\n") + + # Relationships + mdfile.write("## Relationships\n\n") + if relationships_data: + # Write header + mdfile.write("| " + " | ".join(relationships_data[0].keys()) + " |\n") + mdfile.write( + "| " + + " | ".join(["---"] * len(relationships_data[0].keys())) + + " |\n" + ) + + # Write rows + for relationship in relationships_data: + mdfile.write( + "| " + + " | ".join(str(v) for v in relationship.values()) + + " |\n" + ) + else: + mdfile.write("*No relationship data available*\n\n") + + elif file_format == "txt": + # Plain text export + with open(output_path, "w", encoding="utf-8") as txtfile: + txtfile.write("LIGHTRAG DATA EXPORT\n") + txtfile.write("=" * 80 + "\n\n") + + # Entities + txtfile.write("ENTITIES\n") + txtfile.write("-" * 80 + "\n") + if entities_data: + # Create fixed width columns + col_widths = { + k: max(len(k), max(len(str(e[k])) for e in entities_data)) + for k in entities_data[0] + } + header = " ".join(k.ljust(col_widths[k]) for k in entities_data[0]) + txtfile.write(header + "\n") + txtfile.write("-" * len(header) + "\n") + + # Write rows + for entity in entities_data: + row = " ".join( + str(v).ljust(col_widths[k]) for k, v in entity.items() + ) + txtfile.write(row + "\n") + txtfile.write("\n\n") + else: + txtfile.write("No entity data available\n\n") + + # Relations + txtfile.write("RELATIONS\n") + txtfile.write("-" * 80 + "\n") + if relations_data: + # Create fixed width columns + col_widths = { + k: max(len(k), max(len(str(r[k])) for r in relations_data)) + for k in relations_data[0] + } + header = " ".join(k.ljust(col_widths[k]) for k in relations_data[0]) + txtfile.write(header + "\n") + txtfile.write("-" * len(header) + "\n") + + # Write rows + for relation in relations_data: + row = " ".join( + str(v).ljust(col_widths[k]) for k, v in relation.items() + ) + txtfile.write(row + "\n") + txtfile.write("\n\n") + else: + txtfile.write("No relation data available\n\n") + + # Relationships + txtfile.write("RELATIONSHIPS\n") + txtfile.write("-" * 80 + "\n") + if relationships_data: + # Create fixed width columns + col_widths = { + k: max(len(k), max(len(str(r[k])) for r in relationships_data)) + for k in relationships_data[0] + } + header = " ".join( + k.ljust(col_widths[k]) for k in relationships_data[0] + ) + txtfile.write(header + "\n") + txtfile.write("-" * len(header) + "\n") + + # Write rows + for relationship in relationships_data: + row = " ".join( + str(v).ljust(col_widths[k]) for k, v in relationship.items() + ) + txtfile.write(row + "\n") + else: + txtfile.write("No relationship data available\n\n") + + else: + raise ValueError( + f"Unsupported file format: {file_format}. Choose from: csv, excel, md, txt" + ) + if file_format is not None: + print(f"Data exported to: {output_path} with format: {file_format}") + else: + print("Data displayed as table format") + + +def export_data( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + output_path: str, + file_format: str = "csv", + include_vector_data: bool = False, +) -> None: + """ + Synchronously exports all entities, relations, and relationships to various formats. + + Args: + chunk_entity_relation_graph: Graph storage instance for entities and relations + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + output_path: The path to the output file (including extension). + file_format: Output format - "csv", "excel", "md", "txt". + - csv: Comma-separated values file + - excel: Microsoft Excel file with multiple sheets + - md: Markdown tables + - txt: Plain text formatted output + include_vector_data: Whether to include data from the vector database. + """ + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + loop.run_until_complete( + aexport_data( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + output_path, + file_format, + include_vector_data, + ) + ) + + +def lazy_external_import(module_name: str, class_name: str) -> Callable[..., Any]: + """Lazily import a class from an external module based on the package of the caller.""" + # Get the caller's module and package + import inspect + + caller_frame = inspect.currentframe().f_back + module = inspect.getmodule(caller_frame) + package = module.__package__ if module else None + + def import_class(*args: Any, **kwargs: Any): + import importlib + + module = importlib.import_module(module_name, package=package) + cls = getattr(module, class_name) + return cls(*args, **kwargs) + + return import_class + + +async def update_chunk_cache_list( + chunk_id: str, + text_chunks_storage: "BaseKVStorage", + cache_keys: list[str], + cache_scenario: str = "batch_update", +) -> None: + """Update chunk's llm_cache_list with the given cache keys + + Args: + chunk_id: Chunk identifier + text_chunks_storage: Text chunks storage instance + cache_keys: List of cache keys to add to the list + cache_scenario: Description of the cache scenario for logging + """ + if not cache_keys: + return + + try: + chunk_data = await text_chunks_storage.get_by_id(chunk_id) + if chunk_data: + # Ensure llm_cache_list exists + if "llm_cache_list" not in chunk_data: + chunk_data["llm_cache_list"] = [] + + # Add cache keys to the list if not already present + existing_keys = set(chunk_data["llm_cache_list"]) + new_keys = [key for key in cache_keys if key not in existing_keys] + + if new_keys: + chunk_data["llm_cache_list"].extend(new_keys) + + # Update the chunk in storage + await text_chunks_storage.upsert({chunk_id: chunk_data}) + logger.debug( + f"Updated chunk {chunk_id} with {len(new_keys)} cache keys ({cache_scenario})" + ) + except Exception as e: + logger.warning( + f"Failed to update chunk {chunk_id} with cache references on {cache_scenario}: {e}" + ) + + +def remove_think_tags(text: str) -> str: + """Remove ... tags from the text + Remove orphon ... tags from the text also""" + return re.sub( + r"^(.*?|.*)", "", text, flags=re.DOTALL + ).strip() + + +async def use_llm_func_with_cache( + user_prompt: str, + use_llm_func: callable, + llm_response_cache: "BaseKVStorage | None" = None, + system_prompt: str | None = None, + max_tokens: int = None, + history_messages: list[dict[str, str]] = None, + cache_type: str = "extract", + chunk_id: str | None = None, + cache_keys_collector: list = None, +) -> tuple[str, int]: + """Call LLM function with cache support and text sanitization + + If cache is available and enabled (determined by handle_cache based on mode), + retrieve result from cache; otherwise call LLM function and save result to cache. + + This function applies text sanitization to prevent UTF-8 encoding errors for all LLM providers. + + Args: + input_text: Input text to send to LLM + use_llm_func: LLM function with higher priority + llm_response_cache: Cache storage instance + max_tokens: Maximum tokens for generation + history_messages: History messages list + cache_type: Type of cache + chunk_id: Chunk identifier to store in cache + text_chunks_storage: Text chunks storage to update llm_cache_list + cache_keys_collector: Optional list to collect cache keys for batch processing + + Returns: + tuple[str, int]: (LLM response text, timestamp) + - For cache hits: (content, cache_create_time) + - For cache misses: (content, current_timestamp) + """ + # Sanitize input text to prevent UTF-8 encoding errors for all LLM providers + safe_user_prompt = sanitize_text_for_encoding(user_prompt) + safe_system_prompt = ( + sanitize_text_for_encoding(system_prompt) if system_prompt else None + ) + + # Sanitize history messages if provided + safe_history_messages = None + if history_messages: + safe_history_messages = [] + for i, msg in enumerate(history_messages): + safe_msg = msg.copy() + if "content" in safe_msg: + safe_msg["content"] = sanitize_text_for_encoding(safe_msg["content"]) + safe_history_messages.append(safe_msg) + history = json.dumps(safe_history_messages, ensure_ascii=False) + else: + history = None + + if llm_response_cache: + prompt_parts = [] + if safe_user_prompt: + prompt_parts.append(safe_user_prompt) + if safe_system_prompt: + prompt_parts.append(safe_system_prompt) + if history: + prompt_parts.append(history) + _prompt = "\n".join(prompt_parts) + + arg_hash = compute_args_hash(_prompt) + # Generate cache key for this LLM call + cache_key = generate_cache_key("default", cache_type, arg_hash) + + cached_result = await handle_cache( + llm_response_cache, + arg_hash, + _prompt, + "default", + cache_type=cache_type, + ) + if cached_result: + content, timestamp = cached_result + logger.debug(f"Found cache for {arg_hash}") + statistic_data["llm_cache"] += 1 + + # Add cache key to collector if provided + if cache_keys_collector is not None: + cache_keys_collector.append(cache_key) + + return content, timestamp + statistic_data["llm_call"] += 1 + + # Call LLM with sanitized input + kwargs = {} + if safe_history_messages: + kwargs["history_messages"] = safe_history_messages + if max_tokens is not None: + kwargs["max_tokens"] = max_tokens + + res: str = await use_llm_func( + safe_user_prompt, system_prompt=safe_system_prompt, **kwargs + ) + + res = remove_think_tags(res) + + # Generate timestamp for cache miss (LLM call completion time) + current_timestamp = int(time.time()) + + if llm_response_cache.global_config.get("enable_llm_cache_for_entity_extract"): + await save_to_cache( + llm_response_cache, + CacheData( + args_hash=arg_hash, + content=res, + prompt=_prompt, + cache_type=cache_type, + chunk_id=chunk_id, + ), + ) + + # Add cache key to collector if provided + if cache_keys_collector is not None: + cache_keys_collector.append(cache_key) + + return res, current_timestamp + + # When cache is disabled, directly call LLM with sanitized input + kwargs = {} + if safe_history_messages: + kwargs["history_messages"] = safe_history_messages + if max_tokens is not None: + kwargs["max_tokens"] = max_tokens + + try: + res = await use_llm_func( + safe_user_prompt, system_prompt=safe_system_prompt, **kwargs + ) + except Exception as e: + # Add [LLM func] prefix to error message + error_msg = f"[LLM func] {str(e)}" + # Re-raise with the same exception type but modified message + raise type(e)(error_msg) from e + + # Generate timestamp for non-cached LLM call + current_timestamp = int(time.time()) + return remove_think_tags(res), current_timestamp + + +def get_content_summary(content: str, max_length: int = 250) -> str: + """Get summary of document content + + Args: + content: Original document content + max_length: Maximum length of summary + + Returns: + Truncated content with ellipsis if needed + """ + content = content.strip() + if len(content) <= max_length: + return content + return content[:max_length] + "..." + + +def sanitize_and_normalize_extracted_text( + input_text: str, remove_inner_quotes=False +) -> str: + """Santitize and normalize extracted text + Args: + input_text: text string to be processed + is_name: whether the input text is a entity or relation name + + Returns: + Santitized and normalized text string + """ + safe_input_text = sanitize_text_for_encoding(input_text) + if safe_input_text: + normalized_text = normalize_extracted_info( + safe_input_text, remove_inner_quotes=remove_inner_quotes + ) + return normalized_text + return "" + + +def normalize_extracted_info(name: str, remove_inner_quotes=False) -> str: + """Normalize entity/relation names and description with the following rules: + - Clean HTML tags (paragraph and line break tags) + - Convert Chinese symbols to English symbols + - Remove spaces between Chinese characters + - Remove spaces between Chinese characters and English letters/numbers + - Preserve spaces within English text and numbers + - Replace Chinese parentheses with English parentheses + - Replace Chinese dash with English dash + - Remove English quotation marks from the beginning and end of the text + - Remove English quotation marks in and around chinese + - Remove Chinese quotation marks + - Filter out short numeric-only text (length < 3 and only digits/dots) + - remove_inner_quotes = True + remove Chinese quotes + remove English quotes in and around chinese + Convert non-breaking spaces to regular spaces + Convert narrow non-breaking spaces after non-digits to regular spaces + + Args: + name: Entity name to normalize + is_entity: Whether this is an entity name (affects quote handling) + + Returns: + Normalized entity name + """ + # Clean HTML tags - remove paragraph and line break tags + name = re.sub(r"||

    ", "", name, flags=re.IGNORECASE) + name = re.sub(r"||
    ", "", name, flags=re.IGNORECASE) + + # Chinese full-width letters to half-width (A-Z, a-z) + name = name.translate( + str.maketrans( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + ) + ) + + # Chinese full-width numbers to half-width + name = name.translate(str.maketrans("0123456789", "0123456789")) + + # Chinese full-width symbols to half-width + name = name.replace("-", "-") # Chinese minus + name = name.replace("+", "+") # Chinese plus + name = name.replace("/", "/") # Chinese slash + name = name.replace("*", "*") # Chinese asterisk + + # Replace Chinese parentheses with English parentheses + name = name.replace("(", "(").replace(")", ")") + + # Replace Chinese dash with English dash (additional patterns) + name = name.replace("—", "-").replace("-", "-") + + # Chinese full-width space to regular space (after other replacements) + name = name.replace(" ", " ") + + # Use regex to remove spaces between Chinese characters + # Regex explanation: + # (?<=[\u4e00-\u9fa5]): Positive lookbehind for Chinese character + # \s+: One or more whitespace characters + # (?=[\u4e00-\u9fa5]): Positive lookahead for Chinese character + name = re.sub(r"(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])", "", name) + + # Remove spaces between Chinese and English/numbers/symbols + name = re.sub( + r"(?<=[\u4e00-\u9fa5])\s+(?=[a-zA-Z0-9\(\)\[\]@#$%!&\*\-=+_])", "", name + ) + name = re.sub( + r"(?<=[a-zA-Z0-9\(\)\[\]@#$%!&\*\-=+_])\s+(?=[\u4e00-\u9fa5])", "", name + ) + + # Remove outer quotes + if len(name) >= 2: + # Handle double quotes + if name.startswith('"') and name.endswith('"'): + inner_content = name[1:-1] + if '"' not in inner_content: # No double quotes inside + name = inner_content + + # Handle single quotes + if name.startswith("'") and name.endswith("'"): + inner_content = name[1:-1] + if "'" not in inner_content: # No single quotes inside + name = inner_content + + # Handle Chinese-style double quotes + if name.startswith("“") and name.endswith("”"): + inner_content = name[1:-1] + if "“" not in inner_content and "”" not in inner_content: + name = inner_content + if name.startswith("‘") and name.endswith("’"): + inner_content = name[1:-1] + if "‘" not in inner_content and "’" not in inner_content: + name = inner_content + + # Handle Chinese-style book title mark + if name.startswith("《") and name.endswith("》"): + inner_content = name[1:-1] + if "《" not in inner_content and "》" not in inner_content: + name = inner_content + + if remove_inner_quotes: + # Remove Chinese quotes + name = name.replace("“", "").replace("”", "").replace("‘", "").replace("’", "") + # Remove English queotes in and around chinese + name = re.sub(r"['\"]+(?=[\u4e00-\u9fa5])", "", name) + name = re.sub(r"(?<=[\u4e00-\u9fa5])['\"]+", "", name) + # Convert non-breaking space to regular space + name = name.replace("\u00a0", " ") + # Convert narrow non-breaking space to regular space when after non-digits + name = re.sub(r"(?<=[^\d])\u202F", " ", name) + + # Remove spaces from the beginning and end of the text + name = name.strip() + + # Filter out pure numeric content with length < 3 + if len(name) < 3 and re.match(r"^[0-9]+$", name): + return "" + + def should_filter_by_dots(text): + """ + Check if the string consists only of dots and digits, with at least one dot + Filter cases include: 1.2.3, 12.3, .123, 123., 12.3., .1.23 etc. + """ + return all(c.isdigit() or c == "." for c in text) and "." in text + + if len(name) < 6 and should_filter_by_dots(name): + # Filter out mixed numeric and dot content with length < 6 + return "" + # Filter out mixed numeric and dot content with length < 6, requiring at least one dot + return "" + + return name + + +def sanitize_text_for_encoding(text: str, replacement_char: str = "") -> str: + """Sanitize text to ensure safe UTF-8 encoding by removing or replacing problematic characters. + + This function handles: + - Surrogate characters (the main cause of encoding errors) + - Other invalid Unicode sequences + - Control characters that might cause issues + - Unescape HTML escapes + - Remove control characters + - Whitespace trimming + + Args: + text: Input text to sanitize + replacement_char: Character to use for replacing invalid sequences + + Returns: + Sanitized text that can be safely encoded as UTF-8 + + Raises: + ValueError: When text contains uncleanable encoding issues that cannot be safely processed + """ + if not text: + return text + + try: + # First, strip whitespace + text = text.strip() + + # Early return if text is empty after basic cleaning + if not text: + return text + + # Try to encode/decode to catch any encoding issues early + text.encode("utf-8") + + # Remove or replace surrogate characters (U+D800 to U+DFFF) + # These are the main cause of the encoding error + sanitized = "" + for char in text: + code_point = ord(char) + # Check for surrogate characters + if 0xD800 <= code_point <= 0xDFFF: + # Replace surrogate with replacement character + sanitized += replacement_char + continue + # Check for other problematic characters + elif code_point == 0xFFFE or code_point == 0xFFFF: + # These are non-characters in Unicode + sanitized += replacement_char + continue + else: + sanitized += char + + # Additional cleanup: remove null bytes and other control characters that might cause issues + # (but preserve common whitespace like \t, \n, \r) + sanitized = re.sub( + r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]", replacement_char, sanitized + ) + + # Test final encoding to ensure it's safe + sanitized.encode("utf-8") + + # Unescape HTML escapes + sanitized = html.unescape(sanitized) + + # Remove control characters but preserve common whitespace (\t, \n, \r) + sanitized = re.sub(r"[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]", "", sanitized) + + return sanitized.strip() + + except UnicodeEncodeError as e: + # Critical change: Don't return placeholder, raise exception for caller to handle + error_msg = f"Text contains uncleanable UTF-8 encoding issues: {str(e)[:100]}" + logger.error(f"Text sanitization failed: {error_msg}") + raise ValueError(error_msg) from e + + except Exception as e: + logger.error(f"Text sanitization: Unexpected error: {str(e)}") + # For other exceptions, if no encoding issues detected, return original text + try: + text.encode("utf-8") + return text + except UnicodeEncodeError: + raise ValueError( + f"Text sanitization failed with unexpected error: {str(e)}" + ) from e + + +def check_storage_env_vars(storage_name: str) -> None: + """Check if all required environment variables for storage implementation exist + + Args: + storage_name: Storage implementation name + + Raises: + ValueError: If required environment variables are missing + """ + from lightrag.kg import STORAGE_ENV_REQUIREMENTS + + required_vars = STORAGE_ENV_REQUIREMENTS.get(storage_name, []) + missing_vars = [var for var in required_vars if var not in os.environ] + + if missing_vars: + raise ValueError( + f"Storage implementation '{storage_name}' requires the following " + f"environment variables: {', '.join(missing_vars)}" + ) + + +def pick_by_weighted_polling( + entities_or_relations: list[dict], + max_related_chunks: int, + min_related_chunks: int = 1, +) -> list[str]: + """ + Linear gradient weighted polling algorithm for text chunk selection. + + This algorithm ensures that entities/relations with higher importance get more text chunks, + forming a linear decreasing allocation pattern. + + Args: + entities_or_relations: List of entities or relations sorted by importance (high to low) + max_related_chunks: Expected number of text chunks for the highest importance entity/relation + min_related_chunks: Expected number of text chunks for the lowest importance entity/relation + + Returns: + List of selected text chunk IDs + """ + if not entities_or_relations: + return [] + + n = len(entities_or_relations) + if n == 1: + # Only one entity/relation, return its first max_related_chunks text chunks + entity_chunks = entities_or_relations[0].get("sorted_chunks", []) + return entity_chunks[:max_related_chunks] + + # Calculate expected text chunk count for each position (linear decrease) + expected_counts = [] + for i in range(n): + # Linear interpolation: from max_related_chunks to min_related_chunks + ratio = i / (n - 1) if n > 1 else 0 + expected = max_related_chunks - ratio * ( + max_related_chunks - min_related_chunks + ) + expected_counts.append(int(round(expected))) + + # First round allocation: allocate by expected values + selected_chunks = [] + used_counts = [] # Track number of chunks used by each entity + total_remaining = 0 # Accumulate remaining quotas + + for i, entity_rel in enumerate(entities_or_relations): + entity_chunks = entity_rel.get("sorted_chunks", []) + expected = expected_counts[i] + + # Actual allocatable count + actual = min(expected, len(entity_chunks)) + selected_chunks.extend(entity_chunks[:actual]) + used_counts.append(actual) + + # Accumulate remaining quota + remaining = expected - actual + if remaining > 0: + total_remaining += remaining + + # Second round allocation: multi-round scanning to allocate remaining quotas + for _ in range(total_remaining): + allocated = False + + # Scan entities one by one, allocate one chunk when finding unused chunks + for i, entity_rel in enumerate(entities_or_relations): + entity_chunks = entity_rel.get("sorted_chunks", []) + + # Check if there are still unused chunks + if used_counts[i] < len(entity_chunks): + # Allocate one chunk + selected_chunks.append(entity_chunks[used_counts[i]]) + used_counts[i] += 1 + allocated = True + break + + # If no chunks were allocated in this round, all entities are exhausted + if not allocated: + break + + return selected_chunks + + +async def pick_by_vector_similarity( + query: str, + text_chunks_storage: "BaseKVStorage", + chunks_vdb: "BaseVectorStorage", + num_of_chunks: int, + entity_info: list[dict[str, Any]], + embedding_func: callable, + query_embedding=None, +) -> list[str]: + """ + Vector similarity-based text chunk selection algorithm. + + This algorithm selects text chunks based on cosine similarity between + the query embedding and text chunk embeddings. + + Args: + query: User's original query string + text_chunks_storage: Text chunks storage instance + chunks_vdb: Vector database storage for chunks + num_of_chunks: Number of chunks to select + entity_info: List of entity information containing chunk IDs + embedding_func: Embedding function to compute query embedding + + Returns: + List of selected text chunk IDs sorted by similarity (highest first) + """ + logger.debug( + f"Vector similarity chunk selection: num_of_chunks={num_of_chunks}, entity_info_count={len(entity_info) if entity_info else 0}" + ) + + if not entity_info or num_of_chunks <= 0: + return [] + + # Collect all unique chunk IDs from entity info + all_chunk_ids = set() + for i, entity in enumerate(entity_info): + chunk_ids = entity.get("sorted_chunks", []) + all_chunk_ids.update(chunk_ids) + + if not all_chunk_ids: + logger.warning( + "Vector similarity chunk selection: no chunk IDs found in entity_info" + ) + return [] + + logger.debug( + f"Vector similarity chunk selection: {len(all_chunk_ids)} unique chunk IDs collected" + ) + + all_chunk_ids = list(all_chunk_ids) + + try: + # Use pre-computed query embedding if provided, otherwise compute it + if query_embedding is None: + query_embedding = await embedding_func([query]) + query_embedding = query_embedding[ + 0 + ] # Extract first embedding from batch result + logger.debug( + "Computed query embedding for vector similarity chunk selection" + ) + else: + logger.debug( + "Using pre-computed query embedding for vector similarity chunk selection" + ) + + # Get chunk embeddings from vector database + chunk_vectors = await chunks_vdb.get_vectors_by_ids(all_chunk_ids) + logger.debug( + f"Vector similarity chunk selection: {len(chunk_vectors)} chunk vectors Retrieved" + ) + + if not chunk_vectors or len(chunk_vectors) != len(all_chunk_ids): + if not chunk_vectors: + logger.warning( + "Vector similarity chunk selection: no vectors retrieved from chunks_vdb" + ) + else: + logger.warning( + f"Vector similarity chunk selection: found {len(chunk_vectors)} but expecting {len(all_chunk_ids)}" + ) + return [] + + # Calculate cosine similarities + similarities = [] + valid_vectors = 0 + for chunk_id in all_chunk_ids: + if chunk_id in chunk_vectors: + chunk_embedding = chunk_vectors[chunk_id] + try: + # Calculate cosine similarity + similarity = cosine_similarity(query_embedding, chunk_embedding) + similarities.append((chunk_id, similarity)) + valid_vectors += 1 + except Exception as e: + logger.warning( + f"Vector similarity chunk selection: failed to calculate similarity for chunk {chunk_id}: {e}" + ) + else: + logger.warning( + f"Vector similarity chunk selection: no vector found for chunk {chunk_id}" + ) + + # Sort by similarity (highest first) and select top num_of_chunks + similarities.sort(key=lambda x: x[1], reverse=True) + selected_chunks = [chunk_id for chunk_id, _ in similarities[:num_of_chunks]] + + logger.debug( + f"Vector similarity chunk selection: {len(selected_chunks)} chunks from {len(all_chunk_ids)} candidates" + ) + + return selected_chunks + + except Exception as e: + logger.error(f"[VECTOR_SIMILARITY] Error in vector similarity sorting: {e}") + import traceback + + logger.error(f"[VECTOR_SIMILARITY] Traceback: {traceback.format_exc()}") + # Fallback to simple truncation + logger.debug("[VECTOR_SIMILARITY] Falling back to simple truncation") + return all_chunk_ids[:num_of_chunks] + + +class TokenTracker: + """Track token usage for LLM calls.""" + + def __init__(self): + self.reset() + + def __enter__(self): + self.reset() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + print(self) + + def reset(self): + self.prompt_tokens = 0 + self.completion_tokens = 0 + self.total_tokens = 0 + self.call_count = 0 + + def add_usage(self, token_counts): + """Add token usage from one LLM call. + + Args: + token_counts: A dictionary containing prompt_tokens, completion_tokens, total_tokens + """ + self.prompt_tokens += token_counts.get("prompt_tokens", 0) + self.completion_tokens += token_counts.get("completion_tokens", 0) + + # If total_tokens is provided, use it directly; otherwise calculate the sum + if "total_tokens" in token_counts: + self.total_tokens += token_counts["total_tokens"] + else: + self.total_tokens += token_counts.get( + "prompt_tokens", 0 + ) + token_counts.get("completion_tokens", 0) + + self.call_count += 1 + + def get_usage(self): + """Get current usage statistics.""" + return { + "prompt_tokens": self.prompt_tokens, + "completion_tokens": self.completion_tokens, + "total_tokens": self.total_tokens, + "call_count": self.call_count, + } + + def __str__(self): + usage = self.get_usage() + return ( + f"LLM call count: {usage['call_count']}, " + f"Prompt tokens: {usage['prompt_tokens']}, " + f"Completion tokens: {usage['completion_tokens']}, " + f"Total tokens: {usage['total_tokens']}" + ) + + +async def apply_rerank_if_enabled( + query: str, + retrieved_docs: list[dict], + global_config: dict, + enable_rerank: bool = True, + top_n: int = None, +) -> list[dict]: + """ + Apply reranking to retrieved documents if rerank is enabled. + + Args: + query: The search query + retrieved_docs: List of retrieved documents + global_config: Global configuration containing rerank settings + enable_rerank: Whether to enable reranking from query parameter + top_n: Number of top documents to return after reranking + + Returns: + Reranked documents if rerank is enabled, otherwise original documents + """ + if not enable_rerank or not retrieved_docs: + return retrieved_docs + + rerank_func = global_config.get("rerank_model_func") + if not rerank_func: + logger.warning( + "Rerank is enabled but no rerank model is configured. Please set up a rerank model or set enable_rerank=False in query parameters." + ) + return retrieved_docs + + try: + # Extract document content for reranking + document_texts = [] + for doc in retrieved_docs: + # Try multiple possible content fields + content = ( + doc.get("content") + or doc.get("text") + or doc.get("chunk_content") + or doc.get("document") + or str(doc) + ) + document_texts.append(content) + + # Call the new rerank function that returns index-based results + rerank_results = await rerank_func( + query=query, + documents=document_texts, + top_n=top_n, + ) + + # Process rerank results based on return format + if rerank_results and len(rerank_results) > 0: + # Check if results are in the new index-based format + if isinstance(rerank_results[0], dict) and "index" in rerank_results[0]: + # New format: [{"index": 0, "relevance_score": 0.85}, ...] + reranked_docs = [] + for result in rerank_results: + index = result["index"] + relevance_score = result["relevance_score"] + + # Get original document and add rerank score + if 0 <= index < len(retrieved_docs): + doc = retrieved_docs[index].copy() + doc["rerank_score"] = relevance_score + reranked_docs.append(doc) + + logger.info( + f"Successfully reranked: {len(reranked_docs)} chunks from {len(retrieved_docs)} original chunks" + ) + return reranked_docs + else: + # Legacy format: assume it's already reranked documents + logger.info(f"Using legacy rerank format: {len(rerank_results)} chunks") + return rerank_results[:top_n] if top_n else rerank_results + else: + logger.warning("Rerank returned empty results, using original chunks") + return retrieved_docs + + except Exception as e: + logger.error(f"Error during reranking: {e}, using original chunks") + return retrieved_docs + + +async def process_chunks_unified( + query: str, + unique_chunks: list[dict], + query_param: "QueryParam", + global_config: dict, + source_type: str = "mixed", + chunk_token_limit: int = None, # Add parameter for dynamic token limit +) -> list[dict]: + """ + Unified processing for text chunks: deduplication, chunk_top_k limiting, reranking, and token truncation. + + Args: + query: Search query for reranking + chunks: List of text chunks to process + query_param: Query parameters containing configuration + global_config: Global configuration dictionary + source_type: Source type for logging ("vector", "entity", "relationship", "mixed") + chunk_token_limit: Dynamic token limit for chunks (if None, uses default) + + Returns: + Processed and filtered list of text chunks + """ + if not unique_chunks: + return [] + + origin_count = len(unique_chunks) + + # 1. Apply reranking if enabled and query is provided + if query_param.enable_rerank and query and unique_chunks: + rerank_top_k = query_param.chunk_top_k or len(unique_chunks) + unique_chunks = await apply_rerank_if_enabled( + query=query, + retrieved_docs=unique_chunks, + global_config=global_config, + enable_rerank=query_param.enable_rerank, + top_n=rerank_top_k, + ) + + # 2. Filter by minimum rerank score if reranking is enabled + if query_param.enable_rerank and unique_chunks: + min_rerank_score = global_config.get("min_rerank_score", 0.5) + if min_rerank_score > 0.0: + original_count = len(unique_chunks) + + # Filter chunks with score below threshold + filtered_chunks = [] + for chunk in unique_chunks: + rerank_score = chunk.get( + "rerank_score", 1.0 + ) # Default to 1.0 if no score + if rerank_score >= min_rerank_score: + filtered_chunks.append(chunk) + + unique_chunks = filtered_chunks + filtered_count = original_count - len(unique_chunks) + + if filtered_count > 0: + logger.info( + f"Rerank filtering: {len(unique_chunks)} chunks remained (min rerank score: {min_rerank_score})" + ) + if not unique_chunks: + return [] + + # 3. Apply chunk_top_k limiting if specified + if query_param.chunk_top_k is not None and query_param.chunk_top_k > 0: + if len(unique_chunks) > query_param.chunk_top_k: + unique_chunks = unique_chunks[: query_param.chunk_top_k] + logger.debug( + f"Kept chunk_top-k: {len(unique_chunks)} chunks (deduplicated original: {origin_count})" + ) + + # 4. Token-based final truncation + tokenizer = global_config.get("tokenizer") + if tokenizer and unique_chunks: + # Set default chunk_token_limit if not provided + if chunk_token_limit is None: + # Get default from query_param or global_config + chunk_token_limit = getattr( + query_param, + "max_total_tokens", + global_config.get("MAX_TOTAL_TOKENS", DEFAULT_MAX_TOTAL_TOKENS), + ) + + original_count = len(unique_chunks) + + unique_chunks = truncate_list_by_token_size( + unique_chunks, + key=lambda x: "\n".join( + json.dumps(item, ensure_ascii=False) for item in [x] + ), + max_token_size=chunk_token_limit, + tokenizer=tokenizer, + ) + + logger.debug( + f"Token truncation: {len(unique_chunks)} chunks from {original_count} " + f"(chunk available tokens: {chunk_token_limit}, source: {source_type})" + ) + + # 5. add id field to each chunk + final_chunks = [] + for i, chunk in enumerate(unique_chunks): + chunk_with_id = chunk.copy() + chunk_with_id["id"] = f"DC{i + 1}" + final_chunks.append(chunk_with_id) + + return final_chunks + + +def normalize_source_ids_limit_method(method: str | None) -> str: + """Normalize the source ID limiting strategy and fall back to default when invalid.""" + + if not method: + return DEFAULT_SOURCE_IDS_LIMIT_METHOD + + normalized = method.upper() + if normalized not in VALID_SOURCE_IDS_LIMIT_METHODS: + logger.warning( + "Unknown SOURCE_IDS_LIMIT_METHOD '%s', falling back to %s", + method, + DEFAULT_SOURCE_IDS_LIMIT_METHOD, + ) + return DEFAULT_SOURCE_IDS_LIMIT_METHOD + + return normalized + + +def merge_source_ids( + existing_ids: Iterable[str] | None, new_ids: Iterable[str] | None +) -> list[str]: + """Merge two iterables of source IDs while preserving order and removing duplicates.""" + + merged: list[str] = [] + seen: set[str] = set() + + for sequence in (existing_ids, new_ids): + if not sequence: + continue + for source_id in sequence: + if not source_id: + continue + if source_id not in seen: + seen.add(source_id) + merged.append(source_id) + + return merged + + +def apply_source_ids_limit( + source_ids: Sequence[str], + limit: int, + method: str, + *, + identifier: str | None = None, +) -> list[str]: + """Apply a limit strategy to a sequence of source IDs.""" + + if limit <= 0: + return [] + + source_ids_list = list(source_ids) + if len(source_ids_list) <= limit: + return source_ids_list + + normalized_method = normalize_source_ids_limit_method(method) + + if normalized_method == SOURCE_IDS_LIMIT_METHOD_FIFO: + truncated = source_ids_list[-limit:] + else: # IGNORE_NEW + truncated = source_ids_list[:limit] + + if identifier and len(truncated) < len(source_ids_list): + logger.debug( + "Source_id truncated: %s | %s keeping %s of %s entries", + identifier, + normalized_method, + len(truncated), + len(source_ids_list), + ) + + return truncated + + +def compute_incremental_chunk_ids( + existing_full_chunk_ids: list[str], + old_chunk_ids: list[str], + new_chunk_ids: list[str], +) -> list[str]: + """ + Compute incrementally updated chunk IDs based on changes. + + This function applies delta changes (additions and removals) to an existing + list of chunk IDs while maintaining order and ensuring deduplication. + Delta additions from new_chunk_ids are placed at the end. + + Args: + existing_full_chunk_ids: Complete list of existing chunk IDs from storage + old_chunk_ids: Previous chunk IDs from source_id (chunks being replaced) + new_chunk_ids: New chunk IDs from updated source_id (chunks being added) + + Returns: + Updated list of chunk IDs with deduplication + + Example: + >>> existing = ['chunk-1', 'chunk-2', 'chunk-3'] + >>> old = ['chunk-1', 'chunk-2'] + >>> new = ['chunk-2', 'chunk-4'] + >>> compute_incremental_chunk_ids(existing, old, new) + ['chunk-3', 'chunk-2', 'chunk-4'] + """ + # Calculate changes + chunks_to_remove = set(old_chunk_ids) - set(new_chunk_ids) + chunks_to_add = set(new_chunk_ids) - set(old_chunk_ids) + + # Apply changes to full chunk_ids + # Step 1: Remove chunks that are no longer needed + updated_chunk_ids = [ + cid for cid in existing_full_chunk_ids if cid not in chunks_to_remove + ] + + # Step 2: Add new chunks (preserving order from new_chunk_ids) + # Note: 'cid not in updated_chunk_ids' check ensures deduplication + for cid in new_chunk_ids: + if cid in chunks_to_add and cid not in updated_chunk_ids: + updated_chunk_ids.append(cid) + + return updated_chunk_ids + + +def subtract_source_ids( + source_ids: Iterable[str], + ids_to_remove: Collection[str], +) -> list[str]: + """Remove a collection of IDs from an ordered iterable while preserving order.""" + + removal_set = set(ids_to_remove) + if not removal_set: + return [source_id for source_id in source_ids if source_id] + + return [ + source_id + for source_id in source_ids + if source_id and source_id not in removal_set + ] + + +def make_relation_chunk_key(src: str, tgt: str) -> str: + """Create a deterministic storage key for relation chunk tracking.""" + + return GRAPH_FIELD_SEP.join(sorted((src, tgt))) + + +def parse_relation_chunk_key(key: str) -> tuple[str, str]: + """Parse a relation chunk storage key back into its entity pair.""" + + parts = key.split(GRAPH_FIELD_SEP) + if len(parts) != 2: + raise ValueError(f"Invalid relation chunk key: {key}") + return parts[0], parts[1] + + +def generate_track_id(prefix: str = "upload") -> str: + """Generate a unique tracking ID with timestamp and UUID + + Args: + prefix: Prefix for the track ID (e.g., 'upload', 'insert') + + Returns: + str: Unique tracking ID in format: {prefix}_{timestamp}_{uuid} + """ + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + unique_id = str(uuid.uuid4())[:8] # Use first 8 characters of UUID + return f"{prefix}_{timestamp}_{unique_id}" + + +def get_pinyin_sort_key(text: str) -> str: + """Generate sort key for Chinese pinyin sorting + + This function uses pypinyin for true Chinese pinyin sorting. + If pypinyin is not available, it falls back to simple lowercase string sorting. + + Args: + text: Text to generate sort key for + + Returns: + str: Sort key that can be used for comparison and sorting + """ + if not text: + return "" + + if _PYPINYIN_AVAILABLE: + try: + # Convert Chinese characters to pinyin, keep non-Chinese as-is + pinyin_list = pypinyin.lazy_pinyin(text, style=pypinyin.Style.NORMAL) + return "".join(pinyin_list).lower() + except Exception: + # Silently fall back to simple string sorting on any error + return text.lower() + else: + # pypinyin not available, use simple string sorting + return text.lower() + + +def fix_tuple_delimiter_corruption( + record: str, delimiter_core: str, tuple_delimiter: str +) -> str: + """ + Fix various forms of tuple_delimiter corruption from LLM output. + + This function handles missing or replaced characters around the core delimiter. + It fixes common corruption patterns where the LLM output doesn't match the expected + tuple_delimiter format. + + Args: + record: The text record to fix + delimiter_core: The core delimiter (e.g., "S" from "<|#|>") + tuple_delimiter: The complete tuple delimiter (e.g., "<|#|>") + + Returns: + The corrected record with proper tuple_delimiter format + """ + if not record or not delimiter_core or not tuple_delimiter: + return record + + # Escape the delimiter core for regex use + escaped_delimiter_core = re.escape(delimiter_core) + + # Fix: <|##|> -> <|#|>, <|#||#|> -> <|#|>, <|#|||#|> -> <|#|> + record = re.sub( + rf"<\|{escaped_delimiter_core}\|*?{escaped_delimiter_core}\|>", + tuple_delimiter, + record, + ) + + # Fix: <|\#|> -> <|#|> + record = re.sub( + rf"<\|\\{escaped_delimiter_core}\|>", + tuple_delimiter, + record, + ) + + # Fix: <|> -> <|#|>, <||> -> <|#|> + record = re.sub( + r"<\|+>", + tuple_delimiter, + record, + ) + + # Fix: -> <|#|>, <|#|Y> -> <|#|>, -> <|#|>, <||#||> -> <|#|> (one extra characters outside pipes) + record = re.sub( + rf"<.?\|{escaped_delimiter_core}\|.?>", + tuple_delimiter, + record, + ) + + # Fix: <#>, <#|>, <|#> -> <|#|> (missing one or both pipes) + record = re.sub( + rf"<\|?{escaped_delimiter_core}\|?>", + tuple_delimiter, + record, + ) + + # Fix: -> <|#|>, <|#X> -> <|#|> (one pipe is replaced by other character) + record = re.sub( + rf"<[^|]{escaped_delimiter_core}\|>|<\|{escaped_delimiter_core}[^|]>", + tuple_delimiter, + record, + ) + + # Fix: <|#| -> <|#|>, <|#|| -> <|#|> (missing closing >) + record = re.sub( + rf"<\|{escaped_delimiter_core}\|+(?!>)", + tuple_delimiter, + record, + ) + + # Fix <|#: -> <|#|> (missing closing >) + record = re.sub( + rf"<\|{escaped_delimiter_core}:(?!>)", + tuple_delimiter, + record, + ) + + # Fix: <||#> -> <|#|> (double pipe at start, missing pipe at end) + record = re.sub( + rf"<\|+{escaped_delimiter_core}>", + tuple_delimiter, + record, + ) + + # Fix: <|| -> <|#|> + record = re.sub( + r"<\|\|(?!>)", + tuple_delimiter, + record, + ) + + # Fix: |#|> -> <|#|> (missing opening <) + record = re.sub( + rf"(?", + tuple_delimiter, + record, + ) + + # Fix: <|#|>| -> <|#|> ( this is a fix for: <|#|| -> <|#|> ) + record = re.sub( + rf"<\|{escaped_delimiter_core}\|>\|", + tuple_delimiter, + record, + ) + + # Fix: ||#|| -> <|#|> (double pipes on both sides without angle brackets) + record = re.sub( + rf"\|\|{escaped_delimiter_core}\|\|", + tuple_delimiter, + record, + ) + + return record + + +def create_prefixed_exception(original_exception: Exception, prefix: str) -> Exception: + """ + Safely create a prefixed exception that adapts to all error types. + + Args: + original_exception: The original exception. + prefix: The prefix to add. + + Returns: + A new exception with the prefix, maintaining the original exception type if possible. + """ + try: + # Method 1: Try to reconstruct using original arguments. + if hasattr(original_exception, "args") and original_exception.args: + args = list(original_exception.args) + # Find the first string argument and prefix it. This is safer for + # exceptions like OSError where the first arg is an integer (errno). + found_str = False + for i, arg in enumerate(args): + if isinstance(arg, str): + args[i] = f"{prefix}: {arg}" + found_str = True + break + + # If no string argument is found, prefix the first argument's string representation. + if not found_str: + args[0] = f"{prefix}: {args[0]}" + + return type(original_exception)(*args) + else: + # Method 2: If no args, try single parameter construction. + return type(original_exception)(f"{prefix}: {str(original_exception)}") + except (TypeError, ValueError, AttributeError) as construct_error: + # Method 3: If reconstruction fails, wrap it in a RuntimeError. + # This is the safest fallback, as attempting to create the same type + # with a single string can fail if the constructor requires multiple arguments. + return RuntimeError( + f"{prefix}: {type(original_exception).__name__}: {str(original_exception)} " + f"(Original exception could not be reconstructed: {construct_error})" + ) + + +def convert_to_user_format( + entities_context: list[dict], + relations_context: list[dict], + chunks: list[dict], + references: list[dict], + query_mode: str, + entity_id_to_original: dict = None, + relation_id_to_original: dict = None, +) -> dict[str, Any]: + """Convert internal data format to user-friendly format using original database data""" + + # Convert entities format using original data when available + formatted_entities = [] + for entity in entities_context: + entity_name = entity.get("entity", "") + + # Try to get original data first + original_entity = None + if entity_id_to_original and entity_name in entity_id_to_original: + original_entity = entity_id_to_original[entity_name] + + if original_entity: + # Use original database data + formatted_entities.append( + { + "entity_name": original_entity.get("entity_name", entity_name), + "entity_type": original_entity.get("entity_type", "UNKNOWN"), + "description": original_entity.get("description", ""), + "source_id": original_entity.get("source_id", ""), + "file_path": original_entity.get("file_path", "unknown_source"), + "created_at": original_entity.get("created_at", ""), + } + ) + else: + # Fallback to LLM context data (for backward compatibility) + formatted_entities.append( + { + "entity_name": entity_name, + "entity_type": entity.get("type", "UNKNOWN"), + "description": entity.get("description", ""), + "source_id": entity.get("source_id", ""), + "file_path": entity.get("file_path", "unknown_source"), + "created_at": entity.get("created_at", ""), + } + ) + + # Convert relationships format using original data when available + formatted_relationships = [] + for relation in relations_context: + entity1 = relation.get("entity1", "") + entity2 = relation.get("entity2", "") + relation_key = (entity1, entity2) + + # Try to get original data first + original_relation = None + if relation_id_to_original and relation_key in relation_id_to_original: + original_relation = relation_id_to_original[relation_key] + + if original_relation: + # Use original database data + formatted_relationships.append( + { + "src_id": original_relation.get("src_id", entity1), + "tgt_id": original_relation.get("tgt_id", entity2), + "description": original_relation.get("description", ""), + "keywords": original_relation.get("keywords", ""), + "weight": original_relation.get("weight", 1.0), + "source_id": original_relation.get("source_id", ""), + "file_path": original_relation.get("file_path", "unknown_source"), + "created_at": original_relation.get("created_at", ""), + } + ) + else: + # Fallback to LLM context data (for backward compatibility) + formatted_relationships.append( + { + "src_id": entity1, + "tgt_id": entity2, + "description": relation.get("description", ""), + "keywords": relation.get("keywords", ""), + "weight": relation.get("weight", 1.0), + "source_id": relation.get("source_id", ""), + "file_path": relation.get("file_path", "unknown_source"), + "created_at": relation.get("created_at", ""), + } + ) + + # Convert chunks format (chunks already contain complete data) + formatted_chunks = [] + for i, chunk in enumerate(chunks): + chunk_data = { + "reference_id": chunk.get("reference_id", ""), + "content": chunk.get("content", ""), + "file_path": chunk.get("file_path", "unknown_source"), + "chunk_id": chunk.get("chunk_id", ""), + } + formatted_chunks.append(chunk_data) + + logger.debug( + f"[convert_to_user_format] Formatted {len(formatted_chunks)}/{len(chunks)} chunks" + ) + + # Build basic metadata (metadata details will be added by calling functions) + metadata = { + "query_mode": query_mode, + "keywords": { + "high_level": [], + "low_level": [], + }, # Placeholder, will be set by calling functions + } + + return { + "status": "success", + "message": "Query processed successfully", + "data": { + "entities": formatted_entities, + "relationships": formatted_relationships, + "chunks": formatted_chunks, + "references": references, + }, + "metadata": metadata, + } + + +def generate_reference_list_from_chunks( + chunks: list[dict], +) -> tuple[list[dict], list[dict]]: + """ + Generate reference list from chunks, prioritizing by occurrence frequency. + + This function extracts file_paths from chunks, counts their occurrences, + sorts by frequency and first appearance order, creates reference_id mappings, + and builds a reference_list structure. + + Args: + chunks: List of chunk dictionaries with file_path information + + Returns: + tuple: (reference_list, updated_chunks_with_reference_ids) + - reference_list: List of dicts with reference_id and file_path + - updated_chunks_with_reference_ids: Original chunks with reference_id field added + """ + if not chunks: + return [], [] + + # 1. Extract all valid file_paths and count their occurrences + file_path_counts = {} + for chunk in chunks: + file_path = chunk.get("file_path", "") + if file_path and file_path != "unknown_source": + file_path_counts[file_path] = file_path_counts.get(file_path, 0) + 1 + + # 2. Sort file paths by frequency (descending), then by first appearance order + # Create a list of (file_path, count, first_index) tuples + file_path_with_indices = [] + seen_paths = set() + for i, chunk in enumerate(chunks): + file_path = chunk.get("file_path", "") + if file_path and file_path != "unknown_source" and file_path not in seen_paths: + file_path_with_indices.append((file_path, file_path_counts[file_path], i)) + seen_paths.add(file_path) + + # Sort by count (descending), then by first appearance index (ascending) + sorted_file_paths = sorted(file_path_with_indices, key=lambda x: (-x[1], x[2])) + unique_file_paths = [item[0] for item in sorted_file_paths] + + # 3. Create mapping from file_path to reference_id (prioritized by frequency) + file_path_to_ref_id = {} + for i, file_path in enumerate(unique_file_paths): + file_path_to_ref_id[file_path] = str(i + 1) + + # 4. Add reference_id field to each chunk + updated_chunks = [] + for chunk in chunks: + chunk_copy = chunk.copy() + file_path = chunk_copy.get("file_path", "") + if file_path and file_path != "unknown_source": + chunk_copy["reference_id"] = file_path_to_ref_id[file_path] + else: + chunk_copy["reference_id"] = "" + updated_chunks.append(chunk_copy) + + # 5. Build reference_list + reference_list = [] + for i, file_path in enumerate(unique_file_paths): + reference_list.append({"reference_id": str(i + 1), "file_path": file_path}) + + return reference_list, updated_chunks diff --git a/LightRAG/lightrag/utils_graph.py b/LightRAG/lightrag/utils_graph.py new file mode 100644 index 00000000..cedad575 --- /dev/null +++ b/LightRAG/lightrag/utils_graph.py @@ -0,0 +1,1733 @@ +from __future__ import annotations + +import time +import asyncio +from typing import Any, cast + +from .base import DeletionResult +from .kg.shared_storage import get_storage_keyed_lock +from .constants import GRAPH_FIELD_SEP +from .utils import compute_mdhash_id, logger +from .base import StorageNameSpace + + +async def _persist_graph_updates( + entities_vdb=None, + relationships_vdb=None, + chunk_entity_relation_graph=None, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> None: + """Unified callback to persist updates after graph operations. + + Ensures all relevant storage instances are properly persisted after + operations like delete, edit, create, or merge. + + Args: + entities_vdb: Entity vector database storage (optional) + relationships_vdb: Relationship vector database storage (optional) + chunk_entity_relation_graph: Graph storage instance (optional) + entity_chunks_storage: Entity-chunk tracking storage (optional) + relation_chunks_storage: Relation-chunk tracking storage (optional) + """ + storages = [] + + # Collect all non-None storage instances + if entities_vdb is not None: + storages.append(entities_vdb) + if relationships_vdb is not None: + storages.append(relationships_vdb) + if chunk_entity_relation_graph is not None: + storages.append(chunk_entity_relation_graph) + if entity_chunks_storage is not None: + storages.append(entity_chunks_storage) + if relation_chunks_storage is not None: + storages.append(relation_chunks_storage) + + # Persist all storage instances in parallel + if storages: + await asyncio.gather( + *[ + cast(StorageNameSpace, storage_inst).index_done_callback() + for storage_inst in storages # type: ignore + ] + ) + + +async def adelete_by_entity( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name: str, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> DeletionResult: + """Asynchronously delete an entity and all its relationships. + + Also cleans up entity_chunks_storage and relation_chunks_storage to remove chunk tracking. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + entity_name: Name of the entity to delete + entity_chunks_storage: Optional KV storage for tracking chunks that reference this entity + relation_chunks_storage: Optional KV storage for tracking chunks that reference relations + """ + # Use keyed lock for entity to ensure atomic graph and vector db operations + workspace = entities_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + async with get_storage_keyed_lock( + [entity_name], namespace=namespace, enable_logging=False + ): + try: + # Check if the entity exists + if not await chunk_entity_relation_graph.has_node(entity_name): + logger.warning(f"Entity '{entity_name}' not found.") + return DeletionResult( + status="not_found", + doc_id=entity_name, + message=f"Entity '{entity_name}' not found.", + status_code=404, + ) + # Retrieve related relationships before deleting the node + edges = await chunk_entity_relation_graph.get_node_edges(entity_name) + related_relations_count = len(edges) if edges else 0 + + # Clean up chunk tracking storages before deletion + if entity_chunks_storage is not None: + # Delete entity's entry from entity_chunks_storage + await entity_chunks_storage.delete([entity_name]) + logger.info( + f"Entity Delete: removed chunk tracking for `{entity_name}`" + ) + + if relation_chunks_storage is not None and edges: + # Delete all related relationships from relation_chunks_storage + from .utils import make_relation_chunk_key + + relation_keys_to_delete = [] + for src, tgt in edges: + # Normalize entity order for consistent key generation + normalized_src, normalized_tgt = sorted([src, tgt]) + storage_key = make_relation_chunk_key( + normalized_src, normalized_tgt + ) + relation_keys_to_delete.append(storage_key) + + if relation_keys_to_delete: + await relation_chunks_storage.delete(relation_keys_to_delete) + logger.info( + f"Entity Delete: removed chunk tracking for {len(relation_keys_to_delete)} relations" + ) + + await entities_vdb.delete_entity(entity_name) + await relationships_vdb.delete_entity_relation(entity_name) + await chunk_entity_relation_graph.delete_node(entity_name) + + message = f"Entity Delete: remove '{entity_name}' and its {related_relations_count} relations" + logger.info(message) + await _persist_graph_updates( + entities_vdb=entities_vdb, + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + return DeletionResult( + status="success", + doc_id=entity_name, + message=message, + status_code=200, + ) + except Exception as e: + error_message = f"Error while deleting entity '{entity_name}': {e}" + logger.error(error_message) + return DeletionResult( + status="fail", + doc_id=entity_name, + message=error_message, + status_code=500, + ) + + +async def adelete_by_relation( + chunk_entity_relation_graph, + relationships_vdb, + source_entity: str, + target_entity: str, + relation_chunks_storage=None, +) -> DeletionResult: + """Asynchronously delete a relation between two entities. + + Also cleans up relation_chunks_storage to remove chunk tracking. + + Args: + chunk_entity_relation_graph: Graph storage instance + relationships_vdb: Vector database storage for relationships + source_entity: Name of the source entity + target_entity: Name of the target entity + relation_chunks_storage: Optional KV storage for tracking chunks that reference this relation + """ + relation_str = f"{source_entity} -> {target_entity}" + # Normalize entity order for undirected graph (ensures consistent key generation) + if source_entity > target_entity: + source_entity, target_entity = target_entity, source_entity + + # Use keyed lock for relation to ensure atomic graph and vector db operations + workspace = relationships_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + sorted_edge_key = sorted([source_entity, target_entity]) + async with get_storage_keyed_lock( + sorted_edge_key, namespace=namespace, enable_logging=False + ): + try: + # Check if the relation exists + edge_exists = await chunk_entity_relation_graph.has_edge( + source_entity, target_entity + ) + if not edge_exists: + message = f"Relation from '{source_entity}' to '{target_entity}' does not exist" + logger.warning(message) + return DeletionResult( + status="not_found", + doc_id=relation_str, + message=message, + status_code=404, + ) + + # Clean up chunk tracking storage before deletion + if relation_chunks_storage is not None: + from .utils import make_relation_chunk_key + + # Normalize entity order for consistent key generation + normalized_src, normalized_tgt = sorted([source_entity, target_entity]) + storage_key = make_relation_chunk_key(normalized_src, normalized_tgt) + + await relation_chunks_storage.delete([storage_key]) + logger.info( + f"Relation Delete: removed chunk tracking for `{source_entity}`~`{target_entity}`" + ) + + # Delete relation from vector database + rel_ids_to_delete = [ + compute_mdhash_id(source_entity + target_entity, prefix="rel-"), + compute_mdhash_id(target_entity + source_entity, prefix="rel-"), + ] + + await relationships_vdb.delete(rel_ids_to_delete) + + # Delete relation from knowledge graph + await chunk_entity_relation_graph.remove_edges( + [(source_entity, target_entity)] + ) + + message = f"Relation Delete: `{source_entity}`~`{target_entity}` deleted successfully" + logger.info(message) + await _persist_graph_updates( + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + relation_chunks_storage=relation_chunks_storage, + ) + return DeletionResult( + status="success", + doc_id=relation_str, + message=message, + status_code=200, + ) + except Exception as e: + error_message = f"Error while deleting relation from '{source_entity}' to '{target_entity}': {e}" + logger.error(error_message) + return DeletionResult( + status="fail", + doc_id=relation_str, + message=error_message, + status_code=500, + ) + + +async def _edit_entity_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name: str, + updated_data: dict[str, str], + *, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> dict[str, Any]: + """Internal helper that edits an entity without acquiring storage locks. + + This function performs the actual entity edit operations without lock management. + It should only be called by public APIs that have already acquired necessary locks. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + entity_name: Name of the entity to edit + updated_data: Dictionary containing updated attributes (including optional entity_name for renaming) + entity_chunks_storage: Optional KV storage for tracking chunks + relation_chunks_storage: Optional KV storage for tracking relation chunks + + Returns: + Dictionary containing updated entity information + + Note: + Caller must acquire appropriate locks before calling this function. + If renaming (entity_name in updated_data), this function will check if the new name exists. + """ + new_entity_name = updated_data.get("entity_name", entity_name) + is_renaming = new_entity_name != entity_name + + original_entity_name = entity_name + + node_exists = await chunk_entity_relation_graph.has_node(entity_name) + if not node_exists: + raise ValueError(f"Entity '{entity_name}' does not exist") + node_data = await chunk_entity_relation_graph.get_node(entity_name) + + if is_renaming: + existing_node = await chunk_entity_relation_graph.has_node(new_entity_name) + if existing_node: + raise ValueError( + f"Entity name '{new_entity_name}' already exists, cannot rename" + ) + + new_node_data = {**node_data, **updated_data} + new_node_data["entity_id"] = new_entity_name + + if "entity_name" in new_node_data: + del new_node_data[ + "entity_name" + ] # Node data should not contain entity_name field + + if is_renaming: + logger.info(f"Entity Edit: renaming `{entity_name}` to `{new_entity_name}`") + + await chunk_entity_relation_graph.upsert_node(new_entity_name, new_node_data) + + relations_to_update = [] + relations_to_delete = [] + edges = await chunk_entity_relation_graph.get_node_edges(entity_name) + if edges: + for source, target in edges: + edge_data = await chunk_entity_relation_graph.get_edge(source, target) + if edge_data: + relations_to_delete.append( + compute_mdhash_id(source + target, prefix="rel-") + ) + relations_to_delete.append( + compute_mdhash_id(target + source, prefix="rel-") + ) + if source == entity_name: + await chunk_entity_relation_graph.upsert_edge( + new_entity_name, target, edge_data + ) + relations_to_update.append((new_entity_name, target, edge_data)) + else: # target == entity_name + await chunk_entity_relation_graph.upsert_edge( + source, new_entity_name, edge_data + ) + relations_to_update.append((source, new_entity_name, edge_data)) + + await chunk_entity_relation_graph.delete_node(entity_name) + + old_entity_id = compute_mdhash_id(entity_name, prefix="ent-") + await entities_vdb.delete([old_entity_id]) + + await relationships_vdb.delete(relations_to_delete) + + for src, tgt, edge_data in relations_to_update: + normalized_src, normalized_tgt = sorted([src, tgt]) + + description = edge_data.get("description", "") + keywords = edge_data.get("keywords", "") + source_id = edge_data.get("source_id", "") + weight = float(edge_data.get("weight", 1.0)) + + content = f"{normalized_src}\t{normalized_tgt}\n{keywords}\n{description}" + + relation_id = compute_mdhash_id( + normalized_src + normalized_tgt, prefix="rel-" + ) + + relation_data = { + relation_id: { + "content": content, + "src_id": normalized_src, + "tgt_id": normalized_tgt, + "source_id": source_id, + "description": description, + "keywords": keywords, + "weight": weight, + } + } + + await relationships_vdb.upsert(relation_data) + + entity_name = new_entity_name + else: + await chunk_entity_relation_graph.upsert_node(entity_name, new_node_data) + + description = new_node_data.get("description", "") + source_id = new_node_data.get("source_id", "") + entity_type = new_node_data.get("entity_type", "") + content = entity_name + "\n" + description + + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + + entity_data = { + entity_id: { + "content": content, + "entity_name": entity_name, + "source_id": source_id, + "description": description, + "entity_type": entity_type, + } + } + + await entities_vdb.upsert(entity_data) + + if entity_chunks_storage is not None or relation_chunks_storage is not None: + from .utils import make_relation_chunk_key, compute_incremental_chunk_ids + + if entity_chunks_storage is not None: + storage_key = original_entity_name if is_renaming else entity_name + stored_data = await entity_chunks_storage.get_by_id(storage_key) + has_stored_data = ( + stored_data + and isinstance(stored_data, dict) + and stored_data.get("chunk_ids") + ) + + old_source_id = node_data.get("source_id", "") + old_chunk_ids = [cid for cid in old_source_id.split(GRAPH_FIELD_SEP) if cid] + + new_source_id = new_node_data.get("source_id", "") + new_chunk_ids = [cid for cid in new_source_id.split(GRAPH_FIELD_SEP) if cid] + + source_id_changed = set(new_chunk_ids) != set(old_chunk_ids) + + if source_id_changed or not has_stored_data or is_renaming: + existing_full_chunk_ids = [] + if has_stored_data: + existing_full_chunk_ids = [ + cid for cid in stored_data.get("chunk_ids", []) if cid + ] + + if not existing_full_chunk_ids: + existing_full_chunk_ids = old_chunk_ids.copy() + + updated_chunk_ids = compute_incremental_chunk_ids( + existing_full_chunk_ids, old_chunk_ids, new_chunk_ids + ) + + if is_renaming: + await entity_chunks_storage.delete([original_entity_name]) + await entity_chunks_storage.upsert( + { + entity_name: { + "chunk_ids": updated_chunk_ids, + "count": len(updated_chunk_ids), + } + } + ) + else: + await entity_chunks_storage.upsert( + { + entity_name: { + "chunk_ids": updated_chunk_ids, + "count": len(updated_chunk_ids), + } + } + ) + + logger.info( + f"Entity Edit: find {len(updated_chunk_ids)} chunks related to `{entity_name}`" + ) + + if is_renaming and relation_chunks_storage is not None and relations_to_update: + for src, tgt, edge_data in relations_to_update: + old_src = original_entity_name if src == entity_name else src + old_tgt = original_entity_name if tgt == entity_name else tgt + + old_normalized_src, old_normalized_tgt = sorted([old_src, old_tgt]) + new_normalized_src, new_normalized_tgt = sorted([src, tgt]) + + old_storage_key = make_relation_chunk_key( + old_normalized_src, old_normalized_tgt + ) + new_storage_key = make_relation_chunk_key( + new_normalized_src, new_normalized_tgt + ) + + if old_storage_key != new_storage_key: + old_stored_data = await relation_chunks_storage.get_by_id( + old_storage_key + ) + relation_chunk_ids = [] + + if old_stored_data and isinstance(old_stored_data, dict): + relation_chunk_ids = [ + cid for cid in old_stored_data.get("chunk_ids", []) if cid + ] + else: + relation_source_id = edge_data.get("source_id", "") + relation_chunk_ids = [ + cid + for cid in relation_source_id.split(GRAPH_FIELD_SEP) + if cid + ] + + await relation_chunks_storage.delete([old_storage_key]) + + if relation_chunk_ids: + await relation_chunks_storage.upsert( + { + new_storage_key: { + "chunk_ids": relation_chunk_ids, + "count": len(relation_chunk_ids), + } + } + ) + logger.info( + f"Entity Edit: migrate {len(relations_to_update)} relations after rename" + ) + + await _persist_graph_updates( + entities_vdb=entities_vdb, + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + + logger.info(f"Entity Edit: `{entity_name}` successfully updated") + return await get_entity_info( + chunk_entity_relation_graph, + entities_vdb, + entity_name, + include_vector_data=True, + ) + + +async def aedit_entity( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name: str, + updated_data: dict[str, str], + allow_rename: bool = True, + allow_merge: bool = False, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> dict[str, Any]: + """Asynchronously edit entity information. + + Updates entity information in the knowledge graph and re-embeds the entity in the vector database. + Also synchronizes entity_chunks_storage and relation_chunks_storage to track chunk references. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + entity_name: Name of the entity to edit + updated_data: Dictionary containing updated attributes, e.g. {"description": "new description", "entity_type": "new type"} + allow_rename: Whether to allow entity renaming, defaults to True + allow_merge: Whether to merge into an existing entity when renaming to an existing name, defaults to False + entity_chunks_storage: Optional KV storage for tracking chunks that reference this entity + relation_chunks_storage: Optional KV storage for tracking chunks that reference relations + + Returns: + Dictionary containing updated entity information and operation summary with the following structure: + { + "entity_name": str, # Name of the entity + "description": str, # Entity description + "entity_type": str, # Entity type + "source_id": str, # Source chunk IDs + ... # Other entity properties + "operation_summary": { + "merged": bool, # Whether entity was merged + "merge_status": str, # "success" | "failed" | "not_attempted" + "merge_error": str | None, # Error message if merge failed + "operation_status": str, # "success" | "partial_success" | "failure" + "target_entity": str | None, # Target entity name if renaming/merging + "final_entity": str, # Final entity name after operation + "renamed": bool # Whether entity was renamed + } + } + + operation_status values: + - "success": Operation completed successfully (update/rename/merge all succeeded) + - "partial_success": Non-name updates succeeded but merge failed + - "failure": Operation failed completely + + merge_status values: + - "success": Entity successfully merged into target + - "failed": Merge operation failed + - "not_attempted": No merge was attempted (normal update/rename) + """ + new_entity_name = updated_data.get("entity_name", entity_name) + is_renaming = new_entity_name != entity_name + + lock_keys = sorted({entity_name, new_entity_name}) if is_renaming else [entity_name] + + workspace = entities_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + + operation_summary: dict[str, Any] = { + "merged": False, + "merge_status": "not_attempted", + "merge_error": None, + "operation_status": "success", + "target_entity": None, + "final_entity": new_entity_name if is_renaming else entity_name, + "renamed": is_renaming, + } + async with get_storage_keyed_lock( + lock_keys, namespace=namespace, enable_logging=False + ): + try: + if is_renaming and not allow_rename: + raise ValueError( + "Entity renaming is not allowed. Set allow_rename=True to enable this feature" + ) + + if is_renaming: + target_exists = await chunk_entity_relation_graph.has_node( + new_entity_name + ) + if target_exists: + if not allow_merge: + raise ValueError( + f"Entity name '{new_entity_name}' already exists, cannot rename" + ) + + logger.info( + f"Entity Edit: `{entity_name}` will be merged into `{new_entity_name}`" + ) + + # Track whether non-name updates were applied + non_name_updates_applied = False + non_name_updates = { + key: value + for key, value in updated_data.items() + if key != "entity_name" + } + + # Apply non-name updates first + if non_name_updates: + try: + logger.info( + "Entity Edit: applying non-name updates before merge" + ) + await _edit_entity_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name, + non_name_updates, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + non_name_updates_applied = True + except Exception as update_error: + # If update fails, re-raise immediately + logger.error( + f"Entity Edit: non-name updates failed: {update_error}" + ) + raise + + # Attempt to merge entities + try: + merge_result = await _merge_entities_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + [entity_name], + new_entity_name, + merge_strategy=None, + target_entity_data=None, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + + # Merge succeeded + operation_summary.update( + { + "merged": True, + "merge_status": "success", + "merge_error": None, + "operation_status": "success", + "target_entity": new_entity_name, + "final_entity": new_entity_name, + } + ) + return {**merge_result, "operation_summary": operation_summary} + + except Exception as merge_error: + # Merge failed, but update may have succeeded + logger.error(f"Entity Edit: merge failed: {merge_error}") + + # Return partial success status (update succeeded but merge failed) + operation_summary.update( + { + "merged": False, + "merge_status": "failed", + "merge_error": str(merge_error), + "operation_status": "partial_success" + if non_name_updates_applied + else "failure", + "target_entity": new_entity_name, + "final_entity": entity_name, # Keep source entity name + } + ) + + # Get current entity info (with applied updates if any) + entity_info = await get_entity_info( + chunk_entity_relation_graph, + entities_vdb, + entity_name, + include_vector_data=True, + ) + return {**entity_info, "operation_summary": operation_summary} + + # Normal edit flow (no merge involved) + edit_result = await _edit_entity_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name, + updated_data, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + operation_summary["operation_status"] = "success" + return {**edit_result, "operation_summary": operation_summary} + + except Exception as e: + logger.error(f"Error while editing entity '{entity_name}': {e}") + raise + + +async def aedit_relation( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + source_entity: str, + target_entity: str, + updated_data: dict[str, Any], + relation_chunks_storage=None, +) -> dict[str, Any]: + """Asynchronously edit relation information. + + Updates relation (edge) information in the knowledge graph and re-embeds the relation in the vector database. + Also synchronizes the relation_chunks_storage to track which chunks reference this relation. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + source_entity: Name of the source entity + target_entity: Name of the target entity + updated_data: Dictionary containing updated attributes, e.g. {"description": "new description", "keywords": "new keywords"} + relation_chunks_storage: Optional KV storage for tracking chunks that reference this relation + + Returns: + Dictionary containing updated relation information + """ + # Normalize entity order for undirected graph (ensures consistent key generation) + if source_entity > target_entity: + source_entity, target_entity = target_entity, source_entity + + # Use keyed lock for relation to ensure atomic graph and vector db operations + workspace = relationships_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + sorted_edge_key = sorted([source_entity, target_entity]) + async with get_storage_keyed_lock( + sorted_edge_key, namespace=namespace, enable_logging=False + ): + try: + # 1. Get current relation information + edge_exists = await chunk_entity_relation_graph.has_edge( + source_entity, target_entity + ) + if not edge_exists: + raise ValueError( + f"Relation from '{source_entity}' to '{target_entity}' does not exist" + ) + edge_data = await chunk_entity_relation_graph.get_edge( + source_entity, target_entity + ) + # Important: First delete the old relation record from the vector database + # Delete both permutations to handle relationships created before normalization + rel_ids_to_delete = [ + compute_mdhash_id(source_entity + target_entity, prefix="rel-"), + compute_mdhash_id(target_entity + source_entity, prefix="rel-"), + ] + await relationships_vdb.delete(rel_ids_to_delete) + logger.debug( + f"Relation Delete: delete vdb for `{source_entity}`~`{target_entity}`" + ) + + # 2. Update relation information in the graph + new_edge_data = {**edge_data, **updated_data} + await chunk_entity_relation_graph.upsert_edge( + source_entity, target_entity, new_edge_data + ) + + # 3. Recalculate relation's vector representation and update vector database + description = new_edge_data.get("description", "") + keywords = new_edge_data.get("keywords", "") + source_id = new_edge_data.get("source_id", "") + weight = float(new_edge_data.get("weight", 1.0)) + + # Create content for embedding + content = f"{source_entity}\t{target_entity}\n{keywords}\n{description}" + + # Calculate relation ID + relation_id = compute_mdhash_id( + source_entity + target_entity, prefix="rel-" + ) + + # Prepare data for vector database update + relation_data = { + relation_id: { + "content": content, + "src_id": source_entity, + "tgt_id": target_entity, + "source_id": source_id, + "description": description, + "keywords": keywords, + "weight": weight, + } + } + + # Update vector database + await relationships_vdb.upsert(relation_data) + + # 4. Update relation_chunks_storage in two scenarios: + # - source_id has changed (edit scenario) + # - relation_chunks_storage has no existing data (migration/initialization scenario) + if relation_chunks_storage is not None: + from .utils import ( + make_relation_chunk_key, + compute_incremental_chunk_ids, + ) + + storage_key = make_relation_chunk_key(source_entity, target_entity) + + # Check if storage has existing data + stored_data = await relation_chunks_storage.get_by_id(storage_key) + has_stored_data = ( + stored_data + and isinstance(stored_data, dict) + and stored_data.get("chunk_ids") + ) + + # Get old and new source_id + old_source_id = edge_data.get("source_id", "") + old_chunk_ids = [ + cid for cid in old_source_id.split(GRAPH_FIELD_SEP) if cid + ] + + new_source_id = new_edge_data.get("source_id", "") + new_chunk_ids = [ + cid for cid in new_source_id.split(GRAPH_FIELD_SEP) if cid + ] + + source_id_changed = set(new_chunk_ids) != set(old_chunk_ids) + + # Update if: source_id changed OR storage has no data + if source_id_changed or not has_stored_data: + # Get existing full chunk_ids from storage + existing_full_chunk_ids = [] + if has_stored_data: + existing_full_chunk_ids = [ + cid for cid in stored_data.get("chunk_ids", []) if cid + ] + + # If no stored data exists, use old source_id as baseline + if not existing_full_chunk_ids: + existing_full_chunk_ids = old_chunk_ids.copy() + + # Use utility function to compute incremental updates + updated_chunk_ids = compute_incremental_chunk_ids( + existing_full_chunk_ids, old_chunk_ids, new_chunk_ids + ) + + # Update storage (Update even if updated_chunk_ids is empty) + await relation_chunks_storage.upsert( + { + storage_key: { + "chunk_ids": updated_chunk_ids, + "count": len(updated_chunk_ids), + } + } + ) + + logger.info( + f"Relation Delete: update chunk tracking for `{source_entity}`~`{target_entity}`" + ) + + # 5. Save changes + await _persist_graph_updates( + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + relation_chunks_storage=relation_chunks_storage, + ) + + logger.info( + f"Relation Delete: `{source_entity}`~`{target_entity}`' successfully updated" + ) + return await get_relation_info( + chunk_entity_relation_graph, + relationships_vdb, + source_entity, + target_entity, + include_vector_data=True, + ) + except Exception as e: + logger.error( + f"Error while editing relation from '{source_entity}' to '{target_entity}': {e}" + ) + raise + + +async def acreate_entity( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + entity_name: str, + entity_data: dict[str, Any], + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> dict[str, Any]: + """Asynchronously create a new entity. + + Creates a new entity in the knowledge graph and adds it to the vector database. + Also synchronizes entity_chunks_storage to track chunk references. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + entity_name: Name of the new entity + entity_data: Dictionary containing entity attributes, e.g. {"description": "description", "entity_type": "type"} + entity_chunks_storage: Optional KV storage for tracking chunks that reference this entity + relation_chunks_storage: Optional KV storage for tracking chunks that reference relations + + Returns: + Dictionary containing created entity information + """ + # Use keyed lock for entity to ensure atomic graph and vector db operations + workspace = entities_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + async with get_storage_keyed_lock( + [entity_name], namespace=namespace, enable_logging=False + ): + try: + # Check if entity already exists + existing_node = await chunk_entity_relation_graph.has_node(entity_name) + if existing_node: + raise ValueError(f"Entity '{entity_name}' already exists") + + # Prepare node data with defaults if missing + node_data = { + "entity_id": entity_name, + "entity_type": entity_data.get("entity_type", "UNKNOWN"), + "description": entity_data.get("description", ""), + "source_id": entity_data.get("source_id", "manual_creation"), + "file_path": entity_data.get("file_path", "manual_creation"), + "created_at": int(time.time()), + } + + # Add entity to knowledge graph + await chunk_entity_relation_graph.upsert_node(entity_name, node_data) + + # Prepare content for entity + description = node_data.get("description", "") + source_id = node_data.get("source_id", "") + entity_type = node_data.get("entity_type", "") + content = entity_name + "\n" + description + + # Calculate entity ID + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + + # Prepare data for vector database update + entity_data_for_vdb = { + entity_id: { + "content": content, + "entity_name": entity_name, + "source_id": source_id, + "description": description, + "entity_type": entity_type, + "file_path": entity_data.get("file_path", "manual_creation"), + } + } + + # Update vector database + await entities_vdb.upsert(entity_data_for_vdb) + + # Update entity_chunks_storage to track chunk references + if entity_chunks_storage is not None: + source_id = node_data.get("source_id", "") + chunk_ids = [cid for cid in source_id.split(GRAPH_FIELD_SEP) if cid] + + if chunk_ids: + await entity_chunks_storage.upsert( + { + entity_name: { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + } + ) + logger.info( + f"Entity Create: tracked {len(chunk_ids)} chunks for `{entity_name}`" + ) + + # Save changes + await _persist_graph_updates( + entities_vdb=entities_vdb, + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + + logger.info(f"Entity Create: '{entity_name}' successfully created") + return await get_entity_info( + chunk_entity_relation_graph, + entities_vdb, + entity_name, + include_vector_data=True, + ) + except Exception as e: + logger.error(f"Error while creating entity '{entity_name}': {e}") + raise + + +async def acreate_relation( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + source_entity: str, + target_entity: str, + relation_data: dict[str, Any], + relation_chunks_storage=None, +) -> dict[str, Any]: + """Asynchronously create a new relation between entities. + + Creates a new relation (edge) in the knowledge graph and adds it to the vector database. + Also synchronizes relation_chunks_storage to track chunk references. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + source_entity: Name of the source entity + target_entity: Name of the target entity + relation_data: Dictionary containing relation attributes, e.g. {"description": "description", "keywords": "keywords"} + relation_chunks_storage: Optional KV storage for tracking chunks that reference this relation + + Returns: + Dictionary containing created relation information + """ + # Use keyed lock for relation to ensure atomic graph and vector db operations + workspace = relationships_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + sorted_edge_key = sorted([source_entity, target_entity]) + async with get_storage_keyed_lock( + sorted_edge_key, namespace=namespace, enable_logging=False + ): + try: + # Check if both entities exist + source_exists = await chunk_entity_relation_graph.has_node(source_entity) + target_exists = await chunk_entity_relation_graph.has_node(target_entity) + + if not source_exists: + raise ValueError(f"Source entity '{source_entity}' does not exist") + if not target_exists: + raise ValueError(f"Target entity '{target_entity}' does not exist") + + # Check if relation already exists + existing_edge = await chunk_entity_relation_graph.has_edge( + source_entity, target_entity + ) + if existing_edge: + raise ValueError( + f"Relation from '{source_entity}' to '{target_entity}' already exists" + ) + + # Prepare edge data with defaults if missing + edge_data = { + "description": relation_data.get("description", ""), + "keywords": relation_data.get("keywords", ""), + "source_id": relation_data.get("source_id", "manual_creation"), + "weight": float(relation_data.get("weight", 1.0)), + "file_path": relation_data.get("file_path", "manual_creation"), + "created_at": int(time.time()), + } + + # Add relation to knowledge graph + await chunk_entity_relation_graph.upsert_edge( + source_entity, target_entity, edge_data + ) + + # Normalize entity order for undirected relation vector (ensures consistent key generation) + if source_entity > target_entity: + source_entity, target_entity = target_entity, source_entity + + # Prepare content for embedding + description = edge_data.get("description", "") + keywords = edge_data.get("keywords", "") + source_id = edge_data.get("source_id", "") + weight = edge_data.get("weight", 1.0) + + # Create content for embedding + content = f"{keywords}\t{source_entity}\n{target_entity}\n{description}" + + # Calculate relation ID + relation_id = compute_mdhash_id( + source_entity + target_entity, prefix="rel-" + ) + + # Prepare data for vector database update + relation_data_for_vdb = { + relation_id: { + "content": content, + "src_id": source_entity, + "tgt_id": target_entity, + "source_id": source_id, + "description": description, + "keywords": keywords, + "weight": weight, + "file_path": relation_data.get("file_path", "manual_creation"), + } + } + + # Update vector database + await relationships_vdb.upsert(relation_data_for_vdb) + + # Update relation_chunks_storage to track chunk references + if relation_chunks_storage is not None: + from .utils import make_relation_chunk_key + + # Normalize entity order for consistent key generation + normalized_src, normalized_tgt = sorted([source_entity, target_entity]) + storage_key = make_relation_chunk_key(normalized_src, normalized_tgt) + + source_id = edge_data.get("source_id", "") + chunk_ids = [cid for cid in source_id.split(GRAPH_FIELD_SEP) if cid] + + if chunk_ids: + await relation_chunks_storage.upsert( + { + storage_key: { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + } + ) + logger.info( + f"Relation Create: tracked {len(chunk_ids)} chunks for `{source_entity}`~`{target_entity}`" + ) + + # Save changes + await _persist_graph_updates( + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + relation_chunks_storage=relation_chunks_storage, + ) + + logger.info( + f"Relation Create: `{source_entity}`~`{target_entity}` successfully created" + ) + return await get_relation_info( + chunk_entity_relation_graph, + relationships_vdb, + source_entity, + target_entity, + include_vector_data=True, + ) + except Exception as e: + logger.error( + f"Error while creating relation from '{source_entity}' to '{target_entity}': {e}" + ) + raise + + +async def _merge_entities_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + source_entities: list[str], + target_entity: str, + *, + merge_strategy: dict[str, str] = None, + target_entity_data: dict[str, Any] = None, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> dict[str, Any]: + """Internal helper that merges entities without acquiring storage locks. + + This function performs the actual entity merge operations without lock management. + It should only be called by public APIs that have already acquired necessary locks. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + source_entities: List of source entity names to merge + target_entity: Name of the target entity after merging + merge_strategy: Deprecated. Merge strategy for each field (optional) + target_entity_data: Dictionary of specific values to set for target entity (optional) + entity_chunks_storage: Optional KV storage for tracking chunks + relation_chunks_storage: Optional KV storage for tracking relation chunks + + Returns: + Dictionary containing the merged entity information + + Note: + Caller must acquire appropriate locks before calling this function. + All source entities and the target entity should be locked together. + """ + # Default merge strategy for entities + default_entity_merge_strategy = { + "description": "concatenate", + "entity_type": "keep_first", + "source_id": "join_unique", + "file_path": "join_unique", + } + effective_entity_merge_strategy = default_entity_merge_strategy + if merge_strategy: + logger.warning( + "Entity Merge: merge_strategy parameter is deprecated and will be ignored in a future release." + ) + effective_entity_merge_strategy = { + **default_entity_merge_strategy, + **merge_strategy, + } + target_entity_data = {} if target_entity_data is None else target_entity_data + + # 1. Check if all source entities exist + source_entities_data = {} + for entity_name in source_entities: + node_exists = await chunk_entity_relation_graph.has_node(entity_name) + if not node_exists: + raise ValueError(f"Source entity '{entity_name}' does not exist") + node_data = await chunk_entity_relation_graph.get_node(entity_name) + source_entities_data[entity_name] = node_data + + # 2. Check if target entity exists and get its data if it does + target_exists = await chunk_entity_relation_graph.has_node(target_entity) + existing_target_entity_data = {} + if target_exists: + existing_target_entity_data = await chunk_entity_relation_graph.get_node( + target_entity + ) + + # 3. Merge entity data + merged_entity_data = _merge_attributes( + list(source_entities_data.values()) + + ([existing_target_entity_data] if target_exists else []), + effective_entity_merge_strategy, + filter_none_only=False, # Use entity behavior: filter falsy values + ) + + # Apply any explicitly provided target entity data (overrides merged data) + for key, value in target_entity_data.items(): + merged_entity_data[key] = value + + # 4. Get all relationships of the source entities and target entity (if exists) + all_relations = [] + entities_to_collect = source_entities.copy() + + # If target entity exists and not already in source_entities, add it + if target_exists and target_entity not in source_entities: + entities_to_collect.append(target_entity) + + for entity_name in entities_to_collect: + # Get all relationships of the entities + edges = await chunk_entity_relation_graph.get_node_edges(entity_name) + if edges: + for src, tgt in edges: + # Ensure src is the current entity + if src == entity_name: + edge_data = await chunk_entity_relation_graph.get_edge(src, tgt) + all_relations.append((src, tgt, edge_data)) + + # 5. Create or update the target entity + merged_entity_data["entity_id"] = target_entity + if not target_exists: + await chunk_entity_relation_graph.upsert_node(target_entity, merged_entity_data) + logger.info(f"Entity Merge: created target '{target_entity}'") + else: + await chunk_entity_relation_graph.upsert_node(target_entity, merged_entity_data) + logger.info(f"Entity Merge: Updated target '{target_entity}'") + + # 6. Recreate all relations pointing to the target entity in KG + # Also collect chunk tracking information in the same loop + relation_updates = {} # Track relationships that need to be merged + relations_to_delete = [] + + # Initialize chunk tracking variables + relation_chunk_tracking = {} # key: storage_key, value: list of chunk_ids + old_relation_keys_to_delete = [] + + for src, tgt, edge_data in all_relations: + relations_to_delete.append(compute_mdhash_id(src + tgt, prefix="rel-")) + relations_to_delete.append(compute_mdhash_id(tgt + src, prefix="rel-")) + + # Collect old chunk tracking key for deletion + if relation_chunks_storage is not None: + from .utils import make_relation_chunk_key + + old_storage_key = make_relation_chunk_key(src, tgt) + old_relation_keys_to_delete.append(old_storage_key) + + new_src = target_entity if src in source_entities else src + new_tgt = target_entity if tgt in source_entities else tgt + + # Skip relationships between source entities to avoid self-loops + if new_src == new_tgt: + logger.info(f"Entity Merge: skipping `{src}`~`{tgt}` to avoid self-loop") + continue + + # Normalize entity order for consistent duplicate detection (undirected relationships) + normalized_src, normalized_tgt = sorted([new_src, new_tgt]) + relation_key = f"{normalized_src}|{normalized_tgt}" + + # Process chunk tracking for this relation + if relation_chunks_storage is not None: + storage_key = make_relation_chunk_key(normalized_src, normalized_tgt) + + # Get chunk_ids from storage for this original relation + stored = await relation_chunks_storage.get_by_id(old_storage_key) + + if stored is not None and isinstance(stored, dict): + chunk_ids = [cid for cid in stored.get("chunk_ids", []) if cid] + else: + # Fallback to source_id from graph + source_id = edge_data.get("source_id", "") + chunk_ids = [cid for cid in source_id.split(GRAPH_FIELD_SEP) if cid] + + # Accumulate chunk_ids with ordered deduplication + if storage_key not in relation_chunk_tracking: + relation_chunk_tracking[storage_key] = [] + + existing_chunks = set(relation_chunk_tracking[storage_key]) + for chunk_id in chunk_ids: + if chunk_id not in existing_chunks: + existing_chunks.add(chunk_id) + relation_chunk_tracking[storage_key].append(chunk_id) + + if relation_key in relation_updates: + # Merge relationship data + existing_data = relation_updates[relation_key]["data"] + merged_relation = _merge_attributes( + [existing_data, edge_data], + { + "description": "concatenate", + "keywords": "join_unique_comma", + "source_id": "join_unique", + "file_path": "join_unique", + "weight": "max", + }, + filter_none_only=True, # Use relation behavior: only filter None + ) + relation_updates[relation_key]["data"] = merged_relation + logger.debug( + f"Entity Merge: deduplicating relation `{normalized_src}`~`{normalized_tgt}`" + ) + else: + relation_updates[relation_key] = { + "graph_src": new_src, + "graph_tgt": new_tgt, + "norm_src": normalized_src, + "norm_tgt": normalized_tgt, + "data": edge_data.copy(), + } + + # Apply relationship updates + logger.info(f"Entity Merge: updatign {len(relation_updates)} relations") + for rel_data in relation_updates.values(): + await chunk_entity_relation_graph.upsert_edge( + rel_data["graph_src"], rel_data["graph_tgt"], rel_data["data"] + ) + logger.info( + f"Entity Merge: updating relation `{rel_data['graph_src']}`~`{rel_data['graph_tgt']}`" + ) + + # Update relation chunk tracking storage + if relation_chunks_storage is not None and all_relations: + if old_relation_keys_to_delete: + await relation_chunks_storage.delete(old_relation_keys_to_delete) + + if relation_chunk_tracking: + updates = {} + for storage_key, chunk_ids in relation_chunk_tracking.items(): + updates[storage_key] = { + "chunk_ids": chunk_ids, + "count": len(chunk_ids), + } + + await relation_chunks_storage.upsert(updates) + logger.info( + f"Entity Merge: {len(updates)} relation chunk tracking records updated" + ) + + # 7. Update relationship vector representations + logger.debug( + f"Entity Merge: deleting {len(relations_to_delete)} relations from vdb" + ) + await relationships_vdb.delete(relations_to_delete) + + for rel_data in relation_updates.values(): + edge_data = rel_data["data"] + normalized_src = rel_data["norm_src"] + normalized_tgt = rel_data["norm_tgt"] + + description = edge_data.get("description", "") + keywords = edge_data.get("keywords", "") + source_id = edge_data.get("source_id", "") + weight = float(edge_data.get("weight", 1.0)) + + # Use normalized order for content and relation ID + content = f"{keywords}\t{normalized_src}\n{normalized_tgt}\n{description}" + relation_id = compute_mdhash_id(normalized_src + normalized_tgt, prefix="rel-") + + relation_data_for_vdb = { + relation_id: { + "content": content, + "src_id": normalized_src, + "tgt_id": normalized_tgt, + "source_id": source_id, + "description": description, + "keywords": keywords, + "weight": weight, + } + } + await relationships_vdb.upsert(relation_data_for_vdb) + logger.debug( + f"Entity Merge: updating vdb `{normalized_src}`~`{normalized_tgt}`" + ) + + logger.info(f"Entity Merge: {len(relation_updates)} relations in vdb updated") + + # 8. Update entity vector representation + description = merged_entity_data.get("description", "") + source_id = merged_entity_data.get("source_id", "") + entity_type = merged_entity_data.get("entity_type", "") + content = target_entity + "\n" + description + + entity_id = compute_mdhash_id(target_entity, prefix="ent-") + entity_data_for_vdb = { + entity_id: { + "content": content, + "entity_name": target_entity, + "source_id": source_id, + "description": description, + "entity_type": entity_type, + } + } + await entities_vdb.upsert(entity_data_for_vdb) + logger.info(f"Entity Merge: updating vdb `{target_entity}`") + + # 9. Merge entity chunk tracking (source entities first, then target entity) + if entity_chunks_storage is not None: + all_chunk_id_lists = [] + + # Build list of entities to process (source entities first, then target entity) + entities_to_process = [] + + # Add source entities first (excluding target if it's already in source list) + for entity_name in source_entities: + if entity_name != target_entity: + entities_to_process.append(entity_name) + + # Add target entity last (if it exists) + if target_exists: + entities_to_process.append(target_entity) + + # Process all entities in order with unified logic + for entity_name in entities_to_process: + stored = await entity_chunks_storage.get_by_id(entity_name) + if stored and isinstance(stored, dict): + chunk_ids = [cid for cid in stored.get("chunk_ids", []) if cid] + if chunk_ids: + all_chunk_id_lists.append(chunk_ids) + + # Merge chunk_ids with ordered deduplication (preserves order, source entities first) + merged_chunk_ids = [] + seen = set() + for chunk_id_list in all_chunk_id_lists: + for chunk_id in chunk_id_list: + if chunk_id not in seen: + seen.add(chunk_id) + merged_chunk_ids.append(chunk_id) + + # Delete source entities' chunk tracking records + entity_keys_to_delete = [e for e in source_entities if e != target_entity] + if entity_keys_to_delete: + await entity_chunks_storage.delete(entity_keys_to_delete) + + # Update target entity's chunk tracking + if merged_chunk_ids: + await entity_chunks_storage.upsert( + { + target_entity: { + "chunk_ids": merged_chunk_ids, + "count": len(merged_chunk_ids), + } + } + ) + logger.info( + f"Entity Merge: find {len(merged_chunk_ids)} chunks related to '{target_entity}'" + ) + + # 10. Delete source entities + for entity_name in source_entities: + if entity_name == target_entity: + logger.warning( + f"Entity Merge: source entity'{entity_name}' is same as target entity" + ) + continue + + logger.info(f"Entity Merge: deleting '{entity_name}' from KG and vdb") + + # Delete entity node and related edges from knowledge graph + await chunk_entity_relation_graph.delete_node(entity_name) + + # Delete entity record from vector database + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + await entities_vdb.delete([entity_id]) + + # 11. Save changes + await _persist_graph_updates( + entities_vdb=entities_vdb, + relationships_vdb=relationships_vdb, + chunk_entity_relation_graph=chunk_entity_relation_graph, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + + logger.info( + f"Entity Merge: successfully merged {len(source_entities)} entities into '{target_entity}'" + ) + return await get_entity_info( + chunk_entity_relation_graph, + entities_vdb, + target_entity, + include_vector_data=True, + ) + + +async def amerge_entities( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + source_entities: list[str], + target_entity: str, + merge_strategy: dict[str, str] = None, + target_entity_data: dict[str, Any] = None, + entity_chunks_storage=None, + relation_chunks_storage=None, +) -> dict[str, Any]: + """Asynchronously merge multiple entities into one entity. + + Merges multiple source entities into a target entity, handling all relationships, + and updating both the knowledge graph and vector database. + Also merges chunk tracking information from entity_chunks_storage and relation_chunks_storage. + + Args: + chunk_entity_relation_graph: Graph storage instance + entities_vdb: Vector database storage for entities + relationships_vdb: Vector database storage for relationships + source_entities: List of source entity names to merge + target_entity: Name of the target entity after merging + merge_strategy: Deprecated (Each field uses its own default strategy). If provided, + customizations are applied but a warning is logged. + target_entity_data: Dictionary of specific values to set for the target entity, + overriding any merged values, e.g. {"description": "custom description", "entity_type": "PERSON"} + entity_chunks_storage: Optional KV storage for tracking chunks that reference entities + relation_chunks_storage: Optional KV storage for tracking chunks that reference relations + + Returns: + Dictionary containing the merged entity information + """ + # Collect all entities involved (source + target) and lock them all in sorted order + all_entities = set(source_entities) + all_entities.add(target_entity) + lock_keys = sorted(all_entities) + + workspace = entities_vdb.global_config.get("workspace", "") + namespace = f"{workspace}:GraphDB" if workspace else "GraphDB" + async with get_storage_keyed_lock( + lock_keys, namespace=namespace, enable_logging=False + ): + try: + return await _merge_entities_impl( + chunk_entity_relation_graph, + entities_vdb, + relationships_vdb, + source_entities, + target_entity, + merge_strategy=merge_strategy, + target_entity_data=target_entity_data, + entity_chunks_storage=entity_chunks_storage, + relation_chunks_storage=relation_chunks_storage, + ) + except Exception as e: + logger.error(f"Error merging entities: {e}") + raise + + +def _merge_attributes( + data_list: list[dict[str, Any]], + merge_strategy: dict[str, str], + filter_none_only: bool = False, +) -> dict[str, Any]: + """Merge attributes from multiple entities or relationships. + + This unified function handles merging of both entity and relationship attributes, + applying different merge strategies per field. + + Args: + data_list: List of dictionaries containing entity or relationship data + merge_strategy: Merge strategy for each field. Supported strategies: + - "concatenate": Join all values with GRAPH_FIELD_SEP + - "keep_first": Keep the first non-empty value + - "keep_last": Keep the last non-empty value + - "join_unique": Join unique items separated by GRAPH_FIELD_SEP + - "join_unique_comma": Join unique items separated by comma and space + - "max": Keep the maximum numeric value (for numeric fields) + filter_none_only: If True, only filter None values (keep empty strings, 0, etc.). + If False, filter all falsy values. Default is False for backward compatibility. + + Returns: + Dictionary containing merged data + """ + merged_data = {} + + # Collect all possible keys + all_keys = set() + for data in data_list: + all_keys.update(data.keys()) + + # Merge values for each key + for key in all_keys: + # Get all values for this key based on filtering mode + if filter_none_only: + values = [data.get(key) for data in data_list if data.get(key) is not None] + else: + values = [data.get(key) for data in data_list if data.get(key)] + + if not values: + continue + + # Merge values according to strategy + strategy = merge_strategy.get(key, "keep_first") + + if strategy == "concatenate": + # Convert all values to strings and join with GRAPH_FIELD_SEP + merged_data[key] = GRAPH_FIELD_SEP.join(str(v) for v in values) + elif strategy == "keep_first": + merged_data[key] = values[0] + elif strategy == "keep_last": + merged_data[key] = values[-1] + elif strategy == "join_unique": + # Handle fields separated by GRAPH_FIELD_SEP + unique_items = set() + for value in values: + items = str(value).split(GRAPH_FIELD_SEP) + unique_items.update(items) + merged_data[key] = GRAPH_FIELD_SEP.join(unique_items) + elif strategy == "join_unique_comma": + # Handle fields separated by comma, join unique items with comma + unique_items = set() + for value in values: + items = str(value).split(",") + unique_items.update(item.strip() for item in items if item.strip()) + merged_data[key] = ",".join(sorted(unique_items)) + elif strategy == "max": + # For numeric fields like weight + try: + merged_data[key] = max(float(v) for v in values) + except (ValueError, TypeError): + # Fallback to first value if conversion fails + merged_data[key] = values[0] + else: + # Default strategy: keep first value + merged_data[key] = values[0] + + return merged_data + + +async def get_entity_info( + chunk_entity_relation_graph, + entities_vdb, + entity_name: str, + include_vector_data: bool = False, +) -> dict[str, str | None | dict[str, str]]: + """Get detailed information of an entity""" + + # Get information from the graph + node_data = await chunk_entity_relation_graph.get_node(entity_name) + source_id = node_data.get("source_id") if node_data else None + + result: dict[str, str | None | dict[str, str]] = { + "entity_name": entity_name, + "source_id": source_id, + "graph_data": node_data, + } + + # Optional: Get vector database information + if include_vector_data: + entity_id = compute_mdhash_id(entity_name, prefix="ent-") + vector_data = await entities_vdb.get_by_id(entity_id) + result["vector_data"] = vector_data + + return result + + +async def get_relation_info( + chunk_entity_relation_graph, + relationships_vdb, + src_entity: str, + tgt_entity: str, + include_vector_data: bool = False, +) -> dict[str, str | None | dict[str, str]]: + """ + Get detailed information of a relationship between two entities. + Relationship is unidirectional, swap src_entity and tgt_entity does not change the relationship. + + Args: + src_entity: Source entity name + tgt_entity: Target entity name + include_vector_data: Whether to include vector database information + + Returns: + Dictionary containing relationship information + """ + + # Get information from the graph + edge_data = await chunk_entity_relation_graph.get_edge(src_entity, tgt_entity) + source_id = edge_data.get("source_id") if edge_data else None + + result: dict[str, str | None | dict[str, str]] = { + "src_entity": src_entity, + "tgt_entity": tgt_entity, + "source_id": source_id, + "graph_data": edge_data, + } + + # Optional: Get vector database information + if include_vector_data: + rel_id = compute_mdhash_id(src_entity + tgt_entity, prefix="rel-") + vector_data = await relationships_vdb.get_by_id(rel_id) + result["vector_data"] = vector_data + + return result diff --git a/LightRAG/lightrag_webui/.gitignore b/LightRAG/lightrag_webui/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/LightRAG/lightrag_webui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/LightRAG/lightrag_webui/.prettierrc.json b/LightRAG/lightrag_webui/.prettierrc.json new file mode 100644 index 00000000..635143ee --- /dev/null +++ b/LightRAG/lightrag_webui/.prettierrc.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none", + "endOfLine": "crlf", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/LightRAG/lightrag_webui/README.md b/LightRAG/lightrag_webui/README.md new file mode 100644 index 00000000..00e537ba --- /dev/null +++ b/LightRAG/lightrag_webui/README.md @@ -0,0 +1,46 @@ +# LightRAG WebUI + +LightRAG WebUI is a React-based web interface for interacting with the LightRAG system. It provides a user-friendly interface for querying, managing, and exploring LightRAG's functionalities. + +## Installation + +1. **Install Bun:** + + If you haven't already installed Bun, follow the official documentation: [https://bun.sh/docs/installation](https://bun.sh/docs/installation) + +2. **Install Dependencies:** + + In the `lightrag_webui` directory, run the following command to install project dependencies: + + ```bash + bun install --frozen-lockfile + ``` + +3. **Build the Project:** + + Run the following command to build the project: + + ```bash + bun run build + ``` + + This command will bundle the project and output the built files to the `lightrag/api/webui` directory. + +## Development + +- **Start the Development Server:** + + If you want to run the WebUI in development mode, use the following command: + + ```bash + bun run dev + ``` + +## Script Commands + +The following are some commonly used script commands defined in `package.json`: + +- `bun install`: Installs project dependencies. +- `bun run dev`: Starts the development server. +- `bun run build`: Builds the project. +- `bun run lint`: Runs the linter. diff --git a/LightRAG/lightrag_webui/bun.lock b/LightRAG/lightrag_webui/bun.lock new file mode 100644 index 00000000..661837c4 --- /dev/null +++ b/LightRAG/lightrag_webui/bun.lock @@ -0,0 +1,1837 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "lightrag-webui", + "dependencies": { + "@faker-js/faker": "^9.9.0", + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@radix-ui/react-use-controllable-state": "^1.2.2", + "@react-sigma/core": "^5.0.4", + "@react-sigma/graph-search": "^5.0.4", + "@react-sigma/layout-circlepack": "^5.0.4", + "@react-sigma/layout-circular": "^5.0.4", + "@react-sigma/layout-force": "^5.0.4", + "@react-sigma/layout-forceatlas2": "^5.0.4", + "@react-sigma/layout-noverlap": "^5.0.4", + "@react-sigma/layout-random": "^5.0.4", + "@react-sigma/minimap": "^5.0.5", + "@sigma/edge-curve": "^3.1.0", + "@sigma/node-border": "^3.0.0", + "@tanstack/react-table": "^8.21.3", + "axios": "^1.12.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "graphology": "^0.26.0", + "graphology-generators": "^0.11.2", + "graphology-layout": "^0.6.1", + "graphology-layout-force": "^0.2.4", + "graphology-layout-forceatlas2": "^0.10.1", + "graphology-layout-noverlap": "^0.4.2", + "i18next": "^24.2.3", + "katex": "^0.16.23", + "lucide-react": "^0.475.0", + "mermaid": "^11.12.0", + "minisearch": "^7.2.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-dropzone": "^14.3.8", + "react-error-boundary": "^5.0.0", + "react-i18next": "^15.7.4", + "react-markdown": "^9.1.0", + "react-number-format": "^5.4.4", + "react-router-dom": "^7.9.4", + "react-select": "^5.10.2", + "react-syntax-highlighter": "^15.6.6", + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "rehype-react": "^8.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "seedrandom": "^3.0.5", + "sigma": "^3.0.2", + "sonner": "^1.7.4", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar": "^4.0.2", + "typography": "^0.16.24", + "unist-util-visit": "^5.0.0", + "zustand": "^5.0.8", + }, + "devDependencies": { + "@eslint/js": "^9.37.0", + "@stylistic/eslint-plugin-js": "^3.1.0", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "^4.1.14", + "@types/bun": "^1.2.23", + "@types/katex": "^0.16.7", + "@types/node": "^22.18.9", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.1", + "@types/react-i18next": "^8.1.0", + "@types/react-syntax-highlighter": "^15.5.13", + "@types/seedrandom": "^3.0.8", + "@vitejs/plugin-react-swc": "^3.11.0", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.23", + "globals": "^15.15.0", + "graphology-types": "^0.24.8", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.14", + "tailwindcss": "^4.1.14", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.7.3", + "typescript-eslint": "^8.46.0", + "vite": "^6.3.6", + }, + }, + }, + "packages": { + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + + "@antfu/utils": ["@antfu/utils@9.3.0", "", {}, "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA=="], + + "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="], + + "@babel/generator": ["@babel/generator@7.26.5", "", { "dependencies": { "@babel/parser": "^7.26.5", "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/parser": ["@babel/parser@7.26.7", "", { "dependencies": { "@babel/types": "^7.26.7" }, "bin": "./bin/babel-parser.js" }, "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w=="], + + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + + "@babel/template": ["@babel/template@7.25.9", "", { "dependencies": { "@babel/code-frame": "^7.25.9", "@babel/parser": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg=="], + + "@babel/traverse": ["@babel/traverse@7.26.7", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA=="], + + "@babel/types": ["@babel/types@7.26.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg=="], + + "@braintree/sanitize-url": ["@braintree/sanitize-url@7.1.1", "", {}, "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw=="], + + "@chevrotain/cst-dts-gen": ["@chevrotain/cst-dts-gen@11.0.3", "", { "dependencies": { "@chevrotain/gast": "11.0.3", "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ=="], + + "@chevrotain/gast": ["@chevrotain/gast@11.0.3", "", { "dependencies": { "@chevrotain/types": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q=="], + + "@chevrotain/regexp-to-ast": ["@chevrotain/regexp-to-ast@11.0.3", "", {}, "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA=="], + + "@chevrotain/types": ["@chevrotain/types@11.0.3", "", {}, "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ=="], + + "@chevrotain/utils": ["@chevrotain/utils@11.0.3", "", {}, "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ=="], + + "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], + + "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], + + "@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], + + "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], + + "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], + + "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], + + "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], + + "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], + + "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], + + "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], + + "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.10", "", { "os": "android", "cpu": "arm64" }, "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.10", "", { "os": "android", "cpu": "x64" }, "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.10", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.10", "", { "os": "linux", "cpu": "arm" }, "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.10", "", { "os": "linux", "cpu": "ia32" }, "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.10", "", { "os": "none", "cpu": "x64" }, "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.10", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.10", "", { "os": "openbsd", "cpu": "x64" }, "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.10", "", { "os": "sunos", "cpu": "x64" }, "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0" } }, "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog=="], + + "@eslint/core": ["@eslint/core@0.16.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.37.0", "", {}, "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.0", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="], + + "@faker-js/faker": ["@faker-js/faker@9.9.0", "", {}, "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA=="], + + "@floating-ui/core": ["@floating-ui/core@1.6.9", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.6.13", "", { "dependencies": { "@floating-ui/core": "^1.6.0", "@floating-ui/utils": "^0.2.9" } }, "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.2", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.2", "", {}, "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@3.0.2", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", "debug": "^4.4.1", "globals": "^15.15.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@mermaid-js/parser": ["@mermaid-js/parser@0.6.2", "", { "dependencies": { "langium": "3.3.1" } }, "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="], + + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@react-sigma/core": ["@react-sigma/core@5.0.4", "", { "peerDependencies": { "graphology": "^0.26.0", "react": "^18.0.0 || ^19.0.0", "sigma": "^3.0.2" } }, "sha512-C0hjr069x9oLlVe7t+Y1vE8Qi9UV1dhvrwxNi96TWxrFcTSHO5ntduj5yKTGnUF4SiIszAz6Xmjga8SHT/836Q=="], + + "@react-sigma/graph-search": ["@react-sigma/graph-search@5.0.4", "", { "dependencies": { "@react-sigma/core": "^5.0.4" }, "peerDependencies": { "minisearch": "^7.1.1", "react-select": "^5.9.0" } }, "sha512-kme1KdMoIIGUotf9NQ/gSoS98bUA5CpnBJImBfAZwSaYx9Yq+ccq2iSUzZ+6Z0oIVnSo6EWAJ0EYN1FYEQ5QFA=="], + + "@react-sigma/layout-circlepack": ["@react-sigma/layout-circlepack@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout": "^0.6.1" } }, "sha512-yqjRyPcyMbmUBDGXNoRvlwvz1SFllv9Yee4WftuV8/3OZlwYFKYbowwXZMntQIsTjz9gkbWG+1jMRWZsAeH6YA=="], + + "@react-sigma/layout-circular": ["@react-sigma/layout-circular@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout": "0.6.1" } }, "sha512-SwNXd9fnnUNFstCjRSaX68O5WcX1OpRb5aqlsaEuhcNmtbHmHsXwgOfD/DLJ9PbUCuSmNTvwwqCk5daEnQFSQg=="], + + "@react-sigma/layout-core": ["@react-sigma/layout-core@5.0.4", "", { "dependencies": { "@react-sigma/core": "^5.0.4" } }, "sha512-R9Mm59CTwSla6vHXnN+m1TQlJTeyDaeD4agUqJahg/cgWD16oPvvKN5Yhv3Kn+SfZdaTiv5gcoryg0t8/zGX+A=="], + + "@react-sigma/layout-force": ["@react-sigma/layout-force@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout-force": "^0.2.4" } }, "sha512-k6tIWvrN18OKRE/uHzArMyl+XySskuG69zRr+aS3YiVqYgGZ1ZPkFAh5hszDHqn/TF6D059uPXCmu52+fyWkAQ=="], + + "@react-sigma/layout-forceatlas2": ["@react-sigma/layout-forceatlas2@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout-forceatlas2": "^0.10.1" } }, "sha512-OLIvSl1lU0nNemWR6iw/56oIDZEOBTd3bJlyIA9Bh2GXA2UhDzdSaksd+GH4gFQ4jYJpuL+VgWGFND2pO6zYbg=="], + + "@react-sigma/layout-noverlap": ["@react-sigma/layout-noverlap@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout-noverlap": "^0.4.2" } }, "sha512-ztUYU4er8P6iaQnWE47Y9bH8cOpWKUD45uAQ68N6/aIlwCl0vtk4dhIrlZVID8V0JLJq1cGBeZr85cIXYcOmLQ=="], + + "@react-sigma/layout-random": ["@react-sigma/layout-random@5.0.4", "", { "dependencies": { "@react-sigma/layout-core": "^5.0.4" }, "peerDependencies": { "graphology-layout": "^0.6.1" } }, "sha512-PoYOcfgWP8AfQVDcKQxWZIjkZ5iq42WxValbjKxtnYsxZlYtp9gGmuk4NUmz4eohVaro0YBdyePqKQLrqudy8A=="], + + "@react-sigma/minimap": ["@react-sigma/minimap@5.0.5", "", { "dependencies": { "@react-sigma/core": "^5.0.4" } }, "sha512-LCktqQodkGm65vRhLgIDQDGjtWxplwcWzOoNeYKtMpN/j0797V4k5eueEpg+4x7Ex+PNRQcYyh0TgmNhA25hFw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.4", "", { "os": "android", "cpu": "arm" }, "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.4", "", { "os": "android", "cpu": "arm64" }, "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.4", "", { "os": "none", "cpu": "arm64" }, "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w=="], + + "@sigma/edge-curve": ["@sigma/edge-curve@3.1.0", "", { "peerDependencies": { "sigma": ">=3.0.0-beta.10" } }, "sha512-OFWkfAXEsm+X8l1K4K49cC0psB0gQ+gqxKA08HG5piNPdzrDZ5gG9Gza6htZ5AirOVwd/4/uq/gPpD5En+H+3Q=="], + + "@sigma/node-border": ["@sigma/node-border@3.0.0", "", { "peerDependencies": { "sigma": ">=3.0.0-beta.17" } }, "sha512-mE3zUfjvJVuAMhSjiP/zdlkqe0OVTETxd04XHUwof01YqdzTk0OB4ACJIhWrwgsBXl7tTd9lPuKoroafLh8MtQ=="], + + "@stylistic/eslint-plugin-js": ["@stylistic/eslint-plugin-js@3.1.0", "", { "dependencies": { "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "sha512-lQktsOiCr8S6StG29C5fzXYxLOD6ID1rp4j6TRS+E/qY1xd59Fm7dy5qm9UauJIEoSTlYx6yGsCHYh5UkgXPyg=="], + + "@swc/core": ["@swc/core@1.13.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.13.5", "@swc/core-darwin-x64": "1.13.5", "@swc/core-linux-arm-gnueabihf": "1.13.5", "@swc/core-linux-arm64-gnu": "1.13.5", "@swc/core-linux-arm64-musl": "1.13.5", "@swc/core-linux-x64-gnu": "1.13.5", "@swc/core-linux-x64-musl": "1.13.5", "@swc/core-win32-arm64-msvc": "1.13.5", "@swc/core-win32-ia32-msvc": "1.13.5", "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.13.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.13.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.13.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA=="], + + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q=="], + + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.13.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.13.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.13.5", "", { "os": "win32", "cpu": "x64" }, "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.14", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.0", "lightningcss": "1.30.1", "magic-string": "^0.30.19", "source-map-js": "^1.2.1", "tailwindcss": "4.1.14" } }, "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.14", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.5.1" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.14", "@tailwindcss/oxide-darwin-arm64": "4.1.14", "@tailwindcss/oxide-darwin-x64": "4.1.14", "@tailwindcss/oxide-freebsd-x64": "4.1.14", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14", "@tailwindcss/oxide-linux-arm64-musl": "4.1.14", "@tailwindcss/oxide-linux-x64-gnu": "4.1.14", "@tailwindcss/oxide-linux-x64-musl": "4.1.14", "@tailwindcss/oxide-wasm32-wasi": "4.1.14", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14", "@tailwindcss/oxide-win32-x64-msvc": "4.1.14" } }, "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.14", "", { "os": "android", "cpu": "arm64" }, "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.14", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14", "", { "os": "linux", "cpu": "arm" }, "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.14", "", { "os": "linux", "cpu": "x64" }, "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.14", "", { "os": "linux", "cpu": "x64" }, "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.14", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.0.5", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.14", "", { "os": "win32", "cpu": "x64" }, "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA=="], + + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], + + "@tailwindcss/vite": ["@tailwindcss/vite@4.1.14", "", { "dependencies": { "@tailwindcss/node": "4.1.14", "@tailwindcss/oxide": "4.1.14", "tailwindcss": "4.1.14" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA=="], + + "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], + + "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], + + "@types/bun": ["@types/bun@1.2.23", "", { "dependencies": { "bun-types": "1.2.23" } }, "sha512-le8ueOY5b6VKYf19xT3McVbXqLqmxzPXHsQT/q9JHgikJ2X22wyTW3g3ohz2ZMnp7dod6aduIiq8A14Xyimm0A=="], + + "@types/d3": ["@types/d3@7.4.3", "", { "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", "@types/d3-brush": "*", "@types/d3-chord": "*", "@types/d3-color": "*", "@types/d3-contour": "*", "@types/d3-delaunay": "*", "@types/d3-dispatch": "*", "@types/d3-drag": "*", "@types/d3-dsv": "*", "@types/d3-ease": "*", "@types/d3-fetch": "*", "@types/d3-force": "*", "@types/d3-format": "*", "@types/d3-geo": "*", "@types/d3-hierarchy": "*", "@types/d3-interpolate": "*", "@types/d3-path": "*", "@types/d3-polygon": "*", "@types/d3-quadtree": "*", "@types/d3-random": "*", "@types/d3-scale": "*", "@types/d3-scale-chromatic": "*", "@types/d3-selection": "*", "@types/d3-shape": "*", "@types/d3-time": "*", "@types/d3-time-format": "*", "@types/d3-timer": "*", "@types/d3-transition": "*", "@types/d3-zoom": "*" } }, "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww=="], + + "@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="], + + "@types/d3-axis": ["@types/d3-axis@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw=="], + + "@types/d3-brush": ["@types/d3-brush@3.0.6", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A=="], + + "@types/d3-chord": ["@types/d3-chord@3.0.6", "", {}, "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + + "@types/d3-delaunay": ["@types/d3-delaunay@6.0.4", "", {}, "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="], + + "@types/d3-dispatch": ["@types/d3-dispatch@3.0.6", "", {}, "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="], + + "@types/d3-drag": ["@types/d3-drag@3.0.7", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ=="], + + "@types/d3-dsv": ["@types/d3-dsv@3.0.7", "", {}, "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-fetch": ["@types/d3-fetch@3.0.7", "", { "dependencies": { "@types/d3-dsv": "*" } }, "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA=="], + + "@types/d3-force": ["@types/d3-force@3.0.10", "", {}, "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="], + + "@types/d3-format": ["@types/d3-format@3.0.4", "", {}, "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="], + + "@types/d3-geo": ["@types/d3-geo@3.1.0", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ=="], + + "@types/d3-hierarchy": ["@types/d3-hierarchy@3.1.7", "", {}, "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-polygon": ["@types/d3-polygon@3.0.2", "", {}, "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="], + + "@types/d3-quadtree": ["@types/d3-quadtree@3.0.6", "", {}, "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="], + + "@types/d3-random": ["@types/d3-random@3.0.3", "", {}, "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="], + + "@types/d3-selection": ["@types/d3-selection@3.0.11", "", {}, "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-time-format": ["@types/d3-time-format@4.0.3", "", {}, "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/d3-transition": ["@types/d3-transition@3.0.9", "", { "dependencies": { "@types/d3-selection": "*" } }, "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg=="], + + "@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="], + + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/katex": ["@types/katex@0.16.7", "", {}, "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.18.9", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-5yBtK0k/q8PjkMXbTfeIEP/XVYnz1R9qZJ3yUicdEW7ppdDJfe+MqXEhpqDL3mtn4Wvs1u0KLEG0RXzCgNpsSg=="], + + "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], + + "@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="], + + "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + + "@types/react-dom": ["@types/react-dom@19.2.1", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A=="], + + "@types/react-i18next": ["@types/react-i18next@8.1.0", "", { "dependencies": { "react-i18next": "*" } }, "sha512-d4xhcjX5b3roNMObRNMfb1HinHQlQLPo8xlDj60dnHeeAw2bBymR2cy/l1giJpHzo/ZFgSvgVUvIWr4kCrenCg=="], + + "@types/react-syntax-highlighter": ["@types/react-syntax-highlighter@15.5.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA=="], + + "@types/react-transition-group": ["@types/react-transition-group@4.4.12", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w=="], + + "@types/seedrandom": ["@types/seedrandom@3.0.8", "", {}, "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/type-utils": "8.46.0", "@typescript-eslint/utils": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.0", "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.0", "@typescript-eslint/tsconfig-utils": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@vitejs/plugin-react-swc": ["@vitejs/plugin-react-swc@3.11.0", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-beta.27", "@swc/core": "^1.12.11" }, "peerDependencies": { "vite": "^4 || ^5 || ^6 || ^7" } }, "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w=="], + + "@yomguithereal/helpers": ["@yomguithereal/helpers@1.1.1", "", {}, "sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg=="], + + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.4", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-includes": ["array-includes@3.1.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "attr-accept": ["attr-accept@2.2.5", "", {}, "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.12.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw=="], + + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "bun-types": ["bun-types@1.2.23", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-R9f0hKAZXgFU3mlrA0YpE/fiDvwV0FT9rORApt2aQVWSuJDzZOyB5QLc0N/4HF57CS8IXJ6+L5E4W1bW6NS2Aw=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], + + "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="], + + "character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="], + + "chevrotain": ["chevrotain@11.0.3", "", { "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", "@chevrotain/regexp-to-ast": "11.0.3", "@chevrotain/types": "11.0.3", "@chevrotain/utils": "11.0.3", "lodash-es": "4.17.21" } }, "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw=="], + + "chevrotain-allstar": ["chevrotain-allstar@0.3.1", "", { "dependencies": { "lodash-es": "^4.17.21" }, "peerDependencies": { "chevrotain": "^11.0.0" } }, "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "compass-vertical-rhythm": ["compass-vertical-rhythm@1.4.5", "", { "dependencies": { "convert-css-length": "^1.0.1", "object-assign": "^4.1.0", "parse-unit": "^1.0.1" } }, "sha512-bJo3IYX7xmmZCDYjrT2XolaiNjGZ4E2JvUGxpdU0ecbH4ZLK786wvc8aHKVrGrKct9JlkmJbUi8YLrQWvOc+uA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "console-polyfill": ["console-polyfill@0.1.2", "", {}, "sha512-oHLGQmf0q2yuuqfTXuzAB5UMqgPH1cHdwLkjfCqRTG2eupc52jbXT1OtOlREv+yXmXRi3wqywAevz3qMSk90Hg=="], + + "convert-css-length": ["convert-css-length@1.0.2", "", { "dependencies": { "console-polyfill": "^0.1.2", "parse-unit": "^1.0.1" } }, "sha512-ecV7j3hXyXN1X2XfJBzhMR0o1Obv0v3nHmn0UiS3ACENrzbxE/EknkiunS/fCwQva0U62X1GChi8GaPh4oTlLg=="], + + "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + + "cookie": ["cookie@1.0.2", "https://registry.npmmirror.com/cookie/-/cookie-1.0.2.tgz", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="], + + "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "cytoscape": ["cytoscape@3.31.2", "", {}, "sha512-/eOXg2uGdMdpGlEes5Sf6zE+jUG+05f3htFNQIxLxduOH/SsaUZiPBfAwP1btVIVzsnhiNOdi+hvDRLYfMZjGw=="], + + "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="], + + "cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="], + + "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="], + + "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="], + + "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="], + + "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="], + + "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], + + "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], + + "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="], + + "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="], + + "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], + + "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="], + + "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="], + + "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="], + + "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="], + + "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="], + + "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], + + "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], + + "dagre-d3-es": ["dagre-d3-es@7.0.11", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "dayjs": ["dayjs@1.11.18", "", {}, "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.0.2", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], + + "dompurify": ["dompurify@3.2.5", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], + + "entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.0.2", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.4.0", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.37.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.23", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "espree": ["espree@10.3.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" } }, "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + + "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "file-selector": ["file-selector@2.1.2", "", { "dependencies": { "tslib": "^2.7.0" } }, "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "for-each": ["for-each@0.3.4", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "graphology": ["graphology@0.26.0", "", { "dependencies": { "events": "^3.3.0" }, "peerDependencies": { "graphology-types": ">=0.24.0" } }, "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg=="], + + "graphology-generators": ["graphology-generators@0.11.2", "", { "dependencies": { "graphology-metrics": "^2.0.0", "graphology-utils": "^2.3.0" }, "peerDependencies": { "graphology-types": ">=0.19.0" } }, "sha512-hx+F0OZRkVdoQ0B1tWrpxoakmHZNex0c6RAoR0PrqJ+6fz/gz6CQ88Qlw78C6yD9nlZVRgepIoDYhRTFV+bEHg=="], + + "graphology-indices": ["graphology-indices@0.17.0", "", { "dependencies": { "graphology-utils": "^2.4.2", "mnemonist": "^0.39.0" }, "peerDependencies": { "graphology-types": ">=0.20.0" } }, "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ=="], + + "graphology-layout": ["graphology-layout@0.6.1", "", { "dependencies": { "graphology-utils": "^2.3.0", "pandemonium": "^2.4.0" }, "peerDependencies": { "graphology-types": ">=0.19.0" } }, "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag=="], + + "graphology-layout-force": ["graphology-layout-force@0.2.4", "", { "dependencies": { "graphology-utils": "^2.4.2" }, "peerDependencies": { "graphology-types": ">=0.19.0" } }, "sha512-NYZz0YAnDkn5pkm30cvB0IScFoWGtbzJMrqaiH070dYlYJiag12Oc89dbVfaMaVR/w8DMIKxn/ix9Bqj+Umm9Q=="], + + "graphology-layout-forceatlas2": ["graphology-layout-forceatlas2@0.10.1", "", { "dependencies": { "graphology-utils": "^2.1.0" }, "peerDependencies": { "graphology-types": ">=0.19.0" } }, "sha512-ogzBeF1FvWzjkikrIFwxhlZXvD2+wlY54lqhsrWprcdPjopM2J9HoMweUmIgwaTvY4bUYVimpSsOdvDv1gPRFQ=="], + + "graphology-layout-noverlap": ["graphology-layout-noverlap@0.4.2", "", { "dependencies": { "graphology-utils": "^2.3.0" }, "peerDependencies": { "graphology-types": ">=0.19.0" } }, "sha512-13WwZSx96zim6l1dfZONcqLh3oqyRcjIBsqz2c2iJ3ohgs3605IDWjldH41Gnhh462xGB1j6VGmuGhZ2FKISXA=="], + + "graphology-metrics": ["graphology-metrics@2.3.1", "", { "dependencies": { "graphology-indices": "^0.17.0", "graphology-shortest-path": "^2.0.0", "graphology-utils": "^2.4.4", "mnemonist": "^0.39.0" }, "peerDependencies": { "graphology-types": ">=0.20.0" } }, "sha512-131GRSKUR8DrGkLZSYKM3cwxEg+jqXvv1yLh/KgO0My7BOiuo80r0Qrsnv2N3ZjcOlh8namUS4sSk+cCVnTgKA=="], + + "graphology-shortest-path": ["graphology-shortest-path@2.1.0", "", { "dependencies": { "@yomguithereal/helpers": "^1.1.1", "graphology-indices": "^0.17.0", "graphology-utils": "^2.4.3", "mnemonist": "^0.39.0" }, "peerDependencies": { "graphology-types": ">=0.20.0" } }, "sha512-KbT9CTkP/u72vGEJzyRr24xFC7usI9Es3LMmCPHGwQ1KTsoZjxwA9lMKxfU0syvT/w+7fZUdB/Hu2wWYcJBm6Q=="], + + "graphology-types": ["graphology-types@0.24.8", "", {}, "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q=="], + + "graphology-utils": ["graphology-utils@2.5.2", "", { "peerDependencies": { "graphology-types": ">=0.23.0" } }, "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ=="], + + "gray-percentage": ["gray-percentage@2.0.0", "", {}, "sha512-T0i4bwJoXbweuBM7bJwil9iHVAwXxmS9IFsEy27cXvRYxHwR2YVSBSXBjJw4EDKUvLpfjANeT5PrvTuAH1XnTw=="], + + "hachure-fill": ["hachure-fill@0.5.2", "", {}, "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="], + + "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], + + "hast-util-from-html-isomorphic": ["hast-util-from-html-isomorphic@2.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-dom": "^5.0.0", "hast-util-from-html": "^2.0.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw=="], + + "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], + + "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], + + "hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="], + + "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.2", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg=="], + + "hast-util-to-parse5": ["hast-util-to-parse5@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="], + + "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="], + + "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], + + "highlightjs-vue": ["highlightjs-vue@1.0.0", "", {}, "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "i18next": ["i18next@24.2.3", "", { "dependencies": { "@babel/runtime": "^7.26.10" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], + + "is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="], + + "is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "katex": ["katex@0.16.23", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], + + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "langium": ["langium@3.3.1", "", { "dependencies": { "chevrotain": "~11.0.3", "chevrotain-allstar": "~0.3.0", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.0.8" } }, "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w=="], + + "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lowlight": ["lowlight@1.20.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" } }, "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="], + + "lucide-react": ["lucide-react@0.475.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg=="], + + "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "marked": ["marked@16.4.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-CTPAcRBq57cn3R8n3hwc2REddc28hjR7RzDXQ+lXLmMJYqn20BaI2cGw6QjgZGIgVfp2Wdfw4aMzgNteQ6qJgQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-math": ["mdast-util-math@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "longest-streak": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.1.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "mermaid": ["mermaid@11.12.0", "", { "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", "@mermaid-js/parser": "^0.6.2", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.11", "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", "lodash-es": "^4.17.21", "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", "uuid": "^11.1.0" } }, "sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg=="], + + "micromark": ["micromark@4.0.1", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.2", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-math": ["micromark-extension-math@3.1.0", "", { "dependencies": { "@types/katex": "^0.16.0", "devlop": "^1.0.0", "katex": "^0.16.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.0.4", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.1", "", {}, "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minisearch": ["minisearch@7.2.0", "", {}, "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "mnemonist": ["mnemonist@0.39.8", "", { "dependencies": { "obliterator": "^2.0.1" } }, "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ=="], + + "modularscale": ["modularscale@1.0.2", "", { "dependencies": { "lodash.isnumber": "^3.0.0" } }, "sha512-xfu46hZcAL9xU8S/RihHE49rmDYRAg36lQez49pcO6/aLBJ7cfVr5DH7Obo2PGKTCSAyy4iTAsWZa9apECK9mQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-manager-detector": ["package-manager-detector@1.4.0", "", {}, "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw=="], + + "pandemonium": ["pandemonium@2.4.1", "", { "dependencies": { "mnemonist": "^0.39.2" } }, "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "parse-unit": ["parse-unit@1.0.1", "", {}, "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + + "points-on-curve": ["points-on-curve@0.2.0", "", {}, "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A=="], + + "points-on-path": ["points-on-path@0.2.1", "", { "dependencies": { "path-data-parser": "0.1.0", "points-on-curve": "0.2.0" } }, "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], + + "prism-react-renderer": ["prism-react-renderer@2.4.1", "", { "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig=="], + + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], + + "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], + + "react-dropzone": ["react-dropzone@14.3.8", "", { "dependencies": { "attr-accept": "^2.2.4", "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.8 || 18.0.0" } }, "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug=="], + + "react-error-boundary": ["react-error-boundary@5.0.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ=="], + + "react-i18next": ["react-i18next@15.7.4", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { "i18next": ">= 23.4.0", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-markdown": ["react-markdown@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw=="], + + "react-number-format": ["react-number-format@5.4.4", "", { "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA=="], + + "react-remove-scroll": ["react-remove-scroll@2.6.3", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-router": ["react-router@7.9.4", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA=="], + + "react-router-dom": ["react-router-dom@7.9.4", "", { "dependencies": { "react-router": "7.9.4" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA=="], + + "react-select": ["react-select@5.10.2", "", { "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", "@emotion/react": "^11.8.1", "@floating-ui/dom": "^1.0.1", "@types/react-transition-group": "^4.4.0", "memoize-one": "^6.0.0", "prop-types": "^15.6.0", "react-transition-group": "^4.3.0", "use-isomorphic-layout-effect": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="], + + "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="], + + "regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "rehype-katex": ["rehype-katex@7.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", "hast-util-to-text": "^4.0.0", "katex": "^0.16.0", "unist-util-visit-parents": "^6.0.0", "vfile": "^6.0.0" } }, "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA=="], + + "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], + + "rehype-react": ["rehype-react@8.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "unified": "^11.0.0" } }, "sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-math": ["remark-math@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-math": "^3.0.0", "micromark-extension-math": "^3.0.0", "unified": "^11.0.0" } }, "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + + "resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], + + "rollup": ["rollup@4.52.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.4", "@rollup/rollup-android-arm64": "4.52.4", "@rollup/rollup-darwin-arm64": "4.52.4", "@rollup/rollup-darwin-x64": "4.52.4", "@rollup/rollup-freebsd-arm64": "4.52.4", "@rollup/rollup-freebsd-x64": "4.52.4", "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", "@rollup/rollup-linux-arm-musleabihf": "4.52.4", "@rollup/rollup-linux-arm64-gnu": "4.52.4", "@rollup/rollup-linux-arm64-musl": "4.52.4", "@rollup/rollup-linux-loong64-gnu": "4.52.4", "@rollup/rollup-linux-ppc64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-musl": "4.52.4", "@rollup/rollup-linux-s390x-gnu": "4.52.4", "@rollup/rollup-linux-x64-gnu": "4.52.4", "@rollup/rollup-linux-x64-musl": "4.52.4", "@rollup/rollup-openharmony-arm64": "4.52.4", "@rollup/rollup-win32-arm64-msvc": "4.52.4", "@rollup/rollup-win32-ia32-msvc": "4.52.4", "@rollup/rollup-win32-x64-gnu": "4.52.4", "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ=="], + + "roughjs": ["roughjs@4.6.6", "", { "dependencies": { "hachure-fill": "^0.5.2", "path-data-parser": "^0.1.0", "points-on-curve": "^0.2.0", "points-on-path": "^0.2.1" } }, "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "seedrandom": ["seedrandom@3.0.5", "", {}, "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "sigma": ["sigma@3.0.2", "", { "dependencies": { "events": "^3.3.0", "graphology-utils": "^2.5.2" } }, "sha512-/BUbeOwPGruiBOm0YQQ6ZMcLIZ6tf/W+Jcm7dxZyAX0tK3WP9/sq7/NAWBxPIxVahdGjCJoGwej0Gdrv0DxlQQ=="], + + "sonner": ["sonner@1.7.4", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw=="], + + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "style-to-object": ["style-to-object@1.0.8", "", { "dependencies": { "inline-style-parser": "0.2.4" } }, "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g=="], + + "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], + + "tailwind-scrollbar": ["tailwind-scrollbar@4.0.2", "", { "dependencies": { "prism-react-renderer": "^2.4.1" }, "peerDependencies": { "tailwindcss": "4.x" } }, "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA=="], + + "tailwindcss": ["tailwindcss@4.1.14", "", {}, "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + + "tar": ["tar@7.5.1", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g=="], + + "tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.7.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw=="], + + "typescript-eslint": ["typescript-eslint@8.46.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.0", "@typescript-eslint/parser": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw=="], + + "typography": ["typography@0.16.24", "", { "dependencies": { "compass-vertical-rhythm": "^1.4.5", "decamelize": "^1.2.0", "gray-percentage": "^2.0.0", "lodash": "^4.13.1", "modularscale": "^1.0.2", "object-assign": "^4.1.0", "typography-normalize": "^0.16.19" } }, "sha512-o5jNctzGoJm2XgdqivJdpkF6lQkcQo8v1biMGY+rLSpBHhpCKdQv5em9S3R6igApxVYtbhNBJbV95vK9oPwRKQ=="], + + "typography-normalize": ["typography-normalize@0.16.19", "", {}, "sha512-vtnSv/uGBZVbd4e/ZhZB9HKBgKKlWQUXw74+ADIHHxzKp27CEf8PSR8TX1zF2qSyQ9/qMdqLwXYz8yRQFq9JLQ=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "vite": ["vite@6.3.6", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], + + "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], + + "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], + + "vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="], + + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.18", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zustand": ["zustand@5.0.8", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/traverse/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + + "@emotion/babel-plugin/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "@emotion/babel-plugin/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], + + "@emotion/cache/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], + + "@emotion/react/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.5.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@types/estree-jsx/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/react-i18next/react-i18next": ["react-i18next@15.4.1", "", { "dependencies": { "@babel/runtime": "^7.25.0", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { "i18next": ">= 23.2.3", "react": ">= 16.8.0" } }, "sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw=="], + + "@types/react-syntax-highlighter/@types/react": ["@types/react@19.0.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "babel-plugin-macros/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "babel-plugin-macros/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "cytoscape-fcose/cose-base": ["cose-base@2.2.0", "", { "dependencies": { "layout-base": "^2.0.0" } }, "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g=="], + + "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="], + + "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], + + "decode-named-character-reference/character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "dom-helpers/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "hast-util-from-dom/hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hast-util-from-parse5/hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], + + "hast-util-from-parse5/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "hast-util-to-jsx-runtime/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "hastscript/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="], + + "hastscript/comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="], + + "hastscript/property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="], + + "hastscript/space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="], + + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "mdast-util-mdx-jsx/parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "micromark/debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "micromark-extension-math/katex": ["katex@0.16.21", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "object.entries/call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "react-error-boundary/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "react-select/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "react-syntax-highlighter/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "react-transition-group/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="], + + "rehype-katex/katex": ["katex@0.16.22", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg=="], + + "stringify-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "@eslint/eslintrc/espree/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "@eslint/eslintrc/espree/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "@types/react-i18next/react-i18next/@babel/runtime": ["@babel/runtime@7.26.7", "", { "dependencies": { "regenerator-runtime": "^0.14.0" } }, "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], + + "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + + "eslint/espree/acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "hast-util-from-dom/hastscript/hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hast-util-from-dom/hastscript/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "hast-util-from-parse5/hastscript/hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], + + "hastscript/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "mdast-util-mdx-jsx/parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "mdast-util-mdx-jsx/parse-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "mdast-util-mdx-jsx/parse-entities/character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "mdast-util-mdx-jsx/parse-entities/is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "mdast-util-mdx-jsx/parse-entities/is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "mdast-util-mdx-jsx/parse-entities/is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "object.entries/call-bound/call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "object.entries/call-bound/get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "mdast-util-mdx-jsx/parse-entities/is-alphanumerical/is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + } +} diff --git a/LightRAG/lightrag_webui/components.json b/LightRAG/lightrag_webui/components.json new file mode 100644 index 00000000..8bfc737f --- /dev/null +++ b/LightRAG/lightrag_webui/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/LightRAG/lightrag_webui/env.development.smaple b/LightRAG/lightrag_webui/env.development.smaple new file mode 100644 index 00000000..501be53c --- /dev/null +++ b/LightRAG/lightrag_webui/env.development.smaple @@ -0,0 +1,4 @@ +# Development environment configuration +VITE_BACKEND_URL=http://localhost:9621 +VITE_API_PROXY=true +VITE_API_ENDPOINTS=/api,/documents,/graphs,/graph,/health,/query,/docs,/redoc,/openapi.json,/login,/auth-status,/static diff --git a/LightRAG/lightrag_webui/env.local.sample b/LightRAG/lightrag_webui/env.local.sample new file mode 100644 index 00000000..d8920437 --- /dev/null +++ b/LightRAG/lightrag_webui/env.local.sample @@ -0,0 +1,3 @@ +VITE_BACKEND_URL=http://localhost:9621 +VITE_API_PROXY=true +VITE_API_ENDPOINTS=/api,/documents,/graphs,/graph,/health,/query,/docs,/redoc,/openapi.json,/login,/auth-status diff --git a/LightRAG/lightrag_webui/eslint.config.js b/LightRAG/lightrag_webui/eslint.config.js new file mode 100644 index 00000000..7f42e8b1 --- /dev/null +++ b/LightRAG/lightrag_webui/eslint.config.js @@ -0,0 +1,36 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import stylisticJs from '@stylistic/eslint-plugin-js' +import tseslint from 'typescript-eslint' +import prettier from 'eslint-config-prettier' +import react from 'eslint-plugin-react' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended, prettier], + files: ['**/*.{ts,tsx,js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser + }, + settings: { react: { version: '19.0' } }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + '@stylistic/js': stylisticJs, + react + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + '@stylistic/js/indent': ['error', 2], + '@stylistic/js/quotes': ['error', 'single'], + '@typescript-eslint/no-explicit-any': ['off'] + } + } +) diff --git a/LightRAG/lightrag_webui/index.html b/LightRAG/lightrag_webui/index.html new file mode 100644 index 00000000..ebbcce35 --- /dev/null +++ b/LightRAG/lightrag_webui/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + Lightrag + + +

    + + + diff --git a/LightRAG/lightrag_webui/package-lock.json b/LightRAG/lightrag_webui/package-lock.json new file mode 100644 index 00000000..2118f277 --- /dev/null +++ b/LightRAG/lightrag_webui/package-lock.json @@ -0,0 +1,12019 @@ +{ + "name": "lightrag-webui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lightrag-webui", + "version": "0.0.0", + "dependencies": { + "@faker-js/faker": "^9.9.0", + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@radix-ui/react-use-controllable-state": "^1.2.2", + "@react-sigma/core": "^5.0.4", + "@react-sigma/graph-search": "^5.0.4", + "@react-sigma/layout-circlepack": "^5.0.4", + "@react-sigma/layout-circular": "^5.0.4", + "@react-sigma/layout-force": "^5.0.4", + "@react-sigma/layout-forceatlas2": "^5.0.4", + "@react-sigma/layout-noverlap": "^5.0.4", + "@react-sigma/layout-random": "^5.0.4", + "@react-sigma/minimap": "^5.0.5", + "@sigma/edge-curve": "^3.1.0", + "@sigma/node-border": "^3.0.0", + "@tanstack/react-table": "^8.21.3", + "axios": "^1.12.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "graphology": "^0.26.0", + "graphology-generators": "^0.11.2", + "graphology-layout": "^0.6.1", + "graphology-layout-force": "^0.2.4", + "graphology-layout-forceatlas2": "^0.10.1", + "graphology-layout-noverlap": "^0.4.2", + "i18next": "^24.2.3", + "katex": "^0.16.23", + "lucide-react": "^0.475.0", + "mermaid": "^11.12.0", + "minisearch": "^7.2.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-dropzone": "^14.3.8", + "react-error-boundary": "^5.0.0", + "react-i18next": "^15.7.4", + "react-markdown": "^9.1.0", + "react-number-format": "^5.4.4", + "react-router-dom": "^7.9.4", + "react-select": "^5.10.2", + "react-syntax-highlighter": "^15.6.6", + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "rehype-react": "^8.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "seedrandom": "^3.0.5", + "sigma": "^3.0.2", + "sonner": "^1.7.4", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar": "^4.0.2", + "typography": "^0.16.24", + "unist-util-visit": "^5.0.0", + "zustand": "^5.0.8" + }, + "devDependencies": { + "@eslint/js": "^9.37.0", + "@stylistic/eslint-plugin-js": "^3.1.0", + "@tailwindcss/typography": "^0.5.15", + "@tailwindcss/vite": "^4.1.14", + "@types/bun": "^1.2.23", + "@types/katex": "^0.16.7", + "@types/node": "^22.18.9", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.1", + "@types/react-i18next": "^8.1.0", + "@types/react-syntax-highlighter": "^15.5.13", + "@types/seedrandom": "^3.0.8", + "@vitejs/plugin-react-swc": "^3.11.0", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.23", + "globals": "^15.15.0", + "graphology-types": "^0.24.8", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.14", + "tailwindcss": "^4.1.14", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.7.3", + "typescript-eslint": "^8.46.0", + "vite": "^6.3.6" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@faker-js/faker": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.9.0.tgz", + "integrity": "sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@antfu/utils": "^9.2.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.1", + "globals": "^15.15.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.1.1", + "mlly": "^1.7.4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@react-sigma/core": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/core/-/core-5.0.4.tgz", + "integrity": "sha512-C0hjr069x9oLlVe7t+Y1vE8Qi9UV1dhvrwxNi96TWxrFcTSHO5ntduj5yKTGnUF4SiIszAz6Xmjga8SHT/836Q==", + "license": "MIT", + "peerDependencies": { + "graphology": "^0.26.0", + "react": "^18.0.0 || ^19.0.0", + "sigma": "^3.0.2" + } + }, + "node_modules/@react-sigma/graph-search": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/graph-search/-/graph-search-5.0.4.tgz", + "integrity": "sha512-kme1KdMoIIGUotf9NQ/gSoS98bUA5CpnBJImBfAZwSaYx9Yq+ccq2iSUzZ+6Z0oIVnSo6EWAJ0EYN1FYEQ5QFA==", + "license": "MIT", + "dependencies": { + "@react-sigma/core": "^5.0.4" + }, + "peerDependencies": { + "minisearch": "^7.1.1", + "react-select": "^5.9.0" + } + }, + "node_modules/@react-sigma/layout-circlepack": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-circlepack/-/layout-circlepack-5.0.4.tgz", + "integrity": "sha512-yqjRyPcyMbmUBDGXNoRvlwvz1SFllv9Yee4WftuV8/3OZlwYFKYbowwXZMntQIsTjz9gkbWG+1jMRWZsAeH6YA==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout": "^0.6.1" + } + }, + "node_modules/@react-sigma/layout-circular": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-circular/-/layout-circular-5.0.4.tgz", + "integrity": "sha512-SwNXd9fnnUNFstCjRSaX68O5WcX1OpRb5aqlsaEuhcNmtbHmHsXwgOfD/DLJ9PbUCuSmNTvwwqCk5daEnQFSQg==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout": "0.6.1" + } + }, + "node_modules/@react-sigma/layout-core": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-core/-/layout-core-5.0.4.tgz", + "integrity": "sha512-R9Mm59CTwSla6vHXnN+m1TQlJTeyDaeD4agUqJahg/cgWD16oPvvKN5Yhv3Kn+SfZdaTiv5gcoryg0t8/zGX+A==", + "license": "MIT", + "dependencies": { + "@react-sigma/core": "^5.0.4" + } + }, + "node_modules/@react-sigma/layout-force": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-force/-/layout-force-5.0.4.tgz", + "integrity": "sha512-k6tIWvrN18OKRE/uHzArMyl+XySskuG69zRr+aS3YiVqYgGZ1ZPkFAh5hszDHqn/TF6D059uPXCmu52+fyWkAQ==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout-force": "^0.2.4" + } + }, + "node_modules/@react-sigma/layout-forceatlas2": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-forceatlas2/-/layout-forceatlas2-5.0.4.tgz", + "integrity": "sha512-OLIvSl1lU0nNemWR6iw/56oIDZEOBTd3bJlyIA9Bh2GXA2UhDzdSaksd+GH4gFQ4jYJpuL+VgWGFND2pO6zYbg==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout-forceatlas2": "^0.10.1" + } + }, + "node_modules/@react-sigma/layout-noverlap": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-noverlap/-/layout-noverlap-5.0.4.tgz", + "integrity": "sha512-ztUYU4er8P6iaQnWE47Y9bH8cOpWKUD45uAQ68N6/aIlwCl0vtk4dhIrlZVID8V0JLJq1cGBeZr85cIXYcOmLQ==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout-noverlap": "^0.4.2" + } + }, + "node_modules/@react-sigma/layout-random": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@react-sigma/layout-random/-/layout-random-5.0.4.tgz", + "integrity": "sha512-PoYOcfgWP8AfQVDcKQxWZIjkZ5iq42WxValbjKxtnYsxZlYtp9gGmuk4NUmz4eohVaro0YBdyePqKQLrqudy8A==", + "license": "MIT", + "dependencies": { + "@react-sigma/layout-core": "^5.0.4" + }, + "peerDependencies": { + "graphology-layout": "^0.6.1" + } + }, + "node_modules/@react-sigma/minimap": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@react-sigma/minimap/-/minimap-5.0.5.tgz", + "integrity": "sha512-LCktqQodkGm65vRhLgIDQDGjtWxplwcWzOoNeYKtMpN/j0797V4k5eueEpg+4x7Ex+PNRQcYyh0TgmNhA25hFw==", + "license": "MIT", + "dependencies": { + "@react-sigma/core": "^5.0.4" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sigma/edge-curve": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigma/edge-curve/-/edge-curve-3.1.0.tgz", + "integrity": "sha512-OFWkfAXEsm+X8l1K4K49cC0psB0gQ+gqxKA08HG5piNPdzrDZ5gG9Gza6htZ5AirOVwd/4/uq/gPpD5En+H+3Q==", + "license": "MIT", + "peerDependencies": { + "sigma": ">=3.0.0-beta.10" + } + }, + "node_modules/@sigma/node-border": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sigma/node-border/-/node-border-3.0.0.tgz", + "integrity": "sha512-mE3zUfjvJVuAMhSjiP/zdlkqe0OVTETxd04XHUwof01YqdzTk0OB4ACJIhWrwgsBXl7tTd9lPuKoroafLh8MtQ==", + "license": "MIT", + "peerDependencies": { + "sigma": ">=3.0.0-beta.17" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-3.1.0.tgz", + "integrity": "sha512-lQktsOiCr8S6StG29C5fzXYxLOD6ID1rp4j6TRS+E/qY1xd59Fm7dy5qm9UauJIEoSTlYx6yGsCHYh5UkgXPyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@swc/core": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.3.tgz", + "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.3", + "@swc/core-darwin-x64": "1.15.3", + "@swc/core-linux-arm-gnueabihf": "1.15.3", + "@swc/core-linux-arm64-gnu": "1.15.3", + "@swc/core-linux-arm64-musl": "1.15.3", + "@swc/core-linux-x64-gnu": "1.15.3", + "@swc/core-linux-x64-musl": "1.15.3", + "@swc/core-win32-arm64-msvc": "1.15.3", + "@swc/core-win32-ia32-msvc": "1.15.3", + "@swc/core-win32-x64-msvc": "1.15.3" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz", + "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz", + "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz", + "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz", + "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz", + "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz", + "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz", + "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz", + "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz", + "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz", + "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz", + "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", + "tailwindcss": "4.1.17" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@types/bun": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.3.2.tgz", + "integrity": "sha512-t15P7k5UIgHKkxwnMNkJbWlh/617rkDGEdSsDbu+qNHTaz9SKf7aC8fiIlUdD5RPpH6GEkP0cK7WlvmrEBRtWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bun-types": "1.3.2" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.6.tgz", + "integrity": "sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-i18next": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/react-i18next/-/react-i18next-8.1.0.tgz", + "integrity": "sha512-d4xhcjX5b3roNMObRNMfb1HinHQlQLPo8xlDj60dnHeeAw2bBymR2cy/l1giJpHzo/ZFgSvgVUvIWr4kCrenCg==", + "deprecated": "This is a stub types definition. react-i18next provides its own type definitions, so you do not need this installed.", + "dev": true, + "license": "MIT", + "dependencies": { + "react-i18next": "*" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/seedrandom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", + "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.47.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", + "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", + "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", + "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", + "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.47.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.11.0.tgz", + "integrity": "sha512-YTJCGFdNMHCMfjODYtxRNVAYmTWQ1Lb8PulP/2/f/oEEtglw8oKxKIZmmRkyXrVrHfsKOaVkAc3NT9/dMutO5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.27", + "@swc/core": "^1.12.11" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@yomguithereal/helpers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@yomguithereal/helpers/-/helpers-1.1.1.tgz", + "integrity": "sha512-UYvAq/XCA7xoh1juWDYsq3W0WywOB+pz8cgVnE1b45ZfdMhBvHDrgmSFG3jXeZSr2tMTYLGHFHON+ekG05Jebg==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bun-types": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.3.2.tgz", + "integrity": "sha512-i/Gln4tbzKNuxP70OWhJRZz1MRfvqExowP7U6JKoI8cntFrtxg7RJK3jvz7wQW54UuvNC8tbKHHri5fy74FVqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "peerDependencies": { + "@types/react": "^19" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/compass-vertical-rhythm": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/compass-vertical-rhythm/-/compass-vertical-rhythm-1.4.5.tgz", + "integrity": "sha512-bJo3IYX7xmmZCDYjrT2XolaiNjGZ4E2JvUGxpdU0ecbH4ZLK786wvc8aHKVrGrKct9JlkmJbUi8YLrQWvOc+uA==", + "license": "MIT", + "dependencies": { + "convert-css-length": "^1.0.1", + "object-assign": "^4.1.0", + "parse-unit": "^1.0.1" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/console-polyfill": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/console-polyfill/-/console-polyfill-0.1.2.tgz", + "integrity": "sha512-oHLGQmf0q2yuuqfTXuzAB5UMqgPH1cHdwLkjfCqRTG2eupc52jbXT1OtOlREv+yXmXRi3wqywAevz3qMSk90Hg==", + "license": "MIT" + }, + "node_modules/convert-css-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-1.0.2.tgz", + "integrity": "sha512-ecV7j3hXyXN1X2XfJBzhMR0o1Obv0v3nHmn0UiS3ACENrzbxE/EknkiunS/fCwQva0U62X1GChi8GaPh4oTlLg==", + "license": "MIT", + "dependencies": { + "console-polyfill": "^0.1.2", + "parse-unit": "^1.0.1" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", + "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", + "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-selector": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/graphology": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz", + "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==", + "license": "MIT", + "peer": true, + "dependencies": { + "events": "^3.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.24.0" + } + }, + "node_modules/graphology-generators": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/graphology-generators/-/graphology-generators-0.11.2.tgz", + "integrity": "sha512-hx+F0OZRkVdoQ0B1tWrpxoakmHZNex0c6RAoR0PrqJ+6fz/gz6CQ88Qlw78C6yD9nlZVRgepIoDYhRTFV+bEHg==", + "license": "MIT", + "dependencies": { + "graphology-metrics": "^2.0.0", + "graphology-utils": "^2.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-indices": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", + "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.4.2", + "mnemonist": "^0.39.0" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" + } + }, + "node_modules/graphology-layout": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/graphology-layout/-/graphology-layout-0.6.1.tgz", + "integrity": "sha512-m9aMvbd0uDPffUCFPng5ibRkb2pmfNvdKjQWeZrf71RS1aOoat5874+DcyNfMeCT4aQguKC7Lj9eCbqZj/h8Ag==", + "license": "MIT", + "peer": true, + "dependencies": { + "graphology-utils": "^2.3.0", + "pandemonium": "^2.4.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-layout-force": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/graphology-layout-force/-/graphology-layout-force-0.2.4.tgz", + "integrity": "sha512-NYZz0YAnDkn5pkm30cvB0IScFoWGtbzJMrqaiH070dYlYJiag12Oc89dbVfaMaVR/w8DMIKxn/ix9Bqj+Umm9Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "graphology-utils": "^2.4.2" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-layout-forceatlas2": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/graphology-layout-forceatlas2/-/graphology-layout-forceatlas2-0.10.1.tgz", + "integrity": "sha512-ogzBeF1FvWzjkikrIFwxhlZXvD2+wlY54lqhsrWprcdPjopM2J9HoMweUmIgwaTvY4bUYVimpSsOdvDv1gPRFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "graphology-utils": "^2.1.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-layout-noverlap": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/graphology-layout-noverlap/-/graphology-layout-noverlap-0.4.2.tgz", + "integrity": "sha512-13WwZSx96zim6l1dfZONcqLh3oqyRcjIBsqz2c2iJ3ohgs3605IDWjldH41Gnhh462xGB1j6VGmuGhZ2FKISXA==", + "license": "MIT", + "peer": true, + "dependencies": { + "graphology-utils": "^2.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-metrics": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/graphology-metrics/-/graphology-metrics-2.4.0.tgz", + "integrity": "sha512-7WOfOP+mFLCaTJx55Qg4eY+211vr1/b3D/R3biz3SXGhAaCVcWYkfabnmO4O4WBNWANEHtVnFrGgJ0kj6MM6xw==", + "license": "MIT", + "dependencies": { + "graphology-indices": "^0.17.0", + "graphology-shortest-path": "^2.0.0", + "graphology-utils": "^2.4.4", + "mnemonist": "^0.39.0", + "pandemonium": "2.4.1" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" + } + }, + "node_modules/graphology-shortest-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/graphology-shortest-path/-/graphology-shortest-path-2.1.0.tgz", + "integrity": "sha512-KbT9CTkP/u72vGEJzyRr24xFC7usI9Es3LMmCPHGwQ1KTsoZjxwA9lMKxfU0syvT/w+7fZUdB/Hu2wWYcJBm6Q==", + "license": "MIT", + "dependencies": { + "@yomguithereal/helpers": "^1.1.1", + "graphology-indices": "^0.17.0", + "graphology-utils": "^2.4.3", + "mnemonist": "^0.39.0" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" + } + }, + "node_modules/graphology-types": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", + "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", + "license": "MIT", + "peer": true + }, + "node_modules/graphology-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", + "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", + "license": "MIT", + "peerDependencies": { + "graphology-types": ">=0.23.0" + } + }, + "node_modules/gray-percentage": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gray-percentage/-/gray-percentage-2.0.0.tgz", + "integrity": "sha512-T0i4bwJoXbweuBM7bJwil9iHVAwXxmS9IFsEy27cXvRYxHwR2YVSBSXBjJw4EDKUvLpfjANeT5PrvTuAH1XnTw==", + "license": "MIT" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-dom": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", + "integrity": "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==", + "license": "ISC", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^9.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-dom/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-dom/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hastscript/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/hastscript/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/i18next": { + "version": "24.2.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", + "integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/katex": { + "version": "0.16.25", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", + "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lucide-react": { + "version": "0.475.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", + "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.12.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.1.tgz", + "integrity": "sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.3", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "license": "MIT", + "peer": true + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mnemonist": { + "version": "0.39.8", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", + "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/modularscale": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/modularscale/-/modularscale-1.0.2.tgz", + "integrity": "sha512-xfu46hZcAL9xU8S/RihHE49rmDYRAg36lQez49pcO6/aLBJ7cfVr5DH7Obo2PGKTCSAyy4iTAsWZa9apECK9mQ==", + "license": "MIT", + "dependencies": { + "lodash.isnumber": "^3.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz", + "integrity": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==", + "license": "MIT" + }, + "node_modules/pandemonium": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", + "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", + "license": "MIT", + "dependencies": { + "mnemonist": "^0.39.2" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-dropzone": { + "version": "14.3.8", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.8.tgz", + "integrity": "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-error-boundary": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-5.0.0.tgz", + "integrity": "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "peerDependencies": { + "react": ">=16.13.1" + } + }, + "node_modules/react-i18next": { + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.4.tgz", + "integrity": "sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.4.0", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-number-format": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz", + "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==", + "license": "MIT", + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", + "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.6.tgz", + "integrity": "sha512-Y1tUp8clYRXpfPITyuifmSoE2vncSME18uVLgaqyxh9H35JWpIfzHo+9y3Fzh5odk/jxPW29IgLgzcdwxGqyNA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.6.tgz", + "integrity": "sha512-2MkC2XSXq6HjGcihnx1s0DBWQETI4mlis4Ux7YTLvP67xnGxCvq+BcCQSO81qQHVUTM1V53tl4iVVaY5sReCOA==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.6" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-select": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.6.6", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", + "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype-katex": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", + "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/katex": "^0.16.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "katex": "^0.16.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-react": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-8.0.0.tgz", + "integrity": "sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-math": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-math": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigma": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.2.tgz", + "integrity": "sha512-/BUbeOwPGruiBOm0YQQ6ZMcLIZ6tf/W+Jcm7dxZyAX0tK3WP9/sq7/NAWBxPIxVahdGjCJoGwej0Gdrv0DxlQQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "events": "^3.3.0", + "graphology-utils": "^2.5.2" + } + }, + "node_modules/sonner": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz", + "integrity": "sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-scrollbar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-4.0.2.tgz", + "integrity": "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==", + "license": "MIT", + "dependencies": { + "prism-react-renderer": "^2.4.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "4.x" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "license": "MIT", + "peer": true + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", + "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typography": { + "version": "0.16.24", + "resolved": "https://registry.npmjs.org/typography/-/typography-0.16.24.tgz", + "integrity": "sha512-o5jNctzGoJm2XgdqivJdpkF6lQkcQo8v1biMGY+rLSpBHhpCKdQv5em9S3R6igApxVYtbhNBJbV95vK9oPwRKQ==", + "license": "MIT", + "dependencies": { + "compass-vertical-rhythm": "^1.4.5", + "decamelize": "^1.2.0", + "gray-percentage": "^2.0.0", + "lodash": "^4.13.1", + "modularscale": "^1.0.2", + "object-assign": "^4.1.0", + "typography-normalize": "^0.16.19" + } + }, + "node_modules/typography-normalize": { + "version": "0.16.19", + "resolved": "https://registry.npmjs.org/typography-normalize/-/typography-normalize-0.16.19.tgz", + "integrity": "sha512-vtnSv/uGBZVbd4e/ZhZB9HKBgKKlWQUXw74+ADIHHxzKp27CEf8PSR8TX1zF2qSyQ9/qMdqLwXYz8yRQFq9JLQ==", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", + "integrity": "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/LightRAG/lightrag_webui/package.json b/LightRAG/lightrag_webui/package.json new file mode 100644 index 00000000..e2891a7f --- /dev/null +++ b/LightRAG/lightrag_webui/package.json @@ -0,0 +1,112 @@ +{ + "name": "lightrag-webui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "bunx --bun vite", + "build": "bunx --bun vite build", + "lint": "eslint .", + "preview": "bunx --bun vite preview", + "test": "bun test", + "test:watch": "bun test --watch", + "test:coverage": "bun test --coverage", + "dev-no-bun": "vite", + "build-no-bun": "vite build --emptyOutDir", + "preview-no-bun": "vite preview" + }, + "dependencies": { + "@faker-js/faker": "^9.9.0", + "@radix-ui/react-alert-dialog": "^1.1.15", + "@radix-ui/react-checkbox": "^1.3.3", + "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-scroll-area": "^1.2.10", + "@radix-ui/react-select": "^2.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "@radix-ui/react-tooltip": "^1.2.8", + "@radix-ui/react-use-controllable-state": "^1.2.2", + "@react-sigma/core": "^5.0.4", + "@react-sigma/graph-search": "^5.0.4", + "@react-sigma/layout-circlepack": "^5.0.4", + "@react-sigma/layout-circular": "^5.0.4", + "@react-sigma/layout-force": "^5.0.4", + "@react-sigma/layout-forceatlas2": "^5.0.4", + "@react-sigma/layout-noverlap": "^5.0.4", + "@react-sigma/layout-random": "^5.0.4", + "@react-sigma/minimap": "^5.0.5", + "@sigma/edge-curve": "^3.1.0", + "@sigma/node-border": "^3.0.0", + "@tanstack/react-table": "^8.21.3", + "axios": "^1.12.2", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "graphology": "^0.26.0", + "graphology-generators": "^0.11.2", + "graphology-layout": "^0.6.1", + "graphology-layout-force": "^0.2.4", + "graphology-layout-forceatlas2": "^0.10.1", + "graphology-layout-noverlap": "^0.4.2", + "i18next": "^24.2.3", + "katex": "^0.16.23", + "lucide-react": "^0.475.0", + "mermaid": "^11.12.0", + "minisearch": "^7.2.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-dropzone": "^14.3.8", + "react-error-boundary": "^5.0.0", + "react-i18next": "^15.7.4", + "react-markdown": "^9.1.0", + "react-number-format": "^5.4.4", + "react-router-dom": "^7.9.4", + "react-select": "^5.10.2", + "react-syntax-highlighter": "^15.6.6", + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "rehype-react": "^8.0.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", + "seedrandom": "^3.0.5", + "sigma": "^3.0.2", + "sonner": "^1.7.4", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar": "^4.0.2", + "typography": "^0.16.24", + "unist-util-visit": "^5.0.0", + "zustand": "^5.0.8" + }, + "devDependencies": { + "@eslint/js": "^9.37.0", + "@stylistic/eslint-plugin-js": "^3.1.0", + "@tailwindcss/vite": "^4.1.14", + "@types/bun": "^1.2.23", + "@types/katex": "^0.16.7", + "@types/node": "^22.18.9", + "@tailwindcss/typography": "^0.5.15", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.1", + "@types/react-i18next": "^8.1.0", + "@types/react-syntax-highlighter": "^15.5.13", + "@types/seedrandom": "^3.0.8", + "@vitejs/plugin-react-swc": "^3.11.0", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.23", + "globals": "^15.15.0", + "graphology-types": "^0.24.8", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.14", + "tailwindcss": "^4.1.14", + "tailwindcss-animate": "^1.0.7", + "typescript": "~5.7.3", + "typescript-eslint": "^8.46.0", + "vite": "^6.3.6" + } +} diff --git a/LightRAG/lightrag_webui/public/favicon.png b/LightRAG/lightrag_webui/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..307566ab234967efc3134a0a81dc375c8e3c8dfc GIT binary patch literal 15675 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 literal 0 HcmV?d00001 diff --git a/LightRAG/lightrag_webui/public/logo.svg b/LightRAG/lightrag_webui/public/logo.svg new file mode 100644 index 00000000..fd32836b --- /dev/null +++ b/LightRAG/lightrag_webui/public/logo.svg @@ -0,0 +1 @@ + diff --git a/LightRAG/lightrag_webui/src/App.tsx b/LightRAG/lightrag_webui/src/App.tsx new file mode 100644 index 00000000..b8ae023d --- /dev/null +++ b/LightRAG/lightrag_webui/src/App.tsx @@ -0,0 +1,230 @@ +import { useState, useCallback, useEffect, useRef } from 'react' +import ThemeProvider from '@/components/ThemeProvider' +import TabVisibilityProvider from '@/contexts/TabVisibilityProvider' +import ApiKeyAlert from '@/components/ApiKeyAlert' +import StatusIndicator from '@/components/status/StatusIndicator' +import { SiteInfo, webuiPrefix } from '@/lib/constants' +import { useBackendState, useAuthStore } from '@/stores/state' +import { useSettingsStore } from '@/stores/settings' +import { getAuthStatus } from '@/api/lightrag' +import SiteHeader from '@/features/SiteHeader' +import { InvalidApiKeyError, RequireApiKeError } from '@/api/lightrag' +import { ZapIcon } from 'lucide-react' + +import GraphViewer from '@/features/GraphViewer' +import DocumentManager from '@/features/DocumentManager' +import RetrievalTesting from '@/features/RetrievalTesting' +import ApiSite from '@/features/ApiSite' + +import { Tabs, TabsContent } from '@/components/ui/Tabs' + +function App() { + const message = useBackendState.use.message() + const enableHealthCheck = useSettingsStore.use.enableHealthCheck() + const currentTab = useSettingsStore.use.currentTab() + const [apiKeyAlertOpen, setApiKeyAlertOpen] = useState(false) + const [initializing, setInitializing] = useState(true) // Add initializing state + const versionCheckRef = useRef(false); // Prevent duplicate calls in Vite dev mode + const healthCheckInitializedRef = useRef(false); // Prevent duplicate health checks in Vite dev mode + + const handleApiKeyAlertOpenChange = useCallback((open: boolean) => { + setApiKeyAlertOpen(open) + if (!open) { + useBackendState.getState().clear() + } + }, []) + + // Track component mount status with useRef + const isMountedRef = useRef(true); + + // Set up mount/unmount status tracking + useEffect(() => { + isMountedRef.current = true; + + // Handle page reload/unload + const handleBeforeUnload = () => { + isMountedRef.current = false; + }; + + window.addEventListener('beforeunload', handleBeforeUnload); + + return () => { + isMountedRef.current = false; + window.removeEventListener('beforeunload', handleBeforeUnload); + }; + }, []); + + // Health check - can be disabled + useEffect(() => { + // Health check function + const performHealthCheck = async () => { + try { + // Only perform health check if component is still mounted + if (isMountedRef.current) { + await useBackendState.getState().check(); + } + } catch (error) { + console.error('Health check error:', error); + } + }; + + // Set health check function in the store + useBackendState.getState().setHealthCheckFunction(performHealthCheck); + + if (!enableHealthCheck || apiKeyAlertOpen) { + useBackendState.getState().clearHealthCheckTimer(); + return; + } + + // On first mount or when enableHealthCheck becomes true and apiKeyAlertOpen is false, + // perform an immediate health check and start the timer + if (!healthCheckInitializedRef.current) { + healthCheckInitializedRef.current = true; + } + + // Start/reset the health check timer using the store + useBackendState.getState().resetHealthCheckTimer(); + + // Component unmount cleanup + return () => { + useBackendState.getState().clearHealthCheckTimer(); + }; + }, [enableHealthCheck, apiKeyAlertOpen]); + + // Version check - independent and executed only once + useEffect(() => { + const checkVersion = async () => { + // Prevent duplicate calls in Vite dev mode + if (versionCheckRef.current) return; + versionCheckRef.current = true; + + // Check if version info was already obtained in login page + const versionCheckedFromLogin = sessionStorage.getItem('VERSION_CHECKED_FROM_LOGIN') === 'true'; + if (versionCheckedFromLogin) { + setInitializing(false); // Skip initialization if already checked + return; + } + + try { + setInitializing(true); // Start initialization + + // Get version info + const token = localStorage.getItem('LIGHTRAG-API-TOKEN'); + const status = await getAuthStatus(); + + // If auth is not configured and a new token is returned, use the new token + if (!status.auth_configured && status.access_token) { + useAuthStore.getState().login( + status.access_token, // Use the new token + true, // Guest mode + status.core_version, + status.api_version, + status.webui_title || null, + status.webui_description || null + ); + } else if (token && (status.core_version || status.api_version || status.webui_title || status.webui_description)) { + // Otherwise use the old token (if it exists) + const isGuestMode = status.auth_mode === 'disabled' || useAuthStore.getState().isGuestMode; + useAuthStore.getState().login( + token, + isGuestMode, + status.core_version, + status.api_version, + status.webui_title || null, + status.webui_description || null + ); + } + + // Set flag to indicate version info has been checked + sessionStorage.setItem('VERSION_CHECKED_FROM_LOGIN', 'true'); + } catch (error) { + console.error('Failed to get version info:', error); + } finally { + // Ensure initializing is set to false even if there's an error + setInitializing(false); + } + }; + + // Execute version check + checkVersion(); + }, []); // Empty dependency array ensures it only runs once on mount + + const handleTabChange = useCallback( + (tab: string) => useSettingsStore.getState().setCurrentTab(tab as any), + [] + ) + + useEffect(() => { + if (message) { + if (message.includes(InvalidApiKeyError) || message.includes(RequireApiKeError)) { + setApiKeyAlertOpen(true) + } + } + }, [message]) + + return ( + + + {initializing ? ( + // Loading state while initializing with simplified header +

    + {/* Simplified header during initialization - matches SiteHeader structure */} +
    + + + {/* Empty middle section to maintain layout */} +
    +
    + + {/* Empty right section to maintain layout */} + +
    + + {/* Loading indicator in content area */} +
    +
    +
    +

    Initializing...

    +
    +
    +
    + ) : ( + // Main content after initialization +
    + + +
    + + + + + + + + + + + + +
    +
    + {enableHealthCheck && } + +
    + )} + + + ) +} + +export default App diff --git a/LightRAG/lightrag_webui/src/AppRouter.tsx b/LightRAG/lightrag_webui/src/AppRouter.tsx new file mode 100644 index 00000000..3d474d2a --- /dev/null +++ b/LightRAG/lightrag_webui/src/AppRouter.tsx @@ -0,0 +1,95 @@ +import '@/lib/extensions'; // Import all global extensions +import { HashRouter as Router, Routes, Route, useNavigate } from 'react-router-dom' +import { useEffect, useState } from 'react' +import { useAuthStore } from '@/stores/state' +import { navigationService } from '@/services/navigation' +import { Toaster } from 'sonner' +import App from './App' +import LoginPage from '@/features/LoginPage' +import ThemeProvider from '@/components/ThemeProvider' + +const AppContent = () => { + const [initializing, setInitializing] = useState(true) + const { isAuthenticated } = useAuthStore() + const navigate = useNavigate() + + // Set navigate function for navigation service + useEffect(() => { + navigationService.setNavigate(navigate) + }, [navigate]) + + // Token validity check + useEffect(() => { + + const checkAuth = async () => { + try { + const token = localStorage.getItem('LIGHTRAG-API-TOKEN') + + if (token && isAuthenticated) { + setInitializing(false); + return; + } + + if (!token) { + useAuthStore.getState().logout() + } + } catch (error) { + console.error('Auth initialization error:', error) + if (!isAuthenticated) { + useAuthStore.getState().logout() + } + } finally { + setInitializing(false) + } + } + + checkAuth() + + return () => { + } + }, [isAuthenticated]) + + // Redirect effect for protected routes + useEffect(() => { + if (!initializing && !isAuthenticated) { + const currentPath = window.location.hash.slice(1); + if (currentPath !== '/login') { + console.log('Not authenticated, redirecting to login'); + navigate('/login'); + } + } + }, [initializing, isAuthenticated, navigate]); + + // Show nothing while initializing + if (initializing) { + return null + } + + return ( + + } /> + : null} + /> + + ) +} + +const AppRouter = () => { + return ( + + + + + + + ) +} + +export default AppRouter diff --git a/LightRAG/lightrag_webui/src/api/lightrag.ts b/LightRAG/lightrag_webui/src/api/lightrag.ts new file mode 100644 index 00000000..7cf1aec6 --- /dev/null +++ b/LightRAG/lightrag_webui/src/api/lightrag.ts @@ -0,0 +1,817 @@ +import axios, { AxiosError } from 'axios' +import { backendBaseUrl, popularLabelsDefaultLimit, searchLabelsDefaultLimit } from '@/lib/constants' +import { errorMessage } from '@/lib/utils' +import { useSettingsStore } from '@/stores/settings' +import { navigationService } from '@/services/navigation' + +// Types +export type LightragNodeType = { + id: string + labels: string[] + properties: Record +} + +export type LightragEdgeType = { + id: string + source: string + target: string + type: string + properties: Record +} + +export type LightragGraphType = { + nodes: LightragNodeType[] + edges: LightragEdgeType[] +} + +export type LightragStatus = { + status: 'healthy' + working_directory: string + input_directory: string + configuration: { + llm_binding: string + llm_binding_host: string + llm_model: string + embedding_binding: string + embedding_binding_host: string + embedding_model: string + kv_storage: string + doc_status_storage: string + graph_storage: string + vector_storage: string + workspace?: string + max_graph_nodes?: string + enable_rerank?: boolean + rerank_binding?: string | null + rerank_model?: string | null + rerank_binding_host?: string | null + summary_language: string + force_llm_summary_on_merge: boolean + max_parallel_insert: number + max_async: number + embedding_func_max_async: number + embedding_batch_num: number + cosine_threshold: number + min_rerank_score: number + related_chunk_number: number + } + update_status?: Record + core_version?: string + api_version?: string + auth_mode?: 'enabled' | 'disabled' + pipeline_busy: boolean + keyed_locks?: { + process_id: number + cleanup_performed: { + mp_cleaned: number + async_cleaned: number + } + current_status: { + total_mp_locks: number + pending_mp_cleanup: number + total_async_locks: number + pending_async_cleanup: number + } + } + webui_title?: string + webui_description?: string +} + +export type LightragDocumentsScanProgress = { + is_scanning: boolean + current_file: string + indexed_count: number + total_files: number + progress: number +} + +/** + * Specifies the retrieval mode: + * - "naive": Performs a basic search without advanced techniques. + * - "local": Focuses on context-dependent information. + * - "global": Utilizes global knowledge. + * - "hybrid": Combines local and global retrieval methods. + * - "mix": Integrates knowledge graph and vector retrieval. + * - "bypass": Bypasses knowledge retrieval and directly uses the LLM. + */ +export type QueryMode = 'naive' | 'local' | 'global' | 'hybrid' | 'mix' | 'bypass' + +export type Message = { + role: 'user' | 'assistant' | 'system' + content: string + thinkingContent?: string + displayContent?: string + thinkingTime?: number | null +} + +export type QueryRequest = { + query: string + /** Specifies the retrieval mode. */ + mode: QueryMode + /** If True, only returns the retrieved context without generating a response. */ + only_need_context?: boolean + /** If True, only returns the generated prompt without producing a response. */ + only_need_prompt?: boolean + /** Defines the response format. Examples: 'Multiple Paragraphs', 'Single Paragraph', 'Bullet Points'. */ + response_type?: string + /** If True, enables streaming output for real-time responses. */ + stream?: boolean + /** Number of top items to retrieve. Represents entities in 'local' mode and relationships in 'global' mode. */ + top_k?: number + /** Maximum number of text chunks to retrieve and keep after reranking. */ + chunk_top_k?: number + /** Maximum number of tokens allocated for entity context in unified token control system. */ + max_entity_tokens?: number + /** Maximum number of tokens allocated for relationship context in unified token control system. */ + max_relation_tokens?: number + /** Maximum total tokens budget for the entire query context (entities + relations + chunks + system prompt). */ + max_total_tokens?: number + /** + * Stores past conversation history to maintain context. + * Format: [{"role": "user/assistant", "content": "message"}]. + */ + conversation_history?: Message[] + /** Number of complete conversation turns (user-assistant pairs) to consider in the response context. */ + history_turns?: number + /** User-provided prompt for the query. If provided, this will be used instead of the default value from prompt template. */ + user_prompt?: string + /** Enable reranking for retrieved text chunks. If True but no rerank model is configured, a warning will be issued. Default is True. */ + enable_rerank?: boolean +} + +export type QueryResponse = { + response: string +} + +export type EntityUpdateResponse = { + status: string + message: string + data: Record + operation_summary?: { + merged: boolean + merge_status: 'success' | 'failed' | 'not_attempted' + merge_error: string | null + operation_status: 'success' | 'partial_success' | 'failure' + target_entity: string | null + final_entity?: string | null + renamed?: boolean + } +} + +export type DocActionResponse = { + status: 'success' | 'partial_success' | 'failure' | 'duplicated' + message: string + track_id?: string +} + +export type ScanResponse = { + status: 'scanning_started' + message: string + track_id: string +} + +export type ReprocessFailedResponse = { + status: 'reprocessing_started' + message: string + track_id: string +} + +export type DeleteDocResponse = { + status: 'deletion_started' | 'busy' | 'not_allowed' + message: string + doc_id: string +} + +export type DocStatus = 'pending' | 'processing' | 'preprocessed' | 'processed' | 'failed' + +export type DocStatusResponse = { + id: string + content_summary: string + content_length: number + status: DocStatus + created_at: string + updated_at: string + track_id?: string + chunks_count?: number + error_msg?: string + metadata?: Record + file_path: string +} + +export type DocsStatusesResponse = { + statuses: Record +} + +export type TrackStatusResponse = { + track_id: string + documents: DocStatusResponse[] + total_count: number + status_summary: Record +} + +export type DocumentsRequest = { + status_filter?: DocStatus | null + page: number + page_size: number + sort_field: 'created_at' | 'updated_at' | 'id' | 'file_path' + sort_direction: 'asc' | 'desc' +} + +export type PaginationInfo = { + page: number + page_size: number + total_count: number + total_pages: number + has_next: boolean + has_prev: boolean +} + +export type PaginatedDocsResponse = { + documents: DocStatusResponse[] + pagination: PaginationInfo + status_counts: Record +} + +export type StatusCountsResponse = { + status_counts: Record +} + +export type AuthStatusResponse = { + auth_configured: boolean + access_token?: string + token_type?: string + auth_mode?: 'enabled' | 'disabled' + message?: string + core_version?: string + api_version?: string + webui_title?: string + webui_description?: string +} + +export type PipelineStatusResponse = { + autoscanned: boolean + busy: boolean + job_name: string + job_start?: string + docs: number + batchs: number + cur_batch: number + request_pending: boolean + cancellation_requested?: boolean + latest_message: string + history_messages?: string[] + update_status?: Record +} + +export type LoginResponse = { + access_token: string + token_type: string + auth_mode?: 'enabled' | 'disabled' // Authentication mode identifier + message?: string // Optional message + core_version?: string + api_version?: string + webui_title?: string + webui_description?: string +} + +export const InvalidApiKeyError = 'Invalid API Key' +export const RequireApiKeError = 'API Key required' + +// Axios instance +const axiosInstance = axios.create({ + baseURL: backendBaseUrl, + headers: { + 'Content-Type': 'application/json' + } +}) + +// Interceptor: add api key and check authentication +axiosInstance.interceptors.request.use((config) => { + const apiKey = useSettingsStore.getState().apiKey + const token = localStorage.getItem('LIGHTRAG-API-TOKEN'); + + // Always include token if it exists, regardless of path + if (token) { + config.headers['Authorization'] = `Bearer ${token}` + } + if (apiKey) { + config.headers['X-API-Key'] = apiKey + } + return config +}) + +// Interceptor:hanle error +axiosInstance.interceptors.response.use( + (response) => response, + (error: AxiosError) => { + if (error.response) { + if (error.response?.status === 401) { + // For login API, throw error directly + if (error.config?.url?.includes('/login')) { + throw error; + } + // For other APIs, navigate to login page + navigationService.navigateToLogin(); + + // return a reject Promise + return Promise.reject(new Error('Authentication required')); + } + throw new Error( + `${error.response.status} ${error.response.statusText}\n${JSON.stringify( + error.response.data + )}\n${error.config?.url}` + ) + } + throw error + } +) + +// API methods +export const queryGraphs = async ( + label: string, + maxDepth: number, + maxNodes: number +): Promise => { + const response = await axiosInstance.get(`/graphs?label=${encodeURIComponent(label)}&max_depth=${maxDepth}&max_nodes=${maxNodes}`) + return response.data +} + +export const getGraphLabels = async (): Promise => { + const response = await axiosInstance.get('/graph/label/list') + return response.data +} + +export const getPopularLabels = async (limit: number = popularLabelsDefaultLimit): Promise => { + const response = await axiosInstance.get(`/graph/label/popular?limit=${limit}`) + return response.data +} + +export const searchLabels = async (query: string, limit: number = searchLabelsDefaultLimit): Promise => { + const response = await axiosInstance.get(`/graph/label/search?q=${encodeURIComponent(query)}&limit=${limit}`) + return response.data +} + +export const checkHealth = async (): Promise< + LightragStatus | { status: 'error'; message: string } +> => { + try { + const response = await axiosInstance.get('/health') + return response.data + } catch (error) { + return { + status: 'error', + message: errorMessage(error) + } + } +} + +export const getDocuments = async (): Promise => { + const response = await axiosInstance.get('/documents') + return response.data +} + +export const scanNewDocuments = async (): Promise => { + const response = await axiosInstance.post('/documents/scan') + return response.data +} + +export const reprocessFailedDocuments = async (): Promise => { + const response = await axiosInstance.post('/documents/reprocess_failed') + return response.data +} + +export const getDocumentsScanProgress = async (): Promise => { + const response = await axiosInstance.get('/documents/scan-progress') + return response.data +} + +export const queryText = async (request: QueryRequest): Promise => { + const response = await axiosInstance.post('/query', request) + return response.data +} + +export const queryTextStream = async ( + request: QueryRequest, + onChunk: (chunk: string) => void, + onError?: (error: string) => void +) => { + const apiKey = useSettingsStore.getState().apiKey; + const token = localStorage.getItem('LIGHTRAG-API-TOKEN'); + const headers: HeadersInit = { + 'Content-Type': 'application/json', + 'Accept': 'application/x-ndjson', + }; + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + if (apiKey) { + headers['X-API-Key'] = apiKey; + } + + try { + const response = await fetch(`${backendBaseUrl}/query/stream`, { + method: 'POST', + headers: headers, + body: JSON.stringify(request), + }); + + if (!response.ok) { + // Handle 401 Unauthorized error specifically + if (response.status === 401) { + // For consistency with axios interceptor, navigate to login page + navigationService.navigateToLogin(); + + // Create a specific authentication error + const authError = new Error('Authentication required'); + throw authError; + } + + // Handle other common HTTP errors with specific messages + let errorBody = 'Unknown error'; + try { + errorBody = await response.text(); // Try to get error details from body + } catch { /* ignore */ } + + // Format error message similar to axios interceptor for consistency + const url = `${backendBaseUrl}/query/stream`; + throw new Error( + `${response.status} ${response.statusText}\n${JSON.stringify( + { error: errorBody } + )}\n${url}` + ); + } + + if (!response.body) { + throw new Error('Response body is null'); + } + + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + let buffer = ''; + + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; // Stream finished + } + + // Decode the chunk and add to buffer + buffer += decoder.decode(value, { stream: true }); // stream: true handles multi-byte chars split across chunks + + // Process complete lines (NDJSON) + const lines = buffer.split('\n'); + buffer = lines.pop() || ''; // Keep potentially incomplete line in buffer + + for (const line of lines) { + if (line.trim()) { + try { + const parsed = JSON.parse(line); + if (parsed.response) { + onChunk(parsed.response); + } else if (parsed.error && onError) { + onError(parsed.error); + } + } catch (error) { + console.error('Error parsing stream chunk:', line, error); + if (onError) onError(`Error parsing server response: ${line}`); + } + } + } + } + + // Process any remaining data in the buffer after the stream ends + if (buffer.trim()) { + try { + const parsed = JSON.parse(buffer); + if (parsed.response) { + onChunk(parsed.response); + } else if (parsed.error && onError) { + onError(parsed.error); + } + } catch (error) { + console.error('Error parsing final chunk:', buffer, error); + if (onError) onError(`Error parsing final server response: ${buffer}`); + } + } + + } catch (error) { + const message = errorMessage(error); + + // Check if this is an authentication error + if (message === 'Authentication required') { + // Already navigated to login page in the response.status === 401 block + console.error('Authentication required for stream request'); + if (onError) { + onError('Authentication required'); + } + return; // Exit early, no need for further error handling + } + + // Check for specific HTTP error status codes in the error message + const statusCodeMatch = message.match(/^(\d{3})\s/); + if (statusCodeMatch) { + const statusCode = parseInt(statusCodeMatch[1], 10); + + // Handle specific status codes with user-friendly messages + let userMessage = message; + + switch (statusCode) { + case 403: + userMessage = 'You do not have permission to access this resource (403 Forbidden)'; + console.error('Permission denied for stream request:', message); + break; + case 404: + userMessage = 'The requested resource does not exist (404 Not Found)'; + console.error('Resource not found for stream request:', message); + break; + case 429: + userMessage = 'Too many requests, please try again later (429 Too Many Requests)'; + console.error('Rate limited for stream request:', message); + break; + case 500: + case 502: + case 503: + case 504: + userMessage = `Server error, please try again later (${statusCode})`; + console.error('Server error for stream request:', message); + break; + default: + console.error('Stream request failed with status code:', statusCode, message); + } + + if (onError) { + onError(userMessage); + } + return; + } + + // Handle network errors (like connection refused, timeout, etc.) + if (message.includes('NetworkError') || + message.includes('Failed to fetch') || + message.includes('Network request failed')) { + console.error('Network error for stream request:', message); + if (onError) { + onError('Network connection error, please check your internet connection'); + } + return; + } + + // Handle JSON parsing errors during stream processing + if (message.includes('Error parsing') || message.includes('SyntaxError')) { + console.error('JSON parsing error in stream:', message); + if (onError) { + onError('Error processing response data'); + } + return; + } + + // Handle other errors + console.error('Unhandled stream error:', message); + if (onError) { + onError(message); + } else { + console.error('No error handler provided for stream error:', message); + } + } +}; + +export const insertText = async (text: string): Promise => { + const response = await axiosInstance.post('/documents/text', { text }) + return response.data +} + +export const insertTexts = async (texts: string[]): Promise => { + const response = await axiosInstance.post('/documents/texts', { texts }) + return response.data +} + +export const uploadDocument = async ( + file: File, + onUploadProgress?: (percentCompleted: number) => void +): Promise => { + const formData = new FormData() + formData.append('file', file) + + const response = await axiosInstance.post('/documents/upload', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + }, + // prettier-ignore + onUploadProgress: + onUploadProgress !== undefined + ? (progressEvent) => { + const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total!) + onUploadProgress(percentCompleted) + } + : undefined + }) + return response.data +} + +export const batchUploadDocuments = async ( + files: File[], + onUploadProgress?: (fileName: string, percentCompleted: number) => void +): Promise => { + return await Promise.all( + files.map(async (file) => { + return await uploadDocument(file, (percentCompleted) => { + onUploadProgress?.(file.name, percentCompleted) + }) + }) + ) +} + +export const clearDocuments = async (): Promise => { + const response = await axiosInstance.delete('/documents') + return response.data +} + +export const clearCache = async (): Promise<{ + status: 'success' | 'fail' + message: string +}> => { + const response = await axiosInstance.post('/documents/clear_cache', {}) + return response.data +} + +export const deleteDocuments = async ( + docIds: string[], + deleteFile: boolean = false, + deleteLLMCache: boolean = false +): Promise => { + const response = await axiosInstance.delete('/documents/delete_document', { + data: { doc_ids: docIds, delete_file: deleteFile, delete_llm_cache: deleteLLMCache } + }) + return response.data +} + +export const getAuthStatus = async (): Promise => { + try { + // Add a timeout to the request to prevent hanging + const response = await axiosInstance.get('/auth-status', { + timeout: 5000, // 5 second timeout + headers: { + 'Accept': 'application/json' // Explicitly request JSON + } + }); + + // Check if response is HTML (which indicates a redirect or wrong endpoint) + const contentType = response.headers['content-type'] || ''; + if (contentType.includes('text/html')) { + console.warn('Received HTML response instead of JSON for auth-status endpoint'); + return { + auth_configured: true, + auth_mode: 'enabled' + }; + } + + // Strict validation of the response data + if (response.data && + typeof response.data === 'object' && + 'auth_configured' in response.data && + typeof response.data.auth_configured === 'boolean') { + + // For unconfigured auth, ensure we have an access token + if (!response.data.auth_configured) { + if (response.data.access_token && typeof response.data.access_token === 'string') { + return response.data; + } else { + console.warn('Auth not configured but no valid access token provided'); + } + } else { + // For configured auth, just return the data + return response.data; + } + } + + // If response data is invalid but we got a response, log it + console.warn('Received invalid auth status response:', response.data); + + // Default to auth configured if response is invalid + return { + auth_configured: true, + auth_mode: 'enabled' + }; + } catch (error) { + // If the request fails, assume authentication is configured + console.error('Failed to get auth status:', errorMessage(error)); + return { + auth_configured: true, + auth_mode: 'enabled' + }; + } +} + +export const getPipelineStatus = async (): Promise => { + const response = await axiosInstance.get('/documents/pipeline_status') + return response.data +} + +export const cancelPipeline = async (): Promise<{ + status: 'cancellation_requested' | 'not_busy' + message: string +}> => { + const response = await axiosInstance.post('/documents/cancel_pipeline') + return response.data +} + +export const loginToServer = async (username: string, password: string): Promise => { + const formData = new FormData(); + formData.append('username', username); + formData.append('password', password); + + const response = await axiosInstance.post('/login', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }); + + return response.data; +} + +/** + * Updates an entity's properties in the knowledge graph + * @param entityName The name of the entity to update + * @param updatedData Dictionary containing updated attributes + * @param allowRename Whether to allow renaming the entity (default: false) + * @param allowMerge Whether to merge into an existing entity when renaming to a duplicate name + * @returns Promise with the updated entity information + */ +export const updateEntity = async ( + entityName: string, + updatedData: Record, + allowRename: boolean = false, + allowMerge: boolean = false +): Promise => { + const response = await axiosInstance.post('/graph/entity/edit', { + entity_name: entityName, + updated_data: updatedData, + allow_rename: allowRename, + allow_merge: allowMerge + }) + return response.data +} + +/** + * Updates a relation's properties in the knowledge graph + * @param sourceEntity The source entity name + * @param targetEntity The target entity name + * @param updatedData Dictionary containing updated attributes + * @returns Promise with the updated relation information + */ +export const updateRelation = async ( + sourceEntity: string, + targetEntity: string, + updatedData: Record +): Promise => { + const response = await axiosInstance.post('/graph/relation/edit', { + source_id: sourceEntity, + target_id: targetEntity, + updated_data: updatedData + }) + return response.data +} + +/** + * Checks if an entity name already exists in the knowledge graph + * @param entityName The entity name to check + * @returns Promise with boolean indicating if the entity exists + */ +export const checkEntityNameExists = async (entityName: string): Promise => { + try { + const response = await axiosInstance.get(`/graph/entity/exists?name=${encodeURIComponent(entityName)}`) + return response.data.exists + } catch (error) { + console.error('Error checking entity name:', error) + return false + } +} + +/** + * Get the processing status of documents by tracking ID + * @param trackId The tracking ID returned from upload, text, or texts endpoints + * @returns Promise with the track status response containing documents and summary + */ +export const getTrackStatus = async (trackId: string): Promise => { + const response = await axiosInstance.get(`/documents/track_status/${encodeURIComponent(trackId)}`) + return response.data +} + +/** + * Get documents with pagination support + * @param request The pagination request parameters + * @returns Promise with paginated documents response + */ +export const getDocumentsPaginated = async (request: DocumentsRequest): Promise => { + const response = await axiosInstance.post('/documents/paginated', request) + return response.data +} + +/** + * Get counts of documents by status + * @returns Promise with status counts response + */ +export const getDocumentStatusCounts = async (): Promise => { + const response = await axiosInstance.get('/documents/status_counts') + return response.data +} diff --git a/LightRAG/lightrag_webui/src/components/ApiKeyAlert.tsx b/LightRAG/lightrag_webui/src/components/ApiKeyAlert.tsx new file mode 100644 index 00000000..bbbce1bb --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/ApiKeyAlert.tsx @@ -0,0 +1,86 @@ +import { useState, useCallback, useEffect } from 'react' +import { useTranslation } from 'react-i18next' +import { + AlertDialog, + AlertDialogContent, + AlertDialogDescription, + AlertDialogHeader, + AlertDialogTitle +} from '@/components/ui/AlertDialog' +import Button from '@/components/ui/Button' +import Input from '@/components/ui/Input' +import { useSettingsStore } from '@/stores/settings' +import { useBackendState } from '@/stores/state' +import { InvalidApiKeyError, RequireApiKeError } from '@/api/lightrag' + +interface ApiKeyAlertProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +const ApiKeyAlert = ({ open: opened, onOpenChange: setOpened }: ApiKeyAlertProps) => { + const { t } = useTranslation() + const apiKey = useSettingsStore.use.apiKey() + const [tempApiKey, setTempApiKey] = useState('') + const message = useBackendState.use.message() + + useEffect(() => { + setTempApiKey(apiKey || '') + }, [apiKey, opened]) + + useEffect(() => { + if (message) { + if (message.includes(InvalidApiKeyError) || message.includes(RequireApiKeError)) { + setOpened(true) + } + } + }, [message, setOpened]) + + const setApiKey = useCallback(() => { + useSettingsStore.setState({ apiKey: tempApiKey || null }) + setOpened(false) + }, [tempApiKey, setOpened]) + + const handleTempApiKeyChange = useCallback( + (e: React.ChangeEvent) => { + setTempApiKey(e.target.value) + }, + [setTempApiKey] + ) + + return ( + + + + {t('apiKeyAlert.title')} + + {t('apiKeyAlert.description')} + + +
    +
    e.preventDefault()}> + + + +
    + {message && ( +
    + {message} +
    + )} +
    +
    +
    + ) +} + +export default ApiKeyAlert diff --git a/LightRAG/lightrag_webui/src/components/AppSettings.tsx b/LightRAG/lightrag_webui/src/components/AppSettings.tsx new file mode 100644 index 00000000..09312794 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/AppSettings.tsx @@ -0,0 +1,74 @@ +import { useState, useCallback } from 'react' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/Popover' +import Button from '@/components/ui/Button' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/Select' +import { useSettingsStore } from '@/stores/settings' +import { PaletteIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { cn } from '@/lib/utils' + +interface AppSettingsProps { + className?: string +} + +export default function AppSettings({ className }: AppSettingsProps) { + const [opened, setOpened] = useState(false) + const { t } = useTranslation() + + const language = useSettingsStore.use.language() + const setLanguage = useSettingsStore.use.setLanguage() + + const theme = useSettingsStore.use.theme() + const setTheme = useSettingsStore.use.setTheme() + + const handleLanguageChange = useCallback((value: string) => { + setLanguage(value as 'en' | 'zh' | 'fr' | 'ar' | 'zh_TW') + }, [setLanguage]) + + const handleThemeChange = useCallback((value: string) => { + setTheme(value as 'light' | 'dark' | 'system') + }, [setTheme]) + + return ( + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    + ) +} diff --git a/LightRAG/lightrag_webui/src/components/LanguageToggle.tsx b/LightRAG/lightrag_webui/src/components/LanguageToggle.tsx new file mode 100644 index 00000000..0eab780e --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/LanguageToggle.tsx @@ -0,0 +1,49 @@ +import Button from '@/components/ui/Button' +import { useCallback } from 'react' +import { controlButtonVariant } from '@/lib/constants' +import { useTranslation } from 'react-i18next' +import { useSettingsStore } from '@/stores/settings' + +/** + * Component that toggles the language between English and Chinese. + */ +export default function LanguageToggle() { + const { i18n } = useTranslation() + const currentLanguage = i18n.language + const setLanguage = useSettingsStore.use.setLanguage() + + const setEnglish = useCallback(() => { + i18n.changeLanguage('en') + setLanguage('en') + }, [i18n, setLanguage]) + + const setChinese = useCallback(() => { + i18n.changeLanguage('zh') + setLanguage('zh') + }, [i18n, setLanguage]) + + if (currentLanguage === 'zh') { + return ( + + ) + } + return ( + + ) +} diff --git a/LightRAG/lightrag_webui/src/components/Root.tsx b/LightRAG/lightrag_webui/src/components/Root.tsx new file mode 100644 index 00000000..1129e093 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/Root.tsx @@ -0,0 +1,9 @@ +import { StrictMode } from 'react' +import App from '@/App' +import '@/i18n' + +export const Root = () => ( + + + +) diff --git a/LightRAG/lightrag_webui/src/components/ThemeProvider.tsx b/LightRAG/lightrag_webui/src/components/ThemeProvider.tsx new file mode 100644 index 00000000..df5816c6 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/ThemeProvider.tsx @@ -0,0 +1,59 @@ +import { createContext, useEffect } from 'react' +import { Theme, useSettingsStore } from '@/stores/settings' + +type ThemeProviderProps = { + children: React.ReactNode +} + +type ThemeProviderState = { + theme: Theme + setTheme: (theme: Theme) => void +} + +const initialState: ThemeProviderState = { + theme: 'system', + setTheme: () => null +} + +const ThemeProviderContext = createContext(initialState) + +/** + * Component that provides the theme state and setter function to its children. + */ +export default function ThemeProvider({ children, ...props }: ThemeProviderProps) { + const theme = useSettingsStore.use.theme() + const setTheme = useSettingsStore.use.setTheme() + + useEffect(() => { + const root = window.document.documentElement + root.classList.remove('light', 'dark') + + if (theme === 'system') { + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)') + const handleChange = (e: MediaQueryListEvent) => { + root.classList.remove('light', 'dark') + root.classList.add(e.matches ? 'dark' : 'light') + } + + root.classList.add(mediaQuery.matches ? 'dark' : 'light') + mediaQuery.addEventListener('change', handleChange) + + return () => mediaQuery.removeEventListener('change', handleChange) + } else { + root.classList.add(theme) + } + }, [theme]) + + const value = { + theme, + setTheme + } + + return ( + + {children} + + ) +} + +export { ThemeProviderContext } diff --git a/LightRAG/lightrag_webui/src/components/ThemeToggle.tsx b/LightRAG/lightrag_webui/src/components/ThemeToggle.tsx new file mode 100644 index 00000000..ff333ff0 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/ThemeToggle.tsx @@ -0,0 +1,41 @@ +import Button from '@/components/ui/Button' +import useTheme from '@/hooks/useTheme' +import { MoonIcon, SunIcon } from 'lucide-react' +import { useCallback } from 'react' +import { controlButtonVariant } from '@/lib/constants' +import { useTranslation } from 'react-i18next' + +/** + * Component that toggles the theme between light and dark. + */ +export default function ThemeToggle() { + const { theme, setTheme } = useTheme() + const setLight = useCallback(() => setTheme('light'), [setTheme]) + const setDark = useCallback(() => setTheme('dark'), [setTheme]) + const { t } = useTranslation() + + if (theme === 'dark') { + return ( + + ) + } + return ( + + ) +} diff --git a/LightRAG/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx b/LightRAG/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx new file mode 100644 index 00000000..4aaa1f47 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/documents/ClearDocumentsDialog.tsx @@ -0,0 +1,211 @@ +import { useState, useCallback, useEffect, useRef } from 'react' +import Button from '@/components/ui/Button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogFooter +} from '@/components/ui/Dialog' +import Input from '@/components/ui/Input' +import Checkbox from '@/components/ui/Checkbox' +import { toast } from 'sonner' +import { errorMessage } from '@/lib/utils' +import { clearDocuments, clearCache } from '@/api/lightrag' + +import { EraserIcon, AlertTriangleIcon, Loader2Icon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +// Simple Label component +const Label = ({ + htmlFor, + className, + children, + ...props +}: React.LabelHTMLAttributes) => ( + +) + +interface ClearDocumentsDialogProps { + onDocumentsCleared?: () => Promise +} + +export default function ClearDocumentsDialog({ onDocumentsCleared }: ClearDocumentsDialogProps) { + const { t } = useTranslation() + const [open, setOpen] = useState(false) + const [confirmText, setConfirmText] = useState('') + const [clearCacheOption, setClearCacheOption] = useState(false) + const [isClearing, setIsClearing] = useState(false) + const timeoutRef = useRef | null>(null) + const isConfirmEnabled = confirmText.toLowerCase() === 'yes' + + // Timeout constant (30 seconds) + const CLEAR_TIMEOUT = 30000 + + // Reset state when dialog closes + useEffect(() => { + if (!open) { + setConfirmText('') + setClearCacheOption(false) + setIsClearing(false) + + // Clear timeout timer + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } + } + }, [open]) + + // Cleanup when component unmounts + useEffect(() => { + return () => { + // Clear timeout timer when component unmounts + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + } + } + }, []) + + const handleClear = useCallback(async () => { + if (!isConfirmEnabled || isClearing) return + + setIsClearing(true) + + // Set timeout protection + timeoutRef.current = setTimeout(() => { + if (isClearing) { + toast.error(t('documentPanel.clearDocuments.timeout')) + setIsClearing(false) + setConfirmText('') // Reset confirmation text after timeout + } + }, CLEAR_TIMEOUT) + + try { + const result = await clearDocuments() + + if (result.status !== 'success') { + toast.error(t('documentPanel.clearDocuments.failed', { message: result.message })) + setConfirmText('') + return + } + + toast.success(t('documentPanel.clearDocuments.success')) + + if (clearCacheOption) { + try { + await clearCache() + toast.success(t('documentPanel.clearDocuments.cacheCleared')) + } catch (cacheErr) { + toast.error(t('documentPanel.clearDocuments.cacheClearFailed', { error: errorMessage(cacheErr) })) + } + } + + // Refresh document list if provided + if (onDocumentsCleared) { + onDocumentsCleared().catch(console.error) + } + + // Close dialog after all operations succeed + setOpen(false) + } catch (err) { + toast.error(t('documentPanel.clearDocuments.error', { error: errorMessage(err) })) + setConfirmText('') + } finally { + // Clear timeout timer + if (timeoutRef.current) { + clearTimeout(timeoutRef.current) + timeoutRef.current = null + } + setIsClearing(false) + } + }, [isConfirmEnabled, isClearing, clearCacheOption, setOpen, t, onDocumentsCleared, CLEAR_TIMEOUT]) + + return ( + + + + + e.preventDefault()}> + + + + {t('documentPanel.clearDocuments.title')} + + + {t('documentPanel.clearDocuments.description')} + + + +
    + {t('documentPanel.clearDocuments.warning')} +
    +
    + {t('documentPanel.clearDocuments.confirm')} +
    + +
    +
    + + ) => setConfirmText(e.target.value)} + placeholder={t('documentPanel.clearDocuments.confirmPlaceholder')} + className="w-full" + disabled={isClearing} + /> +
    + +
    + setClearCacheOption(checked === true)} + disabled={isClearing} + /> + +
    +
    + + + + + +
    +
    + ) +} diff --git a/LightRAG/lightrag_webui/src/components/documents/DeleteDocumentsDialog.tsx b/LightRAG/lightrag_webui/src/components/documents/DeleteDocumentsDialog.tsx new file mode 100644 index 00000000..eb5b173f --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/documents/DeleteDocumentsDialog.tsx @@ -0,0 +1,191 @@ +import { useState, useCallback, useEffect } from 'react' +import Button from '@/components/ui/Button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, + DialogFooter +} from '@/components/ui/Dialog' +import Input from '@/components/ui/Input' +import { toast } from 'sonner' +import { errorMessage } from '@/lib/utils' +import { deleteDocuments } from '@/api/lightrag' + +import { TrashIcon, AlertTriangleIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +// Simple Label component +const Label = ({ + htmlFor, + className, + children, + ...props +}: React.LabelHTMLAttributes) => ( + +) + +interface DeleteDocumentsDialogProps { + selectedDocIds: string[] + onDocumentsDeleted?: () => Promise +} + +export default function DeleteDocumentsDialog({ selectedDocIds, onDocumentsDeleted }: DeleteDocumentsDialogProps) { + const { t } = useTranslation() + const [open, setOpen] = useState(false) + const [confirmText, setConfirmText] = useState('') + const [deleteFile, setDeleteFile] = useState(false) + const [isDeleting, setIsDeleting] = useState(false) + const [deleteLLMCache, setDeleteLLMCache] = useState(false) + const isConfirmEnabled = confirmText.toLowerCase() === 'yes' && !isDeleting + + // Reset state when dialog closes + useEffect(() => { + if (!open) { + setConfirmText('') + setDeleteFile(false) + setDeleteLLMCache(false) + setIsDeleting(false) + } + }, [open]) + + const handleDelete = useCallback(async () => { + if (!isConfirmEnabled || selectedDocIds.length === 0) return + + setIsDeleting(true) + try { + const result = await deleteDocuments(selectedDocIds, deleteFile, deleteLLMCache) + + if (result.status === 'deletion_started') { + toast.success(t('documentPanel.deleteDocuments.success', { count: selectedDocIds.length })) + } else if (result.status === 'busy') { + toast.error(t('documentPanel.deleteDocuments.busy')) + setConfirmText('') + setIsDeleting(false) + return + } else if (result.status === 'not_allowed') { + toast.error(t('documentPanel.deleteDocuments.notAllowed')) + setConfirmText('') + setIsDeleting(false) + return + } else { + toast.error(t('documentPanel.deleteDocuments.failed', { message: result.message })) + setConfirmText('') + setIsDeleting(false) + return + } + + // Refresh document list if provided + if (onDocumentsDeleted) { + onDocumentsDeleted().catch(console.error) + } + + // Close dialog after successful operation + setOpen(false) + } catch (err) { + toast.error(t('documentPanel.deleteDocuments.error', { error: errorMessage(err) })) + setConfirmText('') + } finally { + setIsDeleting(false) + } + }, [isConfirmEnabled, selectedDocIds, deleteFile, deleteLLMCache, setOpen, t, onDocumentsDeleted]) + + return ( + + + + + e.preventDefault()}> + + + + {t('documentPanel.deleteDocuments.title')} + + + {t('documentPanel.deleteDocuments.description', { count: selectedDocIds.length })} + + + +
    + {t('documentPanel.deleteDocuments.warning')} +
    + +
    + {t('documentPanel.deleteDocuments.confirm', { count: selectedDocIds.length })} +
    + +
    +
    + + ) => setConfirmText(e.target.value)} + placeholder={t('documentPanel.deleteDocuments.confirmPlaceholder')} + className="w-full" + disabled={isDeleting} + /> +
    + +
    + setDeleteFile(e.target.checked)} + disabled={isDeleting} + className="h-4 w-4 text-red-600 focus:ring-red-500 border-gray-300 rounded" + /> + +
    + +
    + setDeleteLLMCache(e.target.checked)} + disabled={isDeleting} + className="h-4 w-4 text-red-600 focus:ring-red-500 border-gray-300 rounded" + /> + +
    +
    + + + + + +
    +
    + ) +} diff --git a/LightRAG/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx b/LightRAG/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx new file mode 100644 index 00000000..c368d69c --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/documents/PipelineStatusDialog.tsx @@ -0,0 +1,269 @@ +import { useState, useEffect, useRef } from 'react' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' +import { AlignLeft, AlignCenter, AlignRight } from 'lucide-react' + +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription +} from '@/components/ui/Dialog' +import Button from '@/components/ui/Button' +import { getPipelineStatus, cancelPipeline, PipelineStatusResponse } from '@/api/lightrag' +import { errorMessage } from '@/lib/utils' +import { cn } from '@/lib/utils' + +type DialogPosition = 'left' | 'center' | 'right' + +interface PipelineStatusDialogProps { + open: boolean + onOpenChange: (open: boolean) => void +} + +export default function PipelineStatusDialog({ + open, + onOpenChange +}: PipelineStatusDialogProps) { + const { t } = useTranslation() + const [status, setStatus] = useState(null) + const [position, setPosition] = useState('center') + const [isUserScrolled, setIsUserScrolled] = useState(false) + const [showCancelConfirm, setShowCancelConfirm] = useState(false) + const historyRef = useRef(null) + + // Reset position when dialog opens + useEffect(() => { + if (open) { + setPosition('center') + setIsUserScrolled(false) + } else { + // Reset confirmation dialog state when main dialog closes + setShowCancelConfirm(false) + } + }, [open]) + + // Handle scroll position + useEffect(() => { + const container = historyRef.current + if (!container || isUserScrolled) return + + container.scrollTop = container.scrollHeight + }, [status?.history_messages, isUserScrolled]) + + const handleScroll = () => { + const container = historyRef.current + if (!container) return + + const isAtBottom = Math.abs( + (container.scrollHeight - container.scrollTop) - container.clientHeight + ) < 1 + + if (isAtBottom) { + setIsUserScrolled(false) + } else { + setIsUserScrolled(true) + } + } + + // Refresh status every 2 seconds + useEffect(() => { + if (!open) return + + const fetchStatus = async () => { + try { + const data = await getPipelineStatus() + setStatus(data) + } catch (err) { + toast.error(t('documentPanel.pipelineStatus.errors.fetchFailed', { error: errorMessage(err) })) + } + } + + fetchStatus() + const interval = setInterval(fetchStatus, 2000) + return () => clearInterval(interval) + }, [open, t]) + + // Handle cancel pipeline confirmation + const handleConfirmCancel = async () => { + setShowCancelConfirm(false) + try { + const result = await cancelPipeline() + if (result.status === 'cancellation_requested') { + toast.success(t('documentPanel.pipelineStatus.cancelSuccess')) + } else if (result.status === 'not_busy') { + toast.info(t('documentPanel.pipelineStatus.cancelNotBusy')) + } + } catch (err) { + toast.error(t('documentPanel.pipelineStatus.cancelFailed', { error: errorMessage(err) })) + } + } + + // Determine if cancel button should be enabled + const canCancel = status?.busy === true && !status?.cancellation_requested + + return ( + + + + {status?.job_name + ? `${t('documentPanel.pipelineStatus.jobName')}: ${status.job_name}, ${t('documentPanel.pipelineStatus.progress')}: ${status.cur_batch}/${status.batchs}` + : t('documentPanel.pipelineStatus.noActiveJob') + } + + + + {t('documentPanel.pipelineStatus.title')} + + + {/* Position control buttons */} +
    + + + +
    +
    + + {/* Status Content */} +
    + {/* Pipeline Status - with cancel button */} +
    + {/* Left side: Status indicators */} +
    +
    +
    {t('documentPanel.pipelineStatus.busy')}:
    +
    +
    +
    +
    {t('documentPanel.pipelineStatus.requestPending')}:
    +
    +
    + {/* Only show cancellation status when it's requested */} + {status?.cancellation_requested && ( +
    +
    {t('documentPanel.pipelineStatus.cancellationRequested')}:
    +
    +
    + )} +
    + + {/* Right side: Cancel button - only show when pipeline is busy */} + {status?.busy && ( + + )} +
    + + {/* Job Information */} +
    +
    {t('documentPanel.pipelineStatus.jobName')}: {status?.job_name || '-'}
    +
    + {t('documentPanel.pipelineStatus.startTime')}: {status?.job_start + ? new Date(status.job_start).toLocaleString(undefined, { + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }) + : '-'} + {t('documentPanel.pipelineStatus.progress')}: {status ? `${status.cur_batch}/${status.batchs} ${t('documentPanel.pipelineStatus.unit')}` : '-'} +
    +
    + + {/* History Messages */} +
    +
    {t('documentPanel.pipelineStatus.pipelineMessages')}:
    +
    + {status?.history_messages?.length ? ( + status.history_messages.map((msg, idx) => ( +
    {msg}
    + )) + ) : '-'} +
    +
    +
    + + + {/* Cancel Confirmation Dialog */} + + + + {t('documentPanel.pipelineStatus.cancelConfirmTitle')} + + {t('documentPanel.pipelineStatus.cancelConfirmDescription')} + + +
    + + +
    +
    +
    +
    + ) +} diff --git a/LightRAG/lightrag_webui/src/components/documents/UploadDocumentsDialog.tsx b/LightRAG/lightrag_webui/src/components/documents/UploadDocumentsDialog.tsx new file mode 100644 index 00000000..16e21e7d --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/documents/UploadDocumentsDialog.tsx @@ -0,0 +1,220 @@ +import { useState, useCallback } from 'react' +import { FileRejection } from 'react-dropzone' +import Button from '@/components/ui/Button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger +} from '@/components/ui/Dialog' +import FileUploader from '@/components/ui/FileUploader' +import { toast } from 'sonner' +import { errorMessage } from '@/lib/utils' +import { uploadDocument } from '@/api/lightrag' + +import { UploadIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +interface UploadDocumentsDialogProps { + onDocumentsUploaded?: () => Promise +} + +export default function UploadDocumentsDialog({ onDocumentsUploaded }: UploadDocumentsDialogProps) { + const { t } = useTranslation() + const [open, setOpen] = useState(false) + const [isUploading, setIsUploading] = useState(false) + const [progresses, setProgresses] = useState>({}) + const [fileErrors, setFileErrors] = useState>({}) + + const handleRejectedFiles = useCallback( + (rejectedFiles: FileRejection[]) => { + // Process rejected files and add them to fileErrors + rejectedFiles.forEach(({ file, errors }) => { + // Get the first error message + let errorMsg = errors[0]?.message || t('documentPanel.uploadDocuments.fileUploader.fileRejected', { name: file.name }) + + // Simplify error message for unsupported file types + if (errorMsg.includes('file-invalid-type')) { + errorMsg = t('documentPanel.uploadDocuments.fileUploader.unsupportedType') + } + + // Set progress to 100% to display error message + setProgresses((pre) => ({ + ...pre, + [file.name]: 100 + })) + + // Add error message to fileErrors + setFileErrors(prev => ({ + ...prev, + [file.name]: errorMsg + })) + }) + }, + [setProgresses, setFileErrors, t] + ) + + const handleDocumentsUpload = useCallback( + async (filesToUpload: File[]) => { + setIsUploading(true) + let hasSuccessfulUpload = false + + // Only clear errors for files that are being uploaded, keep errors for rejected files + setFileErrors(prev => { + const newErrors = { ...prev }; + filesToUpload.forEach(file => { + delete newErrors[file.name]; + }); + return newErrors; + }); + + // Show uploading toast + const toastId = toast.loading(t('documentPanel.uploadDocuments.batch.uploading')) + + try { + // Track errors locally to ensure we have the final state + const uploadErrors: Record = {} + + // Create a collator that supports Chinese sorting + const collator = new Intl.Collator(['zh-CN', 'en'], { + sensitivity: 'accent', // consider basic characters, accents, and case + numeric: true // enable numeric sorting, e.g., "File 10" will be after "File 2" + }); + const sortedFiles = [...filesToUpload].sort((a, b) => + collator.compare(a.name, b.name) + ); + + // Upload files in sequence, not parallel + for (const file of sortedFiles) { + try { + // Initialize upload progress + setProgresses((pre) => ({ + ...pre, + [file.name]: 0 + })) + + const result = await uploadDocument(file, (percentCompleted: number) => { + console.debug(t('documentPanel.uploadDocuments.single.uploading', { name: file.name, percent: percentCompleted })) + setProgresses((pre) => ({ + ...pre, + [file.name]: percentCompleted + })) + }) + + if (result.status === 'duplicated') { + uploadErrors[file.name] = t('documentPanel.uploadDocuments.fileUploader.duplicateFile') + setFileErrors(prev => ({ + ...prev, + [file.name]: t('documentPanel.uploadDocuments.fileUploader.duplicateFile') + })) + } else if (result.status !== 'success') { + uploadErrors[file.name] = result.message + setFileErrors(prev => ({ + ...prev, + [file.name]: result.message + })) + } else { + // Mark that we had at least one successful upload + hasSuccessfulUpload = true + } + } catch (err) { + console.error(`Upload failed for ${file.name}:`, err) + + // Handle HTTP errors, including 400 errors + let errorMsg = errorMessage(err) + + // If it's an axios error with response data, try to extract more detailed error info + if (err && typeof err === 'object' && 'response' in err) { + const axiosError = err as { response?: { status: number, data?: { detail?: string } } } + if (axiosError.response?.status === 400) { + // Extract specific error message from backend response + errorMsg = axiosError.response.data?.detail || errorMsg + } + + // Set progress to 100% to display error message + setProgresses((pre) => ({ + ...pre, + [file.name]: 100 + })) + } + + // Record error message in both local tracking and state + uploadErrors[file.name] = errorMsg + setFileErrors(prev => ({ + ...prev, + [file.name]: errorMsg + })) + } + } + + // Check if any files failed to upload using our local tracking + const hasErrors = Object.keys(uploadErrors).length > 0 + + // Update toast status + if (hasErrors) { + toast.error(t('documentPanel.uploadDocuments.batch.error'), { id: toastId }) + } else { + toast.success(t('documentPanel.uploadDocuments.batch.success'), { id: toastId }) + } + + // Only update if at least one file was uploaded successfully + if (hasSuccessfulUpload) { + // Refresh document list + if (onDocumentsUploaded) { + onDocumentsUploaded().catch(err => { + console.error('Error refreshing documents:', err) + }) + } + } + } catch (err) { + console.error('Unexpected error during upload:', err) + toast.error(t('documentPanel.uploadDocuments.generalError', { error: errorMessage(err) }), { id: toastId }) + } finally { + setIsUploading(false) + } + }, + [setIsUploading, setProgresses, setFileErrors, t, onDocumentsUploaded] + ) + + return ( + { + if (isUploading) { + return + } + if (!open) { + setProgresses({}) + setFileErrors({}) + } + setOpen(open) + }} + > + + + + e.preventDefault()}> + + {t('documentPanel.uploadDocuments.title')} + + {t('documentPanel.uploadDocuments.description')} + + + + + + ) +} diff --git a/LightRAG/lightrag_webui/src/components/graph/EditablePropertyRow.tsx b/LightRAG/lightrag_webui/src/components/graph/EditablePropertyRow.tsx new file mode 100644 index 00000000..1604bcdc --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/EditablePropertyRow.tsx @@ -0,0 +1,288 @@ +import { useState, useEffect } from 'react' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' +import { updateEntity, updateRelation, checkEntityNameExists } from '@/api/lightrag' +import { useGraphStore } from '@/stores/graph' +import { useSettingsStore } from '@/stores/settings' +import { SearchHistoryManager } from '@/utils/SearchHistoryManager' +import { PropertyName, EditIcon, PropertyValue } from './PropertyRowComponents' +import PropertyEditDialog from './PropertyEditDialog' +import MergeDialog from './MergeDialog' + +/** + * Interface for the EditablePropertyRow component props + */ +interface EditablePropertyRowProps { + name: string // Property name to display and edit + value: any // Initial value of the property + onClick?: () => void // Optional click handler for the property value + nodeId?: string // ID of the node (for node type) + entityId?: string // ID of the entity (for node type) + edgeId?: string // ID of the edge (for edge type) + dynamicId?: string + entityType?: 'node' | 'edge' // Type of graph entity + sourceId?: string // Source node ID (for edge type) + targetId?: string // Target node ID (for edge type) + onValueChange?: (newValue: any) => void // Optional callback when value changes + isEditable?: boolean // Whether this property can be edited + tooltip?: string // Optional tooltip to display on hover +} + +/** + * EditablePropertyRow component that supports editing property values + * This component is used in the graph properties panel to display and edit entity properties + */ +const EditablePropertyRow = ({ + name, + value: initialValue, + onClick, + nodeId, + edgeId, + entityId, + dynamicId, + entityType, + sourceId, + targetId, + onValueChange, + isEditable = false, + tooltip +}: EditablePropertyRowProps) => { + const { t } = useTranslation() + const [isEditing, setIsEditing] = useState(false) + const [isSubmitting, setIsSubmitting] = useState(false) + const [currentValue, setCurrentValue] = useState(initialValue) + const [errorMessage, setErrorMessage] = useState(null) + const [mergeDialogOpen, setMergeDialogOpen] = useState(false) + const [mergeDialogInfo, setMergeDialogInfo] = useState<{ + targetEntity: string + sourceEntity: string + } | null>(null) + + useEffect(() => { + setCurrentValue(initialValue) + }, [initialValue]) + + const handleEditClick = () => { + if (isEditable && !isEditing) { + setIsEditing(true) + setErrorMessage(null) + } + } + + const handleCancel = () => { + setIsEditing(false) + setErrorMessage(null) + } + + const handleSave = async (value: string, options?: { allowMerge?: boolean }) => { + if (isSubmitting || value === String(currentValue)) { + setIsEditing(false) + setErrorMessage(null) + return + } + + setIsSubmitting(true) + setErrorMessage(null) + + try { + if (entityType === 'node' && entityId && nodeId) { + let updatedData = { [name]: value } + const allowMerge = options?.allowMerge ?? false + + if (name === 'entity_id') { + if (!allowMerge) { + const exists = await checkEntityNameExists(value) + if (exists) { + const errorMsg = t('graphPanel.propertiesView.errors.duplicateName') + setErrorMessage(errorMsg) + toast.error(errorMsg) + return + } + } + updatedData = { 'entity_name': value } + } + + const response = await updateEntity(entityId, updatedData, true, allowMerge) + const operationSummary = response.operation_summary + const operationStatus = operationSummary?.operation_status || 'complete_success' + const finalValue = operationSummary?.final_entity ?? value + + // Handle different operation statuses + if (operationStatus === 'success') { + if (operationSummary?.merged) { + // Node was successfully merged into an existing entity + setMergeDialogInfo({ + targetEntity: finalValue, + sourceEntity: entityId, + }) + setMergeDialogOpen(true) + + // Remove old entity name from search history + SearchHistoryManager.removeLabel(entityId) + + // Note: Search Label update is deferred until user clicks refresh button in merge dialog + + toast.success(t('graphPanel.propertiesView.success.entityMerged')) + } else { + // Node was updated/renamed normally + try { + const graphValue = name === 'entity_id' ? finalValue : value + await useGraphStore + .getState() + .updateNodeAndSelect(nodeId, entityId, name, graphValue) + } catch (error) { + console.error('Error updating node in graph:', error) + throw new Error('Failed to update node in graph') + } + + // Update search history: remove old name, add new name + if (name === 'entity_id') { + const currentLabel = useSettingsStore.getState().queryLabel + + SearchHistoryManager.removeLabel(entityId) + SearchHistoryManager.addToHistory(finalValue) + + // Trigger dropdown refresh to show updated search history + useSettingsStore.getState().triggerSearchLabelDropdownRefresh() + + // If current queryLabel is the old entity name, update to new name + if (currentLabel === entityId) { + useSettingsStore.getState().setQueryLabel(finalValue) + } + } + + toast.success(t('graphPanel.propertiesView.success.entityUpdated')) + } + + // Update local state and notify parent component + // For entity_id updates, use finalValue (which may be different due to merging) + // For other properties, use the original value the user entered + const valueToSet = name === 'entity_id' ? finalValue : value + setCurrentValue(valueToSet) + onValueChange?.(valueToSet) + + } else if (operationStatus === 'partial_success') { + // Partial success: update succeeded but merge failed + // Do NOT update graph data to keep frontend in sync with backend + const mergeError = operationSummary?.merge_error || 'Unknown error' + + const errorMsg = t('graphPanel.propertiesView.errors.updateSuccessButMergeFailed', { + error: mergeError + }) + setErrorMessage(errorMsg) + toast.error(errorMsg) + // Do not update currentValue or call onValueChange + return + + } else { + // Complete failure or unknown status + // Check if this was a merge attempt or just a regular update + if (operationSummary?.merge_status === 'failed') { + // Merge operation was attempted but failed + const mergeError = operationSummary?.merge_error || 'Unknown error' + const errorMsg = t('graphPanel.propertiesView.errors.mergeFailed', { + error: mergeError + }) + setErrorMessage(errorMsg) + toast.error(errorMsg) + } else { + // Regular update failed (no merge involved) + const errorMsg = t('graphPanel.propertiesView.errors.updateFailed') + setErrorMessage(errorMsg) + toast.error(errorMsg) + } + // Do not update currentValue or call onValueChange + return + } + } else if (entityType === 'edge' && sourceId && targetId && edgeId && dynamicId) { + const updatedData = { [name]: value } + await updateRelation(sourceId, targetId, updatedData) + try { + await useGraphStore.getState().updateEdgeAndSelect(edgeId, dynamicId, sourceId, targetId, name, value) + } catch (error) { + console.error(`Error updating edge ${sourceId}->${targetId} in graph:`, error) + throw new Error('Failed to update edge in graph') + } + toast.success(t('graphPanel.propertiesView.success.relationUpdated')) + setCurrentValue(value) + onValueChange?.(value) + } + + setIsEditing(false) + } catch (error) { + console.error('Error updating property:', error) + const errorMsg = error instanceof Error ? error.message : t('graphPanel.propertiesView.errors.updateFailed') + setErrorMessage(errorMsg) + toast.error(errorMsg) + return + } finally { + setIsSubmitting(false) + } + } + + const handleMergeRefresh = (useMergedStart: boolean) => { + const info = mergeDialogInfo + const graphState = useGraphStore.getState() + const settingsState = useSettingsStore.getState() + const currentLabel = settingsState.queryLabel + + // Clear graph state + graphState.clearSelection() + graphState.setGraphDataFetchAttempted(false) + graphState.setLastSuccessfulQueryLabel('') + + if (useMergedStart && info?.targetEntity) { + // Use merged entity as new start point (might already be set in handleSave) + settingsState.setQueryLabel(info.targetEntity) + } else { + // Keep current start point - refresh by resetting and restoring label + // This handles the case where user wants to stay with current label + settingsState.setQueryLabel('') + setTimeout(() => { + settingsState.setQueryLabel(currentLabel) + }, 50) + } + + // Force graph re-render and reset zoom/scale (same as refresh button behavior) + graphState.incrementGraphDataVersion() + + setMergeDialogOpen(false) + setMergeDialogInfo(null) + toast.info(t('graphPanel.propertiesView.mergeDialog.refreshing')) + } + + return ( +
    + + : + + + + { + setMergeDialogOpen(open) + if (!open) { + setMergeDialogInfo(null) + } + }} + onRefresh={handleMergeRefresh} + /> +
    + ) +} + +export default EditablePropertyRow diff --git a/LightRAG/lightrag_webui/src/components/graph/FocusOnNode.tsx b/LightRAG/lightrag_webui/src/components/graph/FocusOnNode.tsx new file mode 100644 index 00000000..3f3cf027 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/FocusOnNode.tsx @@ -0,0 +1,54 @@ +import { useCamera, useSigma } from '@react-sigma/core' +import { useEffect } from 'react' +import { useGraphStore } from '@/stores/graph' + +/** + * Component that highlights a node and centers the camera on it. + */ +const FocusOnNode = ({ node, move }: { node: string | null; move?: boolean }) => { + const sigma = useSigma() + const { gotoNode } = useCamera() + + /** + * When the selected item changes, highlighted the node and center the camera on it. + */ + useEffect(() => { + const graph = sigma.getGraph(); + + if (move) { + if (node && graph.hasNode(node)) { + try { + graph.setNodeAttribute(node, 'highlighted', true); + gotoNode(node); + } catch (error) { + console.error('Error focusing on node:', error); + } + } else { + // If no node is selected but move is true, reset to default view + sigma.setCustomBBox(null); + sigma.getCamera().animate({ x: 0.5, y: 0.5, ratio: 1 }, { duration: 0 }); + } + useGraphStore.getState().setMoveToSelectedNode(false); + } else if (node && graph.hasNode(node)) { + try { + graph.setNodeAttribute(node, 'highlighted', true); + } catch (error) { + console.error('Error highlighting node:', error); + } + } + + return () => { + if (node && graph.hasNode(node)) { + try { + graph.setNodeAttribute(node, 'highlighted', false); + } catch (error) { + console.error('Error cleaning up node highlight:', error); + } + } + } + }, [node, move, sigma, gotoNode]) + + return null +} + +export default FocusOnNode diff --git a/LightRAG/lightrag_webui/src/components/graph/FullScreenControl.tsx b/LightRAG/lightrag_webui/src/components/graph/FullScreenControl.tsx new file mode 100644 index 00000000..dd8e8d8e --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/FullScreenControl.tsx @@ -0,0 +1,29 @@ +import { useFullScreen } from '@react-sigma/core' +import { MaximizeIcon, MinimizeIcon } from 'lucide-react' +import { controlButtonVariant } from '@/lib/constants' +import Button from '@/components/ui/Button' +import { useTranslation } from 'react-i18next' + +/** + * Component that toggles full screen mode. + */ +const FullScreenControl = () => { + const { isFullScreen, toggle } = useFullScreen() + const { t } = useTranslation() + + return ( + <> + {isFullScreen ? ( + + ) : ( + + )} + + ) +} + +export default FullScreenControl diff --git a/LightRAG/lightrag_webui/src/components/graph/GraphControl.tsx b/LightRAG/lightrag_webui/src/components/graph/GraphControl.tsx new file mode 100644 index 00000000..daa55b50 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/GraphControl.tsx @@ -0,0 +1,362 @@ +import { useRegisterEvents, useSetSettings, useSigma } from '@react-sigma/core' +import { AbstractGraph } from 'graphology-types' +// import { useLayoutCircular } from '@react-sigma/layout-circular' +import { useLayoutForceAtlas2 } from '@react-sigma/layout-forceatlas2' +import { useEffect, useState } from 'react' + +// import useRandomGraph, { EdgeType, NodeType } from '@/hooks/useRandomGraph' +import { EdgeType, NodeType } from '@/hooks/useLightragGraph' +import useTheme from '@/hooks/useTheme' +import * as Constants from '@/lib/constants' + +import { useSettingsStore } from '@/stores/settings' +import { useGraphStore } from '@/stores/graph' + +const isButtonPressed = (ev: MouseEvent | TouchEvent) => { + if (ev.type.startsWith('mouse')) { + if ((ev as MouseEvent).buttons !== 0) { + return true + } + } + return false +} + +const GraphControl = ({ disableHoverEffect }: { disableHoverEffect?: boolean }) => { + const sigma = useSigma() + const registerEvents = useRegisterEvents() + const setSettings = useSetSettings() + + const maxIterations = useSettingsStore.use.graphLayoutMaxIterations() + const { assign: assignLayout } = useLayoutForceAtlas2({ + iterations: maxIterations + }) + + const { theme } = useTheme() + const hideUnselectedEdges = useSettingsStore.use.enableHideUnselectedEdges() + const enableEdgeEvents = useSettingsStore.use.enableEdgeEvents() + const renderEdgeLabels = useSettingsStore.use.showEdgeLabel() + const renderLabels = useSettingsStore.use.showNodeLabel() + const minEdgeSize = useSettingsStore.use.minEdgeSize() + const maxEdgeSize = useSettingsStore.use.maxEdgeSize() + const selectedNode = useGraphStore.use.selectedNode() + const focusedNode = useGraphStore.use.focusedNode() + const selectedEdge = useGraphStore.use.selectedEdge() + const focusedEdge = useGraphStore.use.focusedEdge() + const sigmaGraph = useGraphStore.use.sigmaGraph() + + // Track system theme changes when theme is set to 'system' + const [systemThemeIsDark, setSystemThemeIsDark] = useState(() => + window.matchMedia('(prefers-color-scheme: dark)').matches + ) + + useEffect(() => { + if (theme === 'system') { + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)') + const handler = (e: MediaQueryListEvent) => setSystemThemeIsDark(e.matches) + mediaQuery.addEventListener('change', handler) + return () => mediaQuery.removeEventListener('change', handler) + } + }, [theme]) + + /** + * When component mount or maxIterations changes + * => ensure graph reference and apply layout + */ + useEffect(() => { + if (sigmaGraph && sigma) { + // Ensure sigma binding to sigmaGraph + try { + if (typeof sigma.setGraph === 'function') { + sigma.setGraph(sigmaGraph as unknown as AbstractGraph); + console.log('Binding graph to sigma instance'); + } else { + (sigma as any).graph = sigmaGraph; + console.warn('Simgma missing setGraph function, set graph property directly'); + } + } catch (error) { + console.error('Error setting graph on sigma instance:', error); + } + + assignLayout(); + console.log('Initial layout applied to graph'); + } + }, [sigma, sigmaGraph, assignLayout, maxIterations]) + + /** + * Ensure the sigma instance is set in the store + * This provides a backup in case the instance wasn't set in GraphViewer + */ + useEffect(() => { + if (sigma) { + // Double-check that the store has the sigma instance + const currentInstance = useGraphStore.getState().sigmaInstance; + if (!currentInstance) { + console.log('Setting sigma instance from GraphControl'); + useGraphStore.getState().setSigmaInstance(sigma); + } + } + }, [sigma]); + + /** + * When component mount + * => register events + */ + useEffect(() => { + const { setFocusedNode, setSelectedNode, setFocusedEdge, setSelectedEdge, clearSelection } = + useGraphStore.getState() + + // Define event types + type NodeEvent = { node: string; event: { original: MouseEvent | TouchEvent } } + type EdgeEvent = { edge: string; event: { original: MouseEvent | TouchEvent } } + + // Register all events, but edge events will only be processed if enableEdgeEvents is true + const events: Record = { + enterNode: (event: NodeEvent) => { + if (!isButtonPressed(event.event.original)) { + const graph = sigma.getGraph() + if (graph.hasNode(event.node)) { + setFocusedNode(event.node) + } + } + }, + leaveNode: (event: NodeEvent) => { + if (!isButtonPressed(event.event.original)) { + setFocusedNode(null) + } + }, + clickNode: (event: NodeEvent) => { + const graph = sigma.getGraph() + if (graph.hasNode(event.node)) { + setSelectedNode(event.node) + setSelectedEdge(null) + } + }, + clickStage: () => clearSelection() + } + + // Only add edge event handlers if enableEdgeEvents is true + if (enableEdgeEvents) { + events.clickEdge = (event: EdgeEvent) => { + setSelectedEdge(event.edge) + setSelectedNode(null) + } + + events.enterEdge = (event: EdgeEvent) => { + if (!isButtonPressed(event.event.original)) { + setFocusedEdge(event.edge) + } + } + + events.leaveEdge = (event: EdgeEvent) => { + if (!isButtonPressed(event.event.original)) { + setFocusedEdge(null) + } + } + } + + // Register the events + registerEvents(events) + + // Cleanup function - basic cleanup without relying on specific APIs + return () => { + try { + console.log('Cleaning up graph event listeners') + } catch (error) { + console.warn('Error cleaning up graph event listeners:', error) + } + } + }, [registerEvents, enableEdgeEvents, sigma]) + + /** + * When edge size settings change, recalculate edge sizes and refresh the sigma instance + * to ensure changes take effect immediately + */ + useEffect(() => { + if (sigma && sigmaGraph) { + // Get the graph from sigma + const graph = sigma.getGraph() + + // Find min and max weight values + let minWeight = Number.MAX_SAFE_INTEGER + let maxWeight = 0 + + graph.forEachEdge(edge => { + // Get original weight (before scaling) + const weight = graph.getEdgeAttribute(edge, 'originalWeight') || 1 + if (typeof weight === 'number') { + minWeight = Math.min(minWeight, weight) + maxWeight = Math.max(maxWeight, weight) + } + }) + + // Scale edge sizes based on weight range and current min/max edge size settings + const weightRange = maxWeight - minWeight + if (weightRange > 0) { + const sizeScale = maxEdgeSize - minEdgeSize + graph.forEachEdge(edge => { + const weight = graph.getEdgeAttribute(edge, 'originalWeight') || 1 + if (typeof weight === 'number') { + const scaledSize = minEdgeSize + sizeScale * Math.pow((weight - minWeight) / weightRange, 0.5) + graph.setEdgeAttribute(edge, 'size', scaledSize) + } + }) + } else { + // If all weights are the same, use default size + graph.forEachEdge(edge => { + graph.setEdgeAttribute(edge, 'size', minEdgeSize) + }) + } + + // Refresh the sigma instance to apply changes + sigma.refresh() + } + }, [sigma, sigmaGraph, minEdgeSize, maxEdgeSize]) + + + /** + * When component mount or hovered node change + * => Setting the sigma reducers + */ + useEffect(() => { + // Check if dark mode is actually applied (handles both 'dark' theme and 'system' theme when OS is dark) + const isDarkTheme = theme === 'dark' || + (theme === 'system' && window.document.documentElement.classList.contains('dark')) + const labelColor = isDarkTheme ? Constants.labelColorDarkTheme : undefined + const edgeColor = isDarkTheme ? Constants.edgeColorDarkTheme : undefined + + // Update all dynamic settings directly without recreating the sigma container + setSettings({ + // Update display settings + enableEdgeEvents, + renderEdgeLabels, + renderLabels, + + // Node reducer for node appearance + nodeReducer: (node, data) => { + const graph = sigma.getGraph() + + // Add defensive check for node existence during theme switching + if (!graph.hasNode(node)) { + console.warn(`Node ${node} not found in graph during theme switch, returning default data`) + return { ...data, highlighted: false, labelColor } + } + + const newData: NodeType & { + labelColor?: string + borderColor?: string + } = { ...data, highlighted: data.highlighted || false, labelColor } + + if (!disableHoverEffect) { + newData.highlighted = false + const _focusedNode = focusedNode || selectedNode + const _focusedEdge = focusedEdge || selectedEdge + + if (_focusedNode && graph.hasNode(_focusedNode)) { + try { + if (node === _focusedNode || graph.neighbors(_focusedNode).includes(node)) { + newData.highlighted = true + if (node === selectedNode) { + newData.borderColor = Constants.nodeBorderColorSelected + } + } + } catch (error) { + console.error('Error in nodeReducer:', error); + return { ...data, highlighted: false, labelColor } + } + } else if (_focusedEdge && graph.hasEdge(_focusedEdge)) { + try { + if (graph.extremities(_focusedEdge).includes(node)) { + newData.highlighted = true + newData.size = 3 + } + } catch (error) { + console.error('Error accessing edge extremities in nodeReducer:', error); + return { ...data, highlighted: false, labelColor } + } + } else { + return newData + } + + if (newData.highlighted) { + if (isDarkTheme) { + newData.labelColor = Constants.LabelColorHighlightedDarkTheme + } + } else { + newData.color = Constants.nodeColorDisabled + } + } + return newData + }, + + // Edge reducer for edge appearance + edgeReducer: (edge, data) => { + const graph = sigma.getGraph() + + // Add defensive check for edge existence during theme switching + if (!graph.hasEdge(edge)) { + console.warn(`Edge ${edge} not found in graph during theme switch, returning default data`) + return { ...data, hidden: false, labelColor, color: edgeColor } + } + + const newData = { ...data, hidden: false, labelColor, color: edgeColor } + + if (!disableHoverEffect) { + const _focusedNode = focusedNode || selectedNode + // Choose edge highlight color based on theme + const edgeHighlightColor = isDarkTheme + ? Constants.edgeColorHighlightedDarkTheme + : Constants.edgeColorHighlightedLightTheme + + if (_focusedNode && graph.hasNode(_focusedNode)) { + try { + if (hideUnselectedEdges) { + if (!graph.extremities(edge).includes(_focusedNode)) { + newData.hidden = true + } + } else { + if (graph.extremities(edge).includes(_focusedNode)) { + newData.color = edgeHighlightColor + } + } + } catch (error) { + console.error('Error in edgeReducer:', error); + return { ...data, hidden: false, labelColor, color: edgeColor } + } + } else { + const _selectedEdge = selectedEdge && graph.hasEdge(selectedEdge) ? selectedEdge : null; + const _focusedEdge = focusedEdge && graph.hasEdge(focusedEdge) ? focusedEdge : null; + + if (_selectedEdge || _focusedEdge) { + if (edge === _selectedEdge) { + newData.color = Constants.edgeColorSelected + } else if (edge === _focusedEdge) { + newData.color = edgeHighlightColor + } else if (hideUnselectedEdges) { + newData.hidden = true + } + } + } + } + return newData + } + }) + }, [ + selectedNode, + focusedNode, + selectedEdge, + focusedEdge, + setSettings, + sigma, + disableHoverEffect, + theme, + systemThemeIsDark, + hideUnselectedEdges, + enableEdgeEvents, + renderEdgeLabels, + renderLabels + ]) + + return null +} + +export default GraphControl diff --git a/LightRAG/lightrag_webui/src/components/graph/GraphLabels.tsx b/LightRAG/lightrag_webui/src/components/graph/GraphLabels.tsx new file mode 100644 index 00000000..e2ac7aae --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/GraphLabels.tsx @@ -0,0 +1,316 @@ +import { useCallback, useEffect, useState, useRef } from 'react' +import { AsyncSelect } from '@/components/ui/AsyncSelect' +import { useSettingsStore } from '@/stores/settings' +import { useGraphStore } from '@/stores/graph' +import { useBackendState } from '@/stores/state' +import { + dropdownDisplayLimit, + controlButtonVariant, + popularLabelsDefaultLimit, + searchLabelsDefaultLimit +} from '@/lib/constants' +import { useTranslation } from 'react-i18next' +import { RefreshCw } from 'lucide-react' +import Button from '@/components/ui/Button' +import { SearchHistoryManager } from '@/utils/SearchHistoryManager' +import { getPopularLabels, searchLabels } from '@/api/lightrag' + +const GraphLabels = () => { + const { t } = useTranslation() + const label = useSettingsStore.use.queryLabel() + const dropdownRefreshTrigger = useSettingsStore.use.searchLabelDropdownRefreshTrigger() + const [isRefreshing, setIsRefreshing] = useState(false) + const [refreshTrigger, setRefreshTrigger] = useState(0) + const [selectKey, setSelectKey] = useState(0) + + // Pipeline state monitoring + const pipelineBusy = useBackendState.use.pipelineBusy() + const prevPipelineBusy = useRef(undefined) + const shouldRefreshPopularLabelsRef = useRef(false) + + // Dynamic tooltip based on current label state + const getRefreshTooltip = useCallback(() => { + if (isRefreshing) { + return t('graphPanel.graphLabels.refreshingTooltip') + } + + if (!label || label === '*') { + return t('graphPanel.graphLabels.refreshGlobalTooltip') + } else { + return t('graphPanel.graphLabels.refreshCurrentLabelTooltip', { label }) + } + }, [label, t, isRefreshing]) + + // Initialize search history on component mount + useEffect(() => { + const initializeHistory = async () => { + const history = SearchHistoryManager.getHistory() + + if (history.length === 0) { + // If no history exists, fetch popular labels and initialize + try { + const popularLabels = await getPopularLabels(popularLabelsDefaultLimit) + await SearchHistoryManager.initializeWithDefaults(popularLabels) + } catch (error) { + console.error('Failed to initialize search history:', error) + // No fallback needed, API is the source of truth + } + } + } + + initializeHistory() + }, []) + + // Force AsyncSelect to re-render when label changes externally (e.g., from entity rename/merge) + useEffect(() => { + setSelectKey(prev => prev + 1) + }, [label]) + + // Force AsyncSelect to re-render when dropdown refresh is triggered (e.g., after entity rename) + useEffect(() => { + if (dropdownRefreshTrigger > 0) { + setSelectKey(prev => prev + 1) + } + }, [dropdownRefreshTrigger]) + + // Monitor pipeline state changes: busy -> idle + useEffect(() => { + if (prevPipelineBusy.current === true && pipelineBusy === false) { + console.log('Pipeline changed from busy to idle, marking for popular labels refresh') + shouldRefreshPopularLabelsRef.current = true + } + prevPipelineBusy.current = pipelineBusy + }, [pipelineBusy]) + + // Helper: Reload popular labels from backend + const reloadPopularLabels = useCallback(async () => { + if (!shouldRefreshPopularLabelsRef.current) return + + console.log('Reloading popular labels (triggered by pipeline idle)') + try { + const popularLabels = await getPopularLabels(popularLabelsDefaultLimit) + SearchHistoryManager.clearHistory() + + if (popularLabels.length === 0) { + const fallbackLabels = ['entity', 'relationship', 'document', 'concept'] + await SearchHistoryManager.initializeWithDefaults(fallbackLabels) + } else { + await SearchHistoryManager.initializeWithDefaults(popularLabels) + } + } catch (error) { + console.error('Failed to reload popular labels:', error) + const fallbackLabels = ['entity', 'relationship', 'document'] + SearchHistoryManager.clearHistory() + await SearchHistoryManager.initializeWithDefaults(fallbackLabels) + } finally { + // Always clear the flag + shouldRefreshPopularLabelsRef.current = false + } + }, []) + + // Helper: Bump dropdown data to trigger refresh + const bumpDropdownData = useCallback(({ forceSelectKey = false } = {}) => { + setRefreshTrigger(prev => prev + 1) + if (forceSelectKey) { + setSelectKey(prev => prev + 1) + } + }, []) + + const fetchData = useCallback( + async (query?: string): Promise => { + let results: string[] = []; + if (!query || query.trim() === '' || query.trim() === '*') { + // Empty query: return search history + results = SearchHistoryManager.getHistoryLabels(dropdownDisplayLimit) + } else { + // Non-empty query: call backend search API + try { + const apiResults = await searchLabels(query.trim(), searchLabelsDefaultLimit) + results = apiResults.length <= dropdownDisplayLimit + ? apiResults + : [...apiResults.slice(0, dropdownDisplayLimit), '...'] + } catch (error) { + console.error('Search API failed, falling back to local history search:', error) + + // Fallback to local history search + const history = SearchHistoryManager.getHistory() + const queryLower = query.toLowerCase().trim() + results = history + .filter(item => item.label.toLowerCase().includes(queryLower)) + .map(item => item.label) + .slice(0, dropdownDisplayLimit) + } + } + // Always show '*' at the top, and remove duplicates + const finalResults = ['*', ...results.filter(label => label !== '*')]; + return finalResults; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [refreshTrigger] // Intentionally added to trigger re-creation when data changes + ) + + const handleRefresh = useCallback(async () => { + setIsRefreshing(true) + + // Clear legend cache to ensure legend is re-generated on refresh + useGraphStore.getState().setTypeColorMap(new Map()) + + try { + let currentLabel = label + + // If queryLabel is empty, set it to '*' + if (!currentLabel || currentLabel.trim() === '') { + useSettingsStore.getState().setQueryLabel('*') + currentLabel = '*' + } + + // Scenario 1: Manual refresh - reload popular labels if flag is set (regardless of current label) + if (shouldRefreshPopularLabelsRef.current) { + await reloadPopularLabels() + bumpDropdownData({ forceSelectKey: true }) + } + + if (currentLabel && currentLabel !== '*') { + // Scenario 1: Has specific label, try to refresh current label + console.log(`Refreshing current label: ${currentLabel}`) + + // Reset graph data fetch status to trigger refresh + useGraphStore.getState().setGraphDataFetchAttempted(false) + useGraphStore.getState().setLastSuccessfulQueryLabel('') + + // Force data refresh for current label + useGraphStore.getState().incrementGraphDataVersion() + + // Note: If the current label has no data after refresh, + // the fallback logic would be handled by the graph component itself + // For now, we keep the current label and let the user see the result + + } else { + // Scenario 3: queryLabel is "*", refresh global data and popular labels + console.log('Refreshing global data and popular labels') + + try { + // Re-fetch popular labels and update search history (if not already done) + const popularLabels = await getPopularLabels(popularLabelsDefaultLimit) + SearchHistoryManager.clearHistory() + + if (popularLabels.length === 0) { + // If no popular labels, provide fallback defaults + const fallbackLabels = ['entity', 'relationship', 'document', 'concept'] + await SearchHistoryManager.initializeWithDefaults(fallbackLabels) + } else { + await SearchHistoryManager.initializeWithDefaults(popularLabels) + } + } catch (error) { + console.error('Failed to reload popular labels:', error) + // Provide fallback even if API fails + const fallbackLabels = ['entity', 'relationship', 'document'] + SearchHistoryManager.clearHistory() + await SearchHistoryManager.initializeWithDefaults(fallbackLabels) + } + + // Reset graph data fetch status + useGraphStore.getState().setGraphDataFetchAttempted(false) + useGraphStore.getState().setLastSuccessfulQueryLabel('') + + // Force global data refresh + useGraphStore.getState().incrementGraphDataVersion() + + // Ensure data update completes before triggering UI refresh + await new Promise(resolve => setTimeout(resolve, 0)) + + // Trigger both refresh mechanisms to ensure dropdown updates + setRefreshTrigger(prev => prev + 1) + setSelectKey(prev => prev + 1) + } + } catch (error) { + console.error('Error during refresh:', error) + } finally { + setIsRefreshing(false) + } + }, [label, reloadPopularLabels, bumpDropdownData]) + + // Handle dropdown before open - reload popular labels if needed + const handleDropdownBeforeOpen = useCallback(async () => { + const currentLabel = useSettingsStore.getState().queryLabel + if (shouldRefreshPopularLabelsRef.current && (!currentLabel || currentLabel === '*')) { + await reloadPopularLabels() + bumpDropdownData() + } + }, [reloadPopularLabels, bumpDropdownData]) + + return ( +
    + {/* Always show refresh button */} + +
    + + key={selectKey} // Force re-render when data changes + className="min-w-[300px]" + triggerClassName="max-h-8 w-full overflow-hidden" + searchInputClassName="max-h-8" + triggerTooltip={t('graphPanel.graphLabels.selectTooltip')} + fetcher={fetchData} + onBeforeOpen={handleDropdownBeforeOpen} + renderOption={(item) => ( +
    + {item} +
    + )} + getOptionValue={(item) => item} + getDisplayValue={(item) => ( +
    + {item} +
    + )} + notFound={
    {t('graphPanel.graphLabels.noLabels')}
    } + ariaLabel={t('graphPanel.graphLabels.label')} + placeholder={t('graphPanel.graphLabels.placeholder')} + searchPlaceholder={t('graphPanel.graphLabels.placeholder')} + noResultsMessage={t('graphPanel.graphLabels.noLabels')} + value={label !== null ? label : '*'} + onChange={(newLabel) => { + const currentLabel = useSettingsStore.getState().queryLabel; + + // select the last item means query all + if (newLabel === '...') { + newLabel = '*'; + } + + // Handle reselecting the same label + if (newLabel === currentLabel && newLabel !== '*') { + newLabel = '*'; + } + + // Add selected label to search history (except for special cases) + if (newLabel && newLabel !== '*' && newLabel !== '...' && newLabel.trim() !== '') { + SearchHistoryManager.addToHistory(newLabel); + } + + // Reset graphDataFetchAttempted flag to ensure data fetch is triggered + useGraphStore.getState().setGraphDataFetchAttempted(false); + + // Update the label to trigger data loading + useSettingsStore.getState().setQueryLabel(newLabel); + + // Force graph re-render and reset zoom/scale (must be AFTER setQueryLabel) + useGraphStore.getState().incrementGraphDataVersion(); + }} + clearable={false} // Prevent clearing value on reselect + debounceTime={500} + /> +
    +
    + ) +} + +export default GraphLabels diff --git a/LightRAG/lightrag_webui/src/components/graph/GraphSearch.tsx b/LightRAG/lightrag_webui/src/components/graph/GraphSearch.tsx new file mode 100644 index 00000000..5971bddb --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/GraphSearch.tsx @@ -0,0 +1,232 @@ +import { FC, useCallback, useEffect } from 'react' +import { + EdgeById, + GraphSearchInputProps, + GraphSearchContextProviderProps +} from '@react-sigma/graph-search' +import { AsyncSearch } from '@/components/ui/AsyncSearch' +import { searchResultLimit } from '@/lib/constants' +import { useGraphStore } from '@/stores/graph' +import MiniSearch from 'minisearch' +import { useTranslation } from 'react-i18next' + +// Message item identifier for search results +export const messageId = '__message_item' + +// Search result option item interface +export interface OptionItem { + id: string + type: 'nodes' | 'edges' | 'message' + message?: string +} + +const NodeOption = ({ id }: { id: string }) => { + const graph = useGraphStore.use.sigmaGraph() + + // Early return if no graph or node doesn't exist + if (!graph?.hasNode(id)) { + return null + } + + // Safely get node attributes with fallbacks + const label = graph.getNodeAttribute(id, 'label') || id + const color = graph.getNodeAttribute(id, 'color') || '#666' + const size = graph.getNodeAttribute(id, 'size') || 4 + + // Custom node display component that doesn't rely on @react-sigma/graph-search + return ( +
    +
    + {label} +
    + ) +} + +function OptionComponent(item: OptionItem) { + return ( +
    + {item.type === 'nodes' && } + {item.type === 'edges' && } + {item.type === 'message' &&
    {item.message}
    } +
    + ) +} + + +/** + * Component thats display the search input. + */ +export const GraphSearchInput = ({ + onChange, + onFocus, + value +}: { + onChange: GraphSearchInputProps['onChange'] + onFocus?: GraphSearchInputProps['onFocus'] + value?: GraphSearchInputProps['value'] +}) => { + const { t } = useTranslation() + const graph = useGraphStore.use.sigmaGraph() + const searchEngine = useGraphStore.use.searchEngine() + + // Reset search engine when graph changes + useEffect(() => { + if (graph) { + useGraphStore.getState().resetSearchEngine() + } + }, [graph]); + + // Create search engine when needed + useEffect(() => { + // Skip if no graph, empty graph, or search engine already exists + if (!graph || graph.nodes().length === 0 || searchEngine) { + return + } + + // Create new search engine + const newSearchEngine = new MiniSearch({ + idField: 'id', + fields: ['label'], + searchOptions: { + prefix: true, + fuzzy: 0.2, + boost: { + label: 2 + } + } + }) + + // Add nodes to search engine with safety checks + const documents = graph.nodes() + .filter(id => graph.hasNode(id)) // Ensure node exists before accessing attributes + .map((id: string) => ({ + id: id, + label: graph.getNodeAttribute(id, 'label') + })) + + if (documents.length > 0) { + newSearchEngine.addAll(documents) + } + + // Update search engine in store + useGraphStore.getState().setSearchEngine(newSearchEngine) + }, [graph, searchEngine]) + + /** + * Loading the options while the user is typing. + */ + const loadOptions = useCallback( + async (query?: string): Promise => { + if (onFocus) onFocus(null) + + // Safety checks to prevent crashes + if (!graph || !searchEngine) { + return [] + } + + // Verify graph has nodes before proceeding + if (graph.nodes().length === 0) { + return [] + } + + // If no query, return some nodes for user to select + if (!query) { + const nodeIds = graph.nodes() + .filter(id => graph.hasNode(id)) + .slice(0, searchResultLimit) + return nodeIds.map(id => ({ + id, + type: 'nodes' + })) + } + + // If has query, search nodes and verify they still exist + let result: OptionItem[] = searchEngine.search(query) + .filter((r: { id: string }) => graph.hasNode(r.id)) + .map((r: { id: string }) => ({ + id: r.id, + type: 'nodes' + })) + + // Add middle-content matching if results are few + // This enables matching content in the middle of text, not just from the beginning + if (result.length < 5) { + // Get already matched IDs to avoid duplicates + const matchedIds = new Set(result.map(item => item.id)) + + // Perform middle-content matching on all nodes with safety checks + const middleMatchResults = graph.nodes() + .filter(id => { + // Skip already matched nodes + if (matchedIds.has(id)) return false + + // Ensure node exists before accessing attributes + if (!graph.hasNode(id)) return false + + // Get node label safely + const label = graph.getNodeAttribute(id, 'label') + // Match if label contains query string but doesn't start with it + return label && + typeof label === 'string' && + !label.toLowerCase().startsWith(query.toLowerCase()) && + label.toLowerCase().includes(query.toLowerCase()) + }) + .map(id => ({ + id, + type: 'nodes' as const + })) + + // Merge results + result = [...result, ...middleMatchResults] + } + + // prettier-ignore + return result.length <= searchResultLimit + ? result + : [ + ...result.slice(0, searchResultLimit), + { + type: 'message', + id: messageId, + message: t('graphPanel.search.message', { count: result.length - searchResultLimit }) + } + ] + }, + [graph, searchEngine, onFocus, t] + ) + + return ( + item.id} + value={value && value.type !== 'message' ? value.id : null} + onChange={(id) => { + if (id !== messageId) onChange(id ? { id, type: 'nodes' } : null) + }} + onFocus={(id) => { + if (id !== messageId && onFocus) onFocus(id ? { id, type: 'nodes' } : null) + }} + ariaLabel={t('graphPanel.search.placeholder')} + placeholder={t('graphPanel.search.placeholder')} + noResultsMessage={t('graphPanel.search.placeholder')} + /> + ) +} + +/** + * Component that display the search. + */ +const GraphSearch: FC = ({ ...props }) => { + return +} + +export default GraphSearch diff --git a/LightRAG/lightrag_webui/src/components/graph/LayoutsControl.tsx b/LightRAG/lightrag_webui/src/components/graph/LayoutsControl.tsx new file mode 100644 index 00000000..c4ec67be --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/LayoutsControl.tsx @@ -0,0 +1,345 @@ +import { useSigma } from '@react-sigma/core' +import { animateNodes } from 'sigma/utils' +import { useLayoutCirclepack } from '@react-sigma/layout-circlepack' +import { useLayoutCircular } from '@react-sigma/layout-circular' +import { LayoutHook, LayoutWorkerHook, WorkerLayoutControlProps } from '@react-sigma/layout-core' +import { useLayoutForce, useWorkerLayoutForce } from '@react-sigma/layout-force' +import { useLayoutForceAtlas2, useWorkerLayoutForceAtlas2 } from '@react-sigma/layout-forceatlas2' +import { useLayoutNoverlap, useWorkerLayoutNoverlap } from '@react-sigma/layout-noverlap' +import { useLayoutRandom } from '@react-sigma/layout-random' +import { useCallback, useMemo, useState, useEffect, useRef } from 'react' + +import Button from '@/components/ui/Button' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/Popover' +import { Command, CommandGroup, CommandItem, CommandList } from '@/components/ui/Command' +import { controlButtonVariant } from '@/lib/constants' +import { useSettingsStore } from '@/stores/settings' + +import { GripIcon, PlayIcon, PauseIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +type LayoutName = + | 'Circular' + | 'Circlepack' + | 'Random' + | 'Noverlaps' + | 'Force Directed' + | 'Force Atlas' + +// Extend WorkerLayoutControlProps to include mainLayout +interface ExtendedWorkerLayoutControlProps extends WorkerLayoutControlProps { + mainLayout: LayoutHook; +} + +const WorkerLayoutControl = ({ layout, autoRunFor, mainLayout }: ExtendedWorkerLayoutControlProps) => { + const sigma = useSigma() + // Use local state to track animation running status + const [isRunning, setIsRunning] = useState(false) + // Timer reference for animation + const animationTimerRef = useRef(null) + const { t } = useTranslation() + + // Function to update node positions using the layout algorithm + const updatePositions = useCallback(() => { + if (!sigma) return + + try { + const graph = sigma.getGraph() + if (!graph || graph.order === 0) return + + // Use mainLayout to get positions, similar to refreshLayout function + // console.log('Getting positions from mainLayout') + const positions = mainLayout.positions() + + // Animate nodes to new positions + // console.log('Updating node positions with layout algorithm') + animateNodes(graph, positions, { duration: 300 }) // Reduced duration for more frequent updates + } catch (error) { + console.error('Error updating positions:', error) + // Stop animation if there's an error + if (animationTimerRef.current) { + window.clearInterval(animationTimerRef.current) + animationTimerRef.current = null + setIsRunning(false) + } + } + }, [sigma, mainLayout]) + + // Improved click handler that uses our own animation timer + const handleClick = useCallback(() => { + if (isRunning) { + // Stop the animation + console.log('Stopping layout animation') + if (animationTimerRef.current) { + window.clearInterval(animationTimerRef.current) + animationTimerRef.current = null + } + + // Try to kill the layout algorithm if it's running + try { + if (typeof layout.kill === 'function') { + layout.kill() + console.log('Layout algorithm killed') + } else if (typeof layout.stop === 'function') { + layout.stop() + console.log('Layout algorithm stopped') + } + } catch (error) { + console.error('Error stopping layout algorithm:', error) + } + + setIsRunning(false) + } else { + // Start the animation + console.log('Starting layout animation') + + // Initial position update + updatePositions() + + // Set up interval for continuous updates + animationTimerRef.current = window.setInterval(() => { + updatePositions() + }, 200) // Reduced interval to create overlapping animations for smoother transitions + + setIsRunning(true) + + // Set a timeout to automatically stop the animation after 3 seconds + setTimeout(() => { + if (animationTimerRef.current) { + console.log('Auto-stopping layout animation after 3 seconds') + window.clearInterval(animationTimerRef.current) + animationTimerRef.current = null + setIsRunning(false) + + // Try to stop the layout algorithm + try { + if (typeof layout.kill === 'function') { + layout.kill() + } else if (typeof layout.stop === 'function') { + layout.stop() + } + } catch (error) { + console.error('Error stopping layout algorithm:', error) + } + } + }, 3000) + } + }, [isRunning, layout, updatePositions]) + + /** + * Init component when Sigma or component settings change. + */ + useEffect(() => { + if (!sigma) { + console.log('No sigma instance available') + return + } + + // Auto-run if specified + let timeout: number | null = null + if (autoRunFor !== undefined && autoRunFor > -1 && sigma.getGraph().order > 0) { + console.log('Auto-starting layout animation') + + // Initial position update + updatePositions() + + // Set up interval for continuous updates + animationTimerRef.current = window.setInterval(() => { + updatePositions() + }, 200) // Reduced interval to create overlapping animations for smoother transitions + + setIsRunning(true) + + // Set a timeout to stop it if autoRunFor > 0 + if (autoRunFor > 0) { + timeout = window.setTimeout(() => { + console.log('Auto-stopping layout animation after timeout') + if (animationTimerRef.current) { + window.clearInterval(animationTimerRef.current) + animationTimerRef.current = null + } + setIsRunning(false) + }, autoRunFor) + } + } + + // Cleanup function + return () => { + // console.log('Cleaning up WorkerLayoutControl') + if (animationTimerRef.current) { + window.clearInterval(animationTimerRef.current) + animationTimerRef.current = null + } + if (timeout) { + window.clearTimeout(timeout) + } + setIsRunning(false) + } + }, [autoRunFor, sigma, updatePositions]) + + return ( + + ) +} + +/** + * Component that controls the layout of the graph. + */ +const LayoutsControl = () => { + const sigma = useSigma() + const { t } = useTranslation() + const [layout, setLayout] = useState('Circular') + const [opened, setOpened] = useState(false) + + const maxIterations = useSettingsStore.use.graphLayoutMaxIterations() + + const layoutCircular = useLayoutCircular() + const layoutCirclepack = useLayoutCirclepack() + const layoutRandom = useLayoutRandom() + const layoutNoverlap = useLayoutNoverlap({ + maxIterations: maxIterations, + settings: { + margin: 5, + expansion: 1.1, + gridSize: 1, + ratio: 1, + speed: 3, + } + }) + // Add parameters for Force Directed layout to improve convergence + const layoutForce = useLayoutForce({ + maxIterations: maxIterations, + settings: { + attraction: 0.0003, // Lower attraction force to reduce oscillation + repulsion: 0.02, // Lower repulsion force to reduce oscillation + gravity: 0.02, // Increase gravity to make nodes converge to center faster + inertia: 0.4, // Lower inertia to add damping effect + maxMove: 100 // Limit maximum movement per step to prevent large jumps + } + }) + const layoutForceAtlas2 = useLayoutForceAtlas2({ iterations: maxIterations }) + const workerNoverlap = useWorkerLayoutNoverlap() + const workerForce = useWorkerLayoutForce() + const workerForceAtlas2 = useWorkerLayoutForceAtlas2() + + const layouts = useMemo(() => { + return { + Circular: { + layout: layoutCircular + }, + Circlepack: { + layout: layoutCirclepack + }, + Random: { + layout: layoutRandom + }, + Noverlaps: { + layout: layoutNoverlap, + worker: workerNoverlap + }, + 'Force Directed': { + layout: layoutForce, + worker: workerForce + }, + 'Force Atlas': { + layout: layoutForceAtlas2, + worker: workerForceAtlas2 + } + } as { [key: string]: { layout: LayoutHook; worker?: LayoutWorkerHook } } + }, [ + layoutCirclepack, + layoutCircular, + layoutForce, + layoutForceAtlas2, + layoutNoverlap, + layoutRandom, + workerForce, + workerNoverlap, + workerForceAtlas2 + ]) + + const runLayout = useCallback( + (newLayout: LayoutName) => { + console.debug('Running layout:', newLayout) + const { positions } = layouts[newLayout].layout + + try { + const graph = sigma.getGraph() + if (!graph) { + console.error('No graph available') + return + } + + const pos = positions() + console.log('Positions calculated, animating nodes') + animateNodes(graph, pos, { duration: 400 }) + setLayout(newLayout) + } catch (error) { + console.error('Error running layout:', error) + } + }, + [layouts, sigma] + ) + + return ( +
    +
    + {layouts[layout] && 'worker' in layouts[layout] && ( + + )} +
    +
    + + + + + + + + + {Object.keys(layouts).map((name) => ( + { + runLayout(name as LayoutName) + }} + key={name} + className="cursor-pointer text-xs" + > + {t(`graphPanel.sideBar.layoutsControl.layouts.${name}`)} + + ))} + + + + + +
    +
    + ) +} + +export default LayoutsControl diff --git a/LightRAG/lightrag_webui/src/components/graph/Legend.tsx b/LightRAG/lightrag_webui/src/components/graph/Legend.tsx new file mode 100644 index 00000000..e4a45857 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/Legend.tsx @@ -0,0 +1,41 @@ +import React from 'react' +import { useTranslation } from 'react-i18next' +import { useGraphStore } from '@/stores/graph' +import { Card } from '@/components/ui/Card' +import { ScrollArea } from '@/components/ui/ScrollArea' + +interface LegendProps { + className?: string +} + +const Legend: React.FC = ({ className }) => { + const { t } = useTranslation() + const typeColorMap = useGraphStore.use.typeColorMap() + + if (!typeColorMap || typeColorMap.size === 0) { + return null + } + + return ( + +

    {t('graphPanel.legend')}

    + +
    + {Array.from(typeColorMap.entries()).map(([type, color]) => ( +
    +
    + + {t(`graphPanel.nodeTypes.${type.toLowerCase().replace(/\s+/g, '')}`, type)} + +
    + ))} +
    + + + ) +} + +export default Legend diff --git a/LightRAG/lightrag_webui/src/components/graph/LegendButton.tsx b/LightRAG/lightrag_webui/src/components/graph/LegendButton.tsx new file mode 100644 index 00000000..cf036721 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/LegendButton.tsx @@ -0,0 +1,32 @@ +import { useCallback } from 'react' +import { BookOpenIcon } from 'lucide-react' +import Button from '@/components/ui/Button' +import { controlButtonVariant } from '@/lib/constants' +import { useSettingsStore } from '@/stores/settings' +import { useTranslation } from 'react-i18next' + +/** + * Component that toggles legend visibility. + */ +const LegendButton = () => { + const { t } = useTranslation() + const showLegend = useSettingsStore.use.showLegend() + const setShowLegend = useSettingsStore.use.setShowLegend() + + const toggleLegend = useCallback(() => { + setShowLegend(!showLegend) + }, [showLegend, setShowLegend]) + + return ( + + ) +} + +export default LegendButton diff --git a/LightRAG/lightrag_webui/src/components/graph/MergeDialog.tsx b/LightRAG/lightrag_webui/src/components/graph/MergeDialog.tsx new file mode 100644 index 00000000..5ba18e3f --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/MergeDialog.tsx @@ -0,0 +1,70 @@ +import { useTranslation } from 'react-i18next' +import { useSettingsStore } from '@/stores/settings' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle +} from '@/components/ui/Dialog' +import Button from '@/components/ui/Button' + +interface MergeDialogProps { + mergeDialogOpen: boolean + mergeDialogInfo: { + targetEntity: string + sourceEntity: string + } | null + onOpenChange: (open: boolean) => void + onRefresh: (useMergedStart: boolean) => void +} + +/** + * MergeDialog component that appears after a successful entity merge + * Allows user to choose whether to use the merged entity or keep current start point + */ +const MergeDialog = ({ + mergeDialogOpen, + mergeDialogInfo, + onOpenChange, + onRefresh +}: MergeDialogProps) => { + const { t } = useTranslation() + const currentQueryLabel = useSettingsStore.use.queryLabel() + + return ( + + + + {t('graphPanel.propertiesView.mergeDialog.title')} + + {t('graphPanel.propertiesView.mergeDialog.description', { + source: mergeDialogInfo?.sourceEntity ?? '', + target: mergeDialogInfo?.targetEntity ?? '', + })} + + +

    + {t('graphPanel.propertiesView.mergeDialog.refreshHint')} +

    + + {currentQueryLabel !== mergeDialogInfo?.sourceEntity && ( + + )} + + +
    +
    + ) +} + +export default MergeDialog diff --git a/LightRAG/lightrag_webui/src/components/graph/PropertiesView.tsx b/LightRAG/lightrag_webui/src/components/graph/PropertiesView.tsx new file mode 100644 index 00000000..463b49da --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/PropertiesView.tsx @@ -0,0 +1,408 @@ +import { useEffect, useState } from 'react' +import { useGraphStore, RawNodeType, RawEdgeType } from '@/stores/graph' +import Text from '@/components/ui/Text' +import Button from '@/components/ui/Button' +import useLightragGraph from '@/hooks/useLightragGraph' +import { useTranslation } from 'react-i18next' +import { GitBranchPlus, Scissors } from 'lucide-react' +import EditablePropertyRow from './EditablePropertyRow' + +/** + * Component that view properties of elements in graph. + */ +const PropertiesView = () => { + const { getNode, getEdge } = useLightragGraph() + const selectedNode = useGraphStore.use.selectedNode() + const focusedNode = useGraphStore.use.focusedNode() + const selectedEdge = useGraphStore.use.selectedEdge() + const focusedEdge = useGraphStore.use.focusedEdge() + const graphDataVersion = useGraphStore.use.graphDataVersion() + + const [currentElement, setCurrentElement] = useState(null) + const [currentType, setCurrentType] = useState<'node' | 'edge' | null>(null) + + // This effect will run when selection changes or when graph data is updated + useEffect(() => { + let type: 'node' | 'edge' | null = null + let element: RawNodeType | RawEdgeType | null = null + if (focusedNode) { + type = 'node' + element = getNode(focusedNode) + } else if (selectedNode) { + type = 'node' + element = getNode(selectedNode) + } else if (focusedEdge) { + type = 'edge' + element = getEdge(focusedEdge, true) + } else if (selectedEdge) { + type = 'edge' + element = getEdge(selectedEdge, true) + } + + if (element) { + if (type == 'node') { + setCurrentElement(refineNodeProperties(element as any)) + } else { + setCurrentElement(refineEdgeProperties(element as any)) + } + setCurrentType(type) + } else { + setCurrentElement(null) + setCurrentType(null) + } + }, [ + focusedNode, + selectedNode, + focusedEdge, + selectedEdge, + graphDataVersion, // Add dependency on graphDataVersion to refresh when data changes + setCurrentElement, + setCurrentType, + getNode, + getEdge + ]) + + if (!currentElement) { + return <> + } + return ( +
    + {currentType == 'node' ? ( + + ) : ( + + )} +
    + ) +} + +type NodeType = RawNodeType & { + relationships: { + type: string + id: string + label: string + }[] +} + +type EdgeType = RawEdgeType & { + sourceNode?: RawNodeType + targetNode?: RawNodeType +} + +const refineNodeProperties = (node: RawNodeType): NodeType => { + const state = useGraphStore.getState() + const relationships = [] + + if (state.sigmaGraph && state.rawGraph) { + try { + if (!state.sigmaGraph.hasNode(node.id)) { + console.warn('Node not found in sigmaGraph:', node.id) + return { + ...node, + relationships: [] + } + } + + const edges = state.sigmaGraph.edges(node.id) + + for (const edgeId of edges) { + if (!state.sigmaGraph.hasEdge(edgeId)) continue; + + const edge = state.rawGraph.getEdge(edgeId, true) + if (edge) { + const isTarget = node.id === edge.source + const neighbourId = isTarget ? edge.target : edge.source + + if (!state.sigmaGraph.hasNode(neighbourId)) continue; + + const neighbour = state.rawGraph.getNode(neighbourId) + if (neighbour) { + relationships.push({ + type: 'Neighbour', + id: neighbourId, + label: neighbour.properties['entity_id'] ? neighbour.properties['entity_id'] : neighbour.labels.join(', ') + }) + } + } + } + } catch (error) { + console.error('Error refining node properties:', error) + } + } + + return { + ...node, + relationships + } +} + +const refineEdgeProperties = (edge: RawEdgeType): EdgeType => { + const state = useGraphStore.getState() + let sourceNode: RawNodeType | undefined = undefined + let targetNode: RawNodeType | undefined = undefined + + if (state.sigmaGraph && state.rawGraph) { + try { + if (!state.sigmaGraph.hasEdge(edge.dynamicId)) { + console.warn('Edge not found in sigmaGraph:', edge.id, 'dynamicId:', edge.dynamicId) + return { + ...edge, + sourceNode: undefined, + targetNode: undefined + } + } + + if (state.sigmaGraph.hasNode(edge.source)) { + sourceNode = state.rawGraph.getNode(edge.source) + } + + if (state.sigmaGraph.hasNode(edge.target)) { + targetNode = state.rawGraph.getNode(edge.target) + } + } catch (error) { + console.error('Error refining edge properties:', error) + } + } + + return { + ...edge, + sourceNode, + targetNode + } +} + +const PropertyRow = ({ + name, + value, + onClick, + tooltip, + nodeId, + edgeId, + dynamicId, + entityId, + entityType, + sourceId, + targetId, + isEditable = false, + truncate +}: { + name: string + value: any + onClick?: () => void + tooltip?: string + nodeId?: string + entityId?: string + edgeId?: string + dynamicId?: string + entityType?: 'node' | 'edge' + sourceId?: string + targetId?: string + isEditable?: boolean + truncate?: string +}) => { + const { t } = useTranslation() + + const getPropertyNameTranslation = (name: string) => { + const translationKey = `graphPanel.propertiesView.node.propertyNames.${name}` + const translation = t(translationKey) + return translation === translationKey ? name : translation + } + + // Utility function to convert to newlines + const formatValueWithSeparators = (value: any): string => { + if (typeof value === 'string') { + return value.replace(//g, ';\n') + } + return typeof value === 'string' ? value : JSON.stringify(value, null, 2) + } + + // Format the value to convert to newlines + const formattedValue = formatValueWithSeparators(value) + let formattedTooltip = tooltip || formatValueWithSeparators(value) + + // If this is source_id field and truncate info exists, append it to the tooltip + if (name === 'source_id' && truncate) { + formattedTooltip += `\n(Truncated: ${truncate})` + } + + // Use EditablePropertyRow for editable fields (description, entity_id and entity_type) + if (isEditable && (name === 'description' || name === 'entity_id' || name === 'entity_type' || name === 'keywords')) { + return ( + + ) + } + + // For non-editable fields, use the regular Text component + return ( +
    + + {getPropertyNameTranslation(name)} + {name === 'source_id' && truncate && } + : + +
    + ) +} + +const NodePropertiesView = ({ node }: { node: NodeType }) => { + const { t } = useTranslation() + + const handleExpandNode = () => { + useGraphStore.getState().triggerNodeExpand(node.id) + } + + const handlePruneNode = () => { + useGraphStore.getState().triggerNodePrune(node.id) + } + + return ( +
    +
    +

    {t('graphPanel.propertiesView.node.title')}

    +
    + + +
    +
    +
    + + { + useGraphStore.getState().setSelectedNode(node.id, true) + }} + /> + +
    +

    {t('graphPanel.propertiesView.node.properties')}

    +
    + {Object.keys(node.properties) + .sort() + .map((name) => { + if (name === 'created_at' || name === 'truncate') return null; // Hide created_at and truncate properties + return ( + + ) + })} +
    + {node.relationships.length > 0 && ( + <> +

    + {t('graphPanel.propertiesView.node.relationships')} +

    +
    + {node.relationships.map(({ type, id, label }) => { + return ( + { + useGraphStore.getState().setSelectedNode(id, true) + }} + /> + ) + })} +
    + + )} +
    + ) +} + +const EdgePropertiesView = ({ edge }: { edge: EdgeType }) => { + const { t } = useTranslation() + return ( +
    +

    {t('graphPanel.propertiesView.edge.title')}

    +
    + + {edge.type && } + { + useGraphStore.getState().setSelectedNode(edge.source, true) + }} + /> + { + useGraphStore.getState().setSelectedNode(edge.target, true) + }} + /> +
    +

    {t('graphPanel.propertiesView.edge.properties')}

    +
    + {Object.keys(edge.properties) + .sort() + .map((name) => { + if (name === 'created_at' || name === 'truncate') return null; // Hide created_at and truncate properties + return ( + + ) + })} +
    +
    + ) +} + +export default PropertiesView diff --git a/LightRAG/lightrag_webui/src/components/graph/PropertyEditDialog.tsx b/LightRAG/lightrag_webui/src/components/graph/PropertyEditDialog.tsx new file mode 100644 index 00000000..457b2b48 --- /dev/null +++ b/LightRAG/lightrag_webui/src/components/graph/PropertyEditDialog.tsx @@ -0,0 +1,196 @@ +import { useState, useEffect } from 'react' +import { useTranslation } from 'react-i18next' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, + DialogDescription +} from '@/components/ui/Dialog' +import Button from '@/components/ui/Button' +import Checkbox from '@/components/ui/Checkbox' + +interface PropertyEditDialogProps { + isOpen: boolean + onClose: () => void + onSave: (value: string, options?: { allowMerge?: boolean }) => void + propertyName: string + initialValue: string + isSubmitting?: boolean + errorMessage?: string | null +} + +/** + * Dialog component for editing property values + * Provides a modal with a title, multi-line text input, and save/cancel buttons + */ +const PropertyEditDialog = ({ + isOpen, + onClose, + onSave, + propertyName, + initialValue, + isSubmitting = false, + errorMessage = null +}: PropertyEditDialogProps) => { + const { t } = useTranslation() + const [value, setValue] = useState('') + const [allowMerge, setAllowMerge] = useState(false) + + // Initialize value when dialog opens + useEffect(() => { + if (isOpen) { + setValue(initialValue) + setAllowMerge(false) + } + }, [isOpen, initialValue]) + + // Get translated property name + const getPropertyNameTranslation = (name: string) => { + const translationKey = `graphPanel.propertiesView.node.propertyNames.${name}` + const translation = t(translationKey) + return translation === translationKey ? name : translation + } + + // Get textarea configuration based on property name + const getTextareaConfig = (propertyName: string) => { + switch (propertyName) { + case 'description': + return { + // No rows attribute for description to allow auto-sizing + className: 'max-h-[50vh] min-h-[10em] resize-y', // Maximum height 70% of viewport, minimum height ~20 lines, allow vertical resizing + style: { + height: '70vh', // Set initial height to 70% of viewport + minHeight: '20em', // Minimum height ~20 lines + resize: 'vertical' as const // Allow vertical resizing, using 'as const' to fix type + } + }; + case 'entity_id': + return { + rows: 2, + className: '', + style: {} + }; + case 'keywords': + return { + rows: 4, + className: '', + style: {} + }; + default: + return { + rows: 5, + className: '', + style: {} + }; + } + }; + + const handleSave = async () => { + const trimmedValue = value.trim() + if (trimmedValue !== '') { + const options = propertyName === 'entity_id' ? { allowMerge } : undefined + await onSave(trimmedValue, options) + } + } + + return ( + !open && onClose()}> + + + + {t('graphPanel.propertiesView.editProperty', { + property: getPropertyNameTranslation(propertyName) + })} + + + {t('graphPanel.propertiesView.editPropertyDescription')} + + + + {/* Display error message if save fails */} + {errorMessage && ( +
    + {errorMessage} +
    + )} + + {/* Multi-line text input using textarea */} +
    + {(() => { + const config = getTextareaConfig(propertyName); + return propertyName === 'description' ? ( +