gitextract_llud8udi/ ├── .azdo/ │ └── pipelines/ │ └── azure-dev.yml ├── .devcontainer/ │ └── devcontainer.json ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── ISSUE_TEMPLATE.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── agents/ │ │ ├── fixer.agent.md │ │ └── triager.agent.md │ ├── dependabot.yaml │ ├── instructions/ │ │ └── bicep.instructions.md │ ├── prompts/ │ │ └── review_pr_comments.prompt.md │ ├── skills/ │ │ └── github-pr-inline-reply/ │ │ └── SKILL.md │ └── workflows/ │ ├── azure-dev-validation.yaml │ ├── azure-dev.yml │ ├── evaluate.yaml │ ├── frontend.yaml │ ├── lint-markdown.yml │ ├── nightly-jobs.yaml │ ├── python-test.yaml │ ├── stale-bot.yml │ └── validate-markdown.yml ├── .gitignore ├── .markdownlint-cli2.jsonc ├── .pre-commit-config.yaml ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ ├── settings.json │ └── tasks.json ├── AGENTS.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── app/ │ ├── backend/ │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── app.py │ │ ├── approaches/ │ │ │ ├── __init__.py │ │ │ ├── approach.py │ │ │ ├── chatreadretrieveread.py │ │ │ ├── promptmanager.py │ │ │ └── prompts/ │ │ │ ├── chat_answer.system.jinja2 │ │ │ ├── chat_answer.user.jinja2 │ │ │ ├── chat_query_rewrite_tools.json │ │ │ └── query_rewrite.system.jinja2 │ │ ├── chat_history/ │ │ │ ├── __init__.py │ │ │ └── cosmosdb.py │ │ ├── config.py │ │ ├── core/ │ │ │ ├── __init__.py │ │ │ ├── authentication.py │ │ │ └── sessionhelper.py │ │ ├── custom_uvicorn_worker.py │ │ ├── decorators.py │ │ ├── error.py │ │ ├── gunicorn.conf.py │ │ ├── load_azd_env.py │ │ ├── main.py │ │ ├── prepdocs.py │ │ ├── prepdocslib/ │ │ │ ├── __init__.py │ │ │ ├── blobmanager.py │ │ │ ├── cloudingestionstrategy.py │ │ │ ├── csvparser.py │ │ │ ├── embeddings.py │ │ │ ├── figureprocessor.py │ │ │ ├── fileprocessor.py │ │ │ ├── filestrategy.py │ │ │ ├── htmlparser.py │ │ │ ├── integratedvectorizerstrategy.py │ │ │ ├── jsonparser.py │ │ │ ├── listfilestrategy.py │ │ │ ├── mediadescriber.py │ │ │ ├── page.py │ │ │ ├── parser.py │ │ │ ├── pdfparser.py │ │ │ ├── searchmanager.py │ │ │ ├── servicesetup.py │ │ │ ├── strategy.py │ │ │ ├── textparser.py │ │ │ ├── textprocessor.py │ │ │ └── textsplitter.py │ │ ├── requirements.in │ │ ├── requirements.txt │ │ └── setup_cloud_ingestion.py │ ├── frontend/ │ │ ├── .npmrc │ │ ├── .nvmrc │ │ ├── .prettierignore │ │ ├── .prettierrc.json │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── api/ │ │ │ │ ├── api.ts │ │ │ │ ├── index.ts │ │ │ │ └── models.ts │ │ │ ├── authConfig.ts │ │ │ ├── components/ │ │ │ │ ├── AnalysisPanel/ │ │ │ │ │ ├── AgentPlan.tsx │ │ │ │ │ ├── AnalysisPanel.module.css │ │ │ │ │ ├── AnalysisPanel.tsx │ │ │ │ │ ├── AnalysisPanelTabs.tsx │ │ │ │ │ ├── ThoughtProcess.tsx │ │ │ │ │ ├── TokenUsageGraph.tsx │ │ │ │ │ ├── agentPlanUtils.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Answer/ │ │ │ │ │ ├── Answer.module.css │ │ │ │ │ ├── Answer.tsx │ │ │ │ │ ├── AnswerError.tsx │ │ │ │ │ ├── AnswerIcon.tsx │ │ │ │ │ ├── AnswerLoading.tsx │ │ │ │ │ ├── AnswerParser.tsx │ │ │ │ │ ├── SpeechOutputAzure.tsx │ │ │ │ │ ├── SpeechOutputBrowser.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ClearChatButton/ │ │ │ │ │ ├── ClearChatButton.module.css │ │ │ │ │ ├── ClearChatButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Example/ │ │ │ │ │ ├── Example.module.css │ │ │ │ │ ├── Example.tsx │ │ │ │ │ ├── ExampleList.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── HelpCallout/ │ │ │ │ │ ├── HelpCallout.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── HistoryButton/ │ │ │ │ │ ├── HistoryButton.module.css │ │ │ │ │ ├── HistoryButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── HistoryItem/ │ │ │ │ │ ├── HistoryItem.module.css │ │ │ │ │ ├── HistoryItem.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── HistoryPanel/ │ │ │ │ │ ├── HistoryPanel.module.css │ │ │ │ │ ├── HistoryPanel.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── HistoryProviders/ │ │ │ │ │ ├── CosmosDB.ts │ │ │ │ │ ├── HistoryManager.ts │ │ │ │ │ ├── IProvider.ts │ │ │ │ │ ├── IndexedDB.ts │ │ │ │ │ ├── None.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── LoginButton/ │ │ │ │ │ ├── LoginButton.module.css │ │ │ │ │ ├── LoginButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── MarkdownViewer/ │ │ │ │ │ ├── MarkdownViewer.module.css │ │ │ │ │ ├── MarkdownViewer.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── QuestionInput/ │ │ │ │ │ ├── QuestionInput.module.css │ │ │ │ │ ├── QuestionInput.tsx │ │ │ │ │ ├── SpeechInput.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Settings/ │ │ │ │ │ ├── Settings.module.css │ │ │ │ │ └── Settings.tsx │ │ │ │ ├── SettingsButton/ │ │ │ │ │ ├── SettingsButton.module.css │ │ │ │ │ ├── SettingsButton.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── SupportingContent/ │ │ │ │ │ ├── SupportingContent.module.css │ │ │ │ │ ├── SupportingContent.tsx │ │ │ │ │ ├── SupportingContentParser.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── TokenClaimsDisplay/ │ │ │ │ │ ├── TokenClaimsDisplay.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── UploadFile/ │ │ │ │ │ ├── UploadFile.module.css │ │ │ │ │ ├── UploadFile.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── UserChatMessage/ │ │ │ │ │ ├── UserChatMessage.module.css │ │ │ │ │ ├── UserChatMessage.tsx │ │ │ │ │ └── index.ts │ │ │ │ └── VectorSettings/ │ │ │ │ ├── VectorSettings.module.css │ │ │ │ ├── VectorSettings.tsx │ │ │ │ └── index.ts │ │ │ ├── i18n/ │ │ │ │ ├── LanguagePicker.module.css │ │ │ │ ├── LanguagePicker.tsx │ │ │ │ ├── config.ts │ │ │ │ └── index.tsx │ │ │ ├── index.css │ │ │ ├── index.tsx │ │ │ ├── layoutWrapper.tsx │ │ │ ├── locales/ │ │ │ │ ├── da/ │ │ │ │ │ └── translation.json │ │ │ │ ├── en/ │ │ │ │ │ └── translation.json │ │ │ │ ├── es/ │ │ │ │ │ └── translation.json │ │ │ │ ├── fr/ │ │ │ │ │ └── translation.json │ │ │ │ ├── it/ │ │ │ │ │ └── translation.json │ │ │ │ ├── ja/ │ │ │ │ │ └── translation.json │ │ │ │ ├── nl/ │ │ │ │ │ └── translation.json │ │ │ │ ├── pl/ │ │ │ │ │ └── translation.json │ │ │ │ ├── ptBR/ │ │ │ │ │ └── translation.json │ │ │ │ └── tr/ │ │ │ │ └── translation.json │ │ │ ├── loginContext.tsx │ │ │ ├── pages/ │ │ │ │ ├── NoPage.tsx │ │ │ │ ├── chat/ │ │ │ │ │ ├── Chat.module.css │ │ │ │ │ └── Chat.tsx │ │ │ │ └── layout/ │ │ │ │ ├── Layout.module.css │ │ │ │ └── Layout.tsx │ │ │ └── vite-env.d.ts │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── functions/ │ │ ├── __init__.py │ │ ├── document_extractor/ │ │ │ ├── .funcignore │ │ │ ├── function_app.py │ │ │ └── host.json │ │ ├── figure_processor/ │ │ │ ├── .funcignore │ │ │ ├── function_app.py │ │ │ └── host.json │ │ └── text_processor/ │ │ ├── .funcignore │ │ ├── function_app.py │ │ └── host.json │ ├── start.ps1 │ └── start.sh ├── azure.yaml ├── data/ │ ├── Json_Examples/ │ │ ├── 2189.json │ │ ├── 2190.json │ │ ├── 2191.json │ │ ├── 2192.json │ │ └── query.json │ └── Zava_Company_Overview.md ├── docs/ │ ├── README.md │ ├── agentic_retrieval.md │ ├── appservice.md │ ├── architecture.md │ ├── azd.md │ ├── azure_app_service.md │ ├── azure_container_apps.md │ ├── customization.md │ ├── data_ingestion.md │ ├── deploy_existing.md │ ├── deploy_features.md │ ├── deploy_freetrial.md │ ├── deploy_lowcost.md │ ├── deploy_private.md │ ├── deploy_troubleshooting.md │ ├── evaluation.md │ ├── http_protocol.md │ ├── localdev.md │ ├── login_and_acl.md │ ├── monitoring.md │ ├── multimodal.md │ ├── other_samples.md │ ├── productionizing.md │ ├── reasoning.md │ ├── safety_evaluation.md │ ├── sharing_environments.md │ └── textsplitter.md ├── evals/ │ ├── evaluate.py │ ├── evaluate_config.json │ ├── evaluate_config_multimodal.json │ ├── generate_ground_truth.py │ ├── ground_truth.jsonl │ ├── ground_truth_kg.json │ ├── ground_truth_multimodal.jsonl │ ├── requirements.txt │ ├── results/ │ │ ├── baseline/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt35turbo-ada002/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt4omini-ada002/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt4omini-emb3l/ │ │ │ ├── README.md │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt4omini-emb3l-2/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt5-emb3l/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt5chat-emb3l/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt5mini-emb3l/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── gpt5mini-emb3l-2/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ └── o3mini-ada002/ │ │ ├── config.json │ │ ├── eval_results.jsonl │ │ ├── evaluate_parameters.json │ │ └── summary.json │ ├── results_multimodal/ │ │ ├── baseline/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ ├── no-image-embeddings/ │ │ │ ├── config.json │ │ │ ├── eval_results.jsonl │ │ │ ├── evaluate_parameters.json │ │ │ └── summary.json │ │ └── no-image-sources/ │ │ ├── config.json │ │ ├── eval_results.jsonl │ │ ├── evaluate_parameters.json │ │ └── summary.json │ ├── safety_evaluation.py │ └── safety_results.json ├── infra/ │ ├── abbreviations.json │ ├── app/ │ │ ├── functions-app.bicep │ │ ├── functions-rbac.bicep │ │ ├── functions.bicep │ │ └── storage-containers.bicep │ ├── backend-dashboard.bicep │ ├── bicepconfig.json │ ├── core/ │ │ ├── ai/ │ │ │ ├── ai-environment.bicep │ │ │ ├── hub.bicep │ │ │ └── project.bicep │ │ ├── auth/ │ │ │ └── appregistration.bicep │ │ ├── host/ │ │ │ ├── appservice-appsettings.bicep │ │ │ ├── appservice.bicep │ │ │ ├── appserviceplan.bicep │ │ │ ├── container-app-upsert.bicep │ │ │ ├── container-app.bicep │ │ │ ├── container-apps-auth.bicep │ │ │ ├── container-apps-environment.bicep │ │ │ ├── container-apps.bicep │ │ │ └── container-registry.bicep │ │ ├── monitor/ │ │ │ └── monitoring.bicep │ │ ├── networking/ │ │ │ ├── private-dns-zones.bicep │ │ │ ├── private-endpoint.bicep │ │ │ └── vnet.bicep │ │ ├── search/ │ │ │ ├── search-diagnostics.bicep │ │ │ └── search-services.bicep │ │ ├── security/ │ │ │ ├── aca-identity.bicep │ │ │ ├── documentdb-sql-role.bicep │ │ │ ├── registry-access.bicep │ │ │ ├── role.bicep │ │ │ └── storage-role.bicep │ │ └── storage/ │ │ └── storage-account.bicep │ ├── main.bicep │ ├── main.parameters.json │ ├── main.test.bicep │ ├── network-isolation.bicep │ └── private-endpoints.bicep ├── locustfile.py ├── ps-rule.yaml ├── pyproject.toml ├── requirements-dev.txt ├── scripts/ │ ├── adlsgen2setup.py │ ├── auth_common.py │ ├── auth_init.ps1 │ ├── auth_init.py │ ├── auth_init.sh │ ├── auth_update.ps1 │ ├── auth_update.py │ ├── auth_update.sh │ ├── copy_prepdocslib.py │ ├── cosmosdb_migration.py │ ├── load-balance-aca-setup.sh │ ├── load_azd_env.py │ ├── load_python_env.ps1 │ ├── load_python_env.sh │ ├── manageacl.py │ ├── prepdocs.ps1 │ ├── prepdocs.sh │ ├── roles.ps1 │ ├── roles.sh │ ├── sampleacls.json │ ├── setup_cloud_ingestion.ps1 │ ├── setup_cloud_ingestion.sh │ └── verify_search_index_acls.py └── tests/ ├── __init__.py ├── conftest.py ├── e2e.py ├── mocks.py ├── snapshots/ │ ├── test_app/ │ │ ├── test_chat_followup/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_handle_exception/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_handle_exception_contentsafety/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_handle_exception_contentsafety_streaming/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_handle_exception_streaming/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_hybrid/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_hybrid_semantic_captions/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_hybrid_semantic_ranker/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_prompt_template/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_prompt_template_concat/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_seed/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_session_state_persists/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_stream_followup/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_stream_handle_exception/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_stream_session_state_persists/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_stream_text/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_stream_text_filter/ │ │ │ └── auth_client0/ │ │ │ └── result.jsonlines │ │ ├── test_chat_stream_text_reasoning/ │ │ │ ├── reasoning_client0/ │ │ │ │ └── result.jsonlines │ │ │ └── reasoning_client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_stream_vision/ │ │ │ └── client0/ │ │ │ └── result.jsonlines │ │ ├── test_chat_text/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_text_agent/ │ │ │ ├── knowledgebase_client0/ │ │ │ │ └── result.json │ │ │ ├── knowledgebase_client1_web/ │ │ │ │ └── result.json │ │ │ └── knowledgebase_client2_sharepoint/ │ │ │ └── result.json │ │ ├── test_chat_text_filter/ │ │ │ └── auth_client0/ │ │ │ └── result.json │ │ ├── test_chat_text_filter_agent/ │ │ │ └── knowledgebase_auth_client0/ │ │ │ └── result.json │ │ ├── test_chat_text_filter_public_documents/ │ │ │ └── auth_public_documents_client0/ │ │ │ └── result.json │ │ ├── test_chat_text_reasoning/ │ │ │ ├── reasoning_client0/ │ │ │ │ └── result.json │ │ │ └── reasoning_client1/ │ │ │ └── result.json │ │ ├── test_chat_text_semantic_ranker/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_text_semanticcaptions/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_text_semanticranker/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_vector/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_vector_semantic_ranker/ │ │ │ ├── client0/ │ │ │ │ └── result.json │ │ │ └── client1/ │ │ │ └── result.json │ │ ├── test_chat_vision/ │ │ │ ├── client0/ │ │ │ │ ├── result.json │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ ├── test_chat_vision_user/ │ │ │ └── auth_client0/ │ │ │ └── result.json │ │ ├── test_chat_vision_vectors/ │ │ │ ├── client0/ │ │ │ │ └── result.jsonlines │ │ │ └── client1/ │ │ │ └── result.jsonlines │ │ └── test_chat_with_history/ │ │ ├── client0/ │ │ │ └── result.json │ │ └── client1/ │ │ └── result.json │ ├── test_authenticationhelper/ │ │ ├── test_auth_setup/ │ │ │ └── result.json │ │ ├── test_auth_setup_required_access_control/ │ │ │ └── result.json │ │ └── test_auth_setup_required_access_control_and_unauthenticated_access/ │ │ └── result.json │ ├── test_cosmosdb/ │ │ ├── test_chathistory_getitem/ │ │ │ └── auth_public_documents_client0/ │ │ │ └── result.json │ │ ├── test_chathistory_query/ │ │ │ └── auth_public_documents_client0/ │ │ │ └── result.json │ │ └── test_chathistory_query_continuation/ │ │ └── auth_public_documents_client0/ │ │ └── result.json │ └── test_prepdocslib_textsplitter/ │ ├── test_pages_with_figures/ │ │ ├── pages_with_figures.json/ │ │ │ └── split_pages_with_figures.json │ │ └── pages_with_just_text.json/ │ │ └── split_pages_with_figures.json │ └── test_sentencetextsplitter_list_parse_and_split/ │ └── text_splitter_sections.txt ├── test-data/ │ ├── Simple Figure_content.txt │ ├── Simple Table_content.txt │ ├── pages_with_figures.json │ └── pages_with_just_text.json ├── test_adlsgen2setup.py ├── test_agentic_retrieval.py ├── test_app.py ├── test_app_config.py ├── test_auth_init.py ├── test_authenticationhelper.py ├── test_blob_manager.py ├── test_chatapproach.py ├── test_content_file.py ├── test_cosmosdb.py ├── test_cosmosdb_migration.py ├── test_csvparser.py ├── test_function_apps.py ├── test_htmlparser.py ├── test_jsonparser.py ├── test_listfilestrategy.py ├── test_manageacl.py ├── test_mediadescriber.py ├── test_pdfparser.py ├── test_prepdocs.py ├── test_prepdocslib_filestrategy.py ├── test_prepdocslib_textsplitter.py ├── test_searchmanager.py ├── test_sentencetextsplitter.py ├── test_servicesetup.py ├── test_textparser.py ├── test_textprocessor.py └── test_upload.py